Skudlerations

git-svn-id: svn://10.65.10.50/trunk@910 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
villa 1995-01-26 13:11:45 +00:00
parent 9fb1deb9da
commit fbe1a7d7f3
6 changed files with 316 additions and 195 deletions

View File

@ -172,7 +172,9 @@ class TLiquidazione_app : public TPrint_application
bool _isbenzinaro; // regime benzinaro bool _isbenzinaro; // regime benzinaro
bool _isannual; // dichiarazione annuale bool _isannual; // dichiarazione annuale
bool _mixed; // attivita' mista bool _mixed; // attivita' mista
bool _isriepilogo; // 13a liq bool _isriepilogo; // 13a liq
bool _isannual_12; // annuale con mese = 12 (trimestre)
bool _isendliq; // annuale o riepilogo
bool _isservizio; // servizi, professionisti, artisti bool _isservizio; // servizi, professionisti, artisti
bool _isrimborso; // vuole il rimborso infraannuale bool _isrimborso; // vuole il rimborso infraannuale
bool _isricacq; // ricalcolo imposte acq. riv (par. ditta) bool _isricacq; // ricalcolo imposte acq. riv (par. ditta)
@ -302,6 +304,7 @@ public:
bool update_firm (int month, bool recalc = TRUE); bool update_firm (int month, bool recalc = TRUE);
bool update_att (int month, const char* codatt, bool recalc = TRUE); bool update_att (int month, const char* codatt, bool recalc = TRUE);
void zero_att (int month, const char* codatt); void zero_att (int month, const char* codatt);
void zero_annual (int month);
void recalc_att (int month, const char* codatt); void recalc_att (int month, const char* codatt);
void recalc_annual (const char* codatt); void recalc_annual (const char* codatt);
_DescrItem* recalc_rimborso(int month, const char* codatts); _DescrItem* recalc_rimborso(int month, const char* codatts);
@ -400,7 +403,8 @@ public:
static bool is_trim (int x); static bool is_trim (int x);
// is_month_ok controlla che il mese passato sia // is_month_ok controlla che il mese passato sia
// da prendere in considerazione per la liquidazione // da prendere in considerazione per la liquidazione
// controllando il regime trimestrale o mensile // controllando il regime trimestrale o mensile e
// il ricalcolo annuale
bool is_month_ok(int x, int mtocalc); bool is_month_ok(int x, int mtocalc);
// is_month_ok_strict controlla che il mese sia OK per la // is_month_ok_strict controlla che il mese sia OK per la
// liquidazione, ma ritorna TRUE per le trimestrali solo // liquidazione, ma ritorna TRUE per le trimestrali solo
@ -408,8 +412,9 @@ public:
bool is_month_ok_strict(int x, int month = -1); bool is_month_ok_strict(int x, int month = -1);
bool is_date_ok (TDate& d, int month); bool is_date_ok (TDate& d, int month);
bool is_first_month (int m); bool is_first_month (int m);
int liq_month(int x);
int previous_month (int m); int previous_month (int m);
bool check_month(int m, int mref);
// Funzioni accessorie: estrazione deleghe // Funzioni accessorie: estrazione deleghe
bool set_deleghe(); bool set_deleghe();

View File

