Patch level : 12.0 358

Files correlati     : f171.trr f171.dir cg4.exe

Corretto il calcolo liquidazione per l'IVA indetraibile e i movimenti cper cassa con IVA normale ed esente.





git-svn-id: svn://10.65.10.50/branches/R_10_00@23664 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
bonazzi 2017-02-25 15:51:27 +00:00
parent e795d24099
commit fa48200320
5 changed files with 265 additions and 258 deletions

View File

@ -1457,7 +1457,7 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt, TAssoc_array &
#ifdef DBG
const long nr = _mov->get_long(MOV_NUMREG);
if (nr == 115414 || nr == 155995)
if (nr == 29167 || nr == 29171 )
int i = 1 ;
#endif
@ -1466,228 +1466,236 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt, TAssoc_array &
sosp_imp != vol_affari)
tot_reg += imponibile_orig;
if (bIsMovDiff && tm == tm_fattura)
{
const TDate datareg = _mov->get(MOV_DATAREG);
bool bRowIsMovDiff = bIsMovDiff && imposta_orig != ZERO;
sezfat = tipomov == vendita ? 'D' : 'A';
id.put(RMI_NUMREG, _rmoviva->get(RMI_NUMREG));
id.put(RMI_NUMRIG, _rmoviva->get(RMI_NUMRIG));
id.put("NUMPRO", 0);
id.put(PART_TIPOMOV, tm);
CHECKD(rmi_tipoatt > 0, "Invalid tipo att ", rmi_tipoatt);
id.put("TIPOATT", rmi_tipoatt);
id.put("ANNOLIQ", datareg.year());
analizza_IVA(imponibile_orig, imposta_orig, percind, corrisp, false, codiva,
impon_det, impos_det, impon_ind, impos_ind);
for (int is_detr_diff = 1; is_detr_diff >= 0; is_detr_diff--)
{
real diff_impr = (is_detr_diff == 0) ? impon_det : impon_ind;
real diff_ivar = (is_detr_diff == 0) ? impos_det : impos_ind;
real diff_totr = diff_impr + diff_ivar;
if (diff_totr == ZERO)
continue;
if (bRowIsMovDiff && tm == tm_fattura)
{
const TDate datareg = _mov->get(MOV_DATAREG);
sezfat = tipomov == vendita ? 'D' : 'A';
id.put(RMI_NUMREG, _rmoviva->get(RMI_NUMREG));
id.put(RMI_NUMRIG, _rmoviva->get(RMI_NUMRIG));
id.put("NUMPRO", 0);
id.put(PART_TIPOMOV, tm);
CHECKD(rmi_tipoatt > 0, "Invalid tipo att ", rmi_tipoatt);
id.put("TIPOATT", rmi_tipoatt);
id.put("ANNOLIQ", datareg.year());
int mesereg = datareg.month();
if (_freqviva[0] == 'T')
{
const int resto = mesereg % 3;
if (resto > 0)
mesereg += 3-resto;
}
id.put("MESELIQ", mesereg);
id.put("TIPOIVA", tipomov == 2 ? 2 : 1);
id.put("TIPODIFF", iva_cass ? 2 : 1);
id.put(MOV_DATAREG, _mov->get(MOV_DATADOC));
id.put(RMI_CODIVA, codiva);
id.put("SEZIONE", sezfat);
id.put("IMPORTO", imponibile_orig+imposta_orig);
id.put(RMI_IMPONIBILE, imponibile_orig);
id.put(RMI_IMPOSTA, imposta_orig);
const int ew = id.write_rewrite();
if (ew != NOERR)
cantwrite_box(id.description());
}
if (!pagscatt.empty())
{
const char sezpag = tipomov == vendita ? 'A' : 'D';
real totfat = _mov->get(MOV_TOTDOC);
real tot = totfat;
FOR_EACH_ARRAY_ITEM(pagscatt, r, obj)
{
const TRectype& pagsca = *(TRectype*)obj;
const int nrigp = pagsca.get_int(PAGSCA_NRIGP);
id.zero();
id.put(RMI_NUMREG, _rmoviva->get(RMI_NUMREG));
id.put(RMI_NUMRIG, _rmoviva->get(RMI_NUMRIG));
CHECKD(nrigp > 0, "Invalid NRIGP ", nrigp);
id.put("NUMPRO", min(nrigp, 999));
if (id.read(_isequal, _lock) != NOERR)
{
id.zero();
id.put(RMI_NUMREG, _rmoviva->get(RMI_NUMREG));
id.put(RMI_NUMRIG, _rmoviva->get(RMI_NUMRIG));
id.put("NUMPRO", min(nrigp, 999));
if (id.write() != NOERR)
error_box("Errore %d in creazione record IVADIFF", id.status());
}
id.put(MOV_DATAREG, _mov->get(MOV_DATADOC));
CHECKD(rmi_tipoatt > 0, "Invalid tipo att ", rmi_tipoatt);
id.put("TIPOATT", rmi_tipoatt);
id.put("TIPOIVA", tipomov == 2 ? 2 : 1);
id.put("TIPODIFF", iva_cass ? 2 : 1);
id.put(RMI_CODIVA, codiva);
TImporto pagtmp;
bool ultimo = false;
long nregpag;
int nrigpag;
tipo_movimento tipomov_pag = tm_pagamento;
if (nrigp > 0 && nrigp < 9999)
{
const TPartita& p = arrpart.partita(pagsca);
const TRiga_partite& rp = p.riga(nrigp);
nregpag = rp.get_long(PART_NREG);
nrigpag = rp.get_int(PART_NUMRIG);
tipomov_pag = rp.tipo();
id.put(PART_TIPOMOV, tipomov_pag);
id.put("NUMREGP", nregpag);
id.put("NUMRIGP", nrigpag);
TDate d = rp.get(PART_DATAPAG);
if (!d.ok())
d = rp.get(PART_DATADOC);
if (!d.ok())
d = rp.get(PART_DATAREG);
id.put("DATAREGP", d);
id.put("ANNOLIQ", d.year());
pagtmp = p.importo_pagsca(pagsca);
pagtmp.normalize(sezpag);
ultimo = (r == pagscatt.last()) && partita_chiusa_al(p, fine);
}
else
{
// Falso record generato da datainc
nregpag = _mov->get_long(MOV_NUMREG);
nrigpag = nrigp;
id.put(PART_TIPOMOV, tipomov_pag);
id.put("NUMREGP", nregpag);
id.put("NUMRIGP", nrigp);
id.put("DATAREGP", _mov->get(MOV_DATAINC));
id.put("ANNOLIQ", year_int);
pagtmp.set(sezpag, pagsca.get_real(PAGSCA_IMPORTO));
ultimo = true;
}
int meseliq = id.get_date("DATAREGP").month();
if (_freqviva[0] == 'T')
{
const int resto = meseliq % 3;
if (resto > 0)
meseliq += 3-resto;
}
id.put("MESELIQ", meseliq);
id.put("SEZIONE", pagtmp.sezione());
const long numregp = id.get_long(ID_NUMREGP);
const int numrigp = nrigp;
real val_imp = pagtmp.valore() * lordo_orig / tot;
real val_iva;
if (ultimo)
int mesereg = datareg.month();
if (_freqviva[0] == 'T')
{
TRectype svidrec(id.curr());
TLocalisamfile rid(LF_IVADIFF);
const long numreg = _rmoviva->get_long(RMI_NUMREG);
const int numrig = _rmoviva->get_int(RMI_NUMRIG);
const int numpro = id.get_int(ID_NUMPRO);
rid.put(MOV_NUMREG, numreg);
rid.put(RMI_NUMRIG, numrig);
val_iva = imposta_orig;
const int resto = mesereg % 3;
if (resto > 0)
mesereg += 3-resto;
}
bool pag_found = false;
int err = rid.read(_isgteq);
for (; err == NOERR && rid.get_long(RMI_NUMREG) == numreg && rid.get_int(RMI_NUMRIG) == numrig; err = rid.next())
id.put("MESELIQ", mesereg);
id.put("TIPOIVA", tipomov == 2 ? 2 : 1);
id.put(ID_INDETR, is_detr_diff > 0);
id.put("TIPODIFF", iva_cass ? 2 : 1);
id.put(MOV_DATAREG, _mov->get(MOV_DATADOC));
id.put(RMI_CODIVA, codiva);
id.put("SEZIONE", sezfat);
id.put("IMPORTO", diff_totr);
id.put(RMI_IMPONIBILE, diff_impr);
id.put(RMI_IMPOSTA, diff_ivar);
const int ew = id.write_rewrite();
if (ew != NOERR)
cantwrite_box(id.description());
}
if (!pagscatt.empty())
{
const char sezpag = tipomov == vendita ? 'A' : 'D';
real totfat = _mov->get(MOV_TOTDOC);
real tot = totfat;
FOR_EACH_ARRAY_ITEM(pagscatt, r, obj)
{
const TRectype& pagsca = *(TRectype*)obj;
const int nrigp = pagsca.get_int(PAGSCA_NRIGP);
id.zero();
id.put(RMI_NUMREG, _rmoviva->get(RMI_NUMREG));
id.put(RMI_NUMRIG, _rmoviva->get(RMI_NUMRIG));
CHECKD(nrigp > 0, "Invalid NRIGP ", nrigp);
id.put("NUMPRO", min(nrigp, 999));
if (id.read(_isequal, _lock) != NOERR)
{
const int ridnumpro = rid.get_int(ID_NUMPRO);
const tipo_movimento ridtipopag = (tipo_movimento) rid.get_int(PART_TIPOMOV);
if (ridtipopag != tm_fattura && ridtipopag != tm_nessuno &&ridnumpro != numpro)
id.zero();
id.put(RMI_NUMREG, _rmoviva->get(RMI_NUMREG));
id.put(RMI_NUMRIG, _rmoviva->get(RMI_NUMRIG));
id.put("NUMPRO", min(nrigp, 999));
if (id.write() != NOERR)
error_box("Errore %d in creazione record IVADIFF", id.status());
}
id.put(MOV_DATAREG, _mov->get(MOV_DATADOC));
CHECKD(rmi_tipoatt > 0, "Invalid tipo att ", rmi_tipoatt);
id.put("TIPOATT", rmi_tipoatt);
id.put("TIPOIVA", tipomov == 2 ? 2 : 1);
id.put(ID_INDETR, is_detr_diff > 0);
id.put("TIPODIFF", iva_cass ? 2 : 1);
id.put(RMI_CODIVA, codiva);
TImporto pagtmp;
bool ultimo = false;
long nregpag;
int nrigpag;
tipo_movimento tipomov_pag = tm_pagamento;
if (nrigp > 0 && nrigp < 9999)
{
const TPartita& p = arrpart.partita(pagsca);
const TRiga_partite& rp = p.riga(nrigp);
nregpag = rp.get_long(PART_NREG);
nrigpag = rp.get_int(PART_NUMRIG);
tipomov_pag = rp.tipo();
id.put(PART_TIPOMOV, tipomov_pag);
id.put("NUMREGP", nregpag);
id.put("NUMRIGP", nrigpag);
TDate d = rp.get(PART_DATAPAG);
if (!d.ok())
d = rp.get(PART_DATADOC);
if (!d.ok())
d = rp.get(PART_DATAREG);
id.put("DATAREGP", d);
id.put("ANNOLIQ", d.year());
pagtmp = p.importo_pagsca(pagsca);
pagtmp.normalize(sezpag);
ultimo = (r == pagscatt.last()) && partita_chiusa_al(p, fine);
}
else
{
// Falso record generato da datainc
nregpag = _mov->get_long(MOV_NUMREG);
nrigpag = nrigp;
id.put(PART_TIPOMOV, tipomov_pag);
id.put("NUMREGP", nregpag);
id.put("NUMRIGP", nrigp);
id.put("DATAREGP", _mov->get(MOV_DATAINC));
id.put("ANNOLIQ", year_int);
pagtmp.set(sezpag, pagsca.get_real(PAGSCA_IMPORTO));
ultimo = true;
}
int meseliq = id.get_date("DATAREGP").month();
if (_freqviva[0] == 'T')
{
const int resto = meseliq % 3;
if (resto > 0)
meseliq += 3-resto;
}
id.put("MESELIQ", meseliq);
id.put("SEZIONE", pagtmp.sezione());
const long numregp = id.get_long(ID_NUMREGP);
const int numrigp = nrigp;
real val_imp = pagtmp.valore() * diff_totr / tot;
real val_iva;
if (ultimo && (is_detr_diff == 0))
{
TRectype svidrec(id.curr());
TLocalisamfile rid(LF_IVADIFF);
const long numreg = _rmoviva->get_long(RMI_NUMREG);
const int numrig = _rmoviva->get_int(RMI_NUMRIG);
const int numpro = id.get_int(ID_NUMPRO);
rid.put(MOV_NUMREG, numreg);
rid.put(RMI_NUMRIG, numrig);
val_iva = diff_ivar;
bool pag_found = false;
int err = rid.read(_isgteq);
for (; err == NOERR && rid.get_long(RMI_NUMREG) == numreg && rid.get_int(RMI_NUMRIG) == numrig; err = rid.next())
{
pag_found = true;
if (sezfat != sezpag)
val_iva -= rid.get_real(RMI_IMPOSTA);
else
val_iva += rid.get_real(RMI_IMPOSTA);
const int ridnumpro = rid.get_int(ID_NUMPRO);
const tipo_movimento ridtipopag = (tipo_movimento) rid.get_int(PART_TIPOMOV);
if (ridtipopag != tm_fattura && ridtipopag != tm_nessuno &&ridnumpro != numpro)
{
pag_found = true;
if (sezfat != sezpag)
val_iva -= rid.get_real(RMI_IMPOSTA);
else
val_iva += rid.get_real(RMI_IMPOSTA);
}
}
if (!pag_found)
val_iva = civa.scorpora(val_imp, TCurrency::get_firm_dec());
else
civa.scorpora(val_imp, TCurrency::get_firm_dec());
id.curr() = svidrec;
}
else
val_iva = civa.scorpora(val_imp, TCurrency::get_firm_dec());
id.put("IMPORTO", val_imp + val_iva);
id.put(RMI_IMPONIBILE, val_imp);
id.put(RMI_IMPOSTA, val_iva);
if (tipomov_pag >= tm_pagamento && is_detr_diff == 0)
{
incdiff_imp += val_imp;
incdiff_iva += val_iva;
}
int err = id.rewrite();
if (err != NOERR)
error_box("Errore %d in aggiornamento file IVADIFF", err);
LOG_IVA_DIFF(id.curr());
// 18-06-2014 Aggiorna flag di chiusura IVADIFF solo nei mesi normali, ma lascialo stare se _isannual
const long numreg = _rmoviva->get_long(RMI_NUMREG);
if (numreg > 0 && !_isannual) // Chiude o riapre la partita
{
TISAM_recordset recset("USE IVADIFF\nFROM NUMREG=#NR\nTO NUMREG=#NR");
recset.set_var("#NR", numreg);
TLocalisamfile& id = recset.cursor()->file();
for (bool ok = recset.move_first(); ok; ok = recset.move_next())
{
const bool chiusa = id.get_bool("CHIUSA");
if (chiusa != ultimo)
{
id.put("CHIUSA", ultimo);
id.rewrite();
}
}
}
if (!pag_found)
val_iva = civa.scorpora(val_imp, TCurrency::get_firm_dec());
else
civa.scorpora(val_imp, TCurrency::get_firm_dec());
id.curr() = svidrec;
}
else
val_iva = civa.scorpora(val_imp, TCurrency::get_firm_dec());
id.put("IMPORTO", val_imp + val_iva);
id.put(RMI_IMPONIBILE, val_imp);
id.put(RMI_IMPOSTA, val_iva);
if (tipomov_pag >= tm_pagamento)
{
incdiff_imp += val_imp;
incdiff_iva += val_iva;
}
int err = id.rewrite();
if (err != NOERR)
error_box("Errore %d in aggiornamento file IVADIFF", err);
LOG_IVA_DIFF(id.curr());
// 18-06-2014 Aggiorna flag di chiusura IVADIFF solo nei mesi normali, ma lascialo stare se _isannual
const long numreg = _rmoviva->get_long(RMI_NUMREG);
if (numreg > 0 && !_isannual) // Chiude o riapre la partita
{
TISAM_recordset recset("USE IVADIFF\nFROM NUMREG=#NR\nTO NUMREG=#NR");
recset.set_var("#NR", numreg);
TLocalisamfile& id = recset.cursor()->file();
for (bool ok = recset.move_first(); ok; ok = recset.move_next())
{
const bool chiusa = id.get_bool("CHIUSA");
if (chiusa != ultimo)
{
id.put("CHIUSA", ultimo);
id.rewrite();
}
}
}
}
if (is_date_ok(date, month, liqmonth, year_int)) // 5-3-2014
{
diff_imp = imponibile_orig;
diff_iva = imposta_orig;
}
}
else
{
if (bIsMovDiff)
{
if (is_date_ok(date, month, liqmonth, year_int)) // 5-3-2014
{
diff_imp = imponibile_orig;
diff_iva = imposta_orig;
}
if (is_date_ok(date, month, liqmonth, year_int) && is_detr_diff == 0) // 5-3-2014
{
diff_imp = diff_impr;
diff_iva = diff_ivar;
}
}
else
analizza_IVA(imponibile_orig, imposta_orig, percind, corrisp, false, codiva,
impon_det, impos_det, impon_ind, impos_ind);
}
{
if (is_date_ok(date, month, liqmonth, year_int) && is_detr_diff == 0) // 5-3-2014
{
diff_imp = diff_impr;
diff_iva = diff_ivar;
}
}
}
// Filling dell'array per IVA11
if (_is_interactive && month == 13)
@ -1730,7 +1738,7 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt, TAssoc_array &
codreg = comune.get_int(COM_CODREG) + 1;
}
if (bIsMovDiff)
if (bRowIsMovDiff)
{
vt_imponibile[codreg] += incdiff_imp;
vt_imposta[codreg] += incdiff_iva;
@ -1820,21 +1828,19 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt, TAssoc_array &
*/
}
bool bMovDiffToAdd = true;
for (int is_detraibile = 0; is_detraibile < 2; is_detraibile++)
{
const int tipodet = is_detraibile ? 0 : tipoind;
const real imponibile = is_detraibile ? impon_det : impon_ind;
const real imposta = is_detraibile ? impos_det : impos_ind;
const int tipodet = is_detraibile == 0 ? 0 : tipoind;
real imponibile = is_detraibile == 0 ? impon_det : impon_ind;
real imposta = is_detraibile == 0? impos_det : impos_ind;
if ((imponibile.is_zero() && imposta.is_zero()) &&
(bIsMovDiff &&
(is_detraibile > 0 ||
(diff_imp.is_zero() && diff_iva.is_zero() &&
incdiff_imp.is_zero() && incdiff_iva.is_zero())
)
)
)
continue;
if (bRowIsMovDiff && is_detraibile == 0)
{
imponibile = ZERO;
imposta = ZERO;
}
/* Riga imponibile > 9 = ritenute; non si considerano (Scudler 1994) */
@ -2533,10 +2539,9 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt, TAssoc_array &
cs.add(v.string(), 1);
tab->put("S2",cs);
if (is_detraibile == 0 && // eseguire solo una volta (is_detraibile è in un ciclo da 0 a 1)
(!diff_imp.is_zero() || !diff_iva.is_zero() ||
!incdiff_imp.is_zero() || !incdiff_iva.is_zero()))
if (bRowIsMovDiff && bMovDiffToAdd)
{
bMovDiffToAdd = false;
if (tipomov == vendita)
{
#ifndef NDEBUG
@ -2568,8 +2573,8 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt, TAssoc_array &
else
{
// fatture acquisto a liquidazione differita
tab->curr().add("R30", diff_imp);
tab->curr().add("R31", diff_iva);
tab->curr().add("R30", incdiff_imp);
tab->curr().add("R31", incdiff_iva);
tab->curr().add("R32", incdiff_imp);
tab->curr().add("R33", incdiff_iva);
fdiff_imp_acq += diff_imp;

View File

@ -1648,7 +1648,7 @@ int TLiquidazione_app::calc_inc_diff(int tipoiva, real& imponibile_diff, real& i
TString limit; limit << "ANNOLIQ=" << _year;
if (_month < 13) limit << " MESELIQ=" << _month;
TString query; // righe pagamento (TIPOMOV>=3) ed escluse NC!
query << "USE IVADIFF KEY 2 SELECT (TIPOMOV>2)&&(TIPOIVA=" << tipoiva << ')'
query << "USE IVADIFF KEY 2 SELECT (TIPOMOV>2)&&(TIPOIVA=" << tipoiva << ")&&NUM(INDETR!='X')"
<< "\nFROM " << limit << "\nTO " << limit;
TISAM_recordset id(query);

View File

@ -1,3 +1,3 @@
171
0
$ivadiff|0|0|110|0|IVA ad esigibilità differita o per cassa|||
171
0
$ivadiff|0|0|111|0|IVA ad esigibilità differita o per cassa|||

View File

@ -1,24 +1,25 @@
171
19
NUMREG|3|7|0|Numero operazione Fattura
NUMRIG|2|3|0|Numero riga IVA
NUMPRO|2|3|0|Numero progressivo PAG o NC
TIPOMOV|2|1|0|Tipo movimento (1=Fattura;2=Nota credito;3=Pagamento)
DATAREG|5|8|0|Data fattura
NUMREGP|3|7|0|Numero operazione PAG o NC
NUMRIGP|2|3|0|Numero riga PAG o NC
DATAREGP|5|8|0|Data pagamento
ANNOLIQ|2|4|0|Anno liquidazione
MESELIQ|2|2|0|Mese liquidazione
TIPOATT|2|1|0|Tipo attività (1=Normale; 2=Mista)
TIPOIVA|2|1|0|Tipo IVA (1=Vendite; 2=Acquisti)
TIPODIFF|2|1|0|IVA differita (1) o per Cassa (2)
CODIVA|1|4|0|Codice IVA
SEZIONE|1|1|0|Sezione <D>are <A>vere
IMPORTO|4|18|3|Importo
IMPONIBILE|4|18|3|Imponibile
IMPOSTA|4|18|3|Imposta
CHIUSA|8|1|0|Partita chiusa
2
NUMREG+NUMRIG+NUMPRO|
ANNOLIQ+MESELIQ+DATAREGP|X
171
20
NUMREG|3|7|0|Numero operazione Fattura
NUMRIG|2|3|0|Numero riga IVA
NUMPRO|2|3|0|Numero progressivo PAG o NC
TIPOMOV|2|1|0|Tipo movimento (1=Fattura;2=Nota credito;3=Pagamento)
DATAREG|5|8|0|Data fattura
NUMREGP|3|7|0|Numero operazione PAG o NC
NUMRIGP|2|3|0|Numero riga PAG o NC
DATAREGP|5|8|0|Data pagamento
ANNOLIQ|2|4|0|Anno liquidazione
MESELIQ|2|2|0|Mese liquidazione
TIPOATT|2|1|0|Tipo attività (1=Normale; 2=Mista)
TIPOIVA|2|1|0|Tipo IVA (1=Vendite; 2=Acquisti)
INDETR|8|1|0|Riga di IVA indetraibile
TIPODIFF|2|1|0|IVA differita (1) o per Cassa (2)
CODIVA|1|4|0|Codice IVA
SEZIONE|1|1|0|Sezione <D>are <A>vere
IMPORTO|4|18|3|Importo
IMPONIBILE|4|18|3|Imponibile
IMPOSTA|4|18|3|Imposta
CHIUSA|8|1|0|Partita chiusa
2
NUMREG+NUMRIG+NUMPRO|
ANNOLIQ+MESELIQ+DATAREGP|X

View File

@ -9,6 +9,7 @@
#define ID_MESELIQ "MESELIQ"
#define ID_TIPOATT "TIPOATT"
#define ID_TIPOIVA "TIPOIVA"
#define ID_INDETR "INDETR"
#define ID_TIPODIFF "TIPODIFF"
#define ID_CODIVA "CODIVA"
#define ID_SEZIONE "SEZIONE"