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