Correzione in liquidazione IVA relativa allo scorporo corretto

(sia in annuale che nel periodo).


git-svn-id: svn://10.65.10.50/trunk@4139 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
angelo 1997-02-19 08:53:29 +00:00
parent 2d4a8bddba
commit cafd3fcd50
3 changed files with 178 additions and 33 deletions

View File

@ -570,16 +570,16 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt)
for (; _cur->pos() < items; ++(*_cur))
{
#ifdef DBG
if (_cur->pos() % 100 == 0L)
if ((_cur->pos() & 0x7F) == 0)
{
#ifdef DBG
msgdbg.format("Ricalcolo attivita': P=%ld/%ld",_cur->pos(),items);
freespace = GetFreeSpace(0);
msgdbg << " Memoria libera(1): " << freespace/1024 << " Kbytes.";
xvt_statbar_set(msgdbg);
#endif
do_events();
}
#endif
TDate date(_mov->get("DATAREG"));
TString16 reg = _mov->get("REG");
bool isreg = look_reg(_mov->get("REG"));
@ -985,6 +985,7 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt)
real imp = _pim->get_real("R0"); // imponibile
real ivp = _pim->get_real("R1"); // IVA su imp.
real lor = _pim->get_real("R2"); // lordo
real lorcor = _pim->get_real("R3"); // lordo corrispettivi (da non ventilare)
/*
* le maledette fatture con scontrino sono sul registro dei
@ -1103,6 +1104,7 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt)
{
real perc = _iva->get_real("R0")/CENTO;
lor += imponibile + imposta;
lorcor += imponibile+imposta;
real tot = imponibile+imposta;
if (liq) add_corrisp(month, reg, tot, perc, tipodet, codiva, codatt);
}
@ -1196,6 +1198,7 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt)
_pim->put("R0",imp);
_pim->put("R1",ivp);
_pim->put("R2",lor);
_pim->put("R3",lorcor); // Corrispettivi, non inclusi quelli da ventilare
_pim->put("R5",ifs);
_pim->put("R6",vfs);
_pim->put("R7",adf);
@ -1772,6 +1775,10 @@ void TLiquidazione_app::iva11_set_arr_pim(const TString& codatt)
_BolgArray b_arr;
const bool is_key = _iva11_arr.is_key(codatt);
_BolgArray& array = is_key ? (_BolgArray&)_iva11_arr.find(codatt) : b_arr;
// Scorporo corretto dei corrispettivi in R3
TAssoc_array corr_ann;
_CorrItem cx,*cc;
bool is_present;
for (_pim->first(); !_pim->eof(); _pim->next())
{
@ -1878,6 +1885,16 @@ void TLiquidazione_app::iva11_set_arr_pim(const TString& codatt)
if ((_isagricolo && tagr==2) || !_isagricolo)
{
// Accumula i corrispettivi da scorporare per codice iva
is_present = corr_ann.is_key(codiva);
cx._totale = 0;
_CorrItem& ca = is_present ? (_CorrItem&) corr_ann[codiva] : cx;
ca._totale += _pim->get_real("R3");
if (!is_present) // se non c'e' lo aggiunge
{
ca._aliquota = _iva->get_real("R0"); // Se e' nuovo setta l'aliquota
corr_ann.add(codiva,ca);
}
tt = _pim->get("S0");
a13i = tt.get(0);
a13v = tt.get(1);
@ -1957,6 +1974,44 @@ void TLiquidazione_app::iva11_set_arr_pim(const TString& codatt)
}
}
// Scorre i corrispettivi lordi accumulati, li scorpora ed aggiorna i righi relativi
for (cc = (_CorrItem *)corr_ann.first_item(); cc != NULL; cc = (_CorrItem *)corr_ann.succ_item())
{
lordo2netto(cc->_totale,imp,iva,cc->_aliquota/CENTO);
vtot += imp; ivav += iva;
if (cc->_aliquota == 4.00)
{
array.add(imp,TAB11_EC101);
array.add(iva,TAB11_EC201);
}
else if (cc->_aliquota == 9.00)
{
array.add(imp,TAB11_EC102);
array.add(iva,TAB11_EC202);
}
else if (cc->_aliquota == 10.00)
{
array.add(imp,TAB11_EC103);
array.add(iva,TAB11_EC203);
}
else if (cc->_aliquota == 13.00)
{
array.add(imp,TAB11_EC104);
array.add(iva,TAB11_EC204);
}
else if (cc->_aliquota == 16.00)
{
array.add(imp,TAB11_EC105);
array.add(iva,TAB11_EC205);
}
else if (cc->_aliquota == 19.00)
{
array.add(imp,TAB11_EC106);
array.add(iva,TAB11_EC206);
}
}
// Hisss... Rettifica l'importo di EC115: EC115 = EC116 + EC117 + EC115
// Va beh...
real r16, r17;
@ -2616,8 +2671,14 @@ void TLiquidazione_app::recalc_annual(const char* att)
es_b3 = _pla->get_real("R3");
cess_amm = _pla->get_real("R4");
pro_pag = _pla->get_real("R12");
iva_acq = _pla->get_real("R11");
iva_acq = _pla->get_real("R11");
// Per avere un risultato corretto, si deve totalizzare PIM->R3 per codice iva
// e quindi effettuare lo scorporo dell'imponibile e aggiungere al relativo volume d'affari
TAssoc_array corr_ann;
_CorrItem cx,*cc;
bool is_key;
for (_pim->first(); !_pim->eof(); _pim->next())
{
if (_year != *_pim_anno) continue;
@ -2636,8 +2697,19 @@ void TLiquidazione_app::recalc_annual(const char* att)
a13 = _pim->get("S0");
imp_a13 = a13.get(0);
imp_ifs -= imp_af + imp_a13; // Toglie le autofatture e le op. A13
if (corrisp) imp_ifs += _pim->get_real("R5"); // Se corrisp. aggiunge le FS
if (corrisp)
{
imp_ifs += _pim->get_real("R5"); // Se corrisp. aggiunge le FS
is_key = corr_ann.is_key(codiva);
cx._totale = 0;
_CorrItem& ca = is_key ? (_CorrItem&) corr_ann[codiva] : cx;
ca._totale += _pim->get_real("R3");
if (!is_key) // se non c'e' lo aggiunge
{
ca._aliquota = _iva->get_real("R0")/CENTO; // Se e' nuovo setta l'aliquota
corr_ann.add(codiva,ca);
}
}
if ( // ESCLUSI:
strcmp(att,*_pim_codatt) != 0 ||
treg != vendita || // non vendite
@ -2652,7 +2724,19 @@ void TLiquidazione_app::recalc_annual(const char* att)
else
volaff2 += imp_ifs;
}
// Ora si scorporano i corrispettivi raggruppati per codice IVA e si totalizzano gli imponibili
// calcolati, da aggiungere poi a volaff1 o volaff2
real imp,iva;
for (cc = (_CorrItem *)corr_ann.first_item(); cc != NULL; cc = (_CorrItem *)corr_ann.succ_item())
{
lordo2netto(cc->_totale,imp,iva,cc->_aliquota);
if (tipoatt == 1)
volaff1 += imp;
else
volaff2 += imp;
}
// calcola esenti, cessioni, lordo vendite, prorata pagato
// e IVA acquisti dai plm/ptm/pum/pam/pom

View File

@ -105,7 +105,7 @@ void TLiquidazione_app::recalc_corrispettivi(int month, const char* codatt)
// x13
TString key;
bool is_key;
TAssoc_array corr_ann; // Contiene corrispettivi annuali (temporaneo, da rimuovere
TAssoc_array corr_ann; // Contiene corrispettivi annuali (temporaneo, da correggere
// non appena implementato correttamente il mese 13)
_CorrItem cx;
@ -117,25 +117,26 @@ void TLiquidazione_app::recalc_corrispettivi(int month, const char* codatt)
for (int i = 0; i < items; i++)
{
_CorrItem* ci = (_CorrItem*)&_corr_arr[i];
// Se e' annuale memorizza in un assoc_array i corrispettivi annuali
// memorizza per attivita'+registro+codiva+tipodet
// memorizza per codiva
// x13
if (month == 13)
if ((month != 13 && ci->_month != month) || ci->_codatt != codatt) continue;
key = ci->_codiva;
is_key = corr_ann.is_key(key);
cx._totale = 0;
_CorrItem& ca = is_key ? (_CorrItem&) corr_ann[key] : cx;
ca._totale += ci->_totale;
if (!is_key) // se non c'e' lo aggiunge
{
key = ci->_codiva;
is_key = corr_ann.is_key(key);
cx._totale = 0;
_CorrItem& ca = is_key ? (_CorrItem&) corr_ann[key] : cx;
ca._totale += ci->_totale;
if (!is_key) // se non c'e' lo aggiunge
{
ca._aliquota = ci->_aliquota;
ca._codreg = ci->_codreg;
ca._tipodet = ci->_tipodet;
corr_ann.add(key,ca);
}
continue;
ca._aliquota = ci->_aliquota;
/*
ca._codreg = ci->_codreg;
ca._tipodet = ci->_tipodet;
*/
corr_ann.add(key,ca);
}
/*
continue;
// fine x13
if (ci->_month != month || ci->_codatt != codatt)
@ -162,21 +163,24 @@ void TLiquidazione_app::recalc_corrispettivi(int month, const char* codatt)
_pim->put("R0", imponibile);
_pim->put("R1", imposta);
_pim->rewrite();
*/
}
// Dopo aver calcolato la somma dei corrispettivi annualmente, li scorpora
// x13
if (month == 13)
{
// if (month == 13)
//{
real imp,iva,imp1,iva1;
_CorrItem* cc;
// Per le prossime scritture uso impropriamente il mese 12, lo so e' terribile...
// Per le prossime scritture(PAM e PLM) uso impropriamente il mese 12, lo so e' terribile...
// ma non appena possibile il mese 13 sara' disponibile tutto sara' piu' bello.
//const int m = month == 13 ? 12 : month;
for (cc = (_CorrItem *)corr_ann.first_item(); cc != NULL; cc = (_CorrItem *)corr_ann.succ_item())
{
lordo2netto(cc->_totale, imp, iva, cc->_aliquota);
imponibile += imp;
imposta += iva;
look_pim(12, codatt, cc->_codreg, "", corr_ann.get_hashobj()->key(), cc->_tipodet, TRUE);
/*
look_pim(m, codatt, cc->_codreg, "", corr_ann.get_hashobj()->key(), cc->_tipodet, TRUE);
imp1 = _pim->get_real("R0");
iva1 = _pim->get_real("R1");
imp1 += imp;
@ -184,8 +188,10 @@ void TLiquidazione_app::recalc_corrispettivi(int month, const char* codatt)
_pim->put("R0",imp1);
_pim->put("R1",iva1);
_pim->rewrite();
*/
//}
}
look_plm(12, codatt); // Aggiorna l'iva vendite in PLM...
look_plm(month, codatt); // Aggiorna l'iva vendite in PLM...
real ive = _plm->get_real("R0");
ive += imposta;
_plm->put("R0",ive);
@ -195,7 +201,6 @@ void TLiquidazione_app::recalc_corrispettivi(int month, const char* codatt)
_pam->put("R1",vaf);
_plm->rewrite();
_pam->rewrite();
}
// fine x13
}
@ -651,18 +656,26 @@ _DescrItem* TLiquidazione_app::recalc_rimborso(int month, const char* codatts,
// Condizione 2...
// scorri i bellissimi progressivi mensili
// Nota: i valori ricavati vanno poi integrati con R3, dove sono memorizzati i corrispettivi da scorporare
// anche qui si accumula per codice iva e si effettua lo scorporo alla fine del ciclo.
TAssoc_array corr_ann;
TString codiva;
_CorrItem cx,*cc;
bool is_key;
const int year = atoi((const char*)_year);
for (_pim->first(); !_pim->eof(); _pim->next())
{
int ryear = atoi(*_pim_anno);
int rmese = atoi(*_pim_mese);
int tipodet = atoi(*_pim_tipodet);
codiva = *_pim_codiva;
// B3 significa che e' acq. o vendita valido per rimb. per aliquota
if (!_pim->get_bool("B3")) continue;
// Se il tipo di codice e' NS non va considerato nella sommatoria del tot. acquisti
look_iva(*_pim_codiva);
look_iva(codiva);
const bool non_sogg = _iva->get("S1") == "NS";
if (!is_mens) // Trimestrali
@ -687,6 +700,15 @@ _DescrItem* TLiquidazione_app::recalc_rimborso(int month, const char* codatts,
// vedi sopra...
vtot += imp;
ivav += iva;
is_key = corr_ann.is_key(codiva);
cx._totale = 0;
_CorrItem& ca = is_key ? (_CorrItem&) corr_ann[codiva] : cx;
ca._totale += _pim->get_real("R3");
if (!is_key) // se non c'e' lo aggiunge
{
ca._aliquota = _iva->get_real("R0")/CENTO; // Se e' nuovo setta l'aliquota
corr_ann.add(codiva,ca);
}
}
}
else
@ -698,6 +720,14 @@ _DescrItem* TLiquidazione_app::recalc_rimborso(int month, const char* codatts,
}
} // end of for
real impc,ivac; // Aggiunge lo scorporo dei corrispettivi alle vendite calcolate
for (cc = (_CorrItem *)corr_ann.first_item(); cc != NULL; cc = (_CorrItem *)corr_ann.succ_item())
{
lordo2netto(cc->_totale,impc,ivac,cc->_aliquota);
vtot += impc;
ivav += ivac;
}
// finalmente
alv = ivav/vtot; alv.round(4);
ala = ivaa/atot; ala.round(4);

