Correzione errore MI6035 sulla liquidazione annuale per ventilazione.

git-svn-id: svn://10.65.10.50/trunk@3198 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
angelo 1996-07-18 07:37:27 +00:00
parent 21d413d762
commit 868998ea6b

View File

@ -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
}
}