Patch level : 12.0 1066

Files correlati     : cg4.exe
Commento        :

Le note di credito per cassa non legate a fattura non venivao liquidate dopo un anno.

Interno :

Diana
Le note di credito 40177 40178 40179 sono state sganciate per liquidarle nma non venivano liquidate ugualmente dopo un anno.
This commit is contained in:
Alessandro Bonazzi 2021-07-14 11:52:08 +02:00
parent e74a377286
commit 3cdb00e15f
3 changed files with 289 additions and 237 deletions

View File

@ -449,7 +449,7 @@ protected:
bool print_inc_diff_log(int& rw, int tipoatt, int tipoiva);
bool print_dainc_diff_log(int& rw, int tipoatt, int tipoiva);
bool ivadiff_chiusa(const TRectype& mov, const TDate& fine) const;
bool sarebbe_maturata(const TRectype& mov, const TDate& inizio, const TDate& fine) const;
bool sarebbe_maturata(const TRectype& mov, const TDate& inizio, const TDate& fine, tipo_movimento tm2check = tm_fattura) const;
public:

View File

@ -33,16 +33,36 @@
// ----------------------------------------------------- ******************
#ifdef DBG
bool check_nreg(long nreg)
{
long __nreg[] = { 41221L, 0L };
int i = 0;
while (__nreg[i] > 0L)
if (__nreg[i++] == nreg)
#define _BREAK(func, par, values) func(par, values);
#define BREAK_DBG _BREAK(check_nreg, __nreg, __values)
#define LOAD_VAL load_values()
const char * load_values()
{
TFilename dbgname;
TFilename filename("dbg");
filename << main_app().name();
dbgname.currdir();
dbgname.add(filename);
dbgname.ext("ini");
return ini_get_string(dbgname, "Main", "Values");
}
bool check_nreg(TToken_string &nreg, TToken_string &values)
{
long reg = atol(nreg);
FOR_EACH_TOKEN(values, val)
{
if (atol(val) == reg)
return true;
}
return false;
}
#else
#define BREAK_DBG;
#endif
bool TLiquidazione_app::recalc_all()
@ -639,6 +659,9 @@ bool TLiquidazione_app::ivadiff_chiusa(const TRectype& mov, const TDate& fine) c
TRectype& rid = id.curr();
rid.put(MOV_NUMREG, numreg);
int err = id.read(_isgteq);
TDate data_maturazione = mov.get_date(MOV_DATADOC);
data_maturazione.addyear();
if (err == NOERR && rid.get_long(MOV_NUMREG) == numreg)
{
bool some_pag = false; // Ci sono pagamenti?
@ -646,7 +669,7 @@ bool TLiquidazione_app::ivadiff_chiusa(const TRectype& mov, const TDate& fine) c
for (; err == NOERR && rid.get_long(MOV_NUMREG) == numreg; err = id.next())
{
const TDate data = rid.get("DATAREGP");
if (data > fine && !_end_cassa)
if ((data > fine || data > data_maturazione) && !_end_cassa)
continue;
if (data == fine && rid.get_long("NUMREGP") == numreg && !_end_cassa)
continue; // Ignora pagamento automatico dopo un anno
@ -660,7 +683,7 @@ bool TLiquidazione_app::ivadiff_chiusa(const TRectype& mov, const TDate& fine) c
some_pag = true;
}
}
chiusa = some_pag && tot.valore() < 0.01;
chiusa = some_pag && tot.valore() < 0.01;
}
return chiusa;
}
@ -675,9 +698,11 @@ static TDate data_maturazione_IVA_diff(const TRectype& mov)
}
// Fattura più vecchia di un anno a ente NON pubblico
bool TLiquidazione_app::sarebbe_maturata(const TRectype& mov, const TDate& inizio, const TDate& fine) const
bool TLiquidazione_app::sarebbe_maturata(const TRectype& mov, const TDate& inizio, const TDate& fine, tipo_movimento tm2check) const
{
if (mov.get_int(MOV_TIPOMOV) != tm_fattura)
const tipo_movimento tm = (tipo_movimento) mov.get_int(MOV_TIPOMOV);
if (tm != tm2check)
return false;
const TDate data_lim = data_maturazione_IVA_diff(mov); // Data limite (un anno dopo quella di riferimento)
@ -686,8 +711,9 @@ bool TLiquidazione_app::sarebbe_maturata(const TRectype& mov, const TDate& inizi
// La data di riferimento sarebbe quella di consegna della merce, ma non avendola usiamo la data documento.
// In assenza della data documento siamo costretti ad usare la data di registrazione
const TDate data_reg = mov.get(MOV_DATAREG);
const TDate data_doc = mov.get(MOV_DATADOC);
TDate data_reg = mov.get(MOV_DATAREG);
TDate data_doc = mov.get(MOV_DATADOC);
const TDate data_rif = data_doc.ok() && data_doc < data_reg ? data_doc : data_reg;
const long giorni = fine - data_rif;
@ -1115,243 +1141,255 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt, TAssoc_array &
TProgress_monitor pi(items, pimsg, false);
for (; _cur->pos() < items; ++(*_cur))
{
{
if (!pi.set_status(_cur->pos()))
break;
TDate date = _mov->get(MOV_DATAREG);
#ifdef DBG
long nr = _mov->get_long(MOV_NUMREG);
check_nreg(nr);
TToken_string __nreg = _mov->get(MOV_NUMREG);
TToken_string __values = LOAD_VAL;
#endif
const int liqmonth = _mov->get_int(MOV_MESELIQ);
const TString4 reg = _mov->get("REG");
const bool isreg = look_reg(reg);
BREAK_DBG;
const int liqmonth = _mov->get_int(MOV_MESELIQ);
const TString4 reg = _mov->get("REG");
const bool isreg = look_reg(reg);
const TString4 tipodoc = _mov->get(MOV_TIPODOC);
const TRegistro & r = cached_registro(_reg->curr());
const bool corrisp = r.corrispettivi();
const tiporeg tipomov = r.tipo_registro();
// const bool corrisp = _reg->get_bool("B0");
// const tiporeg tipomov = (tiporeg)_reg->get_int("I0"); // 1=Vendite; 2=Acquisti
tipo_movimento tm = (tipo_movimento) _mov->get_int(MOV_TIPOMOV);
real imp_split_payment;
// const bool corrisp = _reg->get_bool("B0");
// const tiporeg tipomov = (tiporeg)_reg->get_int("I0"); // 1=Vendite; 2=Acquisti
tipo_movimento tm = (tipo_movimento)_mov->get_int(MOV_TIPOMOV);
real imp_split_payment;
if (tm == tm_nessuno)
{
if (tipodoc == "FV" || tipodoc == "FA")
tm = tm_fattura; else
if (tipodoc == "NC")
tm = tm_nota_credito;
if (tipodoc == "NC")
tm = tm_nota_credito;
}
if (_isviaggio)
if (_isviaggio)
{
if (tipomov == vendita && _mov->get_date(MOV_DATA74TER).ok())
if (tipomov == vendita && _mov->get_date(MOV_DATA74TER).ok())
date = _mov->get_date(MOV_DATA74TER);
if (date.year() != year_int) // Controlla anno di appartenenza, altrimenti is_date_ok potrebbe non funzionare
continue;
}
const TRectype& rcs = _cur->curr(LF_CAUSALI);
const TDate datareg = _mov->get_date(MOV_DATAREG);
const TDate datadoc = _mov->get_date(MOV_DATADOC);
const bool fatt_rit_2018 = _mov->get_bool(MOV_RITFATT) && (datareg.year() >= 2018);
const int year_diff = datareg.year() - datadoc.year();
const bool dataritind = ((tipomov == acquisto) && fatt_rit_2018) &&
((year_diff > 2) || ((year_diff >= 1) && datareg.month() >= 5));
const bool fattrit = ((tipomov == acquisto) && !dataritind && fatt_rit_2018) && (year_diff >= 1);
const bool fattritind = (atoi(_year) < 2018 && rcs.get_bool(CAU_RITFATT)) || dataritind;
const bool cau_intra = rcs.get_bool(CAU_INTRACOM);
}
const TRectype& rcs = _cur->curr(LF_CAUSALI);
const TDate datareg = _mov->get_date(MOV_DATAREG);
const TDate datadoc = _mov->get_date(MOV_DATADOC);
const bool fatt_rit_2018 = _mov->get_bool(MOV_RITFATT) && (datareg.year() >= 2018);
const int year_diff = datareg.year() - datadoc.year();
const bool dataritind = ((tipomov == acquisto) && fatt_rit_2018) &&
((year_diff > 2) || ((year_diff >= 1) && datareg.month() >= 5));
const bool fattrit = ((tipomov == acquisto) && !dataritind && fatt_rit_2018) && (year_diff >= 1);
const bool fattritind = (atoi(_year) < 2018 && rcs.get_bool(CAU_RITFATT)) || dataritind;
const bool cau_intra = rcs.get_bool(CAU_INTRACOM);
const bool cau_valintra = rcs.get_bool(CAU_VALINTRA);
// Inizio gestione IVA differita
const bool iva_diff = _mov->get_bool(MOV_LIQDIFF) && is_IVA_diff(_mov->curr());
const bool iva_diff = _mov->get_bool(MOV_LIQDIFF) && is_IVA_diff(_mov->curr());
const bool iva_cass = !iva_diff && !_isviaggio && tm > tm_nessuno && is_IVAxCassa(_mov->curr());
const bool bIsMovDiff = (iva_diff || iva_cass) && !_recalc_regis; // Aggiunto test su ricalcolo da registri 13-12-2012
bool dok = is_date_ok(date, month, liqmonth, year_int);
const bool ic = _mov->get_bool(MOV_IVAXCASSA);
const bool bIsMovDiff = (iva_diff || iva_cass) && !_recalc_regis; // Aggiunto test su ricalcolo da registri 13-12-2012
bool dok = is_date_ok(date, month, liqmonth, year_int);
const bool ic = _mov->get_bool(MOV_IVAXCASSA);
TPartite_array arrpart; // Partite interessate
TPointer_array pagscatt; // Righe di pagsca interessate
#ifdef DBG
check_nreg(nr);
BREAK_DBG;
if (fattrit)
dok = (atoi(_year) == datadoc.year()) && _month == 13;
#endif
if (fattrit)
dok = (atoi(_year) == datadoc.year()) && _month == 13;
if (bIsMovDiff && tm == tm_fattura)
{
const bool id_chiusa = ivadiff_chiusa(_mov->curr(), TDate(31,12,inizio.year()-1));
if (!dok && id_chiusa)
continue; // Salta vecchi movimenti differiti già chiusi
// Sezione preferita per fatture decisa in base a vendita->'A' o acquisto->'D'
const char sezfat = tipomov == vendita ? 'D' : 'A';
const char sezpag = (sezfat=='D') ? 'A' : 'D';
const long numreg = _mov->get_long(MOV_NUMREG);
TDate datainc = fine;
real tot_incassato, tot_da_incassare;
int flag_pg_nc = 0; // Ci sono pagamenti (0x1) e/o note di credito(0x2) ?
bool game_found = false;
if (has_sc)
if (bIsMovDiff)
{
if ((tm == tm_fattura) || (tm == tm_nota_credito && !dok))
{
arrpart.add_numreg(numreg);
const TPartita* p = arrpart.first();
const int row = p ? p->mov2rig(numreg, 0) : 0;
const bool id_chiusa = ivadiff_chiusa(_mov->curr(), TDate(31, 12, inizio.year() - 1));
if (!dok && id_chiusa)
continue; // Salta vecchi movimenti differiti già chiusi
game_found = row > 0;
if (game_found && !id_chiusa)
{
const TRiga_partite& rp = p->riga(row);
// Sezione preferita per fatture decisa in base a vendita->'A' o acquisto->'D'
const char sezfat = tipomov == vendita ? 'D' : 'A';
const char sezpag = (sezfat == 'D') ? 'A' : 'D';
const long numreg = _mov->get_long(MOV_NUMREG);
TDate datainc = fine;
real tot_incassato, tot_da_incassare;
int flag_pg_nc = 0; // Ci sono pagamenti (0x1) e/o note di credito(0x2) ?
bool game_found = false;
TImporto residuo;
TDate orizzonte = fine; // caso tradizionale
if (iva_cass)
{
TDate data_rif = data_maturazione_IVA_diff(_mov->curr());
if (data_rif < fine)
orizzonte = data_rif;
}
TImporto pg_per, nc_per;
bool regular_month = orizzonte >= date;
bool first_month = regular_month && date > inizio + 1L;
#ifdef DBG
check_nreg(nr);
if (rp.get_long(PART_NREG) == 100616)
int i = 1;
#endif
flag_pg_nc = rp.calcola_pagato_periodo(first_month ? botime : inizio + 1L, orizzonte, pg_per, nc_per, &pagscatt) && regular_month;
if (pagscatt.items() >= 2)
{
// Fondo tra loro le righe generate dallo stesso pagamento
for (int p = pagscatt.last(); p > 0; p--)
{
const TRectype& p0 = (const TRectype&)pagscatt[p];
const TRectype& p1 = (const TRectype&)pagscatt[p - 1];
if (p0.get_int(PAGSCA_NRIGP) == p1.get_int(PAGSCA_NRIGP))
{
const real imp = p0.get_real(PAGSCA_IMPORTO);
((TRectype&)p1).add(PAGSCA_IMPORTO, imp);
pagscatt.destroy(p, true);
}
}
}
if (iva_diff || sarebbe_maturata(_mov->curr(), inizio + 1L, fine) || (iva_cass && _end_cassa))
{
TPointer_array pagscaold;
TImporto pg_tot, nc_tot;
rp.calcola_pagato_periodo(TDate(0L), orizzonte, pg_tot, nc_tot, &pagscaold);
// Controllo se ci siam persi delle note di credito negli anni scorsi
if (!nc_tot.is_zero() && pagscaold.items() > pagscatt.items())
{
FOR_EACH_ARRAY_ITEM(pagscaold, i, obj)
{
const TRectype& pagsca = *(const TRectype*)obj;
const int anno = pagsca.get_int(PAGSCA_ANNO);
const int nrigp = pagsca.get_int(PAGSCA_NRIGP);
// Appartiene all'anno scorso?
if (anno < year_int && nrigp < 999) // 9999 on pagsca -> 999 on ivadiff
{
const TPartita& p = arrpart.partita(pagsca);
const TRiga_partite& rp = p.riga(nrigp);
// E' veramente una nota di credito?
if (rp.tipo() == tm_nota_credito)
{
bool found = false;
FOR_EACH_ARRAY_ITEM(pagscatt, j, ps)
{
if (ps == obj)
{
found = true;
break;
}
}
if (!found)
{
TLocalisamfile id(LF_IVADIFF);
id.put(RMI_NUMREG, _rmoviva->get(RMI_NUMREG));
id.put(RMI_NUMRIG, _rmoviva->get(RMI_NUMRIG));
id.put("NUMPRO", nrigp);
if (id.read(_isequal) != NOERR || id.get_int("ANNOLIQ") == 0)
pagscatt.add(obj);
}
}
}
}
}
TImporto incasso = pg_tot;
TImporto saldo = rp.importo(false);
incasso += nc_tot;
saldo += incasso;
saldo.normalize(sezfat);
incasso.normalize(sezpag);
if (saldo.valore() > ZERO)
tot_da_incassare = saldo.valore();
if (incasso.valore() > ZERO)
tot_incassato = incasso.valore();
}
else
{
TImporto incasso = pg_per;
incasso += nc_per;
incasso.normalize(sezpag);
if (incasso.valore() > ZERO)
tot_incassato = incasso.valore();
}
}
}
if (!game_found) // No saldaconto o partita assente
{
datainc = iva_diff ? _mov->get_date(MOV_DATAINC) : TDate();
if (datainc.ok() && datainc <= fine)
tot_incassato = _mov->get_real(MOV_TOTDOC);
else
BREAK_DBG;
if (has_sc)
{
// Fattura più vecchia di un anno a ente NON pubblico
if (sarebbe_maturata(_mov->curr(), inizio+1L, fine) || (iva_cass && _end_cassa))
tot_da_incassare = _mov->get_real(MOV_TOTDOC);
}
}
// Simulo incasso se necessario
if (iva_cass && tot_da_incassare > ZERO) // già controllato se sarebbe_maturata(_mov->curr(), fine)
{
tot_incassato = tot_da_incassare;
arrpart.add_numreg(numreg);
const TPartita* p = arrpart.first();
datainc = data_maturazione_IVA_diff(_mov->curr());
if (iva_cass && _end_cassa && datainc.year() != atoi(_year))
datainc = data_end_cassa;
if ((tm == tm_fattura) || (tm == tm_nota_credito && p->prima_fattura() < 0)) // fattura o nota di credito senza fattura
{
const int row = p ? p->mov2rig(numreg, 0) : 0;
if (p != nullptr)
residuo = p->calcola_saldo_al(false, inizio);
game_found = row > 0;
if (game_found && !id_chiusa)
{
const TRiga_partite& rp = p->riga(row);
TDate orizzonte = fine; // caso tradizionale
if (iva_cass)
{
TDate data_rif = data_maturazione_IVA_diff(_mov->curr());
if (data_rif < fine)
orizzonte = data_rif;
}
TImporto pg_per, nc_per;
bool regular_month = orizzonte >= date;
bool first_month = regular_month && date > inizio + 1L;
BREAK_DBG;
#ifdef DBG
else
int i = 1;
if (rp.get_long(PART_NREG) == 100616)
int i = 1;
#endif
_mov->put(MOV_DATAINC, datainc);
if (datainc < date)
datainc = date;
}
if (tot_incassato > ZERO && is_date_ok(datainc, month, liqmonth, year_int))
{
flag_pg_nc = 0x1;
TRectype* pagsca = new TRectype(LF_PAGSCA);
pagsca->put(PAGSCA_TIPOC, _mov->get(MOV_TIPO));
pagsca->put(PAGSCA_SOTTOCONTO, _mov->get(MOV_CODCF));
pagsca->put(PAGSCA_ANNO, year_int);
pagsca->put(PAGSCA_NRIGA, 1);
pagsca->put(PAGSCA_NRATA, 1);
pagsca->put(PAGSCA_NRIGP, 9999);
pagsca->put(PAGSCA_IMPORTO, tot_incassato);
pagscatt.add(pagsca);
flag_pg_nc = rp.calcola_pagato_periodo(first_month ? botime : inizio + 1L, orizzonte, pg_per, nc_per, &pagscatt) && regular_month;
residuo += pg_per;
if (pagscatt.items() >= 2)
{
// Fondo tra loro le righe generate dallo stesso pagamento
for (int p = pagscatt.last(); p > 0; p--)
{
const TRectype& p0 = (const TRectype&)pagscatt[p];
const TRectype& p1 = (const TRectype&)pagscatt[p - 1];
if (p0.get_int(PAGSCA_NRIGP) == p1.get_int(PAGSCA_NRIGP))
{
const real imp = p0.get_real(PAGSCA_IMPORTO);
((TRectype&)p1).add(PAGSCA_IMPORTO, imp);
pagscatt.destroy(p, true);
}
}
}
if (iva_diff || ((abs(residuo.valore()) > UN_CENTESIMO) && sarebbe_maturata(_mov->curr(), inizio + 1L, fine, tm)) || (iva_cass && _end_cassa))
{
TPointer_array pagscaold;
TImporto pg_tot, nc_tot;
rp.calcola_pagato_periodo(TDate(0L), orizzonte, pg_tot, nc_tot, &pagscaold);
// Controllo se ci siam persi delle note di credito negli anni scorsi
if (!nc_tot.is_zero() && pagscaold.items() > pagscatt.items())
{
FOR_EACH_ARRAY_ITEM(pagscaold, i, obj)
{
const TRectype& pagsca = *(const TRectype*)obj;
const int anno = pagsca.get_int(PAGSCA_ANNO);
const int nrigp = pagsca.get_int(PAGSCA_NRIGP);
// Appartiene all'anno scorso?
if (anno < year_int && nrigp < 999) // 9999 on pagsca -> 999 on ivadiff
{
const TPartita& p = arrpart.partita(pagsca);
const TRiga_partite& rp = p.riga(nrigp);
// E' veramente una nota di credito?
if (rp.tipo() == tm_nota_credito)
{
bool found = false;
FOR_EACH_ARRAY_ITEM(pagscatt, j, ps)
{
if (ps == obj)
{
found = true;
BREAK_DBG;
}
}
if (!found)
{
TLocalisamfile id(LF_IVADIFF);
id.put(RMI_NUMREG, _rmoviva->get(RMI_NUMREG));
id.put(RMI_NUMRIG, _rmoviva->get(RMI_NUMRIG));
id.put("NUMPRO", nrigp);
if (id.read(_isequal) != NOERR || id.get_int("ANNOLIQ") == 0)
pagscatt.add(obj);
}
}
}
}
}
TImporto incasso = pg_tot;
TImporto saldo = rp.importo(false);
incasso += nc_tot;
saldo += incasso;
saldo.normalize(sezfat);
incasso.normalize(sezpag);
if (saldo.valore() > ZERO || (tm == tm_nota_credito && saldo.valore() < ZERO))
tot_da_incassare = saldo.valore();
if (incasso.valore() > ZERO || (tm == tm_nota_credito && incasso.valore() < ZERO))
tot_incassato = incasso.valore();
}
else
{
TImporto incasso = pg_per;
incasso += nc_per;
incasso.normalize(sezpag);
if (incasso.valore() > ZERO)
tot_incassato = incasso.valore();
}
}
}
}
if (!game_found) // No saldaconto o partita assente
{
datainc = iva_diff ? _mov->get_date(MOV_DATAINC) : TDate();
if (datainc.ok() && datainc <= fine)
tot_incassato = _mov->get_real(MOV_TOTDOC);
else
{
// Fattura più vecchia di un anno a ente NON pubblico
if ((abs(residuo.valore()) > UN_CENTESIMO || !has_sc) && sarebbe_maturata(_mov->curr(), inizio + 1L, fine, tm) || (iva_cass && _end_cassa))
tot_da_incassare = _mov->get_real(MOV_TOTDOC);
}
}
// Simulo incasso se necessario
if (iva_cass && ((tot_da_incassare > ZERO) || (tm == tm_nota_credito && tot_da_incassare < ZERO))) // già controllato se sarebbe_maturata(_mov->curr(), fine)
{
tot_incassato = tot_da_incassare;
datainc = data_maturazione_IVA_diff(_mov->curr());
if (iva_cass && _end_cassa && datainc.year() != atoi(_year))
datainc = data_end_cassa;
#ifdef DBG
else
BREAK_DBG;
#endif
_mov->put(MOV_DATAINC, datainc);
if (datainc < date)
datainc = date;
}
if ((tot_incassato > ZERO || (tm == tm_nota_credito && tot_incassato < ZERO)) && (!has_sc || abs(residuo.valore()) > UN_CENTESIMO) && is_date_ok(datainc, month, liqmonth, year_int))
{
flag_pg_nc = 0x1;
TRectype* pagsca = new TRectype(LF_PAGSCA);
pagsca->put(PAGSCA_TIPOC, _mov->get(MOV_TIPO));
pagsca->put(PAGSCA_SOTTOCONTO, _mov->get(MOV_CODCF));
pagsca->put(PAGSCA_ANNO, year_int);
pagsca->put(PAGSCA_NRIGA, 1);
pagsca->put(PAGSCA_NRATA, 1);
pagsca->put(PAGSCA_NRIGP, 9999);
pagsca->put(PAGSCA_IMPORTO, tot_incassato);
pagscatt.add(pagsca);
}
if (flag_pg_nc)
dok = true;
}
if (flag_pg_nc)
dok = true;
}
/*
* check register present, rmoviva present and date OK
@ -1415,7 +1453,7 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt, TAssoc_array &
TCodiceIVA civa(codiva);
#ifdef DBG
check_nreg(nr);
BREAK_DBG;
if (tipomov == vendite)
int i = 1;
if (!bIsMovDiff && (civa.percentuale() == 20))
@ -1489,13 +1527,8 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt, TAssoc_array &
const bool soloiva = cached_causale(codcaus, atoi(_year)).reg().iva() != nessuna_iva && rmoviva.empty();
const TCli_for & clifo = cached_clifor(LF_MOV, _mov->curr());
const int tp = clifo.alleg();
// const TRectype& clifo = cache().get_rec(LF_CLIFO, _mov->get(MOV_TIPO), _mov->get(MOV_CODCF));
// const int tp = clifo.get_int(CLI_ALLEG);
#ifdef DBG
check_nreg(nr);
#endif
BREAK_DBG;
if ((soloiva &&
(caus_reg.objptr(codcaus) != NULL || tp < 1)) &&
sosp_imp != vol_affari)
@ -1533,9 +1566,8 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt, TAssoc_array &
const TDate datareg = _mov->get_date(MOV_DATAREG);
int mesereg = liqmonth == 0 ? datareg.month() : liqmonth;
bool ok = is_month_ok(mesereg, month) && (atoi(_year) == datareg.year());
#ifdef DBG
check_nreg(nr);
#endif
BREAK_DBG;
if (ok)
{
datafat = datareg;
@ -1745,10 +1777,10 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt, TAssoc_array &
}
}
}
if (!pag_found)
val_iva = civa.scorpora(val_imp, TCurrency::get_firm_dec());
else
civa.scorpora(val_imp, TCurrency::get_firm_dec());
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
@ -1886,7 +1918,7 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt, TAssoc_array &
bool bMovDiffToAdd = true;
#ifdef DBG
check_nreg(nr);
BREAK_DBG;
if (!bIsMovDiff && (civa.percentuale() == 20))
real p = imposta_orig / imponibile_orig * CENTO;
#endif
@ -2622,13 +2654,13 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt, TAssoc_array &
if (tipomov == vendita)
{
#ifndef NDEBUG
if (codiva=="10" && !incdiff_iva.is_zero())
if (codiva == "10" && !incdiff_iva.is_zero())
{
const real oldv = tab->get("R29");
const real newv = oldv + incdiff_iva;
const long numreg = _mov->get_long(MOV_NUMREG);
__trace("%s %s\t%s\t%s\t%7ld\t%s\t+\t%s\t=\t%s", tab->name(), (const char*)tab->curr().get("CODTAB"), (const char*)reg, (const char*)tipocr_s,
numreg, oldv.stringa(12, 2), incdiff_iva.stringa(12, 2), newv.stringa(12, 2));
numreg, oldv.stringa(12, 2), incdiff_iva.stringa(12, 2), newv.stringa(12, 2));
}
#endif
// fatture vendita a liquidazione differita

View File

@ -1570,9 +1570,19 @@ int TLiquidazione_app::print_acc_diff_xcassa(const _DescrItem& d)
int i = 9;
const real& totiva = d._r0;
const real ivadiff_inc = d._r29;
const real ivadiff_pag = d._r33;
real ivadiff_inc = d._r29;
real ivadiff_pag = d._r33;
if (ivadiff_inc < ZERO)
{
ivadiff_pag -= ivadiff_inc;
ivadiff_inc = ZERO;
}
if (ivadiff_pag < ZERO)
{
ivadiff_inc -= ivadiff_pag;
ivadiff_pag = ZERO;
}
real ivaxcas_inc, ivaxcas_pag;
if (has_module(ICAUT))
@ -2310,6 +2320,16 @@ void TLiquidazione_app::set_grand_2000(_DescrItem& d, int &rw)
xcasinc_iva_acq -= ind;
}
}
if (xcasinc_iva < ZERO)
{
xcasinc_iva_acq -= xcasinc_iva;
xcasinc_iva = ZERO;
}
if (xcasinc_iva_acq < ZERO)
{
xcasinc_iva -= xcasinc_iva_acq;
xcasinc_iva_acq = ZERO;
}
TToken_string tt(d._s0);
real iva_vend(tt.get(0));
@ -2355,9 +2375,9 @@ void TLiquidazione_app::set_grand_2000(_DescrItem& d, int &rw)
if (!_is_visliq)
iva_vend += rett_debt;
set_row(rw++, FR("@11g@bIVA esigibile@r per il periodo@75g%r"), &iva_vend);
if (!diffinc_iva.is_zero())
if (diffinc_iva != ZERO)
set_row(rw++,FR("@11g a liquidazione differita@75g%r"), &diffinc_iva);
if (!xcasinc_iva.is_zero())
if (xcasinc_iva != ZERO)
set_row(rw++,FR("@11g per cassa@75g%r"), &xcasinc_iva);
if (_is_visliq)
set_row(rw++,FR("@11g$[r]Rettifiche IVA a debito$[n]@75g%r"), &rett_debt); // Rettifiche modificabili
@ -2367,9 +2387,9 @@ void TLiquidazione_app::set_grand_2000(_DescrItem& d, int &rw)
iva_acq += rett_cred;
iva_acq -= cred_fattrit;
set_row(rw++, FR("@11g@bIVA detraibile@r per il periodo@58g%r"), &iva_acq);
if (!diffinc_iva_acq.is_zero())
if (diffinc_iva_acq != ZERO)
set_row(rw++,FR("@11g a liquidazione differita@58g%r"), &diffinc_iva_acq);
if (!xcasinc_iva_acq.is_zero())
if (xcasinc_iva_acq != ZERO)
set_row(rw++,FR("@11g per cassa@58g%r"), &xcasinc_iva_acq);
if (_is_visliq)
set_row(rw++,FR("@11g$[r]Rettifiche IVA a credito$[n]@58g%r"), &rett_cred);