diff --git a/cg/cg4300.h b/cg/cg4300.h index 146dc5eb8..b8c9d8b6a 100755 --- a/cg/cg4300.h +++ b/cg/cg4300.h @@ -172,7 +172,9 @@ class TLiquidazione_app : public TPrint_application bool _isbenzinaro; // regime benzinaro bool _isannual; // dichiarazione annuale 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 _isrimborso; // vuole il rimborso infraannuale bool _isricacq; // ricalcolo imposte acq. riv (par. ditta) @@ -302,6 +304,7 @@ public: bool update_firm (int month, bool recalc = TRUE); bool update_att (int month, const char* codatt, bool recalc = TRUE); void zero_att (int month, const char* codatt); + void zero_annual (int month); void recalc_att (int month, const char* codatt); void recalc_annual (const char* codatt); _DescrItem* recalc_rimborso(int month, const char* codatts); @@ -400,7 +403,8 @@ public: static bool is_trim (int x); // is_month_ok controlla che il mese passato sia // 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); // is_month_ok_strict controlla che il mese sia OK per la // 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_date_ok (TDate& d, int month); bool is_first_month (int m); + int liq_month(int x); + int previous_month (int m); - bool check_month(int m, int mref); // Funzioni accessorie: estrazione deleghe bool set_deleghe(); diff --git a/cg/cg4301.cpp b/cg/cg4301.cpp index 888562ff0..9cf0a8fb5 100755 --- a/cg/cg4301.cpp +++ b/cg/cg4301.cpp @@ -38,26 +38,62 @@ bool TLiquidazione_app::recalc_all() if (_selected[(long)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->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)); _prind->addstatus(1); - _freqviva = nomeditta.get(3); /* * trimestrali impropriamente selezionate per mesi intermedi * 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; if (_recalc != ever) { 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; break; @@ -69,11 +105,10 @@ bool TLiquidazione_app::recalc_all() _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 (_prind->iscancelled()) - break; + if (_prind->iscancelled()) break; update_firm(m); } @@ -81,11 +116,13 @@ bool TLiquidazione_app::recalc_all() // flag 'calcolato' del primo, per causare il ricalcolo dei // successivi (evitando problemi per credito precedente) 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",""); break; - } + } + + _month = save_month; } } 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' // stato effettuato per scelta dello stronzo commercialista. - look_lim(month, TRUE); + look_lim(liq_month(month), TRUE); if (_isregis && _lim->get_bool("B1")) return TRUE; @@ -115,7 +152,8 @@ bool TLiquidazione_app::update_firm(int month, bool recalc) TConfig cnf1(CONFIG_STUDIO, "cg"); _isricacq = cnf1.get_bool("RicAcq"); - // ricalcolo normale + // ricalcolo normale + // TBI lim c'e' solo per i trimestri bool ok = _lim->get_bool("B0"); if (ok && !recalc) return TRUE; 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++) { - TString cattiv(codatt); + TString cattiv(codatt); bool waspla; cattiv << tipoatt; - if (tipoatt == 1 && look_pla(cattiv, FALSE)) + if (tipoatt == 1 && (waspla = look_pla(cattiv, FALSE))) { _p8 = _pla->get_real("R5"); _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() && _p9.is_zero()); _isservizio = _pla->get("S7") == "S"; - _mixed = _pla->get("S7") == "M" || _pla->get("S7") == "E"; + _mixed = _pla->get("S7") == "M" || _pla->get("S7") == "E"; } else _isservizio = _nditte->curr(LF_ATTIV).get("TIPOATT") == "S"; _isviaggio = _nditte->curr(LF_ATTIV).get_bool("REG74TER"); _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; + 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()) { if (codatt == _reg->get("S8") && _reg->get_int("I0") == 2) _isvent = _reg->get_bool("B3"); } - if ((month != 13 || _isannual) && (calc || !recalc)) + if (calc || !recalc) if (!update_att(month, cattiv)) describe_error("Attivita' non ricalcolate: possibili errori", codatt); @@ -221,7 +268,8 @@ bool TLiquidazione_app::update_firm(int month, bool recalc) // aggiorna le liquidazioni if (calc || !recalc) - write_liq(month, atts); + if (is_month_ok_strict(month) || month == 13) + write_liq(month, atts); // rimborso infraannuale _DescrItem* rimb_d = NULL; @@ -260,11 +308,16 @@ bool TLiquidazione_app::update_att(int month, const char* codatt, { zero_att(month,codatt); recalc_att(month,codatt); - recalc_ventilation(month, codatt); - recalc_corrispettivi(month, codatt); - if (month == 13) 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; } @@ -344,7 +397,7 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt) for (; _cur->pos() < items; ++(*_cur)) { 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")); 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 tipoiva = _iva->get("S1"); + TString riga11_v = _iva->get("S0"); int tipoes_v = (int)_iva->get_long("I3"); int tipoes_a = (int)_iva->get_long("I4"); 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"); // autofatture art. 17 per non residenti, con trattamento // 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 @@ -427,17 +487,22 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt) if(rigaimp > 9) continue; /* - * In liq. annuale si totalizzano nelle vendite + * In liq. annuale si totalizzano * solo le stranezze che seguono */ - if (month == 13 && tipomov == vendita && - (!rcs.get_bool("AUTOFATT") && tipoiva != "NS")) - { - if (tipodoc == "AF" || - (!rcs.get_bool("INTRACOM") && !rcs.get_bool("VALINTRA"))) - continue; - } - + if (month == 13) + { + // si contano soltanto le vendite. + bool okc = tipomov == vendita; + // purche' ... + 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 // ***************************************** @@ -679,19 +744,19 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt) */ if (tipodoc == "CR" || tipodoc == "RF" || tipodoc == "SC") { + _pim_r->put("I0",LORDO); // questi sono corrispettivi davvero; comportamento normale if (tipoiva == "VE") // da ventilare { lor += imponibile; - _pim_r->put("I0",LORDO); add_vendite(month, reg, tipodet, imponibile); } 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; - _pim_r->put("I0",LORDO); - if (liq) add_corrisp(month, reg, imponibile, perc, tipodet, codiva); + if (liq) + add_corrisp(month, reg, imponibile, perc, tipodet, codiva); } } else if (tipodoc == "FS") @@ -756,6 +821,7 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt) adi += imposta; } + _pim_r->put("B2",isvolaff); _pim_r->put("R0",imp); _pim_r->put("R1",ivp); _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 cred_cost = 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; int attc = 0; // counter attivita' @@ -953,7 +1026,7 @@ void TLiquidazione_app::write_liq(int month, const char* codatts) } 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; // tutti se annuale) @@ -1012,8 +1085,8 @@ void TLiquidazione_app::write_liq(int month, const char* codatts) // benzinaro le conta solo in annuale, // non benzinaro solo in periodica // TBC vedi se distinguere rett. benzinai / autotrasport, - if ((_isbenzinaro && month == 13) || - (!_isbenzinaro && month < 13)) + if ((_isbenzinaro && _isannual) || + (!_isbenzinaro && !_isannual)) { risultato += _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_meCEE += _plm->get_real("R11"); } - // counter attivita' per evitare troppi versamenti - attc++; - } // fine ciclo sul mese - } + } // fine ciclo sul mese + // counter attivita' per evitare troppi versamenti + attc++; + } // fine ciclo su attivita' if (!(_isdifferita && is_first_month(month))) { @@ -1091,6 +1164,77 @@ void TLiquidazione_app::write_liq(int month, const char* codatts) 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); // azzeriamo tutto @@ -1110,10 +1254,13 @@ void TLiquidazione_app::write_liq(int month, const char* codatts) (month >= 12 && _freqviva == "M")) { 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("R2",cred_cost); @@ -1135,7 +1282,7 @@ void TLiquidazione_app::write_liq(int month, const char* codatts) * non benzinari */ if (_freqviva == "T" && risultato.sign() > 0 && - month < 12 && !_isbenzinaro) + month < 13 && !_isbenzinaro) { real interesse = interesse_trimestrale(_month); real ivi = risultato * (interesse / CENTO); @@ -1148,7 +1295,7 @@ void TLiquidazione_app::write_liq(int month, const char* codatts) _lim->put("R9", vers_int); // 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 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()); _lim->put("S2", tt); 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"); if (_isfinal) _lim->put("B1", "X"); - _lim->rewrite(); + _lim->rewrite(); + } void TLiquidazione_app::recalc_annual(const char* att) { - // calcolo volume d'affari e altro - // TBI/C: volume d'affari separato per - // le eventuali 2 attivita' - + // viene chiamata 2 volte per le att. miste; PLA e' stata + // azzerata dove serve da update_firm se siamo all'annuale real es_b1 = 0.0; real es_b2 = 0.0; real es_b3 = 0.0; real cess_amm = 0.0; real vendite = 0.0; real pro_pag = 0.0; - real acq_iva = 0.0; // per conguaglio prorata - real acq = 0.0; - real ivlac = 0.0; - real ivven = 0.0; - real ven_lrd = 0.0; + real iva_acq = 0.0; + real ven_lrd = 0.0; + real volaff1 = 0.0; + real volaff2 = 0.0; int tipoatt = att[strlen(att) -1] - '0'; - TString aaa(att); - if (tipoatt == 2) - { - // istanzia ai valori precedenti, calcolati per l'attivita' 1 - // look_pla forza a 1 il tipo attivita' (un solo pla per anno) - if (look_pla(aaa)) - { - vendite = _pla->get_real("R0"); - es_b1 = _pla->get_real("R1"); - es_b2 = _pla->get_real("R2"); - es_b3 = _pla->get_real("R3"); - cess_amm = _pla->get_real("R4"); - ivven = _pla->get_real("R11"); - ivlac = _pla->get_real("R12"); - ven_lrd = _pla->get_real("R13"); - acq = _pla->get_real("R14"); - } - } + look_pla(aaa); + TToken_string tt(_pla->get("S1")); + volaff1 = tt.get(0); + volaff1 = tt.get(1); + vendite = _pla->get_real("R0"); + es_b1 = _pla->get_real("R1"); + es_b2 = _pla->get_real("R2"); + es_b3 = _pla->get_real("R3"); + cess_amm = _pla->get_real("R4"); + pro_pag = (const char*)_pla->get("S3"); + iva_acq = (const char*)_pla->get("S2"); - 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 (i != 12 && !update_att(i,aaa,FALSE)) - describe_error("Attivita' non ricalcolata: " - "possibili errori",att); - look_ptm(i,aaa); look_plm(i,aaa); + if (_year != (const char*)_pim_anno || aaa != (const char*)_pim_codatt) + continue; + if (_pim->get_bool("B2")) + { + 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")); - ven_lrd += vend; // lordo vendite - - // non entra l'IVA per calcolo volume affari - vendite += (vend - _plm->get_real("R0")); + ven_lrd += vend; + iva_acq += _plm->get_real("R1"); real eb3(_ptm->get("S0")); es_b1 += _ptm->get_real("R13"); es_b2 += _ptm->get_real("R14"); es_b3 += eb3; - acq_iva += _plm->get_real("R1"); cess_amm += _ptm->get_real("R10"); 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); - _pla->put("R0", vendite); - _pla->put("R1", es_b1); - _pla->put("R2", es_b2); - _pla->put("R3", es_b3); - _pla->put("R4", cess_amm); - _pla->put("R9", prorata); - _pla->put("R10", conguaglio); - _pla->put("R11", ivven); - _pla->put("R12", ivlac); - _pla->put("R13", ven_lrd); - _pla->put("R14", acq); + tt = volaff1.string(); tt.add(volaff2.string()); + + _pla->put("R0", ven_lrd); + _pla->put("R1", es_b1); + _pla->put("R2", es_b2); + _pla->put("R3", es_b3); + _pla->put("R4", cess_amm); + _pla->put("S1", tt); + _pla->put("S2", iva_acq.string()); + _pla->put("S3", pro_pag.string()); _pla->rewrite(); } diff --git a/cg/cg4302.cpp b/cg/cg4302.cpp index d9306d7f1..6cea8602a 100755 --- a/cg/cg4302.cpp +++ b/cg/cg4302.cpp @@ -10,7 +10,7 @@ #include "cg4300.h" 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; } 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) -// TRUE se il mese passato e' compatibile con il mese da calcolare -// rispetto al regime di liquidazione scelto + // TRUE se il mese passato e' compatibile con il mese da calcolare + // rispetto al regime di liquidazione scelto { bool ret = x == mtocalc; if (!ret && _freqviva == "T" && mtocalc != 13) { // aggiusta al trimestre il mese da calcolare mtocalc += 2 - ((mtocalc-1) % 3); - ret = x >= (mtocalc - 3) && x <= mtocalc; + ret = x > (mtocalc - 3) && x <= mtocalc; } else if (!ret && mtocalc == 13) { @@ -42,6 +42,14 @@ bool TLiquidazione_app::is_month_ok(int x, int mtocalc) 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) { @@ -51,32 +59,22 @@ bool TLiquidazione_app::is_first_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") return m == 1 ? 1 : m - 1; 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) // TRUE se la data (di mov o pim) passata va considerata nel // ricalcolo dei progressivi mensili per il mese e anno // selezionati; se month == 13 vanno bene tutte purche' // sia giusto l'anno { - if (month == 13) - return month < 13 && d.year() == atoi(_year); - else if (d.month() > month || d.year() != atoi(_year)) + if (d.month() > month || d.year() != atoi(_year)) 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) // 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); // ulteriori detrazioni, acconti, versamenti, // rettifiche sono gia' comprese in R0 if (look_lim(month)) - r = _lim->get_real("R0"); + r = _lim->get_real("R0"); return r; } @@ -400,6 +398,7 @@ real TLiquidazione_app::credito_prec(int month) if (is_first_month(month)) { + // credito inizio anno if (look_lia()) c = _lia->get_real("R0"); // e' positivo o 0 diff --git a/cg/cg4303.cpp b/cg/cg4303.cpp index cdd9073f0..dd43b6236 100755 --- a/cg/cg4303.cpp +++ b/cg/cg4303.cpp @@ -104,9 +104,6 @@ void TLiquidazione_app::recalc_corrispettivi(int month, const char* codatt) imposta += _pim->get_real("R1"); _pim->put("R0", imponibile); _pim->put("R1", imposta); - - // segnale per comodita' - _pim->put("B1","X"); _pim->rewrite(); } } @@ -155,8 +152,7 @@ void TLiquidazione_app::recalc_ventilation(int month, const char* codatt) continue; TString att(codatt); - if (tipocr == 1 && mese == m && - att == (const char*)(*_pim_codatt)) + if (tipocr == 1 && mese == m && att == (const char*)(*_pim_codatt)) { 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("S5",totven.string()); _ptm->rewrite(); -} +} \ No newline at end of file diff --git a/cg/cg4304.cpp b/cg/cg4304.cpp index 6569e0559..6ce365720 100755 --- a/cg/cg4304.cpp +++ b/cg/cg4304.cpp @@ -82,7 +82,7 @@ void TLiquidazione_app::describe_att(int month, const char* codatt, bool isresul describe_agricolo(month, codatt); if (atts.items() == 1 && _isviaggio) describe_viaggio(month, codatt); - if (isresult || _isannual) + if (isresult || month == 13) describe_pims(month,codatt); if (atts.items() == 1) describe_consistence(codatt); @@ -161,8 +161,6 @@ void TLiquidazione_app::describe_ventilation(int month, const char* codatt) { if (!_isvent) return; - if (_isriepilogo || _isannual) month = 12; - _DescrItem* d = new _DescrItem(VENTILA); TString att(codatt); @@ -352,8 +350,8 @@ void TLiquidazione_app::describe_pims(int month, const char* codatt) _pim->get_real("R2").is_zero()) continue; - if (strcmp((const char*)*_pim_codatt, att) == 0 && - (is_month_ok(atoi(*_pim_mese),month) || _isannual) && + if (strcmp((const char*)*_pim_codatt, att) == 0 && + (is_month_ok(atoi(*_pim_mese),month)) && _year == (const char*)*_pim_anno) { // 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 // vengono normalmente considerati nelle vendite - if (_isannual) + if (month == 13) { adf = _pim->get_real("R7"); 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++) { - if (!is_month_ok(m,month) && !(_isannual || _isriepilogo)) continue; + if (!is_month_ok(m,month)) continue; atts.restart(); while ((tmpatt = atts.get()) != NULL) @@ -536,26 +534,28 @@ void TLiquidazione_app::describe_pims(int month, const char* codatt) } // for (mese ok) // annual follows in _arr - if ((_isannual || _isriepilogo) && ref != "ALL") + if (month == 13 && ref != "ALL") { // tutte quelle cose che vanno alla liquidazione annuale, come il // calcolo del prorata o del nuovo plafond o .... 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 e2 = _pla->get_real("R2"); real e3 = _pla->get_real("R3"); real am = _pla->get_real("R4"); - real pr = _pla->get_real("R9"); - real co = _pla->get_real("R10"); + real pr = _pla->get_real("R10"); + real co = _pla->get_real("R9"); _DescrItem* dd = new _DescrItem(ANNUAL); // prorata if (!_prorata.is_zero()) dd->_f0 |= IS_PRORATA; - dd->_r0 = v - am - e3; + dd->_r0 = v; dd->_r1 = e1; dd->_r2 = pr; dd->_r3 = co; @@ -594,18 +594,10 @@ void TLiquidazione_app::describe_liq(int month, const char* codatts, d->_s2 = _lim->get("S2"); d->_s3 = _lim->get("S3"); 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 if (di != NULL) d->_arr.add(di); @@ -974,6 +966,7 @@ void TLiquidazione_app::set_grand(_DescrItem& d) real& interessi = d._r7; real& versamenti = d._r8; real& vers_int = d._r9; + real& conguaglio = d._r10; TToken_string tt(d._s0); real iva_vend(tt.get(0)); real iva_acq(tt.get(1)); @@ -1003,12 +996,9 @@ void TLiquidazione_app::set_grand(_DescrItem& d) _is_visliq ? "$[r]" : "", &rimborso); // conguaglio prorata - if (d._r10.sign() > 0) + if (conguaglio.sign() > 0) { - real r = abs(d._r10); - set_row(rw++,"@11gConguaglio pro-rata@75g%r", &r); - res_debt += d._r10; - risultato += d._r10; + set_row(rw++,"@11gConguaglio pro-rata@75g%r", &conguaglio); } // debito liq. precedente < 50000 @@ -1043,12 +1033,9 @@ void TLiquidazione_app::set_grand(_DescrItem& d) set_row(rw++,"@11gVersamenti integrativi@58g%r", &vers_int); } - if (d._r10.sign() < 0) - { - real r = abs(d._r10); - set_row(rw++,"@11gConguaglio pro-rata@58g%r", &r); - res_cred += d._r10; - risultato -= d._r10; + if (conguaglio.sign() < 0) + { + set_row(rw++,"@11gConguaglio pro-rata@58g%r", &conguaglio); } set_row(rw++,"@11gRISULTATO@58g%r", &res_cred); @@ -1060,12 +1047,14 @@ void TLiquidazione_app::set_grand(_DescrItem& d) { 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); } else { - real iva = risultato + interessi; + real iva = risultato + interessi; + if (_isannual || _isriepilogo) iva.round(ROUND_MILLELIRE); if (!iva.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++,"@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); else set_row(rw++,"@23gIVA DA VERSARE@85g0 (%s < 50.000)", diff --git a/cg/cg4305.cpp b/cg/cg4305.cpp index 669336c8a..276cf3f2e 100755 --- a/cg/cg4305.cpp +++ b/cg/cg4305.cpp @@ -98,9 +98,9 @@ bool TLiquidazione_app::extract_deleghe() _isbenzinaro = _nditte->curr(LF_ATTIV).get_bool("ART74/4"); bool mens = _freqviva == "M"; _isannual = (_month == 12 && !mens && !_isbenzinaro) || - (_month == 13 && (mens || _isbenzinaro)); + (_month == 13 && (mens || _isbenzinaro)); _isriepilogo = _month == 13; - + _isendliq = _isannual || _isriepilogo; extract_delega(_month); } _prind->addstatus(1);