@ -38,26 +38,62 @@ bool TLiquidazione_app::recalc_all()
if (_selected[(long)l]) if (_selected[(long)l])
{ {
TToken_string& nomeditta = _ditte->row(l); TToken_string& nomeditta = _ditte->row(l);
int save_month = _month;
/* -------------------------------------------------------------
* leggi parametri ditta necessari; stabilisci se annuale,
* se si' metti _month a 13
* istanzia _freqviva, _isbenzinaro, _isannual, _isriepilogo
* --------------------------------------------------------------
*/
_nditte->zero(); _nditte->zero();
_nditte->curr().put("CODDITTA",nomeditta.get_long(1)); _nditte->curr().put("CODDITTA",nomeditta.get_long(1));
_nditte->read(); _nditte->read();
_freqviva = nomeditta.get(3);
bool mens = _freqviva == "M";
// determina attivita' prevalente e istanzia cazzuole
// per vedere che Kazzo di liquidazione calcolare
TString attprev = _nditte->curr().get("CODATTPREV");
TLocalisamfile& atts = _nditte->lfile(LF_ATTIV);
atts.zero();
atts.put("CODDITTA",nomeditta.get_long(1));
atts.put("CODATT", attprev);
if (atts.read() != NOERR) atts.zero();
// istanzia benzinaro
_isbenzinaro = atts.get_bool("ART74/4");
// riaggiusta relazione
_nditte->read();
// decidi per stocazzo di annuale
// per QUALSIASI annuale il mese diventa 13
_isannual = (_month == 12 && !mens && !_isbenzinaro) ||
(_month == 13 && (mens || _isbenzinaro));
_isriepilogo = _month == 13 && !mens;
if (_isannual) _month = 13; // che ti piaccia o no
TApplication::set_firm(nomeditta.get_long(1)); TApplication::set_firm(nomeditta.get_long(1));
_prind->addstatus(1); _prind->addstatus(1);
_freqviva = nomeditta.get(3);
/* /*
* trimestrali impropriamente selezionate per mesi intermedi * trimestrali impropriamente selezionate per mesi intermedi
* provocano il ricalcolo dei progressivi mensili ma non la stampa * provocano il ricalcolo dei progressivi mensili ma non la stampa
*/ */
_canprint = is_month_ok_strict(_month); _canprint = is_month_ok_strict(_month) || _month == 13;
/* --------------------------------------------------------------
* Ricalcola i mesi necessari, tutti se annuale
* --------------------------------------------------------------
*/
int need_refresh = FALSE; int need_refresh = FALSE;
if (_recalc != ever) if (_recalc != ever)
{ {
for (int m = 1; m < _month; m++) for (int m = 1; m < _month; m++)
if (!look_lim(m) || !_lim->get_bool("B0")) if (is_month_ok_strict(m) && (!look_lim(m) || !_lim->get_bool("B0")))
{ {
need_refresh = TRUE; need_refresh = TRUE;
break; break;
@ -69,11 +105,10 @@ bool TLiquidazione_app::recalc_all()
_recalc = ever; _recalc = ever;
} }
for (int m = 1; m <= _month; m++) for (int m = 1; m <= _month; m++) // fino a 13 compreso
if (is_month_ok(m, _month) || _recalc == ever) if (is_month_ok(m, _month) || _recalc == ever)
{ {
if (_prind->iscancelled()) if (_prind->iscancelled()) break;
break;
update_firm(m); update_firm(m);
} }
@ -81,11 +116,13 @@ bool TLiquidazione_app::recalc_all()
// flag 'calcolato' del primo, per causare il ricalcolo dei // flag 'calcolato' del primo, per causare il ricalcolo dei
// successivi (evitando problemi per credito precedente) // successivi (evitando problemi per credito precedente)
for (m = _month+1; m <= 13; m++) for (m = _month+1; m <= 13; m++)
if (is_month_ok_strict(m) && look_lim(m)) if ((is_month_ok_strict(m) || m == 13) && look_lim(m))
{ {
_lim->put("B0",""); _lim->put("B0","");
break; break;
} }
_month = save_month;
} }
} }
bool canc = _prind->iscancelled(); bool canc = _prind->iscancelled();
@ -105,7 +142,7 @@ bool TLiquidazione_app::update_firm(int month, bool recalc)
// Ritorna FALSE soltanto se il ricalcolo era necessario e non e' // Ritorna FALSE soltanto se il ricalcolo era necessario e non e'
// stato effettuato per scelta dello stronzo commercialista. // stato effettuato per scelta dello stronzo commercialista.
look_lim(month, TRUE); look_lim(liq_month(month), TRUE);
if (_isregis && _lim->get_bool("B1")) if (_isregis && _lim->get_bool("B1"))
return TRUE; return TRUE;
@ -115,7 +152,8 @@ bool TLiquidazione_app::update_firm(int month, bool recalc)
TConfig cnf1(CONFIG_STUDIO, "cg"); TConfig cnf1(CONFIG_STUDIO, "cg");
_isricacq = cnf1.get_bool("RicAcq"); _isricacq = cnf1.get_bool("RicAcq");
// ricalcolo normale // ricalcolo normale
// TBI lim c'e' solo per i trimestri
bool ok = _lim->get_bool("B0"); bool ok = _lim->get_bool("B0");
if (ok && !recalc) return TRUE; if (ok && !recalc) return TRUE;
bool calc = (_recalc == ever || (_recalc == one && month == _month)); bool calc = (_recalc == ever || (_recalc == one && month == _month));
@ -153,10 +191,10 @@ bool TLiquidazione_app::update_firm(int month, bool recalc)
for (int tipoatt = 1; tipoatt <= (_mixed ? 2 : 1); tipoatt++) for (int tipoatt = 1; tipoatt <= (_mixed ? 2 : 1); tipoatt++)
{ {
TString cattiv(codatt); TString cattiv(codatt); bool waspla;
cattiv << tipoatt; cattiv << tipoatt;
if (tipoatt == 1 && look_pla(cattiv, FALSE)) if (tipoatt == 1 && (waspla = look_pla(cattiv, FALSE)))
{ {
_p8 = _pla->get_real("R5"); _p8 = _pla->get_real("R5");
_p8b = _pla->get_real("R6"); _p8b = _pla->get_real("R6");
@ -165,27 +203,36 @@ bool TLiquidazione_app::update_firm(int month, bool recalc)
_isplafond = !(_p8.is_zero() && _p8b.is_zero() && _isplafond = !(_p8.is_zero() && _p8b.is_zero() &&
_p9.is_zero()); _p9.is_zero());
_isservizio = _pla->get("S7") == "S"; _isservizio = _pla->get("S7") == "S";
_mixed = _pla->get("S7") == "M" || _pla->get("S7") == "E"; _mixed = _pla->get("S7") == "M" || _pla->get("S7") == "E";
} }
else else
_isservizio = _nditte->curr(LF_ATTIV).get("TIPOATT") == "S"; _isservizio = _nditte->curr(LF_ATTIV).get("TIPOATT") == "S";
_isviaggio = _nditte->curr(LF_ATTIV).get_bool("REG74TER"); _isviaggio = _nditte->curr(LF_ATTIV).get_bool("REG74TER");
_isagricolo = _nditte->curr(LF_ATTIV).get_bool("REGAGR"); _isagricolo = _nditte->curr(LF_ATTIV).get_bool("REGAGR");
_isbenzinaro = _nditte->curr(LF_ATTIV).get_bool("ART74/4");
bool mens = _freqviva == "M";
_isannual = (_month == 12 && !mens && !_isbenzinaro) ||
(_month == 13 && (mens || _isbenzinaro));
_isriepilogo = _month == 13;
_isvent = FALSE; _isvent = FALSE;
if (tipoatt == 1 && waspla && month == 13)
{
// azzera pla dove serve
_pla->put("R0","");
_pla->put("R1","");
_pla->put("R2","");
_pla->put("R3","");
_pla->put("R4","");
_pla->put("S1","0|0");
_pla->put("S2","0");
_pla->put("S3","0");
_pla->rewrite();
}
for (_reg->first(); !_isvent && _reg->good(); _reg->next()) for (_reg->first(); !_isvent && _reg->good(); _reg->next())
{ {
if (codatt == _reg->get("S8") && _reg->get_int("I0") == 2) if (codatt == _reg->get("S8") && _reg->get_int("I0") == 2)
_isvent = _reg->get_bool("B3"); _isvent = _reg->get_bool("B3");
} }
if ((month != 13 || _isannual) && (calc || !recalc)) if (calc || !recalc)
if (!update_att(month, cattiv)) if (!update_att(month, cattiv))
describe_error("Attivita' non ricalcolate: possibili errori", describe_error("Attivita' non ricalcolate: possibili errori",
codatt); codatt);
@ -221,7 +268,8 @@ bool TLiquidazione_app::update_firm(int month, bool recalc)
// aggiorna le liquidazioni // aggiorna le liquidazioni
if (calc || !recalc) if (calc || !recalc)
write_liq(month, atts); if (is_month_ok_strict(month) || month == 13)
write_liq(month, atts);
// rimborso infraannuale // rimborso infraannuale
_DescrItem* rimb_d = NULL; _DescrItem* rimb_d = NULL;
@ -260,11 +308,16 @@ bool TLiquidazione_app::update_att(int month, const char* codatt,
{ {
zero_att(month,codatt); zero_att(month,codatt);
recalc_att(month,codatt); recalc_att(month,codatt);
recalc_ventilation(month, codatt);
recalc_corrispettivi(month, codatt);
if (month == 13) if (month == 13)
recalc_annual(codatt); recalc_annual(codatt);
else
{
// nei PIM della 13a vanno solo alcune stranezze,
// mi rifiuto di pensare che vadano ventilate
// o corrispettivizzicizzate
recalc_ventilation(month, codatt);
recalc_corrispettivi(month, codatt);
}
} }
return ok || calc; return ok || calc;
} }
@ -344,7 +397,7 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt)
for (; _cur->pos() < items; ++(*_cur)) for (; _cur->pos() < items; ++(*_cur))
{ {
TDate date(_mov_r->get("DATAREG")); TDate date(_mov_r->get("DATAREG"));
TString16 reg = _mov_r->get("REG"); TString16 reg = _mov_r->get("REG");
bool isreg = look_reg(_mov_r->get("REG")); bool isreg = look_reg(_mov_r->get("REG"));
TString16 tipodoc = _mov_r->get("TIPODOC"); TString16 tipodoc = _mov_r->get("TIPODOC");
/* /*
@ -394,6 +447,7 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt)
TString codiva = _iva->get("CODTAB"); TString codiva = _iva->get("CODTAB");
TString tipoiva = _iva->get("S1"); TString tipoiva = _iva->get("S1");
TString riga11_v = _iva->get("S0");
int tipoes_v = (int)_iva->get_long("I3"); int tipoes_v = (int)_iva->get_long("I3");
int tipoes_a = (int)_iva->get_long("I4"); int tipoes_a = (int)_iva->get_long("I4");
int tipoagr = atoi(_iva->get("S4")); int tipoagr = atoi(_iva->get("S4"));
@ -410,7 +464,13 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt)
int rigaimp = _rmoviva->get_int("RIGAIMP"); int rigaimp = _rmoviva->get_int("RIGAIMP");
// autofatture art. 17 per non residenti, con trattamento // autofatture art. 17 per non residenti, con trattamento
// speciale in liquidazione annuale // speciale in liquidazione annuale
bool autodafe = (tipodoc == "AF" && tipocr == 4); bool autodafe = (tipodoc == "AF" && tipocr == 4);
// validi per calcolo volume di affari settano
// flag che va in B2 di pim
bool isvolaff = (tipomov == vendita && tipocr != 4 &&
tipoiva != "NS" && tipoiva != "ES" &&
!(tipoiva == "ES" &&
(riga11_v == "B3" || riga11_v.empty())));
/* /*
* puo' capitare per motivi brutalmente prassici * puo' capitare per motivi brutalmente prassici
@ -427,17 +487,22 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt)
if(rigaimp > 9) continue; if(rigaimp > 9) continue;
/* /*
* In liq. annuale si totalizzano nelle vendite * In liq. annuale si totalizzano
* solo le stranezze che seguono * solo le stranezze che seguono
*/ */
if (month == 13 && tipomov == vendita && if (month == 13)
(!rcs.get_bool("AUTOFATT") && tipoiva != "NS")) {
{ // si contano soltanto le vendite.
if (tipodoc == "AF" || bool okc = tipomov == vendita;
(!rcs.get_bool("INTRACOM") && !rcs.get_bool("VALINTRA"))) // purche' ...
continue; bool cond1 = (rcs.get_bool("AUTOFATT") && tipoiva == "NS" && tipodoc == "AF");
} // oppure ...
bool cond2 = (rcs.get_bool("AUTOFATT") && tipoiva == "NS" && tipodoc != "AF" &&
rcs.get_bool("INTRACOM") && rcs.get_bool("VALINTRA"));
if (!(okc && (cond1 || cond2)))
continue;
}
// ***************************************** // *****************************************
// casi particolari // casi particolari
// ***************************************** // *****************************************
@ -679,19 +744,19 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt)
*/ */
if (tipodoc == "CR" || tipodoc == "RF" || tipodoc == "SC") if (tipodoc == "CR" || tipodoc == "RF" || tipodoc == "SC")
{ {
_pim_r->put("I0",LORDO);
// questi sono corrispettivi davvero; comportamento normale // questi sono corrispettivi davvero; comportamento normale
if (tipoiva == "VE") // da ventilare if (tipoiva == "VE") // da ventilare
{ {
lor += imponibile; lor += imponibile;
_pim_r->put("I0",LORDO);
add_vendite(month, reg, tipodet, imponibile); add_vendite(month, reg, tipodet, imponibile);
} }
else // non da ventilare, con imposta gia' conteggiata else // non da ventilare, con imposta gia' conteggiata
{ {
real perc = _iva->get_real("R0") / CENTO; real perc = _iva->get_real("R0")/CENTO;
lor += imponibile + imposta; lor += imponibile + imposta;
_pim_r->put("I0",LORDO); if (liq)
if (liq) add_corrisp(month, reg, imponibile, perc, tipodet, codiva); add_corrisp(month, reg, imponibile, perc, tipodet, codiva);
} }
} }
else if (tipodoc == "FS") else if (tipodoc == "FS")
@ -756,6 +821,7 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt)
adi += imposta; adi += imposta;
} }
_pim_r->put("B2",isvolaff);
_pim_r->put("R0",imp); _pim_r->put("R0",imp);
_pim_r->put("R1",ivp); _pim_r->put("R1",ivp);
_pim_r->put("R2",lor); _pim_r->put("R2",lor);
@ -907,7 +973,14 @@ void TLiquidazione_app::write_liq(int month, const char* codatts)
real a_meCEE = 0.0; real a_meCEE = 0.0;
real cred_cost = 0.0; real cred_cost = 0.0;
real deb_mens = 0.0; real deb_mens = 0.0;
real perc_r = 0.0; real perc_r = 0.0;
// totali per annuali
real vol_aff_1 = 0.0;
real vol_aff_2 = 0.0;
real vol_aff_t = 0.0;
real vol_aff_l = 0.0;
real tot_cong = 0.0;
bool differita = FALSE; bool differita = FALSE;
int attc = 0; // counter attivita' int attc = 0; // counter attivita'
@ -953,7 +1026,7 @@ void TLiquidazione_app::write_liq(int month, const char* codatts)
} }
else else
{ {
for (int m = 1; m <= 12; m++) for (int m = 1; m <= 13; m++)
{ {
// ciclo su tutti i mesi del caso (1 o 3; // ciclo su tutti i mesi del caso (1 o 3;
// tutti se annuale) // tutti se annuale)
@ -1012,8 +1085,8 @@ void TLiquidazione_app::write_liq(int month, const char* codatts)
// benzinaro le conta solo in annuale, // benzinaro le conta solo in annuale,
// non benzinaro solo in periodica // non benzinaro solo in periodica
// TBC vedi se distinguere rett. benzinai / autotrasport, // TBC vedi se distinguere rett. benzinai / autotrasport,
if ((_isbenzinaro && month == 13) || if ((_isbenzinaro && _isannual) ||
(!_isbenzinaro && month < 13)) (!_isbenzinaro && !_isannual))
{ {
risultato += _lim->get_real("R5"); risultato += _lim->get_real("R5");
rettifiche += _lim->get_real("R5"); rettifiche += _lim->get_real("R5");
@ -1036,10 +1109,10 @@ void TLiquidazione_app::write_liq(int month, const char* codatts)
a_mCEE += _plm->get_real("R10"); a_mCEE += _plm->get_real("R10");
a_meCEE += _plm->get_real("R11"); a_meCEE += _plm->get_real("R11");
} }
// counter attivita' per evitare troppi versamenti } // fine ciclo sul mese
attc++; // counter attivita' per evitare troppi versamenti
} // fine ciclo sul mese attc++;
} } // fine ciclo su attivita'
if (!(_isdifferita && is_first_month(month))) if (!(_isdifferita && is_first_month(month)))
{ {
@ -1091,6 +1164,77 @@ void TLiquidazione_app::write_liq(int month, const char* codatts)
res_cred += cred_prec; res_cred += cred_prec;
} }
} }
if (month == 13)
{
// totalizza volumi affari e calcola nuovo prorata
// per tutte le attivita'
atts.restart();
while ((tmpatt = atts.get()) != NULL)
{
TString att(tmpatt);
int tipoatt = att[att.len() -1] - '0';
if (tipoatt == 1) // su PLA l'attivita' e' sempre 1
{
look_pla(att);
TToken_string tt(_pla->get("S1"));
real vf1(tt.get(0));
real vf2(tt.get(1));
real iaq(_pla->get("S2")); // IVA acquisti
real ppg(_pla->get("S3")); // pro-rata pagato
vol_aff_1 += vf1;
vol_aff_2 += vf2;
vol_aff_t = vf1 + vf2;
vol_aff_l += _pla->get_real("R0"); // volume affari lordo
real es_b1 = _pla->get_real("R1");
real es_b2 = _pla->get_real("R2");
real es_b3 = _pla->get_real("R3");
real csamm = _pla->get_real("R4");
// calcola nuovo prorata per ogni attivita' (miste: 1+2)
real ris = vol_aff_t + csamm + es_b3;
real prorata(0.0);
if (!ris.is_zero())
prorata = (es_b1/ris) * CENTO;
real conguaglio = 0.0;
prorata.round(-2);
if (prorata != _prorata)
{
// calcolo conguaglio -- se positivo e' a debito
real topay = iaq * (prorata / CENTO);
conguaglio = topay - ppg;
conguaglio.round(ROUND_LIRA);
}
_pla->put("R9", conguaglio);
_pla->put("R10",prorata);
tot_cong += conguaglio;
_pla->rewrite();
// scrivi nuovo prorata in tabella anno successivo
TString yr = _year;
_year = format("%d", atoi(_year) + 1);
look_pla(att, TRUE);
_pla->put("R8", prorata);
_pla->rewrite();
_year = yr;
}
}
look_lia();
_lia->put("R1", vol_aff_l);
_lia->put("R2", vol_aff_1);
_lia->put("R3", vol_aff_2);
_lia->put("R4", acc_dec);
_lia->put("R5", cred_cost);
_lia->rewrite();
}
// comprende anche il conguaglio prorata
risultato += tot_cong;
if (tot_cong.sign() > 0) res_debt += tot_cong;
if (tot_cong.sign() < 0) res_cred += tot_cong;
look_lim(month,TRUE); look_lim(month,TRUE);
// azzeriamo tutto // azzeriamo tutto
@ -1110,10 +1254,13 @@ void TLiquidazione_app::write_liq(int month, const char* codatts)
(month >= 12 && _freqviva == "M")) (month >= 12 && _freqviva == "M"))
{ {
risultato -= versamenti_IVA(12,"7"); risultato -= versamenti_IVA(12,"7");
acc_dec = versamenti_IVA(12,"7"); acc_dec = versamenti_IVA(12,"7");
res_cred += acc_dec;
} }
risultato.round(month == 13 ? ROUND_MILLELIRE : ROUND_LIRA); // in annuale si arrotondera' a 1000 in stampa
// se no il conguaglio prorata fa casino
risultato.round(ROUND_LIRA);
_lim->put("R0",risultato); _lim->put("R0",risultato);
_lim->put("R2",cred_cost); _lim->put("R2",cred_cost);
@ -1135,7 +1282,7 @@ void TLiquidazione_app::write_liq(int month, const char* codatts)
* non benzinari * non benzinari
*/ */
if (_freqviva == "T" && risultato.sign() > 0 && if (_freqviva == "T" && risultato.sign() > 0 &&
month < 12 && !_isbenzinaro) month < 13 && !_isbenzinaro)
{ {
real interesse = interesse_trimestrale(_month); real interesse = interesse_trimestrale(_month);
real ivi = risultato * (interesse / CENTO); real ivi = risultato * (interesse / CENTO);
@ -1148,7 +1295,7 @@ void TLiquidazione_app::write_liq(int month, const char* codatts)
_lim->put("R9", vers_int); _lim->put("R9", vers_int);
// scrivi: totali IVA vendite e acquisti, credito prec, // scrivi: totali IVA vendite e acquisti, credito prec,
// debito prec, acconto // debito prec, acconto, totale conguaglio prorata
// cosi' si fa una volta sola in stampa // cosi' si fa una volta sola in stampa
tt = iva_vend.string(); tt.add(iva_acq.string()); tt = iva_vend.string(); tt.add(iva_acq.string());
@ -1158,109 +1305,94 @@ void TLiquidazione_app::write_liq(int month, const char* codatts)
tt = cred_prec.string(); tt.add(debt_precd.string()); tt = cred_prec.string(); tt.add(debt_precd.string());
_lim->put("S2", tt); _lim->put("S2", tt);
tt = acc_dec.string(); tt = acc_dec.string();
_lim->put("S3", tt); _lim->put("S3", tt);
// totale conguaglio su tutte le attivita'
_lim->put("S4", tot_cong.string());
_lim->put("B0","X"); _lim->put("B0","X");
if (_isfinal) if (_isfinal)
_lim->put("B1", "X"); _lim->put("B1", "X");
_lim->rewrite(); _lim->rewrite();
} }
void TLiquidazione_app::recalc_annual(const char* att) void TLiquidazione_app::recalc_annual(const char* att)
{ {
// calcolo volume d'affari e altro // viene chiamata 2 volte per le att. miste; PLA e' stata
// TBI/C: volume d'affari separato per // azzerata dove serve da update_firm se siamo all'annuale
// le eventuali 2 attivita'
real es_b1 = 0.0; real es_b1 = 0.0;
real es_b2 = 0.0; real es_b2 = 0.0;
real es_b3 = 0.0; real es_b3 = 0.0;
real cess_amm = 0.0; real cess_amm = 0.0;
real vendite = 0.0; real vendite = 0.0;
real pro_pag = 0.0; real pro_pag = 0.0;
real acq_iva = 0.0; // per conguaglio prorata real iva_acq = 0.0;
real acq = 0.0; real ven_lrd = 0.0;
real ivlac = 0.0; real volaff1 = 0.0;
real ivven = 0.0; real volaff2 = 0.0;
real ven_lrd = 0.0;
int tipoatt = att[strlen(att) -1] - '0'; int tipoatt = att[strlen(att) -1] - '0';
TString aaa(att); TString aaa(att);
if (tipoatt == 2) look_pla(aaa);
{ TToken_string tt(_pla->get("S1"));
// istanzia ai valori precedenti, calcolati per l'attivita' 1 volaff1 = tt.get(0);
// look_pla forza a 1 il tipo attivita' (un solo pla per anno) volaff1 = tt.get(1);
if (look_pla(aaa)) vendite = _pla->get_real("R0");
{ es_b1 = _pla->get_real("R1");
vendite = _pla->get_real("R0"); es_b2 = _pla->get_real("R2");
es_b1 = _pla->get_real("R1"); es_b3 = _pla->get_real("R3");
es_b2 = _pla->get_real("R2"); cess_amm = _pla->get_real("R4");
es_b3 = _pla->get_real("R3"); pro_pag = (const char*)_pla->get("S3");
cess_amm = _pla->get_real("R4"); iva_acq = (const char*)_pla->get("S2");
ivven = _pla->get_real("R11");
ivlac = _pla->get_real("R12");
ven_lrd = _pla->get_real("R13");
acq = _pla->get_real("R14");
}
}
for (int i = 1; i <= 12; i++) // 1) Calcola volume di affari dai PIM, controllando il
// flag B2 settato da update_att per i progressivi che
// entrano nel calcolo
for (_pim->first(); !_pim->eof(); _pim->next())
{ {
// ricalcola se necessario if (_year != (const char*)_pim_anno || aaa != (const char*)_pim_codatt)
if (i != 12 && !update_att(i,aaa,FALSE)) continue;
describe_error("Attivita' non ricalcolata: " if (_pim->get_bool("B2"))
"possibili errori",att); {
look_ptm(i,aaa); look_plm(i,aaa); if (tipoatt == 1) volaff1 += _pim->get_real("R0");
else volaff2 += _pim->get_real("R0");
}
}
// 2) calcola esenti, cessioni, lordo vendite, prorata pagato
// e IVA acquisti dai plm/ptm
for (int i = 1; i <= 13; i++)
{
if (!look_ptm(i,aaa) || !look_plm(i,aaa))
continue;
// vendite lorde; sa la madonna a cosa servono
real vend(_ptm->get("S3")); real vend(_ptm->get("S3"));
ven_lrd += vend; // lordo vendite ven_lrd += vend;
iva_acq += _plm->get_real("R1");
// non entra l'IVA per calcolo volume affari
vendite += (vend - _plm->get_real("R0"));
real eb3(_ptm->get("S0")); real eb3(_ptm->get("S0"));
es_b1 += _ptm->get_real("R13"); es_b1 += _ptm->get_real("R13");
es_b2 += _ptm->get_real("R14"); es_b2 += _ptm->get_real("R14");
es_b3 += eb3; es_b3 += eb3;
acq_iva += _plm->get_real("R1");
cess_amm += _ptm->get_real("R10"); cess_amm += _ptm->get_real("R10");
pro_pag += _plm->get_real("R2"); pro_pag += _plm->get_real("R2");
real aax(_ptm->get("S2"));
acq += aax - // rilevanti per aliquota media
_ptm->get_real("R3") - // toglie ammortizz. etc
_ptm->get_real("R5") - // non detraibili non ci sono
_ptm->get_real("R8");
ivlac += _plm->get_real("R1") - // idem per IVE
_ptm->get_real("R4") -
_ptm->get_real("R9") -
_ptm->get_real("R12");
ivven += _plm->get_real("R0");
}
// calcolo prorata
real prorata = (es_b1/(vendite - cess_amm - es_b3)) * CENTO;
real conguaglio = 0.0;
prorata.round(ROUND_LIRA);
if (prorata != _prorata)
{
// calcolo conguaglio -- se positivo e' a debito
real topay = acq_iva * (prorata / CENTO);
conguaglio = topay - pro_pag;
} }
look_pla(aaa); tt = volaff1.string(); tt.add(volaff2.string());
_pla->put("R0", vendite);
_pla->put("R1", es_b1); _pla->put("R0", ven_lrd);
_pla->put("R2", es_b2); _pla->put("R1", es_b1);
_pla->put("R3", es_b3); _pla->put("R2", es_b2);
_pla->put("R4", cess_amm); _pla->put("R3", es_b3);
_pla->put("R9", prorata); _pla->put("R4", cess_amm);
_pla->put("R10", conguaglio); _pla->put("S1", tt);
_pla->put("R11", ivven); _pla->put("S2", iva_acq.string());
_pla->put("R12", ivlac); _pla->put("S3", pro_pag.string());
_pla->put("R13", ven_lrd);
_pla->put("R14", acq);
_pla->rewrite(); _pla->rewrite();
} }

