diff --git a/ve/f33.dir b/ve/f33.dir index c479590b6..e6d01598e 100755 --- a/ve/f33.dir +++ b/ve/f33.dir @@ -1,3 +1,3 @@ 33 0 -$doc|0|0|687|0|Documenti di vendita||| +$doc|0|0|723|0|Documenti di vendita||| diff --git a/ve/f33.trr b/ve/f33.trr index da28b1fef..20fc7b847 100755 --- a/ve/f33.trr +++ b/ve/f33.trr @@ -1,5 +1,5 @@ 33 -95 +97 CODNUM|1|4|0|Codice della numerazione ANNO|2|4|0|Anno PROVV|1|1|0|Tipo numerazione

rovvisorio efinitivo @@ -74,7 +74,7 @@ CODNOTE|1|2|0|Codice note cliente NOTE|11|10|0|Note G1|11|10|0|Campo generale 1 DATAAGG|5|8|0|Data ultimo aggiornamento -UTENTE|1|10|0|Utente ultimo aggiornamento +UTENTE|1|16|0|Utente ultimo aggiornamento COLL_GOLEM|11|10|0|Collegamento lista di GOLEM DOCEVASO|8|1|0|Ordine evaso CODCMS|1|20|0|Codice Commessa @@ -93,8 +93,10 @@ CUP|1|15|0|Codice Unico di Progetto CIG|1|10|0|Codice Identificativo di Gara MODPAG|1|1|0|Tipo contratto P.A. CONTRATTO|1|20|0|Contratto fattura P.A. -CONTSEP|1|6|0|Contabilita' separata -NOLEGGIO|1|1|0|Tipo noleggio (Spesometro) +CONTSEP|1|6|0|Contabilità separata +NOLEGGIO|1|1|0|Tipo noleggio (pe) +COMMPREL|1|20|0|Commessa di prelievo (ci) +FASEPREL|1|10|0|Fase di prelievo (ci) 5 PROVV+ANNO+CODNUM+NDOC| TIPOCF+CODCF+PROVV+ANNO+DATADOC+CODNUM+NDOC|X diff --git a/ve/f47.dir b/ve/f47.dir index 26db1333d..a777fc7cd 100755 --- a/ve/f47.dir +++ b/ve/f47.dir @@ -1,3 +1,3 @@ 47 0 -$anamag|0|0|1137|0|Anagrafica di magazzino|NART|| +$anamag|0|0|1121|0|Anagrafica di magazzino|NART|| diff --git a/ve/f47.trr b/ve/f47.trr index ffbe2f344..60d063c47 100755 --- a/ve/f47.trr +++ b/ve/f47.trr @@ -96,8 +96,8 @@ USER15|1|20|0|Campo libero 15 USER16|1|20|0|Campo libero 16 USER17|1|20|0|Campo libero 17 USER18|1|20|0|Campo libero 18 -USER19|1|20|0|Campo libero 19 -USER20|1|20|0|Campo libero 20 +DATAAGG|5|8|0| +UTENTE|1|16|0| 3 CODART| UPPER(DESCR)|X diff --git a/ve/f53.dir b/ve/f53.dir index 8b71c27b8..41dd4b107 100755 --- a/ve/f53.dir +++ b/ve/f53.dir @@ -1,3 +1,3 @@ 53 0 -$rcondv|0|0|217|0|Righe condizioni di vendita||| +$rcondv|0|0|233|0|Righe condizioni di vendita||| diff --git a/ve/f53.trr b/ve/f53.trr index 638bf222d..3832fad29 100755 --- a/ve/f53.trr +++ b/ve/f53.trr @@ -1,5 +1,5 @@ 53 -25 +27 TIPO|1|1|0|Tipo (istino,ontratto,fferta) CATVEN|1|2|0|Categoria di vendita (L) TIPOCF|1|1|0|liente o ornitore (C) @@ -25,5 +25,7 @@ ARTES|8|1|0|Articolo in esaurimento (O) DATAULTAUM|5|8|0|Data ultimo aumento PRZSTO|4|18|5|Prezzo storico DATAPRZSTO|5|8|0|Data prezzo storico +DATAAGG|5|8|0| +UTENTE|1|16|0| 1 TIPO+CATVEN+TIPOCF+CODCF+COD+TIPORIGA+CODRIGA+UM+NSCAGL| diff --git a/ve/movint.src b/ve/movint.src new file mode 100644 index 000000000..250eed40c --- /dev/null +++ b/ve/movint.src @@ -0,0 +1,280 @@ +#include "veini.h" +#include "veuml.h" +#include "verig.h" + + +[MAIN] +TYPE=Movimento interno +CAMPICALC=TOTMER|TOTPRE|SPESE|SPESIMB|SPESTRA|SPESINC|BOLLI|IMPONIBILI|IMPOSTE|TOTDOC|SCONTOD|SCONTOT|OMAGGI|TOTPROVV +CALCOLI=* +TOTPROVV= +// Indica se il documento è indirizzato ad un cliente o ad un fornitore +TIPOCF=C + +//modulo di riferimento +MODULE= +Title(1)=Cliente +Title(2)=Spedizione +Title(3)=Trasporto +Title(4)=Righe +Title(5)=Totali + +[PROFILO] +// Si possono indicare, dopo il numero, PROMPT, HELP, WARNING cosi: +// 1|Prompt|Help|Warning + +// TIPOCF = S_NORMALE +// CODCF = S_OBBLIGATORIO +// RAGSOC = S_NORMALE +OCCASEDIT = S_NORMALE +OCFPI = S_DISABILITATO +COFI = S_NORMALE +STATOPAIV = S_NORMALE +PAIVA = S_NORMALE +LIQDIFF = S_NASCOSTO +IVAXCASSA = S_NASCOSTO +GOLEM = S_NASCOSTO +GRRECAPITO = S_NORMALE +INDCF = S_DISABILITATO +CIVCF = S_DISABILITATO +LOCALITACF = S_DISABILITATO +CAPCF = S_DISABILITATO +PROVCOM = S_DISABILITATO +COMCF = S_DISABILITATO +DENCOM = S_DISABILITATO +STATOCF = S_DISABILITATO +DESSTATOCF = S_DISABILITATO +PACONTRATTO = S_NASCOSTO +PATIPOCON = S_NASCOSTO +CONTSEP = S_NASCOSTO +CODVAL1 = S_NORMALE +CODVAL2 = S_NORMALE +NOME_VAL1 = S_NORMALE +NOME_VAL2 = S_NORMALE +// CONTROEURO = S_NORMALE +CAMBIO = S_NORMALE +DATA_CAMBIO1 = S_NORMALE +DATA_CAMBIO2 = S_NORMALE +CODLIN = S_NORMALE +DESLIN = S_NORMALE +CODPAG = S_OBBLIGATORIO +DESCODPAG = S_NORMALE +GRSCADENZE = S_NORMALE +DATAINSC = S_NORMALE +DATASCAD1 = S_DISABILITATO +DATASCAD2 = S_DISABILITATO +DATASCAD3 = S_DISABILITATO +DATASCAD4 = S_DISABILITATO +DATASCAD5 = S_DISABILITATO +CODABIA = S_OBBLIGATORIO +CODCABA = S_OBBLIGATORIO +CODABIA1 = S_NORMALE +CODCABA1 = S_NORMALE +DESBANAPP = S_NOCHECK +DESBANAPP1 = S_NOCHECK +IBAN = S_NORMALE +IBAN_STATO = S_NORMALE +IBAN_CHECK = S_NORMALE +BBAN = S_NORMALE +BBAN_CIN = S_NORMALE +BBAN_ABI = S_NORMALE +BBAN_CAB = S_NORMALE +BBAN_CONTO = S_NORMALE +CODABIP = S_NORMALE +CODCABP = S_NORMALE +CODABIP1 = S_NORMALE +CODCABP1 = S_NORMALE +DESBANPRE = S_NOCHECK +DESBANPRE1 = S_NOCHECK +PROGBNP = S_NOCHECK +PROGBNP1 = S_NORMALE +CATVEN = S_NORMALE +DESCATVEN = S_DISABILITATO +CODLIST = S_NORMALE +DESLIST = S_NORMALE +CODCONT = S_NORMALE +DESCONT = S_NORMALE +CODCAMP = S_NORMALE +DESCAMP = S_NORMALE +SCONTOPERC = S_NORMALE +GRINDSPED = S_NORMALE +CODINDSP = S_NORMALE +RAGSOCSP = S_DISABILITATO +INDSP = S_DISABILITATO +CIVSP = S_DISABILITATO +LOCALITASP = S_DISABILITATO +CAPSP = S_DISABILITATO +COMSP = S_DISABILITATO +DENCOMSP = S_DISABILITATO +PROVCOMSP = S_DISABILITATO +STATOSP = S_DISABILITATO +DESSTATOSP = S_DISABILITATO +DATADOCRIF = S_NORMALE +NUMDOCRIF = S_NOCHECK +CODAG = S_NORMALE +DESAG = S_NORMALE +CODAGVIS = S_NORMALE +DESAGVIS = S_NORMALE +CODZON = S_NORMALE +DESZON = S_NORMALE +CODSPMEZZO = S_OBBLIGATORIO +DESSPMEZZO = S_NORMALE +CODPORTO = S_NORMALE +DESPORTO = S_NORMALE +CODNOTESP1 = S_NORMALE +DESNOTESP1 = S_NORMALE +CODNOTESP2 = S_NORMALE +DESNOTESP2 = S_NORMALE +CAUSTRASP = S_OBBLIGATORIO +DENCAUSTRASP = S_NORMALE +CODVETT1 = S_NORMALE +CODVETT2 = S_NORMALE +CODVETT3 = S_NORMALE +NOMEVETT1 = S_NORMALE +NOMEVETT2 = S_NORMALE +NOMEVETT3 = S_NORMALE +NCOPIE = S_NASCOSTO +GRPARTENZA = S_NORMALE +DATAPART = S_NORMALE +ORAPART = S_NORMALE +IMPPAGATO = S_NASCOSTO +ACCSALDO = S_NASCOSTO +DOC1 = S_NASCOSTO +DOC2 = S_NASCOSTO +DOC3 = S_NASCOSTO +DATACONS = S_OBBLIGATORIO +ASPBENI1 = S_OBBLIGATORIO +DESCRBENI1 = S_NORMALE +ASPBENI2 = S_NASCOSTO +DESCRBENI2 = S_NASCOSTO +IMPNETTI = S_NASCOSTO +RAGGR = S_NORMALE +RAGGREFF = S_NORMALE +SPESEINC = S_NORMALE +ADDBOLLI = S_NORMALE +UMTARA = S_NORMALE +TARA = S_NORMALE +DESUMTARA = S_NASCOSTO +UMPNETTO = S_NORMALE +PNETTO = S_NORMALE +DESUMPNETTO = S_NASCOSTO +NCOLLI = S_NORMALE +CAUSMAG = S_OBBLIGATORIO +CAUSMAGC = S_DISABILITATO +DESCRMAG = S_NORMALE +DESCRMAGC = S_DISABILITATO +BLANK = S_DISABILITATO +CODNOTE = S_NORMALE +NOTECLI = S_NOCHECK +CUP = S_NORMALE +DESCRCUP = S_NORMALE +CIG = S_NORMALE +DESCRCIG = S_NORMALE +CMSH = S_NORMALE + +[DEFAULT] +Default(0)=F_CAUSTRASP|VEN + +[SHEET] +Col(0)=FR_CODMAG +Col(1)=FR_CODDEP +Col(2)=FR_CODART +Col(3)=FR_LIV1 +Col(4)=FR_LIV2 +Col(5)=FR_LIV3 +Col(6)=FR_LIV4 +Col(7)=FR_DESCR +Col(8)=FR_UMQTA +Col(9)=FR_QTA +Col(10)=FR_PREZZO +Col(11)=FR_SCONTO +Col(12)=FR_PERCPROV +Col(13)=FR_IMPFISUN +Col(14)=FR_IMPFISSO +Col(15)=FR_PERCPROV1 +Col(16)=FR_CODIVA +Col(17)=FR_ADDIVA +Col(18)=FR_NCOLLI +Col(19)=FR_PNETTO +Col(20)=FR_TARA +Col(21)=FR_CAUS +Col(22)=FR_CODMAGC +Col(23)=FR_CODDEPC +Col(24)=FR_TIPORIGA + +[RIGHE] + +[HANDLERS] +// Handler(0) = F_ORAPART|1 + +[PROFILOGRUPPO] +101 = S_NASCOSTO +100 = S_NORMALE +200 = S_NORMALE +300 = S_NORMALE +400 = S_NASCOSTO +500 = S_NASCOSTO +600 = S_NASCOSTO +700 = S_NASCOSTO +800 = S_NASCOSTO +810 = S_NASCOSTO +820 = S_NASCOSTO +830 = S_NASCOSTO +900 = S_NORMALE +1000 = S_NASCOSTO +1100 = S_NORMALE +1200 = S_NORMALE +1210 = S_NORMALE +1300 = S_NORMALE +1400 = S_NORMALE +1500 = S_NORMALE +1600 = S_NASCOSTO +1700 = S_NORMALE +1800 = S_NORMALE +1900 = S_NORMALE +2000 = S_NORMALE +2100 = S_NORMALE +2200 = S_NASCOSTO +2300 = S_NASCOSTO +2400 = S_NASCOSTO +2500 = S_NORMALE +2700 = S_NORMALE +2710 = S_NORMALE +2800 = S_NORMALE +2900 = S_NORMALE +3000 = S_NORMALE +4000 = S_NORMALE + +[ORDINEGRUPPI] +NGROUPS=30 +1=100 +2=2000 +3=2500 +4=200 +5=300 +6=400 +7=500 +8=600 +9=700 +10=2400 +11=800 +12=810 +13=820 +14=830 +15=900 +16=1100 +17=1200 +18=1500 +19=1210 +20=1300 +21=1400 +22=2100 +23=2800 +24=2700 +25=2710 +26=1700 +27=1800 +28=1000 +29=2900 +30=3000 + diff --git a/ve/ve0100.cpp b/ve/ve0100.cpp index a1fd3a5e0..a821ef603 100755 --- a/ve/ve0100.cpp +++ b/ve/ve0100.cpp @@ -456,29 +456,27 @@ void TMotore_application::do_elab( TDocumento& doc, int when) // C 90 break; } - TToken_string tipi, stati; - el->tipi_stati_iniziali(tipi, stati); - if (stati.find(doc.stato()) >= 0) + if (el != NULL && el->is_document_ok(doc)) { TLista_documenti in; in.add(doc); TLista_documenti out; - TDocumento newdoc(doc.get_char(DOC_PROVV), doc.get_int(DOC_ANNO), el->codice_numerazione_finale(), 0L); if (when == 0) { - TDocumento::copy_data(newdoc.head(), doc.head()); - newdoc.put(DOC_TIPODOC, el->tipo_finale()); - newdoc.put(DOC_STATO, el->stato_finale()); - if (newdoc.tipo().mov_mag()) - newdoc.put(DOC_CAUSMAG, newdoc.tipo().caus_mov()); + TDocumento* newdoc = new TDocumento(doc.get_char(DOC_PROVV), doc.get_int(DOC_ANNO), el->codice_numerazione_finale(), 0L); + TDocumento::copy_data(newdoc->head(), doc.head()); + newdoc->put(DOC_TIPODOC, el->tipo_finale()); + newdoc->put(DOC_STATO, el->stato_finale()); + if (newdoc->tipo().mov_mag()) + newdoc->put(DOC_CAUSMAG, newdoc->tipo().caus_mov()); else - newdoc.zero(DOC_CAUSMAG); + newdoc->zero(DOC_CAUSMAG); out.add(newdoc); } if (el->elabora(in, out, TDate(TODAY), true)) { - if (when == 0 && out.items() && out[0] != newdoc) + if (when == 0 && out.items() && out[0].numero() > 0L) out.rewrite(); if (when < 2 && in.items() && in[0] != doc) doc = in[0]; @@ -621,9 +619,11 @@ static bool num_filter(const TRelation* r) { const TCodice_numerazione& cod_num = cached_numerazione(r->curr().get("CODTAB")); const int last = cod_num.ntipi_doc(); - for (int i = 0; i < last; i++ ) - if (tipodoc_ok(cod_num.tipo_doc(i))) + for (int i = 0; i < last; i++) + { + if (is_tipodoc_ok(cod_num.tipo_doc(i))) return true; + } return false; } diff --git a/ve/ve0200g.uml b/ve/ve0200g.uml index 4e6896e37..aacf5fd99 100755 --- a/ve/ve0200g.uml +++ b/ve/ve0200g.uml @@ -6,6 +6,11 @@ ENDPAGE PAGE "Distinta Base" 0 0 0 0 +GROUPBOX DLG_NULL 78 9 +BEGIN +PROMPT 1 1 "@bParametri esplosione ditinte" +END + BOOLEAN F_EXPLODEDB BEGIN PROMPT 2 2 "Esplosione distinte" @@ -14,14 +19,9 @@ BEGIN FIELD EXPLODEDB END -GROUPBOX DLG_NULL 78 14 -BEGIN -PROMPT 1 4 "Parametri esplosione" -END - LISTBOX F_VALCOMP 15 BEGIN - PROMPT 2 6 "Calcolo valore su " + PROMPT 2 3 "Calcolo valore su " ITEM " |Prodotto finito" ITEM "X|Componenti" FIELD VALCOMP @@ -30,7 +30,7 @@ END LISTBOX F_TIPOESPL 20 BEGIN - PROMPT 2 8 "Tipo esplosione " + PROMPT 2 4 "Tipo esplosione " ITEM " |Scalare" ITEM "X|Materiali di base" FIELD TIPOESPL @@ -39,7 +39,7 @@ END LIST F_RAGGART 34 BEGIN - PROMPT 2 10 "Raggruppo articoli " + PROMPT 2 5 "Raggrupp. articoli " ITEM "0|Nessun raggruppamento" ITEM "1|Converti nell'unita' principale" ITEM "1|Converti nell'unita' di distinta" @@ -52,14 +52,14 @@ END NUMBER F_LIVELLO 3 BEGIN - PROMPT 2 12 "Livello esplosione " + PROMPT 2 6 "Livello esplosione " FIELD LIVESPL GROUP 8 END NUMBER F_ORDDB 3 BEGIN - PROMPT 2 14 "Ordinamento distinta " + PROMPT 2 7 "Ordinamento distinta " USE ORD INPUT CODTAB F_ORDDB DISPLAY "Codice" CODTAB @@ -73,17 +73,76 @@ END STRING F_DESORDDB 47 BEGIN - PROMPT 30 14 "" + PROMPT 30 7 "" FLAGS "D" END BOOLEAN F_ELRORIG BEGIN - PROMPT 2 16 "Elimino la riga originale" + PROMPT 2 8 "Eliminare la riga originale" FIELD ELRORIG GROUP 8 END +GROUPBOX DLG_NULL 78 7 +BEGIN +PROMPT 1 10 "@bParametri articoli" +END + +BOOLEAN F_IVA_OBBL +BEGIN + PROMPT 2 11 "Codice IVA obbligatorio sugli articoli" + FIELD IVA_OBBL +END + +GROUPBOX DLG_NULL 56 4 +BEGIN + PROMPT 2 12 "@bGenerazione automatica codici" +END + +LIST F_GEN_EAN 2 6 +BEGIN + PROMPT 3 13 "Codice articolo " + ITEM " |Nulla" + ITEM "08|EAN 8" + ITEM "13|EAN 13" + FIELD GEN_EAN +END + +LIST F_ALT_EAN 2 6 +BEGIN + PROMPT 3 14 "Codice alternativo " + ITEM " |Nulla" + ITEM "08|EAN 8" + ITEM "13|EAN 13" + FIELD ALT_EAN +END + +GROUPBOX DLG_NULL 20 4 +BEGIN + PROMPT 57 12 "@bPrefissi" +END + +NUMBER F_EAN8 4 +BEGIN + PROMPT 61 13 "EAN 8 " + FIELD EAN8 + FLAGS "Z" +END + +BOOLEAN F_EAN8CIN +BEGIN + PROMPT 36 13 "Genera CIN EAN8" + FIELD EAN8CIN +END + +NUMBER F_EAN13 6 +BEGIN + PROMPT 61 14 "EAN 13 " + FIELD EAN13 + FLAGS "Z" +END + ENDPAGE PAGE "Articoli 1" 1 1 60 14 @@ -982,159 +1041,6 @@ BEGIN GROUP 28 END -GROUPBOX DLG_NULL 78 3 -BEGIN - PROMPT 1 11 "" -END - -BOOLEAN F_CHK_USER19 -BEGIN - PROMPT 2 11 "Campo libero 19" - MESSAGE FALSE CLEAR,29@ - MESSAGE TRUE ENABLE,29@ - FIELD CHK_USER[19] -END - -STRING F_PROMPT_USER19 18 -BEGIN - PROMPT 2 12 "Prompt " - FIELD PROMPT_USER[19] - GROUP 29 -END - -LISTBOX F_TYPE_USER19 7 -BEGIN - PROMPT 30 12 "Tipo " - ITEM "S|Stringa" MESSAGE ENABLE,F_LEN_USER19|CLEAR,F_DEC_USER19 - ITEM "N|Numero" MESSAGE ENABLE,F_LEN_USER19|ENABLE,F_DEC_USER19 - ITEM "I|Importo" MESSAGE ENABLE,F_LEN_USER19|CLEAR,F_DEC_USER19 - ITEM "D|Data" MESSAGE CLEAR,F_LEN_USER19|CLEAR,F_DEC_USER19 - ITEM "X|Si/no" MESSAGE CLEAR,F_LEN_USER19|CLEAR,F_DEC_USER19 - FIELD TYPE_USER[19] - GROUP 29 -END - -NUMBER F_LEN_USER19 2 -BEGIN - PROMPT 45 12 "Lunghezza " - FIELD LEN_USER[19] - GROUP 29 - FLAGS "U" - NUM_EXPR (#THIS_FIELD>0)&&(#THIS_FIELD<=20) - WARNING "La lunghezza del campo deve essere maggiore di 0 e non puo' superare 20 caratteri" -END - -STRING F_DEC_USER19 2 -BEGIN - PROMPT 58 12 "Decimali " - FIELD DEC_USER[19] - GROUP 29 -END - -GROUPBOX DLG_NULL 78 3 -BEGIN - PROMPT 1 14 "" -END - -BOOLEAN F_CHK_USER20 -BEGIN - PROMPT 2 14 "Campo libero 20" - MESSAGE FALSE CLEAR,30@ - MESSAGE TRUE ENABLE,30@ - FIELD CHK_USER[20] -END - -STRING F_PROMPT_USER20 18 -BEGIN - PROMPT 2 15 "Prompt " - FIELD PROMPT_USER[20] - GROUP 30 -END - -LISTBOX F_TYPE_USER20 7 -BEGIN - PROMPT 30 15 "Tipo " - ITEM "S|Stringa" MESSAGE ENABLE,F_LEN_USER20|CLEAR,F_DEC_USER20 - ITEM "N|Numero" MESSAGE ENABLE,F_LEN_USER20|ENABLE,F_DEC_USER20 - ITEM "I|Importo" MESSAGE ENABLE,F_LEN_USER20|CLEAR,F_DEC_USER20 - ITEM "D|Data" MESSAGE CLEAR,F_LEN_USER20|CLEAR,F_DEC_USER20 - ITEM "X|Si/no" MESSAGE CLEAR,F_LEN_USER20|CLEAR,F_DEC_USER20 - FIELD TYPE_USER[20] - GROUP 30 -END - -NUMBER F_LEN_USER20 2 -BEGIN - PROMPT 45 15 "Lunghezza " - FIELD LEN_USER[20] - GROUP 30 - FLAGS "U" - NUM_EXPR (#THIS_FIELD>0)&&(#THIS_FIELD<=20) - WARNING "La lunghezza del campo deve essere maggiore di 0 e non puo' superare 20 caratteri" -END - -STRING F_DEC_USER20 2 -BEGIN - PROMPT 58 15 "Decimali " - FIELD DEC_USER[20] - GROUP 30 -END - -BOOLEAN F_IVA_OBBL -BEGIN - PROMPT 2 17 "Codice IVA obbligatorio sugli articoli" - FIELD IVA_OBBL -END - -GROUPBOX DLG_NULL 56 4 -BEGIN - PROMPT 1 18 "@bGenerazione automatica codici" -END - -LIST F_GEN_EAN 2 6 -BEGIN - PROMPT 2 19 "Codice articolo " - ITEM " |Nulla" - ITEM "08|EAN 8" - ITEM "13|EAN 13" - FIELD GEN_EAN -END - -LIST F_ALT_EAN 2 6 -BEGIN - PROMPT 2 20 "Codice alternativo " - ITEM " |Nulla" - ITEM "08|EAN 8" - ITEM "13|EAN 13" - FIELD ALT_EAN -END - -GROUPBOX DLG_NULL 20 4 -BEGIN - PROMPT 59 18 "@bPrefissi" -END - -NUMBER F_EAN8 4 -BEGIN - PROMPT 62 19 "EAN 8 " - FIELD EAN8 - FLAGS "Z" -END - -BOOLEAN F_EAN8CIN -BEGIN - PROMPT 37 19 "Genera CIN EAN8" - FIELD EAN8CIN -END - -NUMBER F_EAN13 6 -BEGIN - PROMPT 62 20 "EAN 13 " - FIELD EAN13 - FLAGS "Z" -END - - ENDPAGE ENDMASK diff --git a/ve/ve6800.cpp b/ve/ve6800.cpp index e68ce833a..80e38f249 100755 --- a/ve/ve6800.cpp +++ b/ve/ve6800.cpp @@ -267,7 +267,7 @@ void TContabilizzazione_analitica_app::contabilize() //E finalmente fa l'agognata elaborazione!!!!! TString16 elaborazione = _msk->get(F_CODICE_ELAB); TContabilizzazione_analitica contanal(elaborazione); - contanal.elabora(lista_in, lista_out, data_reg); + contanal.elabora(lista_in, lista_out, data_reg, true); if (contanal.processed_docs() > 0L) message_box(FR("Totale documenti contabilizzati: %ld"), contanal.processed_docs()); diff --git a/ve/vearea.men b/ve/vearea.men index 72d68e8a3..3e7415594 100755 --- a/ve/vearea.men +++ b/ve/vearea.men @@ -210,7 +210,6 @@ Item_04 = "Contabilizzazione spese e bolli", "ve0 -2 -4", "F" Item_05 = "Contabilizzazione", "ve0 -2 -5", "F" Item_06 = "Conti per categoria e gruppo", "ve0 -6 &CVM", "F" Item_07 = "Gestione spese e bolli", "ve0 -2 -6", "F" -Item_08 = "Articoli e Distinte", "ve0 -2 -7", "F" Item_09 = "Configurazione contabilità", "cg5 -1", "F" Item_10 = "Fido cliente", "ve0 -2 -8", "F" @@ -221,7 +220,7 @@ Module = 0 Flags = "" Item_01 = "Modifica valori", "ve4 -0", "F" Item_02 = "Aggiornamento Codici IVA", "ve4 -1", "FP" -Item_03 = "Invio", [ACQVEN_025] +Item_03 = "Invio", [ACQVEN_025] Item_04 = "Ricezione", [ACQVEN_026] @@ -230,9 +229,10 @@ Caption = "Configurazione magazzino" Picture = Module = 0 Flags = "" -Item_01 = "Parametri di magazzino", "mg0 -2 -1", "F" +Item_01 = "Parametri di magazzino", "mg0 -2 -1", "F" Item_02 = "Formato codice articoli", "mg0 -0 FCA", "F" -Item_03 = "Formato codice giacenze", "mg0 -0 FCG", "F" +Item_03 = "Formato codice giacenze", "mg0 -0 FCG", "F" +Item_04 = "Articoli e Distinte", "ve0 -2 -7", "F" [ACQVEN_023] Caption = "Archivi contabili" @@ -287,4 +287,5 @@ Caption = "Verticalizzazioni" Picture = Module = 0 Flags = "" -Item_01 = "Caffè Hardy", , "", 10232 +Item_01 = "Bee Store", , "", 9015 +Item_02 = "Caffè Hardy", , "", 10232 diff --git a/ve/velib.h b/ve/velib.h index 2ddf3ed33..9804585d2 100755 --- a/ve/velib.h +++ b/ve/velib.h @@ -296,9 +296,11 @@ public: const char stato_mov_iniziale() const {return get_char("S7"); } const char stato_mov_finale() const {return get_char("S8"); } const char stato_provvigioni() const {return get("S3")[0]; } - const TString & elaborazione() const {return get("S3").mid(4,8); } - const TString & elaborazione_stampa() const {return get("S3").mid(12,8); } - const TString & elaborazione_definitiva() const {return get("S3").mid(20,8); } + const TString& elaborazione() const {return get("S3").mid(4,8); } + const TString& elaborazione_stampa() const {return get("S3").mid(12,8); } + const TString& elaborazione_definitiva() const {return get("S3").mid(20,8); } + const TString& elaborazione_speciale() const {return get("S3").mid(28,8); } + bool movimento_interno() const; const TString & caus_mov() const {return get("S9"); } // Causale di magazzino const TString & caus_anticipo() const {return get("S10"); } const TString & tipi_iva_validi() const {return get("S11"); } @@ -318,7 +320,7 @@ public: bool mail_print_profile(TFilename& report) const; bool is_costo() const ; bool is_ricavo() const ; - const TString & module() const { return _module; } + const TString& module() const { return _module; } TFormula_documento* first_formula() { return succ_formula(true); } TFormula_documento* succ_formula(bool restart = false); @@ -1018,6 +1020,7 @@ public: static bool codval_handler( TMask_field& f, KEY key ); static bool confirm_handler( TMask_field& f, KEY key ); static bool barcode_handler( TMask_field& f, KEY key ); + static bool movint_handler( TMask_field& f, KEY key ); static bool sort_row_handler( TMask_field& f, KEY key ); static bool ss_notify(TSheet_field& ss, int r, KEY key); static bool ss_handler(TMask_field& f, KEY key); diff --git a/ve/velib03.cpp b/ve/velib03.cpp index 256d58df7..2c588ca03 100755 --- a/ve/velib03.cpp +++ b/ve/velib03.cpp @@ -3008,6 +3008,10 @@ void TDocumento::update_conai() bool TDocumento::is_evaso() const { bool ok = is_ordine() || is_bolla() || is_generic(); + + if (ok && tipo().is_ordine_quadro()) + return false; + for (int r = 1; ok && r <= physical_rows(); r++) { const TRiga_documento& riga = physical_row(r); diff --git a/ve/velib03a.cpp b/ve/velib03a.cpp index c1e59443f..0ed20d642 100755 --- a/ve/velib03a.cpp +++ b/ve/velib03a.cpp @@ -171,21 +171,29 @@ const TString& TTipo_documento::riferimento(const TDocumento & doc, TString& rif } TString val; - - if (field.file() == LF_DOC) - { + switch (field.file()) + { + case LF_CLIFO: + case LF_CFVEN: + if (doc.get_long(DOC_CODCF) > 0) + { + TString8 key; key << doc.get(DOC_TIPOCF) << '|' << doc.get(DOC_CODCF); + const TRectype& rec = cache().get(field.file(), key); + val = field.read(rec); + } + break; + case LF_OCCAS: + if (doc.get_char(DOC_TIPOCF) == 'C' && doc.get(DOC_OCFPI).full()) + { + const TRectype& rec = cache().get(LF_OCCAS, doc.get(DOC_OCFPI)); + val = field.read(rec); + } + break; + default: val = field.read(doc); - rif.insert(val, p); + break; } - else - { - TString8 key(doc.get(DOC_TIPOCF)); - key << '|' << doc.get(DOC_CODCF); - - const TRectype& rec = cache().get(field.file(), key); - val = field.read(rec); - rif.insert(val, p); - } + rif.insert(val, p); switch (conn) { @@ -449,6 +457,17 @@ void TTipo_documento::read_formule() _check_double_art = prof.get_bool("CHECK_DOUBLE_ART"); } +bool TTipo_documento::movimento_interno() const +{ + const TString& elab = elaborazione(); + if (elab.full()) + { + const TString& app = cache().get("%ELD", elab, "S3"); + return app.starts_with("ci1 -4", true); + } + return false; +} + bool TTipo_documento::stato_with_mov_mag(const char stato) const { if (!mov_mag()) diff --git a/ve/velib04.cpp b/ve/velib04.cpp index 7c8db4ef1..6e23788d2 100755 --- a/ve/velib04.cpp +++ b/ve/velib04.cpp @@ -537,8 +537,9 @@ bool TElaborazione_esterna::elabora(TLista_documenti& doc_in, TLista_documenti& return error_box("Non è stato specificato il nome del'applicazione esterna"); CHECK(doc_in.items() == 1, "Si deve specificare un solo documento in entrata"); CHECK(doc_out.items() <= 1, "Si deve specificare un solo documento in uscita"); - TFilename name; name.temp("ext"); + TDocumento& d = doc_in[0]; + TFilename name; name.temp("ext"); TString16 par; { @@ -554,10 +555,16 @@ bool TElaborazione_esterna::elabora(TLista_documenti& doc_in, TLista_documenti& c.set("CodNumOut", doc_out[0].get(DOC_CODNUM)); c.set("NDocOut", doc_out[0].get(DOC_NDOC)); } + else if (codice_numerazione_finale().full()) + { + c.set("ProvvOut", d.get(DOC_PROVV)); + c.set("AnnoOut", d.get(DOC_ANNO)); + c.set("CodNumOut", codice_numerazione_finale()); + c.set("NDocOut", 0L); + } par.format("%d", LF_DOC); - TDocumento& d = doc_in[0]; const int doc_fields = d.items(); for (int i = 0; i < doc_fields; i++) { @@ -608,25 +615,25 @@ bool TElaborazione_esterna::elabora(TLista_documenti& doc_in, TLista_documenti& c.list_paragraphs(p); d.destroy_rows(); - int r = 1 ; - par.format("%d,%d", LF_RIGHEDOC, r); - while (p.find(par) >= 0) - { - const TString& tiporiga = c.get(RDOC_TIPORIGA, par); + for (int r = 1; ; r++) + { + par.format("%d,%d", LF_RIGHEDOC, r); + if (p.find(par) < 0) + break; + const TString& tiporiga = c.get(RDOC_TIPORIGA, par, -1, "01"); TRiga_documento& row = d.new_row(tiporiga); for (int i = row.items()-1; i >= 0; i--) { const char* fname = row.fieldname(i); const TFieldref f(fname, LF_RIGHEDOC); const TString& val = f.read(c, par); - if (val.not_empty()) + if (val.full()) row.put(fname, val); } - par.format("%d,%d", LF_RIGHEDOC, ++r); } const char final = stato_finale_doc_iniziale()[0]; - if (d.stato() != final) + if (final > '0' && d.stato() != final) d.stato(final); return true; @@ -635,11 +642,13 @@ bool TElaborazione_esterna::elabora(TLista_documenti& doc_in, TLista_documenti& { if (doc_out.items()) { + const TString& ndoc = c.get("NDocOut", "Transaction"); + if (ndoc != doc_out[0].get(DOC_NDOC)) + doc_out[0].put(DOC_NDOC, ndoc); doc_out[0].read(); return true; } } - } return false; } diff --git a/ve/velib04.h b/ve/velib04.h index f1ea436c8..6e62aa812 100755 --- a/ve/velib04.h +++ b/ve/velib04.h @@ -642,7 +642,7 @@ protected: const TCausale& rdoc2caus(const TRiga_documento& rdoc); void init_distrib(TString_array& conti, TGeneric_distrib& distrib, bool pareggio); - void calcola_date_comp(const TDocumento& doc, TDate& datacomp, TDate& datafcomp, int annoes); + int calcola_date_comp(const TDocumento& doc, TDate& datacomp, TDate& datafcomp) const; public: bool search_costo_ricavo(const TRiga_documento& riga, TBill& conto, bool riclassifica_fdr_fde); diff --git a/ve/velib04d.cpp b/ve/velib04d.cpp index 5abc09de1..46a60768d 100755 --- a/ve/velib04d.cpp +++ b/ve/velib04d.cpp @@ -220,17 +220,20 @@ void TConsegna_mask::doc2mask(const TDocumento& indoc, const TDocumento& outdoc, TEsercizi_contabili esc; const int codes = esc.date2esc(oggi); - const bool show_evaded = indoc.tipo().mostra_righe_evase_in_elaborazione(); + const TTipo_documento& tip = indoc.tipo(); + const bool ordine_quadro = tip.is_ordine_quadro(); + const bool show_evaded = ordine_quadro || tip.mostra_righe_evase_in_elaborazione(); TSheet_field& s = sfield(F_ROWS); s.destroy(); + const int rows = indoc.physical_rows(); int rowno = 0; for (int i = 0; i < rows; i++) { const TRiga_documento& rec = indoc[i+1]; const real residuo = rec.qtaresidua(); - const bool evasa = residuo.is_zero(); + const bool evasa = residuo.is_zero() && !ordine_quadro; bool show_line = show_evaded || !evasa; if (rec.is_descrizione()) show_line = !_ignora_descrizioni; @@ -355,15 +358,13 @@ bool TConsegna_ordini::aggiorna_ncolli_tara_pnetto(TRiga_documento& r) const TArticolo& articolo = cached_article(codart); const real qta = articolo.convert_to_um(r.quantita(), NULL, r.get(RDOC_UMQTA)); real ncolli, tara, pnetto; - const bool ok = calcola_ncolli_tara_pnetto(codart, qta, ncolli, tara, pnetto); if (ok) { r.put(RDOC_NCOLLI, ncolli); - r.put(RDOC_TARA, tara); + r.put(RDOC_TARA, tara); r.put(RDOC_PNETTO, pnetto); } - return ok; } @@ -400,7 +401,6 @@ bool TConsegna_ordini::genera_righe_riferimento(const TDocumento& indoc, TDocume } const TString4 numrif = num_riferimenti_in(); - if (numrif.full()) { TAssoc_array doc_rows; @@ -425,8 +425,7 @@ bool TConsegna_ordini::genera_righe_riferimento(const TDocumento& indoc, TDocume query << "\nFROM " << select; query << "\nTO " << select; - TISAM_recordset recset(query); - + TISAM_recordset recset(query); for (bool ok = recset.move_first(); ok; ok = recset.move_next()) { const char provv = recset.get(RDOC_PROVV).as_string()[0]; @@ -820,8 +819,7 @@ bool TConsegna_ordini::elabora(TLista_documenti& doc_in, TLista_documenti& doc_o } // Crea una nuova riga merce senza articolo e con sola descrizione, qta ed um TRiga_documento& outrec = outdoc.insert_row(i+1, tiporiga); - TString descr; - descr << TR("Scarto") << ' ' << codart; + TString descr; descr << TR("Scarto ") << codart; outrec.put(RDOC_DESCR, descr); TToken_string& ska = *(TToken_string*)obj; outrec.put(RDOC_UMQTA, ska.get(0)); @@ -846,8 +844,6 @@ bool TConsegna_ordini::elabora(TLista_documenti& doc_in, TLista_documenti& doc_o FOR_EACH_PHYSICAL_RDOC_BACK(indoc, i, rdoc) { TRiga_documento& inrec = *rdoc; - const int nrow = inrec.get_int(RDOC_NRIGA); - if (inrec.is_evasa()) indoc.destroy_row(i, true); else @@ -855,7 +851,6 @@ bool TConsegna_ordini::elabora(TLista_documenti& doc_in, TLista_documenti& doc_o const real evaso = inrec.qtaevasa(); const char* fq = inrec.field_qta(); const char* fqe = inrec.field_qtaevasa(); - inrec.add(fq, -evaso); // nuovo modo di incrementare inrec.zero(fqe); } diff --git a/ve/velib04f.cpp b/ve/velib04f.cpp index 25c9e1c3e..868584892 100755 --- a/ve/velib04f.cpp +++ b/ve/velib04f.cpp @@ -41,7 +41,7 @@ const TCausale& TCache_causali::causale(const TDocumento& doc, const TString & f if (!fld_cms.blank()) { - const TString & cms = doc.commessa_principale(); + const TString& cms = doc.commessa_principale(); if (!cms.blank()) { @@ -302,7 +302,7 @@ bool TContabilizzazione_analitica::search_costo_ricavo(const TRiga_documento& r, if (rdoc != NULL && rdoc->get(RDOC_PROVV).not_empty()) { - TString80 key(rdoc->get(RDOC_CODNUM)); + TString80 key = rdoc->get(RDOC_CODNUM); const TCodice_numerazione& num = cached_numerazione(key); if (num.fattura_emettere_ricevere()) @@ -334,11 +334,12 @@ bool TContabilizzazione_analitica::search_costo_ricavo(const TRiga_documento& r, return conto.ok() && conto.find(); } -bool TContabilizzazione_analitica::find_conti_iva_indetraibile(const TRiga_documento& riga, const TBill & bill, TString_array& conti, int annoes, const char tipomov, bool & pareggio) +bool TContabilizzazione_analitica::find_conti_iva_indetraibile(const TRiga_documento& riga, const TBill& bill, + TString_array& conti, int annoes, const char tipomov, bool& pareggio) { - const TString80 riga_cos = riga.codice_costo(); - const TString80 riga_cms = riga.codice_commessa(); - const TString16 riga_fsc = riga.fase_commessa(); + const TCodice_cdc riga_cos = riga.codice_costo(); + const TCodice_cms riga_cms = riga.codice_commessa(); + const TCodice_fas riga_fsc = riga.fase_commessa(); TToken_string conto; conto = bill.string(0x8); // format("%03d%03d%06ld", bill.gruppo(), bill.conto(), bill.sottoconto()); @@ -381,7 +382,7 @@ bool TContabilizzazione_analitica::find_conti(const TRiga_documento& riga, TStri bool bArcticleFound = false; const char tipocf = riga.doc().get_char(DOC_TIPOCF); - TString80 contanal; + TCodice_con contanal; TToken_string conto; TBill bill; // Cerco il conto contabile @@ -442,9 +443,9 @@ bool TContabilizzazione_analitica::find_conti(const TRiga_documento& riga, TStri return true; } - const TString80 riga_cos = riga.codice_costo(); - const TString80 riga_cms = riga.codice_commessa(); - const TString16 riga_fsc = riga.fase_commessa(); + const TCodice_cdc riga_cos = riga.codice_costo(); + const TCodice_cms riga_cms = riga.codice_commessa(); + const TCodice_fas riga_fsc = riga.fase_commessa(); if (contanal.full()) // Non ho trovato il conto in anagrafica ... { @@ -469,18 +470,16 @@ bool TContabilizzazione_analitica::find_conti(const TRiga_documento& riga, TStri conto = rigarip.get(RRIP_CODCONTO).full() ? rigarip.get(RRIP_CODCONTO) : contanal; - const TString costo = rigarip.get(RRIP_CODCOSTO); - + const TString& costo = rigarip.get(RRIP_CODCOSTO); conto.add(costo.full() ? costo : riga_cos, 1); - const TString & commessa = rigarip.get(RRIP_CODCMS); - + const TString& commessa = rigarip.get(RRIP_CODCMS); conto.add(commessa.full() ? commessa : riga_cms, 2); const TString & fase = rigarip.get(RRIP_CODFASE); - conto.add(fase.full() ? fase: riga_fsc, 3); - conto.add(rigarip.get(RRIP_RIPARTO), 4); + + conto.add(rigarip.get(RRIP_RIPARTO), 4); conti.add(conto); } } @@ -502,7 +501,7 @@ void TContabilizzazione_analitica::init_distrib(TString_array& conti, TGeneric_d } } -void TContabilizzazione_analitica::calcola_date_comp(const TDocumento& doc, TDate& datacomp, TDate& datafcomp, int annoes) +int TContabilizzazione_analitica::calcola_date_comp(const TDocumento& doc, TDate& datacomp, TDate& datafcomp) const { const TDate datadoc = doc.get_date(DOC_DATADOC); datacomp = doc.get_date(DOC_DATACOMP); @@ -512,7 +511,7 @@ void TContabilizzazione_analitica::calcola_date_comp(const TDocumento& doc, TDat if (!datafcomp.ok()) datafcomp = datacomp; - annoes = esercizi().date2esc(datacomp); //ci potrebbe andare datacomp? All'analisi l'ardua sentenza + return esercizi().date2esc(datacomp); //ci potrebbe andare datacomp? All'analisi l'ardua sentenza } void TContabilizzazione_analitica::split_sp_amount(TAnal_mov & mov, bool pareggio, const TImporto & totdoc, @@ -573,7 +572,7 @@ bool TContabilizzazione_analitica::elabora(TDocumento& doc, long numreg_cg, TVis } else { - calcola_date_comp(doc, datacomp, datafcomp, annoes); + annoes = calcola_date_comp(doc, datacomp, datafcomp); datareg = datadoc; doc.riferimento(descr); @@ -620,7 +619,7 @@ bool TContabilizzazione_analitica::elabora(TDocumento& doc, long numreg_cg, TVis mov.put(MOVANA_NUMREG, numreg_ca = 0); } - calcola_date_comp(doc, datacomp, datafcomp, annoes); + annoes = calcola_date_comp(doc, datacomp, datafcomp); mov.put(MOVANA_DATAREG, datareg); mov.put(MOVANA_DATACOMP, datacomp); @@ -872,7 +871,9 @@ bool TContabilizzazione_analitica::elabora(TLista_documenti& doc_in, TLista_docu p.links().add("Movimento Analitico |r|w", 0); p.setlinkhandler(link_handler_ana); pre_process_input(doc_in); - v.open_modal(); + + if (interattivo) + v.open_modal(); for (int i = 0; i < doc_in.items(); i++) { TAnal_mov mov; @@ -897,7 +898,8 @@ bool TContabilizzazione_analitica::elabora(TLista_documenti& doc_in, TLista_docu break; } v.close_print(); - v.close_modal(); + if (interattivo) + v.close_modal(); if (_total_docs > 0) { @@ -905,8 +907,11 @@ bool TContabilizzazione_analitica::elabora(TLista_documenti& doc_in, TLista_docu post_process(doc_out, doc_in); } - if (v.run() == K_CTRL+'S') // Ho premuto Stampa - p.print_txt(v.text()); + if (interattivo || _total_docs < doc_in.items()) + { + if (v.run() == K_CTRL+'S') // Ho premuto Stampa + p.print_txt(v.text()); + } return true; } diff --git a/ve/velib06.cpp b/ve/velib06.cpp index 093076f4a..a12cee064 100755 --- a/ve/velib06.cpp +++ b/ve/velib06.cpp @@ -1,3433 +1,3464 @@ -#include -#include -#include -#include -#include -#include -// #include // Cassato il macchinaro -#include -#include -#include -#include - -#include "../db/dblib.h" -#include "velib04.h" -#include "vepriv.h" -#include "verig.h" - -#include "ve0100.h" -#include "ve0100b1.h" -#include "ve0100c.h" -#include "ve0100o.h" -#include "veuml.h" -#include "veuml1.h" -#include "veini.h" - -#include "../cg/cfban.h" -#include "../ca/cfcms.h" -#include "condv.h" -#include "rcondv.h" -#include "sconti.h" - -#include - -/////////////////////////////////////////////////////////// -// TOriginal_row_mask -/////////////////////////////////////////////////////////// - -class TOriginal_row_mask : public TAutomask -{ -protected: - virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); - virtual bool on_key(KEY key); - -public: - TOriginal_row_mask() : TAutomask("ve0100c") { } -}; - -bool TOriginal_row_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) -{ return true; } - -bool TOriginal_row_mask::on_key(KEY key) -{ - if (key == K_SHIFT + K_F12) - enable(-1); - return TAutomask::on_key(key); -} - -/////////////////////////////////////////////////////////// -// TColor_rule -/////////////////////////////////////////////////////////// - - -TColor_rule::TColor_rule(const char* desc, const char* expr, TTypeexp type, COLOR back, COLOR fore) - : TExpr_documento(expr, type), _back(back), _fore(fore), _def_back(back), _def_fore(fore) -{ - _desc = dictionary_translate(desc); - _key = desc; _key.trim(); _key.strip_double_spaces(); - _key.replace(' ', '_'); -} - -/////////////////////////////////////////////////////////// -// Gestione campi CONAI su maschera righe -/////////////////////////////////////////////////////////// - -short conai_peso_id(TCONAI_class type) -{ return type >= CONAI_FIRST && type <= CONAI_LAST ? FR_PUNACC + 2 * type : DLG_NULL; } - -short conai_sottocat_id(TCONAI_class type) -{ return type >= CONAI_FIRST && type <= CONAI_LAST ? FR_SCAACC + 2*type : DLG_NULL; } - -TCONAI_class conai_id2class(short id) -{ - const TCONAI_class t = TCONAI_class((id-FR_SCAACC) / 2); - return t >= CONAI_FIRST && t <= CONAI_LAST ? t : CONAI_NONE; -} - -/////////////////////////////////////////////////////////// -// TDocumento_mask -/////////////////////////////////////////////////////////// - -TDocumento_mask::TDocumento_mask(const char* td) - : TVariable_mask(), _progs_page(-1), _condv(NULL), //_smartcard(NULL), - _cms_start(-1), _cms_end(-1), _cms_start_sh(-1), _cms_end_sh(-1), - _cdc_start(-1), _cdc_end(-1), _cdc_start_sh(-1), _cdc_end_sh(-1) -{ - CHECK(td && *td && strlen(td) <= 4, "TDocumento_mask(TipoDocumento) not (MaskName)"); - { - TMagazzini m; - _ges_mag = m.gestmag(); - _ges_dep = m.gestdep(); - _std_mag = m.standardmag(); - _std_dep = m.standarddep(); - } - TDocumento& d = doc(); - d.set_tipo(td); - const TString16 mname = d.tipo().mask_name(); - read_mask(mname, 0, MAX_PAGES); - - _sheet = &sfield(F_SHEET); - set_field_handler(F_SHEET, ss_handler ); - _sheet->set_notify( ss_notify ); - _sheet->set_append(FALSE); - - TList_field& listbox = lfield(F_LBTIPORIGA); - - const TTipo_documento& tdoc = d.tipo(); - const TToken_string& keys = tdoc.keys_descrs().row(0); - const TToken_string& desc = tdoc.keys_descrs().row(1); - listbox.replace_items(keys, desc); - - // Controlla se deve generare la pagina di analitica - _ges_ca = ca_config().get_int("Authorizations") != 0; - if (_ges_ca) - insert_anal_page(); - - configura_sheet(*_sheet); - - ((TVariable_sheet_field*)_sheet)->set_getmask( ss_getmask ); - if (_doc.tipo().clifo_optional()) - { - field(F_CODCF).check_type(CHECK_NORMAL); - field(F_RAGSOC).check_type(CHECK_NORMAL); - } - - int i; - for (i = fields() - 1; i >= 0; i--) - { - TMask_field& f = fld(i); - if (f.is_operable()) - f.set_handler(universal_handler); - } - - set_field_handler( F_OCCASEDIT, occas_handler ); - set_field_handler( F_CODCF, clifo_handler ); - set_field_handler( F_CODPAG, condpag_hndl ); - set_field_handler( F_DATAINSC, condpag_hndl ); - set_field_handler( F_MANDATO, mandato_hndl ); - set_field_handler( F_CODNOTE, note_hndl ); - set_field_handler( F_DATADOC, data_hndl ); - set_field_handler( F_CODLIST, codlist_handler ); - set_field_handler( F_CODCONT, codcont_handler ); - set_field_handler( F_CODCAMP, codcamp_handler ); - set_field_handler( F_CODVAL, codval_handler ); - set_field_handler( F_CODVAL1, codval_handler ); - set_field_handler( F_NUMDOCRIF, datadocrif_handler); - set_field_handler( F_DATADOCRIF, datadocrif_handler); - set_field_handler( F_LIQDIFF, liqdiff_handler); - - set_handler( DLG_ELABORA, elabora_handler ); - set_handler( DLG_PRINT, print_handler ); - set_handler( DLG_PREVIEW, print_handler ); - set_handler( DLG_EMAIL, print_handler ); - set_handler( DLG_CONFERMA, confirm_handler ); - set_handler( DLG_SORT, sort_row_handler ); - set_handler( DLG_BARCODE, barcode_handler ); - - const TPointer_array& handlers = tdoc.handlers(); - FOR_EACH_ARRAY_ITEM(handlers, r, riga) - user_set_handler( r, (int)riga); - - _livelli_giac = new TCodgiac_livelli; - - for (i = 4; i > 0; i--) - { - const short pos = _sheet->cid2index(FR_LIV1 + i -1); - if (_livelli_giac->enabled(i)) - { - const TString& header = _livelli_giac->name(i); - const int len = header.len() + 1; - const int f_len = _livelli_giac->code_length(i); - _sheet->set_column_header(pos, header); - _sheet->set_column_width(pos, (len > f_len ? len : f_len) * 8); - } - else - { - _sheet->sheet_mask().hide(FR_LIV1 + i -1); - _sheet->delete_column(pos); - } - } - -// configurazione campi - - TConfig cfg(CONFIG_DITTA, "ve"); - const bool gesval = cfg.get_bool("GESVAL"); - const bool gescambi = cfg.get_bool("GESVALAC"); - - if (gesval) - { - //const bool enable_controeuro = cfg.get_bool("CONTROEURO"); - //enable(F_CONTROEURO, enable_controeuro); - - show(F_CODVAL, !gescambi); - show(F_DATACAMBIO, !gescambi); - show(F_NOMEVAL, !gescambi); - show(F_CODVAL1, gescambi); - show(F_DATACAMBIO1, gescambi); - show(F_NOMEVAL1, gescambi); - show(F_CAMBIO); - } - else - { - disable(F_CODVAL); - disable(F_DATACAMBIO); - // disable(F_CONTROEURO); - disable(F_NOMEVAL); - hide(F_CODVAL1); - hide(F_DATACAMBIO1); - hide(F_NOMEVAL1); - disable(F_CAMBIO); - } - - const bool geslin = cfg.get_bool("GESLIN"); - - enable(F_CODLIN, geslin); - enable(F_DESLIN, geslin); - - const bool geslis = cfg.get_bool("GES", NULL, 1); - - show(F_CODLIST, geslis); - show(F_DESLIST, geslis); - enable(F_CODLIST, geslis); - enable(F_DESLIST, geslis); - - hide(203); - disable(203); - - hide(204); - disable(204); - - for (int n = 0; n < 2; n++) - { - const short id = n == 0 ? F_CODNOTE : F_NOTECLI; - if (id2pos(id) >= 0) // Alcuni profili NON hanno le note - { - TBrowse* nb = efield(id).browse(); - if (nb != NULL) - { - nb->set_output_fields(TOSTRING(F_CODNOTE)); - nb->set_output_field_names("CODTAB"); - } - } - else - break; - } - - if (cfg.get_bool("GESLISCV") && id2pos(F_CODLIST) > 0) - { - TBrowse * b = efield(F_CODLIST).browse(); - if (b != NULL) - { - b->remove_input_field(); - b->add_input_field("\"L\"", RCONDV_TIPO); - b->add_input_field(TOSTRING(F_CATVEN), DOC_CATVEN, -1, true); - b->add_input_field("\"\"", DOC_TIPOCF); - b->add_input_field("\"\"", DOC_CODCF); - b->add_input_field(TOSTRING(F_CODLIST), RCONDV_COD); - } - if (id2pos(F_DESLIST) > 0) - { - b = efield(F_DESLIST).browse(); - if (b != NULL) - { - TString filter; - filter << DOC_CATVEN << "==#" << F_CATVEN; - b->set_filter(filter); - } - } - } - - const bool gescontr = cfg.get_bool("GES", "ve", 2); - - show(F_CODCONT, gescontr); - show(F_DESCONT, gescontr); - enable(F_CODCONT, gescontr); - enable(F_DESCONT, gescontr); - if (cfg.get_bool("GESCONCC") && id2pos(F_CODCONT) > 0) - { - TBrowse * b = efield(F_CODCONT).browse(); - if (b != NULL) - { - b->remove_input_field(); - b->add_input_field("\"C\"", RCONDV_TIPO); - b->add_input_field("\"\"", RCONDV_CATVEN); - b->add_input_field(TOSTRING(F_TIPOCF), RCONDV_TIPOCF, -1, true); - b->add_input_field(TOSTRING(F_CODCF), RCONDV_CODCF, -1, true); - b->add_input_field(TOSTRING(F_CODCONT), RCONDV_COD); - } - if (id2pos(F_DESCONT) > 0) - { - b = efield(F_DESCONT).browse(); - if (b != NULL) - { - TString filter; - filter << "(" << DOC_TIPOCF << "==#" << F_TIPOCF << ")&&(" << DOC_CODCF << "==#" << F_CODCF << ")"; - b->set_filter(filter); - } - } - } - - const TDongle& a = dongle(); - if (a.active(CTAUT) || a.active(PAAUT)) - { - if (_ges_ca && id2pos(F_CUP) > 0) // Se gestisco l'analtica ... - { - TLocalisamfile cfcms(LF_CFCMS); - if (cfcms.first() == NOERR) // ... ed i clienti per commessa (alias sono Dinamica) - { - // Allora impongo la scelta di CIG e CUP in base alla commessa - TBrowse* bp = efield(F_CUP).browse(); - - TRelation * rp = new TRelation(LF_CFCMS); - rp->add("%CUP", "CODTAB==" CFCMS_CUP); - rp->add(LF_CLIFO, "TIPOCF==TIPOCF|CODCF==CODCF"); - bp->set_cursor(new TCursor(rp, "", 2)); - - bp->set_filter("TIPOCF==\"C\""); - bp->remove_input_field(); - bp->add_input_field(TOSTRING(F_CMSH), CFCMS_COMMESSA, -1, true); - bp->add_input_field(TOSTRING(F_CUP), CFCMS_CUP); - bp->remove_display_field(); - bp->add_display_field(HR("Codice CUP@15"), CFCMS_CUP); - bp->add_display_field(HR("Descrizione@50"), "%CUP->S0"); - bp->add_display_field(HR("Codice Cliente"), CFCMS_CODCF); - bp->add_display_field(HR("Ragione Sociale@50"), TOSTRING(LF_CLIFO) "->" CLI_RAGSOC); - bp->remove_output_field(); - bp->add_output_field(TOSTRING(F_CUP), CFCMS_CUP); - bp->add_output_field(TOSTRING(F_CIG), CFCMS_CIG); - bp->add_output_field(TOSTRING(F_DESCRCUP), "%CUP->S0"); - bp->set_insert("Rca0 -5"); - - TBrowse* bpd = efield(F_DESCRCUP).browse(); - bpd->set_cursor(new TSorted_cursor(rp, CFCMS_COMMESSA "|%CUP->S0")); - bpd->set_filter("TIPOCF==\"C\""); - bpd->remove_input_field(); - bpd->add_input_field(TOSTRING(F_CMSH), CFCMS_COMMESSA, -1, true); - bpd->add_input_field(TOSTRING(F_DESCRCUP), "%CUP->S0"); - bpd->remove_display_field(); - bpd->add_display_field(HR("Descrizione@50"), "%CUP->S0"); - bpd->add_display_field(HR("Codice CUP@15"), CFCMS_CUP); - bpd->add_display_field(HR("Codice Cliente"), CFCMS_CODCF); - bpd->add_display_field(HR("Ragione Sociale@50"), TOSTRING(LF_CLIFO) "->" CLI_RAGSOC); - bpd->copy_output(bp); - bpd->set_insert("Rca0 -5"); - - TBrowse * bg = efield(F_CIG).browse(); - TRelation * rg = new TRelation(LF_CFCMS); - - rg->add("%CIG", "CODTAB==" CFCMS_CIG); - rg->add(LF_CLIFO, "TIPOCF==TIPOCF|CODCF==CODCF"); - bg->set_cursor(new TCursor(rg, "", 3)); - bg->set_filter("TIPOCF==\"C\""); - bg->remove_input_field(); - bg->add_input_field(TOSTRING(F_CMSH), CFCMS_COMMESSA, -1, true); - bg->add_input_field(TOSTRING(F_CIG), CFCMS_CIG); - bg->remove_display_field(); - bg->add_display_field(HR("Codice CIG@15"), CFCMS_CIG); - bg->add_display_field(HR("Descrizione@50"), "%CIG->S0"); - bg->add_display_field(HR("Codice Cliente"), CFCMS_CODCF); - bg->add_display_field(HR("Ragione Sociale@50"), TOSTRING(LF_CLIFO) "->" CLI_RAGSOC); - bg->remove_output_field(); - bg->add_output_field(TOSTRING(F_CIG), CFCMS_CIG); - bg->add_output_field(TOSTRING(F_CUP), CFCMS_CUP); - bg->add_output_field(TOSTRING(F_DESCRCIG), "%CIG->S0"); - bg->set_insert("Rca0 -5"); - - TBrowse * bgd = efield(F_DESCRCIG).browse(); - - bgd->set_cursor(new TSorted_cursor(rg, CFCMS_COMMESSA "|%CIG->S0")); - bgd->set_filter("TIPOCF==\"C\""); - bgd->remove_input_field(); - bgd->add_input_field(TOSTRING(F_CMSH), CFCMS_COMMESSA, -1, true); - bgd->add_input_field(TOSTRING(F_DESCRCIG), "%CIG->S0"); - bgd->remove_display_field(); - bgd->add_display_field(HR("Descrizione@50"), "%CIG->S0"); - bgd->add_display_field(HR("Codice CIG@15"), CFCMS_CIG); - bgd->add_display_field(HR("Cliente"), CFCMS_CODCF); - bgd->add_display_field(HR("Ragione Sociale@50"), TOSTRING(LF_CLIFO) "->" CLI_RAGSOC); - bgd->copy_output(bg); - bgd->set_insert("Rca0 -5"); - } - } - } - else - { - hide(F_CUP); - hide(F_DESCRCUP); - hide(F_CIG); - hide(F_DESCRCIG); - } - - const bool gesoff = cfg.get_bool("GES", "ve", 3); - enable(F_CODCAMP, gesoff); - enable(F_DESCAMP, gesoff); - - const bool gessco = cfg.get_char("GESSCO") != 'N'; - enable(F_SCONTOPERC, gessco); - - const bool gesage = cfg.get_bool("GESAGE"); - enable(F_CODAG, gesage); - enable(F_DESAG, gesage); - enable(F_CODAGVIS, gesage); - enable(F_DESAGVIS, gesage); - - const bool has_movmag = dongle().active(MGAUT) && _doc.tipo().mov_mag(); - int pos = id2pos(F_CAUSMAG); - if (pos >= 0) - fld(pos).show(has_movmag); - pos = id2pos(F_DESCRMAG); - if (pos >= 0) - fld(pos).show(has_movmag); - pos = id2pos(F_CAUSMAGC); - if (pos >= 0) - fld(pos).show(has_movmag); - pos = id2pos(F_DESCRMAGC); - if (pos >= 0) - fld(pos).show(has_movmag); - pos = id2pos(F_CURGIAC); - if (pos >= 0) - fld(pos).show(has_movmag); - pos = id2pos(F_CURDISP); - if (pos >= 0) - fld(pos).show(has_movmag); - - FOR_EACH_MASK_FIELD((*this), j, f) - { - if (f->dlg() > BASE_PIEDE) - _calculated_pages.set(f->page()); - } - - TFilename pn; d.tipo().profile_name(pn); - TConfig prof(pn, "Colors"); - prof.write_protect(true); - - COLOR back = prof.get_color("BgCol", NULL, 0, COLOR_YELLOW); // FOCUS_BACK_COLOR - COLOR fore = prof.get_color("FgCol", NULL, 0, COLOR_BLACK); // FOCUS_COLOR - color_rules().add(new TColor_rule("Righe collegate a documento", "", _numexpr, back, fore)); - - for (int i = 1; ; i++) - { - const TString& name = prof.get("RuleName", NULL, i); - if (name.full()) - { - const TString& expr = prof.get("Rule", NULL, i); - const TTypeexp type = prof.get_char("RuleType", NULL, i, 'N') == 'S' ? _strexpr : _numexpr ; - back = prof.get_color("BgCol", NULL, i, NORMAL_BACK_COLOR); - fore = prof.get_color("FgCol", NULL, i, NORMAL_COLOR); - color_rules().add(new TColor_rule(name, expr, type, back, fore)); - } - else - break; - } - _sh_y = prof.get_int("SHEET_LINE", "MAIN"); - - // Legge i colori personalizzati dal .ini gestito dalla TSelect_color_mask - TString tmp; tmp << doc().tipo().mask_name() << "_0"; tmp.lower(); - TConfig conf(CONFIG_GUI, tmp); - conf.write_protect(); - FOR_EACH_ARRAY_ITEM(color_rules(), j, o) - { - TColor_rule& c = *(TColor_rule*)o; - tmp = c.key(); - COLOR fore = conf.get_color(tmp); - tmp << "_Bg"; - COLOR back = conf.get_color(tmp); - if (back != fore) - c.set_colors(back, fore); - } - - if (gestione_note_per_articolo()) - set_handler(F_NAR, nar_handler); -} - -TDocumento_mask::~TDocumento_mask() -{ - if (_condv) - delete _condv; - if (_livelli_giac) - delete _livelli_giac; - // if (_smartcard) delete _smartcard; // cassato il macchinaro -} - -int TDocumento_mask::insert_anal_fields(TMask& m, int page, int lf, int& y, - short& dlg, short& dlgd, bool required) -{ - const int h = ca_create_fields(m, page, lf, 2, y, dlg, dlgd); - - const bool main_mask = m.id2pos(F_SHEET) > 0; - - for (int i = 0; i < h; i++) - { - TEdit_field& fld = m.efield(dlg+i); - int logic = lf; - if (logic == LF_FASI) - { - const TMultilevel_code_info& fasinfo = ca_multilevel_code_info(LF_FASI); - if (fasinfo.parent() != 0) - { - const TMultilevel_code_info& parinfo = ca_multilevel_code_info(fasinfo.parent()); - if (i < parinfo.levels()) - logic = fasinfo.parent(); - } - } - - const char* fieldname = NULL; - switch(logic) - { - case LF_COMMESSE: fieldname = DOC_CODCMS; break; - case LF_FASI : fieldname = DOC_FASCMS; break; - default : fieldname = DOC_CODCOSTO; break; - } - TFieldref* f = (TFieldref*)fld.field(); - f->set_name(fieldname); - - fld.check_type(required ? CHECK_REQUIRED : CHECK_NORMAL); - - TEdit_field& dfld = m.efield(dlgd+i); - dfld.set_field(EMPTY_STRING); // Toglie campi che fan saltare gli output! - - if (main_mask) - { - TSheet_field& sf = sfield(F_SHEET); - const TFixed_string head = fld.prompt(); - const int colid = FR_CDC1+(fld.dlg()-F_CDC1); - sf.set_column_header(colid, head); - if (fld.size() > head.len()) - sf.set_column_width(colid, fld.size()*8); // XI_FU_MULTIPLE - - TMask& sm = sf.sheet_mask(); - TString80 str; str << *fld.field(); - sm.efield(colid).set_field(str); // Ricopia il campo nella maschera di riga per poterlo salvare! - } - } - - y += h+1; - dlg += h; dlgd += h; - return h; -} - -void TDocumento_mask::insert_anal_page() -{ - if (id2pos(F_CDC1) >= 0) - return; - int newpage = win2page(_sheet->parent()); - if (newpage == 0) - newpage++; - create_page(TR("Analitica"), newpage); // Inserisce una pagina vuota con un titolo a caso - - add_groupbox(DLG_NULL, newpage, "", 1, 0, 78, 6); - add_string(DLG_NULL, newpage, TR("Cod. num. "), 2, 1, 4, "D").set_group(2); - add_string(DLG_NULL, newpage, "", 24, 1, 50, "D").set_group(3); - add_string(DLG_NULL, newpage, TR("Tipo doc. "), 2, 2, 4, "D").set_group(4); - add_string(DLG_NULL, newpage, "", 24, 2, 50, "D").set_group(5); - add_number(DLG_NULL, newpage, TR("Esercizio "), 2, 3, 4, "D").set_group(9); - add_number(DLG_NULL, newpage, TR("Numero doc. "), 24, 3, 6, "D").set_group(6); - add_date(DLG_NULL, newpage, TR("Data "), 46, 3, "D").set_group(7); - add_string(DLG_NULL, newpage, TR("Stato "), 67, 3, 1, "D").set_group(8); - add_number(DLG_NULL, newpage, TR("Cliente "), 2, 4, 6, "D").set_group(10); - add_string(DLG_NULL, newpage, "", 24, 4, 50, "D").set_group(11); - - add_groupbox(DLG_NULL, newpage, TR("Contabilità Analitica"), 1, 6, 78, 14); - - const TMultilevel_code_info& fasinfo = ca_multilevel_code_info(LF_FASI); - const bool use_fsc = fasinfo.levels() > 0; - TConfig& ini = ca_config(); - const bool fsc_req = use_fsc && ini.get_bool("FscRequired"); - - int y = 7; - short dlg = F_CDC1; // id del primo campo da generare - short dlgd = F_DESCDC1; - - const bool ca_in_testa = doc().tipo().head_ca_required(); - for (int i = 0; i < 2; i++) - { - const TString& level = ini.get("Level", NULL, i+1); // Legge il livello 1 o 2 - if (level == "CDC") // Crea centro di costo - { - _cdc_start = dlg; - _cdc_end = dlg + ca_multilevel_code_info(LF_CDC).levels()-1; - if (use_fsc && fasinfo.parent() == LF_CDC) - insert_anal_fields(*this, newpage, LF_FASI, y, dlg, dlgd, fsc_req && ca_in_testa); - else - { - const bool cdc_req = ca_in_testa && ini.get_bool("CdcRequired"); - insert_anal_fields(*this, newpage, LF_CDC, y, dlg, dlgd, cdc_req); - } - } else - if (level == "CMS") // Crea commessa - { - _cms_start = dlg; - _cms_end = dlg + ca_multilevel_code_info(LF_COMMESSE).levels()-1; - if (use_fsc && fasinfo.parent() == LF_COMMESSE) - insert_anal_fields(*this, newpage, LF_FASI, y, dlg, dlgd, fsc_req && ca_in_testa); - else - { - const bool cms_req = false; // ca_in_testa && ini.get_bool("CmsRequired"); // Ora gestisco il REQUIRED da codcms_handler - insert_anal_fields(*this, newpage, LF_COMMESSE, y, dlg, dlgd, cms_req); - } - set_field_handler(_cms_end, codcms_handler); - } - } - - if (use_fsc && fasinfo.parent() <= 0) - insert_anal_fields(*this, newpage, LF_FASI, y, dlg, dlgd, fsc_req && doc().tipo().head_ca_required()); - - //aggiunge campi per date di competenza (inizio e fine) - add_groupbox(DLG_NULL, newpage, TR("Date di competenza"), 1, 20, 78, 3); - const TFixed_string f_datacomp = DOC_DATACOMP; - add_date(F_DATACOMP, newpage, "Inizio ", 2, 21).set_field(f_datacomp); - const TFixed_string f_datafcomp = DOC_DATAFCOMP; - add_date(F_DATAFCOMP, newpage, "Fine ", 25, 21).set_field(f_datafcomp); - set_field_handler(F_DATACOMP, datacomp_handler); //gestore del campo inizio competenza.. - set_field_handler(F_DATAFCOMP, datafcomp_handler); //..e della fine competenza -} - -void TDocumento_mask::configura_sheet(TSheet_field& sheet) -{ - TBit_array to_delete(MAX_COLUMNS); - to_delete.set(); - const TTipo_documento& tdoc = _doc.tipo(); - const TString_array& sheet_columns = tdoc.sheet_columns(); - const int ncols = sheet_columns.items(); - - TToken_string colonne; - int i; - - colonne = "0"; - for (i = 0; i < ncols; i ++ ) - { - TToken_string& sheet_col = (TToken_string&)sheet_columns.row(i); - const int field_id = sheet_col.get_int(0); - const int coltomove = sheet.cid2index(field_id); - to_delete.reset(coltomove); - - const TString80 descr(sheet_col.get(1)); - if (descr.not_empty() ) - sheet.set_column_header( field_id, descr); - - const int size = sheet_col.get_int(2) * 8; // XI_FU_MULTIPLE - if (size != 0) - sheet.set_column_width( field_id, size); - - if (field_id != FR_LORDO) - colonne.add(field_id); - if (field_id == FR_CODIVA && tdoc.is_costo()) - { - const int col = sheet.cid2index(FR_TIPODET); - - to_delete.reset(col); - colonne.add(col); - } - } - - to_delete.set(0L); - to_delete.reset(1); - - FOR_EACH_CONAI_CLASS(ct) - { - const short posc = conai_sottocat_id(ct); - const short posp = conai_peso_id(ct); - const int colc = sheet.cid2index(posc); - const int colp = sheet.cid2index(posp); - - if (conai_configured_class(ct)) - { - to_delete.reset(colc); - if (colonne.find(format("%d", posc)) < 0) - colonne.add(posc); - to_delete.reset(colp); - if (colonne.find(format("%d", posp)) < 0) - colonne.add(posp); - } - else - { - to_delete.set(colc); - int p = colonne.find(format("%d", posc)); - - if (p > 0) - p--; - if (p >= 0) - { - int p1 = p; - while (isdigit(colonne[p1])) - p1++; - if (colonne[p1] == '|') - p1++; - else - if (colonne[p] == '|') - p--; - const TString c(colonne.mid(p1)); - colonne.cut(p); - colonne << c; - } - - to_delete.set(colp); - p = colonne.find(format("%d", posp)); - - if (p > 0) - p--; - if (p >= 0) - { - int p1 = p; - while (isdigit(colonne[p1])) - p1++; - if (colonne[p1] == '|') - p1++; - else - if (colonne[p] == '|') - p--; - const TString c(colonne.mid(p1)); - colonne.cut(p); - colonne << c; - } - } - } - - if (!to_delete[sheet.cid2index(FR_CODDEP)]) - sheet.enable_column(FR_CODDEP, _ges_dep && _ges_mag); - if (!to_delete[sheet.cid2index(FR_CODMAG)]) - sheet.enable_column(FR_CODMAG, _ges_mag); - if (!to_delete[sheet.cid2index(FR_CODDEPC)]) - sheet.enable_column(FR_CODDEPC, _ges_dep && _ges_mag); - if (!to_delete[sheet.cid2index(FR_CODMAGC)]) - sheet.enable_column(FR_CODMAGC, _ges_mag); - to_delete.set(sheet.cid2index(FR_CODARTMAG)); - to_delete.set(sheet.cid2index(FR_CHECKED)); - - if (_ges_ca) - { - const TMultilevel_code_info& cdc = ca_multilevel_code_info(LF_CDC); - const TMultilevel_code_info& cms = ca_multilevel_code_info(LF_COMMESSE); - const TMultilevel_code_info& fas = ca_multilevel_code_info(LF_FASI); - const int levels = cdc.levels() + cms.levels() + fas.levels(); - for (short cid = FR_CDC1; cid <= FR_CDC12; cid++) - { - const int level = cid-FR_CDC1; - to_delete.set(sheet.cid2index(cid), level >= levels); - if (level < levels) - colonne.add(cid); - } - } - - for ( i = MAX_COLUMNS - 1; i >= 0; i-- ) - { - if (to_delete[i]) - { - sheet.enable_column( i + FIRST_FIELD, false); - sheet.delete_column( i + FIRST_FIELD); - } - } - - if (!sheet.user_saved_columns_order()) - sheet.set_columns_order(&colonne); -} - -TCond_vendita& TDocumento_mask::condv() const -{ - if (_condv == NULL) - { - TDocumento_mask* myself = (TDocumento_mask*)this; - myself->_condv = new TCond_vendita(myself, NULL); - } - return *_condv; -} - -void TDocumento_mask::update_progs(bool stop_run) -{ - static bool updating_progs = false; - - if (!updating_progs) - { - updating_progs = true; - TWait_cursor hourglass; - const int page = curr_page(); - const int last_field = fields() - 1; - - for (int f = last_field; f >= 0; f--) - { - const TMask_field & mf = fld(f); - const int id = mf.dlg(); - const int field_page = mf.page(); - - if ((page == field_page || stop_run) && id > BASE_PIEDE) - { - const TFieldref* recfld = mf.field(); - if (recfld != NULL) - { - const TString & name = recfld->name(); - const TString& val = doc().get(name); - set(id, val, true); - } - } - } - updating_progs = false; - } -} - -void TDocumento_mask::next_page(int p) -{ - TMask::next_page(p); - - if (is_calculated_page(curr_page())) - update_progs(); -} - -void TDocumento_mask::start_run() -{ - /* cassato il macchinaro - TSmart_card * s = smartcard(); - - if (s != NULL) - { - if (edit_mode() && s->with_card(*this)) - disable(DLG_SAVEREC); - if (s->card_connected()) - { - disable(F_CODCF); - disable(F_RAGSOC); - s->disable_prot_fields(*this); - if (s->with_card(*this)) - enable(DLG_SAVEREC); - - smartcard_error err = s->read(); - if (err == no_smarterror) - s->card2mask(*this); - else - s->display_error(err); - } - } - */ - TVariable_mask::start_run(); -} - -bool TDocumento_mask::stop_run(KEY key) -{ - if (key != K_ESC && key != K_QUIT) - update_progs(true); -/* Cassato il macchinaro - else - if (key == K_ESC) - { - TSmart_card * s = smartcard(); - - if (s != NULL) - { - if (s->card_connected()) - { - s->disconnect_card(); - enable(F_CODCF); - enable(F_RAGSOC); - } - } - } -*/ - return TVariable_mask::stop_run(key); -} - -bool TDocumento_mask::on_key(KEY key) -{ - if (key == K_SHIFT + K_F12) - { - TRelation r(LF_DOC); - r.curr()=doc(); - bool can_save = !doc().bloccato() && !doc().chiuso(); - if (can_save && ::user_can_write(&r)) - { - TMask_field& stato = field(F_STATO); - stato.enable(); - enable(DLG_SAVEREC); - enable(DLG_DELREC); - xvtil_statbar_set(TR("Modifica")); -/* - TSmart_card * s = smartcard(); - if (s != NULL && s->card_connected()) - s->enable_prot_fields(*this); -*/ - } - else - warning_box("L'utente %s non puo' modificare questo documento", - (const char*)user()); - return TRUE; - } - else - if (key == K_F7) - { - const TSheet_field & sf = sfield(F_SHEET); - TDocumento & d = doc(); - TRiga_documento & riga = d[sf.selected() + 1]; - TOriginal_row_mask sm; - const TRectype * or_row = riga.find_original_rdoc(); - - if (or_row != NULL) - { - sm.set(F_DACODNUM, or_row->get(RDOC_CODNUM)); - sm.set(F_DAANNO, or_row->get(RDOC_ANNO)); - sm.set(F_DAPROVV, or_row->get(RDOC_PROVV)); - sm.set(F_DANDOC, or_row->get(RDOC_NDOC)); - sm.set(F_DANRIGA, or_row->get(RDOC_NRIGA)); - sm.disable(-1); - } - - if (sm.run() == K_ENTER && sm.field(F_DACODNUM).enabled()) - { - TToken_string key(sm.get(F_DACODNUM)); - key.add(sm.get(F_DAANNO)); - key.add(sm.get(F_DAPROVV)); - key.add(sm.get(F_DANDOC)); - key.add(sm.get(F_DANRIGA)); - - const TRectype & or_row_mod = cache().get(LF_RIGHEDOC, key); - if (or_row_mod.empty()) - riga.reset_original_rdoc_key(); - else - riga.set_original_rdoc_key(or_row_mod); - } - return true; - } - - return TVariable_mask::on_key(key); -} - -void TDocumento_mask::occ2mask() -{ - const TOccasionale& o = doc().occas(); - - reset(F_COFI); - reset(F_PAIVA); - set(F_OCFPI, o.get(OCC_CFPI)); - const TString & ragsoc = o.get(OCC_RAGSOC); - set(F_RAGSOC, ragsoc); - set(F_RAGSOCSP, ragsoc); - const TString & indir = o.get(OCC_INDIR); - set(F_INDCF, indir); - set(F_INDSP, indir); - const TString & civ = o.get(OCC_CIV); - set(F_CIVCF, civ); - set(F_CIVSP, civ); - const TString & cap = o.get(OCC_CAP); - set(F_CAPCF, cap); - set(F_CAPSP, cap); - const TString & com = o.get(OCC_COM); - set(F_COMCF, com); - set( F_COMSP, com); - const TString & stato = o.get(OCC_STATO); - set(F_STATOCF, stato); - set( F_STATOSP, stato); - if (id2pos(F_CODINDSP) >= 0) - reset(F_CODINDSP); - // Sugli occasionali non c'è la località - const TString & localita = o.get(OCC_LOCALITA); - set(F_LOCALITACF, localita); - set(F_LOCALITASP, localita); - check_field(F_COMSP); - check_field(F_STATOSP); -} - -// Proposta automatica contratto -void TDocumento_mask::contr2mask() -{ - const TCli_for& c = doc().clifor(); - const TRectype& ven_rec = c.vendite(); - - const bool gescontr = ven_rec.get_bool(CFV_GESTCONTR) && ini_get_bool(CONFIG_DITTA, "ve", "GES", false, 2); - enable(F_CODCONT, gescontr); - enable(F_DESCONT, gescontr); - - if (gescontr && insert_mode()) - { - const TDate datadoc = get(F_DATADOC); - TString str; - str << CONDV_TIPO << "=C " << CONDV_TIPOCF << '=' << c.tipo() << ' ' << CONDV_CODCF << '=' << c.codice(); - TString query; - query << "USE CONDV\nFROM " << str << "\nTO " << str; - TISAM_recordset contr(query); - - str.cut(0); - for (bool ok = contr.move_first(); ok; ok = contr.move_next()) - { - const TDate data_ini = contr.get(CONDV_VALIN).as_date(); - const TDate data_fin = contr.get(CONDV_VALFIN).as_date(); - if (datadoc.between(data_ini, data_fin)) - { - str = contr.get(CONDV_COD).as_string(); - break; - } - } - set(F_CODCONT, str, 0x3); - } -} - -void TDocumento_mask::set_or_def(short id, const TString& val) -{ - TMask_field* fld = find_by_id(id); - if (fld != NULL) - { - if (val.blank()) - { - const TString_array& def = doc().tipo().get_defaults(); - const TString* str = (const TString*)def.objptr(id); - if (str != NULL && str->full()) - fld->set(*str); - else - fld->reset(); - } - else - fld->set(val); - } -} - -void TDocumento_mask::cli2mask(bool force_load) -{ - const TCli_for& c = doc().clifor(); - - const bool onload = !is_running(); - - // Setta i campi che appartengono al file LF_CLIFO - const bool occas = c.occasionale(); - - show(F_OCCASEDIT, occas); - if (!occas) - reset(F_OCFPI); - show(F_OCFPI, occas); - // In forse per l'Occasionale, sicuri per il Normale - show(F_COFI, !occas); - show(F_STATOPAIVA, !occas); - show(F_PAIVA, !occas); - set(F_RAGSOC, c.get(CLI_RAGSOC)); - enable(F_RAGSOC, !occas); - - const TRectype& ven_rec = c.vendite(); - - if (force_load || !onload) - { - short pos = id2pos(F_CODVAL); - const TString4 codval = c.get(CLI_CODVAL); // Attenzione: Non usare TString& qui! - - if (pos >= 0) - set(F_CODVAL, codval, TRUE); - pos = id2pos(F_CODVAL1); - if (pos >= 0) - set(F_CODVAL1, codval, TRUE); - pos = id2pos(F_CODLIN); - if (pos >= 0 && fld(pos).active()) - fld(pos).set(c.get(CLI_CODLIN)); - set(F_CODPAG, c.get(CLI_CODPAG)); - - TToken_string key; - key.add(c.get(CLI_TIPOCF)); - key.add(c.get(CLI_CODCF)); - key.add("V"); - key.add("1"); - - const TRectype& cfban = cache().get(LF_CFBAN, key); - TString80 iban; - - if (cfban.empty() || id2pos(F_CODABIA1) < 0) - { - hide(-GR_APPOGGIOCLI); - show(-GR_APPOGGIO); - if (cfban.empty()) - { - set(F_CODABIA, c.get(CLI_CODABI)); - set(F_CODCABA, c.get(CLI_CODCAB), 0x2); - iban = c.get(CLI_IBAN); - } - else - { - set(F_CODABIA, cfban.get(CFBAN_ABI)); - set(F_CODCABA, cfban.get(CFBAN_CAB), 0x2); - iban = cfban.get(CFBAN_IBAN); - } - } - else - { - hide(-GR_APPOGGIO); - show(-GR_APPOGGIOCLI); - set(F_CODABIA1, cfban.get(CFBAN_ABI)); - set(F_CODCABA1, cfban.get(CFBAN_CAB), 0x2); - iban = cfban.get(CFBAN_IBAN); - } - if (id2pos(F_IBAN_STATO) > 0) - { - set(F_IBAN, iban); - if (iban.full()) - { - efield(F_IBAN_STATO).validate(K_TAB); - set(F_IBAN_STATO, iban.left(2)); - set(F_IBAN_CHECK, iban.mid(2,2)); - set(F_BBAN , iban.mid(4)); - set(F_BBAN_CIN , iban.mid(4,1)); - set(F_BBAN_ABI , iban.mid(5,5)); - set(F_BBAN_CAB , iban.mid(10,5)); - set(F_BBAN_CONTO, iban.mid(15,12)); - } - else - { - reset(F_IBAN_STATO); - reset(F_IBAN_CHECK); - reset(F_BBAN ); - reset(F_BBAN_CIN ); - reset(F_BBAN_ABI ); - reset(F_BBAN_CAB ); - reset(F_BBAN_CONTO); - } - } - - key.cut(0); - key.add(c.get(CLI_TIPOCF)); - key.add(c.get(CLI_CODCF)); - key.add("N"); - key.add("1"); - - const TRectype & cfbanpr = cache().get(LF_CFBAN, key); - - // Setta i campi che appartengono al file LF_CFVEN - if (cfbanpr.empty() || id2pos(F_CODABIP1) < 0) - { - hide(-GR_PRESENTCLI); - show(-GR_PRESENT); - if (cfbanpr.empty() || id2pos(F_CODABIP1) < 0) - { - set(F_CODABIP, ven_rec.get(CFV_CODABIPR), 0x3); - set(F_CODCABP, ven_rec.get(CFV_CODCABPR), 0x3); - } - else - { - set(F_CODABIP, cfbanpr.get(CFBAN_ABI), 0x3); - set(F_CODCABP, cfbanpr.get(CFBAN_CAB), 0x3); - set(F_PROGBNP, cfbanpr.get(CFBAN_PROGPR), 0x3); - } - } - else - { - hide(-GR_PRESENT); - show(-GR_PRESENTCLI); - set(F_CODABIP1, cfbanpr.get(CFBAN_ABI)); - set(F_CODCABP1, cfbanpr.get(CFBAN_CAB), 0x2); - set(F_PROGBNP1, cfbanpr.get(CFBAN_PROGPR)); - } - - set_or_def(F_RAGGR, ven_rec.get(CFV_RAGGDOC)); - set_or_def(F_RAGGREFF, ven_rec.get(CFV_RAGGEFF)); - set_or_def(F_CODINDSP, ven_rec.get(CFV_CODINDSP)); - set_or_def(F_CODAG, ven_rec.get(CFV_CODAG)); - set_or_def(F_CODAGVIS, ven_rec.get(CFV_CODAG1)); - set_or_def(F_CODSPMEZZO, ven_rec.get(CFV_CODSPMEZZO)); - set_or_def(F_CODPORTO, ven_rec.get(CFV_CODPORTO)); - set_or_def(F_CODNOTESP1, ven_rec.get(CFV_CODNOTESP1)); - set_or_def(F_CODNOTESP2, ven_rec.get(CFV_CODNOTESP2)); - set_or_def(F_CODNOTE, ven_rec.get(CFV_CODNOTE)); - set_or_def(F_CODVETT1, ven_rec.get(CFV_CODVETT1)); - set_or_def(F_CODVETT2, ven_rec.get(CFV_CODVETT2)); - set_or_def(F_CODVETT3, ven_rec.get(CFV_CODVETT3)); - set_or_def(F_SPESEINC, ven_rec.get(CFV_PERCSPINC)); - set_or_def(F_ADDBOLLI, ven_rec.get(CFV_ADDBOLLI)); - set_or_def(F_CATVEN, ven_rec.get(CFV_CATVEN)); - - const int alleg = c.get_int(CLI_ALLEG); - const bool ivadiff = (alleg == 7) && ven_rec.get_bool(CFV_FATTSOSP); - set(F_LIQDIFF, ivadiff ? "X" : ""); - - const TDate datadoc = doc().get(DOC_DATADOC); - const bool IVAxCassa = !ivadiff && (alleg < 5 || alleg == 7) && gestione_IVAxCassa(datadoc); - set(F_IVAXCASSA, IVAxCassa ? "X" : ""); - - pos = id2pos(F_CODLIST); - - const TString8 codlist = ven_rec.get(CFV_CODLIST); //ATTENZIONE: su file il CODLIST è 5 caratteri - if (pos >= 0 && fld(pos).active()) - { - TEdit_field & f = (TEdit_field&) fld(pos); - - f.set(codlist); - f.check(); - f.on_hit(); - } - set(F_CODZON, ven_rec.get(CFV_CODZONA), 0x3); - set(F_RAGGR, ven_rec.get(CFV_RAGGDOC)); - sconto_testa2mask(); - spese2mask(); - } - else - if (onload) - { - TToken_string key; - - key.add(c.get(CLI_TIPOCF)); - key.add(c.get(CLI_CODCF)); - key.add("V"); - key.add("1"); - - const TRectype & cfban = cache().get(LF_CFBAN, key); - - if (cfban.empty() || id2pos(F_CODABIA1) < 0) - { - show(-GR_APPOGGIO); - hide(-GR_APPOGGIOCLI); - } - else - { - show(-GR_APPOGGIOCLI); - hide(-GR_APPOGGIO); - } - key.cut(0); - key.add(c.get(CLI_TIPOCF)); - key.add(c.get(CLI_CODCF)); - key.add("N"); - key.add("1"); - - const TRectype & cfbanpr = cache().get(LF_CFBAN, key); - - if (cfbanpr.empty() || id2pos(F_CODABIP1) < 0) - { - show(-GR_PRESENT); - hide(-GR_PRESENTCLI); - } - else - { - show(-GR_PRESENTCLI); - hide(-GR_PRESENT); - } - } - enable( F_CODINDSP , !occas); - if (occas) - occ2mask(); - else - { - set(F_COFI, c.get(CLI_COFI)); - set(F_INDCF, c.get(CLI_INDCF)); - set(F_CIVCF, c.get(CLI_CIVCF)); - set(F_STATOPAIVA, c.get(CLI_STATOPAIV)); - set(F_PAIVA, c.get(CLI_PAIV)); - set(F_LOCALITACF, c.get(CLI_LOCCF)); - set(F_CAPCF, c.get(CLI_CAPCF)); - set(F_COMCF, c.get(CLI_COMCF)); - set(F_STATOCF, c.get(CLI_STATOCF)); - check_field( F_CODINDSP ); - } - const TString4 newcodval = get(F_CODVAL); - - short pos = id2pos(F_CAMBIO); - if ((pos >= 0) && newcodval.empty()) - fld(pos).reset(); - pos = id2pos(F_CODVAL); - if (pos >= 0 && fld(pos).active()) - fld(pos).check(STARTING_CHECK); - pos = id2pos(F_CODVAL1); - if (pos >= 0 && fld(pos).active()) - fld(pos).check(STARTING_CHECK); - check_field(F_COMCF); - check_field(F_STATOCF); - check_field( F_CODPAG ); - pos = id2pos(F_CODLIN); - if (pos >= 0 && fld(pos).active()) - fld(pos).check(); - pos = id2pos(F_CODLIST); - if (pos >= 0 && fld(pos).active()) - fld(pos).check(); - pos = id2pos(F_CODAG); - if (pos >= 0 && fld(pos).active()) - fld(pos).check(); - pos = id2pos(F_CODAGVIS); - if (pos >= 0 && fld(pos).active()) - fld(pos).check(); - - check_field( F_CODSPMEZZO ); - check_field( F_CODPORTO ); - check_field( F_CODNOTESP1 ); - check_field( F_CODNOTESP2 ); - check_field( F_CODNOTE ); - check_field( F_CODVETT1 ); - check_field( F_CODVETT2 ); - check_field( F_CODVETT3 ); - check_field( F_CATVEN ); - check_field( F_CODZON ); - - contr2mask(); - - if (gestione_note_per_articolo()) - send_key(K_F8, F_NAR, &field(F_CODCF)); - - // Accendi bottone mail se possibile - const TString& email = c.get(CLI_DOCMAIL); - enable(DLG_EMAIL, email.full()); -} - -void TDocumento_mask::sconto_testa2mask() -{ - const TCli_for& c = doc().clifor(); - - TConfig ditta(CONFIG_DITTA, "ve"); - const char tipogestione = ditta.get("GESSCO")[ 0 ]; - switch( tipogestione ) - { - case 'N': // Sconti non gestiti: pussa via! - break; - case 'P': // Percentuale su anagrafica cliente - set( F_SCONTOPERC, c.vendite().get(CFV_SCONTO)); - break; - case 'T': // Gestione tabella sconti - { - const TString16 codsconto(c.vendite().get(CFV_CODSCC)); - - if (codsconto.not_empty()) - { - TTable sconti("%SCC"); - sconti.setkey(1); - sconti.zero(); - sconti.put("CODTAB", codsconto); - if (sconti.read( ) == NOERR) - set(F_SCONTOPERC, sconti.get("S1")); - } - } - break; - case 'A': // Gestione archivio sconti - { - TString16 cod; - const TRectype & ven_rec = c.vendite(); - TLocalisamfile sconti(LF_SCONTI ); - - sconti.setkey(1); - sconti.zero(); - sconti.put("TIPO", "I"); - - if(ditta.get_bool("SCOKEY", "ve", 1)) - sconti.put("CODCAT", ven_rec.get(CFV_CATVEN)); - if(ditta.get_bool("SCOKEY", "ve", 2)) - cod.format("%-2s", (const char *)ven_rec.get(CFV_CODSCC)); - else - cod = " "; - if( ditta.get_bool("SCOKEY", "ve", 3)) - { - TString8 cz; cz.format("%-2s", (const char*)ven_rec.get(CFV_CODZONA)); - cod << cz; - } - else - cod << " "; - if( ditta.get_bool("SCOKEY", "ve", 4)) - cod << c.get(CLI_CODPAG); - sconti.put("CODART", cod); - if(sconti.read() == NOERR) - set(F_SCONTOPERC, sconti.get( "SCONTO")); - } - break; - default: - break; - } - return; -} - -void TDocumento_mask::spese2mask() -{ - TSheet_field & sh = (TSheet_field &) field(F_SHEET); - TCli_for & c = doc().clifor(); - - TString16 name("CODSP0"); - TString_array spese; - const TRectype & ven_rec = c.vendite(); - for (int i = 1; i <= 4; i++) - { - name.rtrim(1); name << i; - const TString16 s(ven_rec.get(name)); - - if (s.not_empty()) - spese.add(s); - } - - doc().put(DOC_SPESEUPD, false); - doc().put(DOC_CODVAL, get(F_CODVAL)); - doc().put(DOC_CAMBIO, get(F_CAMBIO)); -// doc().put(DOC_CONTROEURO, get(F_CONTROEURO)); - - doc().update_spese_aut(spese, false, &sh); - sh.force_update(); -} - -void TDocumento_mask::reset_masks(const TString& tipo_doc) -{ - static TString4 last_tipo_doc; - - if (tipo_doc != last_tipo_doc) - { - FOR_EACH_ASSOC_OBJECT(_maskriga, h, k, o) - { - TMask* m = (TMask*)o; - m->enable_default(); - if (!_sheet->exist_column(FR_PREZZO)) - m->hide(FR_PREZZO); - } - last_tipo_doc = tipo_doc; - } -} - -void TDocumento_mask::doc2mask(bool reload_clifo, bool force_load, bool update) -{ - for (int p = fields()-1; p >= 0; p--) - { - TMask_field& f = fld(p); - const TFieldref* fr = f.field(); - if (fr) - { - f.set(fr->read(doc())); - if (f.ghost() && !f.active()) - f.on_hit(); // Forza il MESSAGE COPY dei campi di testata come DOC_STATO - } -// else -// f.reset(); // Perché non lascio stare questi campi? - } - if (reload_clifo) - cli2mask(force_load); - else - { - if (force_load) - { - check_field(F_CODCF); - check_field(F_CODINDSP); - } -/* - if (id2pos(F_IBAN_STATO) > 0) - { - const TString80 iban = doc().get(DOC_IBAN); - set(F_IBAN, iban); - efield(F_IBAN_STATO).validate(K_TAB); - if (iban.not_empty()) - { - set(F_IBAN_STATO, iban.left(2)); - set(F_IBAN_CHECK, iban.mid(2,2)); - set(F_BBAN , iban.mid(4)); - set(F_BBAN_CIN , iban.mid(4,1)); - set(F_BBAN_ABI , iban.mid(5,5)); - set(F_BBAN_CAB , iban.mid(10,5)); - set(F_BBAN_CONTO, iban.mid(15,12)); - } - } -*/ - } - - if (id2pos(F_IBAN_STATO) > 0) - { - const TString80 iban = doc().get(DOC_IBAN); - set(F_IBAN, iban); - if (iban.full()) - { - set(F_IBAN_STATO, iban.left(2)); - set(F_IBAN_CHECK, iban.mid(2,2)); - set(F_BBAN , iban.mid(4)); - set(F_BBAN_CIN , iban.mid(4,1)); - set(F_BBAN_ABI , iban.mid(5,5)); - set(F_BBAN_CAB , iban.mid(10,5)); - set(F_BBAN_CONTO, iban.mid(15,12)); - efield(F_IBAN_STATO).validate(K_TAB); - } - else - { - reset(F_IBAN_STATO); - reset(F_IBAN_CHECK); - reset(F_BBAN ); - reset(F_BBAN_CIN ); - reset(F_BBAN_ABI ); - reset(F_BBAN_CAB ); - reset(F_BBAN_CONTO); - } - } - - - TSheet_field& s = sfield(F_SHEET); - s.destroy(); - const int righe = doc().physical_rows(); - for (int i = 0; i < righe; i++) - { - TRiga_documento & r = doc()[i + 1]; - - doc()[i+1].autoload(s); - s.check_row(i, 0x3); - if (r.tipo().tipo() == RIGA_PRESTAZIONI) - { - const TSpesa_prest & spesa = r.spesa(); - if (spesa.tipo() == 'V') - s.disable_cell(i, s.cid2index(FR_QTA)); - } - } - - reset_masks(get(F_TIPODOC)); - //aggiorna i colori delle righe e forza l'update dello sheet - if (update) - highlight(); -} - -void TDocumento_mask::mask2doc() -{ - for (int p = fields()-1; p >= 0; p--) - { - const TMask_field& f = fld(p); - const TFieldref* fr = f.field(); - if (fr) - fr->write(f.get(), doc()); - } -} - -bool TDocumento_mask::new_mask(int numriga) const -{ - const TRiga_documento& riga = doc()[numriga + 1]; - const TTipo_riga_documento& tiporiga = riga.tipo(); - TString16 name; tiporiga.mask_name(name); - - return _maskriga.objptr(name) == NULL; -} - -TVariable_mask* TDocumento_mask::riga_mask(int numriga) -{ - const TRiga_documento& riga = doc()[numriga + 1]; - const TTipo_riga_documento& tiporiga = riga.tipo(); - TString16 name; tiporiga.mask_name(name); - - TVariable_mask* m = (TVariable_mask*)_maskriga.objptr(name); - if (m == NULL) - { - m = new TVariable_mask(name); - m->set_handler(FR_TIPORIGA, tipo_riga_handler); - m->set_handler( FR_QTA, qta_handler ); - m->set_handler( FR_UMQTA, um_handler ); - m->set_handler( FR_DATACONS, dcons_handler); - - _maskriga.add(name, m); - - TList_field & htr = lfield(F_LBTIPORIGA); - const TString codes(htr.get_codes()); - const TString values(htr.get_values()); - - m->lfield(FR_TIPORIGA).replace_items(codes, values); - - int pos = m->id2pos(FR_CODART); - if (pos >= 0) - { - const TMask_field & f = m->fld(pos); - if (f.is_edit()) - { - TBrowse * browse = ((TEdit_field &) f).browse(); - const char tipo_r = tiporiga.tipo(); - - if (browse ) - { - const TCursor* cur = browse->cursor(); - if (cur) - { - const int num = cur->file().num(); - if (num == LF_ANAMAG || num == LF_CODCORR) - { - m->set_handler( FR_CODMAG, codmag_handler ); - m->set_handler( FR_CODMAGC, codmag_coll_handler ); - m->set_handler( FR_CODART, codart_handler ); - m->set_handler( FR_LIV1, liv_handler ); - m->set_handler( FR_LIV2, liv_handler ); - m->set_handler( FR_LIV3, liv_handler ); - m->set_handler( FR_LIV4, liv_handler ); - m->set_handler( FR_UMQTA, umart_handler ); - m->set_handler( FR_CODARTMAG, codartmag_handler ); - m->set_handler( FR_DESCR, descr_handler ); - m->set_handler( FR_QTA, qtaart_handler ); - if (livelli().autoinsert(1)) - m->field(FR_LIV1).check_type(CHECK_NONE); - if (livelli().autoinsert(2)) - m->field(FR_LIV2).check_type(CHECK_NONE); - if (livelli().autoinsert(3)) - m->field(FR_LIV3).check_type(CHECK_NONE); - if (livelli().autoinsert(4)) - m->field(FR_LIV4).check_type(CHECK_NONE); - } - else - if (tipo_r == RIGA_SPESEDOC || tipo_r == RIGA_PRESTAZIONI || - tipo_r == RIGA_RISORSE || tipo_r == RIGA_ATTREZZATURE) - m->set_handler( FR_CODART, sppr_handler ); - } - } - } - } - m->set_handler(FR_QTAEVASA, qta_evasa_handler); - m->set_handler(FR_CAUS, causmag_handler); - - if (m->id2pos(FR_CODIVA) >= 0) - { - m->set_handler(FR_CODIVA, iva_handler); - const TString& tipiva = doc().tipo().tipi_iva_validi(); - if (tipiva.not_empty()) - { - TBrowse& browse = *(m->efield(FR_CODIVA)).browse(); - TString filter = browse.get_filter(); - - bool close_filter = FALSE; - if (filter.not_empty()) - { - filter.insert("("); - filter << ")&&("; - close_filter = TRUE; - } - bool firstor = TRUE; - for (int i = tipiva.len()-1; i >= 0; i--) if (tipiva[i] != ' ') - { - if (firstor) - firstor = FALSE; - else - filter << "||"; - filter << "(S1==\""; - switch(i) - { - case 1: filter << "VE"; break; - case 2: filter << "ES"; break; - case 3: filter << "NI"; break; - case 4: filter << "NS"; break; - default: break; - } - filter << "\")"; - } - if (close_filter) filter << ')'; - browse.set_filter(filter); - } - } - m->set_handler(DLG_USER, link_handler); - - // Quasi qualsiasi cosa analitica va bene - const bool ca_active = _ges_ca && !(riga.is_descrizione() || riga.is_sconto() /*|| riga.is_omaggio()*/); - if (ca_active) - { - const int page = m->win2page(m->fld(m->fields()-1).parent()); // Calcolo bastardo dell'ultima pagina - - TConfig& ini = ca_config(); - const TMultilevel_code_info& fasinfo = ca_multilevel_code_info(LF_FASI); - const bool use_fsc = fasinfo.levels() > 0; - - int y = 1; - int i; - short dlg = FR_CDC1; // id del primo campo da generare - short dlgd = FR_DESCDC1; - - _cdc_start_sh = _cdc_end_sh = -1 ; - _cms_start_sh = _cms_end_sh = -1 ; - for (i = 0; i < 2; i++) - { - const TString& level = ini.get("Level", NULL, i+1); // Legge il livello 1 o 2 - if (level == "CDC") // Crea centro di costo - { - if (_cdc_start_sh < 0) - { - _cdc_start_sh = dlg; - _cdc_end_sh = dlg + ca_multilevel_code_info(LF_CDC).levels()-1; - } - if (use_fsc && fasinfo.parent() == LF_CDC) - insert_anal_fields(*m, page, LF_FASI, y, dlg, dlgd, false); - else - insert_anal_fields(*m, page, LF_CDC, y, dlg, dlgd, false); - m->set_handler( _cdc_end_sh, cdc_mag_handler); - - } else - if (level == "CMS") // Crea commessa - { - if (_cms_start_sh < 0) - { - _cms_start_sh = dlg; - _cms_end_sh = dlg + ca_multilevel_code_info(LF_COMMESSE).levels()-1; - } - if (use_fsc && fasinfo.parent() == LF_COMMESSE) - insert_anal_fields(*m, page, LF_FASI, y, dlg, dlgd, false); - else - { - insert_anal_fields(*m, page, LF_COMMESSE, y, dlg, dlgd, false); - } - m->set_handler(_cms_end_sh, cms_mag_handler); - } - } - if (use_fsc && fasinfo.parent() <= 0) - insert_anal_fields(*m, page, LF_FASI, y, dlg, dlgd, false); - } - - TFilename proname; tiporiga.profile_name(proname); - TConfig pro( proname, "HANDLERS" ); - TAssoc_array& handlers = pro.list_variables(); - FOR_EACH_ASSOC_STRING(handlers, obj, key, str) - { - int id = 0, hd = 0; - if (*key == 'H' && strchr(str, '|') == NULL) // Provo a gestire il caso Handler(105) = 3 - { - const TFixed_string k(key); - id = atoi(k.after('(')); - hd = atoi(str); - } - else // Provo a gestire il caso 1 = 105|3 - { - const TToken_string riga = str; - riga.get(0, id); - riga.get(1, hd); - } - if (id >= DLG_USER && hd > 0) - user_set_row_handler(*m, id, hd); - } - - if (m->id2pos(FR_PREZZO) >= 0) - { - TEditable_field& f = (TEditable_field&)m->efield(FR_PREZZO); - f.reset_driver(F_CODVAL); - f.add_driver(-F_CODVAL); - } - - if (m->id2pos(FR_IMPFISSO) >= 0) - { - TEditable_field& f = m->efield(FR_IMPFISSO); - f.reset_driver(); // Perche' qui non c'e' scritto f.reset_driver(F_CODVAL) ? - f.add_driver(-F_CODVAL); - } - - FOR_EACH_CONAI_CLASS(type) - { - const short posc = conai_sottocat_id(type); - const short posp = conai_peso_id(type); - if (conai_configured_class(type)) - { - m->show(posc); - m->set_handler(posc, sottocat_conai_handler); - m->show(posp); - m->set_handler(posp, peso_conai_handler); - } - else - { - m->hide(posc); - m->hide(posp); - } - } - - // Impostiamo gli eventuali drivers - FOR_EACH_MASK_FIELD((*m), i, f) if (f->is_edit()) - ((TEdit_field*)f)->test_drivers(); - } - m->set_sheet(&sfield(F_SHEET)); - return m; -} - -void TDocumento_mask::update_giacenza() -{ - if (id2pos(F_CURGIAC)<0 || !is_running()) - return; - - TSheet_field& sf = sfield(F_SHEET); - TToken_string& row = sf.row(sf.selected()); - TString80 codart = row.get(sf.cid2index(FR_CODARTMAG)); - if (codart.blank()) - { - reset(F_CURGIAC); - reset(F_CURDISP); - return; - } - - TString16 livello; - const int db_liv = doc().tipo().dbliv(); - - for (int i = 0; i < 4; i++) - { - const char* liv = row.get(sf.cid2index(FR_LIV1+i)); - - if (*liv > ' ') - livello << liv; - else - break; - } - - TString8 causmag = row.get(sf.cid2index(FR_CAUS)); - if (causmag.blank()) - causmag = get(F_CAUSMAG); - - if (causmag.full()) - { - const TCausale_magazzino& c = cached_causale_magazzino(causmag); - - _fconv_qta = UNO; - if (c.scarica_alternativi()) - { - const TString& alt = cached_article(codart).get(ANAMAG_CODARTALT); - if (alt.full()) - codart = alt; - } - if (db_liv > 0) - { - const int expl_row = doc().tipo().dbrow()-1; // Sul file .ini l'indice parte da 1! - if (expl_row >= 0) // Evito esplosioni inutili in primis - { - TDistinta_tree db; - TArray components; - db.set_root(codart, "", 1, livello); - - const int items = db.explode(components, false, RAGGR_EXP_NONE, db_liv); - if (items > 0 && expl_row < items) // Controllo se la riga esplosione desiderata e' valida - { - const TRiga_esplosione& r = (const TRiga_esplosione &)components[expl_row]; - codart = r.articolo(); // Cambio il codice articola da elaborare - _fconv_qta = r.val(); - } - } - } - } - - real giac, disp; - TString8 codmag = row.get(sf.cid2index(FR_CODMAG)); - - if (codmag.full()) - { - const TString4 coddep = row.get(sf.cid2index(FR_CODDEP)); - if (coddep.full()) - codmag << coddep; - } - else - { // Cerca di determinare il magazzino di default, se manca sulla riga - if (causmag.full()) - { - const TCausale_magazzino& c = cached_causale_magazzino(causmag); - if (c.has_default_mag()) - { - codmag = c.default_mag(); - if (c.has_default_dep()) - codmag << c.default_dep(); - } - } - } - - TString4 annoes = get(F_ANNO); - const TDate datadoc = get(F_DATADOC); - if (datadoc.ok()) - { - TEsercizi_contabili esc; - annoes.format("%04d", esc.date2esc(datadoc)); - } - - TArticolo_giacenza& art = cached_article_balances(codart); - - giac = art.disponibilita(annoes, codmag, livello, TRUE); - disp = art.disponibilita(annoes, codmag, livello, FALSE); - - if (db_liv == 0) - { - const TString4 um = row.get(sf.cid2index(FR_UMQTA)); - art.convert_to_um(giac, um); - art.convert_to_um(disp, um); - } - set(F_CURGIAC, giac.string()); - set(F_CURDISP, disp.string()); -} - -/////////////////////////////////////////////////////////// -// Handlers and notifiers -/////////////////////////////////////////////////////////// - -bool TDocumento_mask::ss_handler(TMask_field& f, KEY key) -{ - bool ok = true; - if (key == K_ENTER && !f.empty()) - { - const TSheet_field& ss = (TSheet_field&)f; - TDocumento_mask& mask = (TDocumento_mask&)ss.mask(); - - const short cme = mask.cms_end(); - // Se la commessa in testata è vuota controllo che sia presente sulle righe - if (cme > 0 && mask.efield(cme).empty()) - { - // Controllo se la commessa è veramente obbligatoria in base alla configurazione - TConfig& ini = ca_config(); - if ((ini.get_int("Authorizations") & 0x6) && (ini.get_bool("CmsRequired") || ini.get("FathFasi").full())) - { - const short cmes = mask.cms_end_sh(); - if (cmes > 0) // Puo' succedere che sia < 0 in assenza di righe buone - { - const int col = ss.cid2index(cmes); - FOR_EACH_SHEET_ROW(ss, r, riga) - { - if (ss.cell_enabled(r, col)) - { - const char* cms = riga->get(col); - if (!(cms && *cms > ' ')) - { - ss.error_box(FR("La commessa è obbligatoria alla riga %d"), r+1); - break; - } - } - } - } - } - } - if (ini_get_bool(CONFIG_DITTA, "ve", "LIVPERART")) - { - const TString& causmag = mask.get(F_CAUSMAG); - const TCausale_magazzino& c = cached_causale_magazzino(causmag); - if (c.sgn(s_giac) != 0) // Controlla il livello solo per movimenti della giacenza - { - TCodice_articolo codart, livgiac; - FOR_EACH_SHEET_ROW(ss, r, riga) - { - codart = riga->get(ss.cid2index(FR_CODART)); - livgiac = riga->get(ss.cid2index(FR_LIV1)); - if (codart.full() && livgiac.blank()) - { - const TArticolo& art = ::cached_article(codart); - if (art.get_bool(ANAMAG_LIVPERART)) - { - ok = ss.error_box("Il livello di giacenza è obbligatorio per l'articolo %s alla riga %d", - (const char*)codart, r+1); - break; - } - } - } - } - } - } - return ok; -} - -bool TDocumento_mask::ss_notify( TSheet_field& ss, int r, KEY key ) -{ - static bool selecting = false; - - TDocumento_mask& m = (TDocumento_mask&)ss.mask(); - TDocumento& doc = m.doc(); - - switch (key) - { - case K_ENTER: // modifica - { - TRiga_documento& riga = doc[r + 1]; - riga.autosave(ss); - - if (m.is_calculated_page(m.curr_page())) - m.update_progs(); - m.highlight_row(r); - if (doc.tipo().check_double_art()) - { - const int rows = doc.physical_rows(); - const TCodice_articolo codart = riga.get(RDOC_CODART); - for (int i = 1; i <= rows; i++) - if (i != r + 1 && codart == doc[i].get(RDOC_CODART)) - if (!yesno_box(FR("L'articolo %s è presente alla riga %d, si desidera continuare?"), (const char*)codart, i)) - return false; - } - } - break; - case K_CTRL + K_ENTER: // inizio modifica - { - const TRiga_documento& riga = doc[r + 1]; - m.codcms_sh() = riga.get(RDOC_CODCMS); - } - case K_DEL: // Cancellazione - { - doc.destroy_row(r + 1, TRUE); - if (r < doc.rows()) - { - TRiga_documento& riga = doc[r + 1]; - if (riga.is_omaggio() && riga.is_generata()) - { - ss.destroy(r + 1); - doc.destroy_row(r + 1, true); - } - } - doc.dirty_fields(); - if (m.is_calculated_page(ss.page())) - m.update_progs(); - } - break; - case K_INS: // Inserimento - { - if (r < doc.rows()) - { - TRiga_documento & riga = doc[r + 1]; - if (riga.is_omaggio() && riga.is_generata()) - { - const bool enabled = ss.cell_enabled(r, 0); - - if (!enabled) ss.enable_row(r); - ss.force_update(r); - ss.select(r); - m.send_key(K_CTRL + '+', 0); - if (!enabled) ss.disable_row(r); - ss.force_update(r); - return false; - } - } - doc.insert_row(r + 1, m.get( F_LBTIPORIGA )); - } - break; - case K_CTRL + K_INS: - { - TRiga_documento& riga = doc[r + 1]; - TRectype& ven_rec = doc.clifor().vendite(); - TString8 s = ven_rec.get(CFV_CODMAG); - const TTipo_riga_documento & t = riga.tipo(); - - if (s.full()) - { - s.left_just(3); - s << ven_rec.get(CFV_CODDEP); - } - else - { - s = m.get(F_CAUSMAG); - if (s.full()) - { - const TCausale_magazzino& c = cached_causale_magazzino(s); - if (!c.empty() && c.get_char("S10") > ' ') // Ignora magazzini non validi - s = c.get("S10"); - else - { - s = m._std_mag; - s.left_just(3); - s << m._std_dep; - } - } - } - if (s.full()) - riga.put(RDOC_CODMAG, s); - - riga.autoload(ss); - ss.check_row(r); - t.set_defaults(ss, r + 1); - m.highlight_row(r); - } - break; - case K_TAB: // ingresso nella riga - if (!selecting && m.is_running()) - { - const TRiga_documento& rdoc = doc[r + 1]; - TMask& riga_mask = ss.sheet_mask(); - - if (r < doc.physical_rows()) - { - m.update_giacenza(); - const TRectype& rdoc = doc[r + 1]; - set_curr_um(rdoc.get(RDOC_UMQTA)); - const bool on = rdoc.get(RDOC_DACODNUM).full(); - riga_mask.enable(DLG_USER, on); - } - const bool merce = TRiga_documento::tipo(riga_mask.get(FR_TIPORIGA)).is_merce(); - const bool artmag = merce && riga_mask.get(FR_CODARTMAG).full(); - - riga_mask.show(FR_UMQTA, artmag); - riga_mask.show(FR_UMQTA2, !artmag); - - if (rdoc.get(RDOC_CODART).empty() && rdoc.get(RDOC_DESCR).empty()) - { - selecting = true; // semaforo per impedire l'evento di selezione doppio - ss.select(r, 1, false); - selecting = false; - } - - if (m.gestione_note_per_articolo()) - m.send_key(K_F8, F_NAR, &ss); - } - break; - case K_CTRL + K_TAB: // uscita dalla riga - { - TToken_string& row = ss.row(r); - const TCodice_articolo codart = row.get(ss.cid2index(FR_CODART)); - bool check_art = codart.full(); - if (check_art) - { - const TArticolo& rec = cached_article(codart); - check_art = rec.get_bool(ANAMAG_LIVPERART) && ini_get_bool(CONFIG_DITTA, "ve", "LIVPERART"); - } - - if (check_art) - { - TCodice_articolo livello; - for (int l = 0; l<4 ; l++) - doc.livelli().pack_grpcode(livello, row.get(ss.cid2index(FR_LIV1+l)), l+1); - - if (livello.full()) - { - TLocalisamfile fl(LF_MULTIREL); - TRectype& r = fl.curr(); - - r.put(MULTI_COD, "ARTLV"); - r.put(MULTI_FIRST, codart); - r.put(MULTI_SECOND, livello); - - TRectype new_rec(r); - if (fl.read() != NOERR) - { - bool ok = yesno_box("Il codice di giacenza %s non è legato all'articolo %s.\nSi desidera legarlo?", - (const char*)livello, (const char*)codart); - if (ok) - { - r = new_rec; - const int err = new_rec.write(fl); - if (err != NOERR) - ok = error_box("Impossibile legare il codice di giacenza. Errore %d", err); - } - return ok; - } - } - else - { - // Controlla obbligatorietà del livello solo per movimenti della giacenza - TString8 codcaus = row.get(ss.cid2index(FR_CAUS)); - if (codcaus.blank()) - codcaus = m.get(F_CAUSMAG); - if (codcaus.full()) - { - const TCausale_magazzino& caus = ::cached_causale_magazzino(codcaus); - if (caus.sgn(s_giac) != 0) - return error_box(FR("Il codice giacenza è obbligatorio per l'articolo %s"), - (const char*)codart); - } - } - } - } - break; - default: - break; - } - return true; -} - -// Funzione che dato il profilo di riga ottiene la maschera -// Serve per ottenere una maschera diversa per ogni riga -TMask* TDocumento_mask::ss_getmask(int numriga, TMask& fullmask) -{ - TSheet_field* sf = fullmask.get_sheet(); - TDocumento_mask& m = (TDocumento_mask&)sf->mask(); - const TDocumento& doc = m.doc(); - - if (numriga < doc.physical_rows()) - return m.riga_mask(numriga); - return &fullmask; -} - -bool TDocumento_mask::occas_code_handler(TMask_field& f, KEY key) -{ - TMask& m = f.mask(); - if (key == K_TAB && (f.dirty() || !m.is_running())) - { - const TString& code = f.get(); - if (code.full()) - { - TRelation occas(LF_OCCAS); - occas.curr().put(OCC_CFPI, code); - if (occas.read(_isequal) == NOERR) - { - m.autoload(occas); - m.send_key(K_TAB, O_COMUNE); // Forza decodifica comuni - m.send_key(K_TAB, O_COMUNENAS); - } - } - } - return true; -} - -bool TDocumento_mask::occas_cfpi_handler(TMask_field& f, KEY key) -{ - if (key == K_ENTER) - { - const TMask& om = f.mask(); - if (om.field(O_COFI).empty() && om.field(O_PAIV).empty()) - return f.error_box(TR("E' necessario specificare il codice fiscale o la partita IVA")); - } - return true; -} - -bool TDocumento_mask::occas_handler( TMask_field& f, KEY key ) -{ - TDocumento_mask & m = (TDocumento_mask &)f.mask(); - if ( key == K_SPACE && m.is_running( ) ) - { - TDocumento& doc = m.doc(); - TOccasionale& occ = doc.occas(); - - TMask occas_mask("ve0100o"); - occas_mask.set_handler(O_CODICE, occas_code_handler ); - occas_mask.set_handler(O_COFI, occas_cfpi_handler ); - occas_mask.set_handler(O_PAIV, occas_cfpi_handler ); - - for (int i = occas_mask.fields() - 1; i >= 0; i--) - { - TMask_field& f = occas_mask.fld(i); - const TFieldref* c = f.field(); - if (c) - f.set(c->read(occ)); - } - - const TString& cf = occas_mask.get(O_COFI); - if (cf.full() && atoi(cf.mid(9, 2)) > 40) - occas_mask.set(O_SESSO, "F"); - - if (occas_mask.run() != K_ESC) - { - const TString ocfpi(occas_mask.get(O_CODICE)); - doc.put(DOC_OCFPI, ocfpi); - m.set(F_OCFPI, ocfpi); - - for (int i = occas_mask.fields() - 1; i >= 0; i--) - { - const TMask_field& f = occas_mask.fld(i); - const TFieldref* c = f.field(); - if (c) - { - const char* val = f.get(); - c->write(val, occ); - } - } - m.occ2mask(); - } - f.set_focus( ); - } - return TRUE; -} - -bool TDocumento_mask::clifo_handler( TMask_field& f, KEY key ) -{ - if (key != K_ENTER && f.to_check(key, true)) - { - TDocumento_mask& m = (TDocumento_mask&)f.mask(); - TDocumento& d = m.doc(); - - const TTipo_documento& tdoc = d.tipo(); - d.put(DOC_TIPOCF, tdoc.tipocf()); - d.put(DOC_CODCF, f.get()); - - const TCli_for& cli_for = d.clifor(true); // force reload - if ( cli_for.get_bool(CLI_SOSPESO) ) - return f.error_box( "Il codice '%ld' e' sospeso e non puo' essere utilizzato", atol(f.get())); - - m.cli2mask(); - - if (m.id2pos(F_CODCONT) >= 0) - { - TEdit_field & e = m.efield(F_CODCONT); - if (e.active()) - { - e.set_dirty(); - e.check(); - e.on_hit(); - } - } - - if (cli_for.occasionale()) - { - const TOccasionale& occas = d.occas(); - if(m.id2pos(F_OCCASEDIT) > 0 && f.to_check(key) && occas.codice().blank()) - m.send_key( K_SPACE, F_OCCASEDIT ); // Lancia maschera occasionali - } - else - d.zero(DOC_OCFPI); - } - return true; -} - -void TDocumento_mask::highlight_row(int row, COLOR back, COLOR fore, bool dirty, bool update) -{ - TRiga_documento& rigadoc = doc()[row + 1]; - TSheet_field& sf = sfield(F_SHEET); - -// COLOR back = COLOR_INVALID, fore = COLOR_INVALID; - - FOR_EACH_ARRAY_ITEM_BACK(color_rules(), rule, o) - { - TColor_rule& expr = *(TColor_rule*)o; - bool on = false; - if (rule == 0) - on = rigadoc.linked(); // Regola standard - else - { - expr.set_row(&rigadoc); - // SET VARS - const int vars = expr.numvar(); - TString name; - for (int i = 0; i < vars; i++) - { - name = expr.varname(i); - if (name.starts_with("DIRTY")) - expr.setvar(i, dirty ? UNO : ZERO); - else - if (name.starts_with("#")) - { - const short id = atoi(name.mid(1)); - if (id > 0) - { - TToken_string& sheet_row = sf.row(row); - expr.setvar(i, sheet_row.get(sf.cid2index(id))); - } - else - expr.setvar(i, get(-id)); - } - else - if (name.starts_with("33.") || name.starts_with("DOC.")) - { - const TString& fldname = name.after('.'); - expr.setvar(i, doc().get(fldname)); - } - else - { - const TString& fldname = name.find('.') > 0 ? name.after('.') : name; - expr.setvar(i, rigadoc.get(fldname)); - } - } - on = expr.as_bool(); - } - if (on) - { - expr.colors(back, fore); - break; - } - } - - sf.set_back_and_fore_color(back, fore, row); - if (update) - sf.force_update(row); -} - -void TDocumento_mask::highlight() -{ - TSheet_field& sf = sfield(F_SHEET); - FOR_EACH_SHEET_ROW(sf, i, r) - highlight_row(i, COLOR_INVALID, COLOR_INVALID, false, false); - sf.force_update(); -} - -/////////////////////////////////////////////////////////// -// TLista_elaborazioni -/////////////////////////////////////////////////////////// - -class TLista_elaborazioni : public TObject // velib04 -{ - TAssoc_array * _elab; - -protected: - void read(); - -public: - TElaborazione & operator [](const char * key) const; - int select(TString_array & result, const char * tipo_iniziale = NULL, const char * stato_iniziale = NULL, const char * tipo_finale = NULL, const char * stato_finale = NULL); - void update(); - TLista_elaborazioni() : _elab(NULL) {} - virtual ~TLista_elaborazioni(); -}; - -void TLista_elaborazioni::read() -{ - if (_elab == NULL) - { - _elab = new TAssoc_array(); - - TTable eld("%ELD"); - - for (int err = eld.first(); err == NOERR; err = eld.next()) - { - TElaborazione* el = NULL; - switch (eld.curr().get_int("I0")) - { - case _esterna : - el = new TElaborazione_esterna(eld.curr()); - break; - case _consegna_ordini: - el = new TConsegna_ordini(eld.curr()); - break; - case _fatturazione_bolle : - el = new TFatturazione_bolle(eld.curr()); - break; - case _contabilizzazione : - el = new TContabilizzazione(eld.curr()); - break; - case _copia_documento : - el = new TCopia_documento(eld.curr()); - break; - case _generazione_effetti : - el = new TGenerazione_effetti(eld.curr()); - break; - case _consuntivazione_produzione : - el = new TConsuntivazione_produzione(eld.curr()); - break; - case _contabilizzazione_analitica : - el = new TContabilizzazione_analitica(eld.curr()); - break; - default : - break; - } - if (el != NULL) - _elab->add(el->codice(), el); - } - } -} - -int TLista_elaborazioni::select(TString_array & result, const char * tipo_iniziale, const char * stato_iniziale, const char * tipo_finale, const char * stato_finale) -{ - read(); - _elab->restart(); - result.destroy(); - for (TElaborazione* el = (TElaborazione*)_elab->get(); el != NULL; el = (TElaborazione*)_elab->get()) - { - bool ok = false; - if ((tipo_iniziale && *tipo_iniziale) && (stato_iniziale && *stato_iniziale)) - { - for (int i = 0; !ok && i < TElaborazione::_max_tipi_doc_elab; i++) - { - const char si = el->stato_iniziale(i); - const TString& ti = el->tipo_iniziale(i); - ok |= ti == tipo_iniziale && si == *stato_iniziale; - } - } - else - ok = true; - if ((tipo_finale && *tipo_finale) && (stato_finale && *stato_finale)) - ok &= el->tipo_finale() == tipo_finale && el->stato_finale() == stato_finale; - if (ok) - result.add(el->codice()); - } - result.sort(); - return result.items(); -} - -TElaborazione& TLista_elaborazioni::operator[](const char * key) const -{ - ((TLista_elaborazioni *)this)->read(); - return (TElaborazione&)(*_elab)[key]; -} - -void TLista_elaborazioni::update() -{ - delete _elab; _elab = NULL; - read(); -} - -TLista_elaborazioni::~TLista_elaborazioni() -{ - if (_elab) - delete _elab; -} - -/////////////////////////////////////////////////////////// -// Filtro per articolo -/////////////////////////////////////////////////////////// - -static TCodice_articolo _art_filter; - -static bool rdoc_article_filter(const TRectype& rdoc) -{ - bool good = rdoc.get(RDOC_CODART) == _art_filter; - if (good) - good = !rdoc.get_bool(RDOC_RIGAEVASA); - return good; -} - -static bool doc_article_filter(const TRelation* rel) -{ - bool yes = false; - const TRectype& doc = rel->curr(); - - TLocalisamfile rdoc(LF_RIGHEDOC); rdoc.setkey(5); - rdoc.put(RDOC_CODART, _art_filter); - rdoc.put(RDOC_CODNUM, doc.get(DOC_CODNUM)); - rdoc.put(RDOC_ANNO, doc.get(DOC_ANNO)); - rdoc.put(RDOC_PROVV, doc.get(DOC_PROVV)); - rdoc.put(RDOC_NDOC, doc.get(DOC_NDOC)); - - for (int err = rdoc.read(); err == NOERR; err = rdoc.next()) - { - const TString& codart = rdoc.get(RDOC_CODART); - if (codart != _art_filter || rdoc.get(RDOC_NDOC) != doc.get(DOC_NDOC)) - break; - if (rdoc_article_filter(rdoc.curr())) - { - yes = true; - break; - } - } - return yes; -} - -/////////////////////////////////////////////////////////// -// TDocument_tree -/////////////////////////////////////////////////////////// - -class TDocument_tree : public TBidirectional_tree -{ - TRelation* _relation; - TCursor* _cursor; - TToken_string _curnode; - bool _multiple_selection; - TAssoc_array _selected_docs; - TString _selected; - -protected: - virtual void node2id(const TObject* node, TString& id) const; - bool on_head() const; - bool on_row() const; - - void format_field(const TRectype& rec, const TString& field, TString& str) const; - void append_custom_fields(const TTipo_documento& tipo, const TRectype& rec, TString& str) const; - -public: - void multiple_selection(bool on); - bool multiple_selection() const { return _multiple_selection;} - bool node_selected(const TObject* node = NULL) const; - void select_node(const TObject* node = NULL, bool on = true); - bool toggle_all_nodes(); - - real select_doc(long numdoc); - void build_doc_list(TLista_documenti & docs); - void unselect_node(const TObject* node) { select_node(node, false);} - virtual bool goto_root(); - virtual bool goto_firstson(); - virtual bool goto_rbrother(); - virtual bool goto_node(const TString &id); - virtual bool could_have_son() const; - virtual bool has_son() const; - virtual bool has_rbrother() const; - virtual bool has_father() const; - virtual bool has_lbrother() const; - virtual bool goto_father(); - virtual bool goto_lbrother(); - virtual TObject* curr_node() const { return &(TToken_string&)_curnode; } - virtual bool get_description(TString& str) const; - virtual TImage* image(bool selected) const; - - void select(TString & id) { _selected = id;} - const TString & selected() const { return _selected;} - - const TRectype& testata() const; - const TRectype& riga() const; - const TRectype& record() const; - const real totale_doc() const { TDocumento d(testata()); return d.totale_doc();} - - void set_cursor(char tipocf, long codcf, int anno, const TString& codnum, - const char* filter, bool allow_zero_cf); - TCursor* get_cursor() { return _cursor; } - - TDocument_tree(); - ~TDocument_tree(); -}; - -const TRectype& TDocument_tree::testata() const -{ - TDocument_tree& me = (TDocument_tree&)*this; - const TRecnotype pos = me._curnode.get_long(0); - if (_cursor->pos() != pos || _relation->curr(LF_RIGHEDOC).empty()) - *me._cursor = pos; - return _relation->curr(); -} - -const TRectype& TDocument_tree::riga() const -{ - TDocument_tree& me = (TDocument_tree&)*this; - const TRectype& rec = _relation->curr(LF_RIGHEDOC); - const TRecnotype pos = me._curnode.get_long(0); - const int nriga = me._curnode.get_int(1); - if (_cursor->pos() != pos || rec.get_int(RDOC_NRIGA) > nriga) - *me._cursor = pos; - for (int i = rec.get_int(RDOC_NRIGA); i < nriga; i++) - _relation->next_match(LF_RIGHEDOC); - return rec; -} - -const TRectype& TDocument_tree::record() const -{ - return on_row() ? riga() : testata(); -} - -void TDocument_tree::node2id(const TObject* node, TString& id) const -{ - id = *(TString*)node; -} - -bool TDocument_tree::on_head() const -{ - TDocument_tree& me = (TDocument_tree&)*this; - return me._curnode.get_int(1) == 0; -} - -bool TDocument_tree::on_row() const -{ - TDocument_tree& me = (TDocument_tree&)*this; - return me._curnode.get_int(1) > 0; -} - -void TDocument_tree::multiple_selection(bool on) -{ - _multiple_selection = on; - if (!_multiple_selection) - _selected_docs.destroy(); - -} - -bool TDocument_tree::node_selected(const TObject* node) const -{ - TToken_string id; - - if (node == NULL) - node = curr_node(); - - node2id(node, id); - id = id.get(0); - return _selected_docs.is_key(id); -} - -void TDocument_tree::select_node(const TObject* node, bool on) -{ - if (node == NULL) - node = curr_node(); - - TToken_string id; - node2id(node, id); - id = id.get(0); - if (on) - _selected_docs.add(id); - else - _selected_docs.remove(id); - select(id); -} - -bool TDocument_tree::toggle_all_nodes() -{ - bool on = _selected_docs.empty() && _multiple_selection; - _selected_docs.destroy(); - if (on) - { - for (bool ok = goto_root(); ok; ok = goto_rbrother()) - select_node(NULL, on); - on = !_selected_docs.empty(); - } - return on; -} - -static bool find_doc(TTree& tree, void* jolly, word flags) -{ - TDocument_tree& t = (TDocument_tree&)tree; - if (!t.node_selected() && t.testata().get_long(DOC_NDOC) == *((long*)jolly)) - { - t.select_node(); - return true; - } - return false; -} - -real TDocument_tree::select_doc(long numdoc) -{ - real val; - if (goto_root() && scan_depth_first(find_doc, &numdoc, SCAN_PRE_ORDER | SCAN_IGNORING_LEAVES)) - val = totale_doc(); - return val; -} - -static bool add_to_list(TTree& tree, void* jolly, word flags) -{ - TDocument_tree & t = (TDocument_tree &) tree; - if (t.node_selected()) - { - TLista_documenti & docs = *((TLista_documenti *) jolly); - docs.add(new TDocumento(t.testata())); - } - return false; -} - -void TDocument_tree::build_doc_list(TLista_documenti & docs) -{ - if (goto_root()) - scan_depth_first(add_to_list, &docs, SCAN_PRE_ORDER | SCAN_IGNORING_LEAVES); -} - -bool TDocument_tree::goto_root() -{ - const bool ok = _cursor != NULL && _cursor->items()>0; - _curnode = ok ? "0" : ""; - *_cursor = 0; - return ok; -} - -// Fundamental method working also when _art_filter.full() -bool TDocument_tree::goto_firstson() -{ - bool ok = has_son(); - if (ok) - { - int nriga = 1; - if (_art_filter.full()) - { - const TRectype& rec = _relation->curr(LF_RIGHEDOC); - nriga = rec.get_int(RDOC_NRIGA); - } - _curnode.add(nriga,1); - } - return ok; -} - -// Fundamental method working also when _art_filter.full() -bool TDocument_tree::goto_rbrother() -{ - bool ok = has_rbrother(); - if (ok) - { - if (on_head()) - { - const long pos = _curnode.get_long(0); - _curnode.add(pos+1, 0); - } - else - { - const int nriga = _curnode.get_int(1); - _curnode.add(nriga+1, 1); - } - } - return ok; -} - -bool TDocument_tree::goto_node(const TString &id) -{ - _curnode = id; - return true; -} - -// Drawing speedup -bool TDocument_tree::could_have_son() const -{ return on_head(); } - -// Fundamental method working also when _art_filter.full() -bool TDocument_tree::has_son() const -{ - bool ok = could_have_son(); - if (ok) - { - testata(); - const TRectype& rec = _relation->curr(LF_RIGHEDOC); - ok = rec.get_int(RDOC_NRIGA) > 0; - if (_art_filter.full()) - { - ok = rdoc_article_filter(rec); - while (!ok && _relation->next_match(LF_RIGHEDOC)) - ok = rdoc_article_filter(rec); - } - } - return ok; -} - -// Fundamental method working also when _art_filter.full() -bool TDocument_tree::has_rbrother() const -{ - bool ok = false; - if (on_head()) - { - long pos = 0; _curnode.get(0, pos); - ok = pos < _cursor->items()-1; - } - else - { - riga(); // Posizionati sulla riga corrente - if (_art_filter.full()) - { - const TRectype& rec = _relation->curr(LF_RIGHEDOC); - while (!ok && _relation->next_match(LF_RIGHEDOC)) - ok = rdoc_article_filter(rec); - } - else - ok = _relation->next_match(LF_RIGHEDOC); - } - return ok; -} - -// Pleonastic method working also when _art_filter.full() -bool TDocument_tree::has_father() const -{ return on_row(); } - -// Pleonastic method not working when _art_filter.full() -bool TDocument_tree::has_lbrother() const -{ - bool ok = false; - if (on_head()) - { - long pos = 0; _curnode.get(0, pos); - ok = pos > 0L; - } - else - { - int nriga = 0; _curnode.get(1, nriga); - ok = nriga > 1; - } - return ok; -} - -// Pleonastic method not working when _art_filter.full() -bool TDocument_tree::goto_father() -{ - bool ok = on_row(); - if (ok) - _curnode.add(0, 1); - return ok; -} - -// Pleonastic method not working when _art_filter.full() -bool TDocument_tree::goto_lbrother() -{ - bool ok = has_lbrother(); - if (ok) - { - if (on_head()) - { - const long pos = _curnode.get_long(0); - _curnode.add(pos-1, 0); - } - else - { - const int nriga = _curnode.get_int(1); - _curnode.add(nriga-1, 1); - } - } - return ok; -} - -void TDocument_tree::format_field(const TRectype& rec, const TString& field, TString& str) const -{ - const TFieldref fld(field, rec.num()); - const TString& value = fld.read(rec); - const TFieldtypes ft = rec.type(fld.name()); - if (ft == _realfld) - { - const int len = rec.length(fld.name()); - const int ndec = rec.ndec(fld.name()); - TString8 pic; pic.format(".%d", ndec); - const real r(value); - str = r.string(pic); - str.right_just(len); - } - else - str = value; -} - -void TDocument_tree::append_custom_fields(const TTipo_documento& tipo, const TRectype& rec, TString& str) const -{ - const TString& format = rec.num() == LF_DOC ? tipo.stringa_descrizione_documento() - : tipo.stringa_descrizione_riga(); - if (format.not_empty()) - { - str << ' '; - int ch = -1; - TString tmp; - for (int ap = format.find('{'); ap >= 0; ap = format.find('{', ch+1)) - { - str << format.sub(ch+1, ap); - ch = format.find('}', ap); - const TString16 field = format.sub(ap+1, ch); - if (!field.blank()) - { - format_field(rec, field, tmp); - str << tmp; - } - } - str << format.mid(ch+1); - } -} - -TImage* TDocument_tree::image(bool selected) const -{ - if (on_row()) - { - const TRectype& rec = riga(); - if (rec.get_bool(RDOC_RIGAEVASA)) - return get_res_icon(10203); - } - else - { - if (multiple_selection()) - { - const bool sel = node_selected(); - if (sel) - { - if (selected) - return get_res_image(BMP_DIRDNSEL); - else - return get_res_image(BMP_DIRSEL); - } - } - } - return TTree::image(selected); -} - -bool TDocument_tree::get_description(TString& str) const -{ - if (on_head()) - { - const TRectype& rec = testata(); - str = rec.get(DOC_ANNO); - str << ' ' << rec.get(DOC_CODNUM); - TString16 tmp; - tmp.format("%6ld", rec.get_long(DOC_NDOC)); - str << ' ' << tmp << ' ' << rec.get(DOC_DATADOC); - const char tipocf = rec.get_char(DOC_TIPOCF); - const long codcf = rec.get_long(DOC_CODCF); - tmp.format(" %c%6ld ", tipocf, codcf); - str << tmp; - tmp.format("%c|%6ld", tipocf, codcf); - str << cache().get(LF_CLIFO, tmp, CLI_RAGSOC); - str.left_just(63); - - const TString& tipodoc = rec.get(DOC_TIPODOC); - const TTipo_documento& tipo = cached_tipodoc(tipodoc); - append_custom_fields(tipo, rec, str); - } - else - { - const TRectype& rec = riga(); - const TRectype& testata = _relation->curr(); - - const TString80 codart = rec.get(RDOC_CODART); - str = codart; - str.left_just(21); - str << rec.get(RDOC_DESCR).left(30); - str.left_just(52); - - const TString& tipodoc = testata.get(DOC_TIPODOC); - const TTipo_documento& tipo = cached_tipodoc(tipodoc); - if (codart.not_empty()) - { - const real qta = rec.get_real(tipo.field_qta()); - str << qta.string("###.###.##@,@@@"); - - if (tipo.is_ordine()) - { - const real qta_evasa = rec.get_real(tipo.field_qtaevasa()); - const real residuo = qta_evasa < qta ? (qta-qta_evasa) : ZERO; - str << residuo.string("###.###.##@,@@@"); - } - append_custom_fields(tipo, rec, str); - } - } - return true; -} - -void TDocument_tree::set_cursor(char tipocf, long codcf, int anno, const TString& codnum, const char* filter, bool allow_zero_cf) -{ - if (_relation == NULL) - { - _relation = new TRelation(LF_DOC); - _relation->add(LF_RIGHEDOC, "PROVV==PROVV|ANNO==ANNO|CODNUM==CODNUM|NDOC==NDOC"); - } - - TRectype& rec = _relation->curr(); - rec.zero(); - rec.put(DOC_PROVV, "D"); - rec.put(DOC_ANNO, anno); - rec.put(DOC_CODNUM, codnum); - - int key = 0; // Chiave di ordinamento ignota al momento - TString filtro = filter; - if (allow_zero_cf) - { - // In assenza di anno cambio chiave del cursore (4-9-2014) - key = anno > 2000 ? 1 : 5; // PROVV+ANNO+CODNUM+NDOC oppure PROVV+CODNUM+ANNO+NDOC - filtro << "&&(STR((CODCF=0)||(CODCF=" << codcf << ")))"; - } - else - { - key = 4; // TIPOCF+CODCF+ANNO+CODNUM+NDOC - rec.put(DOC_TIPOCF, tipocf); - rec.put(DOC_CODCF, codcf); - if (anno <= 2000 && codnum.full()) // In assenza di anno azzero CODNUM che è già nel filtro (4-9-2014) - rec.zero(DOC_CODNUM); - } - - if (_cursor != NULL) - delete _cursor; - _cursor = new TCursor(_relation, filtro, key, &rec, &rec); - if (_art_filter.full()) - _cursor->set_filterfunction(doc_article_filter); - else - _cursor->set_filterfunction(NULL); - - const long items = _cursor->items(); - _cursor->freeze(true); - - goto_root(); - if (items == 1) - expand_all(); -} - -TDocument_tree::TDocument_tree() - : _relation(NULL), _cursor(NULL), _multiple_selection(false) -{ } - -TDocument_tree::~TDocument_tree() -{ - if (_cursor) - delete _cursor; - if (_relation) - delete _relation; -} - -/////////////////////////////////////////////////////////// -// TElabora_mask -/////////////////////////////////////////////////////////// - -class TElabora_mask : public TAutomask -{ - TDocumento_mask* _main; - TLista_elaborazioni _elab; - TDocument_tree _tree; - int _check_fld; - - TElaborazione* _last_elab; - -// @access Protected Member -protected: - void add_valuta_filter(TString& filter) const; - - void docrif_search(); - int update_list(); - void update_ndoc_filter(bool is_tipo_elaborazione = FALSE); - - virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); - -// @access Public Member -public: - bool elabora(); - TElaborazione* curr_elab(); - - // @cmember Costruttore (crea la maschera leggendo la descrizione dal file .msk) - TElabora_mask(TDocumento_mask& main_mask); - // @cmember Distruttore - virtual ~TElabora_mask() {} -}; - -bool TElabora_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) -{ - switch (o.dlg()) - { - case F_CODART: - case F_CODNUM_ELAB: - if (e == fe_modify) - update_ndoc_filter(); - break; - case F_UMQTA: - if (e == fe_init || e == fe_modify) - { - int dec = 5; - if (!o.empty()) - { - const TRectype& um = cache().get("%UMS", o.get()); - if (!um.empty() && um.get_bool("B0")) // Ha dei decimali specificati? - dec = um.get_int("I0"); - } - ((TReal_field&)field(F_QTA)).set_decimals(dec); - } - break; - case F_TYPE: - if (e == fe_init || e == fe_modify) - { - int ne = update_list(); - if (e == fe_init && ne == 0) // Riprova a cambiare flag e ricostruire la lista - { - set(F_TYPE, "X"); - ne = update_list(); - if (ne == 0) - set(F_TYPE, ""); - } - update_ndoc_filter(true); - const bool add_to_doc = o.get().full(); - TElaborazione * e = curr_elab(); - const bool external = e != NULL && e->tipo() == _esterna; - const bool is_search = o.get().empty() || field(F_CODCF_ELAB).empty() || external || add_to_doc; - - o.mask().field(F_NDOC_ELAB).check_type(is_search ? CHECK_SEARCH : CHECK_NORMAL); - _tree.multiple_selection(add_to_doc); - - bool check_tot = false; - if (add_to_doc) - { - if (_check_fld < -1) - { - _check_fld = -1; - const TPointer_array& handlers = _main->doc().tipo().handlers(); - FOR_EACH_ARRAY_ITEM_BACK(handlers, id, hnd) - { - if (long(hnd) == 2) // 2 = totdoc_handler - _check_fld = id; - } - } - check_tot = _check_fld >= 0; - } - if (!add_to_doc) - o.mask().set(F_TOTSEL, ""); - o.mask().show(-GRP_CHK, check_tot); - if (check_tot) - o.mask().set(F_TOTVAL, _main->get(_check_fld)); - } - break; - case F_STATODOC_ELAB: - case F_TIPODOC_ELAB: - if (e == fe_modify) - { - update_list(); - update_ndoc_filter(); - } - break; - case F_ELAB: - if (e == fe_modify) - update_ndoc_filter(true); - break; - case F_ANNO_ELAB: - if (e == fe_modify) - update_ndoc_filter(); - break; - case F_NUMDOCRIF_ELAB: - if (e == fe_button) - docrif_search(); - break; - case F_NDOC_ELAB: - if ((e == fe_modify || e == fe_close) && o.check_type() == CHECK_SEARCH && !o.empty()) - { - TToken_string key; - key.add("D"); key.add(get(F_ANNO_ELAB)); - key.add(get(F_CODNUM_ELAB)); key.add(o.get()); - const TRectype& rec = cache().get(LF_DOC, key); - bool ok = !rec.empty(); // Verifica esistenza documento - - if (ok) - { - TCursor* c = _tree.get_cursor(); - c->curr() = rec; - ok = c->test(_isequal) == NOERR; // Verifica compatibilità documento - } - if (!ok) - return error_box(((TEdit_field&)o).get_warning()); - } - if (e == fe_init || e == fe_modify) - { - const long ndoc = atol(o.get()); - - if (ndoc > 0L) - { - real val = _tree.select_doc(ndoc); - if (!val.is_zero()) - { - val += o.mask().get_real(F_TOTSEL); - o.mask().set(F_TOTSEL, val); - } - } - } - break; - case F_ROWS: - if (e == fe_modify && is_running()) - { - TString id; - _tree.curr_id(id); - _tree.select(id); - if (is_running() && !_tree.multiple_selection()) - { - TCursor* c = _tree.get_cursor(); - if (c != NULL && c->items() > 0) - { - const TRectype& head = _tree.testata(); - set(F_DATADOC_ELAB, head.get(DOC_DATADOC)); // Anch'essa nella chiave 2! - set(F_ANNO_ELAB, head.get(DOC_ANNO)); - set(F_CODNUM_ELAB, head.get(DOC_CODNUM), 2); // Check but not hit - set(F_NDOC_ELAB, head.get(DOC_NDOC)); - } - } - } - else - if (e == fe_button) - { - if (_tree.multiple_selection()) - { - const bool on = !_tree.node_selected(); - _tree.select_node(NULL, on); - if (_check_fld >= 0) - { - real val = get_real(F_TOTSEL); - if (on) - val += _tree.totale_doc(); - else - { - val -= _tree.totale_doc(); - if (_tree.testata().get_long(DOC_NDOC) == o.mask().get_long(F_NDOC_ELAB)) - o.mask().set(F_NDOC_ELAB, ""); - } - set(F_TOTSEL, val); - } - } - } - break; - case DLG_LINK: - if (e == fe_button) - { - _tree.goto_node(_tree.selected()); - const TRectype & rec = _tree.testata(); - - if (!rec.empty()) - { - TFilename tempfile; - tempfile.temp("ve0"); - tempfile.ext("ini"); - { - TConfig configfile(tempfile); - configfile.set("Action", "Modify", "Transaction"); - configfile.set("NDOC", rec.get(DOC_NDOC), "33"); - configfile.set(DOC_PROVV, rec.get(DOC_PROVV), "33"); - configfile.set(DOC_ANNO, rec.get(DOC_ANNO), "33"); - configfile.set(DOC_CODNUM, rec.get(DOC_CODNUM), "33"); - } - - TString commandline; - - commandline.format("ve0 -0 /i%s",(const char*)tempfile); - - TExternal_app ve(commandline); - ve.run(); - - remove_file(tempfile); - } - } - break; - case DLG_SELECT: - if (e == fe_button) - { - TTree_field& tf = tfield(F_ROWS); - if (tf.active() && _tree.multiple_selection()) - { - TWait_cursor hourglass; - const bool sel = _tree.toggle_all_nodes(); - if (_check_fld > DLG_NULL) - { - real tot; - for (bool ok = _tree.goto_root(); ok && sel; ok = _tree.goto_rbrother()) - tot += _tree.totale_doc(); - set(_check_fld, tot.string()); - } - tf.win().force_update(); - } - return false; - } - break; - default: - break; - } - return true; -} - -int TElabora_mask::update_list() -{ - TString_array elabs; - const TString& tipo = _main->get(F_TIPODOC); - const TString& stato = _main->get(F_STATO); - const TString& tipo_elab = get(F_TIPODOC_ELAB); - const TString& stato_elab = get(F_STATODOC_ELAB); - const bool from_elab = !get_bool(F_TYPE); - int items = 0; - - if (from_elab) - { - items = _elab.select(elabs, tipo, stato, "", "") ; - field(F_ANNO_ELAB).check_type(CHECK_REQUIRED); - } - else - { - field(F_ANNO_ELAB).check_type(CHECK_NONE); - items = _elab.select(elabs, tipo_elab, stato_elab, tipo, stato); - if (items == 0) - items = _elab.select(elabs, "", "", tipo, stato); - } - - TList_field & f = lfield(F_ELAB); - TToken_string codes; - TToken_string descrs; - for (int i = 0; i < items; i++) - { - const TElaborazione& e = _elab[elabs.row(i)]; - - if (!from_elab) - { - // AO20123: Impedire contabilizzazione all'indietro! - if (e.tipo() == _contabilizzazione || e.tipo() == _generazione_effetti) - continue; - } - - codes.add(e.codice()); - descrs.add(e.descrizione()); - } - - items = codes.items(); // Conta elementi veramente aggiunti - const bool ok = items > 0; - enable(DLG_OK, ok); - enable(F_ELAB, ok); - - if (codes != f.get_codes()) - f.replace_items(codes, descrs); - const TElaborazione* e = curr_elab(); - if (e != NULL && e->tipo() == _consegna_ordini) - show(-GRP_ART); - else - { - reset(-GRP_ART); - hide(-GRP_ART); - } - - return items; -} - -bool TElabora_mask::elabora() -{ - bool update_mask = false; - - TLista_documenti in; - TLista_documenti out; - TDocumento& app_doc = ((TDocumento_mask *)_main)->doc(); - const long numdoc = field(F_NDOC_ELAB).active() ? get_long(F_NDOC_ELAB) : app_doc.get_long(DOC_NDOC); - const bool update_header = get_bool(F_UPDATE_HEADER); - const bool from_elab = !get_bool(F_TYPE); - - TElaborazione* e = curr_elab(); - if (e == NULL) - return false; - - if (e->tipo() == _consegna_ordini) - { - TParametri_elaborazione& p = e->params(); - p.set("ARTICOLO", get(F_CODART)); - p.set("UM", get(F_UMQTA)); - p.set("QUANTITA", get(F_QTA)); - } - if (from_elab) - { - const char provv = get(F_PROVV_ELAB)[0]; - const int anno = get_int(F_ANNO_ELAB); - const TString& codnum = get(F_CODNUM_ELAB); - const TString& tipo = get(F_TIPODOC_ELAB); - const TString& stato = get(F_STATODOC_ELAB); - - if (anno <= 0 || codnum.blank() || tipo.blank() || stato.blank()) - return false; - - TDocumento* newdoc = new TDocumento(provv, anno, codnum, numdoc); - TDocumento& d = *newdoc; - - if (numdoc <= 0) - { - TDocumento::copy_data(d.head(), app_doc.head()); - d.put(DOC_TIPODOC, tipo); - d.put(DOC_STATO, stato); - - const TDate datadoc = d.get_date(DOC_DATADOC); - const TDate datainsc = d.get_date(DOC_DATAINSC); - const bool equal = !datainsc.ok() || datadoc == datainsc; - - d.put(DOC_DATADOC, get(F_DATADOC_ELAB)); - if (equal) - d.zero(DOC_DATAINSC); - - const TTipo_documento & t = d.tipo(); - - if (t.mov_mag()) - d.put(DOC_CAUSMAG, t.caus_mov()); - else - d.zero(DOC_CAUSMAG); - } - - in.add(app_doc); - out.add(d); - if (e->elabora(in, out, TDate(TODAY), true)) - { - if (out[0] != d) - out.rewrite(); - if (app_doc != in[0]) - { - in.rewrite(); - app_doc = in[0]; - update_mask = true; - } - } - delete newdoc; - } - else - { - _tree.build_doc_list(in); - if (in.items() == 0) - return false ; - char provv = get(F_PROVV_ELAB)[0]; - int anno = get_int(F_ANNO_ELAB); - const TString4 codnum = get(F_CODNUM_ELAB); - long ndoc = get_long(F_NDOC_ELAB); - - if (ndoc > 0L && !in.find(provv, anno, codnum, ndoc)) - { - TDocumento* d = new TDocumento(provv, anno, codnum, ndoc); - in.add(d); - } - if (update_header) - { - const TString4 tipo_doc=app_doc.get(DOC_TIPODOC); - const TString8 caus_mag=app_doc.get(DOC_CAUSMAG); - const long movmag = app_doc.get_long(DOC_MOVMAG); - const TDate datadoc = app_doc.get_date(DOC_DATADOC); - const TDate datainsc = app_doc.get_date(DOC_DATAINSC); - const TDate datapart = app_doc.get_date(DOC_DATAPART); - const TString8 orapart = app_doc.get(DOC_ORAPART); - const char stato = app_doc.stato(); - - TDocumento::copy_data(app_doc.head(), in[0].head()); - - app_doc.put(DOC_TIPODOC, tipo_doc); - app_doc.put(DOC_CAUSMAG, caus_mag); - app_doc.put(DOC_MOVMAG, movmag); - app_doc.put(DOC_DATADOC, datadoc); - app_doc.put(DOC_DATAINSC, datainsc); - app_doc.put(DOC_DATAPART, datapart); - app_doc.put(DOC_ORAPART, orapart); - app_doc.put(DOC_STATO, stato); - } - out.add(app_doc); - if (e->elabora(in, out, TDate(TODAY), true)) - { - if (out[0] != app_doc) - { - out.rewrite(); - app_doc.read(out[0].head()); - update_mask = true; - } - - // Aggiorna eventuale residuo da consegnare - if (e->tipo() == _consegna_ordini) - { - TParametri_elaborazione& p = e->params(); - set(F_QTA, p.get("QUANTITA")); - - // Azzera qtaevasa in ordini quadro +#include +#include +#include +#include +#include +#include +// #include // Cassato il macchinaro +#include +#include +#include +#include + +#include "../db/dblib.h" +#include "velib04.h" +#include "vepriv.h" +#include "verig.h" + +#include "ve0100.h" +#include "ve0100b1.h" +#include "ve0100c.h" +#include "ve0100o.h" +#include "veuml.h" +#include "veuml1.h" +#include "veini.h" + +#include "../cg/cfban.h" +#include "../ca/cfcms.h" +#include "condv.h" +#include "rcondv.h" +#include "sconti.h" + +#include + +/////////////////////////////////////////////////////////// +// TOriginal_row_mask +/////////////////////////////////////////////////////////// + +class TOriginal_row_mask : public TAutomask +{ +protected: + virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); + virtual bool on_key(KEY key); + +public: + TOriginal_row_mask() : TAutomask("ve0100c") { } +}; + +bool TOriginal_row_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) +{ return true; } + +bool TOriginal_row_mask::on_key(KEY key) +{ + if (key == K_SHIFT + K_F12) + enable(-1); + return TAutomask::on_key(key); +} + +/////////////////////////////////////////////////////////// +// TColor_rule +/////////////////////////////////////////////////////////// + + +TColor_rule::TColor_rule(const char* desc, const char* expr, TTypeexp type, COLOR back, COLOR fore) + : TExpr_documento(expr, type), _back(back), _fore(fore), _def_back(back), _def_fore(fore) +{ + _desc = dictionary_translate(desc); + _key = desc; _key.trim(); _key.strip_double_spaces(); + _key.replace(' ', '_'); +} + +/////////////////////////////////////////////////////////// +// Gestione campi CONAI su maschera righe +/////////////////////////////////////////////////////////// + +short conai_peso_id(TCONAI_class type) +{ return type >= CONAI_FIRST && type <= CONAI_LAST ? FR_PUNACC + 2 * type : DLG_NULL; } + +short conai_sottocat_id(TCONAI_class type) +{ return type >= CONAI_FIRST && type <= CONAI_LAST ? FR_SCAACC + 2*type : DLG_NULL; } + +TCONAI_class conai_id2class(short id) +{ + const TCONAI_class t = TCONAI_class((id-FR_SCAACC) / 2); + return t >= CONAI_FIRST && t <= CONAI_LAST ? t : CONAI_NONE; +} + +/////////////////////////////////////////////////////////// +// TDocumento_mask +/////////////////////////////////////////////////////////// + +TDocumento_mask::TDocumento_mask(const char* td) + : TVariable_mask(), _progs_page(-1), _condv(NULL), //_smartcard(NULL), + _cms_start(-1), _cms_end(-1), _cms_start_sh(-1), _cms_end_sh(-1), + _cdc_start(-1), _cdc_end(-1), _cdc_start_sh(-1), _cdc_end_sh(-1) +{ + CHECK(td && *td && strlen(td) <= 4, "TDocumento_mask(TipoDocumento) not (MaskName)"); + { + TMagazzini m; + _ges_mag = m.gestmag(); + _ges_dep = m.gestdep(); + _std_mag = m.standardmag(); + _std_dep = m.standarddep(); + } + TDocumento& d = doc(); + d.set_tipo(td); + const TString16 mname = d.tipo().mask_name(); + read_mask(mname, 0, MAX_PAGES); + + _sheet = &sfield(F_SHEET); + set_field_handler(F_SHEET, ss_handler ); + _sheet->set_notify( ss_notify ); + _sheet->set_append(FALSE); + + TList_field& listbox = lfield(F_LBTIPORIGA); + + const TTipo_documento& tdoc = d.tipo(); + const TToken_string& keys = tdoc.keys_descrs().row(0); + const TToken_string& desc = tdoc.keys_descrs().row(1); + listbox.replace_items(keys, desc); + + // Controlla se deve generare la pagina di analitica + _ges_ca = ca_config().get_int("Authorizations") != 0; + if (_ges_ca) + insert_anal_page(); + + configura_sheet(*_sheet); + + ((TVariable_sheet_field*)_sheet)->set_getmask( ss_getmask ); + if (_doc.tipo().clifo_optional()) + { + field(F_CODCF).check_type(CHECK_NORMAL); + field(F_RAGSOC).check_type(CHECK_NORMAL); + } + + int i; + for (i = fields() - 1; i >= 0; i--) + { + TMask_field& f = fld(i); + if (f.is_operable()) + f.set_handler(universal_handler); + } + + set_field_handler( F_OCCASEDIT, occas_handler ); + set_field_handler( F_CODCF, clifo_handler ); + set_field_handler( F_CODPAG, condpag_hndl ); + set_field_handler( F_DATAINSC, condpag_hndl ); + set_field_handler( F_MANDATO, mandato_hndl ); + set_field_handler( F_CODNOTE, note_hndl ); + set_field_handler( F_DATADOC, data_hndl ); + set_field_handler( F_CODLIST, codlist_handler ); + set_field_handler( F_CODCONT, codcont_handler ); + set_field_handler( F_CODCAMP, codcamp_handler ); + set_field_handler( F_CODVAL, codval_handler ); + set_field_handler( F_CODVAL1, codval_handler ); + set_field_handler( F_NUMDOCRIF, datadocrif_handler); + set_field_handler( F_DATADOCRIF, datadocrif_handler); + set_field_handler( F_LIQDIFF, liqdiff_handler); + + set_handler( DLG_ELABORA, elabora_handler ); + set_handler( DLG_PRINT, print_handler ); + set_handler( DLG_PREVIEW, print_handler ); + set_handler( DLG_EMAIL, print_handler ); + set_handler( DLG_CONFERMA, confirm_handler ); + set_handler( DLG_SORT, sort_row_handler ); + set_handler( DLG_BARCODE, barcode_handler ); + + const TPointer_array& handlers = tdoc.handlers(); + FOR_EACH_ARRAY_ITEM(handlers, r, riga) + user_set_handler( r, (int)riga); + + _livelli_giac = new TCodgiac_livelli; + + for (i = 4; i > 0; i--) + { + const short pos = _sheet->cid2index(FR_LIV1 + i -1); + if (_livelli_giac->enabled(i)) + { + const TString& header = _livelli_giac->name(i); + const int len = header.len() + 1; + const int f_len = _livelli_giac->code_length(i); + _sheet->set_column_header(pos, header); + _sheet->set_column_width(pos, (len > f_len ? len : f_len) * 8); + } + else + { + _sheet->sheet_mask().hide(FR_LIV1 + i -1); + _sheet->delete_column(pos); + } + } + +// configurazione campi + + TConfig cfg(CONFIG_DITTA, "ve"); + const bool gesval = cfg.get_bool("GESVAL"); + const bool gescambi = cfg.get_bool("GESVALAC"); + + if (gesval) + { + //const bool enable_controeuro = cfg.get_bool("CONTROEURO"); + //enable(F_CONTROEURO, enable_controeuro); + + show(F_CODVAL, !gescambi); + show(F_DATACAMBIO, !gescambi); + show(F_NOMEVAL, !gescambi); + show(F_CODVAL1, gescambi); + show(F_DATACAMBIO1, gescambi); + show(F_NOMEVAL1, gescambi); + show(F_CAMBIO); + } + else + { + disable(F_CODVAL); + disable(F_DATACAMBIO); + // disable(F_CONTROEURO); + disable(F_NOMEVAL); + hide(F_CODVAL1); + hide(F_DATACAMBIO1); + hide(F_NOMEVAL1); + disable(F_CAMBIO); + } + + const bool geslin = cfg.get_bool("GESLIN"); + + enable(F_CODLIN, geslin); + enable(F_DESLIN, geslin); + + const bool geslis = cfg.get_bool("GES", NULL, 1); + + show(F_CODLIST, geslis); + show(F_DESLIST, geslis); + enable(F_CODLIST, geslis); + enable(F_DESLIST, geslis); + + hide(203); + disable(203); + + hide(204); + disable(204); + + for (int n = 0; n < 2; n++) + { + const short id = n == 0 ? F_CODNOTE : F_NOTECLI; + if (id2pos(id) >= 0) // Alcuni profili NON hanno le note + { + TBrowse* nb = efield(id).browse(); + if (nb != NULL) + { + nb->set_output_fields(TOSTRING(F_CODNOTE)); + nb->set_output_field_names("CODTAB"); + } + } + else + break; + } + + if (cfg.get_bool("GESLISCV") && id2pos(F_CODLIST) > 0) + { + TBrowse * b = efield(F_CODLIST).browse(); + if (b != NULL) + { + b->remove_input_field(); + b->add_input_field("\"L\"", RCONDV_TIPO); + b->add_input_field(TOSTRING(F_CATVEN), DOC_CATVEN, -1, true); + b->add_input_field("\"\"", DOC_TIPOCF); + b->add_input_field("\"\"", DOC_CODCF); + b->add_input_field(TOSTRING(F_CODLIST), RCONDV_COD); + } + if (id2pos(F_DESLIST) > 0) + { + b = efield(F_DESLIST).browse(); + if (b != NULL) + { + TString filter; + filter << DOC_CATVEN << "==#" << F_CATVEN; + b->set_filter(filter); + } + } + } + + const bool gescontr = cfg.get_bool("GES", "ve", 2); + + show(F_CODCONT, gescontr); + show(F_DESCONT, gescontr); + enable(F_CODCONT, gescontr); + enable(F_DESCONT, gescontr); + if (cfg.get_bool("GESCONCC") && id2pos(F_CODCONT) > 0) + { + TBrowse * b = efield(F_CODCONT).browse(); + if (b != NULL) + { + b->remove_input_field(); + b->add_input_field("\"C\"", RCONDV_TIPO); + b->add_input_field("\"\"", RCONDV_CATVEN); + b->add_input_field(TOSTRING(F_TIPOCF), RCONDV_TIPOCF, -1, true); + b->add_input_field(TOSTRING(F_CODCF), RCONDV_CODCF, -1, true); + b->add_input_field(TOSTRING(F_CODCONT), RCONDV_COD); + } + if (id2pos(F_DESCONT) > 0) + { + b = efield(F_DESCONT).browse(); + if (b != NULL) + { + TString filter; + filter << "(" << DOC_TIPOCF << "==#" << F_TIPOCF << ")&&(" << DOC_CODCF << "==#" << F_CODCF << ")"; + b->set_filter(filter); + } + } + } + + const TDongle& a = dongle(); + if (a.active(CTAUT) || a.active(PAAUT)) + { + if (_ges_ca && id2pos(F_CUP) > 0) // Se gestisco l'analtica ... + { + TLocalisamfile cfcms(LF_CFCMS); + if (cfcms.first() == NOERR) // ... ed i clienti per commessa (alias sono Dinamica) + { + // Allora impongo la scelta di CIG e CUP in base alla commessa + TBrowse* bp = efield(F_CUP).browse(); + + TRelation * rp = new TRelation(LF_CFCMS); + rp->add("%CUP", "CODTAB==" CFCMS_CUP); + rp->add(LF_CLIFO, "TIPOCF==TIPOCF|CODCF==CODCF"); + bp->set_cursor(new TCursor(rp, "", 2)); + + bp->set_filter("TIPOCF==\"C\""); + bp->remove_input_field(); + bp->add_input_field(TOSTRING(F_CMSH), CFCMS_COMMESSA, -1, true); + bp->add_input_field(TOSTRING(F_CUP), CFCMS_CUP); + bp->remove_display_field(); + bp->add_display_field(HR("Codice CUP@15"), CFCMS_CUP); + bp->add_display_field(HR("Descrizione@50"), "%CUP->S0"); + bp->add_display_field(HR("Codice Cliente"), CFCMS_CODCF); + bp->add_display_field(HR("Ragione Sociale@50"), TOSTRING(LF_CLIFO) "->" CLI_RAGSOC); + bp->remove_output_field(); + bp->add_output_field(TOSTRING(F_CUP), CFCMS_CUP); + bp->add_output_field(TOSTRING(F_CIG), CFCMS_CIG); + bp->add_output_field(TOSTRING(F_DESCRCUP), "%CUP->S0"); + bp->set_insert("Rca0 -5"); + + TBrowse* bpd = efield(F_DESCRCUP).browse(); + bpd->set_cursor(new TSorted_cursor(rp, CFCMS_COMMESSA "|%CUP->S0")); + bpd->set_filter("TIPOCF==\"C\""); + bpd->remove_input_field(); + bpd->add_input_field(TOSTRING(F_CMSH), CFCMS_COMMESSA, -1, true); + bpd->add_input_field(TOSTRING(F_DESCRCUP), "%CUP->S0"); + bpd->remove_display_field(); + bpd->add_display_field(HR("Descrizione@50"), "%CUP->S0"); + bpd->add_display_field(HR("Codice CUP@15"), CFCMS_CUP); + bpd->add_display_field(HR("Codice Cliente"), CFCMS_CODCF); + bpd->add_display_field(HR("Ragione Sociale@50"), TOSTRING(LF_CLIFO) "->" CLI_RAGSOC); + bpd->copy_output(bp); + bpd->set_insert("Rca0 -5"); + + TBrowse * bg = efield(F_CIG).browse(); + TRelation * rg = new TRelation(LF_CFCMS); + + rg->add("%CIG", "CODTAB==" CFCMS_CIG); + rg->add(LF_CLIFO, "TIPOCF==TIPOCF|CODCF==CODCF"); + bg->set_cursor(new TCursor(rg, "", 3)); + bg->set_filter("TIPOCF==\"C\""); + bg->remove_input_field(); + bg->add_input_field(TOSTRING(F_CMSH), CFCMS_COMMESSA, -1, true); + bg->add_input_field(TOSTRING(F_CIG), CFCMS_CIG); + bg->remove_display_field(); + bg->add_display_field(HR("Codice CIG@15"), CFCMS_CIG); + bg->add_display_field(HR("Descrizione@50"), "%CIG->S0"); + bg->add_display_field(HR("Codice Cliente"), CFCMS_CODCF); + bg->add_display_field(HR("Ragione Sociale@50"), TOSTRING(LF_CLIFO) "->" CLI_RAGSOC); + bg->remove_output_field(); + bg->add_output_field(TOSTRING(F_CIG), CFCMS_CIG); + bg->add_output_field(TOSTRING(F_CUP), CFCMS_CUP); + bg->add_output_field(TOSTRING(F_DESCRCIG), "%CIG->S0"); + bg->set_insert("Rca0 -5"); + + TBrowse * bgd = efield(F_DESCRCIG).browse(); + + bgd->set_cursor(new TSorted_cursor(rg, CFCMS_COMMESSA "|%CIG->S0")); + bgd->set_filter("TIPOCF==\"C\""); + bgd->remove_input_field(); + bgd->add_input_field(TOSTRING(F_CMSH), CFCMS_COMMESSA, -1, true); + bgd->add_input_field(TOSTRING(F_DESCRCIG), "%CIG->S0"); + bgd->remove_display_field(); + bgd->add_display_field(HR("Descrizione@50"), "%CIG->S0"); + bgd->add_display_field(HR("Codice CIG@15"), CFCMS_CIG); + bgd->add_display_field(HR("Cliente"), CFCMS_CODCF); + bgd->add_display_field(HR("Ragione Sociale@50"), TOSTRING(LF_CLIFO) "->" CLI_RAGSOC); + bgd->copy_output(bg); + bgd->set_insert("Rca0 -5"); + } + } + } + else + { + hide(F_CUP); + hide(F_DESCRCUP); + hide(F_CIG); + hide(F_DESCRCIG); + } + + const bool gesoff = cfg.get_bool("GES", "ve", 3); + enable(F_CODCAMP, gesoff); + enable(F_DESCAMP, gesoff); + + const bool gessco = cfg.get_char("GESSCO") != 'N'; + enable(F_SCONTOPERC, gessco); + + const bool gesage = cfg.get_bool("GESAGE"); + enable(F_CODAG, gesage); + enable(F_DESAG, gesage); + enable(F_CODAGVIS, gesage); + enable(F_DESAGVIS, gesage); + + const bool has_movmag = dongle().active(MGAUT) && _doc.tipo().mov_mag(); + int pos = id2pos(F_CAUSMAG); + if (pos >= 0) + fld(pos).show(has_movmag); + pos = id2pos(F_DESCRMAG); + if (pos >= 0) + fld(pos).show(has_movmag); + pos = id2pos(F_CAUSMAGC); + if (pos >= 0) + fld(pos).show(has_movmag); + pos = id2pos(F_DESCRMAGC); + if (pos >= 0) + fld(pos).show(has_movmag); + pos = id2pos(F_CURGIAC); + if (pos >= 0) + fld(pos).show(has_movmag); + pos = id2pos(F_CURDISP); + if (pos >= 0) + fld(pos).show(has_movmag); + + FOR_EACH_MASK_FIELD((*this), j, f) + { + if (f->dlg() > BASE_PIEDE) + _calculated_pages.set(f->page()); + } + + TFilename pn; d.tipo().profile_name(pn); + TConfig prof(pn, "Colors"); + prof.write_protect(true); + + COLOR back = prof.get_color("BgCol", NULL, 0, COLOR_YELLOW); // FOCUS_BACK_COLOR + COLOR fore = prof.get_color("FgCol", NULL, 0, COLOR_BLACK); // FOCUS_COLOR + color_rules().add(new TColor_rule("Righe collegate a documento", "", _numexpr, back, fore)); + + for (int i = 1; ; i++) + { + const TString& name = prof.get("RuleName", NULL, i); + if (name.full()) + { + const TString& expr = prof.get("Rule", NULL, i); + const TTypeexp type = prof.get_char("RuleType", NULL, i, 'N') == 'S' ? _strexpr : _numexpr ; + back = prof.get_color("BgCol", NULL, i, NORMAL_BACK_COLOR); + fore = prof.get_color("FgCol", NULL, i, NORMAL_COLOR); + color_rules().add(new TColor_rule(name, expr, type, back, fore)); + } + else + break; + } + _sh_y = prof.get_int("SHEET_LINE", "MAIN"); + + // Legge i colori personalizzati dal .ini gestito dalla TSelect_color_mask + TString tmp; tmp << doc().tipo().mask_name() << "_0"; tmp.lower(); + TConfig conf(CONFIG_GUI, tmp); + conf.write_protect(); + FOR_EACH_ARRAY_ITEM(color_rules(), j, o) + { + TColor_rule& c = *(TColor_rule*)o; + tmp = c.key(); + COLOR fore = conf.get_color(tmp); + tmp << "_Bg"; + COLOR back = conf.get_color(tmp); + if (back != fore) + c.set_colors(back, fore); + } + + if (gestione_note_per_articolo()) + set_handler(F_NAR, nar_handler); +} + +TDocumento_mask::~TDocumento_mask() +{ + if (_condv) + delete _condv; + if (_livelli_giac) + delete _livelli_giac; + // if (_smartcard) delete _smartcard; // cassato il macchinaro +} + +int TDocumento_mask::insert_anal_fields(TMask& m, int page, int lf, int& y, + short& dlg, short& dlgd, bool required) +{ + const int h = ca_create_fields(m, page, lf, 2, y, dlg, dlgd); + + const bool main_mask = m.id2pos(F_SHEET) > 0; + + for (int i = 0; i < h; i++) + { + TEdit_field& fld = m.efield(dlg+i); + int logic = lf; + if (logic == LF_FASI) + { + const TMultilevel_code_info& fasinfo = ca_multilevel_code_info(LF_FASI); + if (fasinfo.parent() != 0) + { + const TMultilevel_code_info& parinfo = ca_multilevel_code_info(fasinfo.parent()); + if (i < parinfo.levels()) + logic = fasinfo.parent(); + } + } + + const char* fieldname = NULL; + switch(logic) + { + case LF_COMMESSE: fieldname = DOC_CODCMS; break; + case LF_FASI : fieldname = DOC_FASCMS; break; + default : fieldname = DOC_CODCOSTO; break; + } + TFieldref* f = (TFieldref*)fld.field(); + f->set_name(fieldname); + + fld.check_type(required ? CHECK_REQUIRED : CHECK_NORMAL); + + TEdit_field& dfld = m.efield(dlgd+i); + dfld.set_field(EMPTY_STRING); // Toglie campi che fan saltare gli output! + + if (main_mask) + { + TSheet_field& sf = sfield(F_SHEET); + const TFixed_string head = fld.prompt(); + const int colid = FR_CDC1+(fld.dlg()-F_CDC1); + sf.set_column_header(colid, head); + if (fld.size() > head.len()) + sf.set_column_width(colid, fld.size()*8); // XI_FU_MULTIPLE + + TMask& sm = sf.sheet_mask(); + TString80 str; str << *fld.field(); + sm.efield(colid).set_field(str); // Ricopia il campo nella maschera di riga per poterlo salvare! + } + } + y += h; + dlg += h; dlgd += h; + return h; +} + +void TDocumento_mask::insert_anal_page() +{ + if (id2pos(F_CDC1) >= 0) + return; + int newpage = win2page(_sheet->parent()); + if (newpage == 0) + newpage++; + create_page(TR("Analitica"), newpage); // Inserisce una pagina vuota con un titolo a caso + + add_groupbox(DLG_NULL, newpage, "", 1, 0, 78, 6); + add_string(DLG_NULL, newpage, TR("Cod. num. "), 2, 1, 4, "D").set_group(2); + add_string(DLG_NULL, newpage, "", 24, 1, 50, "D").set_group(3); + add_string(DLG_NULL, newpage, TR("Tipo doc. "), 2, 2, 4, "D").set_group(4); + add_string(DLG_NULL, newpage, "", 24, 2, 50, "D").set_group(5); + add_number(DLG_NULL, newpage, TR("Esercizio "), 2, 3, 4, "D").set_group(9); + add_number(DLG_NULL, newpage, TR("Numero doc. "), 24, 3, 6, "D").set_group(6); + add_date(DLG_NULL, newpage, TR("Data "), 46, 3, "D").set_group(7); + add_string(DLG_NULL, newpage, TR("Stato "), 67, 3, 1, "D").set_group(8); + add_number(DLG_NULL, newpage, TR("Cliente "), 2, 4, 6, "D").set_group(10); + add_string(DLG_NULL, newpage, "", 24, 4, 50, "D").set_group(11); + + const TMultilevel_code_info& fasinfo = ca_multilevel_code_info(LF_FASI); + const bool use_fsc = fasinfo.levels() > 0; + TConfig& ini = ca_config(); + const bool fsc_req = use_fsc && ini.get_bool("FscRequired"); + + int y = 7; + short dlg = F_CDC1; // id del primo campo da generare + short dlgd = F_DESCDC1; + + const bool ca_in_testa = doc().tipo().head_ca_required(); + for (int i = 0; i < 2; i++) + { + const TString& level = ini.get("Level", NULL, i+1); // Legge il livello 1 o 2 + if (level == "CDC") // Crea centro di costo + { + _cdc_start = dlg; + _cdc_end = dlg + ca_multilevel_code_info(LF_CDC).levels()-1; + if (use_fsc && fasinfo.parent() == LF_CDC) + insert_anal_fields(*this, newpage, LF_FASI, y, dlg, dlgd, fsc_req && ca_in_testa); + else + { + const bool cdc_req = ca_in_testa && ini.get_bool("CdcRequired"); + insert_anal_fields(*this, newpage, LF_CDC, y, dlg, dlgd, cdc_req); + } + } else + if (level == "CMS") // Crea commessa + { + _cms_start = dlg; + _cms_end = dlg + ca_multilevel_code_info(LF_COMMESSE).levels()-1; + if (use_fsc && fasinfo.parent() == LF_COMMESSE) + insert_anal_fields(*this, newpage, LF_FASI, y, dlg, dlgd, fsc_req && ca_in_testa); + else + { + const bool cms_req = false; // ca_in_testa && ini.get_bool("CmsRequired"); // Ora gestisco il REQUIRED da codcms_handler + insert_anal_fields(*this, newpage, LF_COMMESSE, y, dlg, dlgd, cms_req); + } + set_field_handler(_cms_end, codcms_handler); + } + } + if (use_fsc && fasinfo.parent() <= 0) + insert_anal_fields(*this, newpage, LF_FASI, y, dlg, dlgd, fsc_req && doc().tipo().head_ca_required()); + + //aggiunge campi per date di competenza (inizio e fine) + add_static(DLG_NULL, newpage, TR("@bDate di competenza"), 2, y); + const TFixed_string f_datacomp = DOC_DATACOMP; + add_date(F_DATACOMP, newpage, "Inizio ", 30, y).set_field(f_datacomp); + const TFixed_string f_datafcomp = DOC_DATAFCOMP; + add_date(F_DATAFCOMP, newpage, "Fine ", 59, y).set_field(f_datafcomp); + set_field_handler(F_DATACOMP, datacomp_handler); //gestore del campo inizio competenza.. + set_field_handler(F_DATAFCOMP, datafcomp_handler); //..e della fine competenza + add_groupbox(DLG_NULL, newpage, TR("@bContabilità Analitica"), 1, 6, 78, y-4); + + const bool movimento_interno = main_app().has_module(CIAUT) && _doc.tipo().movimento_interno(); + if (movimento_interno) + { + fld(fields()-1).set_prompt(TR("@bCantiere di destinazione")); + + y+=2; + const int ystart = y++; + const int cms_prel_start = dlg; + if (use_fsc && fasinfo.parent() == LF_COMMESSE) + insert_anal_fields(*this, newpage, LF_FASI, y, dlg, dlgd, true); + else + insert_anal_fields(*this, newpage, LF_COMMESSE, y, dlg, dlgd, true); + if (use_fsc && fasinfo.parent() <= 0) + insert_anal_fields(*this, newpage, LF_FASI, y, dlg, dlgd, false); + add_button(dlg+1, newpage, TR("Generazione righe consegnate"), 2, y++, 32); + set_field_handler(dlg+1, movint_handler); + add_groupbox(DLG_NULL, newpage, TR("@bCantiere di prelievo"), 1, ystart, 78, y-ystart+1); + + for (short id = cms_prel_start; id < dlg; id++) + { + TEdit_field& f = efield(id); + const TFieldref* fld = f.field(); + if (fld) + { + if (fld->name() == DOC_CODCMS) + ((TFieldref*)fld)->set_name(DOC_COMMPREL); + if (fld->name() == DOC_FASCMS) + ((TFieldref*)fld)->set_name(DOC_FASEPREL); + } + } + } + +} + +void TDocumento_mask::configura_sheet(TSheet_field& sheet) +{ + TBit_array to_delete(MAX_COLUMNS); + to_delete.set(); + const TTipo_documento& tdoc = _doc.tipo(); + const TString_array& sheet_columns = tdoc.sheet_columns(); + const int ncols = sheet_columns.items(); + + TToken_string colonne; + int i; + + colonne = "0"; + for (i = 0; i < ncols; i ++ ) + { + TToken_string& sheet_col = (TToken_string&)sheet_columns.row(i); + const int field_id = sheet_col.get_int(0); + const int coltomove = sheet.cid2index(field_id); + to_delete.reset(coltomove); + + const TString80 descr(sheet_col.get(1)); + if (descr.not_empty() ) + sheet.set_column_header( field_id, descr); + + const int size = sheet_col.get_int(2) * 8; // XI_FU_MULTIPLE + if (size != 0) + sheet.set_column_width( field_id, size); + + if (field_id != FR_LORDO) + colonne.add(field_id); + if (field_id == FR_CODIVA && tdoc.is_costo()) + { + const int col = sheet.cid2index(FR_TIPODET); + + to_delete.reset(col); + colonne.add(col); + } + } + + to_delete.set(0L); + to_delete.reset(1); + + FOR_EACH_CONAI_CLASS(ct) + { + const short posc = conai_sottocat_id(ct); + const short posp = conai_peso_id(ct); + const int colc = sheet.cid2index(posc); + const int colp = sheet.cid2index(posp); + + if (conai_configured_class(ct)) + { + to_delete.reset(colc); + if (colonne.find(format("%d", posc)) < 0) + colonne.add(posc); + to_delete.reset(colp); + if (colonne.find(format("%d", posp)) < 0) + colonne.add(posp); + } + else + { + to_delete.set(colc); + int p = colonne.find(format("%d", posc)); + + if (p > 0) + p--; + if (p >= 0) + { + int p1 = p; + while (isdigit(colonne[p1])) + p1++; + if (colonne[p1] == '|') + p1++; + else + if (colonne[p] == '|') + p--; + const TString c(colonne.mid(p1)); + colonne.cut(p); + colonne << c; + } + + to_delete.set(colp); + p = colonne.find(format("%d", posp)); + + if (p > 0) + p--; + if (p >= 0) + { + int p1 = p; + while (isdigit(colonne[p1])) + p1++; + if (colonne[p1] == '|') + p1++; + else + if (colonne[p] == '|') + p--; + const TString c(colonne.mid(p1)); + colonne.cut(p); + colonne << c; + } + } + } + + if (!to_delete[sheet.cid2index(FR_CODDEP)]) + sheet.enable_column(FR_CODDEP, _ges_dep && _ges_mag); + if (!to_delete[sheet.cid2index(FR_CODMAG)]) + sheet.enable_column(FR_CODMAG, _ges_mag); + if (!to_delete[sheet.cid2index(FR_CODDEPC)]) + sheet.enable_column(FR_CODDEPC, _ges_dep && _ges_mag); + if (!to_delete[sheet.cid2index(FR_CODMAGC)]) + sheet.enable_column(FR_CODMAGC, _ges_mag); + to_delete.set(sheet.cid2index(FR_CODARTMAG)); + to_delete.set(sheet.cid2index(FR_CHECKED)); + + if (_ges_ca) + { + const TMultilevel_code_info& cdc = ca_multilevel_code_info(LF_CDC); + const TMultilevel_code_info& cms = ca_multilevel_code_info(LF_COMMESSE); + const TMultilevel_code_info& fas = ca_multilevel_code_info(LF_FASI); + const int levels = cdc.levels() + cms.levels() + fas.levels(); + for (short cid = FR_CDC1; cid <= FR_CDC12; cid++) + { + const int level = cid-FR_CDC1; + to_delete.set(sheet.cid2index(cid), level >= levels); + if (level < levels) + colonne.add(cid); + } + } + + for ( i = MAX_COLUMNS - 1; i >= 0; i-- ) + { + if (to_delete[i]) + { + sheet.enable_column( i + FIRST_FIELD, false); + sheet.delete_column( i + FIRST_FIELD); + } + } + + if (!sheet.user_saved_columns_order()) + sheet.set_columns_order(&colonne); +} + +TCond_vendita& TDocumento_mask::condv() const +{ + if (_condv == NULL) + { + TDocumento_mask* myself = (TDocumento_mask*)this; + myself->_condv = new TCond_vendita(myself, NULL); + } + return *_condv; +} + +void TDocumento_mask::update_progs(bool stop_run) +{ + static bool updating_progs = false; + + if (!updating_progs) + { + updating_progs = true; + TWait_cursor hourglass; + const int page = curr_page(); + const int last_field = fields() - 1; + + for (int f = last_field; f >= 0; f--) + { + const TMask_field & mf = fld(f); + const int id = mf.dlg(); + const int field_page = mf.page(); + + if ((page == field_page || stop_run) && id > BASE_PIEDE) + { + const TFieldref* recfld = mf.field(); + if (recfld != NULL) + { + const TString & name = recfld->name(); + const TString& val = doc().get(name); + set(id, val, true); + } + } + } + updating_progs = false; + } +} + +void TDocumento_mask::next_page(int p) +{ + TMask::next_page(p); + + if (is_calculated_page(curr_page())) + update_progs(); +} + +void TDocumento_mask::start_run() +{ + /* cassato il macchinaro + TSmart_card * s = smartcard(); + + if (s != NULL) + { + if (edit_mode() && s->with_card(*this)) + disable(DLG_SAVEREC); + if (s->card_connected()) + { + disable(F_CODCF); + disable(F_RAGSOC); + s->disable_prot_fields(*this); + if (s->with_card(*this)) + enable(DLG_SAVEREC); + + smartcard_error err = s->read(); + if (err == no_smarterror) + s->card2mask(*this); + else + s->display_error(err); + } + } + */ + TVariable_mask::start_run(); +} + +bool TDocumento_mask::stop_run(KEY key) +{ + if (key != K_ESC && key != K_QUIT) + update_progs(true); +/* Cassato il macchinaro + else + if (key == K_ESC) + { + TSmart_card * s = smartcard(); + + if (s != NULL) + { + if (s->card_connected()) + { + s->disconnect_card(); + enable(F_CODCF); + enable(F_RAGSOC); + } + } + } +*/ + return TVariable_mask::stop_run(key); +} + +bool TDocumento_mask::on_key(KEY key) +{ + if (key == K_SHIFT + K_F12) + { + TRelation r(LF_DOC); + r.curr()=doc(); + bool can_save = !doc().bloccato() && !doc().chiuso(); + if (can_save && ::user_can_write(&r)) + { + TMask_field& stato = field(F_STATO); + stato.enable(); + enable(DLG_SAVEREC); + enable(DLG_DELREC); + xvtil_statbar_set(TR("Modifica")); +/* + TSmart_card * s = smartcard(); + if (s != NULL && s->card_connected()) + s->enable_prot_fields(*this); +*/ + } + else + warning_box("L'utente %s non puo' modificare questo documento", + (const char*)user()); + return TRUE; + } + else + if (key == K_F7) + { + const TSheet_field & sf = sfield(F_SHEET); + TDocumento & d = doc(); + TRiga_documento & riga = d[sf.selected() + 1]; + TOriginal_row_mask sm; + const TRectype * or_row = riga.find_original_rdoc(); + + if (or_row != NULL) + { + sm.set(F_DACODNUM, or_row->get(RDOC_CODNUM)); + sm.set(F_DAANNO, or_row->get(RDOC_ANNO)); + sm.set(F_DAPROVV, or_row->get(RDOC_PROVV)); + sm.set(F_DANDOC, or_row->get(RDOC_NDOC)); + sm.set(F_DANRIGA, or_row->get(RDOC_NRIGA)); + sm.disable(-1); + } + + if (sm.run() == K_ENTER && sm.field(F_DACODNUM).enabled()) + { + TToken_string key(sm.get(F_DACODNUM)); + key.add(sm.get(F_DAANNO)); + key.add(sm.get(F_DAPROVV)); + key.add(sm.get(F_DANDOC)); + key.add(sm.get(F_DANRIGA)); + + const TRectype & or_row_mod = cache().get(LF_RIGHEDOC, key); + if (or_row_mod.empty()) + riga.reset_original_rdoc_key(); + else + riga.set_original_rdoc_key(or_row_mod); + } + return true; + } + + return TVariable_mask::on_key(key); +} + +void TDocumento_mask::occ2mask() +{ + const TOccasionale& o = doc().occas(); + + reset(F_COFI); + reset(F_PAIVA); + set(F_OCFPI, o.get(OCC_CFPI)); + const TString & ragsoc = o.get(OCC_RAGSOC); + set(F_RAGSOC, ragsoc); + set(F_RAGSOCSP, ragsoc); + const TString & indir = o.get(OCC_INDIR); + set(F_INDCF, indir); + set(F_INDSP, indir); + const TString & civ = o.get(OCC_CIV); + set(F_CIVCF, civ); + set(F_CIVSP, civ); + const TString & cap = o.get(OCC_CAP); + set(F_CAPCF, cap); + set(F_CAPSP, cap); + const TString & com = o.get(OCC_COM); + set(F_COMCF, com); + set( F_COMSP, com); + const TString & stato = o.get(OCC_STATO); + set(F_STATOCF, stato); + set( F_STATOSP, stato); + if (id2pos(F_CODINDSP) >= 0) + reset(F_CODINDSP); + // Sugli occasionali non c'è la località + const TString & localita = o.get(OCC_LOCALITA); + set(F_LOCALITACF, localita); + set(F_LOCALITASP, localita); + check_field(F_COMSP); + check_field(F_STATOSP); +} + +// Proposta automatica contratto +void TDocumento_mask::contr2mask() +{ + const TCli_for& c = doc().clifor(); + const TRectype& ven_rec = c.vendite(); + + const bool gescontr = ven_rec.get_bool(CFV_GESTCONTR) && ini_get_bool(CONFIG_DITTA, "ve", "GES", false, 2); + enable(F_CODCONT, gescontr); + enable(F_DESCONT, gescontr); + + if (gescontr && insert_mode()) + { + const TDate datadoc = get(F_DATADOC); + TString str; + str << CONDV_TIPO << "=C " << CONDV_TIPOCF << '=' << c.tipo() << ' ' << CONDV_CODCF << '=' << c.codice(); + TString query; + query << "USE CONDV\nFROM " << str << "\nTO " << str; + TISAM_recordset contr(query); + + str.cut(0); + for (bool ok = contr.move_first(); ok; ok = contr.move_next()) + { + const TDate data_ini = contr.get(CONDV_VALIN).as_date(); + const TDate data_fin = contr.get(CONDV_VALFIN).as_date(); + if (datadoc.between(data_ini, data_fin)) + { + str = contr.get(CONDV_COD).as_string(); + break; + } + } + set(F_CODCONT, str, 0x3); + } +} + +void TDocumento_mask::set_or_def(short id, const TString& val) +{ + TMask_field* fld = find_by_id(id); + if (fld != NULL) + { + if (val.blank()) + { + const TString_array& def = doc().tipo().get_defaults(); + const TString* str = (const TString*)def.objptr(id); + if (str != NULL && str->full()) + fld->set(*str); + else + fld->reset(); + } + else + fld->set(val); + } +} + +void TDocumento_mask::cli2mask(bool force_load) +{ + const TCli_for& c = doc().clifor(); + + const bool onload = !is_running(); + + // Setta i campi che appartengono al file LF_CLIFO + const bool occas = c.occasionale(); + + show(F_OCCASEDIT, occas); + if (!occas) + reset(F_OCFPI); + show(F_OCFPI, occas); + // In forse per l'Occasionale, sicuri per il Normale + show(F_COFI, !occas); + show(F_STATOPAIVA, !occas); + show(F_PAIVA, !occas); + set(F_RAGSOC, c.get(CLI_RAGSOC)); + enable(F_RAGSOC, !occas); + + const TRectype& ven_rec = c.vendite(); + + if (force_load || !onload) + { + short pos = id2pos(F_CODVAL); + const TString4 codval = c.get(CLI_CODVAL); // Attenzione: Non usare TString& qui! + + if (pos >= 0) + set(F_CODVAL, codval, TRUE); + pos = id2pos(F_CODVAL1); + if (pos >= 0) + set(F_CODVAL1, codval, TRUE); + pos = id2pos(F_CODLIN); + if (pos >= 0 && fld(pos).active()) + fld(pos).set(c.get(CLI_CODLIN)); + set(F_CODPAG, c.get(CLI_CODPAG)); + + TToken_string key; + key.add(c.get(CLI_TIPOCF)); + key.add(c.get(CLI_CODCF)); + key.add("V"); + key.add("1"); + + const TRectype& cfban = cache().get(LF_CFBAN, key); + TString80 iban; + + if (cfban.empty() || id2pos(F_CODABIA1) < 0) + { + hide(-GR_APPOGGIOCLI); + show(-GR_APPOGGIO); + if (cfban.empty()) + { + set(F_CODABIA, c.get(CLI_CODABI)); + set(F_CODCABA, c.get(CLI_CODCAB), 0x2); + iban = c.get(CLI_IBAN); + } + else + { + set(F_CODABIA, cfban.get(CFBAN_ABI)); + set(F_CODCABA, cfban.get(CFBAN_CAB), 0x2); + iban = cfban.get(CFBAN_IBAN); + } + } + else + { + hide(-GR_APPOGGIO); + show(-GR_APPOGGIOCLI); + set(F_CODABIA1, cfban.get(CFBAN_ABI)); + set(F_CODCABA1, cfban.get(CFBAN_CAB), 0x2); + iban = cfban.get(CFBAN_IBAN); + } + if (id2pos(F_IBAN_STATO) > 0) + { + set(F_IBAN, iban); + if (iban.full()) + { + efield(F_IBAN_STATO).validate(K_TAB); + set(F_IBAN_STATO, iban.left(2)); + set(F_IBAN_CHECK, iban.mid(2,2)); + set(F_BBAN , iban.mid(4)); + set(F_BBAN_CIN , iban.mid(4,1)); + set(F_BBAN_ABI , iban.mid(5,5)); + set(F_BBAN_CAB , iban.mid(10,5)); + set(F_BBAN_CONTO, iban.mid(15,12)); + } + else + { + reset(F_IBAN_STATO); + reset(F_IBAN_CHECK); + reset(F_BBAN ); + reset(F_BBAN_CIN ); + reset(F_BBAN_ABI ); + reset(F_BBAN_CAB ); + reset(F_BBAN_CONTO); + } + } + + key.cut(0); + key.add(c.get(CLI_TIPOCF)); + key.add(c.get(CLI_CODCF)); + key.add("N"); + key.add("1"); + + const TRectype & cfbanpr = cache().get(LF_CFBAN, key); + + // Setta i campi che appartengono al file LF_CFVEN + if (cfbanpr.empty() || id2pos(F_CODABIP1) < 0) + { + hide(-GR_PRESENTCLI); + show(-GR_PRESENT); + if (cfbanpr.empty()/* || id2pos(F_CODABIP1) < 0*/) + { + set(F_CODABIP, ven_rec.get(CFV_CODABIPR), 0x3); + set(F_CODCABP, ven_rec.get(CFV_CODCABPR), 0x3); + } + else + { + set(F_CODABIP, cfbanpr.get(CFBAN_ABI), 0x3); + set(F_CODCABP, cfbanpr.get(CFBAN_CAB), 0x3); + set(F_PROGBNP, cfbanpr.get(CFBAN_PROGPR), 0x3); + } + } + else + { + hide(-GR_PRESENT); + show(-GR_PRESENTCLI); + set(F_CODABIP1, cfbanpr.get(CFBAN_ABI)); + set(F_CODCABP1, cfbanpr.get(CFBAN_CAB), 0x2); + set(F_PROGBNP1, cfbanpr.get(CFBAN_PROGPR)); + } + + set_or_def(F_RAGGR, ven_rec.get(CFV_RAGGDOC)); + set_or_def(F_RAGGREFF, ven_rec.get(CFV_RAGGEFF)); + set_or_def(F_CODINDSP, ven_rec.get(CFV_CODINDSP)); + set_or_def(F_CODAG, ven_rec.get(CFV_CODAG)); + set_or_def(F_CODAGVIS, ven_rec.get(CFV_CODAG1)); + set_or_def(F_CODSPMEZZO, ven_rec.get(CFV_CODSPMEZZO)); + set_or_def(F_CODPORTO, ven_rec.get(CFV_CODPORTO)); + set_or_def(F_CODNOTESP1, ven_rec.get(CFV_CODNOTESP1)); + set_or_def(F_CODNOTESP2, ven_rec.get(CFV_CODNOTESP2)); + set_or_def(F_CODNOTE, ven_rec.get(CFV_CODNOTE)); + set_or_def(F_CODVETT1, ven_rec.get(CFV_CODVETT1)); + set_or_def(F_CODVETT2, ven_rec.get(CFV_CODVETT2)); + set_or_def(F_CODVETT3, ven_rec.get(CFV_CODVETT3)); + set_or_def(F_SPESEINC, ven_rec.get(CFV_PERCSPINC)); + set_or_def(F_ADDBOLLI, ven_rec.get(CFV_ADDBOLLI)); + set_or_def(F_CATVEN, ven_rec.get(CFV_CATVEN)); + + const int alleg = c.get_int(CLI_ALLEG); + const bool ivadiff = (alleg == 7) && ven_rec.get_bool(CFV_FATTSOSP); + set(F_LIQDIFF, ivadiff ? "X" : ""); + + const TDate datadoc = doc().get(DOC_DATADOC); + const bool IVAxCassa = !ivadiff && (alleg < 5 || alleg == 7) && gestione_IVAxCassa(datadoc); + set(F_IVAXCASSA, IVAxCassa ? "X" : ""); + + pos = id2pos(F_CODLIST); + + const TString8 codlist = ven_rec.get(CFV_CODLIST); //ATTENZIONE: su file il CODLIST è 5 caratteri + if (pos >= 0 && fld(pos).active()) + { + TEdit_field & f = (TEdit_field&) fld(pos); + + f.set(codlist); + f.check(); + f.on_hit(); + } + set(F_CODZON, ven_rec.get(CFV_CODZONA), 0x3); + set(F_RAGGR, ven_rec.get(CFV_RAGGDOC)); + sconto_testa2mask(); + spese2mask(); + } + else + if (onload) + { + TToken_string key; + + key.add(c.get(CLI_TIPOCF)); + key.add(c.get(CLI_CODCF)); + key.add("V"); + key.add("1"); + + const TRectype & cfban = cache().get(LF_CFBAN, key); + + if (cfban.empty() || id2pos(F_CODABIA1) < 0) + { + show(-GR_APPOGGIO); + hide(-GR_APPOGGIOCLI); + } + else + { + show(-GR_APPOGGIOCLI); + hide(-GR_APPOGGIO); + } + key.cut(0); + key.add(c.get(CLI_TIPOCF)); + key.add(c.get(CLI_CODCF)); + key.add("N"); + key.add("1"); + + const TRectype & cfbanpr = cache().get(LF_CFBAN, key); + + if (cfbanpr.empty() || id2pos(F_CODABIP1) < 0) + { + show(-GR_PRESENT); + hide(-GR_PRESENTCLI); + } + else + { + show(-GR_PRESENTCLI); + hide(-GR_PRESENT); + } + } + enable( F_CODINDSP , !occas); + if (occas) + occ2mask(); + else + { + set(F_COFI, c.get(CLI_COFI)); + set(F_INDCF, c.get(CLI_INDCF)); + set(F_CIVCF, c.get(CLI_CIVCF)); + set(F_STATOPAIVA, c.get(CLI_STATOPAIV)); + set(F_PAIVA, c.get(CLI_PAIV)); + set(F_LOCALITACF, c.get(CLI_LOCCF)); + set(F_CAPCF, c.get(CLI_CAPCF)); + set(F_COMCF, c.get(CLI_COMCF)); + set(F_STATOCF, c.get(CLI_STATOCF)); + check_field( F_CODINDSP ); + } + const TString4 newcodval = get(F_CODVAL); + + short pos = id2pos(F_CAMBIO); + if ((pos >= 0) && newcodval.empty()) + fld(pos).reset(); + pos = id2pos(F_CODVAL); + if (pos >= 0 && fld(pos).active()) + fld(pos).check(STARTING_CHECK); + pos = id2pos(F_CODVAL1); + if (pos >= 0 && fld(pos).active()) + fld(pos).check(STARTING_CHECK); + check_field(F_COMCF); + check_field(F_STATOCF); + check_field( F_CODPAG ); + pos = id2pos(F_CODLIN); + if (pos >= 0 && fld(pos).active()) + fld(pos).check(); + pos = id2pos(F_CODLIST); + if (pos >= 0 && fld(pos).active()) + fld(pos).check(); + pos = id2pos(F_CODAG); + if (pos >= 0 && fld(pos).active()) + fld(pos).check(); + pos = id2pos(F_CODAGVIS); + if (pos >= 0 && fld(pos).active()) + fld(pos).check(); + + check_field( F_CODSPMEZZO ); + check_field( F_CODPORTO ); + check_field( F_CODNOTESP1 ); + check_field( F_CODNOTESP2 ); + check_field( F_CODNOTE ); + check_field( F_CODVETT1 ); + check_field( F_CODVETT2 ); + check_field( F_CODVETT3 ); + check_field( F_CATVEN ); + check_field( F_CODZON ); + + contr2mask(); + + if (gestione_note_per_articolo()) + send_key(K_F8, F_NAR, &field(F_CODCF)); + + // Accendi bottone mail se possibile + const TString& email = c.get(CLI_DOCMAIL); + enable(DLG_EMAIL, email.full()); +} + +void TDocumento_mask::sconto_testa2mask() +{ + const TCli_for& c = doc().clifor(); + + TConfig ditta(CONFIG_DITTA, "ve"); + const char tipogestione = ditta.get("GESSCO")[ 0 ]; + switch( tipogestione ) + { + case 'N': // Sconti non gestiti: pussa via! + break; + case 'P': // Percentuale su anagrafica cliente + set( F_SCONTOPERC, c.vendite().get(CFV_SCONTO)); + break; + case 'T': // Gestione tabella sconti + { + const TString16 codsconto(c.vendite().get(CFV_CODSCC)); + + if (codsconto.not_empty()) + { + TTable sconti("%SCC"); + sconti.setkey(1); + sconti.zero(); + sconti.put("CODTAB", codsconto); + if (sconti.read( ) == NOERR) + set(F_SCONTOPERC, sconti.get("S1")); + } + } + break; + case 'A': // Gestione archivio sconti + { + TString16 cod; + const TRectype & ven_rec = c.vendite(); + TLocalisamfile sconti(LF_SCONTI ); + + sconti.setkey(1); + sconti.zero(); + sconti.put("TIPO", "I"); + + if(ditta.get_bool("SCOKEY", "ve", 1)) + sconti.put("CODCAT", ven_rec.get(CFV_CATVEN)); + if(ditta.get_bool("SCOKEY", "ve", 2)) + cod.format("%-2s", (const char *)ven_rec.get(CFV_CODSCC)); + else + cod = " "; + if( ditta.get_bool("SCOKEY", "ve", 3)) + { + TString8 cz; cz.format("%-2s", (const char*)ven_rec.get(CFV_CODZONA)); + cod << cz; + } + else + cod << " "; + if( ditta.get_bool("SCOKEY", "ve", 4)) + cod << c.get(CLI_CODPAG); + sconti.put("CODART", cod); + if(sconti.read() == NOERR) + set(F_SCONTOPERC, sconti.get( "SCONTO")); + } + break; + default: + break; + } + return; +} + +void TDocumento_mask::spese2mask() +{ + TSheet_field & sh = (TSheet_field &) field(F_SHEET); + TCli_for & c = doc().clifor(); + + TString16 name("CODSP0"); + TString_array spese; + const TRectype & ven_rec = c.vendite(); + for (int i = 1; i <= 4; i++) + { + name.rtrim(1); name << i; + const TString16 s(ven_rec.get(name)); + + if (s.not_empty()) + spese.add(s); + } + + doc().put(DOC_SPESEUPD, false); + doc().put(DOC_CODVAL, get(F_CODVAL)); + doc().put(DOC_CAMBIO, get(F_CAMBIO)); +// doc().put(DOC_CONTROEURO, get(F_CONTROEURO)); + + doc().update_spese_aut(spese, false, &sh); + sh.force_update(); +} + +void TDocumento_mask::reset_masks(const TString& tipo_doc) +{ + static TString4 last_tipo_doc; + + if (tipo_doc != last_tipo_doc) + { + FOR_EACH_ASSOC_OBJECT(_maskriga, h, k, o) + { + TMask* m = (TMask*)o; + m->enable_default(); + if (!_sheet->exist_column(FR_PREZZO)) + m->hide(FR_PREZZO); + } + last_tipo_doc = tipo_doc; + } +} + +void TDocumento_mask::doc2mask(bool reload_clifo, bool force_load, bool update) +{ + for (int p = fields()-1; p >= 0; p--) + { + TMask_field& f = fld(p); + const TFieldref* fr = f.field(); + if (fr) + { + f.set(fr->read(doc())); + if (f.ghost() && !f.active()) + f.on_hit(); // Forza il MESSAGE COPY dei campi di testata come DOC_STATO + } +// else +// f.reset(); // Perché non lascio stare questi campi? + } + if (reload_clifo) + cli2mask(force_load); + else + { + if (force_load) + { + check_field(F_CODCF); + check_field(F_CODINDSP); + } +/* + if (id2pos(F_IBAN_STATO) > 0) + { + const TString80 iban = doc().get(DOC_IBAN); + set(F_IBAN, iban); + efield(F_IBAN_STATO).validate(K_TAB); + if (iban.not_empty()) + { + set(F_IBAN_STATO, iban.left(2)); + set(F_IBAN_CHECK, iban.mid(2,2)); + set(F_BBAN , iban.mid(4)); + set(F_BBAN_CIN , iban.mid(4,1)); + set(F_BBAN_ABI , iban.mid(5,5)); + set(F_BBAN_CAB , iban.mid(10,5)); + set(F_BBAN_CONTO, iban.mid(15,12)); + } + } +*/ + } + + if (id2pos(F_IBAN_STATO) > 0) + { + const TString80 iban = doc().get(DOC_IBAN); + set(F_IBAN, iban); + if (iban.full()) + { + set(F_IBAN_STATO, iban.left(2)); + set(F_IBAN_CHECK, iban.mid(2,2)); + set(F_BBAN , iban.mid(4)); + set(F_BBAN_CIN , iban.mid(4,1)); + set(F_BBAN_ABI , iban.mid(5,5)); + set(F_BBAN_CAB , iban.mid(10,5)); + set(F_BBAN_CONTO, iban.mid(15,12)); + efield(F_IBAN_STATO).validate(K_TAB); + } + else + { + reset(F_IBAN_STATO); + reset(F_IBAN_CHECK); + reset(F_BBAN ); + reset(F_BBAN_CIN ); + reset(F_BBAN_ABI ); + reset(F_BBAN_CAB ); + reset(F_BBAN_CONTO); + } + } + + + TSheet_field& s = sfield(F_SHEET); + s.destroy(); + const int righe = doc().physical_rows(); + for (int i = 0; i < righe; i++) + { + TRiga_documento & r = doc()[i + 1]; + + doc()[i+1].autoload(s); + s.check_row(i, 0x3); + if (r.tipo().tipo() == RIGA_PRESTAZIONI) + { + const TSpesa_prest & spesa = r.spesa(); + if (spesa.tipo() == 'V') + s.disable_cell(i, s.cid2index(FR_QTA)); + } + } + + reset_masks(get(F_TIPODOC)); + //aggiorna i colori delle righe e forza l'update dello sheet + if (update) + highlight(); +} + +void TDocumento_mask::mask2doc() +{ + for (int p = fields()-1; p >= 0; p--) + { + const TMask_field& f = fld(p); + const TFieldref* fr = f.field(); + if (fr) + fr->write(f.get(), doc()); + } +} + +bool TDocumento_mask::new_mask(int numriga) const +{ + const TRiga_documento& riga = doc()[numriga + 1]; + const TTipo_riga_documento& tiporiga = riga.tipo(); + TString16 name; tiporiga.mask_name(name); + + return _maskriga.objptr(name) == NULL; +} + +TVariable_mask* TDocumento_mask::riga_mask(int numriga) +{ + const TRiga_documento& riga = doc()[numriga + 1]; + const TTipo_riga_documento& tiporiga = riga.tipo(); + TString16 name; tiporiga.mask_name(name); + + TVariable_mask* m = (TVariable_mask*)_maskriga.objptr(name); + if (m == NULL) + { + m = new TVariable_mask(name); + m->set_handler(FR_TIPORIGA, tipo_riga_handler); + m->set_handler( FR_QTA, qta_handler ); + m->set_handler( FR_UMQTA, um_handler ); + m->set_handler( FR_DATACONS, dcons_handler); + + _maskriga.add(name, m); + + TList_field & htr = lfield(F_LBTIPORIGA); + const TString codes(htr.get_codes()); + const TString values(htr.get_values()); + + m->lfield(FR_TIPORIGA).replace_items(codes, values); + + int pos = m->id2pos(FR_CODART); + if (pos >= 0) + { + const TMask_field & f = m->fld(pos); + if (f.is_edit()) + { + TBrowse * browse = ((TEdit_field &) f).browse(); + const char tipo_r = tiporiga.tipo(); + + if (browse ) + { + const TCursor* cur = browse->cursor(); + if (cur) + { + const int num = cur->file().num(); + if (num == LF_ANAMAG || num == LF_CODCORR) + { + m->set_handler( FR_CODMAG, codmag_handler ); + m->set_handler( FR_CODMAGC, codmag_coll_handler ); + m->set_handler( FR_CODART, codart_handler ); + m->set_handler( FR_LIV1, liv_handler ); + m->set_handler( FR_LIV2, liv_handler ); + m->set_handler( FR_LIV3, liv_handler ); + m->set_handler( FR_LIV4, liv_handler ); + m->set_handler( FR_UMQTA, umart_handler ); + m->set_handler( FR_CODARTMAG, codartmag_handler ); + m->set_handler( FR_DESCR, descr_handler ); + m->set_handler( FR_QTA, qtaart_handler ); + if (livelli().autoinsert(1)) + m->field(FR_LIV1).check_type(CHECK_NONE); + if (livelli().autoinsert(2)) + m->field(FR_LIV2).check_type(CHECK_NONE); + if (livelli().autoinsert(3)) + m->field(FR_LIV3).check_type(CHECK_NONE); + if (livelli().autoinsert(4)) + m->field(FR_LIV4).check_type(CHECK_NONE); + } + else + if (tipo_r == RIGA_SPESEDOC || tipo_r == RIGA_PRESTAZIONI || + tipo_r == RIGA_RISORSE || tipo_r == RIGA_ATTREZZATURE) + m->set_handler( FR_CODART, sppr_handler ); + } + } + } + } + m->set_handler(FR_QTAEVASA, qta_evasa_handler); + m->set_handler(FR_CAUS, causmag_handler); + + if (m->id2pos(FR_CODIVA) >= 0) + { + m->set_handler(FR_CODIVA, iva_handler); + const TString& tipiva = doc().tipo().tipi_iva_validi(); + if (tipiva.not_empty()) + { + TBrowse& browse = *(m->efield(FR_CODIVA)).browse(); + TString filter = browse.get_filter(); + + bool close_filter = FALSE; + if (filter.not_empty()) + { + filter.insert("("); + filter << ")&&("; + close_filter = TRUE; + } + bool firstor = TRUE; + for (int i = tipiva.len()-1; i >= 0; i--) if (tipiva[i] != ' ') + { + if (firstor) + firstor = FALSE; + else + filter << "||"; + filter << "(S1==\""; + switch(i) + { + case 1: filter << "VE"; break; + case 2: filter << "ES"; break; + case 3: filter << "NI"; break; + case 4: filter << "NS"; break; + default: break; + } + filter << "\")"; + } + if (close_filter) filter << ')'; + browse.set_filter(filter); + } + } + m->set_handler(DLG_USER, link_handler); + + // Quasi qualsiasi cosa analitica va bene + const bool ca_active = _ges_ca && !(riga.is_descrizione() || riga.is_sconto() /*|| riga.is_omaggio()*/); + if (ca_active) + { + const int page = m->win2page(m->fld(m->fields()-1).parent()); // Calcolo bastardo dell'ultima pagina + + TConfig& ini = ca_config(); + const TMultilevel_code_info& fasinfo = ca_multilevel_code_info(LF_FASI); + const bool use_fsc = fasinfo.levels() > 0; + + int y = 1; + int i; + short dlg = FR_CDC1; // id del primo campo da generare + short dlgd = FR_DESCDC1; + + _cdc_start_sh = _cdc_end_sh = -1 ; + _cms_start_sh = _cms_end_sh = -1 ; + for (i = 0; i < 2; i++) + { + const TString& level = ini.get("Level", NULL, i+1); // Legge il livello 1 o 2 + if (level == "CDC") // Crea centro di costo + { + if (_cdc_start_sh < 0) + { + _cdc_start_sh = dlg; + _cdc_end_sh = dlg + ca_multilevel_code_info(LF_CDC).levels()-1; + } + if (use_fsc && fasinfo.parent() == LF_CDC) + insert_anal_fields(*m, page, LF_FASI, y, dlg, dlgd, false); + else + insert_anal_fields(*m, page, LF_CDC, y, dlg, dlgd, false); + m->set_handler( _cdc_end_sh, cdc_mag_handler); + + } else + if (level == "CMS") // Crea commessa + { + if (_cms_start_sh < 0) + { + _cms_start_sh = dlg; + _cms_end_sh = dlg + ca_multilevel_code_info(LF_COMMESSE).levels()-1; + } + if (use_fsc && fasinfo.parent() == LF_COMMESSE) + insert_anal_fields(*m, page, LF_FASI, y, dlg, dlgd, false); + else + { + insert_anal_fields(*m, page, LF_COMMESSE, y, dlg, dlgd, false); + } + m->set_handler(_cms_end_sh, cms_mag_handler); + } + } + if (use_fsc && fasinfo.parent() <= 0) + insert_anal_fields(*m, page, LF_FASI, y, dlg, dlgd, false); + } + + TFilename proname; tiporiga.profile_name(proname); + TConfig pro( proname, "HANDLERS" ); + TAssoc_array& handlers = pro.list_variables(); + FOR_EACH_ASSOC_STRING(handlers, obj, key, str) + { + int id = 0, hd = 0; + if (*key == 'H' && strchr(str, '|') == NULL) // Provo a gestire il caso Handler(105) = 3 + { + const TFixed_string k(key); + id = atoi(k.after('(')); + hd = atoi(str); + } + else // Provo a gestire il caso 1 = 105|3 + { + const TToken_string riga = str; + riga.get(0, id); + riga.get(1, hd); + } + if (id >= DLG_USER && hd > 0) + user_set_row_handler(*m, id, hd); + } + + if (m->id2pos(FR_PREZZO) >= 0) + { + TEditable_field& f = (TEditable_field&)m->efield(FR_PREZZO); + f.reset_driver(F_CODVAL); + f.add_driver(-F_CODVAL); + } + + if (m->id2pos(FR_IMPFISSO) >= 0) + { + TEditable_field& f = m->efield(FR_IMPFISSO); + f.reset_driver(); // Perche' qui non c'e' scritto f.reset_driver(F_CODVAL) ? + f.add_driver(-F_CODVAL); + } + + FOR_EACH_CONAI_CLASS(type) + { + const short posc = conai_sottocat_id(type); + const short posp = conai_peso_id(type); + if (conai_configured_class(type)) + { + m->show(posc); + m->set_handler(posc, sottocat_conai_handler); + m->show(posp); + m->set_handler(posp, peso_conai_handler); + } + else + { + m->hide(posc); + m->hide(posp); + } + } + + // Impostiamo gli eventuali drivers + FOR_EACH_MASK_FIELD((*m), i, f) if (f->is_edit()) + ((TEdit_field*)f)->test_drivers(); + } + m->set_sheet(&sfield(F_SHEET)); + return m; +} + +void TDocumento_mask::update_giacenza() +{ + if (id2pos(F_CURGIAC)<0 || !is_running()) + return; + + TSheet_field& sf = sfield(F_SHEET); + TToken_string& row = sf.row(sf.selected()); + TString80 codart = row.get(sf.cid2index(FR_CODARTMAG)); + if (codart.blank()) + { + reset(F_CURGIAC); + reset(F_CURDISP); + return; + } + + TString16 livello; + const int db_liv = doc().tipo().dbliv(); + + for (int i = 0; i < 4; i++) + { + const char* liv = row.get(sf.cid2index(FR_LIV1+i)); + + if (*liv > ' ') + livello << liv; + else + break; + } + + TString8 causmag = row.get(sf.cid2index(FR_CAUS)); + if (causmag.blank()) + causmag = get(F_CAUSMAG); + + if (causmag.full()) + { + const TCausale_magazzino& c = cached_causale_magazzino(causmag); + + _fconv_qta = UNO; + if (c.scarica_alternativi()) + { + const TString& alt = cached_article(codart).get(ANAMAG_CODARTALT); + if (alt.full()) + codart = alt; + } + if (db_liv > 0) + { + const int expl_row = doc().tipo().dbrow()-1; // Sul file .ini l'indice parte da 1! + if (expl_row >= 0) // Evito esplosioni inutili in primis + { + TDistinta_tree db; + TArray components; + db.set_root(codart, "", 1, livello); + + const int items = db.explode(components, false, RAGGR_EXP_NONE, db_liv); + if (items > 0 && expl_row < items) // Controllo se la riga esplosione desiderata e' valida + { + const TRiga_esplosione& r = (const TRiga_esplosione &)components[expl_row]; + codart = r.articolo(); // Cambio il codice articola da elaborare + _fconv_qta = r.val(); + } + } + } + } + + real giac, disp; + TString8 codmag = row.get(sf.cid2index(FR_CODMAG)); + + if (codmag.full()) + { + const TString4 coddep = row.get(sf.cid2index(FR_CODDEP)); + if (coddep.full()) + codmag << coddep; + } + else + { // Cerca di determinare il magazzino di default, se manca sulla riga + if (causmag.full()) + { + const TCausale_magazzino& c = cached_causale_magazzino(causmag); + if (c.has_default_mag()) + { + codmag = c.default_mag(); + if (c.has_default_dep()) + codmag << c.default_dep(); + } + } + } + + TString4 annoes = get(F_ANNO); + //const TDate data_giac = get(F_DATADOC); // Porta a comportamenti strani a cavallo di chiusura esercizio + const TDate data_giac(TODAY); + if (data_giac.ok()) + { + TEsercizi_contabili esc; + annoes.format("%04d", esc.date2esc(data_giac)); + } + + TArticolo_giacenza& art = cached_article_balances(codart); + + giac = art.disponibilita(annoes, codmag, livello, TRUE); + disp = art.disponibilita(annoes, codmag, livello, FALSE); + + if (db_liv == 0) + { + const TString4 um = row.get(sf.cid2index(FR_UMQTA)); + art.convert_to_um(giac, um); + art.convert_to_um(disp, um); + } + set(F_CURGIAC, giac.string()); + set(F_CURDISP, disp.string()); +} + +/////////////////////////////////////////////////////////// +// Handlers and notifiers +/////////////////////////////////////////////////////////// + +bool TDocumento_mask::ss_handler(TMask_field& f, KEY key) +{ + bool ok = true; + if (key == K_ENTER && !f.empty()) + { + const TSheet_field& ss = (TSheet_field&)f; + TDocumento_mask& mask = (TDocumento_mask&)ss.mask(); + + const short cme = mask.cms_end(); + // Se la commessa in testata è vuota controllo che sia presente sulle righe + if (cme > 0 && mask.efield(cme).empty()) + { + // Controllo se la commessa è veramente obbligatoria in base alla configurazione + TConfig& ini = ca_config(); + if ((ini.get_int("Authorizations") & 0x6) && (ini.get_bool("CmsRequired") || ini.get("FathFasi").full())) + { + const short cmes = mask.cms_end_sh(); + if (cmes > 0) // Puo' succedere che sia < 0 in assenza di righe buone + { + const int col = ss.cid2index(cmes); + FOR_EACH_SHEET_ROW(ss, r, riga) + { + if (ss.cell_enabled(r, col)) + { + const char* cms = riga->get(col); + if (!(cms && *cms > ' ')) + { + ss.error_box(FR("La commessa è obbligatoria alla riga %d"), r+1); + break; + } + } + } + } + } + } + if (ini_get_bool(CONFIG_DITTA, "ve", "LIVPERART")) + { + const TString& causmag = mask.get(F_CAUSMAG); + const TCausale_magazzino& c = cached_causale_magazzino(causmag); + if (c.sgn(s_giac) != 0) // Controlla il livello solo per movimenti della giacenza + { + TCodice_articolo codart, livgiac; + FOR_EACH_SHEET_ROW(ss, r, riga) + { + codart = riga->get(ss.cid2index(FR_CODART)); + livgiac = riga->get(ss.cid2index(FR_LIV1)); + if (codart.full() && livgiac.blank()) + { + const TArticolo& art = ::cached_article(codart); + if (art.get_bool(ANAMAG_LIVPERART)) + { + ok = ss.error_box("Il livello di giacenza è obbligatorio per l'articolo %s alla riga %d", + (const char*)codart, r+1); + break; + } + } + } + } + } + } + return ok; +} + +bool TDocumento_mask::ss_notify( TSheet_field& ss, int r, KEY key ) +{ + static bool selecting = false; + + TDocumento_mask& m = (TDocumento_mask&)ss.mask(); + TDocumento& doc = m.doc(); + + switch (key) + { + case K_ENTER: // modifica + { + TRiga_documento& riga = doc[r + 1]; + riga.autosave(ss); + + if (m.is_calculated_page(m.curr_page())) + m.update_progs(); + m.highlight_row(r); + if (doc.tipo().check_double_art()) + { + const int rows = doc.physical_rows(); + const TCodice_articolo codart = riga.get(RDOC_CODART); + for (int i = 1; i <= rows; i++) + if (i != r + 1 && codart == doc[i].get(RDOC_CODART)) + if (!yesno_box(FR("L'articolo %s è presente alla riga %d, si desidera continuare?"), (const char*)codart, i)) + return false; + } + } + break; + case K_CTRL + K_ENTER: // inizio modifica + { + const TRiga_documento& riga = doc[r + 1]; + m.codcms_sh() = riga.get(RDOC_CODCMS); + } + case K_DEL: // Cancellazione + { + doc.destroy_row(r + 1, TRUE); + if (r < doc.rows()) + { + TRiga_documento& riga = doc[r + 1]; + if (riga.is_omaggio() && riga.is_generata()) + { + ss.destroy(r + 1); + doc.destroy_row(r + 1, true); + } + } + doc.dirty_fields(); + if (m.is_calculated_page(ss.page())) + m.update_progs(); + } + break; + case K_INS: // Inserimento + { + if (r < doc.rows()) + { + TRiga_documento & riga = doc[r + 1]; + if (riga.is_omaggio() && riga.is_generata()) + { + const bool enabled = ss.cell_enabled(r, 0); + + if (!enabled) ss.enable_row(r); + ss.force_update(r); + ss.select(r); + m.send_key(K_CTRL + '+', 0); + if (!enabled) ss.disable_row(r); + ss.force_update(r); + return false; + } + } + doc.insert_row(r + 1, m.get( F_LBTIPORIGA )); + } + break; + case K_CTRL + K_INS: + { + TRiga_documento& riga = doc[r + 1]; + TRectype& ven_rec = doc.clifor().vendite(); + TString8 s = ven_rec.get(CFV_CODMAG); + const TTipo_riga_documento & t = riga.tipo(); + + if (s.full()) + { + s.left_just(3); + s << ven_rec.get(CFV_CODDEP); + } + else + { + s = m.get(F_CAUSMAG); + if (s.full()) + { + const TCausale_magazzino& c = cached_causale_magazzino(s); + if (!c.empty() && c.get_char("S10") > ' ') // Ignora magazzini non validi + s = c.get("S10"); + else + { + s = m._std_mag; + s.left_just(3); + s << m._std_dep; + } + } + } + if (s.full()) + riga.put(RDOC_CODMAG, s); + + riga.autoload(ss); + ss.check_row(r); + t.set_defaults(ss, r + 1); + m.highlight_row(r); + } + break; + case K_TAB: // ingresso nella riga + if (!selecting && m.is_running()) + { + const TRiga_documento& rdoc = doc[r + 1]; + TMask& riga_mask = ss.sheet_mask(); + + if (r < doc.physical_rows()) + { + m.update_giacenza(); + const TRectype& rdoc = doc[r + 1]; + set_curr_um(rdoc.get(RDOC_UMQTA)); + const bool on = rdoc.get(RDOC_DACODNUM).full(); + riga_mask.enable(DLG_USER, on); + } + const bool merce = TRiga_documento::tipo(riga_mask.get(FR_TIPORIGA)).is_merce(); + const bool artmag = merce && riga_mask.get(FR_CODARTMAG).full(); + + riga_mask.show(FR_UMQTA, artmag); + riga_mask.show(FR_UMQTA2, !artmag); + + if (rdoc.get(RDOC_CODART).empty() && rdoc.get(RDOC_DESCR).empty()) + { + selecting = true; // semaforo per impedire l'evento di selezione doppio + ss.select(r, 1, false); + selecting = false; + } + + if (m.gestione_note_per_articolo()) + m.send_key(K_F8, F_NAR, &ss); + } + break; + case K_CTRL + K_TAB: // uscita dalla riga + { + TToken_string& row = ss.row(r); + const TCodice_articolo codart = row.get(ss.cid2index(FR_CODART)); + bool check_art = codart.full(); + if (check_art) + { + const TArticolo& rec = cached_article(codart); + check_art = rec.get_bool(ANAMAG_LIVPERART) && ini_get_bool(CONFIG_DITTA, "ve", "LIVPERART"); + } + + if (check_art) + { + TCodice_articolo livello; + for (int l = 0; l<4 ; l++) + doc.livelli().pack_grpcode(livello, row.get(ss.cid2index(FR_LIV1+l)), l+1); + + if (livello.full()) + { + TLocalisamfile fl(LF_MULTIREL); + TRectype& r = fl.curr(); + + r.put(MULTI_COD, "ARTLV"); + r.put(MULTI_FIRST, codart); + r.put(MULTI_SECOND, livello); + + TRectype new_rec(r); + if (fl.read() != NOERR) + { + bool ok = yesno_box("Il codice di giacenza %s non è legato all'articolo %s.\nSi desidera legarlo?", + (const char*)livello, (const char*)codart); + if (ok) + { + r = new_rec; + const int err = new_rec.write(fl); + if (err != NOERR) + ok = error_box("Impossibile legare il codice di giacenza. Errore %d", err); + } + return ok; + } + } + else + { + // Controlla obbligatorietà del livello solo per movimenti della giacenza + TString8 codcaus = row.get(ss.cid2index(FR_CAUS)); + if (codcaus.blank()) + codcaus = m.get(F_CAUSMAG); + if (codcaus.full()) + { + const TCausale_magazzino& caus = ::cached_causale_magazzino(codcaus); + if (caus.sgn(s_giac) != 0) + return error_box(FR("Il codice giacenza è obbligatorio per l'articolo %s"), + (const char*)codart); + } + } + } + } + break; + default: + break; + } + return true; +} + +// Funzione che dato il profilo di riga ottiene la maschera +// Serve per ottenere una maschera diversa per ogni riga +TMask* TDocumento_mask::ss_getmask(int numriga, TMask& fullmask) +{ + TSheet_field* sf = fullmask.get_sheet(); + TDocumento_mask& m = (TDocumento_mask&)sf->mask(); + const TDocumento& doc = m.doc(); + + if (numriga < doc.physical_rows()) + return m.riga_mask(numriga); + return &fullmask; +} + +bool TDocumento_mask::occas_code_handler(TMask_field& f, KEY key) +{ + TMask& m = f.mask(); + if (key == K_TAB && (f.dirty() || !m.is_running())) + { + const TString& code = f.get(); + if (code.full()) + { + TRelation occas(LF_OCCAS); + occas.curr().put(OCC_CFPI, code); + if (occas.read(_isequal) == NOERR) + { + m.autoload(occas); + m.send_key(K_TAB, O_COMUNE); // Forza decodifica comuni + m.send_key(K_TAB, O_COMUNENAS); + } + } + } + return true; +} + +bool TDocumento_mask::occas_cfpi_handler(TMask_field& f, KEY key) +{ + if (key == K_ENTER) + { + const TMask& om = f.mask(); + if (om.field(O_COFI).empty() && om.field(O_PAIV).empty()) + return f.error_box(TR("E' necessario specificare il codice fiscale o la partita IVA")); + } + return true; +} + +bool TDocumento_mask::occas_handler( TMask_field& f, KEY key ) +{ + TDocumento_mask & m = (TDocumento_mask &)f.mask(); + if ( key == K_SPACE && m.is_running( ) ) + { + TDocumento& doc = m.doc(); + TOccasionale& occ = doc.occas(); + + TMask occas_mask("ve0100o"); + occas_mask.set_handler(O_CODICE, occas_code_handler ); + occas_mask.set_handler(O_COFI, occas_cfpi_handler ); + occas_mask.set_handler(O_PAIV, occas_cfpi_handler ); + + for (int i = occas_mask.fields() - 1; i >= 0; i--) + { + TMask_field& f = occas_mask.fld(i); + const TFieldref* c = f.field(); + if (c) + f.set(c->read(occ)); + } + + const TString& cf = occas_mask.get(O_COFI); + if (cf.full() && atoi(cf.mid(9, 2)) > 40) + occas_mask.set(O_SESSO, "F"); + + if (occas_mask.run() != K_ESC) + { + const TString ocfpi(occas_mask.get(O_CODICE)); + doc.put(DOC_OCFPI, ocfpi); + m.set(F_OCFPI, ocfpi); + + for (int i = occas_mask.fields() - 1; i >= 0; i--) + { + const TMask_field& f = occas_mask.fld(i); + const TFieldref* c = f.field(); + if (c) + { + const char* val = f.get(); + c->write(val, occ); + } + } + m.occ2mask(); + } + f.set_focus( ); + } + return TRUE; +} + +bool TDocumento_mask::clifo_handler( TMask_field& f, KEY key ) +{ + if (key != K_ENTER && f.to_check(key, true)) + { + TDocumento_mask& m = (TDocumento_mask&)f.mask(); + TDocumento& d = m.doc(); + + const TTipo_documento& tdoc = d.tipo(); + d.put(DOC_TIPOCF, tdoc.tipocf()); + d.put(DOC_CODCF, f.get()); + + const TCli_for& cli_for = d.clifor(true); // force reload + if ( cli_for.get_bool(CLI_SOSPESO) ) + return f.error_box( "Il codice '%ld' e' sospeso e non puo' essere utilizzato", atol(f.get())); + + m.cli2mask(); + + if (m.id2pos(F_CODCONT) >= 0) + { + TEdit_field & e = m.efield(F_CODCONT); + if (e.active()) + { + e.set_dirty(); + e.check(); + e.on_hit(); + } + } + + if (cli_for.occasionale()) + { + const TOccasionale& occas = d.occas(); + if(m.id2pos(F_OCCASEDIT) > 0 && f.to_check(key) && occas.codice().blank()) + m.send_key( K_SPACE, F_OCCASEDIT ); // Lancia maschera occasionali + } + else + d.zero(DOC_OCFPI); + } + return true; +} + +void TDocumento_mask::highlight_row(int row, COLOR back, COLOR fore, bool dirty, bool update) +{ + TRiga_documento& rigadoc = doc()[row + 1]; + TSheet_field& sf = sfield(F_SHEET); + +// COLOR back = COLOR_INVALID, fore = COLOR_INVALID; + + FOR_EACH_ARRAY_ITEM_BACK(color_rules(), rule, o) + { + TColor_rule& expr = *(TColor_rule*)o; + bool on = false; + if (rule == 0) + on = rigadoc.linked(); // Regola standard + else + { + expr.set_row(&rigadoc); + // SET VARS + const int vars = expr.numvar(); + TString name; + for (int i = 0; i < vars; i++) + { + name = expr.varname(i); + if (name.starts_with("DIRTY")) + expr.setvar(i, dirty ? UNO : ZERO); + else + if (name.starts_with("#")) + { + const short id = atoi(name.mid(1)); + if (id > 0) + { + TToken_string& sheet_row = sf.row(row); + expr.setvar(i, sheet_row.get(sf.cid2index(id))); + } + else + expr.setvar(i, get(-id)); + } + else + if (name.starts_with("33.") || name.starts_with("DOC.")) + { + const TString& fldname = name.after('.'); + expr.setvar(i, doc().get(fldname)); + } + else + { + const TString& fldname = name.find('.') > 0 ? name.after('.') : name; + expr.setvar(i, rigadoc.get(fldname)); + } + } + on = expr.as_bool(); + } + if (on) + { + expr.colors(back, fore); + break; + } + } + + sf.set_back_and_fore_color(back, fore, row); + if (update) + sf.force_update(row); +} + +void TDocumento_mask::highlight() +{ + TSheet_field& sf = sfield(F_SHEET); + FOR_EACH_SHEET_ROW(sf, i, r) + highlight_row(i, COLOR_INVALID, COLOR_INVALID, false, false); + sf.force_update(); +} + +/////////////////////////////////////////////////////////// +// TLista_elaborazioni +/////////////////////////////////////////////////////////// + +class TLista_elaborazioni : public TObject // velib04 +{ + TAssoc_array * _elab; + +protected: + void read(); + +public: + TElaborazione & operator [](const char * key) const; + int select(TString_array & result, const char * tipo_iniziale = NULL, const char * stato_iniziale = NULL, const char * tipo_finale = NULL, const char * stato_finale = NULL); + void update(); + TLista_elaborazioni() : _elab(NULL) {} + virtual ~TLista_elaborazioni(); +}; + +void TLista_elaborazioni::read() +{ + if (_elab == NULL) + { + _elab = new TAssoc_array(); + + TTable eld("%ELD"); + + for (int err = eld.first(); err == NOERR; err = eld.next()) + { + TElaborazione* el = NULL; + switch (eld.curr().get_int("I0")) + { + case _esterna : + el = new TElaborazione_esterna(eld.curr()); + break; + case _consegna_ordini: + el = new TConsegna_ordini(eld.curr()); + break; + case _fatturazione_bolle : + el = new TFatturazione_bolle(eld.curr()); + break; + case _contabilizzazione : + el = new TContabilizzazione(eld.curr()); + break; + case _copia_documento : + el = new TCopia_documento(eld.curr()); + break; + case _generazione_effetti : + el = new TGenerazione_effetti(eld.curr()); + break; + case _consuntivazione_produzione : + el = new TConsuntivazione_produzione(eld.curr()); + break; + case _contabilizzazione_analitica : + el = new TContabilizzazione_analitica(eld.curr()); + break; + default : + break; + } + if (el != NULL) + _elab->add(el->codice(), el); + } + } +} + +int TLista_elaborazioni::select(TString_array & result, const char * tipo_iniziale, const char * stato_iniziale, const char * tipo_finale, const char * stato_finale) +{ + read(); + _elab->restart(); + result.destroy(); + for (TElaborazione* el = (TElaborazione*)_elab->get(); el != NULL; el = (TElaborazione*)_elab->get()) + { + bool ok = false; + if ((tipo_iniziale && *tipo_iniziale) && (stato_iniziale && *stato_iniziale)) + { + for (int i = 0; !ok && i < TElaborazione::_max_tipi_doc_elab; i++) + { + const char si = el->stato_iniziale(i); + const TString& ti = el->tipo_iniziale(i); + ok |= ti == tipo_iniziale && si == *stato_iniziale; + } + } + else + ok = true; + if ((tipo_finale && *tipo_finale) && (stato_finale && *stato_finale)) + ok &= el->tipo_finale() == tipo_finale && el->stato_finale() == stato_finale; + if (ok) + result.add(el->codice()); + } + result.sort(); + return result.items(); +} + +TElaborazione& TLista_elaborazioni::operator[](const char * key) const +{ + ((TLista_elaborazioni *)this)->read(); + return (TElaborazione&)(*_elab)[key]; +} + +void TLista_elaborazioni::update() +{ + delete _elab; _elab = NULL; + read(); +} + +TLista_elaborazioni::~TLista_elaborazioni() +{ + if (_elab) + delete _elab; +} + +/////////////////////////////////////////////////////////// +// Filtro per articolo +/////////////////////////////////////////////////////////// + +static TCodice_articolo _art_filter; + +static bool rdoc_article_filter(const TRectype& rdoc) +{ + bool good = rdoc.get(RDOC_CODART) == _art_filter; + if (good) + good = !rdoc.get_bool(RDOC_RIGAEVASA); + return good; +} + +static bool doc_article_filter(const TRelation* rel) +{ + bool yes = false; + const TRectype& doc = rel->curr(); + + TLocalisamfile rdoc(LF_RIGHEDOC); rdoc.setkey(5); + rdoc.put(RDOC_CODART, _art_filter); + rdoc.put(RDOC_CODNUM, doc.get(DOC_CODNUM)); + rdoc.put(RDOC_ANNO, doc.get(DOC_ANNO)); + rdoc.put(RDOC_PROVV, doc.get(DOC_PROVV)); + rdoc.put(RDOC_NDOC, doc.get(DOC_NDOC)); + + for (int err = rdoc.read(); err == NOERR; err = rdoc.next()) + { + const TString& codart = rdoc.get(RDOC_CODART); + if (codart != _art_filter || rdoc.get(RDOC_NDOC) != doc.get(DOC_NDOC)) + break; + if (rdoc_article_filter(rdoc.curr())) + { + yes = true; + break; + } + } + return yes; +} + +/////////////////////////////////////////////////////////// +// TDocument_tree +/////////////////////////////////////////////////////////// + +class TDocument_tree : public TBidirectional_tree +{ + TRelation* _relation; + TCursor* _cursor; + TToken_string _curnode; + bool _multiple_selection; + TAssoc_array _selected_docs; + TString _selected; + +protected: + virtual void node2id(const TObject* node, TString& id) const; + bool on_head() const; + bool on_row() const; + + void format_field(const TRectype& rec, const TString& field, TString& str) const; + void append_custom_fields(const TTipo_documento& tipo, const TRectype& rec, TString& str) const; + +public: + void multiple_selection(bool on); + bool multiple_selection() const { return _multiple_selection;} + bool node_selected(const TObject* node = NULL) const; + void select_node(const TObject* node = NULL, bool on = true); + bool toggle_all_nodes(); + + real select_doc(long numdoc); + void build_doc_list(TLista_documenti & docs); + void unselect_node(const TObject* node) { select_node(node, false);} + virtual bool goto_root(); + virtual bool goto_firstson(); + virtual bool goto_rbrother(); + virtual bool goto_node(const TString &id); + virtual bool could_have_son() const; + virtual bool has_son() const; + virtual bool has_rbrother() const; + virtual bool has_father() const; + virtual bool has_lbrother() const; + virtual bool goto_father(); + virtual bool goto_lbrother(); + virtual TObject* curr_node() const { return &(TToken_string&)_curnode; } + virtual bool get_description(TString& str) const; + virtual TImage* image(bool selected) const; + + void select(TString & id) { _selected = id;} + const TString & selected() const { return _selected;} + + const TRectype& testata() const; + const TRectype& riga() const; + const TRectype& record() const; + const real totale_doc() const { TDocumento d(testata()); return d.totale_doc();} + + void set_cursor(char tipocf, long codcf, int anno, const TString& codnum, + const char* filter, bool allow_zero_cf); + TCursor* get_cursor() { return _cursor; } + + TDocument_tree(); + ~TDocument_tree(); +}; + +const TRectype& TDocument_tree::testata() const +{ + TDocument_tree& me = (TDocument_tree&)*this; + const TRecnotype pos = me._curnode.get_long(0); + if (_cursor->pos() != pos || _relation->curr(LF_RIGHEDOC).empty()) + *me._cursor = pos; + return _relation->curr(); +} + +const TRectype& TDocument_tree::riga() const +{ + TDocument_tree& me = (TDocument_tree&)*this; + const TRectype& rec = _relation->curr(LF_RIGHEDOC); + const TRecnotype pos = me._curnode.get_long(0); + const int nriga = me._curnode.get_int(1); + if (_cursor->pos() != pos || rec.get_int(RDOC_NRIGA) > nriga) + *me._cursor = pos; + for (int i = rec.get_int(RDOC_NRIGA); i < nriga; i++) + _relation->next_match(LF_RIGHEDOC); + return rec; +} + +const TRectype& TDocument_tree::record() const +{ + return on_row() ? riga() : testata(); +} + +void TDocument_tree::node2id(const TObject* node, TString& id) const +{ + id = *(TString*)node; +} + +bool TDocument_tree::on_head() const +{ + TDocument_tree& me = (TDocument_tree&)*this; + return me._curnode.get_int(1) == 0; +} + +bool TDocument_tree::on_row() const +{ + TDocument_tree& me = (TDocument_tree&)*this; + return me._curnode.get_int(1) > 0; +} + +void TDocument_tree::multiple_selection(bool on) +{ + _multiple_selection = on; + if (!_multiple_selection) + _selected_docs.destroy(); + +} + +bool TDocument_tree::node_selected(const TObject* node) const +{ + TToken_string id; + + if (node == NULL) + node = curr_node(); + + node2id(node, id); + id = id.get(0); + return _selected_docs.is_key(id); +} + +void TDocument_tree::select_node(const TObject* node, bool on) +{ + if (node == NULL) + node = curr_node(); + + TToken_string id; + node2id(node, id); + id = id.get(0); + if (on) + _selected_docs.add(id); + else + _selected_docs.remove(id); + select(id); +} + +bool TDocument_tree::toggle_all_nodes() +{ + bool on = _selected_docs.empty() && _multiple_selection; + _selected_docs.destroy(); + if (on) + { + for (bool ok = goto_root(); ok; ok = goto_rbrother()) + select_node(NULL, on); + on = !_selected_docs.empty(); + } + return on; +} + +static bool find_doc(TTree& tree, void* jolly, word flags) +{ + TDocument_tree& t = (TDocument_tree&)tree; + if (!t.node_selected() && t.testata().get_long(DOC_NDOC) == *((long*)jolly)) + { + t.select_node(); + return true; + } + return false; +} + +real TDocument_tree::select_doc(long numdoc) +{ + real val; + if (goto_root() && scan_depth_first(find_doc, &numdoc, SCAN_PRE_ORDER | SCAN_IGNORING_LEAVES)) + val = totale_doc(); + return val; +} + +static bool add_to_list(TTree& tree, void* jolly, word flags) +{ + TDocument_tree & t = (TDocument_tree &) tree; + if (t.node_selected()) + { + TLista_documenti & docs = *((TLista_documenti *) jolly); + docs.add(new TDocumento(t.testata())); + } + return false; +} + +void TDocument_tree::build_doc_list(TLista_documenti & docs) +{ + if (goto_root()) + scan_depth_first(add_to_list, &docs, SCAN_PRE_ORDER | SCAN_IGNORING_LEAVES); +} + +bool TDocument_tree::goto_root() +{ + const bool ok = _cursor != NULL && _cursor->items()>0; + _curnode = ok ? "0" : ""; + *_cursor = 0; + return ok; +} + +// Fundamental method working also when _art_filter.full() +bool TDocument_tree::goto_firstson() +{ + bool ok = has_son(); + if (ok) + { + int nriga = 1; + if (_art_filter.full()) + { + const TRectype& rec = _relation->curr(LF_RIGHEDOC); + nriga = rec.get_int(RDOC_NRIGA); + } + _curnode.add(nriga,1); + } + return ok; +} + +// Fundamental method working also when _art_filter.full() +bool TDocument_tree::goto_rbrother() +{ + bool ok = has_rbrother(); + if (ok) + { + if (on_head()) + { + const long pos = _curnode.get_long(0); + _curnode.add(pos+1, 0); + } + else + { + const int nriga = _curnode.get_int(1); + _curnode.add(nriga+1, 1); + } + } + return ok; +} + +bool TDocument_tree::goto_node(const TString &id) +{ + _curnode = id; + return true; +} + +// Drawing speedup +bool TDocument_tree::could_have_son() const +{ return on_head(); } + +// Fundamental method working also when _art_filter.full() +bool TDocument_tree::has_son() const +{ + bool ok = could_have_son(); + if (ok) + { + testata(); + const TRectype& rec = _relation->curr(LF_RIGHEDOC); + ok = rec.get_int(RDOC_NRIGA) > 0; + if (_art_filter.full()) + { + ok = rdoc_article_filter(rec); + while (!ok && _relation->next_match(LF_RIGHEDOC)) + ok = rdoc_article_filter(rec); + } + } + return ok; +} + +// Fundamental method working also when _art_filter.full() +bool TDocument_tree::has_rbrother() const +{ + bool ok = false; + if (on_head()) + { + long pos = 0; _curnode.get(0, pos); + ok = pos < _cursor->items()-1; + } + else + { + riga(); // Posizionati sulla riga corrente + if (_art_filter.full()) + { + const TRectype& rec = _relation->curr(LF_RIGHEDOC); + while (!ok && _relation->next_match(LF_RIGHEDOC)) + ok = rdoc_article_filter(rec); + } + else + ok = _relation->next_match(LF_RIGHEDOC); + } + return ok; +} + +// Pleonastic method working also when _art_filter.full() +bool TDocument_tree::has_father() const +{ return on_row(); } + +// Pleonastic method not working when _art_filter.full() +bool TDocument_tree::has_lbrother() const +{ + bool ok = false; + if (on_head()) + { + long pos = 0; _curnode.get(0, pos); + ok = pos > 0L; + } + else + { + int nriga = 0; _curnode.get(1, nriga); + ok = nriga > 1; + } + return ok; +} + +// Pleonastic method not working when _art_filter.full() +bool TDocument_tree::goto_father() +{ + bool ok = on_row(); + if (ok) + _curnode.add(0, 1); + return ok; +} + +// Pleonastic method not working when _art_filter.full() +bool TDocument_tree::goto_lbrother() +{ + bool ok = has_lbrother(); + if (ok) + { + if (on_head()) + { + const long pos = _curnode.get_long(0); + _curnode.add(pos-1, 0); + } + else + { + const int nriga = _curnode.get_int(1); + _curnode.add(nriga-1, 1); + } + } + return ok; +} + +void TDocument_tree::format_field(const TRectype& rec, const TString& field, TString& str) const +{ + const TFieldref fld(field, rec.num()); + const TString& value = fld.read(rec); + const TFieldtypes ft = rec.type(fld.name()); + if (ft == _realfld) + { + const int len = rec.length(fld.name()); + const int ndec = rec.ndec(fld.name()); + TString8 pic; pic.format(".%d", ndec); + const real r(value); + str = r.string(pic); + str.right_just(len); + } + else + str = value; +} + +void TDocument_tree::append_custom_fields(const TTipo_documento& tipo, const TRectype& rec, TString& str) const +{ + const TString& format = rec.num() == LF_DOC ? tipo.stringa_descrizione_documento() + : tipo.stringa_descrizione_riga(); + if (format.not_empty()) + { + str << ' '; + int ch = -1; + TString tmp; + for (int ap = format.find('{'); ap >= 0; ap = format.find('{', ch+1)) + { + str << format.sub(ch+1, ap); + ch = format.find('}', ap); + const TString16 field = format.sub(ap+1, ch); + if (!field.blank()) + { + format_field(rec, field, tmp); + str << tmp; + } + } + str << format.mid(ch+1); + } +} + +TImage* TDocument_tree::image(bool selected) const +{ + if (on_row()) + { + const TRectype& rec = riga(); + if (rec.get_bool(RDOC_RIGAEVASA)) + return get_res_icon(10203); + } + else + { + if (multiple_selection()) + { + const bool sel = node_selected(); + if (sel) + { + if (selected) + return get_res_image(BMP_DIRDNSEL); + else + return get_res_image(BMP_DIRSEL); + } + } + } + return TTree::image(selected); +} + +bool TDocument_tree::get_description(TString& str) const +{ + if (on_head()) + { + const TRectype& rec = testata(); + str = rec.get(DOC_ANNO); + str << ' ' << rec.get(DOC_CODNUM); + TString16 tmp; + tmp.format("%6ld", rec.get_long(DOC_NDOC)); + str << ' ' << tmp << ' ' << rec.get(DOC_DATADOC); + const char tipocf = rec.get_char(DOC_TIPOCF); + const long codcf = rec.get_long(DOC_CODCF); + tmp.format(" %c%6ld ", tipocf, codcf); + str << tmp; + tmp.format("%c|%6ld", tipocf, codcf); + str << cache().get(LF_CLIFO, tmp, CLI_RAGSOC); + str.left_just(63); + + const TString& tipodoc = rec.get(DOC_TIPODOC); + const TTipo_documento& tipo = cached_tipodoc(tipodoc); + append_custom_fields(tipo, rec, str); + } + else + { + const TRectype& rec = riga(); + const TRectype& testata = _relation->curr(); + + const TString80 codart = rec.get(RDOC_CODART); + str = codart; + str.left_just(21); + str << rec.get(RDOC_DESCR).left(30); + str.left_just(52); + + const TString& tipodoc = testata.get(DOC_TIPODOC); + const TTipo_documento& tipo = cached_tipodoc(tipodoc); + if (codart.not_empty()) + { + const real qta = rec.get_real(tipo.field_qta()); + str << qta.string("###.###.##@,@@@"); + + if (tipo.is_ordine()) + { + const real qta_evasa = rec.get_real(tipo.field_qtaevasa()); + const real residuo = qta_evasa < qta ? (qta-qta_evasa) : ZERO; + str << residuo.string("###.###.##@,@@@"); + } + append_custom_fields(tipo, rec, str); + } + } + return true; +} + +void TDocument_tree::set_cursor(char tipocf, long codcf, int anno, const TString& codnum, const char* filter, bool allow_zero_cf) +{ + if (_relation == NULL) + { + _relation = new TRelation(LF_DOC); + _relation->add(LF_RIGHEDOC, "PROVV==PROVV|ANNO==ANNO|CODNUM==CODNUM|NDOC==NDOC"); + } + + TRectype& rec = _relation->curr(); + rec.zero(); + rec.put(DOC_PROVV, "D"); + rec.put(DOC_ANNO, anno); + rec.put(DOC_CODNUM, codnum); + + int key = 0; // Chiave di ordinamento ignota al momento + TString filtro = filter; + if (allow_zero_cf) + { + // In assenza di anno cambio chiave del cursore (4-9-2014) + key = anno > 2000 ? 1 : 5; // PROVV+ANNO+CODNUM+NDOC oppure PROVV+CODNUM+ANNO+NDOC + filtro << "&&(STR((CODCF=0)||(CODCF=" << codcf << ")))"; + } + else + { + key = 4; // TIPOCF+CODCF+ANNO+CODNUM+NDOC + rec.put(DOC_TIPOCF, tipocf); + rec.put(DOC_CODCF, codcf); + if (anno <= 2000 && codnum.full()) // In assenza di anno azzero CODNUM che è già nel filtro (4-9-2014) + rec.zero(DOC_CODNUM); + } + + if (_cursor != NULL) + delete _cursor; + _cursor = new TCursor(_relation, filtro, key, &rec, &rec); + if (_art_filter.full()) + _cursor->set_filterfunction(doc_article_filter); + else + _cursor->set_filterfunction(NULL); + + const long items = _cursor->items(); + _cursor->freeze(true); + + goto_root(); + if (items == 1) + expand_all(); +} + +TDocument_tree::TDocument_tree() + : _relation(NULL), _cursor(NULL), _multiple_selection(false) +{ } + +TDocument_tree::~TDocument_tree() +{ + if (_cursor) + delete _cursor; + if (_relation) + delete _relation; +} + +/////////////////////////////////////////////////////////// +// TElabora_mask +/////////////////////////////////////////////////////////// + +class TElabora_mask : public TAutomask +{ + TDocumento_mask* _main; + TLista_elaborazioni _elab; + TDocument_tree _tree; + int _check_fld; + + TElaborazione* _last_elab; + +// @access Protected Member +protected: + void add_valuta_filter(TString& filter) const; + + void docrif_search(); + int update_list(); + void update_ndoc_filter(bool is_tipo_elaborazione = FALSE); + + virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); + +// @access Public Member +public: + bool elabora(); + TElaborazione* curr_elab(); + + // @cmember Costruttore (crea la maschera leggendo la descrizione dal file .msk) + TElabora_mask(TDocumento_mask& main_mask); + // @cmember Distruttore + virtual ~TElabora_mask() {} +}; + +bool TElabora_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) +{ + switch (o.dlg()) + { + case F_CODART: + case F_CODNUM_ELAB: + if (e == fe_modify) + update_ndoc_filter(); + break; + case F_UMQTA: + if (e == fe_init || e == fe_modify) + { + int dec = 5; + if (!o.empty()) + { + const TRectype& um = cache().get("%UMS", o.get()); + if (!um.empty() && um.get_bool("B0")) // Ha dei decimali specificati? + dec = um.get_int("I0"); + } + ((TReal_field&)field(F_QTA)).set_decimals(dec); + } + break; + case F_TYPE: + if (e == fe_init || e == fe_modify) + { + int ne = update_list(); + if (e == fe_init && ne == 0) // Riprova a cambiare flag e ricostruire la lista + { + set(F_TYPE, "X"); + ne = update_list(); + if (ne == 0) + set(F_TYPE, ""); + } + update_ndoc_filter(true); + const bool add_to_doc = o.get().full(); + TElaborazione * e = curr_elab(); + const bool external = e != NULL && e->tipo() == _esterna; + const bool is_search = o.get().empty() || field(F_CODCF_ELAB).empty() || external || add_to_doc; + + o.mask().field(F_NDOC_ELAB).check_type(is_search ? CHECK_SEARCH : CHECK_NORMAL); + _tree.multiple_selection(add_to_doc); + + bool check_tot = false; + if (add_to_doc) + { + if (_check_fld < -1) + { + _check_fld = -1; + const TPointer_array& handlers = _main->doc().tipo().handlers(); + FOR_EACH_ARRAY_ITEM_BACK(handlers, id, hnd) + { + if (long(hnd) == 2) // 2 = totdoc_handler + _check_fld = id; + } + } + check_tot = _check_fld >= 0; + } + if (!add_to_doc) + o.mask().set(F_TOTSEL, ""); + o.mask().show(-GRP_CHK, check_tot); + if (check_tot) + o.mask().set(F_TOTVAL, _main->get(_check_fld)); + } + break; + case F_STATODOC_ELAB: + case F_TIPODOC_ELAB: + if (e == fe_modify) + { + update_list(); + update_ndoc_filter(); + } + break; + case F_ELAB: + if (e == fe_modify) + update_ndoc_filter(true); + break; + case F_ANNO_ELAB: + if (e == fe_modify) + update_ndoc_filter(); + break; + case F_NUMDOCRIF_ELAB: + if (e == fe_button) + docrif_search(); + break; + case F_NDOC_ELAB: + if ((e == fe_modify || e == fe_close) && o.check_type() == CHECK_SEARCH && !o.empty()) + { + TToken_string key; + key.add("D"); key.add(get(F_ANNO_ELAB)); + key.add(get(F_CODNUM_ELAB)); key.add(o.get()); + const TRectype& rec = cache().get(LF_DOC, key); + bool ok = !rec.empty(); // Verifica esistenza documento + + if (ok) + { + TCursor* c = _tree.get_cursor(); + c->curr() = rec; + ok = c->test(_isequal) == NOERR; // Verifica compatibilità documento + } + if (!ok) + return error_box(((TEdit_field&)o).get_warning()); + } + if (e == fe_init || e == fe_modify) + { + const long ndoc = atol(o.get()); + + if (ndoc > 0L) + { + real val = _tree.select_doc(ndoc); + if (!val.is_zero()) + { + val += o.mask().get_real(F_TOTSEL); + o.mask().set(F_TOTSEL, val); + } + } + } + break; + case F_ROWS: + if (e == fe_modify && is_running()) + { + TString id; + _tree.curr_id(id); + _tree.select(id); + if (is_running() && !_tree.multiple_selection()) + { + TCursor* c = _tree.get_cursor(); + if (c != NULL && c->items() > 0) + { + const TRectype& head = _tree.testata(); + set(F_DATADOC_ELAB, head.get(DOC_DATADOC)); // Anch'essa nella chiave 2! + set(F_ANNO_ELAB, head.get(DOC_ANNO)); + set(F_CODNUM_ELAB, head.get(DOC_CODNUM), 2); // Check but not hit + set(F_NDOC_ELAB, head.get(DOC_NDOC)); + } + } + } + else + if (e == fe_button) + { + if (_tree.multiple_selection()) + { + const bool on = !_tree.node_selected(); + _tree.select_node(NULL, on); + if (_check_fld >= 0) + { + real val = get_real(F_TOTSEL); + if (on) + val += _tree.totale_doc(); + else + { + val -= _tree.totale_doc(); + if (_tree.testata().get_long(DOC_NDOC) == o.mask().get_long(F_NDOC_ELAB)) + o.mask().set(F_NDOC_ELAB, ""); + } + set(F_TOTSEL, val); + } + } + } + break; + case DLG_LINK: + if (e == fe_button) + { + _tree.goto_node(_tree.selected()); + const TRectype & rec = _tree.testata(); + + if (!rec.empty()) + { + TFilename tempfile; + tempfile.temp("ve0"); + tempfile.ext("ini"); + { + TConfig configfile(tempfile); + configfile.set("Action", "Modify", "Transaction"); + configfile.set("NDOC", rec.get(DOC_NDOC), "33"); + configfile.set(DOC_PROVV, rec.get(DOC_PROVV), "33"); + configfile.set(DOC_ANNO, rec.get(DOC_ANNO), "33"); + configfile.set(DOC_CODNUM, rec.get(DOC_CODNUM), "33"); + } + + TString commandline; + + commandline.format("ve0 -0 /i%s",(const char*)tempfile); + + TExternal_app ve(commandline); + ve.run(); + + remove_file(tempfile); + } + } + break; + case DLG_SELECT: + if (e == fe_button) + { + TTree_field& tf = tfield(F_ROWS); + if (tf.active() && _tree.multiple_selection()) + { + TWait_cursor hourglass; + const bool sel = _tree.toggle_all_nodes(); + if (_check_fld > DLG_NULL) + { + real tot; + for (bool ok = _tree.goto_root(); ok && sel; ok = _tree.goto_rbrother()) + tot += _tree.totale_doc(); + set(_check_fld, tot.string()); + } + tf.win().force_update(); + } + return false; + } + break; + default: + break; + } + return true; +} + +int TElabora_mask::update_list() +{ + TString_array elabs; + const TString& tipo = _main->get(F_TIPODOC); + const TString& stato = _main->get(F_STATO); + const TString& tipo_elab = get(F_TIPODOC_ELAB); + const TString& stato_elab = get(F_STATODOC_ELAB); + const bool from_elab = !get_bool(F_TYPE); + int items = 0; + + if (from_elab) + { + items = _elab.select(elabs, tipo, stato, "", "") ; + field(F_ANNO_ELAB).check_type(CHECK_REQUIRED); + } + else + { + field(F_ANNO_ELAB).check_type(CHECK_NONE); + items = _elab.select(elabs, tipo_elab, stato_elab, tipo, stato); + if (items == 0) + items = _elab.select(elabs, "", "", tipo, stato); + } + + TList_field & f = lfield(F_ELAB); + TToken_string codes; + TToken_string descrs; + for (int i = 0; i < items; i++) + { + const TElaborazione& e = _elab[elabs.row(i)]; + + if (!from_elab) + { + // AO20123: Impedire contabilizzazione all'indietro! + if (e.tipo() == _contabilizzazione || e.tipo() == _generazione_effetti) + continue; + } + + codes.add(e.codice()); + descrs.add(e.descrizione()); + } + + items = codes.items(); // Conta elementi veramente aggiunti + const bool ok = items > 0; + enable(DLG_OK, ok); + enable(F_ELAB, ok); + + if (codes != f.get_codes()) + f.replace_items(codes, descrs); + const TElaborazione* e = curr_elab(); + if (e != NULL && e->tipo() == _consegna_ordini) + show(-GRP_ART); + else + { + reset(-GRP_ART); + hide(-GRP_ART); + } + + return items; +} + +bool TElabora_mask::elabora() +{ + bool update_mask = false; + + TLista_documenti in; + TLista_documenti out; + TDocumento& app_doc = ((TDocumento_mask *)_main)->doc(); + const long numdoc = field(F_NDOC_ELAB).active() ? get_long(F_NDOC_ELAB) : app_doc.get_long(DOC_NDOC); + const bool update_header = get_bool(F_UPDATE_HEADER); + const bool from_elab = !get_bool(F_TYPE); + + TElaborazione* e = curr_elab(); + if (e == NULL) + return false; + + if (e->tipo() == _consegna_ordini) + { + TParametri_elaborazione& p = e->params(); + p.set("ARTICOLO", get(F_CODART)); + p.set("UM", get(F_UMQTA)); + p.set("QUANTITA", get(F_QTA)); + } + if (from_elab) + { + const char provv = get(F_PROVV_ELAB)[0]; + const int anno = get_int(F_ANNO_ELAB); + const TString& codnum = get(F_CODNUM_ELAB); + const TString& tipo = get(F_TIPODOC_ELAB); + const TString& stato = get(F_STATODOC_ELAB); + + if (anno <= 0 || codnum.blank() || tipo.blank() || stato.blank()) + return false; + + TDocumento* newdoc = new TDocumento(provv, anno, codnum, numdoc); + TDocumento& d = *newdoc; + + if (numdoc <= 0) + { + TDocumento::copy_data(d.head(), app_doc.head()); + d.put(DOC_TIPODOC, tipo); + d.put(DOC_STATO, stato); + + const TDate datadoc = d.get_date(DOC_DATADOC); + const TDate datainsc = d.get_date(DOC_DATAINSC); + const bool equal = !datainsc.ok() || datadoc == datainsc; + + d.put(DOC_DATADOC, get(F_DATADOC_ELAB)); + if (equal) + d.zero(DOC_DATAINSC); + + const TTipo_documento & t = d.tipo(); + + if (t.mov_mag()) + d.put(DOC_CAUSMAG, t.caus_mov()); + else + d.zero(DOC_CAUSMAG); + } + + in.add(app_doc); + out.add(d); + if (e->elabora(in, out, TDate(TODAY), true)) + { + if (out[0] != d) + out.rewrite(); + if (app_doc != in[0]) + { + in.rewrite(); + app_doc = in[0]; + update_mask = true; + } + } + delete newdoc; + } + else + { + _tree.build_doc_list(in); + if (in.items() == 0) + return false ; + char provv = get(F_PROVV_ELAB)[0]; + int anno = get_int(F_ANNO_ELAB); + const TString4 codnum = get(F_CODNUM_ELAB); + long ndoc = get_long(F_NDOC_ELAB); + + if (ndoc > 0L && !in.find(provv, anno, codnum, ndoc)) + { + TDocumento* d = new TDocumento(provv, anno, codnum, ndoc); + in.add(d); + } + if (update_header) + { + const TString4 tipo_doc=app_doc.get(DOC_TIPODOC); + const TString8 caus_mag=app_doc.get(DOC_CAUSMAG); + const long movmag = app_doc.get_long(DOC_MOVMAG); + const TDate datadoc = app_doc.get_date(DOC_DATADOC); + const TDate datainsc = app_doc.get_date(DOC_DATAINSC); + const TDate datapart = app_doc.get_date(DOC_DATAPART); + const TString8 orapart = app_doc.get(DOC_ORAPART); + const char stato = app_doc.stato(); + + TDocumento::copy_data(app_doc.head(), in[0].head()); + + app_doc.put(DOC_TIPODOC, tipo_doc); + app_doc.put(DOC_CAUSMAG, caus_mag); + app_doc.put(DOC_MOVMAG, movmag); + app_doc.put(DOC_DATADOC, datadoc); + app_doc.put(DOC_DATAINSC, datainsc); + app_doc.put(DOC_DATAPART, datapart); + app_doc.put(DOC_ORAPART, orapart); + app_doc.put(DOC_STATO, stato); + } + out.add(app_doc); + if (e->elabora(in, out, TDate(TODAY), true)) + { + if (out[0] != app_doc) + { + out.rewrite(); + app_doc.read(out[0].head()); + update_mask = true; + } + + // Aggiorna eventuale residuo da consegnare + if (e->tipo() == _consegna_ordini) + { + TParametri_elaborazione& p = e->params(); + set(F_QTA, p.get("QUANTITA")); + + // Azzera qtaevasa in ordini quadro for (int i = 0; i < in.items(); i++) { TDocumento& d = in[i]; @@ -3440,1136 +3471,1164 @@ bool TElabora_mask::elabora() rdoc->zero(td.field_qtaevasa()); } } - } - } - - in.rewrite(); - - // Toglie spunta ai documenti selezionati - _tree.toggle_all_nodes(); - } - const TString4 num_in = e->codice_numerazione_iniziale(); - set(F_CODNUM_ELAB, num_in); - set(F_NDOC_ELAB, ""); - set(F_NUMDOCRIF_ELAB, ""); - ((TDocumento_mask *)_main)->set_focus_field(F_SHEET); - } - - // Azzera l'anno in caso di ordini - if (in.items() > 0 && in[0].is_ordine() && !field(F_ANNO_ELAB).required()) - { - reset(F_ANNO_ELAB); - update_mask = true; - } - - if (update_mask) - update_ndoc_filter(); - - return update_mask; -} - -TElaborazione* TElabora_mask::curr_elab() -{ - const TString& cod_elab = get(F_ELAB); - return cod_elab.full() ? &_elab[cod_elab] : NULL; -} - -void TElabora_mask::add_valuta_filter(TString& filter) const -{ - TString4 valuta = get(F_CODVAL_ELAB); - if (::is_firm_value(valuta)) - { - filter << "((CODVAL==\"" << valuta << "\")"; - if (valuta.empty()) - valuta = TCurrency::get_firm_val(); - else - valuta.cut(0); - filter << "||(CODVAL==\"" << valuta << "\"))"; - } - else - filter << "(CODVAL==\"" << valuta << "\")"; -} - -void TElabora_mask::update_ndoc_filter(bool is_tipo_elaborazione) -{ - TString filter; - add_valuta_filter(filter); - - TElaborazione* e = curr_elab(); - const bool elab_changed = e != _last_elab; - _last_elab = e; - - const bool aggiungi_doc_att = get_bool(F_TYPE); - enable(-1, aggiungi_doc_att); - if (!aggiungi_doc_att && is_tipo_elaborazione ) - reset(-1); - - const bool enable_group_doc = e != NULL && e->tipo() != _generazione_effetti && e->tipo() != _contabilizzazione; - show(-GRP_DOC, enable_group_doc); - - enable(DLG_SELECT, aggiungi_doc_att && enable_group_doc); // Attiva la selezione multipla se possibile - - if (e != NULL) - { - if (aggiungi_doc_att) - { - bool agg_test = e->aggiorna_testata_se_vuoto(); - - if (agg_test) - { - const int nrighe = _main->doc().physical_rows(); - - for (int i = 1;agg_test && i <= nrighe; i++) - if (!_main->doc()[i].is_generata()) - agg_test = false; - } - - set(F_UPDATE_HEADER, agg_test ? "X" : ""); - const TString4 num_in = e->codice_numerazione_iniziale(); - if (elab_changed) - { - const TString4 tipo_in(e->tipo_iniziale(0)); - const char stato_in = e->stato_iniziale(0); - - set(F_CODNUM_ELAB, num_in, 0x2); - set(F_TIPODOC_ELAB , tipo_in, 0x2); - TString4 si; si << stato_in; - set(F_STATODOC_ELAB, si, 0x2); - - // Azzero anno di elaborazione quando ho a che fare con degli ordini - const TTipo_documento& tipodocin = cached_tipodoc(tipo_in); - if (tipodocin.is_ordine() && !field(F_ANNO_ELAB).required()) - reset(F_ANNO_ELAB); - } - - if (!field(F_TIPODOC_ELAB).empty()) - { - const TString4 tipo(get(F_TIPODOC_ELAB)); - TString80 td; td.format("&&(TIPODOC==\"%s\")", (const char *)tipo); - filter << td; - const TString& stato = get(F_STATODOC_ELAB); - if (stato.full()) - { - filter << "&&(STATO==\"" << stato << "\")"; - } - else - { - bool almost_one = false; - - for (int i = 0; i < TElaborazione::_max_tipi_doc_elab; i++) - { - const TString4 tipo_in(e->tipo_iniziale(i)); - const char stato_in = e->stato_iniziale(i); - - if (tipo == tipo_in && stato_in > '0') - { - if (almost_one) - filter << "||"; - else - filter << "&&("; - almost_one = TRUE; - - filter << "(STATO==\"" << stato_in << "\")"; - } - } - if (almost_one) - filter << ')'; - } - } - else - { - bool almost_one = false; - - for (int i = 0; i < TElaborazione::_max_tipi_doc_elab; i++) - { - const TString4 tipo_in(e->tipo_iniziale(i)); - if (tipo_in.full()) - { - if (almost_one) - filter << "||"; - else - filter << "&&("; - almost_one = true; - filter << "((TIPODOC==\"" << tipo_in << "\")"; - - const char stato_in[2] = { e->stato_iniziale(i), '\0' }; - if (stato_in[0] > '0') - filter << "&&(STATO==\"" << stato_in << "\")"; - filter << ')'; - } - } - if (almost_one) - filter << ')'; - } - } - else - { - const TString4 tipo_fin(e->tipo_finale()); - const TString4 stato_fin(e->stato_finale()); - - set(F_UPDATE_HEADER, ""); - filter << "&&"; - if (stato_fin != "0") - filter << '('; - filter << "(TIPODOC==\"" << tipo_fin << "\")"; - if (stato_fin != "0") - filter << "&&(STATO==\"" << stato_fin << "\"))"; - - if (is_tipo_elaborazione) - { - const TString4 num_fin = e->codice_numerazione_finale(); - set(F_CODNUM_ELAB, num_fin, 0x2); - set(F_TIPODOC_ELAB, tipo_fin, 0x2); - set(F_STATODOC_ELAB, stato_fin, 0x2); - } - } - } - - if (!field(F_CODNUM_ELAB).empty()) - filter << "&&(CODNUM==\""<< get(F_CODNUM_ELAB) << "\")"; - - _art_filter = get(F_CODART); - if (!aggiungi_doc_att || _art_filter.blank()) - _art_filter.cut(0); - - - /* Vedi sotto: copia cursore da albero - TBrowse& brew = *efield(F_NDOC_ELAB).browse(); - brew.set_filter(filter); - TCursor* cursor = brew.cursor(); - if (_art_filter.full() && aggiungi_doc_att) - cursor->set_filterfunction(doc_article_filter); - else - cursor->set_filterfunction(NULL); - */ - - TTree_field& tf = tfield(F_ROWS); - if (e != NULL /*&& !field(F_TIPODOC_ELAB).empty() */ ) // 18-10-2013 tolto test tipo documento vuoto - { - const char tipocf = get(F_TIPOCF_ELAB)[0]; - const TString& codnum = get(F_CODNUM_ELAB); - const bool allow_zero_cf = tipocf == 'F' && aggiungi_doc_att && codnum.full() && e->tipo() == _consegna_ordini; - _tree.set_cursor(tipocf, get_long(F_CODCF_ELAB), get_int(F_ANNO_ELAB), - codnum, filter, allow_zero_cf); - efield(F_NDOC_ELAB).browse()->replace_cursor(_tree.get_cursor()); - - tf.set_tree(&_tree); - - TToken_string header(256, '\n'); - header.add("Anno Num. N. Data Cli/For Ragione Sociale"); - header.add(" Codice Articolo Descrizione Riga "); - if (aggiungi_doc_att && e->tipo() == _consegna_ordini) - header << "Da Evadere Residuo"; - else - header << " Quantità"; - tf.set_header(header); - - if (aggiungi_doc_att) // GF20059 - { - TCursor& cur = *_tree.get_cursor(); - if (cur.items() == 1) // Propone l'unico documento possibile - { - cur = 0L; - const TRectype& curr = cur.curr(); - set(F_ANNO_ELAB, curr.get(DOC_ANNO)); - set(F_NDOC_ELAB, curr.get(DOC_NDOC)); - set(F_CODNUM_ELAB, curr.get(DOC_CODNUM), 0x2); // Check but not hit - set(F_DATADOC_ELAB, curr.get(DOC_DATADOC)); - } - else - reset(F_NDOC_ELAB); - } - } - else - tf.set_tree(NULL); - tf.win().force_update(); -} - -void TElabora_mask::docrif_search() -{ - TRectype filtrec(LF_DOC); - filtrec.put(DOC_TIPOCF, get(F_TIPOCF_ELAB)); - filtrec.put(DOC_CODCF, get(F_CODCF_ELAB)); - filtrec.put(DOC_PROVV, get(F_PROVV_ELAB)); - filtrec.put(DOC_ANNO, get(F_ANNO_ELAB)); - - TRelation rel(LF_DOC); - rel.add(LF_CLIFO, "TIPOCF==TIPOCF|CODCF==CODCF"); - TSorted_cursor cur(&rel, "TIPOCF|CODCF|PROVV|ANNO|CODNUM|NUMDOCRIF", "", 2, &filtrec, &filtrec); - TString flt(256); - if (!field(F_CODNUM_ELAB).empty()) - flt << "(CODNUM==\"" << get(F_CODNUM_ELAB) << "\")&&"; - if (!field(F_TIPODOC_ELAB).empty()) - flt << "(TIPODOC==\"" << get(F_TIPODOC_ELAB) << "\")&&"; - if (!field(F_STATODOC_ELAB).empty()) - flt << "(STATO==\"" << get(F_STATODOC_ELAB) << "\")&&"; - add_valuta_filter(flt); flt << "&&"; - TEdit_field& f = efield(F_NUMDOCRIF_ELAB); - if (!f.empty()) - flt << "(NUMDOCRIF==\"" << f.get() << "\")&&"; - flt.rtrim(2); // Togli gli ultimi && - - cur.setfilter(flt); - - TToken_string fields = "ANNO|CODNUM|TIPODOC|NUMDOCRIF|STATO|DATADOCRIF|DOC1|DOC2|DOC3|NDOC|20->RAGSOC"; - TCursor_sheet sheet(&cur, fields, - TR("Documento di riferimento"), - HR("Anno|Num.|Tipo|Docum.Rif.|Stato|Data@10|Docum.Rif.1|Docum.Rif.2|Docum.Rif.3|Documento|Ragione Sociale@50"), - 0, 1); - if (sheet.run() == K_ENTER) - { - const int nrifpos = fields.get_pos(DOC_NUMDOCRIF); - const TString16 nrif = sheet.row(-1).get(nrifpos); - f.set(nrif); - const int ndocpos = fields.get_pos(DOC_NDOC); - const long ndoc = sheet.row(-1).get_long(ndocpos); - set(F_NDOC_ELAB, ndoc); - const int codnumpos = fields.get_pos(DOC_CODNUM); - const TString4 codnum = sheet.row(-1).get(codnumpos); - set(F_CODNUM_ELAB, codnum, TRUE); - } -} - -TElabora_mask::TElabora_mask(TDocumento_mask& main_mask) - : TAutomask("ve0100b"), _main(&main_mask), _last_elab(NULL), _check_fld(-883) -{ - const TDate oggi(TODAY); - set(F_ANNO_ELAB, oggi.year()); //anno della datadoc proposta (risolve bug 0000331) - set(F_TIPOCF_ELAB, _main->get(F_TIPOCF)); - set(F_CODCF_ELAB, _main->get(F_CODCF)); - set(F_CODVAL_ELAB, _main->get(F_CODVAL)); -} - -bool TDocumento_mask::elabora_handler( TMask_field& f, KEY key ) -{ - if (key == K_SPACE) - { - TDocumento_mask& m = (TDocumento_mask&)f.mask(); - m.update_progs(); - if (!m.check_fields()) // Check values - return false; - - TElabora_mask* selection = new TElabora_mask(m); - bool do_checks = false; - const char stato_iniziale = m.doc().stato(); - m.update_father_rows(); - while (selection->run() == K_ENTER) //NON riportare modifiche dalla 3.1!! Già sistemato - { - m.mask2doc(); - const bool processed = selection->elabora(); - do_checks |= processed; - - if (m.doc().stato() != stato_iniziale) - break; - - if (processed) - { - m.doc2mask(false); - TSheet_field& ss = m.sfield(F_SHEET); - for (int i = 0; i < ss.items(); i++) - { - m.ss_notify(ss,i,K_TAB); - m.ss_notify(ss,i,K_SPACE); - m.ss_notify(ss,i,K_ENTER); - } - } - - if (!selection->get_bool(F_TYPE)) // non aggiunge al documento attuale - break; - } - if (do_checks) //NON riportare modifiche dalla 3.1!! Già sistemato - { - m.doc2mask(false); - // Provoca decodifiche necessarie - const int tutti = m.fields(); - int i; - for (i = 0; i < tutti; i++) - { - TMask_field& f = m.fld(i); - if (f.dlg() <= BASE_PIEDE) - f.check(STARTING_CHECK); - } - for (i = tutti-1; i >= 0; i--) - m.fld(i).set_dirty(FALSE); - } - m.update_father_rows(false); - delete selection; - } - return true; -} - -/////////////////////////////////////////////////////////// -// TDocumento_mask -/////////////////////////////////////////////////////////// - -bool TDocumento_mask::print_handler( TMask_field& f, KEY key ) -{ - if (key == K_SPACE) - { - switch (f.dlg()) - { - case DLG_EMAIL : app().mailto(); break; - case DLG_PREVIEW : app().preview(); break; - default : app().print(); break; - } - } - return true; -} - -void TDocumento_mask::set_field_handler(short fieldid, CONTROL_HANDLER handler) -{ - _handlers.add((TObject *)handler, fieldid); -} - -void TDocumento_mask::user_set_handler(short fieldid, int index) -{ - switch (index) - { - case 1: set_field_handler(fieldid, ora_hndl); break; - case 2: set_field_handler(fieldid, totdoc_hndl); break; - case 3: set_field_handler(fieldid, numdocrif_hndl); break; - case 4: - /* Cassato il macchinaro! - _smartcard = new TSmart_card(); - if (_smartcard->type() != no_smartcard) - { - set_field_handler(fieldid, smart_hndl); - set_handler(fieldid, universal_handler); - } - else - { - disable(fieldid); - delete _smartcard; - _smartcard = NULL; - } - */ - break; - case 5: set_field_handler(fieldid, dummy_hndl); break; - case 6: set_field_handler(fieldid, fido_hndl); break; - case 7: set_field_handler(fieldid, subappalto_hndl); break; - case 8: set_field_handler(fieldid, reportba8_hndl); break; - default: break; - } -} - -bool TDocumento_mask::call_handler( TMask_field& f, KEY key) -{ - const short id = f.dlg(); - CONTROL_HANDLER h = (CONTROL_HANDLER) _handlers.objptr(id); - if (h != NULL) - return h(f, key); - return true; -} - -bool TDocumento_mask::universal_handler( TMask_field& f, KEY key) -{ - TDocumento_mask& m = (TDocumento_mask&)f.mask(); - bool ok = m.call_handler(f, key); - - if (ok && key == K_TAB && f.focusdirty()) - { - const TFieldref* fr = f.field(); - if (fr != NULL && (fr->file() == 0 || fr->file() == LF_DOC)) - fr->write(f.get(), m.doc()); - - const int page = f.page(); - if (m.is_calculated_page(page)) - m.update_progs(); - } - - return ok; -} - -bool TDocumento_mask::anno_handler( TMask_field& f, KEY key) -{ - if (key == K_TAB && f.to_check(key, TRUE)) - app().update_navigation_bar(); - return true; -} - -static TString4 __codnum; - -bool tipodoc_ok(const TString & tipodoc) -{ - const TString4 module(main_app().name().left(2)); - const TTipo_documento& tipo = cached_tipodoc(tipodoc); - const TString & tipomod = tipo.module(); - - if (module == "ve" && tipomod.blank()) - return true; - return tipomod == module; -} - -bool tip_filter(const TRelation* r) -{ - if (__codnum.blank()) - return true; - const TCodice_numerazione & cod_num = cached_numerazione(__codnum); - const TString4 tipo = r->curr().get("CODTAB"); - - int last = cod_num.ntipi_doc(); - for (int i = 0; i < last; i++ ) - { - const TString & curtipo = cod_num.tipo_doc(i); - - if (curtipo == tipo && tipodoc_ok(curtipo)) - return true; - } - return false; -} - -bool TDocumento_mask::num_handler( TMask_field& f, KEY key) -{ - if (key == K_TAB && f.to_check(key, true)) - { - // Ottengo la maschera - TMask& m = f.mask(); - const TString & codnum = f.get(); - TCursor* cur = m.efield(F_TIPODOC).browse()->cursor(); - TCursor* descur = m.efield(F_DESTIPODOC).browse()->cursor(); - - __codnum = codnum; - if (codnum.full()) - { - const TCodice_numerazione & cod_num = cached_numerazione(codnum); - - m.set( F_DESNUM, cod_num.descrizione()); - // Propone il primo tipo di documento come default - if (m.field(F_TIPODOC).empty() || f.focusdirty()) - { - m.set( F_TIPODOC, cod_num.tipo_doc(0)); - m.send_key( K_TAB, F_TIPODOC ); - } - // Se per questa numerazione e' abilitata le numerazione provvisoria - if (cod_num.num_provv()) - { - // Setta di default la numerazione provvisoria - m.set( F_PROVV, "P" ); - // Abilita il campo per la selezione della numerazione - m.enable( F_PROVV ); - } - else // Altrimenti ... - { - // Setta la numerazione a definitiva - m.set( F_PROVV, "D" ); - // Disabilita il campo per la selezione della numerazione - m.disable( F_PROVV ); - } - } - else - { - m.set( F_DESNUM, "" ); - m.set( F_TIPODOC, "" ); - } - cur->set_filterfunction(tip_filter); - descur->set_filterfunction(tip_filter); - app().update_navigation_bar(); - } - return TRUE; -} - -bool TDocumento_mask::codlist_handler( TMask_field& f, KEY key ) -{ - if (key == K_TAB && f.focusdirty()) - { - TLocalisamfile & list = ((TEdit_field &) f).browse()->cursor()->file(); - const TDate datadoc(f.mask().get(F_DATADOC)); - const TDate datascad(list.get_date("VALFIN")); - - if (datascad.ok() && datadoc > datascad) - { - const TString16 codsucc(list.get("CODLISSUCC")); - - if (codsucc.empty()) - return error_box("Listino scaduto il %s", datascad.string()); - else - { - f.set(codsucc); - f.set_focusdirty(); - ((TEdit_field &)f).check(); - } - } - } - return true; -} - -bool TDocumento_mask::codcont_handler( TMask_field& f, KEY key ) -{ - if (key == K_TAB && f.focusdirty()) - { - TDocumento_mask& m = (TDocumento_mask&)f.mask(); - TLocalisamfile & cont = ((TEdit_field &) f).browse()->cursor()->file(); - const TDate datadoc(f.mask().get(F_DATADOC)); - const TDate datascad(cont.get_date(CONDV_VALFIN)); - - if (datascad.ok() && datadoc > datascad) - return error_box(FR("Contratto scaduto il %s"), datascad.string()); - - static bool __gesconcc = false; - static long __cntr_firm = -1L; - const long firm = prefix().get_codditta(); - if (firm != __cntr_firm) - { - __gesconcc = ini_get_bool(CONFIG_DITTA, "ve", "GESCONCC"); - __cntr_firm = firm; - } - - if (m.doc().tipo().load_cont() && f.get().full() && m.get_long(F_CODCF) > 0) - { - TSheet_field & s = m.sfield(F_SHEET); - - if (s.items() == 0) - { - TString select("TIPO='C' CATVEN=''"); - - if(__gesconcc) - select << " " << RCONDV_TIPOCF<< "='" << m.get(F_TIPOCF) <<"' " << RCONDV_CODCF << "=" << m.get_long(F_CODCF); - select << " " << RCONDV_COD << "=" << f.get(); - TString query("USE RCONDV SELECT "); - - query << RCONDV_TIPORIGA << "=='A'"; - query << "\nFROM " << select; - query << "\nTO " << select; - TISAM_recordset recset(query); - TString last_cod(20); - - for (bool ok = recset.move_first(); ok ; ok = recset.move_next()) - { - TRiga_documento & r = m.doc().new_row("01"); - const TString & cod = recset.get(RCONDV_CODRIGA).as_string(); - - if (cod != last_cod) - { - r.put(RDOC_CODART, cod); - - const int row = s.insert(-1, false); - s.row(row); - r.autoload(s); - s.check_row(row, 0x2); - r.autosave(s); - const TString & um = recset.get(RCONDV_UM).as_string(); - - if (um.full()) - r.put(RDOC_UMQTA, um); - r.put(RDOC_PREZZO, recset.get(RCONDV_PREZZO).as_real()); - r.put(RDOC_SCONTO, recset.get(RCONDV_SCONTO).as_string()); - r.put(RDOC_PERCPROV, recset.get(RCONDV_PERCPROVV).as_real()); - r.autoload(s); - last_cod = cod; - } - } - } - } - } - return true; -} - -bool TDocumento_mask::codcamp_handler( TMask_field& f, KEY key ) -{ - if (key == K_TAB && f.focusdirty()) - { - TLocalisamfile & camp = ((TEdit_field &) f).browse()->cursor()->file(); - const TDate datadoc(f.mask().get(F_DATADOC)); - const TDate datascad(camp.get_date("VALFIN")); - - if (datascad.ok() && datadoc > datascad) - return error_box("Offerta scaduta il %s", datascad.string()); - } - return TRUE; -} - - -bool TDocumento_mask::datacambio_handler( TMask_field& f, KEY key ) -{ - TMask& m = f.mask(); - if (key == K_TAB && m.field(F_CAMBIO).empty()) - { - const TString& codval = m.get(F_CODVAL1); - if (is_true_value(codval)) - { - const TRectype& rec = cache().get("%VAL", codval); - m.set(F_CAMBIO, rec.get("S4")); - } - } - return TRUE; -} - -bool TDocumento_mask::codval_handler( TMask_field& f, KEY key ) -{ - if (key == K_TAB && f.focusdirty() && !f.empty()) - { - TMask& m = f.mask(); - - // Cerco un cambio per la data specificata, se non lo trovo lo invento - TDate datacam = m.get_date(F_DATACAMBIO); - if (!datacam.ok()) - { - datacam = m.get_date(F_DATADOC); - m.set(F_DATACAMBIO, datacam); - m.set(F_DATACAMBIO1, datacam); - } - TExchange exc(f.get()); - real cambio = exc.get_change(); // Determino il cambio standard ed il "Contro-Euro" - TString16 key; - key.format("%-3s%s", (const char*)f.get(), (const char*)datacam.string(ANSI)); - const real giornaliero(cache().get("CAM", key, "S4")); - if (!giornaliero.is_zero()) - cambio = giornaliero; // Ho trovato un cambio per il giorno! - m.set(F_CAMBIO, cambio); - - m.sfield(F_SHEET).force_update(); // Aggiorna punti decimali degli importi - } - return TRUE; -} - - -void TDocumento_mask::update_father_rows(bool add) -{ - if (_auto_reopen_nums.empty()) - return; - const int rows = doc().physical_rows(); - - for (int i = 1; i <= rows; i++) - { - const TRiga_documento & r = doc()[i]; - - if (r.is_merce() || r.is_omaggio()|| r.is_prestazione()) - { - const TRectype* original_row = r.find_original_rdoc(); - - if (original_row != NULL && _auto_reopen_nums.objptr(original_row->get(RDOC_CODNUM)) != NULL) - { - TToken_string key; - - key.add(original_row->get(RDOC_PROVV)); - key.add(original_row->get(RDOC_ANNO)); - key.add(original_row->get(RDOC_CODNUM)); - key.add(original_row->get(RDOC_NDOC)); - key.add(original_row->get(RDOC_IDRIGA)); - - real* qta = (real*)_father_rows.objptr(key); - if (qta == NULL) - { - qta = new real; - _father_rows.add(key, qta); - } - - real value = r.quantita(); - - if (r.is_articolo()) - { - TArticolo& art = cached_article(r.get(RDOC_CODARTMAG)); - value = art.convert_to_um(value, original_row->get(RDOC_UMQTA), r.get(RDOC_UMQTA)); - } - if(add) - *qta += value; - else - *qta -= value; - if (qta->is_zero()) - _father_rows.remove(key); - } - } - } -} - -TAssoc_array TDocumento_mask::_father_rows; -TAssoc_array TDocumento_mask::_auto_reopen_nums; -TAssoc_array TDocumento_mask::_tipidoc_rels; - -void TDocumento_mask::save_father_rows() -{ - if (_auto_reopen_nums.empty()) - return; - TLocalisamfile rdoc(LF_RIGHEDOC); - TString_array rows; - TToken_string last_doc; - TToken_string curr_doc; - int nrows = 0; - - FOR_EACH_ASSOC_OBJECT(_father_rows, h, k, o) - { - rows.add(k); - } - rows.sort(); - rows.add(""); - - FOR_EACH_ARRAY_ROW(rows, i, r) - { - curr_doc = r->get(0); - curr_doc.add(r->get()); - curr_doc.add(r->get()); - curr_doc.add(r->get()); - - if (last_doc != curr_doc && nrows > 0) - { - TDocumento d; - - d.read(last_doc.get_char(0), last_doc.get_int(1), last_doc.get(2), last_doc.get_long(3), _isequal, _lock); - for (int j = i - nrows; j < i; j++) - { - TToken_string & key = rows.row(j); - const long idriga = key.get_long(4); - const int nrows = d.physical_rows(); - - for (int k = 1; k <= nrows; k++) - { - TRiga_documento & rdoc_row = d[k]; - - if (idriga == rdoc_row.get_long(RDOC_IDRIGA)) - { - const real * qta = (const real *) _father_rows.objptr(key); - const TString& name = rdoc_row.field_qtaevasa(); - real qtaevasa = rdoc_row.get_real(name) + * qta; - - if (qtaevasa < ZERO) - qtaevasa = ZERO; - rdoc_row.put(name, qtaevasa); - if (qtaevasa < rdoc_row.quantita()) - rdoc_row.zero(RDOC_RIGAEVASA); - else - rdoc_row.put(RDOC_RIGAEVASA, "X"); - break; - } - } - } - TToken_string key(d.tipo().codice()); - - key.add(doc().tipo().codice()); - - TStati * stati = (TStati *) _tipidoc_rels.objptr(key); - - if (stati != NULL) - { - const int nrows = d.physical_rows(); - bool evaso = true; - - for (int k = 1; evaso && k <= nrows; k++) - evaso &= d[k].is_evasa(); - d.stato(evaso ? stati->finale() : stati->iniziale()); - } - d.rewrite(); - nrows = 0; - } - last_doc = curr_doc; - nrows++; - } - -} - -static bool conf_num_handler(TMask_field& f, KEY key) -{ - if (key == K_TAB && f.to_check(key, true)) - { - TMask & m = f.mask(); - - __codnum = f.get(); - - TCursor * cur = m.efield(F_TIPODOC).browse()->cursor(); - TCursor * descur = m.efield(F_DESTIPODOC).browse()->cursor(); - - cur->set_filterfunction(tip_filter); - descur->set_filterfunction(tip_filter); - } - return true; -} - -bool TDocumento_mask::confirm_handler( TMask_field& f, KEY key ) -{ - bool ok = true; - - if (key == K_SPACE) - { - TMask m("ve0100d"); - TDocumento_mask & mask = (TDocumento_mask &) f.mask(); - const TDocumento& src = mask.doc(); - TCodice_numerazione num(src.numerazione()); - TString4 codnum(num.codnumdef()); - TString4 tipodoc(num.tipodocdef()); - if (!num.newnumdef()) - { - codnum = src.get(DOC_CODNUM); - tipodoc = src.get(DOC_TIPODOC); - } - else - { - codnum = num.get("S8"); - tipodoc = num.get("S9"); - } - bool ok = codnum.full() && tipodoc.full(); - - if (!ok) - { - TString saved_codnum = __codnum; - - m.set(F_CODNUM, codnum); - m.enable(F_CODNUM, codnum.blank()); - m.set_handler(F_CODNUM, ::conf_num_handler); - m.enable(F_DESNUM, codnum.blank()); - m.set(F_TIPODOC, tipodoc); - m.enable(F_TIPODOC, tipodoc.blank()); - m.enable(F_DESTIPODOC, tipodoc.blank()); - ok = m.run() == K_ENTER; - if (ok) - { - codnum = m.get(F_CODNUM); - tipodoc = m.get(F_TIPODOC); - } - __codnum = saved_codnum; - } - - ok = codnum.full() && tipodoc.full(); - if (ok) - { - TDocumento dest(src); - - dest.put(DOC_CODNUM, codnum); - dest.put(DOC_TIPODOC, tipodoc); - dest.put(DOC_PROVV, "D"); - dest.zero(DOC_NDOC); - - int err = dest.write(); - - if (err == NOERR) - { - err = src.remove(); - if (err == NOERR) - app().do_elab(dest, 2); - else - warning_box("Errore %d nell'eliminazione del documento provvisorio", err); - - mask.stop_run(K_ESC); - TMask & qmask = app().query_mask(); - qmask.set(F_CODNUM, codnum); - qmask.set(F_PROVV, dest.get_char(DOC_PROVV)); - qmask.set(F_ANNO, dest.get_int(DOC_ANNO)); - qmask.set(F_NDOC, dest.get_long(DOC_NDOC)); - qmask.field(F_NDOC).update_flags("RP"); - } - else - return error_box("Errore %d nella generazione del documento definitivo", err); - } - } - return ok; -} - -static int row_compare(const TObject** obj1, const TObject** obj2) -{ - TRiga_documento & row1 = (TRiga_documento & ) **obj1; - TRiga_documento & row2 = (TRiga_documento & ) **obj2; - const TDocumento & doc = row1.doc(); - const int r1 = row1.get_int(RDOC_NRIGA); - const int r2 = row2.get_int(RDOC_NRIGA); - for (int i = r1 + 1; i < r2; i++) - if (doc[i].get(RDOC_CODART).blank()) - return -1; - - const TString80 c1 = row1.get(RDOC_CODART); - const TString & c2 = row2.get(RDOC_CODART); - - if (c1.full() && c2.full()) - return strcmp((const char *) c1, (const char *) c2); - return r1 - r2; -} - -bool TDocumento_mask::sort_row_handler( TMask_field& f, KEY key ) -{ - if (key == K_SPACE) - { - TSheet_field & sheet = f.mask().sfield(F_SHEET); - TDocumento_mask & m = (TDocumento_mask &) f.mask(); - TDocumento & doc = m.doc(); - TRecord_array saved_rows = doc.body(); - TRecord_array & rows = doc.body(); - const int nrows = doc.physical_rows(); - - rows.sort(row_compare); - if (nrows == doc.physical_rows()) - { - for (int r = 1; r <= nrows; r++) - doc[r].autoload(sheet); - sheet.force_update(); - } - else - { - rows = saved_rows; - return message_box(TR("L'ordinamento non ha avuto un esito positivo")); - } - - } - return true; -} - -void TDocumento_mask::sel_color() -{ - const TString& mn = doc().tipo().mask_name(); - TSelect_color_mask sel(mn, "0"); - FOR_EACH_ARRAY_ITEM(color_rules(), i, o) - { - const TColor_rule& col = *(const TColor_rule*)o; - COLOR a, b; col.colors(a, b); - COLOR c, d; col.default_colors(c, d); - sel.add_color(col.key(), col.description(), a, b, c, d); - } - - if (sel.run() != K_ESC) - { - FOR_EACH_ARRAY_ITEM(color_rules(), i, o) - { - TColor_rule& col = *(TColor_rule*)o; - COLOR back, fore; sel.get_color(col.key(), back, fore); - col.set_colors(back, fore); - } - highlight(); - } -} - -bool TDocumento_mask::gestione_note_per_articolo() const -{ - return id2pos(F_NAR) > 0; -} - -/////////////////////////////////////////////////////////// -// Gestione lettore codice a barre -/////////////////////////////////////////////////////////// - -class TBarcode_mask : public TAutomask -{ - TDocumento_mask& _dm; - clock_t _last_key; - -protected: - virtual void on_idle(); - virtual bool on_key(KEY k); - virtual bool on_field_event(TOperable_field& o, TField_event e, long joly); - virtual bool on_code_entered(const TString& code); - const TString& barcode2codart(const TString& code) const; - -public: - TBarcode_mask(TDocumento_mask& dm); -}; - -const TString& TBarcode_mask::barcode2codart(const TString& code) const -{ - TLocalisamfile codcorr(LF_CODCORR); - codcorr.setkey(2); - codcorr.put(ANAMAG_CODARTALT, code); - if (codcorr.read() == NOERR) - return codcorr.get(ANAMAG_CODART); - return code; -} - -bool TBarcode_mask::on_code_entered(const TString& code) -{ - TCodice_articolo codart; - real qta = UNO; - TString16 livello; - - const int codelen = code.len(); - if (codelen >= 16) - { - for (int i = 0; i < codelen; ) - { - const int ctrl = atoi(code.mid(i, 2)); i += 2; - switch (ctrl) - { - case 2: codart = barcode2codart(code.mid(i, 14)); i +=14; break; - case 10: livello = code.mid(i, 4); i += 4; break; - case 37: qta = real(code.mid(i, 4)); i += 4; break; - default: i += 4; break; - } - } - - } - else - codart = barcode2codart(code); - - if (codart.full()) - { - TSheet_field& s = _dm.sheet(); - - TDocumento& doc = _dm.doc(); - FOR_EACH_PHYSICAL_RDOC_BACK(doc, i, rdoc) - { - if (rdoc->get(RDOC_CODART) == codart && rdoc->get(RDOC_LIVELLO) == livello) - { - rdoc->add(RDOC_QTA, qta); - s.row(i-1).add(rdoc->get(RDOC_QTA), s.cid2index(FR_QTA)); - s.force_update(i-1); - return true; - } - } - - TRiga_documento& r = doc.new_row(_dm.get(F_LBTIPORIGA)); - r.put(RDOC_CODART, codart); - r.put(RDOC_LIVELLO, livello); - r.put(RDOC_QTA, qta); - r.autoload(s); - const int i = r.get_int(RDOC_NRIGA)-1; - _dm.ss_notify(s, i, K_CTRL+K_INS); // Propone magazzino - s.check_row(i, 0x3); - s.force_update(); - } - - return codart.full(); -} - -bool TBarcode_mask::on_key(KEY k) -{ - static KEY _barcode_newline = ini_get_int(CONFIG_INSTALL, "Main", "BarcodeNewline"); - - if (k == _barcode_newline) - { - const TString& code = efield(DLG_USER).get_window_data(); - on_code_entered(code); - reset(DLG_USER); - } - - return TAutomask::on_key(k); -} - -void TBarcode_mask::on_idle() -{ - if (_last_key > 0 && (clock() - _last_key) > 500) - { - _last_key = 0; - const TString& code = efield(DLG_USER).get_window_data(); - if (code.len() >= 8) - { - if (on_code_entered(code)) - reset(DLG_USER); - } - } - return TAutomask::on_idle(); -} - -bool TBarcode_mask::on_field_event(TOperable_field& o, TField_event e, long joly) -{ - if (e == fe_edit && o.dlg() == DLG_USER) - { - _last_key = clock(); - } - return true; -} - -TBarcode_mask::TBarcode_mask(TDocumento_mask& dm) : TAutomask("BAR CODE READER", 1, 40, 3, -1, 4), _dm(dm), _last_key(0) -{ - TButton_tool& bt = add_button_tool(DLG_QUIT, TR("Fine"), TOOL_QUIT); - add_button_tool(DLG_INFO, TR("Info"), TOOL_INFO); - add_string(DLG_USER, 0, PR("Codice "), 1, 1, 128, "", 30); - set_handlers(); -} - -bool TDocumento_mask::barcode_handler(TMask_field& f, KEY k) -{ - if (k == K_SPACE) - { - TDocumento_mask& mask = (TDocumento_mask&)f.mask(); - TSheet_field& s = mask.sheet(); - if (mask.curr_win() != s.parent()) - s.set_focus(); - - TBarcode_mask bcm(mask); - bcm.run(); - } - return true; -} + } + } + + in.rewrite(); + + // Toglie spunta ai documenti selezionati + _tree.toggle_all_nodes(); + } + const TString4 num_in = e->codice_numerazione_iniziale(); + set(F_CODNUM_ELAB, num_in); + set(F_NDOC_ELAB, ""); + set(F_NUMDOCRIF_ELAB, ""); + ((TDocumento_mask *)_main)->set_focus_field(F_SHEET); + } + + // Azzera l'anno in caso di ordini + if (in.items() > 0 && in[0].is_ordine() && !field(F_ANNO_ELAB).required()) + { + reset(F_ANNO_ELAB); + update_mask = true; + } + + if (update_mask) + update_ndoc_filter(); + + return update_mask; +} + +TElaborazione* TElabora_mask::curr_elab() +{ + const TString& cod_elab = get(F_ELAB); + return cod_elab.full() ? &_elab[cod_elab] : NULL; +} + +void TElabora_mask::add_valuta_filter(TString& filter) const +{ + TString4 valuta = get(F_CODVAL_ELAB); + if (::is_firm_value(valuta)) + { + filter << "((CODVAL==\"" << valuta << "\")"; + if (valuta.empty()) + valuta = TCurrency::get_firm_val(); + else + valuta.cut(0); + filter << "||(CODVAL==\"" << valuta << "\"))"; + } + else + filter << "(CODVAL==\"" << valuta << "\")"; +} + +void TElabora_mask::update_ndoc_filter(bool is_tipo_elaborazione) +{ + TString filter; + add_valuta_filter(filter); + + TElaborazione* e = curr_elab(); + const bool elab_changed = e != _last_elab; + _last_elab = e; + + const bool aggiungi_doc_att = get_bool(F_TYPE); + enable(-1, aggiungi_doc_att); + if (!aggiungi_doc_att && is_tipo_elaborazione ) + reset(-1); + + const bool enable_group_doc = e != NULL && e->tipo() != _generazione_effetti && e->tipo() != _contabilizzazione; + show(-GRP_DOC, enable_group_doc); + + enable(DLG_SELECT, aggiungi_doc_att && enable_group_doc); // Attiva la selezione multipla se possibile + + if (e != NULL) + { + if (aggiungi_doc_att) + { + bool agg_test = e->aggiorna_testata_se_vuoto(); + + if (agg_test) + { + const int nrighe = _main->doc().physical_rows(); + + for (int i = 1;agg_test && i <= nrighe; i++) + if (!_main->doc()[i].is_generata()) + agg_test = false; + } + + set(F_UPDATE_HEADER, agg_test ? "X" : ""); + const TString4 num_in = e->codice_numerazione_iniziale(); + if (elab_changed) + { + const TString4 tipo_in(e->tipo_iniziale(0)); + const char stato_in = e->stato_iniziale(0); + + set(F_CODNUM_ELAB, num_in, 0x2); + set(F_TIPODOC_ELAB , tipo_in, 0x2); + TString4 si; si << stato_in; + set(F_STATODOC_ELAB, si, 0x2); + + // Azzero anno di elaborazione quando ho a che fare con degli ordini + const TTipo_documento& tipodocin = cached_tipodoc(tipo_in); + if (tipodocin.is_ordine() && !field(F_ANNO_ELAB).required()) + reset(F_ANNO_ELAB); + } + + if (!field(F_TIPODOC_ELAB).empty()) + { + const TString4 tipo(get(F_TIPODOC_ELAB)); + TString80 td; td.format("&&(TIPODOC==\"%s\")", (const char *)tipo); + filter << td; + const TString& stato = get(F_STATODOC_ELAB); + if (stato.full()) + { + filter << "&&(STATO==\"" << stato << "\")"; + } + else + { + bool almost_one = false; + + for (int i = 0; i < TElaborazione::_max_tipi_doc_elab; i++) + { + const TString4 tipo_in(e->tipo_iniziale(i)); + const char stato_in = e->stato_iniziale(i); + + if (tipo == tipo_in && stato_in > '0') + { + if (almost_one) + filter << "||"; + else + filter << "&&("; + almost_one = TRUE; + + filter << "(STATO==\"" << stato_in << "\")"; + } + } + if (almost_one) + filter << ')'; + } + } + else + { + bool almost_one = false; + + for (int i = 0; i < TElaborazione::_max_tipi_doc_elab; i++) + { + const TString4 tipo_in(e->tipo_iniziale(i)); + if (tipo_in.full()) + { + if (almost_one) + filter << "||"; + else + filter << "&&("; + almost_one = true; + filter << "((TIPODOC==\"" << tipo_in << "\")"; + + const char stato_in[2] = { e->stato_iniziale(i), '\0' }; + if (stato_in[0] > '0') + filter << "&&(STATO==\"" << stato_in << "\")"; + filter << ')'; + } + } + if (almost_one) + filter << ')'; + } + } + else + { + const TString4 tipo_fin(e->tipo_finale()); + const TString4 stato_fin(e->stato_finale()); + + set(F_UPDATE_HEADER, ""); + filter << "&&"; + if (stato_fin != "0") + filter << '('; + filter << "(TIPODOC==\"" << tipo_fin << "\")"; + if (stato_fin != "0") + filter << "&&(STATO==\"" << stato_fin << "\"))"; + + if (is_tipo_elaborazione) + { + const TString4 num_fin = e->codice_numerazione_finale(); + set(F_CODNUM_ELAB, num_fin, 0x2); + set(F_TIPODOC_ELAB, tipo_fin, 0x2); + set(F_STATODOC_ELAB, stato_fin, 0x2); + } + } + } + + if (!field(F_CODNUM_ELAB).empty()) + filter << "&&(CODNUM==\""<< get(F_CODNUM_ELAB) << "\")"; + + _art_filter = get(F_CODART); + if (!aggiungi_doc_att || _art_filter.blank()) + _art_filter.cut(0); + + + /* Vedi sotto: copia cursore da albero + TBrowse& brew = *efield(F_NDOC_ELAB).browse(); + brew.set_filter(filter); + TCursor* cursor = brew.cursor(); + if (_art_filter.full() && aggiungi_doc_att) + cursor->set_filterfunction(doc_article_filter); + else + cursor->set_filterfunction(NULL); + */ + + TTree_field& tf = tfield(F_ROWS); + if (e != NULL /*&& !field(F_TIPODOC_ELAB).empty() */ ) // 18-10-2013 tolto test tipo documento vuoto + { + const char tipocf = get(F_TIPOCF_ELAB)[0]; + const TString& codnum = get(F_CODNUM_ELAB); + const bool allow_zero_cf = tipocf == 'F' && aggiungi_doc_att && codnum.full() && e->tipo() == _consegna_ordini; + _tree.set_cursor(tipocf, get_long(F_CODCF_ELAB), get_int(F_ANNO_ELAB), + codnum, filter, allow_zero_cf); + efield(F_NDOC_ELAB).browse()->replace_cursor(_tree.get_cursor()); + + tf.set_tree(&_tree); + + TToken_string header(256, '\n'); + header.add("Anno Num. N. Data Cli/For Ragione Sociale"); + header.add(" Codice Articolo Descrizione Riga "); + if (aggiungi_doc_att && e->tipo() == _consegna_ordini) + header << "Da Evadere Residuo"; + else + header << " Quantità"; + tf.set_header(header); + + if (aggiungi_doc_att) // GF20059 + { + TCursor& cur = *_tree.get_cursor(); + if (cur.items() == 1) // Propone l'unico documento possibile + { + cur = 0L; + const TRectype& curr = cur.curr(); + set(F_ANNO_ELAB, curr.get(DOC_ANNO)); + set(F_NDOC_ELAB, curr.get(DOC_NDOC)); + set(F_CODNUM_ELAB, curr.get(DOC_CODNUM), 0x2); // Check but not hit + set(F_DATADOC_ELAB, curr.get(DOC_DATADOC)); + } + else + reset(F_NDOC_ELAB); + } + } + else + tf.set_tree(NULL); + tf.win().force_update(); +} + +void TElabora_mask::docrif_search() +{ + TRectype filtrec(LF_DOC); + filtrec.put(DOC_TIPOCF, get(F_TIPOCF_ELAB)); + filtrec.put(DOC_CODCF, get(F_CODCF_ELAB)); + filtrec.put(DOC_PROVV, get(F_PROVV_ELAB)); + filtrec.put(DOC_ANNO, get(F_ANNO_ELAB)); + + TRelation rel(LF_DOC); + rel.add(LF_CLIFO, "TIPOCF==TIPOCF|CODCF==CODCF"); + TSorted_cursor cur(&rel, "TIPOCF|CODCF|PROVV|ANNO|CODNUM|NUMDOCRIF", "", 2, &filtrec, &filtrec); + TString flt(256); + if (!field(F_CODNUM_ELAB).empty()) + flt << "(CODNUM==\"" << get(F_CODNUM_ELAB) << "\")&&"; + if (!field(F_TIPODOC_ELAB).empty()) + flt << "(TIPODOC==\"" << get(F_TIPODOC_ELAB) << "\")&&"; + if (!field(F_STATODOC_ELAB).empty()) + flt << "(STATO==\"" << get(F_STATODOC_ELAB) << "\")&&"; + add_valuta_filter(flt); flt << "&&"; + TEdit_field& f = efield(F_NUMDOCRIF_ELAB); + if (!f.empty()) + flt << "(NUMDOCRIF==\"" << f.get() << "\")&&"; + flt.rtrim(2); // Togli gli ultimi && + + cur.setfilter(flt); + + TToken_string fields = "ANNO|CODNUM|TIPODOC|NUMDOCRIF|STATO|DATADOCRIF|DOC1|DOC2|DOC3|NDOC|20->RAGSOC"; + TCursor_sheet sheet(&cur, fields, + TR("Documento di riferimento"), + HR("Anno|Num.|Tipo|Docum.Rif.|Stato|Data@10|Docum.Rif.1|Docum.Rif.2|Docum.Rif.3|Documento|Ragione Sociale@50"), + 0, 1); + if (sheet.run() == K_ENTER) + { + const int nrifpos = fields.get_pos(DOC_NUMDOCRIF); + const TString16 nrif = sheet.row(-1).get(nrifpos); + f.set(nrif); + const int ndocpos = fields.get_pos(DOC_NDOC); + const long ndoc = sheet.row(-1).get_long(ndocpos); + set(F_NDOC_ELAB, ndoc); + const int codnumpos = fields.get_pos(DOC_CODNUM); + const TString4 codnum = sheet.row(-1).get(codnumpos); + set(F_CODNUM_ELAB, codnum, TRUE); + } +} + +TElabora_mask::TElabora_mask(TDocumento_mask& main_mask) + : TAutomask("ve0100b"), _main(&main_mask), _last_elab(NULL), _check_fld(-883) +{ + const TDate oggi(TODAY); + set(F_ANNO_ELAB, oggi.year()); //anno della datadoc proposta (risolve bug 0000331) + set(F_TIPOCF_ELAB, _main->get(F_TIPOCF)); + set(F_CODCF_ELAB, _main->get(F_CODCF)); + set(F_CODVAL_ELAB, _main->get(F_CODVAL)); +} + +bool TDocumento_mask::elabora_handler( TMask_field& f, KEY key ) +{ + if (key == K_SPACE) + { + TDocumento_mask& m = (TDocumento_mask&)f.mask(); + m.update_progs(); + if (!m.check_fields()) // Check values + return false; + + TElabora_mask* selection = new TElabora_mask(m); + bool do_checks = false; + const char stato_iniziale = m.doc().stato(); + m.update_father_rows(); + while (selection->run() == K_ENTER) //NON riportare modifiche dalla 3.1!! Già sistemato + { + m.mask2doc(); + const bool processed = selection->elabora(); + do_checks |= processed; + + if (m.doc().stato() != stato_iniziale) + break; + + if (processed) + { + m.doc2mask(false); + TSheet_field& ss = m.sfield(F_SHEET); + for (int i = 0; i < ss.items(); i++) + { + m.ss_notify(ss,i,K_TAB); + m.ss_notify(ss,i,K_SPACE); + m.ss_notify(ss,i,K_ENTER); + } + } + + if (!selection->get_bool(F_TYPE)) // non aggiunge al documento attuale + break; + } + if (do_checks) //NON riportare modifiche dalla 3.1!! Già sistemato + { + m.doc2mask(false); + // Provoca decodifiche necessarie + const int tutti = m.fields(); + int i; + for (i = 0; i < tutti; i++) + { + TMask_field& f = m.fld(i); + if (f.dlg() <= BASE_PIEDE) + f.check(STARTING_CHECK); + } + for (i = tutti-1; i >= 0; i--) + m.fld(i).set_dirty(FALSE); + } + m.update_father_rows(false); + delete selection; + } + return true; +} + +/////////////////////////////////////////////////////////// +// TDocumento_mask +/////////////////////////////////////////////////////////// + +bool TDocumento_mask::print_handler( TMask_field& f, KEY key ) +{ + if (key == K_SPACE) + { + switch (f.dlg()) + { + case DLG_EMAIL : app().mailto(); break; + case DLG_PREVIEW : app().preview(); break; + default : app().print(); break; + } + } + return true; +} + +void TDocumento_mask::set_field_handler(short fieldid, CONTROL_HANDLER handler) +{ + _handlers.add((TObject *)handler, fieldid); +} + +void TDocumento_mask::user_set_handler(short fieldid, int index) +{ + switch (index) + { + case 1: set_field_handler(fieldid, ora_hndl); break; + case 2: set_field_handler(fieldid, totdoc_hndl); break; + case 3: set_field_handler(fieldid, numdocrif_hndl); break; + case 4: + /* Cassato il macchinaro! + _smartcard = new TSmart_card(); + if (_smartcard->type() != no_smartcard) + { + set_field_handler(fieldid, smart_hndl); + set_handler(fieldid, universal_handler); + } + else + { + disable(fieldid); + delete _smartcard; + _smartcard = NULL; + } + */ + break; + case 5: set_field_handler(fieldid, dummy_hndl); break; + case 6: set_field_handler(fieldid, fido_hndl); break; + case 7: set_field_handler(fieldid, subappalto_hndl); break; + case 8: set_field_handler(fieldid, reportba8_hndl); break; + default: break; + } +} + +bool TDocumento_mask::call_handler( TMask_field& f, KEY key) +{ + const short id = f.dlg(); + CONTROL_HANDLER h = (CONTROL_HANDLER) _handlers.objptr(id); + if (h != NULL) + return h(f, key); + return true; +} + +bool TDocumento_mask::universal_handler( TMask_field& f, KEY key) +{ + TDocumento_mask& m = (TDocumento_mask&)f.mask(); + bool ok = m.call_handler(f, key); + + if (ok && key == K_TAB && f.focusdirty()) + { + const TFieldref* fr = f.field(); + if (fr != NULL && (fr->file() == 0 || fr->file() == LF_DOC)) + fr->write(f.get(), m.doc()); + + const int page = f.page(); + if (m.is_calculated_page(page)) + m.update_progs(); + } + + return ok; +} + +bool TDocumento_mask::anno_handler( TMask_field& f, KEY key) +{ + if (key == K_TAB && f.to_check(key, TRUE)) + app().update_navigation_bar(); + return true; +} + +bool is_tipodoc_ok(const TString& tipodoc) +{ + const TString4 module = main_app().name().left(2); + const TTipo_documento& tipo = cached_tipodoc(tipodoc); + const TString& tipomod = tipo.module(); + if (module == "ve" && (tipomod.blank() || tipomod == "*")) + return true; + return tipomod == module; +} + +static TString4 __codnum; + +bool tip_filter(const TRelation* r) +{ + if (__codnum.blank()) + return true; + const TCodice_numerazione & cod_num = cached_numerazione(__codnum); + const TString4 tipo = r->curr().get("CODTAB"); + const int last = cod_num.ntipi_doc(); + for (int i = 0; i < last; i++ ) + { + const TString& curtipo = cod_num.tipo_doc(i); + if (curtipo == tipo && is_tipodoc_ok(curtipo)) + return true; + } + return false; +} + +bool TDocumento_mask::num_handler( TMask_field& f, KEY key) +{ + if (key == K_TAB && f.to_check(key, true)) + { + // Ottengo la maschera + TMask& m = f.mask(); + const TString & codnum = f.get(); + TCursor* cur = m.efield(F_TIPODOC).browse()->cursor(); + TCursor* descur = m.efield(F_DESTIPODOC).browse()->cursor(); + + __codnum = codnum; + if (codnum.full()) + { + const TCodice_numerazione & cod_num = cached_numerazione(codnum); + + m.set( F_DESNUM, cod_num.descrizione()); + // Propone il primo tipo di documento come default + if (m.field(F_TIPODOC).empty() || f.focusdirty()) + { + m.set( F_TIPODOC, cod_num.tipo_doc(0)); + m.send_key( K_TAB, F_TIPODOC ); + } + // Se per questa numerazione e' abilitata le numerazione provvisoria + if (cod_num.num_provv()) + { + // Setta di default la numerazione provvisoria + m.set( F_PROVV, "P" ); + // Abilita il campo per la selezione della numerazione + m.enable( F_PROVV ); + } + else // Altrimenti ... + { + // Setta la numerazione a definitiva + m.set( F_PROVV, "D" ); + // Disabilita il campo per la selezione della numerazione + m.disable( F_PROVV ); + } + } + else + { + m.set( F_DESNUM, "" ); + m.set( F_TIPODOC, "" ); + } + cur->set_filterfunction(tip_filter); + descur->set_filterfunction(tip_filter); + app().update_navigation_bar(); + } + return TRUE; +} + +bool TDocumento_mask::codlist_handler( TMask_field& f, KEY key ) +{ + if (key == K_TAB && f.focusdirty()) + { + TLocalisamfile & list = ((TEdit_field &) f).browse()->cursor()->file(); + const TDate datadoc(f.mask().get(F_DATADOC)); + const TDate datascad(list.get_date("VALFIN")); + + if (datascad.ok() && datadoc > datascad) + { + const TString16 codsucc(list.get("CODLISSUCC")); + + if (codsucc.empty()) + return error_box("Listino scaduto il %s", datascad.string()); + else + { + f.set(codsucc); + f.set_focusdirty(); + ((TEdit_field &)f).check(); + } + } + } + return true; +} + +bool TDocumento_mask::codcont_handler( TMask_field& f, KEY key ) +{ + if (key == K_TAB && f.focusdirty()) + { + TDocumento_mask& m = (TDocumento_mask&)f.mask(); + TLocalisamfile & cont = ((TEdit_field &) f).browse()->cursor()->file(); + const TDate datadoc(f.mask().get(F_DATADOC)); + const TDate datascad(cont.get_date(CONDV_VALFIN)); + + if (datascad.ok() && datadoc > datascad) + return error_box(FR("Contratto scaduto il %s"), datascad.string()); + + static bool __gesconcc = false; + static long __cntr_firm = -1L; + const long firm = prefix().get_codditta(); + if (firm != __cntr_firm) + { + __gesconcc = ini_get_bool(CONFIG_DITTA, "ve", "GESCONCC"); + __cntr_firm = firm; + } + + if (m.doc().tipo().load_cont() && f.get().full() && m.get_long(F_CODCF) > 0) + { + TSheet_field & s = m.sfield(F_SHEET); + + if (s.items() == 0) + { + TString select("TIPO='C' CATVEN=''"); + + if(__gesconcc) + select << " " << RCONDV_TIPOCF<< "='" << m.get(F_TIPOCF) <<"' " << RCONDV_CODCF << "=" << m.get_long(F_CODCF); + select << " " << RCONDV_COD << "=" << f.get(); + TString query("USE RCONDV SELECT "); + + query << RCONDV_TIPORIGA << "=='A'"; + query << "\nFROM " << select; + query << "\nTO " << select; + TISAM_recordset recset(query); + TString last_cod(20); + + for (bool ok = recset.move_first(); ok ; ok = recset.move_next()) + { + TRiga_documento & r = m.doc().new_row("01"); + const TString & cod = recset.get(RCONDV_CODRIGA).as_string(); + + if (cod != last_cod) + { + r.put(RDOC_CODART, cod); + + const int row = s.insert(-1, false); + s.row(row); + r.autoload(s); + s.check_row(row, 0x2); + r.autosave(s); + const TString & um = recset.get(RCONDV_UM).as_string(); + + if (um.full()) + r.put(RDOC_UMQTA, um); + r.put(RDOC_PREZZO, recset.get(RCONDV_PREZZO).as_real()); + r.put(RDOC_SCONTO, recset.get(RCONDV_SCONTO).as_string()); + r.put(RDOC_PERCPROV, recset.get(RCONDV_PERCPROVV).as_real()); + r.autoload(s); + last_cod = cod; + } + } + } + } + } + return true; +} + +bool TDocumento_mask::codcamp_handler( TMask_field& f, KEY key ) +{ + if (key == K_TAB && f.focusdirty()) + { + TLocalisamfile & camp = ((TEdit_field &) f).browse()->cursor()->file(); + const TDate datadoc(f.mask().get(F_DATADOC)); + const TDate datascad(camp.get_date("VALFIN")); + + if (datascad.ok() && datadoc > datascad) + return error_box("Offerta scaduta il %s", datascad.string()); + } + return TRUE; +} + + +bool TDocumento_mask::datacambio_handler( TMask_field& f, KEY key ) +{ + TMask& m = f.mask(); + if (key == K_TAB && m.field(F_CAMBIO).empty()) + { + const TString& codval = m.get(F_CODVAL1); + if (is_true_value(codval)) + { + const TRectype& rec = cache().get("%VAL", codval); + m.set(F_CAMBIO, rec.get("S4")); + } + } + return TRUE; +} + +bool TDocumento_mask::codval_handler( TMask_field& f, KEY key ) +{ + if (key == K_TAB && f.focusdirty() && !f.empty()) + { + TMask& m = f.mask(); + + // Cerco un cambio per la data specificata, se non lo trovo lo invento + TDate datacam = m.get_date(F_DATACAMBIO); + if (!datacam.ok()) + { + datacam = m.get_date(F_DATADOC); + m.set(F_DATACAMBIO, datacam); + m.set(F_DATACAMBIO1, datacam); + } + TExchange exc(f.get()); + real cambio = exc.get_change(); // Determino il cambio standard ed il "Contro-Euro" + TString16 key; + key.format("%-3s%s", (const char*)f.get(), (const char*)datacam.string(ANSI)); + const real giornaliero(cache().get("CAM", key, "S4")); + if (!giornaliero.is_zero()) + cambio = giornaliero; // Ho trovato un cambio per il giorno! + m.set(F_CAMBIO, cambio); + + m.sfield(F_SHEET).force_update(); // Aggiorna punti decimali degli importi + } + return TRUE; +} + + +void TDocumento_mask::update_father_rows(bool add) +{ + if (_auto_reopen_nums.empty()) + return; + const int rows = doc().physical_rows(); + + for (int i = 1; i <= rows; i++) + { + const TRiga_documento & r = doc()[i]; + + if (r.is_merce() || r.is_omaggio()|| r.is_prestazione()) + { + const TRectype* original_row = r.find_original_rdoc(); + + if (original_row != NULL && _auto_reopen_nums.objptr(original_row->get(RDOC_CODNUM)) != NULL) + { + TToken_string key; + + key.add(original_row->get(RDOC_PROVV)); + key.add(original_row->get(RDOC_ANNO)); + key.add(original_row->get(RDOC_CODNUM)); + key.add(original_row->get(RDOC_NDOC)); + key.add(original_row->get(RDOC_IDRIGA)); + + real* qta = (real*)_father_rows.objptr(key); + if (qta == NULL) + { + qta = new real; + _father_rows.add(key, qta); + } + + real value = r.quantita(); + + if (r.is_articolo()) + { + TArticolo& art = cached_article(r.get(RDOC_CODARTMAG)); + value = art.convert_to_um(value, original_row->get(RDOC_UMQTA), r.get(RDOC_UMQTA)); + } + if(add) + *qta += value; + else + *qta -= value; + if (qta->is_zero()) + _father_rows.remove(key); + } + } + } +} + +TAssoc_array TDocumento_mask::_father_rows; +TAssoc_array TDocumento_mask::_auto_reopen_nums; +TAssoc_array TDocumento_mask::_tipidoc_rels; + +void TDocumento_mask::save_father_rows() +{ + if (_auto_reopen_nums.empty()) + return; + TLocalisamfile rdoc(LF_RIGHEDOC); + TString_array rows; + TToken_string last_doc; + TToken_string curr_doc; + int nrows = 0; + + FOR_EACH_ASSOC_OBJECT(_father_rows, h, k, o) + { + rows.add(k); + } + rows.sort(); + rows.add(""); + + FOR_EACH_ARRAY_ROW(rows, i, r) + { + curr_doc = r->get(0); + curr_doc.add(r->get()); + curr_doc.add(r->get()); + curr_doc.add(r->get()); + + if (last_doc != curr_doc && nrows > 0) + { + TDocumento d; + + d.read(last_doc.get_char(0), last_doc.get_int(1), last_doc.get(2), last_doc.get_long(3), _isequal, _lock); + for (int j = i - nrows; j < i; j++) + { + TToken_string & key = rows.row(j); + const long idriga = key.get_long(4); + const int nrows = d.physical_rows(); + + for (int k = 1; k <= nrows; k++) + { + TRiga_documento & rdoc_row = d[k]; + + if (idriga == rdoc_row.get_long(RDOC_IDRIGA)) + { + const real * qta = (const real *) _father_rows.objptr(key); + const TString& name = rdoc_row.field_qtaevasa(); + real qtaevasa = rdoc_row.get_real(name) + * qta; + + if (qtaevasa < ZERO) + qtaevasa = ZERO; + rdoc_row.put(name, qtaevasa); + if (qtaevasa < rdoc_row.quantita()) + rdoc_row.zero(RDOC_RIGAEVASA); + else + rdoc_row.put(RDOC_RIGAEVASA, "X"); + break; + } + } + } + TToken_string key(d.tipo().codice()); + + key.add(doc().tipo().codice()); + + TStati * stati = (TStati *) _tipidoc_rels.objptr(key); + + if (stati != NULL) + { + const int nrows = d.physical_rows(); + bool evaso = true; + + for (int k = 1; evaso && k <= nrows; k++) + evaso &= d[k].is_evasa(); + d.stato(evaso ? stati->finale() : stati->iniziale()); + } + d.rewrite(); + nrows = 0; + } + last_doc = curr_doc; + nrows++; + } + +} + +static bool conf_num_handler(TMask_field& f, KEY key) +{ + if (key == K_TAB && f.to_check(key, true)) + { + TMask & m = f.mask(); + + __codnum = f.get(); + + TCursor * cur = m.efield(F_TIPODOC).browse()->cursor(); + TCursor * descur = m.efield(F_DESTIPODOC).browse()->cursor(); + + cur->set_filterfunction(tip_filter); + descur->set_filterfunction(tip_filter); + } + return true; +} + +bool TDocumento_mask::confirm_handler( TMask_field& f, KEY key ) +{ + bool ok = true; + + if (key == K_SPACE) + { + TMask m("ve0100d"); + TDocumento_mask & mask = (TDocumento_mask &) f.mask(); + const TDocumento& src = mask.doc(); + TCodice_numerazione num(src.numerazione()); + TString4 codnum(num.codnumdef()); + TString4 tipodoc(num.tipodocdef()); + if (!num.newnumdef()) + { + codnum = src.get(DOC_CODNUM); + tipodoc = src.get(DOC_TIPODOC); + } + else + { + codnum = num.get("S8"); + tipodoc = num.get("S9"); + } + bool ok = codnum.full() && tipodoc.full(); + + if (!ok) + { + TString saved_codnum = __codnum; + + m.set(F_CODNUM, codnum); + m.enable(F_CODNUM, codnum.blank()); + m.set_handler(F_CODNUM, ::conf_num_handler); + m.enable(F_DESNUM, codnum.blank()); + m.set(F_TIPODOC, tipodoc); + m.enable(F_TIPODOC, tipodoc.blank()); + m.enable(F_DESTIPODOC, tipodoc.blank()); + ok = m.run() == K_ENTER; + if (ok) + { + codnum = m.get(F_CODNUM); + tipodoc = m.get(F_TIPODOC); + } + __codnum = saved_codnum; + } + + ok = codnum.full() && tipodoc.full(); + if (ok) + { + TDocumento dest(src); + + dest.put(DOC_CODNUM, codnum); + dest.put(DOC_TIPODOC, tipodoc); + dest.put(DOC_PROVV, "D"); + dest.zero(DOC_NDOC); + + int err = dest.write(); + + if (err == NOERR) + { + err = src.remove(); + if (err == NOERR) + app().do_elab(dest, 2); + else + warning_box("Errore %d nell'eliminazione del documento provvisorio", err); + + mask.stop_run(K_ESC); + TMask & qmask = app().query_mask(); + qmask.set(F_CODNUM, codnum); + qmask.set(F_PROVV, dest.get_char(DOC_PROVV)); + qmask.set(F_ANNO, dest.get_int(DOC_ANNO)); + qmask.set(F_NDOC, dest.get_long(DOC_NDOC)); + qmask.field(F_NDOC).update_flags("RP"); + } + else + return error_box("Errore %d nella generazione del documento definitivo", err); + } + } + return ok; +} + +static int row_compare(const TObject** obj1, const TObject** obj2) +{ + TRiga_documento & row1 = (TRiga_documento & ) **obj1; + TRiga_documento & row2 = (TRiga_documento & ) **obj2; + const TDocumento & doc = row1.doc(); + const int r1 = row1.get_int(RDOC_NRIGA); + const int r2 = row2.get_int(RDOC_NRIGA); + for (int i = r1 + 1; i < r2; i++) + if (doc[i].get(RDOC_CODART).blank()) + return -1; + + const TString80 c1 = row1.get(RDOC_CODART); + const TString & c2 = row2.get(RDOC_CODART); + + if (c1.full() && c2.full()) + return strcmp((const char *) c1, (const char *) c2); + return r1 - r2; +} + +bool TDocumento_mask::sort_row_handler( TMask_field& f, KEY key ) +{ + if (key == K_SPACE) + { + TSheet_field & sheet = f.mask().sfield(F_SHEET); + TDocumento_mask & m = (TDocumento_mask &) f.mask(); + TDocumento & doc = m.doc(); + TRecord_array saved_rows = doc.body(); + TRecord_array & rows = doc.body(); + const int nrows = doc.physical_rows(); + + rows.sort(row_compare); + if (nrows == doc.physical_rows()) + { + for (int r = 1; r <= nrows; r++) + doc[r].autoload(sheet); + sheet.force_update(); + } + else + { + rows = saved_rows; + return message_box(TR("L'ordinamento non ha avuto un esito positivo")); + } + + } + return true; +} + +void TDocumento_mask::sel_color() +{ + const TString& mn = doc().tipo().mask_name(); + TSelect_color_mask sel(mn, "0"); + FOR_EACH_ARRAY_ITEM(color_rules(), i, o) + { + const TColor_rule& col = *(const TColor_rule*)o; + COLOR a, b; col.colors(a, b); + COLOR c, d; col.default_colors(c, d); + sel.add_color(col.key(), col.description(), a, b, c, d); + } + + if (sel.run() != K_ESC) + { + FOR_EACH_ARRAY_ITEM(color_rules(), i, o) + { + TColor_rule& col = *(TColor_rule*)o; + COLOR back, fore; sel.get_color(col.key(), back, fore); + col.set_colors(back, fore); + } + highlight(); + } +} + +bool TDocumento_mask::gestione_note_per_articolo() const +{ + return id2pos(F_NAR) > 0; +} + +/////////////////////////////////////////////////////////// +// Gestione lettore codice a barre +/////////////////////////////////////////////////////////// + +class TBarcode_mask : public TAutomask +{ + TDocumento_mask& _dm; + clock_t _last_key; + +protected: + virtual void on_idle(); + virtual bool on_key(KEY k); + virtual bool on_field_event(TOperable_field& o, TField_event e, long joly); + virtual bool on_code_entered(const TString& code); + const TString& barcode2codart(const TString& code) const; + +public: + TBarcode_mask(TDocumento_mask& dm); +}; + +const TString& TBarcode_mask::barcode2codart(const TString& code) const +{ + TLocalisamfile codcorr(LF_CODCORR); + codcorr.setkey(2); + codcorr.put(ANAMAG_CODARTALT, code); + if (codcorr.read() == NOERR) + return codcorr.get(ANAMAG_CODART); + return code; +} + +bool TBarcode_mask::on_code_entered(const TString& code) +{ + TCodice_articolo codart; + real qta = UNO; + TString16 livello; + + const int codelen = code.len(); + if (codelen >= 16) + { + for (int i = 0; i < codelen; ) + { + const int ctrl = atoi(code.mid(i, 2)); i += 2; + switch (ctrl) + { + case 2: codart = barcode2codart(code.mid(i, 14)); i +=14; break; + case 10: livello = code.mid(i, 4); i += 4; break; + case 37: qta = real(code.mid(i, 4)); i += 4; break; + default: i += 4; break; + } + } + + } + else + codart = barcode2codart(code); + + if (codart.full()) + { + TSheet_field& s = _dm.sheet(); + + TDocumento& doc = _dm.doc(); + FOR_EACH_PHYSICAL_RDOC_BACK(doc, i, rdoc) + { + if (rdoc->get(RDOC_CODART) == codart && rdoc->get(RDOC_LIVELLO) == livello) + { + rdoc->add(RDOC_QTA, qta); + s.row(i-1).add(rdoc->get(RDOC_QTA), s.cid2index(FR_QTA)); + s.force_update(i-1); + return true; + } + } + + TRiga_documento& r = doc.new_row(_dm.get(F_LBTIPORIGA)); + r.put(RDOC_CODART, codart); + r.put(RDOC_LIVELLO, livello); + r.put(RDOC_QTA, qta); + r.autoload(s); + const int i = r.get_int(RDOC_NRIGA)-1; + _dm.ss_notify(s, i, K_CTRL+K_INS); // Propone magazzino + s.check_row(i, 0x3); + s.force_update(); + } + + return codart.full(); +} + +bool TBarcode_mask::on_key(KEY k) +{ + static KEY _barcode_newline = ini_get_int(CONFIG_INSTALL, "Main", "BarcodeNewline"); + + if (k == _barcode_newline) + { + const TString& code = efield(DLG_USER).get_window_data(); + on_code_entered(code); + reset(DLG_USER); + } + + return TAutomask::on_key(k); +} + +void TBarcode_mask::on_idle() +{ + if (_last_key > 0 && (clock() - _last_key) > 500) + { + _last_key = 0; + const TString& code = efield(DLG_USER).get_window_data(); + if (code.len() >= 8) + { + if (on_code_entered(code)) + reset(DLG_USER); + } + } + return TAutomask::on_idle(); +} + +bool TBarcode_mask::on_field_event(TOperable_field& o, TField_event e, long joly) +{ + if (e == fe_edit && o.dlg() == DLG_USER) + { + _last_key = clock(); + } + return true; +} + +TBarcode_mask::TBarcode_mask(TDocumento_mask& dm) : TAutomask("BAR CODE READER", 1, 40, 3, -1, 4), _dm(dm), _last_key(0) +{ + TButton_tool& bt = add_button_tool(DLG_QUIT, TR("Fine"), TOOL_QUIT); + add_button_tool(DLG_INFO, TR("Info"), TOOL_INFO); + add_string(DLG_USER, 0, PR("Codice "), 1, 1, 128, "", 30); + set_handlers(); +} + +bool TDocumento_mask::barcode_handler(TMask_field& f, KEY k) +{ + if (k == K_SPACE) + { + TDocumento_mask& mask = (TDocumento_mask&)f.mask(); + TSheet_field& s = mask.sheet(); + if (mask.curr_win() != s.parent()) + s.set_focus(); + TBarcode_mask bcm(mask); + bcm.run(); + } + return true; +} + +bool TDocumento_mask::movint_handler(TMask_field& f, KEY key) +{ + if (key == K_SPACE) + { + TDocumento_mask& m = (TDocumento_mask&)f.mask(); + const TDocumento& doc = m.doc(); + if (doc.get(DOC_COMMPREL).full()) + { + TElaborazione_esterna movint_selector("_MOVINT"); + if (movint_selector.applicazione_esterna().empty()) + movint_selector.put("S3", "ci1 -5"); + TLista_documenti doc_in, doc_out; + doc_in.add(doc); + if (movint_selector.elabora(doc_in, doc_out, m.get_date(F_DATADOC), false)) + { + const TDocumento& din = doc_in[0]; + TDocumento& dout = m.doc(); + for (int r = dout.rows()+1; r <= din.rows(); r++) + { + const TRiga_documento& rin = din[r]; + TRiga_documento& rout = dout.new_row(rin.get(RDOC_TIPORIGA)); + dout.copy_data(rout, rin); rout.reset_original_rdoc_key(); + } + m.doc2mask(false); + } + } + else + return error_box(TR("Specificare la commessa di prelievo")); + } + return true; +} diff --git a/ve/velib06a.cpp b/ve/velib06a.cpp index 0140a6b65..b281c4a76 100755 --- a/ve/velib06a.cpp +++ b/ve/velib06a.cpp @@ -610,7 +610,7 @@ bool iva_handler( TMask_field& f, KEY key ) bool addiva = false; if (pos_ai >= 0) - addiva = row_mask.fld(pos_ai).get() == "X"; // Controlla le righe Omaggio solo se e' settato l'addebito IVA + addiva = row_mask.fld(pos_ai).get() == "X"; // Controlla le righe Omaggio solo se è settato l'addebito IVA const bool check = riga.is_merce() || riga.is_spese() || riga.is_prestazione() || (riga.is_omaggio() && addiva); @@ -625,7 +625,7 @@ bool iva_handler( TMask_field& f, KEY key ) const bool qf = qe && row_mask.fld(pos_q).get().not_empty(); const bool required = pf && !(qe && !qf); if (required) - return f.error_box("Il codice IVA e' obbligatorio."); + return f.error_box(TR("Il codice IVA è obbligatorio.")); } } return true; @@ -892,11 +892,8 @@ void upd_colli_peso_tara(TMask& m, const TString & codart) const real peso = qta * articolo.get_real(ANAMAG_PESO); m.fld(pos).set(peso.string()); } - } - - bool pricerange_handler(TMask_field& f, KEY key ) { if (key == K_TAB && f.focusdirty()) @@ -1040,8 +1037,8 @@ bool TPrice_sheet::get_ini_paragraph(const TEdit_field& field, TString& parag) c TPrice_sheet::TPrice_sheet(TEdit_field& f) : TArray_sheet(0, 3, -1, 16, TR("Ricerca Prezzi"), -HR("Num.|Data@10|Codice articolo@20|Descrizione@40|Quantità@15P|Prezzo@18P|Sconto@10|Numerazione@18|Tipo Documento@18"), 0, 1), -_fld(f) + HR("Num.|Data@10|Codice articolo@20|Descrizione@40|Quantità@15P|Prezzo@18P|Sconto@10|Numerazione@18|Tipo Documento@18"), 0, 1), + _fld(f) { load_columns_order(_fld); } @@ -1114,13 +1111,11 @@ static void search_price(TEdit_field& f, KEY key ) rec.put(RDOC_NDOC, cur.curr().get(DOC_NDOC)); r.read(rec); - int last_row = r.last_row(); - + const int last_row = r.last_row(); for (int i = r.first_row(); i <= last_row; i = r.succ_row(i)) { - const TRectype & rdoc = r.row(i); - const TString & codart = rdoc.get(RDOC_CODART); - + const TRectype& rdoc = r.row(i); + const TString& codart = rdoc.get(RDOC_CODART); if (codart.full()) { TToken_string row; @@ -1437,15 +1432,14 @@ TObject* TCache_documenti::rec2obj(const TRectype& curr) const return new TDocumento(curr); } -TDocumento & TCache_documenti::doc(const char* key) +TDocumento& TCache_documenti::doc(const char* key) { return (TDocumento &)query(key); } -TDocumento & cached_doc(const char* key) +TDocumento& cached_doc(const char* key) { static TCache_documenti * _cache_docs = NULL; - if (_cache_docs == NULL) _cache_docs = new TCache_documenti(); return _cache_docs->doc(key); @@ -1454,12 +1448,11 @@ TDocumento & cached_doc(const char* key) class TLink_riga_documento : public TRiga_documento { protected: - - const TDocumento_mask * _mask; + const TDocumento_mask* _mask; virtual const TString& get_str(const char* fieldname) const; public: - virtual const TDocumento & doc() const; + virtual const TDocumento& doc() const; void set_mask(const TDocumento_mask * m) { _mask = m;} virtual real qtaresidua() const; @@ -1471,8 +1464,7 @@ const TString& TLink_riga_documento::get_str(const char* fieldname) const { if (strcmp(fieldname, "RESIDUO") == 0) { - TString & value = get_tmp_string(80); - + TString& value = get_tmp_string(); value = qtaresidua().string(); return value; } @@ -1480,17 +1472,17 @@ const TString& TLink_riga_documento::get_str(const char* fieldname) const return TRiga_documento::get_str(fieldname); } -const TDocumento & TLink_riga_documento::doc() const +const TDocumento& TLink_riga_documento::doc() const { if (has_doc()) return TRiga_documento::doc(); - TToken_string key; - + + TToken_string key; key.add(get_char(RDOC_PROVV)); key.add(get_int(RDOC_ANNO)); key.add(get(RDOC_CODNUM)); key.add(get_long(RDOC_NDOC)); - return cached_doc(key);; + return cached_doc(key); } real TLink_riga_documento::qtaresidua() const @@ -1551,7 +1543,7 @@ bool TLink_article_sheet::get_ini_paragraph(const TEdit_field& field, TString& p TLink_article_sheet::TLink_article_sheet(TCursor& cur, TEdit_field& f, const char * fieldlist, const char * headers) -: TBrowse_sheet(&cur, fieldlist, TR("Evasione"), headers, 0, f, TToken_string()) + : TBrowse_sheet(&cur, fieldlist, TR("Evasione"), headers, 0, f, TToken_string()) { } bool link_row_handler(TMask_field& f, KEY key ) @@ -2164,10 +2156,10 @@ bool um_handler( TMask_field& f, KEY key ) if ( key == K_TAB && f.focusdirty()) { TMask& row_mask = f.mask( ); - TTable & ums = (TTable &) ((TEdit_field &) f).browse()->cursor()->file(); + TTable& ums = (TTable&)((TEdit_field&)f).browse()->cursor()->file(); - const TString16 um(f.get()); - real fc(1.0); + const TString4 um = f.get(); + real fc = UNO; if (um.not_empty() && curr_um.not_empty() && um != curr_um) { @@ -2175,7 +2167,7 @@ bool um_handler( TMask_field& f, KEY key ) if (ums.read() == NOERR) { real qta(row_mask.get_real(FR_QTA)); - const TString16 umsrif0(ums.get("S7")); + const TString4 umsrif0 = ums.get("S7"); const real fc0 = ums.get_real("R10"); if (um == umsrif0) fc = fc0; @@ -2185,15 +2177,14 @@ bool um_handler( TMask_field& f, KEY key ) if (ums.read() == NOERR) { const real fc1 = ums.get_real("R10"); - const TString16 umsrif1(ums.get("S7")); - if (fc1 > ZERO) { + const TString& umsrif1 = ums.get("S7"); if (curr_um == umsrif1) - fc = 1 / fc1; + fc = UNO / fc1; else - if (umsrif0 == ums.get("S7")) - fc = fc0 / ums.get_real("R10"); + if (umsrif0 == umsrif1) + fc = fc0 / fc1; } } } @@ -3241,12 +3232,12 @@ bool sottocat_conai_handler(TMask_field& f, KEY key ) return true; } -bool peso_conai_handler(TMask_field& f, KEY key ) +bool peso_conai_handler(TMask_field& f, KEY key) { if (key == K_F8) { - const TString & codart = f.mask().get(FR_CODARTMAG); - TArticolo & articolo = cached_article(codart); + const TString& codart = f.mask().get(FR_CODARTMAG); + const TArticolo& articolo = cached_article(codart); const TCONAI_class type = conai_id2class(f.dlg()); f.set(articolo.get(conai_peso_name(type, LF_ANAMAG))); } @@ -3258,16 +3249,14 @@ bool datacomp_handler(TMask_field& f, KEY key) if (key == K_F8) f.set(f.mask().get(F_DATADOC)); - if (f.to_check(key, false)) + if (f.to_check(key, false) && !f.empty()) { const TDate datadoc = f.mask().get_date(F_DATADOC); - const TEsercizi_contabili es_doc; - int anno_doc = es_doc.date2esc(datadoc); + const TEsercizi_contabili esc; + const int anno_doc = esc.date2esc(datadoc); const TDate datacomp = f.get(); - const TEsercizi_contabili es_comp; - int anno_comp = es_comp.date2esc(datacomp); - + const int anno_comp = esc.date2esc(datacomp); if (anno_doc != anno_comp) return error_box("La data inizio competenza deve appartenere all'esercizio del documento!"); } @@ -3276,7 +3265,7 @@ bool datacomp_handler(TMask_field& f, KEY key) bool datafcomp_handler(TMask_field& f, KEY key) { - if (f.to_check(key, false)) + if (f.to_check(key, false) && !f.empty()) { const TDate datacomp = f.mask().get_date(F_DATACOMP); const TDate datafcomp = f.get(); diff --git a/ve/vepriv.h b/ve/vepriv.h index 519692e8f..28e24ac41 100755 --- a/ve/vepriv.h +++ b/ve/vepriv.h @@ -48,7 +48,7 @@ bool nar_handler(TMask_field& f, KEY key); bool subappalto_hndl(TMask_field& f, KEY key); bool reportba8_hndl(TMask_field& f, KEY key); -bool tipodoc_ok(const TString & tipodoc); +bool is_tipodoc_ok(const TString & tipodoc); TCONAI_class conai_id2class(short id); short conai_peso_id(TCONAI_class cc); diff --git a/ve/vetbrss.h b/ve/vetbrss.h index 29cdad529..bd4120c73 100755 --- a/ve/vetbrss.h +++ b/ve/vetbrss.h @@ -51,6 +51,13 @@ #define RSS_MATRICOLA 172 #define RSS_QUALIFICA 173 +#define RSS_TIPOSTRA1 180 +#define RSS_DOPOSTRA1 181 +#define RSS_COSTOSTRA1 182 +#define RSS_TIPOSTRA2 183 +#define RSS_DOPOSTRA2 184 +#define RSS_COSTOSTRA2 185 + #ifndef __VETBANAL_H #include "vetbanal.h" #endif \ No newline at end of file diff --git a/ve/vetbrss.uml b/ve/vetbrss.uml index 1521d5a26..c20f7fd29 100755 --- a/ve/vetbrss.uml +++ b/ve/vetbrss.uml @@ -1,470 +1,517 @@ -#include "vetbrss.h" - -TOOLBAR "Toolbar" 0 0 0 2 - -#include - -ENDPAGE - -PAGE "Risorse" 0 0 0 0 - -GROUPBOX DLG_NULL 75 8 -BEGIN - PROMPT 1 0 "" - FLAGS "R" -END - -STRING RSS_CODICE 16 -BEGIN - PROMPT 2 1 "Codice " - FIELD CODTAB - KEY 1 - USE RSS - FLAGS "U" - INPUT CODTAB RSS_CODICE - DISPLAY "Codice@16" CODTAB - DISPLAY "Denominazione@50" S0 - OUTPUT RSS_CODICE CODTAB - OUTPUT RSS_RAGSOC S0 - CHECKTYPE REQUIRED - MESSAGE COPY,10@ -END - -STRING RSS_RAGSOC 50 -BEGIN - PROMPT 9 2 "" - FIELD S0 - KEY 2 - USE RSS KEY 2 - INPUT S0 RSS_RAGSOC - DISPLAY "Denominazione@50" S0 - DISPLAY "Codice@16" CODTAB - COPY OUTPUT RSS_CODICE - CHECKTYPE REQUIRED - MESSAGE COPY,20@ -END - -LIST RSS_COLLAB 1 10 -BEGIN - PROMPT 2 3 "Tipo " - ITEM "|Nessuno" - MESSAGE HIDE,1@|HIDE,2@|ENABLE,RSS_RAGSOC - ITEM "D|Dipendente" - MESSAGE HIDE,1@|SHOW,2@|DISABLE,RSS_RAGSOC - ITEM "F|Fornitore" - MESSAGE SHOW,1@|HIDE,2@|DISABLE,RSS_RAGSOC - FIELD B0 -END - -NUMBER RSS_CODFORN 6 -BEGIN - PROMPT 32 3 "" - USE LF_CLIFO - INPUT TIPOCF "F" - INPUT CODCF RSS_CODFORN - DISPLAY "Codice" CODCF - DISPLAY "Ragione Sociale@50" RAGSOC - OUTPUT RSS_CODFORN CODCF - OUTPUT RSS_RAGSOC RAGSOC - OUTPUT RSS_ADDRESS_F INDCF - OUTPUT RSS_CIVICO_F CIVCF - OUTPUT RSS_STATO_F STATOCF - OUTPUT RSS_COMUNE_F COMCF - CHECKTYPE REQUIRED - FIELD I6 - WARNING "Codice fornitore inesistente" - ADD RUN CG0 -1 - GROUP 1 -END - -NUMBER RSS_CODFIS 6 -BEGIN - PROMPT 32 3 "" - USE LF_ANAG - INPUT TIPOA "F" - INPUT CODANAGR RSS_CODFIS - DISPLAY "Codice" CODANAGR - DISPLAY "Cognome@30" RAGSOC[1,30] - DISPLAY "Nome@20" RAGSOC[31,50] - OUTPUT RSS_CODFIS CODANAGR - OUTPUT RSS_RAGSOC RAGSOC - OUTPUT RSS_ADDRESS_C INDRES - OUTPUT RSS_CIVICO_C CIVRES - OUTPUT RSS_STATO_C STATORES - OUTPUT RSS_COMUNE_C COMRES - CHECKTYPE REQUIRED - WARNING "Codice persona inesistente" - FIELD I6 - ADD RUN BA4 -1 - GROUP 2 -END - -STRING RSS_ADDRESS_F 35 -BEGIN - PROMPT 2 4 "Indirizzo " - FLAGS "D" - GROUP 1 -END - -STRING RSS_CIVICO_F 5 -BEGIN - PROMPT 65 4 "N. " - FLAGS "D" - GROUP 1 -END - -NUMBER RSS_STATO_F 3 -BEGIN - PROMPT 2 5 "Comune: Stato " - FLAGS "DZ" - USE %STA - INPUT CODTAB RSS_STATO_F - OUTPUT RSS_DESTATO_F S0 - CHECKTYPE NORMAL - GROUP 1 -END - -STRING RSS_DESTATO_F 50 -BEGIN - PROMPT 23 5 "" - FLAGS "D" - GROUP 1 -END - -STRING RSS_COMUNE_F 4 -BEGIN - PROMPT 8 6 ":Codice " - FLAGS "DU" - USE LF_COMUNI - INPUT STATO RSS_STATO_F - INPUT COM RSS_COMUNE_F - OUTPUT RSS_DENCOM_F DENCOM - CHECKTYPE NORMAL - GROUP 1 -END - -STRING RSS_DENCOM_F 50 -BEGIN - PROMPT 23 6 "" - FLAGS "D" - GROUP 1 -END - -STRING RSS_ADDRESS_C 35 -BEGIN - PROMPT 2 4 "Indirizzo " - FLAGS "D" - GROUP 2 -END - -STRING RSS_CIVICO_C 5 -BEGIN - PROMPT 65 4 "N. " - FLAGS "D" - GROUP 2 -END - -NUMBER RSS_STATO_C 3 -BEGIN - PROMPT 2 5 "Comune: Stato " - FLAGS "DZ" - USE %STA - INPUT CODTAB RSS_STATO_C - OUTPUT RSS_DESTATO_C S0 - CHECKTYPE NORMAL - GROUP 2 -END - -STRING RSS_DESTATO_C 50 -BEGIN - PROMPT 23 5 "" - FLAGS "D" - GROUP 2 -END - -STRING RSS_COMUNE_C 4 -BEGIN - PROMPT 8 6 ":Codice " - FLAGS "DU" - USE LF_COMUNI - INPUT STATO RSS_STATO_C - INPUT COM RSS_COMUNE_C - OUTPUT RSS_DENCOM_C DENCOM - CHECKTYPE NORMAL - GROUP 2 -END - -STRING RSS_DENCOM_C 50 -BEGIN - PROMPT 23 6 "" - FLAGS "D" - GROUP 2 -END - -STRING RSS_TIPORIGA 4 -BEGIN - PROMPT 1 8 "Tipo riga " - FIELD S8 - FLAGS "U" - USE %TRI SELECT S7=="R" - INPUT CODTAB RSS_TIPORIGA - DISPLAY "Codice" CODTAB - DISPLAY "Descrizione@50" S0 - OUTPUT RSS_TIPORIGA CODTAB - OUTPUT RSS_DESCRRIGA S0 - CHECKTYPE REQUIRED -END - -STRING RSS_DESCRRIGA 50 -BEGIN - PROMPT 24 8 "" - USE %TRI KEY 2 SELECT S7=="R" - INPUT S0 RSS_DESCRRIGA - DISPLAY "Descrizione@50" S0 - DISPLAY "Codice" CODTAB - COPY OUTPUT RSS_TIPORIGA -END - - -STRING RSS_CODIVA 4 -BEGIN - PROMPT 1 9 "Codice IVA " - FIELD S3[1,4] - FLAGS "U" - USE %IVA - INPUT CODTAB RSS_CODIVA - DISPLAY "Codice " CODTAB - DISPLAY "Descrizione@50" S0 - OUTPUT RSS_CODIVA CODTAB - OUTPUT RSS_DESIVA S0 - CHECKTYPE NORMAL -END - - -STRING RSS_DESIVA 50 -BEGIN - PROMPT 24 9 "" - USE %IVA KEY 2 - INPUT S0 RSS_DESIVA - DISPLAY "Descrizione@50" S0 - DISPLAY "Codice " CODTAB - COPY OUTPUT RSS_CODIVA - CHECKTYPE NORMAL -END - -STRING RSS_CODVAL 4 -BEGIN - PROMPT 1 10 "Codice valuta " - FIELD S4 - FLAGS "U" - USE %VAL - INPUT CODTAB RSS_CODVAL - DISPLAY "Codice" CODTAB - DISPLAY "Descrizione@50" S0 - OUTPUT RSS_CODVAL CODTAB - OUTPUT RSS_DESVAL S0 - CHECKTYPE NORMAL -END - -STRING RSS_DESVAL 50 -BEGIN - PROMPT 24 10 "" - USE %VAL KEY 2 - INPUT S0 RSS_DESVAL - DISPLAY "Descrizione@50" S0 - DISPLAY "Codice" CODTAB - COPY OUTPUT RSS_CODVAL - CHECKTYPE NORMAL -END - -STRING RSS_CODART 20 -BEGIN - PROMPT 1 11 "Articolo (CI) " - USE LF_ANAMAG - INPUT CODART RSS_CODART - DISPLAY "Codice@20" CODART - DISPLAY "Descrizione@50" DESCR - OUTPUT RSS_CODART CODART - OUTPUT RSS_DESCART DESCR - CHECKTYPE NORMAL - FLAGS "U" - FIELD S2 -END - -STRING RSS_DESCART 50 34 -BEGIN - PROMPT 40 11 "" - USE LF_ANAMAG KEY 2 - INPUT DESCR RSS_DESCART - DISPLAY "Descrizione@50" DESCR - DISPLAY "Codice@20" CODART - COPY OUTPUT RSS_CODART - CHECKTYPE NORMAL - FLAGS "U" -END - -LISTBOX RSS_CAMPI 15 -BEGIN - PROMPT 1 12 "Campo default " - FIELD S6 - ITEM "Q|Qta prezzo " - FLAGS "H" -END - -CURRENCY RSS_PREZZO 15 -BEGIN - PROMPT 1 12 "Prezzo " - FIELD R10 - FLAGS "U" -END - -NUMBER RSS_QTA 13 5 -BEGIN - PROMPT 38 12 "Quantita' " - FIELD R1 -END - -STRING RSS_UM 2 -BEGIN - PROMPT 67 12 "U.M. " - FIELD S7 - FLAGS "U" - USE %UMS - INPUT CODTAB RSS_UM - DISPLAY "U.M." CODTAB - DISPLAY "Descrizione@50" S0 - OUTPUT RSS_UM CODTAB - CHECKTYPE NORMAL -END - -STRING RSS_PRESTAZ 8 -BEGIN - PROMPT 1 13 "Prestazione per fatturazione " - USE PRS - INPUT CODTAB RSS_PRESTAZ - DISPLAY "Codice@8" CODTAB - DISPLAY "Descrizione@50" S0 - OUTPUT RSS_PRESTAZ CODTAB - CHECKTYPE NORMAL - FIELD S5 -END - -BOOLEAN RSS_MRP_ATTIVO -BEGIN - PROMPT 1 14 "@bCollegamento M.R.P.:" - MESSAGE FALSE CLEAR,9@ - MESSAGE TRUE ENABLE,9@ -END - -STRING RSS_IMPIANTO 5 -BEGIN - PROMPT 25 14 "Impianto " - FIELD S3[5,9] - USE IMP - INPUT CODTAB RSS_IMPIANTO - DISPLAY "Codice" CODTAB - DISPLAY "Descrizione@50" S0 - OUTPUT RSS_IMPIANTO CODTAB - GROUP 9 -END - -STRING RSS_LINEA 5 -BEGIN - PROMPT 45 14 "Linea " - FIELD S3[10,14] - USE LNP - INPUT CODTAB RSS_LINEA - DISPLAY "Codice" CODTAB - DISPLAY "Descrizione@50" S0 - OUTPUT RSS_LINEA CODTAB - GROUP 9 -END - -NUMBER RSS_GRUPPOA 3 -BEGIN - PROMPT 2 15 "Conto acquisti " - FIELD I3 - END - -NUMBER RSS_CONTOA 3 -BEGIN - PROMPT 22 15 "" - FIELD I4 - END - -NUMBER RSS_SOTTOA 6 -BEGIN - PROMPT 28 15 "" - FIELD I5 - USE LF_PCON SELECT SOTTOCONTO!="" - INPUT GRUPPO RSS_GRUPPOA - INPUT CONTO RSS_CONTOA - INPUT SOTTOCONTO RSS_SOTTOA - DISPLAY "Gruppo@3" GRUPPO - DISPLAY "Conto@3" CONTO - DISPLAY "Sottoconto@6" SOTTOCONTO - DISPLAY "Descrizione@50" DESCR - OUTPUT RSS_GRUPPOA GRUPPO - OUTPUT RSS_CONTOA CONTO - OUTPUT RSS_SOTTOA SOTTOCONTO - OUTPUT RSS_DESCRCONTOA DESCR - CHECKTYPE NORMAL - WARNING "Sottoconto errato" - ADD RUN CG0 -0 -END - -STRING RSS_DESCRCONTOA 50 35 -BEGIN - PROMPT 39 15 "" - FLAG "U" - USE LF_PCON KEY 2 SELECT SOTTOCONTO!="" - INPUT DESCR RSS_DESCRCONTOA - DISPLAY "Descrizione@50" DESCR - DISPLAY "Gruppo@3" GRUPPO - DISPLAY "Conto@3" CONTO - DISPLAY "Sottoconto@6" SOTTOCONTO - COPY OUTPUT RSS_SOTTOA - CHECKTYPE NORMAL - WARNING "Il conto deve essere un ricavo" - ADD RUN CG0 -0 -END - -STRING RSS_MATRICOLA 20 -BEGIN - PROMPT 2 20 "Matricola " - FIELD S3[21,40] -END - -STRING RSS_QUALIFICA 20 -BEGIN - PROMPT 2 21 "Qualifica " - FIELD S3[41,60] -END - -ENDPAGE - -PAGE "Analitica" 11 60 14 - -GROUPBOX DLG_NULL 78 4 -BEGIN - PROMPT 1 0 "" - FLAGS "R" -END - -STRING DLG_NULL 8 -BEGIN - PROMPT 2 1 "Codice " - GROUP 10 - FLAGS "D" -END - -STRING DLG_NULL 50 -BEGIN - PROMPT 2 2 "Descrizione " - GROUP 20 - FLAGS "D" -END - -ENDPAGE - -ENDMASK +#include "vetbrss.h" + +TOOLBAR "Toolbar" 0 0 0 2 + +#include + +ENDPAGE + +PAGE "Risorse" 0 0 0 0 + +GROUPBOX DLG_NULL 75 8 +BEGIN + PROMPT 1 0 "" + FLAGS "R" +END + +STRING RSS_CODICE 16 +BEGIN + PROMPT 2 1 "Codice " + FIELD CODTAB + KEY 1 + USE RSS + FLAGS "U" + INPUT CODTAB RSS_CODICE + DISPLAY "Codice@16" CODTAB + DISPLAY "Denominazione@50" S0 + OUTPUT RSS_CODICE CODTAB + OUTPUT RSS_RAGSOC S0 + CHECKTYPE REQUIRED + MESSAGE COPY,10@ +END + +STRING RSS_RAGSOC 50 +BEGIN + PROMPT 2 2 "Nome " + FIELD S0 + KEY 2 + USE RSS KEY 2 + INPUT S0 RSS_RAGSOC + DISPLAY "Denominazione@50" S0 + DISPLAY "Codice@16" CODTAB + COPY OUTPUT RSS_CODICE + CHECKTYPE REQUIRED + MESSAGE COPY,20@ +END + +STRING RSS_MATRICOLA 20 +BEGIN + PROMPT 42 1 "Matricola " + FIELD S3[21,40] +END + +STRING RSS_QUALIFICA 20 +BEGIN + PROMPT 42 3 "Qualifica " + FIELD S3[41,60] +END + +LIST RSS_COLLAB 1 10 +BEGIN + PROMPT 2 3 "Tipo " + ITEM "|Nessuno" + MESSAGE HIDE,1@|HIDE,2@|ENABLE,RSS_RAGSOC + ITEM "D|Dipendente" + MESSAGE HIDE,1@|SHOW,2@|DISABLE,RSS_RAGSOC + ITEM "F|Fornitore" + MESSAGE SHOW,1@|HIDE,2@|DISABLE,RSS_RAGSOC + FIELD B0 +END + +NUMBER RSS_CODFORN 6 +BEGIN + PROMPT 30 3 "" + USE LF_CLIFO + INPUT TIPOCF "F" + INPUT CODCF RSS_CODFORN + DISPLAY "Codice" CODCF + DISPLAY "Ragione Sociale@50" RAGSOC + OUTPUT RSS_CODFORN CODCF + OUTPUT RSS_RAGSOC RAGSOC + OUTPUT RSS_ADDRESS_F INDCF + OUTPUT RSS_CIVICO_F CIVCF + OUTPUT RSS_STATO_F STATOCF + OUTPUT RSS_COMUNE_F COMCF + CHECKTYPE REQUIRED + FIELD I6 + WARNING "Codice fornitore inesistente" + ADD RUN CG0 -1 + GROUP 1 +END + +NUMBER RSS_CODFIS 6 +BEGIN + PROMPT 30 3 "" + USE LF_ANAG + INPUT TIPOA "F" + INPUT CODANAGR RSS_CODFIS + DISPLAY "Codice" CODANAGR + DISPLAY "Cognome@30" RAGSOC[1,30] + DISPLAY "Nome@20" RAGSOC[31,50] + OUTPUT RSS_CODFIS CODANAGR + OUTPUT RSS_RAGSOC RAGSOC + OUTPUT RSS_ADDRESS_C INDRES + OUTPUT RSS_CIVICO_C CIVRES + OUTPUT RSS_STATO_C STATORES + OUTPUT RSS_COMUNE_C COMRES + CHECKTYPE REQUIRED + WARNING "Codice persona inesistente" + FIELD I6 + ADD RUN BA4 -1 + GROUP 2 +END + +STRING RSS_ADDRESS_F 35 +BEGIN + PROMPT 2 4 "Indirizzo " + FLAGS "D" + GROUP 1 +END + +STRING RSS_CIVICO_F 5 +BEGIN + PROMPT 65 4 "N. " + FLAGS "D" + GROUP 1 +END + +NUMBER RSS_STATO_F 3 +BEGIN + PROMPT 2 5 "Comune: Stato " + FLAGS "DZ" + USE %STA + INPUT CODTAB RSS_STATO_F + OUTPUT RSS_DESTATO_F S0 + CHECKTYPE NORMAL + GROUP 1 +END + +STRING RSS_DESTATO_F 50 +BEGIN + PROMPT 23 5 "" + FLAGS "D" + GROUP 1 +END + +STRING RSS_COMUNE_F 4 +BEGIN + PROMPT 8 6 ":Codice " + FLAGS "DU" + USE LF_COMUNI + INPUT STATO RSS_STATO_F + INPUT COM RSS_COMUNE_F + OUTPUT RSS_DENCOM_F DENCOM + CHECKTYPE NORMAL + GROUP 1 +END + +STRING RSS_DENCOM_F 50 +BEGIN + PROMPT 23 6 "" + FLAGS "D" + GROUP 1 +END + +STRING RSS_ADDRESS_C 35 +BEGIN + PROMPT 2 4 "Indirizzo " + FLAGS "D" + GROUP 2 +END + +STRING RSS_CIVICO_C 5 +BEGIN + PROMPT 65 4 "N. " + FLAGS "D" + GROUP 2 +END + +NUMBER RSS_STATO_C 3 +BEGIN + PROMPT 2 5 "Comune: Stato " + FLAGS "DZ" + USE %STA + INPUT CODTAB RSS_STATO_C + OUTPUT RSS_DESTATO_C S0 + CHECKTYPE NORMAL + GROUP 2 +END + +STRING RSS_DESTATO_C 50 +BEGIN + PROMPT 23 5 "" + FLAGS "D" + GROUP 2 +END + +STRING RSS_COMUNE_C 4 +BEGIN + PROMPT 8 6 ":Codice " + FLAGS "DU" + USE LF_COMUNI + INPUT STATO RSS_STATO_C + INPUT COM RSS_COMUNE_C + OUTPUT RSS_DENCOM_C DENCOM + CHECKTYPE NORMAL + GROUP 2 +END + +STRING RSS_DENCOM_C 50 +BEGIN + PROMPT 23 6 "" + FLAGS "D" + GROUP 2 +END + +STRING RSS_TIPORIGA 4 +BEGIN + PROMPT 1 8 "Tipo riga " + FIELD S8 + FLAGS "U" + USE %TRI SELECT S7=="R" + INPUT CODTAB RSS_TIPORIGA + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT RSS_TIPORIGA CODTAB + OUTPUT RSS_DESCRRIGA S0 + CHECKTYPE REQUIRED +END + +STRING RSS_DESCRRIGA 50 +BEGIN + PROMPT 24 8 "" + USE %TRI KEY 2 SELECT S7=="R" + INPUT S0 RSS_DESCRRIGA + DISPLAY "Descrizione@50" S0 + DISPLAY "Codice" CODTAB + COPY OUTPUT RSS_TIPORIGA +END + + +STRING RSS_CODIVA 4 +BEGIN + PROMPT 1 9 "Codice IVA " + FIELD S3[1,4] + FLAGS "U" + USE %IVA + INPUT CODTAB RSS_CODIVA + DISPLAY "Codice " CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT RSS_CODIVA CODTAB + OUTPUT RSS_DESIVA S0 + CHECKTYPE NORMAL +END + + +STRING RSS_DESIVA 50 +BEGIN + PROMPT 24 9 "" + USE %IVA KEY 2 + INPUT S0 RSS_DESIVA + DISPLAY "Descrizione@50" S0 + DISPLAY "Codice " CODTAB + COPY OUTPUT RSS_CODIVA + CHECKTYPE NORMAL +END + +STRING RSS_CODVAL 4 +BEGIN + PROMPT 1 10 "Codice valuta " + FIELD S4 + FLAGS "U" + USE %VAL + INPUT CODTAB RSS_CODVAL + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT RSS_CODVAL CODTAB + OUTPUT RSS_DESVAL S0 + CHECKTYPE NORMAL +END + +STRING RSS_DESVAL 50 +BEGIN + PROMPT 24 10 "" + USE %VAL KEY 2 + INPUT S0 RSS_DESVAL + DISPLAY "Descrizione@50" S0 + DISPLAY "Codice" CODTAB + COPY OUTPUT RSS_CODVAL + CHECKTYPE NORMAL +END + +STRING RSS_CODART 20 +BEGIN + PROMPT 1 11 "Articolo (CI) " + USE LF_ANAMAG + INPUT CODART RSS_CODART + DISPLAY "Codice@20" CODART + DISPLAY "Descrizione@50" DESCR + OUTPUT RSS_CODART CODART + OUTPUT RSS_DESCART DESCR + CHECKTYPE NORMAL + FLAGS "U" + FIELD S2 +END + +STRING RSS_DESCART 50 34 +BEGIN + PROMPT 40 11 "" + USE LF_ANAMAG KEY 2 + INPUT DESCR RSS_DESCART + DISPLAY "Descrizione@50" DESCR + DISPLAY "Codice@20" CODART + COPY OUTPUT RSS_CODART + CHECKTYPE NORMAL + FLAGS "U" +END + +LISTBOX RSS_CAMPI 15 +BEGIN + PROMPT 1 12 "Campo default " + FIELD S6 + ITEM "Q|Qta prezzo " + FLAGS "H" +END + +CURRENCY RSS_PREZZO 15 +BEGIN + PROMPT 1 12 "Prezzo " + FIELD R10 + FLAGS "U" +END + +NUMBER RSS_QTA 13 5 +BEGIN + PROMPT 38 12 "Quantita' " + FIELD R1 +END + +STRING RSS_UM 2 +BEGIN + PROMPT 67 12 "U.M. " + FIELD S7 + FLAGS "U" + USE %UMS + INPUT CODTAB RSS_UM + DISPLAY "U.M." CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT RSS_UM CODTAB + CHECKTYPE NORMAL +END + +STRING RSS_PRESTAZ 8 +BEGIN + PROMPT 1 13 "Prestazione per fatturazione " + USE PRS + INPUT CODTAB RSS_PRESTAZ + DISPLAY "Codice@8" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT RSS_PRESTAZ CODTAB + CHECKTYPE NORMAL + FIELD S5 +END + +BOOLEAN RSS_MRP_ATTIVO +BEGIN + PROMPT 1 14 "@bCollegamento M.R.P.:" + MESSAGE FALSE CLEAR,9@ + MESSAGE TRUE ENABLE,9@ +END + +STRING RSS_IMPIANTO 5 +BEGIN + PROMPT 25 14 "Impianto " + FIELD S3[5,9] + USE IMP + INPUT CODTAB RSS_IMPIANTO + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT RSS_IMPIANTO CODTAB + GROUP 9 +END + +STRING RSS_LINEA 5 +BEGIN + PROMPT 45 14 "Linea " + FIELD S3[10,14] + USE LNP + INPUT CODTAB RSS_LINEA + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT RSS_LINEA CODTAB + GROUP 9 +END + +NUMBER RSS_GRUPPOA 3 +BEGIN + PROMPT 2 15 "Conto acquisti " + FIELD I3 + END + +NUMBER RSS_CONTOA 3 +BEGIN + PROMPT 22 15 "" + FIELD I4 + END + +NUMBER RSS_SOTTOA 6 +BEGIN + PROMPT 28 15 "" + FIELD I5 + USE LF_PCON SELECT SOTTOCONTO!="" + INPUT GRUPPO RSS_GRUPPOA + INPUT CONTO RSS_CONTOA + INPUT SOTTOCONTO RSS_SOTTOA + DISPLAY "Gruppo@3" GRUPPO + DISPLAY "Conto@3" CONTO + DISPLAY "Sottoconto@6" SOTTOCONTO + DISPLAY "Descrizione@50" DESCR + OUTPUT RSS_GRUPPOA GRUPPO + OUTPUT RSS_CONTOA CONTO + OUTPUT RSS_SOTTOA SOTTOCONTO + OUTPUT RSS_DESCRCONTOA DESCR + CHECKTYPE NORMAL + WARNING "Sottoconto errato" + ADD RUN CG0 -0 +END + +STRING RSS_DESCRCONTOA 50 35 +BEGIN + PROMPT 39 15 "" + FLAG "U" + USE LF_PCON KEY 2 SELECT SOTTOCONTO!="" + INPUT DESCR RSS_DESCRCONTOA + DISPLAY "Descrizione@50" DESCR + DISPLAY "Gruppo@3" GRUPPO + DISPLAY "Conto@3" CONTO + DISPLAY "Sottoconto@6" SOTTOCONTO + COPY OUTPUT RSS_SOTTOA + CHECKTYPE NORMAL + WARNING "Il conto deve essere un ricavo" + ADD RUN CG0 -0 +END + +STRING RSS_TIPOSTRA1 2 +BEGIN + PROMPT 1 17 "Tipo ora straordinaria 1 " + USE &CIORE + INPUT CODTAB RSS_TIPOSTRA1 + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT RSS_TIPOSTRA1 CODTAB + CHECKTYPE NORMAL + FIELD S9 +END + +NUMBER RSS_DOPOSTRA1 2 +BEGIN + PROMPT 41 17 "dopo ore " + FIELD R5 +END + +CURRENCY RSS_COSTOSTRA1 9 +BEGIN + PROMPT 59 17 "Costo " + FIELD R6 +END + +STRING RSS_TIPOSTRA2 2 +BEGIN + PROMPT 1 18 "Tipo ora straordinaria 2 " + COPY USE RSS_TIPOSTRA1 + INPUT CODTAB RSS_TIPOSTRA2 + COPY DISPLAY RSS_TIPOSTRA1 + OUTPUT RSS_TIPOSTRA2 CODTAB + CHECKTYPE NORMAL + FIELD S10 +END + +NUMBER RSS_DOPOSTRA2 2 +BEGIN + PROMPT 41 18 "dopo ore " + FIELD R7 +END + +CURRENCY RSS_COSTOSTRA2 9 +BEGIN + PROMPT 59 18 "Costo " + FIELD R8 +END + +ENDPAGE + +PAGE "Analitica" 11 60 14 + +GROUPBOX DLG_NULL 78 4 +BEGIN + PROMPT 1 0 "" + FLAGS "R" +END + +STRING DLG_NULL 8 +BEGIN + PROMPT 2 1 "Codice " + GROUP 10 + FLAGS "D" +END + +STRING DLG_NULL 50 +BEGIN + PROMPT 2 2 "Descrizione " + GROUP 20 + FLAGS "D" +END + +ENDPAGE + +ENDMASK diff --git a/ve/vetbtip.h b/ve/vetbtip.h index 0391a89ea..9cb29eab4 100755 --- a/ve/vetbtip.h +++ b/ve/vetbtip.h @@ -40,6 +40,8 @@ #define F_DESCELABS 157 #define F_CODELABD 158 #define F_DESCELABD 159 +#define F_CODELABK 160 +#define F_DESCELABK 161 #define F_STATOI_MOD_1 201 #define F_STATOI_MOD_2 202 diff --git a/ve/vetbtip.uml b/ve/vetbtip.uml index 1802eaf2c..e33dc0b42 100755 --- a/ve/vetbtip.uml +++ b/ve/vetbtip.uml @@ -209,7 +209,7 @@ END BOOLEAN F_MOVMAG BEGIN - PROMPT 2 14 "Mov. mag. a partire dallo stato " + PROMPT 2 14 "Mov. magazzino" FIELD B1 MESSAGE FALSE CLEAR,1@ MESSAGE TRUE ENABLE,1@ @@ -219,7 +219,7 @@ END STRING F_STATO_MOV_I 1 BEGIN - PROMPT 38 14 "" + PROMPT 24 14 "dallo stato " FIELD S7 USE %STD INPUT CODTAB F_STATO_MOV_I @@ -1222,14 +1222,14 @@ BEGIN FIELD S11[5,5] END -GROUPBOX DLG_NULL 42 3 +GROUPBOX DLG_NULL 45 3 BEGIN - PROMPT 41 1 "@bIntra" + PROMPT 38 1 "@bIntra" END STRING F_NATURA 1 BEGIN - PROMPT 42 2 "Natura transazione " + PROMPT 39 2 "Natura transazione " FLAGS "U" USE %INT INPUT CODTAB F_NATURA @@ -1256,7 +1256,7 @@ BEGIN FIELD B11 END -GROUPBOX DLG_NULL 78 5 +GROUPBOX DLG_NULL 78 6 BEGIN PROMPT 1 12 "@bElaborazioni automatiche" END @@ -1336,6 +1336,29 @@ BEGIN CHECKTYPE NORMAL END +STRING F_CODELABK 8 +BEGIN + PROMPT 2 16 "Speciale " + FLAG "U" + FIELD S3[29,36] + CHECKTYPE NORMAL + COPY USE F_CODELAB + INPUT CODTAB F_CODELABD + COPY DISPLAY F_CODELAB + OUTPUT F_CODELABK CODTAB + OUTPUT F_DESCELABK S0 + HELP "Codice dell'elaborazione differita da eseguire" +END + +STRING F_DESCELABK 50 +BEGIN + PROMPT 26 16 "" + COPY USE F_DESCELAB + INPUT S0 F_DESCELABD + COPY DISPLAY F_DESCELAB + COPY OUTPUT F_CODELABK + CHECKTYPE NORMAL +END ENDPAGE diff --git a/ve/vetbums.uml b/ve/vetbums.uml index 4616917c5..b1a13bc88 100755 --- a/ve/vetbums.uml +++ b/ve/vetbums.uml @@ -6,7 +6,7 @@ TOOLBAR "Toolbar" 0 0 0 2 ENDPAGE -PAGE "Unita' di misura " 0 0 0 0 +PAGE "Unità di misura " 0 0 0 0 GROUPBOX DLG_NULL 75 7 BEGIN @@ -16,7 +16,7 @@ END STRING F_UM 2 BEGIN - PROMPT 2 2 "Unita' di misura " + PROMPT 2 2 "Unità di misura " FIELD CODTAB KEY 1 FLAG "U" @@ -44,7 +44,7 @@ END STRING F_UMR 2 BEGIN - PROMPT 2 8 "Unita' di riferimento " + PROMPT 2 8 "Unità di riferimento " FIELD S7 FLAG "U" USE %UMS @@ -60,7 +60,7 @@ BEGIN PROMPT 2 10 "Fatt.conversione al riferim." FIELD R10 VALIDATE REQIF_FUNC 1 F_UMR - WARNING "Fattore di conversione obbligatorio se specificata l'unita' di misura di riferimento" + WARNING "Fattore di conversione obbligatorio se specificata l'unità di misura di riferimento" END BOOLEAN F_ROUND @@ -78,6 +78,21 @@ BEGIN FIELD I0 END +DATE DLG_NULL +BEGIN + PROMPT 1 -1 "Ultimo aggiornamento " + FIELD DATAAGG + FLAGS "D" +END + +STRING DLG_NULL 16 +BEGIN + PROMPT 41 -1 "Ultimo utente " + FIELD UTENTE + FLAGS "D" +END + + ENDPAGE ENDMASK