From 868998ea6b759c299e03e49adda077cd61f81e9c Mon Sep 17 00:00:00 2001 From: angelo Date: Thu, 18 Jul 1996 07:37:27 +0000 Subject: [PATCH] Correzione errore MI6035 sulla liquidazione annuale per ventilazione. git-svn-id: svn://10.65.10.50/trunk@3198 c028cbd2-c16b-5b4b-a496-9718f37d4682 --- cg/cg4303.cpp | 166 ++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 133 insertions(+), 33 deletions(-) diff --git a/cg/cg4303.cpp b/cg/cg4303.cpp index 5a887b203..600a5b718 100755 --- a/cg/cg4303.cpp +++ b/cg/cg4303.cpp @@ -6,6 +6,17 @@ #include "cg4300.h" +struct Annual_item : public TObject +{ + real imposta; + real imponibile; + TString codiva; + TString other; + virtual TObject* dup() const { return new Annual_item(*this); } + Annual_item() { imposta = 0.0; imponibile = 0.0; codiva = ""; other = ""; } +}; + + void TLiquidazione_app::add_plafond(int month, const char* codatt, int type, real& howmuch, bool intra) { @@ -129,6 +140,9 @@ void TLiquidazione_app::recalc_ventilation(int month, const char* codatt) TString att(codatt); + TArray annual_vent; + Annual_item a_item; + // 1) ricalcola i pim dei mesi dal primo al corrente se necessario recalc rcl = _recalc; _recalc = needed; @@ -196,18 +210,26 @@ void TLiquidazione_app::recalc_ventilation(int month, const char* codatt) totacq += vv._totale; } + const bool is_annual = _month == 13 && month == 13; + for (j = 0; is_annual && j < _vend_arr.items(); j++) + { + _VendItem& vi = (_VendItem&)_vend_arr[j]; + totven += vi._totale; + } + // 3) ricalcola (solo per il mese in corso!) operando sull'array for (int i = 0; i < _vend_arr.items(); i++) { _VendItem* vi = (_VendItem*)&_vend_arr[i]; - if (vi->_month != month) + if (vi->_month != month && !is_annual) continue; // questo serve solo per il prospettino di m. - totven += vi->_totale; + if (!is_annual) + totven += vi->_totale; // 3.2) calcola percentuali di ripartizione e prepara l'affettatrice - TDistrib dst(vi->_totale,ROUND_LIRA); + TDistrib dst(!is_annual ? vi->_totale : totven,ROUND_LIRA); for (j = 0; j < _vent_arr.items(); j++) { _VentItem* vv = (_VentItem*)&_vent_arr[j]; @@ -238,37 +260,115 @@ void TLiquidazione_app::recalc_ventilation(int month, const char* codatt) if ((totven - tlor) == real(1.0)) imposta += real(1.0); - // aggiusto l'IVA vendite nei plm - look_plm(month, codatt); - real ive = _plm->get_real("R0"); - ive += imposta; - _plm->put("R0",ive); - _plm->rewrite(); - // .. e il volume di affari nei pam - real vaf = _pam->get_real("R1"); - vaf += imponibile; - _pam->put("R1", vaf); - _pam->rewrite(); - - // Aggiorno i luridi pim - bool was = look_pim(month, codatt, vi->_codreg, "0", vv->_codiva, vi->_tipodet, TRUE); - - imponibile += _pim->get_real("R0"); - imposta += _pim->get_real("R1"); - _pim->put("R0", imponibile); - _pim->put("R1", imposta); - _pim->put("S4", vv->_other); - // segnale per comodita' in stampa prospetto - _pim->put("B1","X"); - // se e' nuovo, il segnale per usare l'importo nel calcolo del rimborso - // viene amorosamente messo a quanto il codice IVA prevede - if (!was) - { - look_iva(vv->_codiva); - _pim->put("I1", (long)vendita); - if (!_iva->get_bool("B4")) _pim->put("B3", "X"); + if (is_annual) + { + // memorizza i dati della ventilazione annuale in un TArray + a_item.imposta = imposta; + a_item.imponibile = imponibile; + a_item.codiva = vv->_codiva; + a_item.other = vv->_other; + annual_vent.add(a_item); + continue; + } else if (_month != 13) + { + // aggiusto l'IVA vendite nei plm + look_plm(month, codatt); + real ive = _plm->get_real("R0"); + ive += imposta; + _plm->put("R0",ive); + _plm->rewrite(); + // .. e il volume di affari nei pam + real vaf = _pam->get_real("R1"); + vaf += imponibile; + _pam->put("R1", vaf); + _pam->rewrite(); + + // Aggiorno i luridi pim + bool was = look_pim(month, codatt, vi->_codreg, "0", vv->_codiva, vi->_tipodet, TRUE); + + imponibile += _pim->get_real("R0"); + imposta += _pim->get_real("R1"); + _pim->put("R0", imponibile); + _pim->put("R1", imposta); + _pim->put("S4", vv->_other); + // segnale per comodita' in stampa prospetto + _pim->put("B1","X"); + // se e' nuovo, il segnale per usare l'importo nel calcolo del rimborso + // viene amorosamente messo a quanto il codice IVA prevede + if (!was) + { + look_iva(vv->_codiva); + _pim->put("I1", (long)vendita); + if (!_iva->get_bool("B4")) _pim->put("B3", "X"); + } + _pim->rewrite(); } - _pim->rewrite(); + } + if (is_annual) + { + // Cazzeggia e riscrive i PIM/PAM/PLM (veid sopra) ripartendo equamente gli importi annuali + // tra i vari mesi, tipodet e codici IVA. + const int slices = _vend_arr.items(); + const int a_items = annual_vent.items(); + real perc(1.0),imp_fetta, iva_fetta, tot_imp, tot_iva, delta; + perc /= slices; + for (i = 0; i < a_items; i++) + { + Annual_item& item = (Annual_item&) annual_vent[i]; + TDistrib imp_s(item.imponibile,ROUND_LIRA); + TDistrib iva_s(item.imposta,ROUND_LIRA); + tot_imp = 0.0; tot_iva = 0.0; + for (j = 0; j < slices; j++) + { + imp_s.add(perc); iva_s.add(perc); + } + for (j = 0; j < slices; j++) + { + _VendItem * vi = (_VendItem*) &_vend_arr[j]; + imp_fetta = imp_s.get(); + iva_fetta = iva_s.get(); + tot_imp += imp_fetta; tot_iva += iva_fetta; // Serve per eventuali perdite di lirette... + if (j == (slices - 1)) + { + delta = item.imponibile - tot_imp; + if (!delta.is_zero()) imp_fetta += delta; // Aggiusta l'ultima fetta(IVA e IMPONIBILE) + delta = item.imposta - tot_iva; // per eventali perdite di lire nella ripartizione + if (!delta.is_zero()) iva_fetta += delta; + } + // aggiusto l'IVA vendite nei plm + look_plm(vi->_month, codatt); + real ive = _plm->get_real("R0"); + ive += iva_fetta; + _plm->put("R0",ive); + _plm->rewrite(); + // .. e il volume di affari nei pam + real vaf = _pam->get_real("R1"); + vaf += imp_fetta; + _pam->put("R1", vaf); + _pam->rewrite(); + // Aggiorno i luridi pim + bool was = look_pim(vi->_month, codatt, vi->_codreg, "0", item.codiva, vi->_tipodet, TRUE); + + imp_fetta += _pim->get_real("R0"); + iva_fetta += _pim->get_real("R1"); + _pim->put("R0", imp_fetta); + _pim->put("R1", iva_fetta); + _pim->put("S4", item.other); + // segnale per comodita' in stampa prospetto + _pim->put("B1","X"); + // se e' nuovo, il segnale per usare l'importo nel calcolo del rimborso + // viene amorosamente messo a quanto il codice IVA prevede + if (!was) + { + look_iva(item.codiva); + _pim->put("I1", (long)vendita); + if (!_iva->get_bool("B4")) _pim->put("B3", "X"); + } + _pim->rewrite(); + } + } + totven = 0.0; // Questa va azzerato, poiche' quando ancora non era prevista + break; // la ventilazione annuale , registrava totven come 0.0 } }