View File

@ -469,6 +469,11 @@ void TLiquidazione_app::describe_pims(int month, const char* codatt)
_DescrItem* hea = new _DescrItem(PIM_HEAD);
hea->_f0 = skip_acq; // cosi' non compare nemmeno la colonnina! contento?
_descr_arr.add(hea);
// Assoc array per memorizzare i corrispettivi da scorporare. Tali corrispettivi verranno
// aggiunti alla fine del ciclo, scorrendo tutte le righe generate.
TAssoc_array corr_ann;
_CorrItem cx;
bool is_key;
while ((tmpatt = atts.get()) != NULL)
{
@ -571,6 +576,15 @@ void TLiquidazione_app::describe_pims(int month, const char* codatt)
}
else // vendita
{
is_key = corr_ann.is_key(codiva);
cx._totale = 0;
_CorrItem& ca = is_key ? (_CorrItem&) corr_ann[codiva] : cx;
ca._totale += _pim->get_real("R3");
if (!is_key) // se non c'e' lo aggiunge
{
ca._aliquota = _iva->get_real("R0")/CENTO; // Se e' nuovo setta l'aliquota
corr_ann.add(codiva,ca);
}
// vedi corrispettivi veri e falsi
real cvi = _pim->get_real("R0"); // imp. totale
real cvv = _pim->get_real("R1"); // iva totale
@ -653,6 +667,23 @@ void TLiquidazione_app::describe_pims(int month, const char* codatt)
}
}
real impc,ivac; // Aggiunge lo scorporo dei corrispettivi
const int ditems = _descr_arr.items();
for (int i=0;i<ditems;i++) // scorre le righe memorizzate
{
_DescrItem& dd = (_DescrItem&) _descr_arr[i];
if (dd._flags != PIM_ROW) continue;
if (corr_ann.is_key(dd._s1)) // Se esiste il codice iva corrispondente sull'array corrispettivi
{
_CorrItem& cc = (_CorrItem &) corr_ann[dd._s1];
lordo2netto(cc._totale,impc,ivac,cc._aliquota);
dd._r2 += impc; // allora effettua lo scorporo e aggiorna i totali
dd._r3 += ivac;
t2 += impc;
t3 += ivac;
}
}
look_plm(month,att);
real iva74t = _pom->get_real("R13");
if (iva74t.sign() > 0)
@ -672,7 +703,7 @@ void TLiquidazione_app::describe_pims(int month, const char* codatt)
}
if (art40.sign() > 0 || art40_iva.sign() > 0)
{
{
_DescrItem* ads = new _DescrItem(PIM_ROW);
ads->_s0 = ref;
ads->_s1 = "A13";