diff --git a/cg/cg4301.cpp b/cg/cg4301.cpp index 5226b77b4..cf1d4e8d6 100755 --- a/cg/cg4301.cpp +++ b/cg/cg4301.cpp @@ -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 diff --git a/cg/cg4303.cpp b/cg/cg4303.cpp index 2ccb18a7b..ac7c5cf42 100755 --- a/cg/cg4303.cpp +++ b/cg/cg4303.cpp @@ -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); diff --git a/cg/cg4304.cpp b/cg/cg4304.cpp index 6d8e64e54..bf94ebcc0 100755 --- a/cg/cg4304.cpp +++ b/cg/cg4304.cpp @@ -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;iget_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";