Patch level : 12.0 384

Files correlati     : tf
Commento            : 
TF0200:
Sistemato programma di estrazione dati:
- Aggiunta doppia gestione dei record: ogni volta che vengono estratti i dati si creerà un record con chiave GENERATA = 'G' e uno = 'U' così da poter rilevare sempre le modifiche dell'utente.
- Adattata maschera per nuova chiave e aggiunti nomi VPXX.
- aggiunte funzioni saveGen(), checkOldValue() e salvataggio del record per supportare il punto precedente.
- I valori di corretti del prorata per l'IVA esigibile e detratta.
- Aggiornato calcolo debito periodo precedente, adesso effettua dei controlli sui i record precedenti.
- Aggiornato calcolo debito anno precedente con controlli sui record precedenti e il valore in LIA.R0.
- Sistemati controlli campi maschera che causavano bug minori.

TF 0500:
- Sistemato programma per gestire nuova chiave.
- Adattata maschera.

git-svn-id: svn://10.65.10.50/branches/R_10_00@23769 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
mtollari 2017-05-04 12:52:58 +00:00
parent 05deed15ae
commit ed5b4a6a72
5 changed files with 265 additions and 62 deletions

@ -2,8 +2,8 @@
#include <automask.h>
#include <config.h>
#include <progind.h>
#include <recarray.h> // cache()
#include <recset.h> // TISAM_recordset
#include <recarray.h> // cache()
#include <recset.h> // TISAM_recordset
#include <rmoviva.h>
#include <utility.h>
@ -17,6 +17,7 @@
// ComLiqPerIva: Comunicazione Liquidazioni Periodiche IVA
/** Utilities **/
// Ritorna un cursore di tab.PRM
const TCursor getPRM(int anno)
{
@ -46,6 +47,17 @@ const TRectype getLIA(int anno)
return cache().get("%LIA", key);
}
// Ritorna il record richiesto di tabcom.LIM
const TRectype getLAM(int anno, int mese)
{
TString key; key << anno;
if(mese < 10)
key << "0" << mese;
else
key << mese;
return cache().get("LAM", key);
}
// Ritorna il record valido richiesto di tabcom.VER
const TRectype getVER(int anno, int mese)
{
@ -155,30 +167,17 @@ int getTipoReg(int anno, TString codReg)
return stoi(cache().get("REG", key, "I0"));
}
/* Da errori in allocazione TArray
const TISAM_recordset getCurIvaXCassa(TDate data_da, TDate data_a, TString codreg_att)
{
TString query = "USE IVADIFF SELECT (BETWEEN(DATAREGP,#DAL,#AL))&&(MOV.REG=#REG)&&(STR((MESELIQ<13)&&(TIPOMOV>2)&&(MOV.TOTDOC!=0)&&(IMPOSTA!=0)&&NUM(INDETR!='X')))";
query << "\nBY DATAREGP DATAREG NUMPRO";
query << "\nJOIN MOV INTO NUMREG==NUMREG";
query << "\nJOIN CLIFO TO MOV INTO TIPOCF==TIPO CODCF==CODCF";
TISAM_recordset id(query);
id.set_var("#DAL", data_da);
id.set_var("#AL", data_a);
id.set_var("#REG", codreg_att);
return id;
}
*/
class ComLiqPerIva_mask : public TAutomask
{
protected:
bool mensile;
virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
TRectype trueData;
virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
void extractinator();
void checkOldValue(int field, real val);
public:
ComLiqPerIva_mask() : TAutomask("tf0200a") { first_focus(F_ANNO); }
ComLiqPerIva_mask() : TAutomask("tf0200a"), trueData(LF_IVALIQ) { first_focus(F_ANNO); }
void saveGen();
};
bool ComLiqPerIva_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
@ -237,11 +236,11 @@ bool ComLiqPerIva_mask::on_field_event(TOperable_field& o, TField_event e, long
}
break;
case F_MESE:
if(e == fe_modify)
if(e == fe_modify && mensile)
set(F_TRIMESTRE, (get_int(F_MESE) - 1) / 3 + 1);
break;
case F_TRIMESTRE:
if(e == fe_modify)
if(e == fe_modify && !mensile)
set(F_MESE, get_int(F_TRIMESTRE) * 3);
break;
case DLG_RECALC:
@ -249,7 +248,7 @@ bool ComLiqPerIva_mask::on_field_event(TOperable_field& o, TField_event e, long
if(e == fe_button)
{
// Controllo che non ci sia già
if(!cache().get(LF_IVALIQ, TString(get(F_ANNO)) << "|" << get(F_MESE)).empty())
if(!cache().get(LF_IVALIQ, TString(get(F_ANNO)) << "|" << get(F_MESE) << "|U").empty())
{
if(!yesno_box("Sono già stati elaborati questi dati, si desidera ricalcolarli?"))
break;
@ -262,11 +261,14 @@ bool ComLiqPerIva_mask::on_field_event(TOperable_field& o, TField_event e, long
// TExternal_application app;
break;
case DLG_SAVEREC:
if(e != fe_init && !trueData.empty())
trueData.write_rewrite(TLocalisamfile(LF_IVALIQ));
}
if(o.dlg() >= CAMPI_CON_BOOLEAN && o.dlg() <= F_IMPNOVER && e == fe_modify) // Se l'utente modifica manualmente uno dei campi calcolati da Campo flaggo il DB
{
set(o.dlg() + 50, "X");
checkOldValue(o.dlg(), get_real(o.dlg()));
}
// Controllo sull'aggiornamento di campi collegati ad altri
@ -287,16 +289,16 @@ bool ComLiqPerIva_mask::on_field_event(TOperable_field& o, TField_event e, long
if((ivaes - ivadet) >= ZERO)
{
set(F_IVADOV, ivaes - ivadet);
set(B_IVADOV, "X");
set(F_IVADOVC, ZERO);
set(B_IVADOVC, "");
checkOldValue(F_IVADOV, ivaes - ivadet);
checkOldValue(F_IVADOVC, "");
}
else
{
set(F_IVADOV, ZERO);
set(B_IVADOV, "");
set(F_IVADOVC, (ivaes - ivadet) * -UNO);
set(B_IVADOVC, "X");
checkOldValue(F_IVADOV, "");
checkOldValue(F_IVADOVC, (ivaes - ivadet) * -UNO);
}
}
// IVA da versare VS a credito
@ -316,16 +318,16 @@ bool ComLiqPerIva_mask::on_field_event(TOperable_field& o, TField_event e, long
if(debito - credito >= ZERO)
{
set(F_IVAVER, debito - credito);
set(B_IVAVER, "X");
set(F_IVAVERC, ZERO);
set(B_IVAVERC, "");
checkOldValue(F_IVAVER, debito - credito);
checkOldValue(F_IVAVERC, "");
}
else
{
set(F_IVAVER, ZERO);
set(B_IVAVER, "");
set(F_IVAVERC, credito - debito);
set(B_IVAVERC, "X");
checkOldValue(F_IVAVER, "");
checkOldValue(F_IVAVERC, credito - debito);
}
}
break;
@ -450,8 +452,10 @@ void ComLiqPerIva_mask::extractinator() // Per gli amici GTFO
}
/** Resto *****************************************************************************************************/
ivaes = ivaes + rowLim.get_real("R13");
ivadet = ivadet + rowLim.get_real("R12");
TRectype rowLam = getLAM(anno, start);
ivaes = ivaes + rowLam.get_real("R0");
ivadet = ivadet + rowLam.get_real("R1");
rettifiche = rettifiche + rowLim.get_real("R5");
varimp = varimp + rowLim.get_real("R17");
@ -465,15 +469,67 @@ void ComLiqPerIva_mask::extractinator() // Per gli amici GTFO
real appReal = ZERO;
// Credito periodo precedente
TToken_string tokenPrec = rowLim.get("S0");
real app1 = ZERO, app2 = ZERO;
tokenPrec.get(0, app1);
tokenPrec.get(1, app2);
tokenPrec.get(2, appReal);
creprec = creprec + appReal;
if(start != 1) // A gennaio non lo calcolo
{
/* Se siamo in una liquidazione trimestrale e stiamo calcolando il primo trimestre
* andiamo a prendere i dati da LAM */
if(!mensile && start <= 3)
{
// Recupero il record di LAM del mese precedente
TRectype tempLam = getLAM(anno, start - 1);
// Calcolo eventuale credito
real appCredito = tempLam.get_real("R0") - tempLam.get_real("R1");
// Se c'è un credito lo scrivo
if(appCredito > ZERO)
creprec = creprec + appCredito;
}
/* Se sono in una liquidazione mensile o nel primo mese di una trimestrale
* es. aprile ((4 - 1) % 3) = 0, maggio ((5 - 1) % 3) = 1 */
else if(mensile || (!mensile && ((start - 1) % 3) == 0))
{
TString key; key << anno << "|" << start - 1 << "|U";
real appCredito(cache().get(LF_IVALIQ, key, "IVADOVC"));
if(appCredito > ZERO)
creprec = creprec + appCredito;
}
}
// Credito anno precedente
creaprec = creaprec + rowLia.get_real("R0");
/* Per calcolare il credito dell'anno precedente inizio a leggere i record precedenti su IVALIQ
* fino a quando ne trovo uno >= 0.
* Questi geni hanno messo la possibilità di mettere un valore <0 se voglio utilizzare del credito precedente */
if(start > 1 && (mensile || (!mensile && ((start - 1) % 3) == 0)))
{
TRelation ivaLiq(LF_IVALIQ);
TRectype filter(ivaLiq.curr()); filter.put("ANNO", anno);
TSorted_cursor curLiq(&ivaLiq, "MESE-", "GENERATA!=\"G\"", 1, &filter, &filter);
bool trovato = false;
for(curLiq = 0; curLiq.pos() < curLiq.items() && !trovato; ++curLiq)
{
TRectype rowLiq = curLiq.curr();
creaprec = creaprec + rowLiq.get_real("CREAPREC") - rowLiq.get_real("IVADOV");
// Se è > 0 Ho trovato il primo valore messo nella dichiarazione
if(rowLiq.get_real("CREAPREC") > ZERO)
{
trovato = true;
}
}
if(!trovato)
{
creaprec = rowLia.get_real("R0");
}
else if(creaprec < ZERO)
{
creaprec = ZERO;
}
}
/* Se siamo in una liquidazione trimestrale la scadenza della dichiarazione IVA è il 28 febbraio
* quindi so per certo che il valore calcolato in LIA.R0 è stato trasmesso */
else if(!mensile && start == 3)
{
creaprec = rowLia.get_real("R0");
}
intliqtri = intliqtri + rowLim.get_real("R14");
accdov = accdov + rowLim.get_real("R11");
@ -544,12 +600,146 @@ void ComLiqPerIva_mask::extractinator() // Per gli amici GTFO
set(F_CRESPEC, crespec);
set(F_VEREFF, vereff);
// Preparo il record
saveGen();
// Azzero i booleani
for(int i = B_TOTOPATT; i <= B_CRESPEC; i++)
{
set(i, "");
}
}
void ComLiqPerIva_mask::saveGen()
{
// Assegno tutti i campi
trueData.put("ANNO", get(F_ANNO));
trueData.put("MESE", get(F_MESE));
trueData.put("TRIMESTRE", get(F_TRIMESTRE));
trueData.put("GENERATA", 'G'); // Segno che è generata da campo
trueData.put("TOTOPATT", get(F_TOTOPATT));
trueData.put("TOTOPATTXC", get(F_TOTOPATTXC));
trueData.put("TOTOPPAS", get(F_TOTOPPAS));
trueData.put("TOTOPPASXC", get(F_TOTOPPASXC));
trueData.put("IVAES", get(F_IVAES));
trueData.put("IVAESXC", get(F_IVAESXC));
trueData.put("IVAESDIFF", get(F_IVAESDIFF));
trueData.put("IVADET", get(F_IVADET));
trueData.put("IVADETXC", get(F_IVADETXC));
trueData.put("IVADETDIFF", get(F_IVADETDIFF));
trueData.put("IVADOV", get(F_IVADOV));
trueData.put("IVADOVC", get(F_IVADOVC));
trueData.put("DEBPREC", get(F_DEBPREC));
trueData.put("CREPREC", get(F_CREPREC));
trueData.put("CREAPREC", get(F_CREAPREC));
trueData.put("VEAUE", get(F_VEAUE));
trueData.put("CREIMP", get(F_CREIMP));
trueData.put("INTLIQTRI", get(F_INTLIQTRI));
trueData.put("ACCDOV", get(F_ACCDOV));
trueData.put("IVAVER", get(F_IVAVER));
trueData.put("IVAVERC", get(F_IVAVERC));
trueData.put("RETTIFICHE", get(F_RETTIFICHE));
trueData.put("VARIMP", get(F_VARIMP));
trueData.put("RIMBORSI", get(F_RIMBORSI));
trueData.put("CRESPEC", get(F_CRESPEC));
trueData.put("IMPNOVER", get(F_IMPNOVER));
trueData.put("VEREFF", get(F_VEREFF));
}
void ComLiqPerIva_mask::checkOldValue(int field, real val)
{
if(trueData.empty())
{
TString key; key << get(F_ANNO) << "|" << get(F_MESE) << "|G";
trueData = cache().get(LF_IVALIQ, key);
}
real trueVal = ZERO;
// Modo più intelligente di uno stupido switch case?
switch(field)
{
case F_TOTOPATT:
trueVal = trueData.get_real("TOTOPATT");
break;
case F_TOTOPATTXC:
trueVal = trueData.get_real("TOTOPATTXC");
break;
case F_TOTOPPAS:
trueVal = trueData.get_real("TOTOPPAS");
break;
case F_TOTOPPASXC:
trueVal = trueData.get_real("TOTOPPASXC");
break;
case F_IVAES:
trueVal = trueData.get_real("IVAES");
break;
case F_IVAESXC:
trueVal = trueData.get_real("IVAESXC");
break;
case F_IVAESDIFF:
trueVal = trueData.get_real("IVAESDIFF");
break;
case F_IVADET:
trueVal = trueData.get_real("IVADET");
break;
case F_IVADETXC:
trueVal = trueData.get_real("IVADETXC");
break;
case F_IVADETDIFF:
trueVal = trueData.get_real("IVADETDIF");
break;
case F_IVADOV:
trueVal = trueData.get_real("IVADOV");
break;
case F_IVADOVC:
trueVal = trueData.get_real("IVADOVC");
break;
case F_DEBPREC:
trueVal = trueData.get_real("DEBPREC");
break;
case F_CREPREC:
trueVal = trueData.get_real("CREPREC");
break;
case F_CREAPREC:
trueVal = trueData.get_real("CREAPREC");
break;
case F_VEAUE:
trueVal = trueData.get_real("VEAUE");
break;
case F_CREIMP:
trueVal = trueData.get_real("CREIMP");
break;
case F_INTLIQTRI:
trueVal = trueData.get_real("INTLIQTRI");
break;
case F_ACCDOV:
trueVal = trueData.get_real("ACCDOV");
break;
case F_IVAVER:
trueVal = trueData.get_real("IVAVER");
break;
case F_IVAVERC:
trueVal = trueData.get_real("IVAVERC");
break;
case F_RETTIFICHE:
trueVal = trueData.get_real("RETTIFICHE");
break;
case F_VARIMP:
trueVal = trueData.get_real("VARIMP");
break;
case F_RIMBORSI:
trueVal = trueData.get_real("RIMBORSI");
break;
case F_CRESPEC:
trueVal = trueData.get_real("CRESPEC");
break;
case F_IMPNOVER:
trueVal = trueData.get_real("IMPNOVER");
break;
case F_VEREFF:
trueVal = trueData.get_real("VEREFF");
break;
}
set(field + 50, trueVal != val ? "X" : "");
}
class ComLiqPerIva_app : public TRelation_application

@ -32,6 +32,7 @@
#define F_CRESPEC 132
#define F_IMPNOVER 133
#define F_VEREFF 134
#define F_GENERATA 135
/* Booleani controllo modifiche (+50 rispetto al campo a cui si riferisce) */

@ -54,6 +54,7 @@ BEGIN
FIELD ANNO
PROMPT 1 2 "Anno "
USE LF_IVALIQ
SELECT GENERATA=="U"
INPUT ANNO F_ANNO
INPUT MESE F_MESE
INPUT TRIMESTRE F_TRIMESTRE
@ -96,6 +97,17 @@ BEGIN
CHECKTYPE REQUIRED
END
/* Parte di chiave nascosta */
LISTBOX F_GENERATA 1
BEGIN
PROMPT 75 2 ""
ITEM "U|U"
KEY 1
FIELD GENERATA
FLAGS "GD"
END
/* *********************** */
NUMBER F_TRIMESTRE 2
BEGIN
PROMPT 50 2 "Trimestre "
@ -129,7 +141,7 @@ ENDPAGE
NUMBER F_TOTOPATT 16 2
BEGIN
PROMPT 1 4 "Totale op. attive "
PROMPT 1 4 "Totale op. attive VP2 "
FIELD TOTOPATT
FLAGS ""
END
@ -157,7 +169,7 @@ END
NUMBER F_TOTOPPAS 16 2
BEGIN
PROMPT 50 4 "Totale op. passive "
PROMPT 50 4 "Totale op. passive VP3 "
FIELD TOTOPPAS
FLAGS ""
END
@ -185,7 +197,7 @@ END
NUMBER F_IVAES 16 2
BEGIN
PROMPT 1 6 "IVA esigibile "
PROMPT 1 6 "IVA esigibile VP4 "
FIELD IVAES
FLAGS ""
END
@ -227,7 +239,7 @@ END
NUMBER F_IVADET 16 2
BEGIN
PROMPT 50 6 "IVA detratta "
PROMPT 50 6 "IVA detratta VP5 "
FIELD IVADET
FLAGS ""
END
@ -269,7 +281,7 @@ END
NUMBER F_IVADOV 16 2
BEGIN
PROMPT 1 10 "IVA dovuta "
PROMPT 1 10 "IVA dovuta VP6.1 "
FIELD IVADOV
FLAGS ""
END
@ -283,7 +295,7 @@ END
NUMBER F_IVADOVC 16 2
BEGIN
PROMPT 50 10 "o a credito "
PROMPT 50 10 "o a credito VP6.2 "
FIELD IVADOVC
FLAGS ""
END
@ -297,7 +309,7 @@ END
NUMBER F_DEBPREC 16 2
BEGIN
PROMPT 1 12 "Debito precedente "
PROMPT 1 12 "Debito precedente VP7 "
FIELD DEBPREC
FLAGS ""
END
@ -311,7 +323,7 @@ END
NUMBER F_CREPREC 16 2
BEGIN
PROMPT 50 12 "Credito precedente "
PROMPT 50 12 "Credito precedente VP8 "
FIELD CREPREC
FLAGS ""
END
@ -325,7 +337,7 @@ END
NUMBER F_INTLIQTRI 16 2
BEGIN
PROMPT 1 13 "Interessi liq. trim. "
PROMPT 1 13 "Int. liq. trim. VP12 "
FIELD INTLIQTRI
FLAGS ""
END
@ -339,7 +351,7 @@ END
NUMBER F_CREAPREC 16 2
BEGIN
PROMPT 50 13 "Credito anno precedente"
PROMPT 50 13 "Credito anno prec. VP9 "
FIELD CREAPREC
FLAGS ""
END
@ -353,7 +365,7 @@ END
NUMBER F_ACCDOV 16 2
BEGIN
PROMPT 1 14 "Acconto dovuto "
PROMPT 1 14 "Acconto dovuto VP13 "
FIELD ACCDOV
FLAGS ""
END
@ -367,7 +379,7 @@ END
NUMBER F_VEAUE 16 2
BEGIN
PROMPT 50 14 "Versamenti auto UE "
PROMPT 50 14 "Versamenti auto UE VP10"
FIELD VEAUE
FLAGS ""
END
@ -381,7 +393,7 @@ END
NUMBER F_CREIMP 16 2
BEGIN
PROMPT 50 15 "Crediti di imposta "
PROMPT 50 15 "Crediti di imp. VP11 "
FIELD CREIMP
FLAGS ""
END
@ -451,7 +463,7 @@ END
NUMBER F_IVAVER 16 2
BEGIN
PROMPT 1 19 "IVA da versare "
PROMPT 1 19 "IVA da versare VP14.1 "
FIELD IVAVER
FLAGS ""
END
@ -465,7 +477,7 @@ END
NUMBER F_IVAVERC 16 2
BEGIN
PROMPT 50 19 "o a credito "
PROMPT 50 19 "o a credito VP14.2 "
FIELD IVAVERC
FLAGS ""
END
@ -479,19 +491,18 @@ END
/* Campi non visualizzati ma che vengono salvati lo stesso! */
NUMBER F_IMPNOVER 1 1
NUMBER F_IMPNOVER 18 3
BEGIN
PROMPT 50 19 "Imposta non versata"
FIELD IMPNOVER
FLAGS "H"
END
NUMBER F_VEREFF 1 1
NUMBER F_VEREFF 18 3
BEGIN
PROMPT 50 19 "Versamenti effettuati"
FIELD VEREFF
FLAGS "H"
END
ENDMASK

@ -36,9 +36,8 @@ const TRectype getLiq(int anno, int mese)
{
TString key; key << anno << "|";
if(mese < 10)
key << "0" << mese;
else
key << mese;
key << "0";
key << mese << "|U";
return cache().get(LF_IVALIQ, key);
}
@ -272,6 +271,7 @@ TToken_string TIvaSend_app::getTestata(TIvaSend_msk& msk)
testata.add(""); // Flag Firma Intermediario
testata.add(""); // Flag Conferma
testata.add(get_iva_sirio());
// Ricorda! Il programma di Leo vuole true = 'S', false = '' !
return testata;
}

@ -44,6 +44,7 @@ NUMBER F_ANNO 4
BEGIN
PROMPT 1 3 "Anno "
USE LF_IVALIQ
SELECT GENERATA=="U"
INPUT ANNO F_ANNO
DISPLAY "Anno Liquid.IVA" ANNO
DiSPLAY "Mese" MESE