View File

@ -10,7 +10,7 @@
#include "cg4300.h" #include "cg4300.h"
bool TLiquidazione_app::is_trim(int x) bool TLiquidazione_app::is_trim(int x)
// TRUE se il mese passato e' un trimestre // TRUE se il mese passato e' un trimestre
{ return x == 3 || x == 6 || x == 9 || x == 12; } { return x == 3 || x == 6 || x == 9 || x == 12; }
bool TLiquidazione_app::is_month_ok_strict(int x, int month) bool TLiquidazione_app::is_month_ok_strict(int x, int month)
@ -24,15 +24,15 @@ bool TLiquidazione_app::is_month_ok_strict(int x, int month)
} }
bool TLiquidazione_app::is_month_ok(int x, int mtocalc) bool TLiquidazione_app::is_month_ok(int x, int mtocalc)
// TRUE se il mese passato e' compatibile con il mese da calcolare // TRUE se il mese passato e' compatibile con il mese da calcolare
// rispetto al regime di liquidazione scelto // rispetto al regime di liquidazione scelto
{ {
bool ret = x == mtocalc; bool ret = x == mtocalc;
if (!ret && _freqviva == "T" && mtocalc != 13) if (!ret && _freqviva == "T" && mtocalc != 13)
{ {
// aggiusta al trimestre il mese da calcolare // aggiusta al trimestre il mese da calcolare
mtocalc += 2 - ((mtocalc-1) % 3); mtocalc += 2 - ((mtocalc-1) % 3);
ret = x >= (mtocalc - 3) && x <= mtocalc; ret = x > (mtocalc - 3) && x <= mtocalc;
} }
else if (!ret && mtocalc == 13) else if (!ret && mtocalc == 13)
{ {
@ -42,6 +42,14 @@ bool TLiquidazione_app::is_month_ok(int x, int mtocalc)
return ret; return ret;
} }
int TLiquidazione_app::liq_month(int x)
// ritorna il mese da liquidare (= LIM presente)
// che corrisponde al mese passato
{
if (x == 13 || _freqviva == "M")
return x;
else return x + (2 - ((x-1) % 3));
}
bool TLiquidazione_app::is_first_month(int m) bool TLiquidazione_app::is_first_month(int m)
{ {
@ -51,32 +59,22 @@ bool TLiquidazione_app::is_first_month(int m)
int TLiquidazione_app::previous_month(int m) int TLiquidazione_app::previous_month(int m)
{ {
if (m == 13) m = 12; // vale per LIM (mese o trimestre precedente)
if (_freqviva == "M") if (_freqviva == "M")
return m == 1 ? 1 : m - 1; return m == 1 ? 1 : m - 1;
else return m == 3 ? 3 : m - 3; else return m == 3 ? 3 : m - 3;
} }
bool TLiquidazione_app::check_month(int m, int m2)
// se si sta ricalcolando una liquidazione
// annuale di check, ritorna TRUE per tutti i
// mesi, altrimenti solo per quello in corso
// di calcolo
{
return (_isannual || _isriepilogo) ? m < 13 : m == m2;
}
bool TLiquidazione_app::is_date_ok(TDate& d, int month) bool TLiquidazione_app::is_date_ok(TDate& d, int month)
// TRUE se la data (di mov o pim) passata va considerata nel // TRUE se la data (di mov o pim) passata va considerata nel
// ricalcolo dei progressivi mensili per il mese e anno // ricalcolo dei progressivi mensili per il mese e anno
// selezionati; se month == 13 vanno bene tutte purche' // selezionati; se month == 13 vanno bene tutte purche'
// sia giusto l'anno // sia giusto l'anno
{ {
if (month == 13) if (d.month() > month || d.year() != atoi(_year))
return month < 13 && d.year() == atoi(_year);
else if (d.month() > month || d.year() != atoi(_year))
return FALSE; return FALSE;
else return d.month() == month; if (month == 13) return d.month() <= month;
else return d.month() == month;
} }
@ -366,13 +364,13 @@ bool TLiquidazione_app::look_lia(bool create, int year)
real TLiquidazione_app::result_liq(int month) real TLiquidazione_app::result_liq(int month)
// risultato esatto della liquidazione del mese month, <0 a credito // risultato esatto della liquidazione del mese month, <0 a credito
// > 0 a debito; non comprende il conguaglio prorata (annuale) // > 0 a debito; comprende TUTTI, anche il conguaglio prorata in annuale
{ {
real r(0.0); real r(0.0);
// ulteriori detrazioni, acconti, versamenti, // ulteriori detrazioni, acconti, versamenti,
// rettifiche sono gia' comprese in R0 // rettifiche sono gia' comprese in R0
if (look_lim(month)) if (look_lim(month))
r = _lim->get_real("R0"); r = _lim->get_real("R0");
return r; return r;
} }
@ -400,6 +398,7 @@ real TLiquidazione_app::credito_prec(int month)
if (is_first_month(month)) if (is_first_month(month))
{ {
// credito inizio anno
if (look_lia()) if (look_lia())
c = _lia->get_real("R0"); c = _lia->get_real("R0");
// e' positivo o 0 // e' positivo o 0

View File

@ -104,9 +104,6 @@ void TLiquidazione_app::recalc_corrispettivi(int month, const char* codatt)
imposta += _pim->get_real("R1"); imposta += _pim->get_real("R1");
_pim->put("R0", imponibile); _pim->put("R0", imponibile);
_pim->put("R1", imposta); _pim->put("R1", imposta);
// segnale per comodita'
_pim->put("B1","X");
_pim->rewrite(); _pim->rewrite();
} }
} }
@ -155,8 +152,7 @@ void TLiquidazione_app::recalc_ventilation(int month, const char* codatt)
continue; continue;
TString att(codatt); TString att(codatt);
if (tipocr == 1 && mese == m && if (tipocr == 1 && mese == m && att == (const char*)(*_pim_codatt))
att == (const char*)(*_pim_codatt))
{ {
look_iva(*_pim_codiva); look_iva(*_pim_codiva);
@ -243,4 +239,4 @@ void TLiquidazione_app::recalc_ventilation(int month, const char* codatt)
_ptm->put("S4",totacq.string()); _ptm->put("S4",totacq.string());
_ptm->put("S5",totven.string()); _ptm->put("S5",totven.string());
_ptm->rewrite(); _ptm->rewrite();
} }

View File

@ -82,7 +82,7 @@ void TLiquidazione_app::describe_att(int month, const char* codatt, bool isresul
describe_agricolo(month, codatt); describe_agricolo(month, codatt);
if (atts.items() == 1 && _isviaggio) if (atts.items() == 1 && _isviaggio)
describe_viaggio(month, codatt); describe_viaggio(month, codatt);
if (isresult || _isannual) if (isresult || month == 13)
describe_pims(month,codatt); describe_pims(month,codatt);
if (atts.items() == 1) if (atts.items() == 1)
describe_consistence(codatt); describe_consistence(codatt);
@ -161,8 +161,6 @@ void TLiquidazione_app::describe_ventilation(int month, const char* codatt)
{ {
if (!_isvent) return; if (!_isvent) return;
if (_isriepilogo || _isannual) month = 12;
_DescrItem* d = new _DescrItem(VENTILA); _DescrItem* d = new _DescrItem(VENTILA);
TString att(codatt); TString att(codatt);
@ -352,8 +350,8 @@ void TLiquidazione_app::describe_pims(int month, const char* codatt)
_pim->get_real("R2").is_zero()) _pim->get_real("R2").is_zero())
continue; continue;
if (strcmp((const char*)*_pim_codatt, att) == 0 && if (strcmp((const char*)*_pim_codatt, att) == 0 &&
(is_month_ok(atoi(*_pim_mese),month) || _isannual) && (is_month_ok(atoi(*_pim_mese),month)) &&
_year == (const char*)*_pim_anno) _year == (const char*)*_pim_anno)
{ {
// vedi se c'e' gia' un item corrispondente // vedi se c'e' gia' un item corrispondente
@ -423,7 +421,7 @@ void TLiquidazione_app::describe_pims(int month, const char* codatt)
// si scorporano solo per l'annuale, altrimenti // si scorporano solo per l'annuale, altrimenti
// vengono normalmente considerati nelle vendite // vengono normalmente considerati nelle vendite
if (_isannual) if (month == 13)
{ {
adf = _pim->get_real("R7"); adf = _pim->get_real("R7");
adi = _pim->get_real("R8"); adi = _pim->get_real("R8");
@ -475,7 +473,7 @@ void TLiquidazione_app::describe_pims(int month, const char* codatt)
for (int m = 1; m <= month && m < 13; m++) for (int m = 1; m <= month && m < 13; m++)
{ {
if (!is_month_ok(m,month) && !(_isannual || _isriepilogo)) continue; if (!is_month_ok(m,month)) continue;
atts.restart(); atts.restart();
while ((tmpatt = atts.get()) != NULL) while ((tmpatt = atts.get()) != NULL)
@ -536,26 +534,28 @@ void TLiquidazione_app::describe_pims(int month, const char* codatt)
} // for (mese ok) } // for (mese ok)
// annual follows in _arr // annual follows in _arr
if ((_isannual || _isriepilogo) && ref != "ALL") if (month == 13 && ref != "ALL")
{ {
// tutte quelle cose che vanno alla liquidazione annuale, come il // tutte quelle cose che vanno alla liquidazione annuale, come il
// calcolo del prorata o del nuovo plafond o .... // calcolo del prorata o del nuovo plafond o ....
if (look_pla(codatt)) if (look_pla(codatt))
{ {
real v = _pla->get_real("R0"); TToken_string tt(_pla->get("S1"));
real v1 = tt.get(0); real v2 = tt.get(1);
real v = v1 + v2;
real e1 = _pla->get_real("R1"); real e1 = _pla->get_real("R1");
real e2 = _pla->get_real("R2"); real e2 = _pla->get_real("R2");
real e3 = _pla->get_real("R3"); real e3 = _pla->get_real("R3");
real am = _pla->get_real("R4"); real am = _pla->get_real("R4");
real pr = _pla->get_real("R9"); real pr = _pla->get_real("R10");
real co = _pla->get_real("R10"); real co = _pla->get_real("R9");
_DescrItem* dd = new _DescrItem(ANNUAL); _DescrItem* dd = new _DescrItem(ANNUAL);
// prorata // prorata
if (!_prorata.is_zero()) if (!_prorata.is_zero())
dd->_f0 |= IS_PRORATA; dd->_f0 |= IS_PRORATA;
dd->_r0 = v - am - e3; dd->_r0 = v;
dd->_r1 = e1; dd->_r1 = e1;
dd->_r2 = pr; dd->_r2 = pr;
dd->_r3 = co; dd->_r3 = co;
@ -594,18 +594,10 @@ void TLiquidazione_app::describe_liq(int month, const char* codatts,
d->_s2 = _lim->get("S2"); d->_s2 = _lim->get("S2");
d->_s3 = _lim->get("S3"); d->_s3 = _lim->get("S3");
d->_r11 = (const char*)_lim->get("R10"); // tasso di interesse d->_r11 = (const char*)_lim->get("R10"); // tasso di interesse
real cong(_lim->get("S4")); // totale conguaglio prorata
d->_r10 = cong;
if (month == 13)
{
TToken_string a(codatts);
for (int i = 0; i < a.items(); i++)
{
TString att = a.get();
look_pla(att);
// r10 = conguaglio prorata
d->_r10 += _pla->get_real("R10");
}
}
// aggiunge eventuale satellite per rimborso infraannuale // aggiunge eventuale satellite per rimborso infraannuale
if (di != NULL) d->_arr.add(di); if (di != NULL) d->_arr.add(di);
@ -974,6 +966,7 @@ void TLiquidazione_app::set_grand(_DescrItem& d)
real& interessi = d._r7; real& interessi = d._r7;
real& versamenti = d._r8; real& versamenti = d._r8;
real& vers_int = d._r9; real& vers_int = d._r9;
real& conguaglio = d._r10;
TToken_string tt(d._s0); TToken_string tt(d._s0);
real iva_vend(tt.get(0)); real iva_vend(tt.get(0));
real iva_acq(tt.get(1)); real iva_acq(tt.get(1));
@ -1003,12 +996,9 @@ void TLiquidazione_app::set_grand(_DescrItem& d)
_is_visliq ? "$[r]" : "", &rimborso); _is_visliq ? "$[r]" : "", &rimborso);
// conguaglio prorata // conguaglio prorata
if (d._r10.sign() > 0) if (conguaglio.sign() > 0)
{ {
real r = abs(d._r10); set_row(rw++,"@11gConguaglio pro-rata@75g%r", &conguaglio);
set_row(rw++,"@11gConguaglio pro-rata@75g%r", &r);
res_debt += d._r10;
risultato += d._r10;
} }
// debito liq. precedente < 50000 // debito liq. precedente < 50000
@ -1043,12 +1033,9 @@ void TLiquidazione_app::set_grand(_DescrItem& d)
set_row(rw++,"@11gVersamenti integrativi@58g%r", &vers_int); set_row(rw++,"@11gVersamenti integrativi@58g%r", &vers_int);
} }
if (d._r10.sign() < 0) if (conguaglio.sign() < 0)
{ {
real r = abs(d._r10); set_row(rw++,"@11gConguaglio pro-rata@58g%r", &conguaglio);
set_row(rw++,"@11gConguaglio pro-rata@58g%r", &r);
res_cred += d._r10;
risultato -= d._r10;
} }
set_row(rw++,"@11gRISULTATO@58g%r", &res_cred); set_row(rw++,"@11gRISULTATO@58g%r", &res_cred);
@ -1060,12 +1047,14 @@ void TLiquidazione_app::set_grand(_DescrItem& d)
{ {
if (risultato.sign() < 0) if (risultato.sign() < 0)
{ {
real iva = abs(risultato); real iva = abs(risultato);
if (_isannual || _isriepilogo) iva.round(ROUND_MILLELIRE);
set_row(rw++,"@23gCREDITO ATTUALE@58g%r",&iva); set_row(rw++,"@23gCREDITO ATTUALE@58g%r",&iva);
} }
else else
{ {
real iva = risultato + interessi; real iva = risultato + interessi;
if (_isannual || _isriepilogo) iva.round(ROUND_MILLELIRE);
if (!iva.is_zero()) if (!iva.is_zero())
{ {
if (!interessi.is_zero()) if (!interessi.is_zero())
@ -1073,7 +1062,7 @@ void TLiquidazione_app::set_grand(_DescrItem& d)
set_row(rw++,"@23gIVA DOVUTA@75g%r",&risultato); set_row(rw++,"@23gIVA DOVUTA@75g%r",&risultato);
set_row(rw++,"@23gInteresse %6.2r %%@75g%r",&interesse, &interessi); set_row(rw++,"@23gInteresse %6.2r %%@75g%r",&interesse, &interessi);
} }
if (iva >= IVA_DA_RIPORTARE || _isannual) if (iva >= IVA_DA_RIPORTARE || _isannual || _isriepilogo)
set_row(rw++,"@23gIVA DA VERSARE@75g%r",&iva); set_row(rw++,"@23gIVA DA VERSARE@75g%r",&iva);
else else
set_row(rw++,"@23gIVA DA VERSARE@85g0 (%s < 50.000)", set_row(rw++,"@23gIVA DA VERSARE@85g0 (%s < 50.000)",

View File

@ -98,9 +98,9 @@ bool TLiquidazione_app::extract_deleghe()
_isbenzinaro = _nditte->curr(LF_ATTIV).get_bool("ART74/4"); _isbenzinaro = _nditte->curr(LF_ATTIV).get_bool("ART74/4");
bool mens = _freqviva == "M"; bool mens = _freqviva == "M";
_isannual = (_month == 12 && !mens && !_isbenzinaro) || _isannual = (_month == 12 && !mens && !_isbenzinaro) ||
(_month == 13 && (mens || _isbenzinaro)); (_month == 13 && (mens || _isbenzinaro));
_isriepilogo = _month == 13; _isriepilogo = _month == 13;
_isendliq = _isannual || _isriepilogo;
extract_delega(_month); extract_delega(_month);
} }
_prind->addstatus(1); _prind->addstatus(1);