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 #ifdef DBG
const long nr = _mov->get_long(MOV_NUMREG); const long nr = _mov->get_long(MOV_NUMREG);
if (nr == 115414 || nr == 155995) if (nr == 29167 || nr == 29171 )
int i = 1 ; int i = 1 ;
#endif #endif
@ -1466,228 +1466,236 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt, TAssoc_array &
sosp_imp != vol_affari) sosp_imp != vol_affari)
tot_reg += imponibile_orig; tot_reg += imponibile_orig;
if (bIsMovDiff && tm == tm_fattura) bool bRowIsMovDiff = bIsMovDiff && imposta_orig != ZERO;
{
const TDate datareg = _mov->get(MOV_DATAREG);
sezfat = tipomov == vendita ? 'D' : 'A'; analizza_IVA(imponibile_orig, imposta_orig, percind, corrisp, false, codiva,
id.put(RMI_NUMREG, _rmoviva->get(RMI_NUMREG)); impon_det, impos_det, impon_ind, impos_ind);
id.put(RMI_NUMRIG, _rmoviva->get(RMI_NUMRIG)); for (int is_detr_diff = 1; is_detr_diff >= 0; is_detr_diff--)
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 diff_impr = (is_detr_diff == 0) ? impon_det : impon_ind;
real totfat = _mov->get(MOV_TOTDOC); real diff_ivar = (is_detr_diff == 0) ? impos_det : impos_ind;
real tot = totfat; real diff_totr = diff_impr + diff_ivar;
FOR_EACH_ARRAY_ITEM(pagscatt, r, obj) if (diff_totr == ZERO)
{ continue;
const TRectype& pagsca = *(TRectype*)obj; if (bRowIsMovDiff && tm == tm_fattura)
const int nrigp = pagsca.get_int(PAGSCA_NRIGP); {
const TDate datareg = _mov->get(MOV_DATAREG);
id.zero(); sezfat = tipomov == vendita ? 'D' : 'A';
id.put(RMI_NUMREG, _rmoviva->get(RMI_NUMREG)); id.put(RMI_NUMREG, _rmoviva->get(RMI_NUMREG));
id.put(RMI_NUMRIG, _rmoviva->get(RMI_NUMRIG)); id.put(RMI_NUMRIG, _rmoviva->get(RMI_NUMRIG));
CHECKD(nrigp > 0, "Invalid NRIGP ", nrigp); id.put("NUMPRO", 0);
id.put("NUMPRO", min(nrigp, 999)); id.put(PART_TIPOMOV, tm);
if (id.read(_isequal, _lock) != NOERR) CHECKD(rmi_tipoatt > 0, "Invalid tipo att ", rmi_tipoatt);
{ id.put("TIPOATT", rmi_tipoatt);
id.zero(); id.put("ANNOLIQ", datareg.year());
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)); int mesereg = datareg.month();
CHECKD(rmi_tipoatt > 0, "Invalid tipo att ", rmi_tipoatt); if (_freqviva[0] == 'T')
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)
{ {
TRectype svidrec(id.curr()); const int resto = mesereg % 3;
TLocalisamfile rid(LF_IVADIFF); if (resto > 0)
const long numreg = _rmoviva->get_long(RMI_NUMREG); mesereg += 3-resto;
const int numrig = _rmoviva->get_int(RMI_NUMRIG); }
const int numpro = id.get_int(ID_NUMPRO);
rid.put(MOV_NUMREG, numreg); id.put("MESELIQ", mesereg);
rid.put(RMI_NUMRIG, numrig); id.put("TIPOIVA", tipomov == 2 ? 2 : 1);
val_iva = imposta_orig; 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);
bool pag_found = false; id.put("IMPORTO", diff_totr);
id.put(RMI_IMPONIBILE, diff_impr);
id.put(RMI_IMPOSTA, diff_ivar);
int err = rid.read(_isgteq); const int ew = id.write_rewrite();
if (ew != NOERR)
cantwrite_box(id.description());
}
for (; err == NOERR && rid.get_long(RMI_NUMREG) == numreg && rid.get_int(RMI_NUMRIG) == numrig; err = rid.next()) 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); id.zero();
const tipo_movimento ridtipopag = (tipo_movimento) rid.get_int(PART_TIPOMOV); 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());
}
if (ridtipopag != tm_fattura && ridtipopag != tm_nessuno &&ridnumpro != numpro) 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; const int ridnumpro = rid.get_int(ID_NUMPRO);
if (sezfat != sezpag) const tipo_movimento ridtipopag = (tipo_movimento) rid.get_int(PART_TIPOMOV);
val_iva -= rid.get_real(RMI_IMPOSTA);
else if (ridtipopag != tm_fattura && ridtipopag != tm_nessuno &&ridnumpro != numpro)
val_iva += rid.get_real(RMI_IMPOSTA); {
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 if (is_date_ok(date, month, liqmonth, year_int) && is_detr_diff == 0) // 5-3-2014
val_iva = civa.scorpora(val_imp, TCurrency::get_firm_dec()); {
diff_imp = diff_impr;
id.put("IMPORTO", val_imp + val_iva); diff_iva = diff_ivar;
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;
}
} }
else 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 // Filling dell'array per IVA11
if (_is_interactive && month == 13) 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; codreg = comune.get_int(COM_CODREG) + 1;
} }
if (bIsMovDiff) if (bRowIsMovDiff)
{ {
vt_imponibile[codreg] += incdiff_imp; vt_imponibile[codreg] += incdiff_imp;
vt_imposta[codreg] += incdiff_iva; 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++) for (int is_detraibile = 0; is_detraibile < 2; is_detraibile++)
{ {
const int tipodet = is_detraibile ? 0 : tipoind; const int tipodet = is_detraibile == 0 ? 0 : tipoind;
const real imponibile = is_detraibile ? impon_det : impon_ind; real imponibile = is_detraibile == 0 ? impon_det : impon_ind;
const real imposta = is_detraibile ? impos_det : impos_ind; real imposta = is_detraibile == 0? impos_det : impos_ind;
if ((imponibile.is_zero() && imposta.is_zero()) && if (bRowIsMovDiff && is_detraibile == 0)
(bIsMovDiff && {
(is_detraibile > 0 || imponibile = ZERO;
(diff_imp.is_zero() && diff_iva.is_zero() && imposta = ZERO;
incdiff_imp.is_zero() && incdiff_iva.is_zero()) }
)
)
)
continue;
/* Riga imponibile > 9 = ritenute; non si considerano (Scudler 1994) */ /* 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); cs.add(v.string(), 1);
tab->put("S2",cs); tab->put("S2",cs);
if (is_detraibile == 0 && // eseguire solo una volta (is_detraibile è in un ciclo da 0 a 1) if (bRowIsMovDiff && bMovDiffToAdd)
(!diff_imp.is_zero() || !diff_iva.is_zero() ||
!incdiff_imp.is_zero() || !incdiff_iva.is_zero()))
{ {
bMovDiffToAdd = false;
if (tipomov == vendita) if (tipomov == vendita)
{ {
#ifndef NDEBUG #ifndef NDEBUG
@ -2568,8 +2573,8 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt, TAssoc_array &
else else
{ {
// fatture acquisto a liquidazione differita // fatture acquisto a liquidazione differita
tab->curr().add("R30", diff_imp); tab->curr().add("R30", incdiff_imp);
tab->curr().add("R31", diff_iva); tab->curr().add("R31", incdiff_iva);
tab->curr().add("R32", incdiff_imp); tab->curr().add("R32", incdiff_imp);
tab->curr().add("R33", incdiff_iva); tab->curr().add("R33", incdiff_iva);
fdiff_imp_acq += diff_imp; 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; TString limit; limit << "ANNOLIQ=" << _year;
if (_month < 13) limit << " MESELIQ=" << _month; if (_month < 13) limit << " MESELIQ=" << _month;
TString query; // righe pagamento (TIPOMOV>=3) ed escluse NC! 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; << "\nFROM " << limit << "\nTO " << limit;
TISAM_recordset id(query); TISAM_recordset id(query);

View File

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

View File

@ -1,5 +1,5 @@
171 171
19 20
NUMREG|3|7|0|Numero operazione Fattura NUMREG|3|7|0|Numero operazione Fattura
NUMRIG|2|3|0|Numero riga IVA NUMRIG|2|3|0|Numero riga IVA
NUMPRO|2|3|0|Numero progressivo PAG o NC NUMPRO|2|3|0|Numero progressivo PAG o NC
@ -12,6 +12,7 @@ ANNOLIQ|2|4|0|Anno liquidazione
MESELIQ|2|2|0|Mese liquidazione MESELIQ|2|2|0|Mese liquidazione
TIPOATT|2|1|0|Tipo attività (1=Normale; 2=Mista) TIPOATT|2|1|0|Tipo attività (1=Normale; 2=Mista)
TIPOIVA|2|1|0|Tipo IVA (1=Vendite; 2=Acquisti) 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) TIPODIFF|2|1|0|IVA differita (1) o per Cassa (2)
CODIVA|1|4|0|Codice IVA CODIVA|1|4|0|Codice IVA
SEZIONE|1|1|0|Sezione <D>are <A>vere SEZIONE|1|1|0|Sezione <D>are <A>vere

View File

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