diff --git a/build/fp0.vcxproj b/build/fp0.vcxproj
index b5d69d573..b423b16e9 100644
--- a/build/fp0.vcxproj
+++ b/build/fp0.vcxproj
@@ -194,10 +194,6 @@
-
- false
- true
-
@@ -205,9 +201,6 @@
-
- false
-
@@ -215,7 +208,6 @@
-
diff --git a/build/fp0.vcxproj.filters b/build/fp0.vcxproj.filters
index eb98f06b9..a71089b7c 100644
--- a/build/fp0.vcxproj.filters
+++ b/build/fp0.vcxproj.filters
@@ -45,9 +45,6 @@
Sources
-
- Sources
-
Sources
@@ -65,9 +62,6 @@
Headers
-
- Headers
-
Headers
@@ -82,9 +76,6 @@
Masks
-
- Masks
-
Masks
diff --git a/build/fp1.vcxproj b/build/fp1.vcxproj
index 6660b7522..0439fee25 100644
--- a/build/fp1.vcxproj
+++ b/build/fp1.vcxproj
@@ -187,17 +187,25 @@
+
+
+
+
+
+
+
Document
+
diff --git a/build/fp1.vcxproj.filters b/build/fp1.vcxproj.filters
index 16854163a..80084fe39 100644
--- a/build/fp1.vcxproj.filters
+++ b/build/fp1.vcxproj.filters
@@ -33,6 +33,9 @@
Sources
+
+ Sources
+
@@ -41,11 +44,17 @@
Headers
+
+ Headers
+
Masks
+
+ Masks
+
diff --git a/build/fplib.vcxproj b/build/fplib.vcxproj
index ecd9fda37..16d018345 100644
--- a/build/fplib.vcxproj
+++ b/build/fplib.vcxproj
@@ -174,7 +174,8 @@
- true
+
+
diff --git a/cd/test/ba0740.txt b/cd/test/ba0740.txt
new file mode 100644
index 000000000..49a6af48d
--- /dev/null
+++ b/cd/test/ba0740.txt
@@ -0,0 +1,3 @@
+batbiva.msk
+
+Aggiunto flag sulla tabella iva per escludere il codice dal calcolo bolli esenti
\ No newline at end of file
diff --git a/cd/test/ba0740a.ini b/cd/test/ba0740a.ini
new file mode 100644
index 000000000..8a9ef103d
--- /dev/null
+++ b/cd/test/ba0740a.ini
@@ -0,0 +1,34 @@
+[Main]
+Demo=0
+
+[ba1]
+Edit_4 = ba3 -0
+Edit_5 = ba3 -0
+Edit_6 = ba4 -1
+File(150) = batbiva.msk|X
+Patch = 740
+Versione = 21511200
+
+[ba99]
+Kill(0) = wxmsw240.dll|x
+Kill(1) = batbsce.txt|x
+Kill(2) = bastfsc.rep|x
+Kill(3) = bastfsc.msk|x
+Kill(4) = bastcms.msk|x
+Kill(5) = bastcms.rep|x
+Kill(6) = bastuue.rep|x
+Kill(7) = bastuue.msk|x
+
+[ba]
+Data = 21-03-2019
+Descrizione = Base
+Dischi = 1
+Moduli = sy
+OEM =
+Patch = 740
+PostProcess = bainst -0 BA
+PreProcess =
+Prezzo(1) =
+Prezzo(2) =
+Versione = 21511200
+
diff --git a/cd/test/ba0740a1.zip b/cd/test/ba0740a1.zip
new file mode 100644
index 000000000..08dd3af55
Binary files /dev/null and b/cd/test/ba0740a1.zip differ
diff --git a/cd/test/ca0742.txt b/cd/test/ca0742.txt
new file mode 100644
index 000000000..527754641
--- /dev/null
+++ b/cd/test/ca0742.txt
@@ -0,0 +1,4 @@
+ca3.exe
+
+Corretta selezione commessa nella stampa rendiconto. Venivano comprese anche le commesse con lo stesso prefisso
+(Es. CV18MPR50579E2 entrava in CV18MPR50579 e CV18MB250579E2 entrava in CV18MB250579
diff --git a/cd/test/ca0742a.ini b/cd/test/ca0742a.ini
new file mode 100644
index 000000000..713294ee1
--- /dev/null
+++ b/cd/test/ca0742a.ini
@@ -0,0 +1,27 @@
+[Main]
+Demo=0
+
+[ca1]
+Edit_106 = ca0 -3
+Edit_107 = ca2 -0
+Edit_146 = ca0 -4
+Edit_147 = ca0 -5
+Edit_148 = ca0 -6
+Edit_149 = ca0 -7
+File(26) = ca3.exe|X
+Patch = 742
+Versione = 21511200
+
+[ca]
+Data = 06-06-2016
+Descrizione = Contabilita' Analitica
+Dischi = 1
+Moduli = ba,cg
+OEM =
+Patch = 742
+PostProcess =
+PreProcess =
+Prezzo(1) =
+Prezzo(2) =
+Versione = 21511200
+
diff --git a/cd/test/ca0742a1.zip b/cd/test/ca0742a1.zip
new file mode 100644
index 000000000..5e61c1e3d
Binary files /dev/null and b/cd/test/ca0742a1.zip differ
diff --git a/cd/test/cg0742.txt b/cd/test/cg0742.txt
new file mode 100644
index 000000000..7a3b158e1
--- /dev/null
+++ b/cd/test/cg0742.txt
@@ -0,0 +1,5 @@
+cg3.exe
+cg2100c.msk
+cg4.exe
+
+Allineamento con ultima compilazione di xvt
\ No newline at end of file
diff --git a/cd/test/cg0742a.ini b/cd/test/cg0742a.ini
new file mode 100644
index 000000000..4088cbef9
--- /dev/null
+++ b/cd/test/cg0742a.ini
@@ -0,0 +1,96 @@
+[Main]
+Demo=0
+
+[cg1]
+Edit_23 = cg2 -0
+File(13) = cg2100c.msk|X
+File(23) = cg3.exe|X
+File(41) = cg4.exe|X
+Patch = 0742
+Versione = 21511200
+
+[cg99]
+Kill(0) = bastpor.rep|x
+Kill(1) = batbins.msk|x
+Kill(2) = bastcam.msk|x
+Kill(3) = bastnot.msk|x
+Kill(4) = bastesc.msk|x
+Kill(5) = bastleg.msk|x
+Kill(6) = bastpor.msk|x
+Kill(7) = batbscc.msk|x
+Kill(8) = batblia.msk|x
+Kill(9) = bastzon.rep|x
+Kill(10) = batbarb.msk|x
+Kill(11) = batblia.msk|x
+Kill(12) = batbdpn.msk|x
+Kill(13) = bastcco.msk|x
+Kill(14) = bastcam.rep|x
+Kill(15) = bastcve.msk|x
+Kill(16) = batbleg.msk|x
+Kill(17) = batbvet.msk|x
+Kill(18) = batbcco.msk|x
+Kill(19) = bastver.msk|x
+Kill(20) = batbind.msk|x
+Kill(21) = batbntb.msk|x
+Kill(22) = bastivd.msk|x
+Kill(23) = bastscc.rep|x
+Kill(24) = bastmsp.rep|x
+Kill(25) = bastleg.rep|x
+Kill(26) = bastivd.rep|x
+Kill(27) = batbtit.msk|x
+Kill(28) = bastntb.rep|x
+Kill(29) = bastntb.msk|x
+Kill(30) = batbtra.msk|x
+Kill(31) = bastesc.rep|x
+Kill(32) = bastvet.msk|x
+Kill(33) = batblbu.msk|x
+Kill(34) = batbinl.msk|x
+Kill(35) = batbivd.msk|x
+Kill(36) = bastnot.rep|x
+Kill(37) = bastcfi.rep|x
+Kill(38) = bastcfi.msk|x
+Kill(39) = batbmsp.msk|x
+Kill(40) = bastreg.rep|x
+Kill(41) = bastvet.rep|x
+Kill(42) = batbnot.msk|x
+Kill(43) = bastver.rep|x
+Kill(44) = batbzon.msk|x
+Kill(45) = batbcfi.msk|x
+Kill(46) = bastreg.msk|x
+Kill(47) = bastpdb.rep|x
+Kill(48) = batbdel.msk|x
+Kill(49) = batbcam.msk|x
+Kill(50) = bastarb.msk|x
+Kill(51) = batbcve.msk|x
+Kill(52) = bastdpn.rep|x
+Kill(53) = bastndo.msk|x
+Kill(54) = batbesc.msk|x
+Kill(55) = cgtbcon.msk|x
+Kill(56) = bastdpn.msk|x
+Kill(57) = batbreg.msk|x
+Kill(58) = batbndo.msk|x
+Kill(59) = batbver.msk|x
+Kill(60) = batbpdb.msk|x
+Kill(61) = bastpdb.msk|x
+Kill(62) = bastndo.rep|x
+Kill(63) = bastscc.msk|x
+Kill(64) = bastzon.msk|x
+Kill(65) = batbpor.msk|x
+Kill(66) = bastcco.rep|x
+Kill(67) = bastarb.rep|x
+Kill(68) = bastcve.rep|x
+Kill(69) = bastmsp.msk|x
+
+[cg]
+Data = 21-03-2019
+Descrizione = Contabilita' Generale
+Dischi = 1
+Moduli = ba
+OEM =
+Patch = 742
+PostProcess = bainst -0 CG
+PreProcess =
+Prezzo(1) =
+Prezzo(2) =
+Versione = 21511200
+
diff --git a/cd/test/cg0742a1.zip b/cd/test/cg0742a1.zip
new file mode 100644
index 000000000..5c9c96fba
Binary files /dev/null and b/cd/test/cg0742a1.zip differ
diff --git a/cd/test/fp0738.txt b/cd/test/fp0738.txt
new file mode 100644
index 000000000..ab5852727
--- /dev/null
+++ b/cd/test/fp0738.txt
@@ -0,0 +1,3 @@
+fp0.exe
+
+Aggiunte info in caso di errori
\ No newline at end of file
diff --git a/cd/test/fp0738a.ini b/cd/test/fp0738a.ini
new file mode 100644
index 000000000..203a88e57
--- /dev/null
+++ b/cd/test/fp0738a.ini
@@ -0,0 +1,19 @@
+[Main]
+Demo=0
+
+[fp1]
+File(0) = fp0.exe|X
+Patch = 738
+Versione = 21511200
+
+[fp]
+Data = 19-03-2019
+Descrizione = Fattura Elettronica
+Dischi = 1
+Moduli = cg,ve
+OEM =
+Patch = 738
+PostProcess =
+PreProcess =
+Versione = 21511200
+
diff --git a/cd/test/fp0738a1.zip b/cd/test/fp0738a1.zip
new file mode 100644
index 000000000..c70ff57a6
Binary files /dev/null and b/cd/test/fp0738a1.zip differ
diff --git a/cd/test/fp0742.txt b/cd/test/fp0742.txt
new file mode 100644
index 000000000..70deb7049
--- /dev/null
+++ b/cd/test/fp0742.txt
@@ -0,0 +1,2 @@
+fp0.exe
+fp0100a.msk
diff --git a/cd/test/fp0742a.ini b/cd/test/fp0742a.ini
new file mode 100644
index 000000000..370a1d5c8
--- /dev/null
+++ b/cd/test/fp0742a.ini
@@ -0,0 +1,20 @@
+[Main]
+Demo=0
+
+[fp1]
+File(0) = fp0.exe|X
+File(1) = fp0100a.msk|X
+Patch = 742
+Versione = 21511200
+
+[fp]
+Data = 21-03-2019
+Descrizione = Fattura Elettronica
+Dischi = 1
+Moduli = cg,ve
+OEM =
+Patch = 742
+PostProcess =
+PreProcess =
+Versione = 21511200
+
diff --git a/cd/test/fp0742a1.zip b/cd/test/fp0742a1.zip
new file mode 100644
index 000000000..2117f9969
Binary files /dev/null and b/cd/test/fp0742a1.zip differ
diff --git a/cd/test/sy0738.txt b/cd/test/sy0738.txt
new file mode 100644
index 000000000..7a62e1287
--- /dev/null
+++ b/cd/test/sy0738.txt
@@ -0,0 +1,4 @@
+xvaga.dll
+xvtdb.dll
+
+Patch di supporto per fp0738
\ No newline at end of file
diff --git a/cd/test/sy0738a.ini b/cd/test/sy0738a.ini
new file mode 100644
index 000000000..e6941ba36
--- /dev/null
+++ b/cd/test/sy0738a.ini
@@ -0,0 +1,22 @@
+[Main]
+Demo=0
+
+[sy1]
+File(52) = xvaga.dll|X
+File(53) = xvtdb.dll|X
+Patch = 738
+Versione = 21511200
+
+[sy]
+Data = 19-03-2019
+Descrizione = Sistema
+Dischi = 1
+Moduli =
+OEM =
+Patch = 738
+PostProcess =
+PreProcess =
+Prezzo(1) =
+Prezzo(2) =
+Versione = 21511200
+
diff --git a/cd/test/sy0738a1.zip b/cd/test/sy0738a1.zip
new file mode 100644
index 000000000..793972816
Binary files /dev/null and b/cd/test/sy0738a1.zip differ
diff --git a/cd/test/sy0742.txt b/cd/test/sy0742.txt
new file mode 100644
index 000000000..038c1ba80
--- /dev/null
+++ b/cd/test/sy0742.txt
@@ -0,0 +1,2 @@
+xvaga.dll
+xvtdb.dll
diff --git a/cd/test/sy0742a.ini b/cd/test/sy0742a.ini
new file mode 100644
index 000000000..3b599c17c
--- /dev/null
+++ b/cd/test/sy0742a.ini
@@ -0,0 +1,22 @@
+[Main]
+Demo=0
+
+[sy1]
+File(52) = xvaga.dll|X
+File(53) = xvtdb.dll|X
+Patch = 0742
+Versione = 21511200
+
+[sy]
+Data = 21-03-2019
+Descrizione = Sistema
+Dischi = 1
+Moduli =
+OEM =
+Patch = 742
+PostProcess =
+PreProcess =
+Prezzo(1) =
+Prezzo(2) =
+Versione = 21511200
+
diff --git a/cd/test/sy0742a1.zip b/cd/test/sy0742a1.zip
new file mode 100644
index 000000000..578a78a42
Binary files /dev/null and b/cd/test/sy0742a1.zip differ
diff --git a/cd/test/tf0742.txt b/cd/test/tf0742.txt
new file mode 100644
index 000000000..0dfa6e35a
--- /dev/null
+++ b/cd/test/tf0742.txt
@@ -0,0 +1,4 @@
+tf0.exe
+tf0100a.msk
+
+Allineamento con ultima compilazione di xvt
\ No newline at end of file
diff --git a/cd/test/tf0742a.ini b/cd/test/tf0742a.ini
new file mode 100644
index 000000000..28305781e
--- /dev/null
+++ b/cd/test/tf0742a.ini
@@ -0,0 +1,20 @@
+[Main]
+Demo=0
+
+[tf1]
+File(0) = tf0.exe|X
+File(1) = tf0100a.msk|X
+Patch = 0742
+Versione = 21511200
+
+[tf]
+Data = 21-03-2019
+Descrizione = Trasferimento fatture
+Dischi = 1
+Moduli = cg
+OEM =
+Patch = 742
+PostProcess =
+PreProcess =
+Versione = 21511200
+
diff --git a/cd/test/tf0742a1.zip b/cd/test/tf0742a1.zip
new file mode 100644
index 000000000..44f3977ee
Binary files /dev/null and b/cd/test/tf0742a1.zip differ
diff --git a/cd/test/ve0740.txt b/cd/test/ve0740.txt
new file mode 100644
index 000000000..e59335908
--- /dev/null
+++ b/cd/test/ve0740.txt
@@ -0,0 +1,8 @@
+ve5.exe
+ve6.exe
+ve0.exe
+ve1.exe
+vetbtip.msk
+
+Aggiunto flag sulla tabella iva per escludere il codice dal calcolo bolli esenti
+Sistemata maschera tipi documento
\ No newline at end of file
diff --git a/cd/test/ve0740a.ini b/cd/test/ve0740a.ini
new file mode 100644
index 000000000..46a756450
--- /dev/null
+++ b/cd/test/ve0740a.ini
@@ -0,0 +1,133 @@
+[Main]
+Demo=0
+
+[ve1]
+File(0) = ve0.exe|X
+File(19) = ve1.exe|X
+File(86) = ve5.exe|X
+File(93) = ve6.exe|X
+File(224) = vetbtip.msk|X
+Patch = 740
+Versione = 21511200
+
+[ve99]
+Kill(0) = batbcld.msk|x
+Kill(1) = bastspp.rep|x
+Kill(2) = baststd.rep|x
+Kill(3) = bastbnp.rep|x
+Kill(4) = ve7400a.msk|x
+Kill(5) = bastfrd.msk|x
+Kill(6) = bastprs.rep|x
+Kill(7) = basttip.msk|x
+Kill(8) = bastcaa.rep|x
+Kill(9) = efstbnp.msk|x
+Kill(10) = batbprs.msk|x
+Kill(11) = batbabe.msk|x
+Kill(12) = bastgca.msk|x
+Kill(13) = batbgmc.msk|x
+Kill(14) = bastcau.rep|x
+Kill(15) = bastcra.msk|x
+Kill(16) = bastspp.msk|x
+Kill(17) = basttag.rep|x
+Kill(18) = batbcau.msk|x
+Kill(19) = bastctr.rep|x
+Kill(20) = ve7500a.msk|x
+Kill(21) = bastasf.rep|x
+Kill(22) = bastums.rep|x
+Kill(23) = bastfrr.msk|x
+Kill(24) = basteld.rep|x
+Kill(25) = batbprv.msk|x
+Kill(26) = ve7200a.msk|x
+Kill(27) = batbgca.msk|x
+Kill(28) = batbmre.msk|x
+Kill(29) = bastcaa.msk|x
+Kill(30) = ve7700a.msk|x
+Kill(31) = batbtri.msk|x
+Kill(32) = basttip.rep|x
+Kill(33) = efstbnp.rep|x
+Kill(34) = baststd.msk|x
+Kill(35) = batbasf.msk|x
+Kill(36) = bastimb.msk|x
+Kill(37) = batbrfa.msk|x
+Kill(38) = ve7300a.msk|x
+Kill(39) = ve7600a.msk|x
+Kill(40) = batbspt.msk|x
+Kill(41) = bastfca.rep|x
+Kill(42) = bastrfc.msk|x
+Kill(43) = bastprs.msk|x
+Kill(44) = bastgcg.msk|x
+Kill(45) = batbspp.msk|x
+Kill(46) = batbgcg.msk|x
+Kill(47) = bastnum.rep|x
+Kill(48) = bastgmc.msk|x
+Kill(49) = batbrfc.msk|x
+Kill(50) = bastubi.msk|x
+Kill(51) = batbtag.msk|x
+Kill(52) = ve7400a.ini|x
+Kill(53) = bastrfa.msk|x
+Kill(54) = bastabe.rep|x
+Kill(55) = bastubi.rep|x
+Kill(56) = bastasf.msk|x
+Kill(57) = batbctr.msk|x
+Kill(58) = ve7100a.msk|x
+Kill(59) = batbcaa.msk|x
+Kill(60) = batbfid.msk|x
+Kill(61) = ve7300a.frm|x
+Kill(62) = bastfrr.rep|x
+Kill(63) = bastums.msk|x
+Kill(64) = basttri.rep|x
+Kill(65) = bastrfa.rep|x
+Kill(66) = bastcau.msk|x
+Kill(67) = batbtip.msk|x
+Kill(68) = batbubi.msk|x
+Kill(69) = basttag.msk|x
+Kill(70) = basteld.msk|x
+Kill(71) = bastimb.rep|x
+Kill(72) = bastrfc.rep|x
+Kill(73) = ve7.exe|x
+Kill(74) = ve7200a.frm|x
+Kill(75) = batbfrr.msk|x
+Kill(76) = bastfca.msk|x
+Kill(77) = batbfrd.msk|x
+Kill(78) = bastctr.msk|x
+Kill(79) = batbpro.msk|x
+Kill(80) = ve7400conf.ini|x
+Kill(81) = bastfrm.rep|x
+Kill(82) = batbbnp.msk|x
+Kill(83) = bastgca.rep|x
+Kill(84) = batbstd.msk|x
+Kill(85) = ve7701a.ini|x
+Kill(86) = batbfsa.msk|x
+Kill(87) = batbnum.msk|x
+Kill(88) = bastabe.msk|x
+Kill(89) = eftbbnp.msk|x
+Kill(90) = batbfca.msk|x
+Kill(91) = bastgcg.rep|x
+Kill(92) = batbgsa.msk|x
+Kill(93) = bastfrm.msk|x
+Kill(94) = bastbnp.msk|x
+Kill(95) = bastgmc.rep|x
+Kill(96) = bastcra.rep|x
+Kill(97) = bastfrd.rep|x
+Kill(98) = batbacr.msk|x
+Kill(99) = batbimb.msk|x
+Kill(100) = basttri.msk|x
+Kill(101) = bastnum.msk|x
+Kill(102) = batbeld.msk|x
+Kill(103) = batbums.msk|x
+Kill(104) = batbcra.msk|x
+Kill(105) = batbfrm.msk|x
+
+[ve]
+Data = 12-03-2019
+Descrizione = Vendite
+Dischi = 1
+Moduli = ba,cg9,pr9,mg9,sv9,in9,ef9
+OEM =
+Patch = 740
+PostProcess = bainst -0 VE
+PreProcess =
+Prezzo(1) =
+Prezzo(2) =
+Versione = 21511200
+
diff --git a/cd/test/ve0740a1.zip b/cd/test/ve0740a1.zip
new file mode 100644
index 000000000..6bf9a5746
Binary files /dev/null and b/cd/test/ve0740a1.zip differ
diff --git a/src/ba/batbiva.h b/src/ba/batbiva.h
index 4d13f11cd..a6c7da1d3 100755
--- a/src/ba/batbiva.h
+++ b/src/ba/batbiva.h
@@ -24,3 +24,4 @@
#define FLD_DESCR_I1 125
#define FLD_INDET_S4 126
#define FLD_NATURA 127
+#define CHK_TABIVA_B5 128
diff --git a/src/ba/batbiva.uml b/src/ba/batbiva.uml
index 21cabd741..96c51adc9 100755
--- a/src/ba/batbiva.uml
+++ b/src/ba/batbiva.uml
@@ -53,22 +53,22 @@ BEGIN
HELP "Indicare il tipo di codice IVA"
ITEM " |Regime IVA normale"
MESSAGE ENABLE,FLD_TABIVA_R0|CLEAR,FLD_TABIVA_I0
- MESSAGE CLEAR,FLD_TABIVA_I3|CLEAR,FLD_TABIVA_I4
+ MESSAGE CLEAR,FLD_TABIVA_I3|CLEAR,FLD_TABIVA_I4|HIDE,CHK_TABIVA_B5
MESSAGE ENABLE,FLD_TABIVA_S6
ITEM "VE|Ricavi da ventilare"
MESSAGE CLEAR,FLD_TABIVA_R0|CLEAR,FLD_TABIVA_I0|CLEAR,FLD_TABIVA_I3
- MESSAGE CLEAR,FLD_TABIVA_I4|CLEAR,FLD_TABIVA_S6
+ MESSAGE CLEAR,FLD_TABIVA_I4|CLEAR,FLD_TABIVA_S6|HIDE,CHK_TABIVA_B5
ITEM "ES|Operazioni esenti"
MESSAGE CLEAR,FLD_TABIVA_R0|CLEAR,FLD_TABIVA_I0
- MESSAGE ENABLE,FLD_TABIVA_I3|ENABLE,FLD_TABIVA_I4
+ MESSAGE ENABLE,FLD_TABIVA_I3|ENABLE,FLD_TABIVA_I4|SHOW,CHK_TABIVA_B5
MESSAGE ENABLE,FLD_TABIVA_S6
ITEM "NI|Non imponibili"
MESSAGE CLEAR,FLD_TABIVA_R0|ENABLE,FLD_TABIVA_I0
- MESSAGE ENABLE,FLD_TABIVA_I3|ENABLE,FLD_TABIVA_I4
+ MESSAGE ENABLE,FLD_TABIVA_I3|ENABLE,FLD_TABIVA_I4|SHOW,CHK_TABIVA_B5
MESSAGE ENABLE,FLD_TABIVA_S6
ITEM "NS|Non soggetti"
MESSAGE CLEAR,FLD_TABIVA_R0|CLEAR,FLD_TABIVA_I0
- MESSAGE ENABLE,FLD_TABIVA_I3|ENABLE,FLD_TABIVA_I4
+ MESSAGE ENABLE,FLD_TABIVA_I3|ENABLE,FLD_TABIVA_I4|SHOW,CHK_TABIVA_B5
MESSAGE ENABLE,FLD_TABIVA_S6
END
@@ -144,6 +144,12 @@ BEGIN
FIELD S4
END
+BOOLEAN CHK_TABIVA_B5
+BEGIN
+ PROMPT 30 5 "Escluso dal calcolo dei bolli sufatture esenti"
+ FIELD B5
+END
+
GROUPBOX DLG_NULL 78 4
BEGIN
PROMPT 1 6 "@bComunicazione operazioni rilevanti ai fini dell'IVA (Spesometro)"
diff --git a/src/ca/ca3700.cpp b/src/ca/ca3700.cpp
index de63b3482..424cfbe52 100755
--- a/src/ca/ca3700.cpp
+++ b/src/ca/ca3700.cpp
@@ -1653,11 +1653,8 @@ void TPrint_rendiconto_ca_recordset::crea_righe_da_rmovana(TLocalisamfile& tmp,
{
//legge la testata iniziale
const long numreg = rmovana.get_long(RMOVANA_NUMREG);
-#ifdef DBG
- if (numreg == 32736)
- const int cazzissimo = 1;
-#endif
- //se la testata e' cambiata, allora ha cambiato movana e quindi le righe da compattare sono..
+
+ //se la testata e' cambiata, allora ha cambiato movana e quindi le righe da compattare sono..
//..quelle che ha gia' messo nell'array delle righe_attuali
if (numreg != old_numreg)
{
@@ -1692,7 +1689,21 @@ void TPrint_rendiconto_ca_recordset::crea_righe_da_rmovana(TLocalisamfile& tmp,
for (cur_rmovana = 0; cur_rmovana.pos() < rmovana_items; ++cur_rmovana)
{
if (!pi.addstatus(1))
- break;
+ break;
+ const TString & cms = cur_rmovana.curr().get(RMOVANA_CODCMS);
+
+ if (cms != _codcms)
+ {
+#ifdef DBG
+ const long numreg = rmovana.get_long(RMOVANA_NUMREG);
+ const TRectype & movana = cache().get(LF_MOVANA, numreg);
+ TString msg; msg << "Mov - Commessa " << _codcms << " - Scartato " << movana.get(MOVANA_DCODNUM) << "." << movana.get_int(MOVANA_DANNO) << "." << movana.get_int(MOVANA_DNDOC) << " - Commessa " << cms;
+
+ log.log(2, msg);
+#endif
+ continue;
+ }
+
scrive_riga(tmp, rmovana, movana, NULL, log);
}
}
@@ -1706,9 +1717,9 @@ int TPrint_rendiconto_ca_recordset::crea_filtro_rdoc(const TMask& msk, TRectype&
{
int cur_key = 6;
//intanto sistema darec arec
- da_rdoc.put(RDOC_CODCMS, _codcms);
+ da_rdoc.put(RDOC_CODCMS, _codcms);
da_rdoc.put(RDOC_CODCOSTO, _codcosto);
- a_rdoc = da_rdoc;
+ a_rdoc = da_rdoc;
//se c'è solo cdc..
if (_codcms.blank() && _codcosto.full())
@@ -1822,7 +1833,8 @@ void TPrint_rendiconto_ca_recordset::crea_righe_da_rdoc(TLocalisamfile& tmp, con
//La riga esaminata deve avere una testata valida!!!!Se la testata non esiste va saltata..
//..la riga
const TRectype& curr_doc = cur_rdoc.curr(LF_DOC);
- if (!curr_doc.empty())
+
+ if (!curr_doc.empty())
{
//controlla se il documento cui appartiene la rigadoc e' stato contabilizzato;
//se e' stato contabilizzato lo salta in quanto la riga documento apparira' attraverso le righe
@@ -1833,11 +1845,22 @@ void TPrint_rendiconto_ca_recordset::crea_righe_da_rdoc(TLocalisamfile& tmp, con
//..ricevere/emettere, vanno ri-contabilizzate lo stesso anche se lo sono gia' state. Il loro..
//..importo verra' poi messo nel fatturato.
const TRectype& curr_rdoc = cur_rdoc.curr();
+ const TString & cms = curr_rdoc.get(RDOC_CODCMS);
const TString& rdoc_dacodnum = curr_rdoc.get(RDOC_DACODNUM);
+
#ifdef DBG
- if (rdoc_dacodnum == "FDE" && curr_rdoc.get_int(RDOC_ANNO) == 2011 && curr_rdoc.get_int(RDOC_NDOC) == 3)
- const int culone = 1;
+ if (curr_rdoc.get(RDOC_CODNUM) == "F01" && curr_rdoc.get_int(RDOC_ANNO) == 2018 && curr_rdoc.get_int(RDOC_NDOC) == 5350)
+ const int culone = 1;
#endif
+ if (cms != _codcms)
+ {
+#ifdef DBG
+ TString msg; msg << "Doc - Commessa " << _codcms << " - Scartato " << curr_rdoc.get(RDOC_CODNUM) << "." << curr_rdoc.get_int(RDOC_ANNO) << "." << curr_rdoc.get_int(RDOC_NDOC) << " - Commessa " << cms;
+
+ log.log(2, msg);
+#endif
+ continue;
+ }
const bool is_special_doc = _num_fdr.find(rdoc_dacodnum) >= 0;
//documento non contabilizzato o fattura da ricevere con numerazione configurata speciale
if (numregca == 0) // || is_special_doc)
diff --git a/src/cg/cglib01.h b/src/cg/cglib01.h
index db16308fe..75355c19c 100755
--- a/src/cg/cglib01.h
+++ b/src/cg/cglib01.h
@@ -158,8 +158,9 @@ public: // TObject
bool senza_imposta() { return percentuale() == ZERO;}
int allegato(char tipocf) const { return get_int(tipocf == 'F' ? "S8" : "S7"); }
- bool has_plafond() const { return get_int("S3") > 0; }
- bool sospeso() const { return get_bool("B2"); }
+ bool has_plafond() const { return get_int("S3") > 0; }
+ bool sospeso() const { return get_bool("B2"); }
+ bool escluso_esenti() const { return get_bool("B5"); }
real imposta(const real& imponibile, int ndec = AUTO_DECIMALS, const char * codval = "") const; // Calcola l'imposta sull'imponibile l'imposta e la ritorna
real scorpora(real& imponibile, int ndec = AUTO_DECIMALS, const char * codval = "") const; // Scorpora dall'imponibile l'imposta e la ritorna
diff --git a/src/fp/fp0.cpp b/src/fp/fp0.cpp
index 0c89b13a1..bbcdc387c 100644
--- a/src/fp/fp0.cpp
+++ b/src/fp/fp0.cpp
@@ -11,7 +11,6 @@ int main(int argc, char** argv)
case 1: rt = fp0200(argc, argv); break; // Inserimento massivo PEC e Cod Sdi clifo
case 2: rt = fp0300(argc, argv); break; // Gestione fatture attive (PAA, Ex Fattura PA)
case 3: rt = fp0400(argc, argv); break; // Monitor fatture passive
- case 4: rt = fp0500(argc, argv); break; // Elenco mancate consegna
default: rt = fp0100(argc, argv); break; // Configurazione
}
return rt;
diff --git a/src/fp/fp0.h b/src/fp/fp0.h
index e2d05fe11..402f3391e 100644
--- a/src/fp/fp0.h
+++ b/src/fp/fp0.h
@@ -5,6 +5,5 @@ int fp0100(int argc, char* argv[]);
int fp0200(int argc, char* argv[]);
int fp0300(int argc, char* argv[]);
int fp0400(int argc, char* argv[]);
-int fp0500(int argc, char* argv[]);
#endif
diff --git a/src/fp/fp0100.cpp b/src/fp/fp0100.cpp
index f87b3e031..5aa4b88e7 100644
--- a/src/fp/fp0100.cpp
+++ b/src/fp/fp0100.cpp
@@ -20,6 +20,7 @@ protected:
void tipi_import() const;
static TMask& get_tmp_msk(const char* title);
virtual bool on_key(KEY key);
+ void delete_row_npf(TOperable_field& o) const;
virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
public:
@@ -47,6 +48,7 @@ void TParametri_mask::save_all() const
fp_settings().set_check_not_block(get_bool(F_CHECK_NOT_BLOCK));
fp_settings().set_no_sconti_fatt(get_bool(F_CHECK_NO_SCONTI));
TFP_righe_custom().save_sheet(sfield(F_FORMPERS));
+ TFP_nota_piede_f().save_sheet(sfield(F_NPFSHEET));
}
void TParametri_mask::load_all()
@@ -64,6 +66,7 @@ void TParametri_mask::load_all()
set(F_CHECK_NOT_BLOCK, fp_settings().get_check_not_block());
set(F_CHECK_NO_SCONTI, fp_settings().get_no_sconti_fatt());
TFP_righe_custom().load_sheet(sfield(F_FORMPERS));
+ TFP_nota_piede_f().load_sheet(sfield(F_NPFSHEET));
}
void TParametri_mask::tipi_import() const
@@ -134,6 +137,18 @@ bool TParametri_mask::on_key(KEY key)
return true;
}
+void TParametri_mask::delete_row_npf(TOperable_field& o) const
+{
+ TSheet_field& sf = sfield(F_NPFSHEET);
+
+ TMask& msk = o.mask();
+ const TString& tipodoc_msk = msk.get(S_DOC);
+
+ for(int i=0; i < sf.items(); i++)
+ if (tipodoc_msk == sf.row(i).get(0))
+ sf.destroy(i);
+}
+
bool TParametri_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
{
switch (o.dlg())
@@ -216,6 +231,13 @@ bool TParametri_mask::on_field_event(TOperable_field& o, TField_event e, long jo
set(F_ESPORTADOC, "");
}
}
+ case DLG_DELREC:
+ {
+ if (e == fe_button)
+ {
+ delete_row_npf(o);
+ }
+ }
break;
default:
break;
diff --git a/src/fp/fp0100a.h b/src/fp/fp0100a.h
index 84ae40a64..f85275565 100644
--- a/src/fp/fp0100a.h
+++ b/src/fp/fp0100a.h
@@ -23,4 +23,10 @@
#define S_TIPORIGA 102
#define S_QTA 103
#define S_PREZZO 104
-#define S_IMPONIBILE 105
\ No newline at end of file
+#define S_IMPONIBILE 105
+
+
+#define F_NPFSHEET 501
+
+#define S_DOC 101
+#define S_NOTAPF 102
\ No newline at end of file
diff --git a/src/fp/fp0100a.uml b/src/fp/fp0100a.uml
index b0eb03475..ebcbd7356 100644
--- a/src/fp/fp0100a.uml
+++ b/src/fp/fp0100a.uml
@@ -101,7 +101,6 @@ BEGIN
ITEM "Imponibile"
END
-
GROUPBOX DLG_NULL 78 3
BEGIN
PROMPT 1 8 "@BControlli preventivi"
@@ -122,6 +121,12 @@ BEGIN
PROMPT 2 12 "Non esporre sconti in fattura"
END
+SPREADSHEET F_NPFSHEET 60 6
+BEGIN
+ PROMPT 1 14 "Inserimento\nNote piede fattura"
+ ITEM "Tipo\nDoc@4"
+ ITEM "Nota piede\nFattura@15"
+END
ENDPAGE
@@ -155,11 +160,11 @@ ENDPAGE
ENDMASK
-PAGE "Elementi spredsheet" 0 2 0 0
+PAGE "Elementi spredsheet" -1 -1 60 12
STRING S_TIPODOC 4
BEGIN
- PROMPT 15 1 "Tipo doc "
+ PROMPT 1 1 "Tipo doc "
HELP "Lasciare libero per tutti i tipo documento"
USE %TIP
SELECT S3[37,40]!=""
@@ -173,7 +178,7 @@ END
STRING S_TIPORIGA 4
BEGIN
- PROMPT 15 1 "Tipo riga "
+ PROMPT 1 2 "Tipo riga "
USE %TRI
INPUT CODTAB S_TIPORIGA
DISPLAY "Codice@10" CODTAB
@@ -184,12 +189,12 @@ END
STRING S_QTA 10
BEGIN
- PROMPT 0 2 "Qta"
+ PROMPT 1 3 "Qta"
END
STRING S_PREZZO 10
BEGIN
- PROMPT 0 2 "Prezzo"
+ PROMPT 1 4 "Prezzo"
USE %FRR
INPUT CODTAB S_PREZZO
DISPLAY "Codice@10" CODTAB
@@ -199,7 +204,7 @@ END
STRING S_IMPONIBILE 10
BEGIN
- PROMPT 0 2 "Imponibile"
+ PROMPT 1 5 "Imponibile"
USE %FRR
INPUT CODTAB S_IMPONIBILE
DISPLAY "Codice" CODTAB
@@ -224,4 +229,50 @@ END
ENDPAGE
+ENDMASK
+
+
+PAGE "Elementi NPF" -1 -1 60 12
+
+STRING S_DOC 4
+BEGIN
+ PROMPT 1 1 "Tipo doc "
+ HELP "Lasciare libero per tutti i tipo documento"
+ USE %TIP
+ SELECT S3[37,40]!=""
+ INPUT CODTAB S_TIPODOC
+ DISPLAY "Codice@10" CODTAB
+ DISPLAY "Descrizione@50" S0
+ DISPLAY "Tipo SDI@10" S3[37,40]
+ OUTPUT S_TIPODOC CODTAB
+ FLAG "UPA"
+END
+
+MEMO S_NOTAPF 0 0
+BEGIN
+ PROMPT 1 6 "Nota piede fattura"
+END
+
+ENDPAGE
+
+TOOLBAR "Riga" 0 0 0 2
+
+BUTTON DLG_OK 2 2
+BEGIN
+ PROMPT 1 1 ""
+END
+
+
+BUTTON DLG_CANCEL 2 2
+BEGIN
+ PROMPT 1 1 ""
+END
+
+BUTTON DLG_DELREC 2 2
+BEGIN
+ PROMPT 1 1 "ELIMINA NOTA"
+END
+
+ENDPAGE
+
ENDMASK
\ No newline at end of file
diff --git a/src/fp/fp1.cpp b/src/fp/fp1.cpp
index 8a8248282..3fe3a6e4f 100644
--- a/src/fp/fp1.cpp
+++ b/src/fp/fp1.cpp
@@ -9,6 +9,7 @@ int main(int argc, char** argv)
// Stampe fatturazione elettronica
switch (r)
{
+ case 1: rt = fp1200(argc, argv); break; // Elenco mancate consegna
default: rt = fp1100(argc, argv); break; // Stampa bolli fatture
}
return rt;
diff --git a/src/fp/fp1.h b/src/fp/fp1.h
index 082a309e1..fd3761f0f 100644
--- a/src/fp/fp1.h
+++ b/src/fp/fp1.h
@@ -2,5 +2,6 @@
#define __FP1_H
int fp1100(int argc, char* argv[]);
+int fp1200(int argc, char* argv[]);
#endif
diff --git a/src/fp/fp0500.cpp b/src/fp/fp1200.cpp
similarity index 99%
rename from src/fp/fp0500.cpp
rename to src/fp/fp1200.cpp
index 1ac1f9d2c..0c7a2766e 100644
--- a/src/fp/fp0500.cpp
+++ b/src/fp/fp1200.cpp
@@ -11,7 +11,7 @@
#include "../fe/felib.h"
#include "fp0.h"
-#include "fp0500a.h"
+#include "fp1200a.h"
/////////////////////////////////////////////////////////////////////////////////////
// Globals
@@ -44,7 +44,7 @@ protected:
bool _filter_changed;
friend class TMancati_app;
public:
- TMancati_mask() : TAutomask("fp0500a"), _filter_changed(true)
+ TMancati_mask() : TAutomask("fp1200a"), _filter_changed(true)
{
disable(DLG_OK);
_idx = -1;
@@ -430,7 +430,7 @@ bool TMancati_app::destroy()
return TSkeleton_application::destroy();
}
-int fp0500(int argc, char* argv[])
+int fp1200(int argc, char* argv[])
{
TMancati_app d2p;
d2p.run(argc, argv, TR("Elenco Fatture Mancata Consegna"));
diff --git a/src/fp/fp0500a.h b/src/fp/fp1200a.h
similarity index 100%
rename from src/fp/fp0500a.h
rename to src/fp/fp1200a.h
diff --git a/src/fp/fp0500a.uml b/src/fp/fp1200a.uml
similarity index 99%
rename from src/fp/fp0500a.uml
rename to src/fp/fp1200a.uml
index f93367b7b..e75427694 100644
--- a/src/fp/fp0500a.uml
+++ b/src/fp/fp1200a.uml
@@ -1,4 +1,4 @@
-#include "fp0500a.h"
+#include "fp1200a.h"
TOOLBAR "topbar" 0 0 0 2
diff --git a/src/fp/fplib.h b/src/fp/fplib.h
index d8b37fdda..aa7ee9950 100644
--- a/src/fp/fplib.h
+++ b/src/fp/fplib.h
@@ -15,6 +15,65 @@
#define SQL_FLD "sql/"
#define MANCATA_SEND "S" // Se la mail di mancata consegna è già stata inviata P1_ERRINT è segnato con "S"
+
+// Typedef per aiutare a capire cosa sono le chiavi
+typedef TString MCodice_riga;
+typedef TString MTipo_documento;
+
+// Mannaggia il fruttivendolo
+class TFP_righe_custom : public TObject
+{
+ bool _loaded;
+
+ struct TCustCol
+ {
+ TString _col_qta;
+ // Le colonne prezzo e imp non sono lette se di default
+ TString _col_prezzo;
+ TString _col_imponibile;
+ TString _col_nota_piede;
+ };
+
+ // Mappa con in chiave COD_RIGA, TIPO_DOC
+ std::map> _custom_table;
+
+ void load_map();
+ static TCustCol& get_no_custom();
+ TCustCol& get(const TString& codriga, const TString& tipodoc);
+
+public:
+
+ static void save_sheet(TSheet_field& sheet_field);
+ static void load_sheet(TSheet_field& sheet_field);
+
+ const TString& get_qta(const TString& codriga, const TString& tipodoc) { return get(codriga, tipodoc)._col_qta; }
+ const TString& get_prezzo(const TString& codriga, const TString& tipodoc) { return get(codriga, tipodoc)._col_prezzo; }
+ const TString& get_imponibile(const TString& codriga, const TString& tipodoc) { return get(codriga, tipodoc)._col_imponibile; }
+
+ TFP_righe_custom();
+};
+
+class TFP_nota_piede_f
+{
+ std::map _nota_piede_fattura;
+ bool _loaded;
+ TToken_string _tipi_doc; // Array di stringhe dei tipi doc caricati (per capire se ne elimino)
+ const TString _null_string;
+ static void write_ini_npf(const TString& tipodoc, TToken_string& msg); // Salva sul file ini la n.p.f. di quel tipodoc
+ static void delete_ini_npf(const TString& tipodoc); // Rimuove i tipidoc in eccesso (quando si modifica lo spreadsheet)
+ static TString get_ini_npf(const TString& tipodoc); // Legge dal file ini e restituisce la n.p.f. di quel tipodoc
+ void get_load(); // Carica la mappa
+ void save_npf_spredsheet(TSheet_field& sheet_field);
+ void save_new_tipidoc(TSheet_field& sheet_field);
+
+public:
+ void load_sheet(TSheet_field& sheet_field);
+ void save_sheet(TSheet_field& sheet_field);
+ const TString& get_nota_piede(const TString& tipo_doc);
+
+ TFP_nota_piede_f();
+};
+
enum { no_pdf = -1, pdf_ok = 0, no_alleg = -2};
// Ritorna la connessione al DB paf secondo i parametri impostati nel programma di configurazione
@@ -137,6 +196,8 @@ private:
TPaf_container _paf_container;
int _count_r_conai;
bool _nascondi_sconti_righe_fatt;
+ TFP_righe_custom _righe_custom;
+ TFP_nota_piede_f _riga_npf;
// Classe interna per gestire righe aggiuntive in riepilogo
class TRiepilogo_agg
@@ -195,7 +256,7 @@ protected:
bool add_row_art(long& riga_art, const TString& codice_tipo, const TString& codice_valore, TPaf_record& paf);
bool add_row_alleg(TFilename& file, long& nprogr, TPaf_record& paf);
const TString& converti_prezzo(const real& prezzo) const;
- void set_qta_prezzo(TPaf_record& paf1800f, TRiga_documento* rdoc) const;
+ void set_qta_prezzo(TPaf_record& paf1800f, TRiga_documento* rdoc);
void add_ritenuta(const TDocumentoEsteso& doc, const TSpesa_prest& sp, TPaf_record& paf0700f) const;
bool add_riepilogo_iva(TPaf_record& paf2200f, const TCodiceIVA& cod_iva, const char* eiva, const real& imponibile = ZERO, const real& imposta = ZERO);
bool add_cassa_previdenziale(TRiga_documento& rdoc);
@@ -246,7 +307,10 @@ public:
const bool is_f8() const;
const bool get_check_not_block() const;
const TString& get_body_mail(int idx = -1) const;
+ const TString& get_npf(const char* tipodoc, int idx) const;
const bool get_no_sconti_fatt() const;
+ // Get tipidoc per NotaPiedeFattura
+ const TString get_npf_tipodoc(int indx) const;
// Setters
void set_db_indirizzo(const TString& ind) const;
@@ -265,8 +329,12 @@ public:
void set_check_not_block(bool not_block) const;
void set_body_mail(const char* msg, int idx = -1) const;
void set_no_sconti_fatt(const bool no_sconti_fatt) const;
+ void set_npf(const char * tipodoc, const char* msg, int idx) const;
+ void set_npf_tipodoc(const TString& tipodoc, int indx) const;
void remove_para_ini(int idx);
+ void remove_npf_ini(const char* tipodoc, int idx);
+ void remove_tipodoc_npf(int idx) const;
};
inline TFP_settings& fp_settings()
@@ -296,42 +364,6 @@ public:
TFP_selected_docs();
};
-// Typedef per aiutare a capire cosa sono le chiavi
-typedef TString MCodice_riga;
-typedef TString MTipo_documento;
-
-// Mannaggia il fruttivendolo
-class TFP_righe_custom : public TObject
-{
- bool _loaded;
-
- struct TCustCol
- {
- TString _col_qta;
- // Le colonne prezzo e imp non sono lette se di default
- TString _col_prezzo;
- TString _col_imponibile;
- };
-
- // Mappa con in chiave COD_RIGA, TIPO_DOC
- std::map> _custom_table;
-
- void load_map();
- static TCustCol& get_no_custom();
- TCustCol& get(const TString& codriga, const TString& tipodoc);
-
-public:
-
- static void save_sheet(TSheet_field& sheet_field);
- static void load_sheet(TSheet_field& sheet_field);
-
- const TString& get_qta(const TString& codriga, const TString& tipodoc) { return get(codriga, tipodoc)._col_qta; }
- const TString& get_prezzo(const TString& codriga, const TString& tipodoc) { return get(codriga, tipodoc)._col_prezzo; }
- const TString& get_imponibile(const TString& codriga, const TString& tipodoc) { return get(codriga, tipodoc)._col_imponibile; }
-
- TFP_righe_custom();
-};
-
class TFp_mail_sender
{
int _anno;
diff --git a/src/fp/fplib01.cpp b/src/fp/fplib01.cpp
index 3306aa6fe..b558f1787 100644
--- a/src/fp/fplib01.cpp
+++ b/src/fp/fplib01.cpp
@@ -46,6 +46,7 @@ void set_connection(SSimple_query& s)
}
#endif
}
+
SSimple_query& fp_db()
{
static SSimple_query* db = nullptr;
@@ -1161,16 +1162,14 @@ const TString& TDoc_fp::converti_prezzo(const real& prezzo) const
ret << prezzo;
return ret;
}
-void TDoc_fp::set_qta_prezzo(TPaf_record& paf1800f, TRiga_documento* rdoc) const
+void TDoc_fp::set_qta_prezzo(TPaf_record& paf1800f, TRiga_documento* rdoc)
{
// Setto l'unità di misura
paf1800f.set("PI_UNITAMISURA", rdoc->get(RDOC_UMQTA));
- static TFP_righe_custom righe_custom;
-
- const TString& field_qta = righe_custom.get_qta(rdoc->tipo().codice(), rdoc->doc().tipo().codice());
- const TString& field_prezzo = righe_custom.get_prezzo(rdoc->tipo().codice(), rdoc->doc().tipo().codice());
- const TString& field_imponibile = righe_custom.get_imponibile(rdoc->tipo().codice(), rdoc->doc().tipo().codice());
+ const TString& field_qta = _righe_custom.get_qta(rdoc->tipo().codice(), rdoc->doc().tipo().codice());
+ const TString& field_prezzo = _righe_custom.get_prezzo(rdoc->tipo().codice(), rdoc->doc().tipo().codice());
+ const TString& field_imponibile = _righe_custom.get_imponibile(rdoc->tipo().codice(), rdoc->doc().tipo().codice());
const bool custom_prezzo = field_prezzo.full();
@@ -2014,6 +2013,22 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc)
}
}
+ const TString& nota_piede_fatt = _riga_npf.get_nota_piede(doc.tipo().codice());
+ if(nota_piede_fatt.full())
+ {
+ reset(paf1800f);
+ paf1800f.set("PI_NUMEROLINEA", riga);
+ reset(paf3000f);
+ paf3000f.set("PT_RIFNUMLINEA", riga);
+ paf3000f.set("PT_COMMENTO", nota_piede_fatt.left(900));
+ paf1800f.set("PI_QUANTITA", UNO);
+ paf1800f.set("PI_PREZZOUNIT", ZERO);
+ paf1800f.set("PI_PRZTOTALE", ZERO);
+ set_IVA(_codivadefault, paf1800f);
+ ok &= insert(paf1800f) && insert(paf3000f);
+ riga++;
+ }
+
//
//
// Metto qua i dati DDT per capire se la fattura è accompagnatoria o deriva da bolla
diff --git a/src/fp/fplib02.cpp b/src/fp/fplib02.cpp
index 1460041e0..2bea45d76 100644
--- a/src/fp/fplib02.cpp
+++ b/src/fp/fplib02.cpp
@@ -21,6 +21,7 @@
#define FP_F8 "f8"
#define FP_CHECK_NOT_BLOCK "checknotblock"
#define FP_MAIL "mail"
+#define FP_NOTA_PIEDE_F "npf" // Nota piede fattura
#define FP_CHECK_NO_SCONTI_FATT "noscontifatt"
// Sheet fp0300
@@ -125,6 +126,18 @@ const TString& TFP_settings::get_body_mail(int idx) const
return ini_get_string(FILE_CONFIG, FILE_SECTION, FP_MAIL, "STOpsTOP", idx);
}
+const TString& TFP_settings::get_npf(const char * tipodoc, int idx) const
+{
+ TString name; name << FP_NOTA_PIEDE_F << "-" << tipodoc;
+ return ini_get_string(FILE_CONFIG, FILE_SECTION, name, "FERMATIostrega", idx);
+}
+
+const TString TFP_settings::get_npf_tipodoc(int indx) const
+{
+ TString name; name << FP_NOTA_PIEDE_F << "_tipodoc";
+ return ini_get_string(FILE_CONFIG, FILE_SECTION, name, "FERMATIostrega", indx);
+}
+
const bool TFP_settings::get_no_sconti_fatt() const
{
return ini_get_bool(FILE_CONFIG, FILE_SECTION, FP_CHECK_NO_SCONTI_FATT, false);
@@ -205,6 +218,13 @@ void TFP_settings::set_body_mail(const char* msg, int idx) const
ini_set_string(FILE_CONFIG, FILE_SECTION, FP_MAIL, msg, idx);
}
+// Set nota piede fattura
+void TFP_settings::set_npf(const char * tipodoc, const char* msg, int idx) const
+{
+ TString name; name << FP_NOTA_PIEDE_F << "-" << tipodoc;
+ ini_set_string(FILE_CONFIG, FILE_SECTION, name, msg, idx);
+}
+
void TFP_settings::set_no_sconti_fatt(const bool no_sconti_fatt) const
{
ini_set_bool(FILE_CONFIG, FILE_SECTION, FP_CHECK_NO_SCONTI_FATT, no_sconti_fatt);
@@ -215,6 +235,25 @@ void TFP_settings::remove_para_ini(int idx)
ini_remove(FILE_CONFIG, FILE_SECTION, FP_MAIL, idx);
}
+void TFP_settings::remove_npf_ini(const char * tipodoc, int idx)
+{
+ TString name; name << FP_NOTA_PIEDE_F << "-" << tipodoc;
+ ini_remove(FILE_CONFIG, FILE_SECTION, name, idx);
+}
+
+void TFP_settings::set_npf_tipodoc(const TString& tipodoc, int indx) const
+{
+ TString name; name << FP_NOTA_PIEDE_F << "_tipodoc";
+ ini_set_string(FILE_CONFIG, FILE_SECTION, name, tipodoc, indx);
+}
+
+// Rimuove linea ini in eccesso per tipodoc per nota piede fattura
+void TFP_settings::remove_tipodoc_npf(const int idx) const
+{
+ TString name; name << FP_NOTA_PIEDE_F << "_tipodoc";
+ ini_remove(FILE_CONFIG, FILE_SECTION, name, idx);
+}
+
TRectype TFP_selected_docs::fill_rectype() const
{
TRectype r(LF_TABMOD);
@@ -307,6 +346,161 @@ TFP_righe_custom::TCustCol& TFP_righe_custom::get(const TString& codriga, const
return get_no_custom();
}
+void TFP_nota_piede_f::write_ini_npf(const TString& tipodoc, TToken_string& msg)
+{
+ /* Vado a salvare in un config .ini tipo-doc:messaggio su piu righe */
+ int indx = 0;
+
+ // Conto quanti ne avevo salvati prima nel file ini per poi controllare
+ // che non sto salvando meno di quelli che ci sono già
+ int previous_indx = 0;
+ for (TString row = fp_settings().get_npf(tipodoc, previous_indx); row != "FERMATIostrega"; row = fp_settings().get_npf(tipodoc, previous_indx))
+ previous_indx++;
+ // Vado a salvare ogni riga nel file ini
+ for (const char* row = msg.get(); row; row = msg.get())
+ fp_settings().set_npf(tipodoc, row, indx++);
+
+ if (indx < previous_indx)
+ {
+ for (int i = indx; i < previous_indx; i++)
+ fp_settings().remove_npf_ini(tipodoc, i);
+ }
+}
+
+void TFP_nota_piede_f::delete_ini_npf(const TString& tipodoc)
+{
+ // Conto quanti ne avevo salvati prima nel file ini per poi controllare
+ // che non sto salvando meno di quelli che ci sono già
+ int previous_indx = 0;
+ for (TString row = fp_settings().get_npf(tipodoc, previous_indx); row != "FERMATIostrega"; row = fp_settings().get_npf(tipodoc, previous_indx))
+ previous_indx++;
+ for (int i = 0; i < previous_indx; i++)
+ fp_settings().remove_npf_ini(tipodoc, i);
+
+}
+
+// Crea la stringa della nota se su piu righe dal file ini (nometag+indice)
+TString TFP_nota_piede_f::get_ini_npf(const TString& tipodoc)
+{
+ TString msg; msg.cut(0);
+
+ int indx = 0;
+ for (TString row = fp_settings().get_npf(tipodoc, indx); row != "FERMATIostrega"; row = fp_settings().get_npf(tipodoc, indx))
+ {
+ if(indx++ > 0)
+ msg << '\n';
+ msg << row;
+ }
+ return msg;
+}
+
+void TFP_nota_piede_f::get_load()
+{
+ // Prima leggo i tipi doc che ho salvato dall'ini
+ TString tipo_get = "";
+ int indx = 0;
+ while ((tipo_get = fp_settings().get_npf_tipodoc(indx++)) != "FERMATIostrega")
+ _tipi_doc.add(tipo_get);
+
+ const int itms = _tipi_doc.items();
+ for (int i = 0; i < itms; i++)
+ {
+ tipo_get = _tipi_doc.get();
+ TString npf = get_ini_npf(tipo_get);
+ _nota_piede_fattura.insert({ tipo_get, npf });
+ }
+ _loaded = true;
+}
+
+void TFP_nota_piede_f::load_sheet(TSheet_field& sheet_field)
+{
+ sheet_field.hide();
+ // Prima leggo i tipi doc che ho salvato dall'ini
+ TString tipo_get = "";
+ int indx = 0;
+ while((tipo_get = fp_settings().get_npf_tipodoc(indx++)) != "FERMATIostrega")
+ _tipi_doc.add(tipo_get);
+
+ int i = 0;
+ while (!(tipo_get = _tipi_doc.get()).empty())
+ {
+ TString npf = get_ini_npf(tipo_get);
+ TToken_string& row = sheet_field.row(-1);
+ row.add(tipo_get);
+ row.add(npf);
+ }
+ sheet_field.show();
+ sheet_field.force_update();
+}
+
+void TFP_nota_piede_f::save_npf_spredsheet(TSheet_field& sheet_field)
+{
+ const int items_sf = sheet_field.items();
+ TString tipo_doc = 0;
+ // Salvo le note piede fatt presenti nello spreadsheet
+ // Se ho eliminato una nota di un tipodoc devo rimuovere tutte le righe di quel tipodoc
+ for (int i = 0; i < items_sf; i++)
+ {
+ TToken_string row = sheet_field.row(i);
+ TToken_string msg(row.get(1), '\n');
+ write_ini_npf(tipo_doc = row.get(0), msg);
+ _tipi_doc.restart();
+ for (int j = 0; j < _tipi_doc.items(); j++)
+ if (tipo_doc == _tipi_doc.get()) // Elimino dall'array i tipi doc che sto salvando
+ _tipi_doc.destroy(j); // Per controllare che non ne rimangano alcuni in piu`
+ }
+
+ if (_tipi_doc.items() > 0) // E` rimasto qualcuno fuori (è stato eliminato un tipodoc rispetto a quelli salvati nel file ini)
+ {
+ for (int i = 0; i < _tipi_doc.items(); i++) // Per ogni tipodoc rimasto fuori elimino tutte le possibili righe del messaggio
+ delete_ini_npf(_tipi_doc.get());
+ }
+}
+
+void TFP_nota_piede_f::save_new_tipidoc(TSheet_field& sheet_field)
+{
+ int n_tipidoc = 0;
+ TString npf_get;
+ // Conto quanti tipi doc ho nel file ini
+ for (int i = 0; (npf_get = fp_settings().get_npf_tipodoc(i)) != "FERMATIostrega"; i++)
+ {
+ n_tipidoc++;
+ _tipi_doc.add(npf_get);
+ }
+
+ // Salvo i nuovi tipidoc
+ const int items_sf = sheet_field.items();
+ for (int i = 0; i < items_sf; i++)
+ {
+ TToken_string row = sheet_field.row(i);
+ TString tipodoc_sf(row.get(0));
+ fp_settings().set_npf_tipodoc(tipodoc_sf, i);
+ }
+
+ if (items_sf < n_tipidoc)
+ for (int i = items_sf; i < n_tipidoc; i++)
+ fp_settings().remove_tipodoc_npf(i);
+}
+
+void TFP_nota_piede_f::save_sheet(TSheet_field& sheet_field)
+{
+ save_new_tipidoc(sheet_field);
+ save_npf_spredsheet(sheet_field);
+}
+
+const TString& TFP_nota_piede_f::get_nota_piede(const TString& tipo_doc)
+{
+ if (!_loaded)
+ get_load();
+ if(_nota_piede_fattura.find(tipo_doc) != _nota_piede_fattura.end())
+ return _nota_piede_fattura[tipo_doc];
+ return _null_string;
+}
+
+TFP_nota_piede_f::TFP_nota_piede_f() : _loaded(false), _null_string("")
+{
+}
+
void TFP_righe_custom::load_map()
{
TRelation rel(LF_TABMOD);
diff --git a/src/fp/fplib03.cpp b/src/fp/fplib03.cpp
index 7697bb403..c71f902ef 100644
--- a/src/fp/fplib03.cpp
+++ b/src/fp/fplib03.cpp
@@ -3,7 +3,7 @@
#include
#include
#include "modaut.h"
-#include "fp0500a.h"
+#include "fp1200a.h"
class TExternal_app;
diff --git a/src/fp/fpmenu.men b/src/fp/fpmenu.men
index d1cce2a0f..8d2fd0c6b 100644
--- a/src/fp/fpmenu.men
+++ b/src/fp/fpmenu.men
@@ -14,7 +14,7 @@ Caption = "Stampe"
Picture =
Module = fp
Flags = ""
-Item_01 = "Elenco Mancata Consegna", "fp0 -4", ""
+Item_01 = "Elenco Mancata Consegna", "fp1 -1", ""
Item_02 = "Elenco bolli in fattura", "fp1 -0", ""
[FPMENU_003]
diff --git a/src/ve/velib03.cpp b/src/ve/velib03.cpp
index 94701edbb..63fed65e0 100755
--- a/src/ve/velib03.cpp
+++ b/src/ve/velib03.cpp
@@ -504,10 +504,7 @@ real TDocumento::bolli(real & imp, int ndec, TTipo_importo t) const
TCurrency_documento spese_val(spese());
spese_val.change_to_firm_val();
const real sp_orig = spese_val.get_num();
- bool estero = FALSE; // Assumiamo per ora non estero
-
- TString4 codiva_es;
- iva_esente(codiva_es);
+ bool estero = false; // Assumiamo per ora non estero
for (int j = 0; j < 5 && tot_bolli+iva_bolli != old_bolli; j++)
{
@@ -516,20 +513,18 @@ real TDocumento::bolli(real & imp, int ndec, TTipo_importo t) const
const real imp_spese = sp_orig + tot_bolli - iva_bolli;
const real imponibile = importo - imposte - imp_spese;
tot_bolli = ZERO;
- if (!tipo().nota_credito())
+ real imponibile_esente;
+
+ for (int r = physical_rows(); r > 0; r--)
{
- real imponibile_esente;
- for (int r = physical_rows(); r > 0; r--)
- {
- const TRiga_documento& riga = ((TDocumento*)this)->row(r);
- const TCodiceIVA codiva(riga.get(RDOC_CODIVA));
+ const TRiga_documento& riga = ((TDocumento*)this)->row(r);
+ const TCodiceIVA codiva(riga.get(RDOC_CODIVA));
- if (codiva.tipo().not_empty())
- imponibile_esente += riga.imponibile();
- }
- if (imponibile_esente >= impmin_bolli)
- tot_bolli = bolli_es;
- }
+ if (codiva.tipo().not_empty() && !codiva.escluso_esenti())
+ imponibile_esente += abs(riga.imponibile());
+ }
+ if (imponibile_esente >= impmin_bolli)
+ tot_bolli = bolli_es;
pag.set_total(imponibile, imposte, imp_spese);
pag.set_rate_auto();
@@ -540,16 +535,16 @@ real TDocumento::bolli(real & imp, int ndec, TTipo_importo t) const
switch (p)
{
- case _ric_ban:
- {
- int i;
-
- for (i = 0; i < nscagl - 1; i++)
- if ((real &) sca_bolli[i] >= imp)
- break;
- if (imp_bolli.items() > 0)
- tot_bolli += (real &) imp_bolli[i];
- }
+ case _ric_ban:
+ {
+ int j;
+
+ for (j = 0; j < nscagl - 1; j++)
+ if ((real &)sca_bolli[j] >= imp)
+ break;
+ if (imp_bolli.items() > 0)
+ tot_bolli += (real &)imp_bolli[j];
+ }
break;
case _tratta:
case _tratta_acc:
diff --git a/src/ve/vetbtip.uml b/src/ve/vetbtip.uml
index 9ed3b8fb3..dad4de822 100755
--- a/src/ve/vetbtip.uml
+++ b/src/ve/vetbtip.uml
@@ -234,19 +234,19 @@ END
BOOLEAN F_SPESEAUT
BEGIN
- PROMPT 2 14 "Addebito auto spese cliente"
+ PROMPT 2 14 "Add.auto spese cliente"
FIELD B0
END
BOOLEAN F_FATCOM
BEGIN
- PROMPT 30 14 "Calcolo fattura commerciale"
+ PROMPT 30 14 "Calc.fatt.commerciale"
FIELD B9
END
BOOLEAN F_LORDO
BEGIN
- PROMPT 55 14 "Calcolo importi al lordo"
+ PROMPT 55 14 "Calc.importi al lordo"
FIELD B8
MESSAGE TRUE CLEAR,F_FATCOM
MESSAGE FALSE ENABLE,F_FATCOM