diff --git a/cg/cg4301.cpp b/cg/cg4301.cpp index 0eb543140..826ddb73a 100755 --- a/cg/cg4301.cpp +++ b/cg/cg4301.cpp @@ -1,1711 +1,1735 @@ -// ------------------------------------------------------------ -// Calcolo liquidazioni -// Part 2: calcolo -// fv 21-1-94 -// ------------------------------------------------------------ - -#include -#include -#include -#include -#include "cg4300.h" - -// -------------------- QUI comincia l'avventura -------------------------- -// Datemi un punto di appoggio ****************** -// e mi ci appoggero' ****************** -// ----------------------------------------------------- ****************** - -bool TLiquidazione_app::recalc_all() -{ - _prind = new TProgind(_selected.ones()*2, _printonly ? - " Stampa liquidazione... \n" - " Preparazione archivi \n" - " " : - " Calcolo liquidazione... \n" - " Preparazione archivi \n" - " ", - TRUE,TRUE,45); - - for (int l = 0; l < _ditte->items(); l++) - { - if (_prind->iscancelled()) - break; - - 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(); - _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 - // ***************** Previous kasin *************************** - // 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 - // ************************************************************ - - // strasemplificato: per l'annuale si sceglie annuale, altrimenti - // e' la 12ma anche per le trimestrali. - _isannual = _isriepilogo = _month == 13; - - TApplication::set_firm(nomeditta.get_long(1)); - _prind->addstatus(1); - - /* - * trimestrali impropriamente selezionate per mesi intermedi - * provocano il ricalcolo dei progressivi mensili ma non la stampa - */ - _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 (is_month_ok_strict(m) && (!look_lim(m) || !_lim->get_bool("B0"))) - { - need_refresh = TRUE; - break; - } - - if (need_refresh && yesno_box("Alcuni mesi precedenti non " - "risultano ricalcolati. E' consigliabile il ricalcolo. " - "Si desidera eseguirlo?")) - _recalc = ever; - } - - - for (int m = 1; m <= _month; m++) // fino a 13 compreso - if (is_month_plain(m) || _recalc == ever) - { - if (_prind->iscancelled()) break; - update_firm(m); - } - - // se ci sono altri mesi dopo l'ultimo calcolato, invalida il - // flag 'calcolato' del primo, per causare il ricalcolo dei - // successivi (evitando problemi per credito precedente) - for (m = _month+1; m <= 13; m++) - if (look_lim(m)) - { - _lim->put("B0",""); - _lim->rewrite(); - break; - } - - _month = save_month; - } - } - bool canc = _prind->iscancelled(); - if (!canc) _prind->addstatus(1); - - TApplication::set_firm(__firm); - delete _prind; _prind = NULL; - - return !canc; -} - -bool TLiquidazione_app::update_firm(int month, bool recalc) -{ - // Se recalc e' TRUE considera la necessita' di ricalcolare e le - // opzioni utente. Se FALSE se ne impipa dell'utente e ricalcola - // se necessario (serve nelle chiamate ricorsive) - // Ritorna FALSE soltanto se il ricalcolo era necessario e non e' - // stato effettuato per scelta dello stronzo commercialista. - - look_lim(liq_month(month), TRUE); - - if (_isregis && _lim->get_bool("B1") && _month != 13) - return TRUE; - - TConfig cnf(CONFIG_DITTA, "cg"); - _isdifferita = cnf.get_bool("GeLiDi") && _month != 13; - // controlla che il periodo corrente non sia l'inizio dell'attivita' - // nel caso, differita va a FALSE - TDate inatt(_nditte->lfile().get("DINIZIOATT")); - if (is_in_liq_period(inatt)) _isdifferita = FALSE; - - TConfig cnf1(CONFIG_STUDIO, "cg"); - _isricacq = cnf1.get_bool("RicAcq"); - - // ricalcolo normale - // lim c'e' solo per i trimestri - bool ok = _lim->get_bool("B0"); - if (ok && !recalc) return TRUE; - bool calc = (_recalc == ever || (_recalc == one && is_month_ok(month,_month))); - if (!calc && _recalc != never) calc = !ok; - bool gheravergot = FALSE; - bool quater = FALSE; - - TToken_string atts; - TToken_string cattivs; - - // azzera rimborsi - zero_firm(month); - - // casini per stampa minchie in coda ai registri - bool riepliq = FALSE; - bool stliq = FALSE; - - _nditte->save_status(); - if (_nditte->is_first_match(LF_ATTIV)) - { - char buf[256]; - do - { - TString16 codatt = _nditte->curr(LF_ATTIV).get("CODATT"); - TString80 desatt = _nditte->curr(LF_ATTIV).get("DESCR"); - quater = _nditte->curr().get_bool("FLIVA11Q"); - - // attivita' mista: ce ne sono in realta' due - // viene calcolato nel ciclo su tipoatt (che viene ripetuto solo - // se diventa TRUE); - _mixed = FALSE; - - sprintf (buf, _printonly ? "Stampa liquidazione (%d)...\n%s: %s\n" : - "Calcolo liquidazione (%d)...\n%s: %s\n", - month, - (const char*)_nditte_r->get("RAGSOC"), - (const char*)desatt); - - if (_prind) _prind->set_text(buf); - - // se ricalcola l'annuale si tiene tutte le vendite e corrispettivi di - // tutti i lerci mesi - if (!(_month == 13 && month > 1)) - { - _vend_arr.destroy(); - _corr_arr.destroy(); - } - - cattivs = ""; - - for (int tipoatt = 1; tipoatt <= (_mixed ? 2 : 1); tipoatt++) - { - TString cattiv(codatt); bool waspla; - - cattiv << tipoatt; - if (tipoatt == 1 && (waspla = look_pla(cattiv, FALSE))) - { - _p8 = _pla->get_real("R5"); - _p8b = _pla->get_real("R6"); - _p9 = _pla->get_real("R7"); - _prorata = _pla->get_real("R8"); - _isplafond = !(_p8.is_zero() && _p8b.is_zero() && - _p9.is_zero()); - _isservizio = _pla->get("S7") == "S"; - _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"); - _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("R13",""); - _pla->put("R9",""); - _pla->put("R10",""); - _pla->put("R11",""); - _pla->put("R12",""); - _pla->put("R14",""); - _pla->put("S1","0"); - _pla->put("S2","0"); - _pla->put("S3","0"); - _pla->rewrite(); - } - - - for (_reg->first(); _reg->good(); _reg->next()) - { - if (codatt == _reg->get("S8") || quater) // TBC quater: e' una pezza ma andra' cambiato - { - if (!riepliq) riepliq = _reg->get_bool("B6"); - if (!stliq) stliq = _reg->get_bool("B7"); - if (_reg->get_int("I0") == 2) - if (!_isvent) _isvent = _reg->get_bool("B3"); - } - } - - if (!_isregis) - stliq = riepliq = TRUE; - - if (calc || !recalc) - if (!update_att(month, cattiv) && stliq) - describe_error("Attivita' non ricalcolate: possibili errori", - codatt); - - // vediamo se c'e' qualcosa da raccontare - gheravergot = _isannual || _isriepilogo; - if (!gheravergot) - { - look_plm(month,cattiv); - gheravergot = !_plm->get_real("R0").is_zero() || - !_plm->get_real("R1").is_zero(); - } - - if (month == _month && riepliq) - describe_att(month, cattiv, gheravergot, - '0' + (_mixed ? tipoatt : 0)); - - atts.add(cattiv); - cattivs.add(cattiv); - } // for tipoatt - - // se attivita' mista stampa riepilogo - if (_mixed && month == _month && riepliq) - describe_att(month,cattivs, TRUE, 'M'); - } - while (_nditte->next_match(LF_ATTIV)); - - // se quater stampa riepilogo - if (quater && month == _month && riepliq) - describe_att(month,atts, TRUE, 'Q'); - - // occorre poterla chiamare altre volte con mesi diversi - _nditte->restore_status(); - - // aggiorna le liquidazioni - if (calc || !recalc) - if (is_month_ok_strict(month) || month == 13) - write_liq(month, atts); - - // rimborso infraannuale - _DescrItem* rimb_d = NULL; - if (month == _month) - { - // unica nel suo genere, recalc_rimborso ritorna - // un bel descritem (NULL se non si rimborsa un cas) - // da passare a describe_liq - rimb_d = recalc_rimborso(month,atts, stliq); - } - - if (month == _month && stliq) - { - describe_firm(month); - describe_liq(_month, atts, _isregis ? NULL : rimb_d); - } - } - return ok || calc; -} - -bool TLiquidazione_app::update_att(int month, const char* codatt, - bool recalc) - // viene passato un codice attivita' con codatt+tipoatt - // vedi update_firm per il burdel dei calc e recalc - // occhecasino. Se _comp_acconto e' TRUE, i movimenti considerati - // saranno solo quelli di dicembre per data <= 20/12; - // il ricalcolo e' FORZATO da _recalc messo a one -{ - look_plm(month, codatt, TRUE); - bool ok = _plm->get_bool("B0"); - if (ok && !recalc) return TRUE; - bool calc = _recalc == ever || (_recalc == one && is_month_ok(month,_month)); - if (!calc && _recalc != never) calc = !ok; - - if (calc || !recalc) - { - zero_att(month,codatt); - recalc_att(month,codatt); - if (!_isagricolo) - { - recalc_ventilation(month, codatt); - recalc_corrispettivi(month, codatt); - } - if (month == 13) - recalc_annual(codatt); - } - return ok || calc; -} - -void TLiquidazione_app::zero_firm(int month) -{ - // nothing more, left for sicurezz -} - -void TLiquidazione_app::zero_att(int month, const char* codatt) -{ - for (_pim->first(); !_pim->eof(); _pim->next()) - { - int m = atoi(*_pim_mese); - TString att = (const char*)*_pim_codatt; - if (m == month && att == codatt) - { - _pim->put("R0",""); - _pim->put("R1",""); - _pim->put("R2",""); - _pim->put("R3",""); - _pim->put("R4",""); - _pim->put("R5",""); - _pim->put("R6",""); - _pim->put("R7",""); - _pim->put("R8",""); - _pim->put("R9",""); - _pim->put("R10",""); - _pim->put("R11",""); - _pim->put("R12",""); - _pim->put("R13",""); - _pim->put("R14",""); - _pim->put("S1",""); - _pim->put("S2",""); - _pim->rewrite(); - } - } - if (look_plm(month, codatt)) - { - // zero PLM, POM, PAM, PUM - TString codtab(_plm->get("CODTAB")); - _plm->zero(); - _pom->zero(); - _pam->zero(); - _pum->zero(); - _plm->put("CODTAB", codtab); - _pom->put("CODTAB", codtab); - _pam->put("CODTAB", codtab); - _pum->put("CODTAB", codtab); - _plm->rewrite(); - _pam->rewrite(); - _pom->rewrite(); - _pum->rewrite(); - } - if (_isplafond && month != 13) - zero_plafond(month,codatt); -} - -void TLiquidazione_app::recalc_att(int month, const char* codatt) - // il codatt passato e' codice att + tipo att ( IN {1|2} ) - // occhecasino. Se _comp_acconto e' TRUE, i movimenti considerati - // saranno solo quelli di dicembre per data <= 20/12; -{ - real totintra = 0.0; - real nond19_imp = 0.0; - real nond19_iva = 0.0; - real ammort_det = 0.0; - real ammort_det_iva = 0.0; - real ammort_indet = 0.0; - real ammort_indet_iva = 0.0; - real ammort_6 = 0.0; - real ammort_6_iva = 0.0; - real acq_riv = 0.0; - real acq_riv_iva = 0.0; - real leasing = 0.0; - real leasing_iva = 0.0; - real cess_amm = 0.0; - real cess_amm_iva = 0.0; - real acquisti = 0.0; - real acquisti_iva = 0.0; - real vendite = 0.0; - real vendite_iva = 0.0; - real esenti_b1 = 0.0; - real esenti_b2 = 0.0; - real esenti_b3 = 0.0; - real esenti_b14 = 0.0; - real esni_rimb = 0.0; // ci sommo tutti esenti e ni validi per rimborso - real corr_CEE = 0.0; - real corr_noCEE = 0.0; - real acq_CEE = 0.0; - real acq_noCEE = 0.0; - real corr_misCEE = 0.0; - real acq_misCEE = 0.0; - real acq_misnoCEE = 0.0; - real agr_1i = 0.0; - real agr_2i = 0.0; - real agr_1 = 0.0; - real agr_2 = 0.0; - real agr_3 = 0.0; - real agr_4 = 0.0; - real agr_5 = 0.0; - real agr_6 = 0.0; - real agr_7 = 0.0; - real acq_ies = 0.0; - real acq_ies_iva = 0.0; - real ult_detr = 0.0; - real acq_pint = 0.0; - real acq_pint_iva = 0.0; - real spgen = 0.0; - real spgen_iva = 0.0; - real assp_imp = 0.0; - real assp_iva = 0.0; - real vssp_imp = 0.0; - real vssp_iva = 0.0; - real bdog_imp = 0.0; - real bdog_iva = 0.0; - - *_cur = 0; - long items = _cur->items(); - TString trueatt(codatt); - int tipatt = atoi(trueatt.sub(5)); - trueatt = trueatt.left(5); - - for (; _cur->pos() < items; ++(*_cur)) - { - TDate date(_mov->get("DATAREG")); - TString16 reg = _mov->get("REG"); - bool isreg = look_reg(_mov->get("REG")); - TString16 tipodoc = _mov->get("TIPODOC"); - /* - * check register present, rmoviva present and date OK - */ - const bool dok = !is_date_ok(date, month); - const bool sreg = !isreg; - const bool rs8 = _reg->get("S8") != trueatt; - const bool cmt = !_cur->is_first_match(LF_RMOVIVA); - const bool sosp_imp = _reg->get_bool("B1"); - const TRectype& rcs = _cur->curr(LF_CAUSALI); - const bool fattrit = rcs.get_bool("RITFATT"); - - // for degiubbing only - int numreg = _rmoviva->get_int("NUMREG"); - - if (dok || sreg || rs8 || cmt) continue; - - /* - * Tipo documento da eliminare (Scudler 1994) - * Trattasi per lo piu' di non incassati - */ - if (tipodoc == "SN" || tipodoc == "CN" || tipodoc == "RN" || - tipodoc == "IN" || tipodoc == "PG") - continue; - - /* - * check date: se si calcola l'acconto, solo da 1/12 a 20/12 - */ - if (_comp_acconto && date.month() != 12 && date.day() > 20) - continue; - - bool corrisp = _reg->get_bool("B0"); - tiporeg tipomov = (tiporeg)_reg->get_long("I0"); - - do - { - look_iva(_rmoviva->get("CODIVA")); - - // totali parziali registrati nei pim per motivi ignoti - real bolld_imp = 0.0; // imponibile bolle doganali - real bolld_iva = 0.0; // imposta bolle doganali - real asimp_imp = 0.0; // imponibile acquisti sosp. imposta - real asimp_iva = 0.0; // imposta acquisti sosp. imposta - real vsimp_imp = 0.0; // imponibile vendite sosp. imposta - real vsimp_iva = 0.0; // imposta vendite sosp. imposta - real rit_imp = 0.0; // imponibile fatture in ritardo - real rit_iva = 0.0; // IVA fatture in ritardo - - 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")); - int tipoag = atoi(_iva->get("S5")); - int tipopla = atoi(_iva->get("S3")); - int tipodet = atoi(_rmoviva->get("TIPODET")); - bool isrimbinfr = _iva->get_bool("B3"); // vale per calcolo rimborso se ES o NI - bool ivarimb = !_iva->get_bool("B4"); // non escluso calcolo rimb. per al. media - TString tipocr_s = _rmoviva->get("TIPOCR"); - int tipocr = atoi(tipocr_s); - real imponibile = _rmoviva->get_real("IMPONIBILE"); - real imposta = _rmoviva->get_real("IMPOSTA"); - bool intra = _rmoviva->get_bool("INTRA"); - int tipoatt = _rmoviva->get_int("TIPOATT"); - int rigaimp = _rmoviva->get_int("RIGAIMP"); - // autofatture art. 17 per non residenti, con trattamento - // speciale in liquidazione annuale - bool autodafe = (tipodoc == "AF" && tipocr == 4); - // indica acquisti per rivendita; viene messo in B4 di PIM per - // indicare che e' soggetto al ricalcolo IVA (se voluto) in modo - // da evitare di dover controllare mese e anno sul PIM - bool was_riv = FALSE; - /* - * puo' capitare per motivi brutalmente prassici - * SENSU Sergio 1995, Guido - */ - if (tipoatt == 0) tipoatt = 1; - - if(tipoatt != tipatt) continue; - - /* - * Riga imponibile > 9 = ritenute; non si - * considerano (Scudler 1994) - */ - if(rigaimp > 9) continue; - - /* - * In liq. annuale si totalizzano - * solo le stranezze che seguono - */ - 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")); - /* - * Fatture in ritardo vengono considerate solo in dichiarazione - * annuale, ma vanno comunque sommate per i porci registri - */ - if (!(okc && (cond1 || cond2)) && !fattrit) - continue; - } - - - if (sosp_imp) // sospensione di imposta - { - if (tipomov == vendita) - { - vsimp_imp = imponibile; - vsimp_iva = imposta; - } - else - { - asimp_imp = imponibile; - asimp_iva = imposta; - } - assp_imp += asimp_imp; - assp_iva += asimp_iva; - vssp_imp += vsimp_imp; - vssp_iva += vsimp_iva; - } - else if (fattrit && month != 13) - { - rit_imp = imponibile; - rit_iva = imposta; - } - else if (!fattrit) // normale - { - - // ***************************************** - // casi particolari - // ***************************************** - - // imposta acquisti intracomunitari - if (tipomov == acquisto && intra) - totintra += imposta; - - // Altre cose di cui tener conto - if (tipomov == acquisto && (tipocr == 1 || tipocr == 5)) - /* - * Acquisto beni per rivendita - */ - { - acq_riv += imponibile; - acq_riv_iva += imposta; - was_riv = TRUE; - } - - else if (tipomov == acquisto && tipocr == 2 && tipodet == 0) - // Acquisto beni ammortizzabili detraibili - { - ammort_det += imponibile; - ammort_det_iva += imposta; - } - else if (tipomov == acquisto && tipocr == 2 && tipodet != 0) - // Acquisto beni ammortizzabili indetraibili - { - ammort_indet += imponibile; - ammort_indet_iva += imposta; - } - else if (tipomov == acquisto && tipocr == 3) - // Acquisto beni ammortizzabili detr. 6% - { - ammort_6 += imponibile; - ammort_6_iva += imposta; - ult_detr += imponibile * real(DETRAZIONE_6PERCENTO); - } - else if (tipomov == vendita && tipocr == 4) - /* - * Vendite strum. art 17 (cess. amm.) - * Comprende anche autofatture, anche nell'annuale - * (Sergio 1995) - */ - { - cess_amm += imponibile; - cess_amm_iva += imposta; - } - else if (tipomov == acquisto && tipocr == 8) - // Acquisto beni strum. acquisiti in leasing - { - leasing += imponibile; - leasing_iva += imposta; - } - else if (tipomov == acquisto && tipocr == 9) - // Spese generali - { - spgen += imponibile; - spgen_iva += imposta; - } - - // operazioni per calcolo rimborso infracazzuale - // Scudler 1995 - // La breve estate vissuta dal metodo del 51% renderebbe - // ora superflua la tabella rimborsi, ma, come diceva - // Garcia Lorca, me ne sbatto il culo e se non ti piace - // vatti a far chiavare da un coyote - // Non mi piaceva, il coyote non era intenzionato, e - // quindi l'ho tolta, anche perche' non funzionava piu' - // per i ventilati e per gli 'aggiustati' dopo il calcolo - if (ivarimb) - { - bool ok = _isagricolo ? tipoagr == 2 : FALSE; - - if (tipomov == acquisto && !ok) - ok = (tipocr == 0 || tipocr == 1 || tipocr == 5 || tipocr == 9); - - if (tipomov == vendita && !ok) - ok = tipoiva != "NS" && tipocr != 4; - - ivarimb = ok; - } - - // operazioni esenti - if (tipoiva == "ES") - { - if (tipomov == vendita) - { - switch(tipoes_v) - { - case 1: - esenti_b1 += imponibile; - break; - case 2: - esenti_b2 += imponibile; - break; - case 3: - esenti_b3 += imponibile; - break; - } - // se e' il caso sommare esenti per rimborso - if (isrimbinfr) - esni_rimb += imponibile; - } - else if (tipoes_a == 14) - esenti_b14 += imponibile; - } - - // non imponibili per rimborso - if (tipoiva == "NI" && tipomov == vendita && isrimbinfr) - esni_rimb += imponibile; - - // bolle doganali - if (tipodoc == "BD") - { - bolld_imp = imponibile; - bolld_iva = imposta; - - bdog_imp += bolld_imp; - bdog_iva += bolld_iva; - } - - // plafond - if (_isplafond && tipomov == acquisto && month != 13 && - tipoiva == "NI" && tipopla != 0) - { - add_plafond(month, codatt, tipopla, imponibile, tipodoc == "BD"); - } - - // agenzie viaggio (CHECK imponibili etc.) - if (_isviaggio) - switch (tipoag) - { - case 1: - if (tipomov == acquisto) acq_CEE += imponibile + imposta; - else corr_CEE += imponibile + imposta; - break; - case 2: - if (tipomov == acquisto) acq_noCEE += imponibile + imposta; - else corr_noCEE += imponibile + imposta; - break; - case 3: corr_misCEE += imponibile + imposta; break; - case 4: acq_misCEE += imponibile + imposta; break; - case 5: acq_misnoCEE += imponibile + imposta; break; - } - - - if (_isagricolo) - { - /* - * rifatto sensu Scudler 1995 con invidiabile sicurezza - * senza porsi domande e mettendo NUMERI uguali - * al TIPO RECORD del frigorifero - */ - if (tipomov == vendita) - { - if (tipoagr == 1 || tipoagr == 3) - { - agr_1 += imposta; - agr_1i += imponibile; - } - else if (tipoagr == 2) - { - agr_2 += imposta; - agr_2i += imponibile; - } - } - else if (tipodet == 0) - { - if (tipoagr == 2) - { - if (tipocr != 2 && tipocr != 3 && tipocr != 8) - agr_3 += imposta; - else - agr_4 += imposta; - } - else if (tipoagr == 3) - { - if (tipocr != 2 && tipocr != 3 && tipocr != 8) - agr_7 += imposta; - } - else // ne' 2 ne' 3 - { - if (tipocr != 2 && tipocr != 3 && tipocr != 8) - agr_5 += imposta; - else - agr_6 += imposta; - } - } - } - - if (tipodet == 1) // acquisti indeducibili su ricavi esenti art. 10 - { - acq_ies += imponibile; - acq_ies_iva += imposta; - } - - if (tipodet == 3) // passaggi interni (solo per ventilaz) - { - acq_pint += imponibile; - acq_pint_iva += imposta; - } - - // acquisti non detraibili art. 19 - // possono valere per la ventilazione - if (tipodet == 9) - { - nond19_imp += imponibile; - nond19_iva += imposta; - } - - // ***************************************** - // Fine casi particolari - // Non che i casi normali siano tanto meglio - // ***************************************** - } // non sosp_imp - /* - * Calcolo e aggiornamento - * cerca o crea progressivo IVA - */ - look_pim(month, codatt, reg, tipocr_s, codiva, tipodet, TRUE); - - /* - * se ign == TRUE non bisogna neppure PROGRESSIVARLI - */ - bool ign = sosp_imp || (fattrit && month != 13); - - /* - * se liq == FALSE gli importi non contano ai fini - * del calcolo liquidazione - */ - bool liq = !(tipodet == 1 || tipodet == 3 || tipodet == 9 || ign); - - - real imp = _pim->get_real("R0"); // imponibile - real ivp = _pim->get_real("R1"); // IVA su imp. - real lor = _pim->get_real("R2"); // lordo - - /* - * le maledette fatture con scontrino sono sul registro dei - * corrispettivi, ma vanno riportate nelle vendite in stampa; - * dunque, le sommiamo in R5 e R6 di PIM anche se continuiamo - * a sommarle anche in R0 e R1. La stampa (describe_pim) - * dovra' scorporarle - */ - real ifs = _pim->get_real("R5"); // imponibile fatture con scontrino - real vfs = _pim->get_real("R6"); // IVA fatt. con scontrino - - /* - * le maledette autofatture non residenti art. 17 - * vedi al calcolo if (autodafe) si tengono da parte - * La stampa le scorpora solo IN SEDE di dichiarazione annuale - * NELL'OTTICA di una PIU' CORRETTA e CONSONA ...................... - */ - real adf = _pim->get_real("R7"); - real adi = _pim->get_real("R8"); - - /* le fottute fatture in sospensione di imposta */ - real fsi = _pim->get_real("R11"); - real fsv = _pim->get_real("R12"); - - /* le putride bolle doganali */ - real bdi = _pim->get_real("R9"); - real bdv = _pim->get_real("R10"); - - /* i luridi falsi corrispettivi */ - real fci = _pim->get_real("R13"); - real fcv = _pim->get_real("R14"); - - /* le porche fatture in ritardo */ - TToken_string fr(_pim->get("S1")); - real rti(fr.get(0)); - real rtv(fr.get(1)); - - /* la stramadonna dei corrispettivi gia' scorporati */ - TToken_string cs(_pim->get("S2")); - real csi(cs.get(0)); - real csv(cs.get(1)); - - rti += rit_imp; - rtv += rit_iva; - - if (tipomov == vendita) - { - fsi += vsimp_imp; - fsv += vsimp_iva; - } - else - { - fsi += asimp_imp; - fsv += asimp_iva; - bdi += bolld_imp; - bdv += bolld_iva; - } - - if (liq && tipomov == vendita && !corrisp) - // i corrispettivi sono gestiti a parte - { - // totale vendite - vendite += imponibile; - vendite_iva += imposta; - } - else if (liq && tipomov == acquisto) - { - // totale acquisti - acquisti += imponibile; - acquisti_iva += imposta; - } - - // corrispettivi - bool true_corrisp = FALSE; - if (corrisp) - { - /* - * ennesimo casino: non tutti i corrispettivi sono - * corrispettivi; in effetti, alcuni corrispettivi - * non sono corrispettivi. Ci si potrebbe domandare - * se gli altri corrispettivi sono corrispettivi o - * no; ebbene, gli altri corrispettivi risultano - * fortunatamente essere corrispettivi, a meno di - * indicazioni contrarie. - */ - if (tipodoc == "CR" || tipodoc == "RF" || tipodoc == "SC") - { - true_corrisp = TRUE; - _pim->put("I0",LORDO); - // questi sono corrispettivi davvero; comportamento normale - if (tipoiva == "VE") // da ventilare - { - lor += imponibile; - add_vendite(month, reg, tipodet, imponibile); - } - else // non da ventilare, con imposta gia' conteggiata - { - real perc = _iva->get_real("R0")/CENTO; - lor += imponibile + imposta; - real tot = imponibile+imposta; - if (liq) add_corrisp(month, reg, tot, perc, tipodet, codiva, codatt); - } - } - else if (tipodoc == "FS") - { - // queste sono fatture che seguono scontrino, il lordo va detratto - // perche' si e' gia' registrato lo scontrino medesimo - true_corrisp = TRUE; // non e' vero ma non devono essere sommate ai falsi - // corrispettivi - if (tipoiva == "VE") - { - real rr = imponibile + imposta; - imp += rr; - if (liq) - vendite += rr; - add_vendite(month, reg, tipodet, rr); - } - imp -= imponibile; - ivp -= imposta; - lor -= imponibile + imposta; - ifs += imponibile; - vfs += imposta; - csi += imponibile; - csv += imposta; - } - else // vendite normali a tutti gli effetti - { - if (liq) - { - vendite += imponibile; - vendite_iva += imposta; - } - imp += imponibile; - ivp += imposta; - fci += imponibile; - fcv += imposta; - csi += imponibile; - csv += imposta; - _pim->put("I0",NETTO); - } - } // if corrisp - else // non corrisp - { // imponibile e imposta separata - imp += imponibile; - ivp += imposta; - _pim->put("I0",NETTO); - } - - if (autodafe) // autofatture non residenti art, 17 - { - /* - * Si devono riportare a parte in annuale - * e non comparire nel riepilogo del codice IVA - * corrispondente, solo se la liq. e' annuale - * Li metto in R7/R8 di pim e li sommo anche nelle - * vendite; la describe_pim() dovra' sommarli su tutti i - * pim, scorporarli dalle rispettive vendite - * e assegnarli al codice IVA A35 in caso di liq. annuale - */ - adf += imponibile; - adi += imposta; - } - - if (corrisp && !true_corrisp) - { - fci += imponibile; - fcv += imposta; - } - - if (!ign) - { - _pim->put("R0",imp); - _pim->put("R1",ivp); - _pim->put("R2",lor); - _pim->put("R5",ifs); - _pim->put("R6",vfs); - _pim->put("R7",adf); - _pim->put("R8",adi); - _pim->put("R9",bdi); - _pim->put("R10",bdv); - _pim->put("R13",fci); - _pim->put("R14",fcv); - } - - // questi servono per i ricalcoli altrui (classify_pim) o - // per trucchetti di ricalcolo successivi - _pim->put("R11",fsi); - _pim->put("R12",fsv); - _pim->put("I1", (long)tipomov); - _pim->put("B3", ivarimb ? "X" : ""); - _pim->put("B4", (_isricacq && was_riv) ? "X" : ""); - _pim->put("S5", tipoiva); - - // fatture in ritardo - fr.add(rti.string(), 0); - fr.add(rtv.string(), 1); - _pim->put("S1",fr); - - // corrispettivi gia' scorporati; anche questi servono per - // non cannare la stampa dei registri - cs.add(csi.string(), 0); - cs.add(csv.string(), 1); - _pim->put("S2",cs); - _pim->rewrite(); - } - while (_cur->next_match(LF_RMOVIVA)); - } // fine calcolo progressivi IVA - - /* - * calcolati tutti i movimenti e aggiornati i pim - * se necessario risistema le imposte acquisti beni - * per rivendita - */ - - if (_isricacq) // flag settato parametri studio - { - for (_pim->first(); !_pim->eof(); _pim->next()) - { - // this is much furber than doing all of the checks - if (_pim->get_bool("B4")) - { - // ricalcola l'imposta a partire dal codice IVA - look_iva(*_pim_codiva); - real old_iva = _pim->get_real("R1"); - real perc = _iva->get_real("R0"); - - real new_iva = (_pim->get_real("R0") * perc)/CENTO; - new_iva.ceil(ROUND_LIRA); // TBC check ceil - - if (new_iva != old_iva) - { - // ricalcola: acquisti_iva, acq_riv_iva - acquisti_iva -= old_iva; - acquisti_iva += new_iva; - acq_riv_iva -= old_iva; - acq_riv_iva += new_iva; - _pim->put("R1", new_iva); - // resetta in modo da non vederlo il mese dopo - _pim->put("B4", ""); - _pim->rewrite(); - } - } - } - } - - /* - * calcola il lercio prorata - * solo se liq. periodica - */ - real prorata; - if (!_prorata.is_zero() && month != 13) - { - prorata = acquisti_iva * (_prorata / CENTO); - prorata.round(ROUND_LIRA); - acquisti_iva -= prorata; - } - look_plm(month, codatt, TRUE); - - /* - * ACHTUNG: l'iva sulle vendite e' calcolata sommando anche i - * corrispettivi che sono corrispettivi, a differenza dei corrispettivi - * che non sono corrispettivi, ma tanto quelli (come si sa) non sono - * corrispettivi. Dunque, non si tiene conto delle imposte calcolate - * con la ventilazione (che vanno sottratte) ne' di quelle - * calcolate per le agenzie di viaggio (che sembra non vadano - * comunque sottratte nel calcolo del volume di affari) - */ - - _plm->put("R2", prorata); - - if (_isviaggio) - { - real deb_mens = 0.0; - _plm->put("R5", corr_CEE); - _plm->put("R6", corr_noCEE); - _plm->put("R7", acq_CEE); - _plm->put("R8", acq_noCEE); - _plm->put("R9", corr_misCEE); - _plm->put("R10",acq_misCEE); - _plm->put("R11",acq_misnoCEE); - - // ---- NOTA BENE ------------------------ - // l'iva vendite nei plm non comprende - // l'iva agenzie di viaggio, calcolata - // in liquidazione (mensile o trimestrale) - // --------------------------------------- - // Mod 7/7/95: calcolo effettuato anche qui, in modo da - // avere l'IVA dovuta per riportarla nei progressivi - // Dato che il resto funziona non tocco nulla, ovvero - // duplico il calcolo di write_liq, nella remota ipotesi - // che ci siano due o piu' attivita' e siano tutte - // agenzie di viaggio - real perc_r = (acq_misCEE * CENTO)/(acq_misCEE + acq_misnoCEE); - real ivm = (corr_misCEE * perc_r)/CENTO; ivm.round(ROUND_LIRA); - real tc = (corr_CEE + ivm); - real ta = (acq_CEE + acq_misCEE); - real bi = tc - ta - credito_costo_prec(month); - - if (bi.sign() > 0) - { - deb_mens = (bi /((CENTO + aliquota_agvia())/CENTO)) * - (aliquota_agvia()/CENTO); - deb_mens.ceil(ROUND_LIRA); // ceil voluto MI3074 - } - _pom->put("R13", deb_mens); - } - else if (_isagricolo) - { - _plm->put("R5", agr_1); - _plm->put("R6", agr_2); - _plm->put("R7", agr_3); - _plm->put("R8", agr_4); - _plm->put("R9", agr_5); - _plm->put("R10", agr_6); - _plm->put("R11", agr_7); - _pum->put("R10", agr_1i); - _pum->put("R11", agr_2i); - - // Il porco agricoltore spende poco e paga meno - vendite_iva = agr_2; - acquisti_iva = agr_3; - - // nuovo calcolo IVA detraibile - if (!agr_7.is_zero()) - { - real pdetr = (agr_2i / (agr_1i + agr_2i)); - pdetr.round(2); - acquisti_iva += agr_7 * pdetr; - acquisti_iva.round(ROUND_LIRA); - } - } - - _plm->put("R0", vendite_iva); - _plm->put("R1", acquisti_iva); - _plm->put("R3", ult_detr); - // probabilmente R4 serviva per il decalage e non si usera' - _plm->put("R12", _prorata); // per comodita' in stampa - _plm->put("B0", "X"); // calcolato (invalidato dalla primanota) - _pom->put("R9", acq_ies); - _pom->put("R10", acq_ies_iva); - _pum->put("R8", acq_pint); - _pum->put("R9", acq_pint_iva); - _pam->put("R10", spgen); - _pam->put("R11", spgen_iva); - _pom->put("R0", totintra); - _pom->put("R1", nond19_imp); - _pom->put("R2", nond19_iva); - _pom->put("R3", ammort_det); - _pom->put("R4", ammort_det_iva); - _pom->put("R5", acq_riv); - _pom->put("R6", acq_riv_iva); - _pom->put("R7", leasing); - _pom->put("R8", leasing_iva); - _pom->put("R11", ammort_indet); - _pom->put("R12", ammort_indet_iva); - _pum->put("R0", cess_amm); - _pum->put("R1", cess_amm_iva); - _pum->put("R2", ammort_6); - _pum->put("R3", ammort_6_iva); - _pum->put("R4", esenti_b1); - _pum->put("R5", esenti_b2); - _pum->put("R6", esenti_b3); - _pum->put("R7", esenti_b14); - _pum->put("R12", esni_rimb); - _pam->put("R0", acquisti); - _pam->put("R1", vendite); - _pam->put("R6", assp_imp); - _pam->put("R7", assp_iva); - _pam->put("R8", vssp_imp); - _pam->put("R9", vssp_iva); - _pam->put("R4", bdog_imp); - _pam->put("R5", bdog_iva); - - _plm->rewrite(); - _pam->rewrite(); - _pum->rewrite(); - _pom->rewrite(); -} - - -void TLiquidazione_app::write_liq(int month, const char* codatts) - // Calcolo liq. mensili e liq. annuali -{ - TToken_string atts(codatts); - const char* tmpatt; - - // liq. differita: considera mese precedente (solo per i risultati) - int deltam = month; - if (_isdifferita && !is_first_month(month) && month != 13) - month -= (_freqviva == "T" ? 3 : 1); - deltam -= month; - - real risultato = 0.0; - real detrazioni = 0.0; - real versamenti = 0.0; - real vers_int = 0.0; - real rimborsi = 0.0; - real rettifiche = 0.0; - real res_debt = 0.0; - real res_cred = 0.0; - real cred_prec = 0.0; - real debt_precd = 0.0; - real acc_dec = 0.0; - real iva_vend = 0.0; - real iva_acq = 0.0; - - // totali per agenzie viaggio - real c_iCEE = 0.0; - real c_eCEE = 0.0; - real a_iCEE = 0.0; - real a_eCEE = 0.0; - real c_mCEE = 0.0; - real a_mCEE = 0.0; - real a_meCEE = 0.0; - real cred_cost = 0.0; - real deb_mens = 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' - - while ((tmpatt = atts.get()) != NULL) - { - TString att(tmpatt); - - if (_isdifferita && is_first_month(month)) - { - // usa i totali del mese di dicembre dell'anno - // precedente - differita = TRUE; - TString yr(_year); - _year = format("%d", atoi(_year)-1); - if (!look_lim(12)) - { - _year = yr; - differita = FALSE; - } - } - if (differita) - { - if (attc == 0) - { - risultato = result_liq(12); - deb_mens = _lim->get_real("R3"); - detrazioni = _lim->get_real("R6"); - perc_r = _lim->get_real("R4"); - cred_cost = _lim->get_real("R2"); - rettifiche = _lim->get_real("R5"); - rimborsi = _lim->get_real("R1"); - // leggi anche tutti gli altri totali - acc_dec = _lim->get_real("R11"); - res_cred = _lim->get_real("R12"); - res_debt = _lim->get_real("R13"); - iva_vend = _lam->get_real("R0"); - iva_acq = _lam->get_real("R1"); - cred_prec = _lam->get_real("R2"); - debt_precd = _lam->get_real("R3"); - _year = format("%d", atoi(_year)+1); - } - } - else - { - for (int m = 1; m <= 13; m++) - { - // ciclo su tutti i mesi del caso (1 o 3; - // tutti se annuale) - if (!is_month_ok(m, month)) - continue; - - look_plm(m, att); - bool is_lim = look_lim(m); - - // gia' conteggiato: prorata - // da conteggiare: IVA vendite ag. viaggio - // a debito: IVA vendite, debito precedente - // a credito: IVA acquisti, ulteriori detrazioni 1 e 2 - - iva_vend += _plm->get_real("R0"); - iva_acq += _plm->get_real("R1"); - risultato += (_plm->get_real("R0") - _plm->get_real("R1")); - detrazioni+= (_plm->get_real("R3") + _plm->get_real("R4")); - res_debt += _plm->get_real("R0"); - res_cred += _plm->get_real("R1"); - - // detrazioni solo non in regime agricolo - if (!_isagricolo) - { - risultato -= (_plm->get_real("R3") + _plm->get_real("R4")); - res_cred += (_plm->get_real("R3") + _plm->get_real("R4")); - } - /* se annuale, somma versamenti mesi 1-12 - * solo una volta (non per tutte le attivita') - */ - if (attc == 0 && month == 13) - { - // l'acconto a dicembre si conteggia a parte solo - // nei casi previsti e non in annuale (vedi sotto) - real vs(versamenti_IVA(m , m == 12 ? "1" : "1|7")); - real vi(versamenti_IVA(m,"5")); - versamenti += vs; - vers_int += vi; - res_cred += vs + vi; - } - - /* - * rimborso se chiesto e previsto - */ - if (attc == 0 && is_lim) - { - risultato += _lim->get_real("R1"); - rimborsi += _lim->get_real("R1"); - res_debt += _lim->get_real("R1"); - } - /* - * rettifiche gia' col loro bravo segno - */ - if (attc == 0 && is_lim) - { - // se sono per benzinaro le conta solo in annuale, - // se no vanno solo in periodica - TString descrett(_lim->get("S0")); - bool isforbenzinaro = descrett[0] == '$' || - (descrett[0] == '>' && descrett[1] == '>'); - - if ((isforbenzinaro && _isannual) || - (!isforbenzinaro && !_isannual)) - { - risultato += _lim->get_real("R5"); - rettifiche += _lim->get_real("R5"); - if (_lim->get_real("R5").sign() < 0) - res_cred += abs(_lim->get_real("R5")); - else - res_debt += abs(_lim->get_real("R5")); - } - } - - /* totalizza importi 74 ter */ - if (_isviaggio) - { - // somma totali per calcolo successivo - c_iCEE += _plm->get_real("R5"); - c_eCEE += _plm->get_real("R6"); - a_iCEE += _plm->get_real("R7"); - a_eCEE += _plm->get_real("R8"); - c_mCEE += _plm->get_real("R9"); - a_mCEE += _plm->get_real("R10"); - a_meCEE += _plm->get_real("R11"); - } - } // fine ciclo sul mese - // counter attivita' per evitare troppi versamenti - attc++; - } // fine ciclo su attivita' - - if (!(_isdifferita && is_first_month(month))) - { - if (_isviaggio) - { - // calcolo credito costo, debito mensile, perc. ripart. - perc_r = (a_mCEE * CENTO)/(a_mCEE + a_meCEE); - real ivm = (c_mCEE * perc_r)/CENTO; ivm.round(ROUND_LIRA); - real tc = (c_iCEE + ivm); - real ta = (a_iCEE + a_mCEE); - real bi = tc - ta - credito_costo_prec(month); - - if (bi.sign() < 0) - // credito di costo - { - cred_cost = abs(bi); - cred_cost.round(ROUND_LIRA); - } - else - { - deb_mens = (bi /((CENTO + aliquota_agvia())/CENTO)) * - (aliquota_agvia()/CENTO); - deb_mens.ceil(ROUND_LIRA); // ceil voluto MI3074 - risultato += deb_mens; - res_debt += deb_mens; - iva_vend += deb_mens; - } - } - } - } - - if (!(_isdifferita && is_first_month(month))) - { - if (month < 13) - { - // toglie credito precedente - cred_prec = credito_prec(month); - risultato -= cred_prec; - res_cred += cred_prec; - // vedi se c'era un debito precedente per debiti < 50.000 - debt_precd = debt_prec(month); - risultato += debt_precd; - res_debt += debt_precd; - } - else - { - // per l'annuale considera solo il credito a inizio anno - cred_prec = credito_prec(1); - risultato -= cred_prec; - res_cred += cred_prec; - } - } else if (_isdifferita) - { - // TBI gestione struonza - } - - 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); - real vf1 = _pla->get_real("R14"); - real vf2(_pla->get("S1")); - real iaq = _pla->get_real("R11"); // IVA acquisti - real ppg = _pla->get_real("R12"); // 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(ROUND_LIRA); - 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 += abs(tot_cong); - - look_lim(month+deltam,TRUE); - // azzeriamo tutto (tranne r1, r5, s7) - TString codtab = _lim->get("CODTAB"); - - real r5 = _lim->get("R5"); - real r1 = _lim->get("R1"); - TString s7 = _lim->get("S7"); - - _lim->zero(); - _lim->put("CODTAB", codtab); - _lim->put("R1", r1); - _lim->put("R5", r5); - _lim->put("S7", s7); - - /* - * versamenti effettuati: si conteggiano in R0, - * sono > 0 solo se andavano calcolati (vedi sopra) - */ - risultato -= versamenti + vers_int; - /* - * acconto dicembre se previsto - */ - if ((month == 12 && _isbenzinaro) || - (month >= 12 && _freqviva == "M")) - { - risultato -= versamenti_IVA(12,"7"); - acc_dec = versamenti_IVA(12,"7"); - res_cred += acc_dec; - } - - // 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); - _lim->put("R3",deb_mens); - _lim->put("R4",perc_r); - - if (!_isagricolo) - _lim->put("R6",detrazioni); - else // per evitare sbagli nei ricalcoli esterni - _lim->put("R6",""); - - if (month == 13 || differita) - { - // scrivi totali rettifiche e rimborsi - // nella finale oppure se copiati da - // anno precedente - _lim->put("R1",rimborsi); - _lim->put("R5",rettifiche); - } - - /* - * Interessi dovuti solo da trimestrali in periodica, - * non benzinari - */ - if (_freqviva == "T" && risultato.sign() > 0 && - month < 13 && !_isbenzinaro) - { - real interesse = interesse_trimestrale(_month); - real ivi = risultato * (interesse / CENTO); - ivi.ceil(ROUND_LIRA); - _lim->put("R14", ivi); - } - - // questo serve anche per la visualizzazione e per l'estrazione deleghe - if (_freqviva == "T" && month != 13 && !_isbenzinaro) - _lim->put("R10",interesse_trimestrale(_month)); - - // totale conguaglio su tutte le attivita' - _lim->put("R7", tot_cong); - _lim->put("R8", versamenti); - _lim->put("R9", vers_int); - _lam->put("R0", iva_vend); - _lam->put("R1", iva_acq); - _lam->put("R2", cred_prec); - _lam->put("R3", debt_precd); - _lim->put("R11", acc_dec); - _lim->put("R12", res_cred); - _lim->put("R13", res_debt); - - - if (!_recalc_only) - _lim->put("B0","X"); - if (_isfinal) _lim->put("B1", "X"); - - _lim->rewrite(); - _lam->rewrite(); -} - -void TLiquidazione_app::recalc_annual(const char* att) -{ - // 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 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); - - look_pla(aaa); - volaff1 = _pla->get_real("R14"); - volaff2 = (const char*)_pla->get("S1"); - 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 = _pla->get_real("R12"); - iva_acq = _pla->get_real("R11"); - - for (_pim->first(); !_pim->eof(); _pim->next()) - { - if (_year != *_pim_anno) continue; - - int tipocr = atoi(*_pim_tipocr); - TString16 codiva = *_pim_codiva; - TString16 reg = *_pim_codreg; - look_iva(codiva); look_reg(reg); - - if ( // ESCLUSI: - strcmp(att,*_pim_codatt) != 0 || - (int)_reg->get_long("I0") != vendita || // non vendite - tipocr == 4 || // cessioni beni ammortizzabili - _iva->get("S1") == "NS" || // non soggetti - _iva->get("S0") == "B3" || // bi tre - _reg->get_bool("B1")) // sospensione di imposta - continue; - - if (tipoatt == 1) volaff1 += _pim->get_real("R0"); - else volaff2 += _pim->get_real("R0"); - } - - // calcola esenti, cessioni, lordo vendite, prorata pagato - // e IVA acquisti dai plm/ptm/pum/pam/pom - - for (int i = 1; i <= 13; i++) - { - if (!look_plm(i,aaa)) - continue; - - vendite += _pam->get_real("R1"); - iva_acq += _plm->get_real("R1"); - es_b1 += _pum->get_real("R4"); - es_b2 += _pum->get_real("R5"); - es_b3 += _pum->get_real("R6"); - cess_amm += _pum->get_real("R0"); - pro_pag += _plm->get_real("R2"); - } - - _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("R11", iva_acq); - _pla->put("R12", pro_pag); - _pla->put("R14", volaff1); - _pla->put("S1", volaff2.string()); - _pla->rewrite(); -} - +// ------------------------------------------------------------ +// Calcolo liquidazioni +// Part 2: calcolo +// fv 21-1-94 +// ------------------------------------------------------------ + +#include +#include +#include +#include +#include "cg4300.h" + +// -------------------- QUI comincia l'avventura -------------------------- +// Datemi un punto di appoggio ****************** +// e mi ci appoggero' ****************** +// ----------------------------------------------------- ****************** + +bool TLiquidazione_app::recalc_all() +{ + _prind = new TProgind(_selected.ones()*2, _printonly ? + " Stampa liquidazione... \n" + " Preparazione archivi \n" + " " : + " Calcolo liquidazione... \n" + " Preparazione archivi \n" + " ", + TRUE,TRUE,45); + + for (int l = 0; l < _ditte->items(); l++) + { + if (_prind->iscancelled()) + break; + + 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(); + _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 + // ***************** Previous kasin *************************** + // 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 + // ************************************************************ + + // strasemplificato: per l'annuale si sceglie annuale, altrimenti + // e' la 12ma anche per le trimestrali. + _isannual = _isriepilogo = _month == 13; + + TApplication::set_firm(nomeditta.get_long(1)); + _prind->addstatus(1); + + /* + * trimestrali impropriamente selezionate per mesi intermedi + * provocano il ricalcolo dei progressivi mensili ma non la stampa + */ + _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 (is_month_ok_strict(m) && (!look_lim(m) || !_lim->get_bool("B0"))) + { + need_refresh = TRUE; + break; + } + + if (need_refresh && yesno_box("Alcuni mesi precedenti non " + "risultano ricalcolati. E' consigliabile il ricalcolo. " + "Si desidera eseguirlo?")) + _recalc = ever; + } + + + for (int m = 1; m <= _month; m++) // fino a 13 compreso + if (is_month_plain(m) || _recalc == ever) + { + if (_prind->iscancelled()) break; + update_firm(m); + } + + // se ci sono altri mesi dopo l'ultimo calcolato, invalida il + // flag 'calcolato' del primo, per causare il ricalcolo dei + // successivi (evitando problemi per credito precedente) + for (m = _month+1; m <= 13; m++) + if (look_lim(m)) + { + _lim->put("B0",""); + _lim->rewrite(); + break; + } + + _month = save_month; + } + } + bool canc = _prind->iscancelled(); + if (!canc) _prind->addstatus(1); + + TApplication::set_firm(__firm); + delete _prind; _prind = NULL; + + return !canc; +} + +bool TLiquidazione_app::update_firm(int month, bool recalc) +{ + // Se recalc e' TRUE considera la necessita' di ricalcolare e le + // opzioni utente. Se FALSE se ne impipa dell'utente e ricalcola + // se necessario (serve nelle chiamate ricorsive) + // Ritorna FALSE soltanto se il ricalcolo era necessario e non e' + // stato effettuato per scelta dello stronzo commercialista. + + look_lim(liq_month(month), TRUE); + + if (_isregis && _lim->get_bool("B1") && _month != 13) + return TRUE; + + TConfig cnf(CONFIG_DITTA, "cg"); + _isdifferita = cnf.get_bool("GeLiDi") && _month != 13; + // controlla che il periodo corrente non sia l'inizio dell'attivita' + // nel caso, differita va a FALSE + TDate inatt(_nditte->lfile().get("DINIZIOATT")); + if (is_in_liq_period(inatt)) _isdifferita = FALSE; + + TConfig cnf1(CONFIG_STUDIO, "cg"); + _isricacq = cnf1.get_bool("RicAcq"); + + // ricalcolo normale + // lim c'e' solo per i trimestri + bool ok = _lim->get_bool("B0"); + if (ok && !recalc) return TRUE; + bool calc = (_recalc == ever || (_recalc == one && is_month_ok(month,_month))); + if (!calc && _recalc != never) calc = !ok; + bool gheravergot = FALSE; + bool quater = FALSE; + + TToken_string atts; + TToken_string cattivs; + + // azzera rimborsi + zero_firm(month); + + // casini per stampa minchie in coda ai registri + bool riepliq = FALSE; + bool stliq = FALSE; + + _nditte->save_status(); + if (_nditte->is_first_match(LF_ATTIV)) + { + char buf[256]; + do + { + TString16 codatt = _nditte->curr(LF_ATTIV).get("CODATT"); + TString80 desatt = _nditte->curr(LF_ATTIV).get("DESCR"); + quater = _nditte->curr().get_bool("FLIVA11Q"); + + // attivita' mista: ce ne sono in realta' due + // viene calcolato nel ciclo su tipoatt (che viene ripetuto solo + // se diventa TRUE); + _mixed = FALSE; + + sprintf (buf, _printonly ? "Stampa liquidazione (%d)...\n%s: %s\n" : + "Calcolo liquidazione (%d)...\n%s: %s\n", + month, + (const char*)_nditte_r->get("RAGSOC"), + (const char*)desatt); + + if (_prind) _prind->set_text(buf); + + // se ricalcola l'annuale si tiene tutte le vendite e corrispettivi di + // tutti i lerci mesi + if (!(_month == 13 && month > 1)) + { + _vend_arr.destroy(); + _corr_arr.destroy(); + } + + cattivs = ""; + + for (int tipoatt = 1; tipoatt <= (_mixed ? 2 : 1); tipoatt++) + { + TString cattiv(codatt); bool waspla; + + cattiv << tipoatt; + if (tipoatt == 1 && (waspla = look_pla(cattiv, FALSE))) + { + _p8 = _pla->get_real("R5"); + _p8b = _pla->get_real("R6"); + _p9 = _pla->get_real("R7"); + _prorata = _pla->get_real("R8"); + _isplafond = !(_p8.is_zero() && _p8b.is_zero() && + _p9.is_zero()); + _isservizio = _pla->get("S7") == "S"; + _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"); + _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("R13",""); + _pla->put("R9",""); + _pla->put("R10",""); + _pla->put("R11",""); + _pla->put("R12",""); + _pla->put("R14",""); + _pla->put("S1","0"); + _pla->put("S2","0"); + _pla->put("S3","0"); + _pla->rewrite(); + } + + + for (_reg->first(); _reg->good(); _reg->next()) + { + if (codatt == _reg->get("S8") || quater) // TBC quater: e' una pezza ma andra' cambiato + { + if (!riepliq) riepliq = _reg->get_bool("B6"); + if (!stliq) stliq = _reg->get_bool("B7"); + if (_reg->get_int("I0") == 2) + if (!_isvent) _isvent = _reg->get_bool("B3"); + } + } + + if (!_isregis) + stliq = riepliq = TRUE; + + if (calc || !recalc) + if (!update_att(month, cattiv) && stliq) + describe_error("Attivita' non ricalcolate: possibili errori", + codatt); + + // vediamo se c'e' qualcosa da raccontare + gheravergot = _isannual || _isriepilogo; + if (!gheravergot) + { + look_plm(month,cattiv); + gheravergot = !_plm->get_real("R0").is_zero() || + !_plm->get_real("R1").is_zero(); + } + + if (month == _month && riepliq) + describe_att(month, cattiv, gheravergot, + '0' + (_mixed ? tipoatt : 0)); + + atts.add(cattiv); + cattivs.add(cattiv); + } // for tipoatt + + // se attivita' mista stampa riepilogo + if (_mixed && month == _month && riepliq) + describe_att(month,cattivs, TRUE, 'M'); + } + while (_nditte->next_match(LF_ATTIV)); + + // se quater stampa riepilogo + if (quater && month == _month && riepliq) + describe_att(month,atts, TRUE, 'Q'); + + // occorre poterla chiamare altre volte con mesi diversi + _nditte->restore_status(); + + // aggiorna le liquidazioni + if (calc || !recalc) + if (is_month_ok_strict(month) || month == 13) + write_liq(month, atts); + + // rimborso infraannuale + _DescrItem* rimb_d = NULL; + if (month == _month) + { + // unica nel suo genere, recalc_rimborso ritorna + // un bel descritem (NULL se non si rimborsa un cas) + // da passare a describe_liq + rimb_d = recalc_rimborso(month,atts, stliq); + } + + if (month == _month && stliq) + { + describe_firm(month); + describe_liq(_month, atts, _isregis ? NULL : rimb_d); + } + } + return ok || calc; +} + +bool TLiquidazione_app::update_att(int month, const char* codatt, + bool recalc) + // viene passato un codice attivita' con codatt+tipoatt + // vedi update_firm per il burdel dei calc e recalc + // occhecasino. Se _comp_acconto e' TRUE, i movimenti considerati + // saranno solo quelli di dicembre per data <= 20/12; + // il ricalcolo e' FORZATO da _recalc messo a one +{ + look_plm(month, codatt, TRUE); + bool ok = _plm->get_bool("B0"); + if (ok && !recalc) return TRUE; + bool calc = _recalc == ever || (_recalc == one && is_month_ok(month,_month)); + if (!calc && _recalc != never) calc = !ok; + + if (calc || !recalc) + { + zero_att(month,codatt); + recalc_att(month,codatt); + if (!_isagricolo) + { + recalc_ventilation(month, codatt); + recalc_corrispettivi(month, codatt); + } + if (month == 13) + recalc_annual(codatt); + } + return ok || calc; +} + +void TLiquidazione_app::zero_firm(int month) +{ + // nothing more, left for sicurezz +} + +void TLiquidazione_app::zero_att(int month, const char* codatt) +{ + for (_pim->first(); !_pim->eof(); _pim->next()) + { + int m = atoi(*_pim_mese); + TString att = (const char*)*_pim_codatt; + if (m == month && att == codatt) + { + _pim->put("R0",""); + _pim->put("R1",""); + _pim->put("R2",""); + _pim->put("R3",""); + _pim->put("R4",""); + _pim->put("R5",""); + _pim->put("R6",""); + _pim->put("R7",""); + _pim->put("R8",""); + _pim->put("R9",""); + _pim->put("R10",""); + _pim->put("R11",""); + _pim->put("R12",""); + _pim->put("R13",""); + _pim->put("R14",""); + _pim->put("S1",""); + _pim->put("S2",""); + _pim->rewrite(); + } + } + if (look_plm(month, codatt)) + { + // zero PLM, POM, PAM, PUM + TString codtab(_plm->get("CODTAB")); + _plm->zero(); + _pom->zero(); + _pam->zero(); + _pum->zero(); + _plm->put("CODTAB", codtab); + _pom->put("CODTAB", codtab); + _pam->put("CODTAB", codtab); + _pum->put("CODTAB", codtab); + _plm->rewrite(); + _pam->rewrite(); + _pom->rewrite(); + _pum->rewrite(); + } + if (_isplafond && month != 13) + zero_plafond(month,codatt); +} + +void TLiquidazione_app::recalc_att(int month, const char* codatt) + // il codatt passato e' codice att + tipo att ( IN {1|2} ) + // occhecasino. Se _comp_acconto e' TRUE, i movimenti considerati + // saranno solo quelli di dicembre per data <= 20/12; +{ + real totintra = 0.0; + real nond19_imp = 0.0; + real nond19_iva = 0.0; + real ammort_det = 0.0; + real ammort_det_iva = 0.0; + real ammort_indet = 0.0; + real ammort_indet_iva = 0.0; + real ammort_6 = 0.0; + real ammort_6_iva = 0.0; + real acq_riv = 0.0; + real acq_riv_iva = 0.0; + real leasing = 0.0; + real leasing_iva = 0.0; + real cess_amm = 0.0; + real cess_amm_iva = 0.0; + real acquisti = 0.0; + real acquisti_iva = 0.0; + real vendite = 0.0; + real vendite_iva = 0.0; + real esenti_b1 = 0.0; + real esenti_b2 = 0.0; + real esenti_b3 = 0.0; + real esenti_b14 = 0.0; + real esni_rimb = 0.0; // ci sommo tutti esenti e ni validi per rimborso + real corr_CEE = 0.0; + real corr_noCEE = 0.0; + real acq_CEE = 0.0; + real acq_noCEE = 0.0; + real corr_misCEE = 0.0; + real acq_misCEE = 0.0; + real acq_misnoCEE = 0.0; + real agr_1i = 0.0; + real agr_2i = 0.0; + real agr_1 = 0.0; + real agr_2 = 0.0; + real agr_3 = 0.0; + real agr_4 = 0.0; + real agr_5 = 0.0; + real agr_6 = 0.0; + real agr_7 = 0.0; + real acq_ies = 0.0; + real acq_ies_iva = 0.0; + real ult_detr = 0.0; + real acq_pint = 0.0; + real acq_pint_iva = 0.0; + real spgen = 0.0; + real spgen_iva = 0.0; + real assp_imp = 0.0; + real assp_iva = 0.0; + real vssp_imp = 0.0; + real vssp_iva = 0.0; + real bdog_imp = 0.0; + real bdog_iva = 0.0; + + *_cur = 0; + long items = _cur->items(); + TString trueatt(codatt); + int tipatt = atoi(trueatt.sub(5)); + trueatt = trueatt.left(5); + + for (; _cur->pos() < items; ++(*_cur)) + { + TDate date(_mov->get("DATAREG")); + TString16 reg = _mov->get("REG"); + bool isreg = look_reg(_mov->get("REG")); + TString16 tipodoc = _mov->get("TIPODOC"); + /* + * check register present, rmoviva present and date OK + */ + const bool dok = !is_date_ok(date, month); + const bool sreg = !isreg; + const bool rs8 = _reg->get("S8") != trueatt; + const bool cmt = !_cur->is_first_match(LF_RMOVIVA); + const bool sosp_imp = _reg->get_bool("B1"); + const TRectype& rcs = _cur->curr(LF_CAUSALI); + const bool fattrit = rcs.get_bool("RITFATT"); + + // for degiubbing only + int numreg = _rmoviva->get_int("NUMREG"); + + if (dok || sreg || rs8 || cmt) continue; + + /* + * Tipo documento da eliminare (Scudler 1994) + * Trattasi per lo piu' di non incassati + */ + if (tipodoc == "SN" || tipodoc == "CN" || tipodoc == "RN" || + tipodoc == "IN" || tipodoc == "PG") + continue; + + /* + * check date: se si calcola l'acconto, solo da 1/12 a 20/12 + */ + int accmonth = _isdifferita ? 11 : 12; + if (_comp_acconto && date.month() != accmonth && date.day() > 20) + continue; + + bool corrisp = _reg->get_bool("B0"); + tiporeg tipomov = (tiporeg)_reg->get_long("I0"); + + do + { + look_iva(_rmoviva->get("CODIVA")); + + // totali parziali registrati nei pim per motivi ignoti + real bolld_imp = 0.0; // imponibile bolle doganali + real bolld_iva = 0.0; // imposta bolle doganali + real asimp_imp = 0.0; // imponibile acquisti sosp. imposta + real asimp_iva = 0.0; // imposta acquisti sosp. imposta + real vsimp_imp = 0.0; // imponibile vendite sosp. imposta + real vsimp_iva = 0.0; // imposta vendite sosp. imposta + real rit_imp = 0.0; // imponibile fatture in ritardo + real rit_iva = 0.0; // IVA fatture in ritardo + + 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")); + int tipoag = atoi(_iva->get("S5")); + int tipopla = atoi(_iva->get("S3")); + int tipodet = atoi(_rmoviva->get("TIPODET")); + bool isrimbinfr = _iva->get_bool("B3"); // vale per calcolo rimborso se ES o NI + bool ivarimb = !_iva->get_bool("B4"); // non escluso calcolo rimb. per al. media + TString tipocr_s = _rmoviva->get("TIPOCR"); + int tipocr = atoi(tipocr_s); + real imponibile = _rmoviva->get_real("IMPONIBILE"); + real imposta = _rmoviva->get_real("IMPOSTA"); + bool intra = _rmoviva->get_bool("INTRA"); + int tipoatt = _rmoviva->get_int("TIPOATT"); + int rigaimp = _rmoviva->get_int("RIGAIMP"); + // autofatture art. 17 per non residenti, con trattamento + // speciale in liquidazione annuale + bool autodafe = (tipodoc == "AF" && tipocr == 4); + // indica acquisti per rivendita; viene messo in B4 di PIM per + // indicare che e' soggetto al ricalcolo IVA (se voluto) in modo + // da evitare di dover controllare mese e anno sul PIM + bool was_riv = FALSE; + /* + * puo' capitare per motivi brutalmente prassici + * SENSU Sergio 1995, Guido + */ + if (tipoatt == 0) tipoatt = 1; + + if(tipoatt != tipatt) continue; + + /* + * Riga imponibile > 9 = ritenute; non si + * considerano (Scudler 1994) + */ + if(rigaimp > 9) continue; + + /* + * In liq. annuale si totalizzano + * solo le stranezze che seguono + */ + 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")); + /* + * Fatture in ritardo vengono considerate solo in dichiarazione + * annuale, ma vanno comunque sommate per i porci registri + */ + if (!(okc && (cond1 || cond2)) && !fattrit) + continue; + } + + + if (sosp_imp) // sospensione di imposta + { + if (tipomov == vendita) + { + vsimp_imp = imponibile; + vsimp_iva = imposta; + } + else + { + asimp_imp = imponibile; + asimp_iva = imposta; + } + assp_imp += asimp_imp; + assp_iva += asimp_iva; + vssp_imp += vsimp_imp; + vssp_iva += vsimp_iva; + } + else if (fattrit && month != 13) + { + rit_imp = imponibile; + rit_iva = imposta; + } + else if (!fattrit) // normale + { + + // ***************************************** + // casi particolari + // ***************************************** + + // imposta acquisti intracomunitari + if (tipomov == acquisto && intra) + totintra += imposta; + + // Altre cose di cui tener conto + if (tipomov == acquisto && (tipocr == 1 || tipocr == 5)) + /* + * Acquisto beni per rivendita + */ + { + acq_riv += imponibile; + acq_riv_iva += imposta; + was_riv = TRUE; + } + + else if (tipomov == acquisto && tipocr == 2 && tipodet == 0) + // Acquisto beni ammortizzabili detraibili + { + ammort_det += imponibile; + ammort_det_iva += imposta; + } + else if (tipomov == acquisto && tipocr == 2 && tipodet != 0) + // Acquisto beni ammortizzabili indetraibili + { + ammort_indet += imponibile; + ammort_indet_iva += imposta; + } + else if (tipomov == acquisto && tipocr == 3) + // Acquisto beni ammortizzabili detr. 6% + { + ammort_6 += imponibile; + ammort_6_iva += imposta; + ult_detr += imponibile * real(DETRAZIONE_6PERCENTO); + } + else if (tipomov == vendita && tipocr == 4) + /* + * Vendite strum. art 17 (cess. amm.) + * Comprende anche autofatture, anche nell'annuale + * (Sergio 1995) + */ + { + cess_amm += imponibile; + cess_amm_iva += imposta; + } + else if (tipomov == acquisto && tipocr == 8) + // Acquisto beni strum. acquisiti in leasing + { + leasing += imponibile; + leasing_iva += imposta; + } + else if (tipomov == acquisto && tipocr == 9) + // Spese generali + { + spgen += imponibile; + spgen_iva += imposta; + } + + // operazioni per calcolo rimborso infracazzuale + // Scudler 1995 + // La breve estate vissuta dal metodo del 51% renderebbe + // ora superflua la tabella rimborsi, ma, come diceva + // Garcia Lorca, me ne sbatto il culo e se non ti piace + // vatti a far chiavare da un coyote + // Non mi piaceva, il coyote non era intenzionato, e + // quindi l'ho tolta, anche perche' non funzionava piu' + // per i ventilati e per gli 'aggiustati' dopo il calcolo + if (ivarimb) + { + bool ok = _isagricolo ? tipoagr == 2 : FALSE; + + if (tipomov == acquisto && !ok) + ok = (tipocr == 0 || tipocr == 1 || tipocr == 5 || tipocr == 9); + + if (tipomov == vendita && !ok) + ok = tipoiva != "NS" && tipocr != 4; + + ivarimb = ok; + } + + // operazioni esenti + if (tipoiva == "ES") + { + if (tipomov == vendita) + { + switch(tipoes_v) + { + case 1: + esenti_b1 += imponibile; + break; + case 2: + esenti_b2 += imponibile; + break; + case 3: + esenti_b3 += imponibile; + break; + } + // se e' il caso sommare esenti per rimborso + if (isrimbinfr) + esni_rimb += imponibile; + } + else if (tipoes_a == 14) + esenti_b14 += imponibile; + } + + // non imponibili per rimborso + if (tipoiva == "NI" && tipomov == vendita && isrimbinfr) + esni_rimb += imponibile; + + // bolle doganali + if (tipodoc == "BD") + { + bolld_imp = imponibile; + bolld_iva = imposta; + + bdog_imp += bolld_imp; + bdog_iva += bolld_iva; + } + + // plafond + if (_isplafond && tipomov == acquisto && month != 13 && + tipoiva == "NI" && tipopla != 0) + { + add_plafond(month, codatt, tipopla, imponibile, tipodoc == "BD"); + } + + // agenzie viaggio (CHECK imponibili etc.) + if (_isviaggio) + switch (tipoag) + { + case 1: + if (tipomov == acquisto) acq_CEE += imponibile + imposta; + else corr_CEE += imponibile + imposta; + break; + case 2: + if (tipomov == acquisto) acq_noCEE += imponibile + imposta; + else corr_noCEE += imponibile + imposta; + break; + case 3: corr_misCEE += imponibile + imposta; break; + case 4: acq_misCEE += imponibile + imposta; break; + case 5: acq_misnoCEE += imponibile + imposta; break; + } + + + if (_isagricolo) + { + /* + * rifatto sensu Scudler 1995 con invidiabile sicurezza + * senza porsi domande e mettendo NUMERI uguali + * al TIPO RECORD del frigorifero + */ + if (tipomov == vendita) + { + if (tipoagr == 1 || tipoagr == 3) + { + agr_1 += imposta; + agr_1i += imponibile; + } + else if (tipoagr == 2) + { + agr_2 += imposta; + agr_2i += imponibile; + } + } + else if (tipodet == 0) + { + if (tipoagr == 2) + { + if (tipocr != 2 && tipocr != 3 && tipocr != 8) + agr_3 += imposta; + else + agr_4 += imposta; + } + else if (tipoagr == 3) + { + if (tipocr != 2 && tipocr != 3 && tipocr != 8) + agr_7 += imposta; + } + else // ne' 2 ne' 3 + { + if (tipocr != 2 && tipocr != 3 && tipocr != 8) + agr_5 += imposta; + else + agr_6 += imposta; + } + } + } + + if (tipodet == 1) // acquisti indeducibili su ricavi esenti art. 10 + { + acq_ies += imponibile; + acq_ies_iva += imposta; + } + + if (tipodet == 3) // passaggi interni (solo per ventilaz) + { + acq_pint += imponibile; + acq_pint_iva += imposta; + } + + // acquisti non detraibili art. 19 + // possono valere per la ventilazione + if (tipodet == 9) + { + nond19_imp += imponibile; + nond19_iva += imposta; + } + + // ***************************************** + // Fine casi particolari + // Non che i casi normali siano tanto meglio + // ***************************************** + } // non sosp_imp + /* + * Calcolo e aggiornamento + * cerca o crea progressivo IVA + */ + look_pim(month, codatt, reg, tipocr_s, codiva, tipodet, TRUE); + + /* + * se ign == TRUE non bisogna neppure PROGRESSIVARLI + */ + bool ign = sosp_imp || (fattrit && month != 13); + + /* + * se liq == FALSE gli importi non contano ai fini + * del calcolo liquidazione + */ + bool liq = !(tipodet == 1 || tipodet == 3 || tipodet == 9 || ign); + + + real imp = _pim->get_real("R0"); // imponibile + real ivp = _pim->get_real("R1"); // IVA su imp. + real lor = _pim->get_real("R2"); // lordo + + /* + * le maledette fatture con scontrino sono sul registro dei + * corrispettivi, ma vanno riportate nelle vendite in stampa; + * dunque, le sommiamo in R5 e R6 di PIM anche se continuiamo + * a sommarle anche in R0 e R1. La stampa (describe_pim) + * dovra' scorporarle + */ + real ifs = _pim->get_real("R5"); // imponibile fatture con scontrino + real vfs = _pim->get_real("R6"); // IVA fatt. con scontrino + + /* + * le maledette autofatture non residenti art. 17 + * vedi al calcolo if (autodafe) si tengono da parte + * La stampa le scorpora solo IN SEDE di dichiarazione annuale + * NELL'OTTICA di una PIU' CORRETTA e CONSONA ...................... + */ + real adf = _pim->get_real("R7"); + real adi = _pim->get_real("R8"); + + /* le fottute fatture in sospensione di imposta */ + real fsi = _pim->get_real("R11"); + real fsv = _pim->get_real("R12"); + + /* le putride bolle doganali */ + real bdi = _pim->get_real("R9"); + real bdv = _pim->get_real("R10"); + + /* i luridi falsi corrispettivi */ + real fci = _pim->get_real("R13"); + real fcv = _pim->get_real("R14"); + + /* le porche fatture in ritardo */ + TToken_string fr(_pim->get("S1")); + real rti(fr.get(0)); + real rtv(fr.get(1)); + + /* la stramadonna dei corrispettivi gia' scorporati */ + TToken_string cs(_pim->get("S2")); + real csi(cs.get(0)); + real csv(cs.get(1)); + + rti += rit_imp; + rtv += rit_iva; + + if (tipomov == vendita) + { + fsi += vsimp_imp; + fsv += vsimp_iva; + } + else + { + fsi += asimp_imp; + fsv += asimp_iva; + bdi += bolld_imp; + bdv += bolld_iva; + } + + if (liq && tipomov == vendita && !corrisp) + // i corrispettivi sono gestiti a parte + { + // totale vendite + vendite += imponibile; + vendite_iva += imposta; + } + else if (liq && tipomov == acquisto) + { + // totale acquisti + acquisti += imponibile; + acquisti_iva += imposta; + } + + // corrispettivi + bool true_corrisp = FALSE; + if (corrisp) + { + /* + * ennesimo casino: non tutti i corrispettivi sono + * corrispettivi; in effetti, alcuni corrispettivi + * non sono corrispettivi. Ci si potrebbe domandare + * se gli altri corrispettivi sono corrispettivi o + * no; ebbene, gli altri corrispettivi risultano + * fortunatamente essere corrispettivi, a meno di + * indicazioni contrarie. + */ + if (tipodoc == "CR" || tipodoc == "RF" || tipodoc == "SC") + { + true_corrisp = TRUE; + _pim->put("I0",LORDO); + // questi sono corrispettivi davvero; comportamento normale + if (tipoiva == "VE") // da ventilare + { + lor += imponibile; + add_vendite(month, reg, tipodet, imponibile); + } + else // non da ventilare, con imposta gia' conteggiata + { + real perc = _iva->get_real("R0")/CENTO; + lor += imponibile + imposta; + real tot = imponibile+imposta; + if (liq) add_corrisp(month, reg, tot, perc, tipodet, codiva, codatt); + } + } + else if (tipodoc == "FS") + { + // queste sono fatture che seguono scontrino, il lordo va detratto + // perche' si e' gia' registrato lo scontrino medesimo + true_corrisp = TRUE; // non e' vero ma non devono essere sommate ai falsi + // corrispettivi + if (tipoiva == "VE") + { + real rr = imponibile + imposta; + imp += rr; + if (liq) + vendite += rr; + add_vendite(month, reg, tipodet, rr); + } + imp -= imponibile; + ivp -= imposta; + lor -= imponibile + imposta; + ifs += imponibile; + vfs += imposta; + csi += imponibile; + csv += imposta; + } + else // vendite normali a tutti gli effetti + { + if (liq) + { + vendite += imponibile; + vendite_iva += imposta; + } + imp += imponibile; + ivp += imposta; + fci += imponibile; + fcv += imposta; + csi += imponibile; + csv += imposta; + _pim->put("I0",NETTO); + } + } // if corrisp + else // non corrisp + { // imponibile e imposta separata + imp += imponibile; + ivp += imposta; + _pim->put("I0",NETTO); + } + + if (autodafe) // autofatture non residenti art, 17 + { + /* + * Si devono riportare a parte in annuale + * e non comparire nel riepilogo del codice IVA + * corrispondente, solo se la liq. e' annuale + * Li metto in R7/R8 di pim e li sommo anche nelle + * vendite; la describe_pim() dovra' sommarli su tutti i + * pim, scorporarli dalle rispettive vendite + * e assegnarli al codice IVA A35 in caso di liq. annuale + */ + adf += imponibile; + adi += imposta; + } + + if (corrisp && !true_corrisp) + { + fci += imponibile; + fcv += imposta; + } + + if (!ign) + { + _pim->put("R0",imp); + _pim->put("R1",ivp); + _pim->put("R2",lor); + _pim->put("R5",ifs); + _pim->put("R6",vfs); + _pim->put("R7",adf); + _pim->put("R8",adi); + _pim->put("R9",bdi); + _pim->put("R10",bdv); + _pim->put("R13",fci); + _pim->put("R14",fcv); + } + + // questi servono per i ricalcoli altrui (classify_pim) o + // per trucchetti di ricalcolo successivi + _pim->put("R11",fsi); + _pim->put("R12",fsv); + _pim->put("I1", (long)tipomov); + _pim->put("B3", ivarimb ? "X" : ""); + _pim->put("B4", (_isricacq && was_riv) ? "X" : ""); + _pim->put("S5", tipoiva); + + // fatture in ritardo + fr.add(rti.string(), 0); + fr.add(rtv.string(), 1); + _pim->put("S1",fr); + + // corrispettivi gia' scorporati; anche questi servono per + // non cannare la stampa dei registri + cs.add(csi.string(), 0); + cs.add(csv.string(), 1); + _pim->put("S2",cs); + _pim->rewrite(); + } + while (_cur->next_match(LF_RMOVIVA)); + } // fine calcolo progressivi IVA + + /* + * calcolati tutti i movimenti e aggiornati i pim + * se necessario risistema le imposte acquisti beni + * per rivendita + */ + + if (_isricacq) // flag settato parametri studio + { + for (_pim->first(); !_pim->eof(); _pim->next()) + { + // this is much furber than doing all of the checks + if (_pim->get_bool("B4")) + { + // ricalcola l'imposta a partire dal codice IVA + look_iva(*_pim_codiva); + real old_iva = _pim->get_real("R1"); + real perc = _iva->get_real("R0"); + + real new_iva = (_pim->get_real("R0") * perc)/CENTO; + new_iva.ceil(ROUND_LIRA); // TBC check ceil + + if (new_iva != old_iva) + { + // ricalcola: acquisti_iva, acq_riv_iva + acquisti_iva -= old_iva; + acquisti_iva += new_iva; + acq_riv_iva -= old_iva; + acq_riv_iva += new_iva; + _pim->put("R1", new_iva); + // resetta in modo da non vederlo il mese dopo + _pim->put("B4", ""); + _pim->rewrite(); + } + } + } + } + + /* + * calcola il lercio prorata + * solo se liq. periodica + */ + real prorata; + if (!_prorata.is_zero() && month != 13) + { + prorata = acquisti_iva * (_prorata / CENTO); + prorata.round(ROUND_LIRA); + acquisti_iva -= prorata; + } + look_plm(month, codatt, TRUE); + + /* + * ACHTUNG: l'iva sulle vendite e' calcolata sommando anche i + * corrispettivi che sono corrispettivi, a differenza dei corrispettivi + * che non sono corrispettivi, ma tanto quelli (come si sa) non sono + * corrispettivi. Dunque, non si tiene conto delle imposte calcolate + * con la ventilazione (che vanno sottratte) ne' di quelle + * calcolate per le agenzie di viaggio (che sembra non vadano + * comunque sottratte nel calcolo del volume di affari) + */ + + _plm->put("R2", prorata); + + if (_isviaggio) + { + real deb_mens = 0.0; + _plm->put("R5", corr_CEE); + _plm->put("R6", corr_noCEE); + _plm->put("R7", acq_CEE); + _plm->put("R8", acq_noCEE); + _plm->put("R9", corr_misCEE); + _plm->put("R10",acq_misCEE); + _plm->put("R11",acq_misnoCEE); + + // ---- NOTA BENE ------------------------ + // l'iva vendite nei plm non comprende + // l'iva agenzie di viaggio, calcolata + // in liquidazione (mensile o trimestrale) + // --------------------------------------- + // Mod 7/7/95: calcolo effettuato anche qui, in modo da + // avere l'IVA dovuta per riportarla nei progressivi + // Dato che il resto funziona non tocco nulla, ovvero + // duplico il calcolo di write_liq, nella remota ipotesi + // che ci siano due o piu' attivita' e siano tutte + // agenzie di viaggio + real perc_r = (acq_misCEE * CENTO)/(acq_misCEE + acq_misnoCEE); + real ivm = (corr_misCEE * perc_r)/CENTO; ivm.round(ROUND_LIRA); + real tc = (corr_CEE + ivm); + real ta = (acq_CEE + acq_misCEE); + real bi = tc - ta - credito_costo_prec(month); + + if (bi.sign() > 0) + { + deb_mens = (bi /((CENTO + aliquota_agvia())/CENTO)) * + (aliquota_agvia()/CENTO); + deb_mens.ceil(ROUND_LIRA); // ceil voluto MI3074 + } + _pom->put("R13", deb_mens); + } + else if (_isagricolo) + { + _plm->put("R5", agr_1); + _plm->put("R6", agr_2); + _plm->put("R7", agr_3); + _plm->put("R8", agr_4); + _plm->put("R9", agr_5); + _plm->put("R10", agr_6); + _plm->put("R11", agr_7); + _pum->put("R10", agr_1i); + _pum->put("R11", agr_2i); + + // Il porco agricoltore spende poco e paga meno + vendite_iva = agr_2; + acquisti_iva = agr_3; + + // nuovo calcolo IVA detraibile + if (!agr_7.is_zero()) + { + real pdetr = (agr_2i / (agr_1i + agr_2i)); + pdetr.round(2); + acquisti_iva += agr_7 * pdetr; + acquisti_iva.round(ROUND_LIRA); + } + } + + _plm->put("R0", vendite_iva); + _plm->put("R1", acquisti_iva); + _plm->put("R3", ult_detr); + // probabilmente R4 serviva per il decalage e non si usera' + _plm->put("R12", _prorata); // per comodita' in stampa + _plm->put("B0", "X"); // calcolato (invalidato dalla primanota) + _pom->put("R9", acq_ies); + _pom->put("R10", acq_ies_iva); + _pum->put("R8", acq_pint); + _pum->put("R9", acq_pint_iva); + _pam->put("R10", spgen); + _pam->put("R11", spgen_iva); + _pom->put("R0", totintra); + _pom->put("R1", nond19_imp); + _pom->put("R2", nond19_iva); + _pom->put("R3", ammort_det); + _pom->put("R4", ammort_det_iva); + _pom->put("R5", acq_riv); + _pom->put("R6", acq_riv_iva); + _pom->put("R7", leasing); + _pom->put("R8", leasing_iva); + _pom->put("R11", ammort_indet); + _pom->put("R12", ammort_indet_iva); + _pum->put("R0", cess_amm); + _pum->put("R1", cess_amm_iva); + _pum->put("R2", ammort_6); + _pum->put("R3", ammort_6_iva); + _pum->put("R4", esenti_b1); + _pum->put("R5", esenti_b2); + _pum->put("R6", esenti_b3); + _pum->put("R7", esenti_b14); + _pum->put("R12", esni_rimb); + _pam->put("R0", acquisti); + _pam->put("R1", vendite); + _pam->put("R6", assp_imp); + _pam->put("R7", assp_iva); + _pam->put("R8", vssp_imp); + _pam->put("R9", vssp_iva); + _pam->put("R4", bdog_imp); + _pam->put("R5", bdog_iva); + + _plm->rewrite(); + _pam->rewrite(); + _pum->rewrite(); + _pom->rewrite(); +} + + +void TLiquidazione_app::write_liq(int month, const char* codatts) + // Calcolo liq. mensili e liq. annuali +{ + TToken_string atts(codatts); + const char* tmpatt; + + // liq. differita: considera mese precedente (solo per i risultati) + int deltam = month; + if (_isdifferita && !is_first_month(month) && month != 13) + month -= (_freqviva == "T" ? 3 : 1); + deltam -= month; + + real risultato = 0.0; + real detrazioni = 0.0; + real versamenti = 0.0; + real vers_int = 0.0; + real rimborsi = 0.0; + real rettifiche = 0.0; + real res_debt = 0.0; + real res_cred = 0.0; + real cred_prec = 0.0; + real debt_precd = 0.0; + real acc_dec = 0.0; + real iva_vend = 0.0; + real iva_acq = 0.0; + + // totali per agenzie viaggio + real c_iCEE = 0.0; + real c_eCEE = 0.0; + real a_iCEE = 0.0; + real a_eCEE = 0.0; + real c_mCEE = 0.0; + real a_mCEE = 0.0; + real a_meCEE = 0.0; + real cred_cost = 0.0; + real deb_mens = 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' + + while ((tmpatt = atts.get()) != NULL) + { + TString att(tmpatt); + + if (_isdifferita && is_first_month(month)) + { + // usa i totali del mese di dicembre dell'anno + // precedente + differita = TRUE; + TString yr(_year); + _year = format("%d", atoi(_year)-1); + if (!look_lim(12)) + { + _year = yr; + differita = FALSE; + } + } + if (differita) + { + if (attc == 0) + { + risultato = result_liq(12); + deb_mens = _lim->get_real("R3"); + detrazioni = _lim->get_real("R6"); + perc_r = _lim->get_real("R4"); + cred_cost = _lim->get_real("R2"); + rettifiche = _lim->get_real("R5"); + rimborsi = _lim->get_real("R1"); + // leggi anche tutti gli altri totali + acc_dec = _lim->get_real("R11"); + res_cred = _lim->get_real("R12"); + res_debt = _lim->get_real("R13"); + iva_vend = _lam->get_real("R0"); + iva_acq = _lam->get_real("R1"); + cred_prec = _lam->get_real("R2"); + debt_precd = _lam->get_real("R3"); + _year = format("%d", atoi(_year)+1); + } + } + else + { + for (int m = 1; m <= 13; m++) + { + // ciclo su tutti i mesi del caso (1 o 3; + // tutti se annuale) + if (!is_month_ok(m, month)) + continue; + + look_plm(m, att); + bool is_lim = look_lim(m); + + // gia' conteggiato: prorata + // da conteggiare: IVA vendite ag. viaggio + // a debito: IVA vendite, debito precedente + // a credito: IVA acquisti, ulteriori detrazioni 1 e 2 + + iva_vend += _plm->get_real("R0"); + iva_acq += _plm->get_real("R1"); + risultato += (_plm->get_real("R0") - _plm->get_real("R1")); + detrazioni+= (_plm->get_real("R3") + _plm->get_real("R4")); + res_debt += _plm->get_real("R0"); + res_cred += _plm->get_real("R1"); + + // detrazioni solo non in regime agricolo + if (!_isagricolo) + { + risultato -= (_plm->get_real("R3") + _plm->get_real("R4")); + res_cred += (_plm->get_real("R3") + _plm->get_real("R4")); + } + /* se annuale, somma versamenti mesi 1-12 + * solo una volta (non per tutte le attivita') + */ + if (attc == 0 && month == 13) + { + // l'acconto a dicembre si conteggia a parte solo + // nei casi previsti e non in annuale (vedi sotto) + real vs(versamenti_IVA(m , m == 12 ? "1" : "1|7")); + real vi(versamenti_IVA(m,"5")); + versamenti += vs; + vers_int += vi; + res_cred += vs + vi; + } + + /* + * rimborso se chiesto e previsto + */ + if (attc == 0 && is_lim) + { + risultato += _lim->get_real("R1"); + rimborsi += _lim->get_real("R1"); + res_debt += _lim->get_real("R1"); + } + /* + * rettifiche gia' col loro bravo segno + */ + if (attc == 0 && is_lim) + { + // se sono per benzinaro le conta solo in annuale, + // se no vanno solo in periodica + TString descrett(_lim->get("S0")); + bool isforbenzinaro = descrett[0] == '$' || + (descrett[0] == '>' && descrett[1] == '>'); + + if ((isforbenzinaro && _isannual) || + (!isforbenzinaro && !_isannual)) + { + risultato += _lim->get_real("R5"); + rettifiche += _lim->get_real("R5"); + if (_lim->get_real("R5").sign() < 0) + res_cred += abs(_lim->get_real("R5")); + else + res_debt += abs(_lim->get_real("R5")); + } + } + + /* totalizza importi 74 ter */ + if (_isviaggio) + { + // somma totali per calcolo successivo + c_iCEE += _plm->get_real("R5"); + c_eCEE += _plm->get_real("R6"); + a_iCEE += _plm->get_real("R7"); + a_eCEE += _plm->get_real("R8"); + c_mCEE += _plm->get_real("R9"); + a_mCEE += _plm->get_real("R10"); + a_meCEE += _plm->get_real("R11"); + } + } // fine ciclo sul mese + // counter attivita' per evitare troppi versamenti + attc++; + } // fine ciclo su attivita' + + if (!(_isdifferita && is_first_month(month))) + { + if (_isviaggio) + { + // calcolo credito costo, debito mensile, perc. ripart. + perc_r = (a_mCEE * CENTO)/(a_mCEE + a_meCEE); + real ivm = (c_mCEE * perc_r)/CENTO; ivm.round(ROUND_LIRA); + real tc = (c_iCEE + ivm); + real ta = (a_iCEE + a_mCEE); + real bi = tc - ta - credito_costo_prec(month); + + if (bi.sign() < 0) + // credito di costo + { + cred_cost = abs(bi); + cred_cost.round(ROUND_LIRA); + } + else + { + deb_mens = (bi /((CENTO + aliquota_agvia())/CENTO)) * + (aliquota_agvia()/CENTO); + deb_mens.ceil(ROUND_LIRA); // ceil voluto MI3074 + risultato += deb_mens; + res_debt += deb_mens; + iva_vend += deb_mens; + } + } + } + } + + if (!(_isdifferita && is_first_month(month))) + { + if (month < 13) + { + // toglie credito precedente + cred_prec = credito_prec(month); + risultato -= cred_prec; + res_cred += cred_prec; + // vedi se c'era un debito precedente per debiti < 50.000 + debt_precd = debt_prec(month); + risultato += debt_precd; + res_debt += debt_precd; + } + else + { + // per l'annuale considera solo il credito a inizio anno + cred_prec = credito_prec(1); + risultato -= cred_prec; + res_cred += cred_prec; + } + } + else if (_isdifferita && !is_first_month(month) && month < 13) + { + // toglie credito precedente + cred_prec = credito_prec(month); + risultato -= cred_prec; + res_cred += cred_prec; + // vedi se c'era un debito precedente per debiti < 50.000 + debt_precd = debt_prec(month); + risultato += debt_precd; + res_debt += debt_precd; + + // folie bergere: se il mese precedente, che e' poi questo che ho calcolato, + // era a credito, devo tener conto del credito precedente che e' quello di + // questo mese (Vladimiro MI3170), ovvero devo RADDOPPIARE il credito, il che + // e' semplicemente roba da matti + if (!cred_prec.is_zero()) + { + risultato -= cred_prec; + res_cred += cred_prec; + cred_prec += cred_prec; // AH AH UAH IH UHU + } + } + + 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); + real vf1 = _pla->get_real("R14"); + real vf2(_pla->get("S1")); + real iaq = _pla->get_real("R11"); // IVA acquisti + real ppg = _pla->get_real("R12"); // 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(ROUND_LIRA); + 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 += abs(tot_cong); + + look_lim(month+deltam,TRUE); + // azzeriamo tutto (tranne r1, r5, s1, s0, s7) + TString codtab = _lim->get("CODTAB"); + + real r5 = _lim->get("R5"); + real r1 = _lim->get("R1"); + TString s7 = _lim->get("S7"); + TString s0 = _lim->get("S0"); + TString s1 = _lim->get("S1"); + + _lim->zero(); + _lim->put("CODTAB", codtab); + _lim->put("R1", r1); + _lim->put("R5", r5); + _lim->put("S0", s0); + _lim->put("S1", s1); + _lim->put("S7", s7); + + /* + * versamenti effettuati: si conteggiano in R0, + * sono > 0 solo se andavano calcolati (vedi sopra) + */ + risultato -= versamenti + vers_int; + /* + * acconto dicembre se previsto + */ + if ((month == 12 && _isbenzinaro) || + (month >= 12 && _freqviva == "M")) + { + risultato -= versamenti_IVA(12,"7"); + acc_dec = versamenti_IVA(12,"7"); + res_cred += acc_dec; + } + + // 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); + _lim->put("R3",deb_mens); + _lim->put("R4",perc_r); + + if (!_isagricolo) + _lim->put("R6",detrazioni); + else // per evitare sbagli nei ricalcoli esterni + _lim->put("R6",""); + + if (month == 13 || differita) + { + // scrivi totali rettifiche e rimborsi + // nella finale oppure se copiati da + // anno precedente + _lim->put("R1",rimborsi); + _lim->put("R5",rettifiche); + } + + /* + * Interessi dovuti solo da trimestrali in periodica, + * Era anche non benzinari, smentito da Cinzia (MI0853) + */ + if (_freqviva == "T" && risultato.sign() > 0 && + month < 13 /* && !_isbenzinaro */) + { + real interesse = interesse_trimestrale(_month); + real ivi = risultato * (interesse / CENTO); + ivi.ceil(ROUND_LIRA); + _lim->put("R14", ivi); + } + + // questo serve anche per la visualizzazione e per l'estrazione deleghe + if (_freqviva == "T" && month != 13 && !_isbenzinaro) + _lim->put("R10",interesse_trimestrale(_month)); + + // totale conguaglio su tutte le attivita' + _lim->put("R7", tot_cong); + _lim->put("R8", versamenti); + _lim->put("R9", vers_int); + _lam->put("R0", iva_vend); + _lam->put("R1", iva_acq); + _lam->put("R2", cred_prec); + _lam->put("R3", debt_precd); + _lim->put("R11", acc_dec); + _lim->put("R12", res_cred); + _lim->put("R13", res_debt); + + + if (!_recalc_only) + _lim->put("B0","X"); + if (_isfinal) _lim->put("B1", "X"); + + _lim->rewrite(); + _lam->rewrite(); +} + +void TLiquidazione_app::recalc_annual(const char* att) +{ + // 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 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); + + look_pla(aaa); + volaff1 = _pla->get_real("R14"); + volaff2 = (const char*)_pla->get("S1"); + 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 = _pla->get_real("R12"); + iva_acq = _pla->get_real("R11"); + + for (_pim->first(); !_pim->eof(); _pim->next()) + { + if (_year != *_pim_anno) continue; + + int tipocr = atoi(*_pim_tipocr); + TString16 codiva = *_pim_codiva; + TString16 reg = *_pim_codreg; + look_iva(codiva); look_reg(reg); + + if ( // ESCLUSI: + strcmp(att,*_pim_codatt) != 0 || + (int)_reg->get_long("I0") != vendita || // non vendite + tipocr == 4 || // cessioni beni ammortizzabili + _iva->get("S1") == "NS" || // non soggetti + _iva->get("S0") == "B3" || // bi tre + _reg->get_bool("B1")) // sospensione di imposta + continue; + + if (tipoatt == 1) volaff1 += _pim->get_real("R0"); + else volaff2 += _pim->get_real("R0"); + } + + // calcola esenti, cessioni, lordo vendite, prorata pagato + // e IVA acquisti dai plm/ptm/pum/pam/pom + + for (int i = 1; i <= 13; i++) + { + if (!look_plm(i,aaa)) + continue; + + vendite += _pam->get_real("R1"); + iva_acq += _plm->get_real("R1"); + es_b1 += _pum->get_real("R4"); + es_b2 += _pum->get_real("R5"); + es_b3 += _pum->get_real("R6"); + cess_amm += _pum->get_real("R0"); + pro_pag += _plm->get_real("R2"); + } + + _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("R11", iva_acq); + _pla->put("R12", pro_pag); + _pla->put("R14", volaff1); + _pla->put("S1", volaff2.string()); + _pla->rewrite(); +} + diff --git a/cg/cg4304.cpp b/cg/cg4304.cpp index 468684803..bb9330e4e 100755 --- a/cg/cg4304.cpp +++ b/cg/cg4304.cpp @@ -1,1945 +1,1945 @@ -// ------------------------------------------------------------ -// Calcolo liquidazioni -// Part 5: stampa -// fv 21-1-94 -// ------------------------------------------------------------ - -#include - -#include "cg4300.h" - -// flags per annuale -#define IS_PRORATA 0x0001 - - -// minchietta per prospetto ventilazione -class _vDesc : public TObject -{ -public: - TString _codiva; - real _acq; - real _vnd; - real _viv; - _vDesc() : _codiva(5) {} - virtual ~_vDesc() {} -}; - -static char sep[] = -"------------------------------------------------------------------" -"------------------------------------------------------------------"; - -void TLiquidazione_app::set_page(int file, int cnt) -{ - _DescrItem& d = (_DescrItem&)_descr_arr[cnt]; - - set_auto_ff(FALSE); - reset_print(); - - switch(d._flags) - { - case CHG_PARMS: - set_att(d); - break; - case SET_FIRM: - set_firm(d); - break; - case PIM_ROW: - set_pim(d); - break; - case PIM_HEAD: - set_pim_head(); - break; - case MISC_LIQ: - set_pumpam(d); - break; - case TOT_ROW: - set_plm(d); - break; - case PLAFOND: - set_plafond(d); - break; - case VENTILA: - set_ventila(d); - break; - case REGAGR: - set_regagr(d); - break; - case REGVIA: - set_viaggio(d); - break; - case THE_END: - set_grand(d); - break; - case ACCONTO: - set_acconto_p(d); - break; - case ACCHEAD: - set_acchead_p(d); - break; - case DELDEB: - set_deltab(d, FALSE); - break; - case DELCRED: - set_deltab(d, TRUE); - break; - } -} - -print_action TLiquidazione_app::postprocess_page(int file, int cnt) -{ - if (_descr_arr.items() == 0 || cnt == _descr_arr.items()-1) - return NEXT_PAGE; - return REPEAT_PAGE; -} - -bool TLiquidazione_app::preprocess_page(int file, int cnt) -{ - return _descr_arr.items() != 0; -} - -// ---------------------------------------------------------------- -// Print description -// ---------------------------------------------------------------- - -void TLiquidazione_app::describe_att(int month, const char* codatt, - bool isresult, char flags) -{ - TToken_string atts(codatt); - - if (_isprint && _canprint) - { - describe_name(month, atts, flags); - if (atts.items() == 1 && _isplafond) - describe_plafond(month, codatt); - if (atts.items() == 1 && _isvent) - describe_ventilation(month, codatt); - if (atts.items() == 1 && _isagricolo) - describe_agricolo(month, codatt); - if (atts.items() == 1 && _isviaggio) - describe_viaggio(month, codatt); - if (/* isresult || month == 13 */ TRUE) - describe_pims(month,codatt); - if (atts.items() == 1) - describe_consistence(codatt); - } -} - -void TLiquidazione_app::describe_name(int month, TToken_string& codatts, char flags) -{ - _DescrItem* d = new _DescrItem(CHG_PARMS); - - d->_s0 = _nditte->curr().get("CODDITTA"); - d->_s1 = _nditte->curr().get("RAGSOC"); - d->_s2 = _nditte->curr(LF_ATTIV).get("CODATT"); - d->_s3 = codatts.items() == 1 ? (const char*)_nditte->curr(LF_ATTIV).get("DESCR") : ""; - d->_s4 = _freqviva; - - d->_f1 = month; - d->_f2 = _isbenzinaro; - d->_f3 = (word)flags; - - if (_mixed && codatts.items() == 1) - d->_f0 = atoi(codatts.mid(5)); - else d->_f0 = 0; - _descr_arr.add(d); -} - -void TLiquidazione_app::describe_firm(int month) -{ - if (!_isprint || !_canprint) return; - - _DescrItem* d = new _DescrItem(SET_FIRM); - - d->_s0 = _nditte->curr().get("CODDITTA"); - d->_s1 = _nditte->curr().get("RAGSOC"); - d->_s2 = _freqviva; - d->_f1 = month; - _descr_arr.add(d); - -} - - -void TLiquidazione_app::describe_plafond(int month, const char* codatt) -{ - // prepara la descrizione del riepilogo da stampare e lo accoda - real t1, t2, t3; - _DescrItem* d = new _DescrItem(PLAFOND); - - for (int jj = 1; jj <= 3; jj++) // three types of plafond - { - t1 = 0.0; t2 = 0.0; t3 = 0.0; - for (int m = 1; m <= month && m < 13; m++) - { - if (is_month_ok(m,month) && look_ppa(m,codatt,jj)) - { - t1 += _ppa->get_real("R0"); - t2 += _ppa->get_real("R1"); - t3 = _ppa->get_real("R2"); - } - } - switch (jj) - { - case 1: - d->_r0 = t1; d->_r1 = t2; d->_r2 = t3; - break; - case 2: - d->_r3 = t1; d->_r4 = t2; d->_r5 = t3; - break; - case 3: - d->_r6 = t1; d->_r7 = t2; d->_r8 = t3; - break; - } - } // for tipo esenzione plafond - - _descr_arr.add(d); - - // bookmark -} - -void TLiquidazione_app::describe_ventilation(int month, const char* codatt) -{ - if (!_isvent || _isagricolo || _isviaggio) return; - - _DescrItem* d = new _DescrItem(VENTILA); - TString att(codatt); - - look_plm(month, att); - - for (_pim->first(); !_pim->eof(); _pim->next()) - { - if (strcmp(*_pim_codatt,att) != 0) - continue; - - look_reg(*_pim_codreg); - look_iva(*_pim_codiva); - - int tipocr = atoi(*_pim_tipocr); - int tipodet = atoi(*_pim_tipodet); - int mese = atoi(*_pim_mese); - bool corrisp = _reg->get_bool("B0"); - real imponibile = _pim->get_real("R0"); - real imposta = _pim->get_real("R1"); - tiporeg tipomov = (tiporeg)_reg->get_long("I0"); - TString tipoiva = _iva->get("S1"); - - if (_year != *_pim_anno) continue; - - if (imponibile.is_zero() && imposta.is_zero()) continue; - - // questi non vanno in liquidazione, i totali sono - // gia' calcolati altrove - if (tipodet == 1 || tipodet == 3 || tipodet == 9) - continue; - - // questi non si devono vedere perche' so' bbrutti - if (tipoiva == "NS" || tipoiva == "ES" || tipoiva == "NI") - continue; - - if (mese <= month) - { - if (tipocr == 1 && tipomov == acquisto) - { - // somma agli acquisti - _vDesc* vd = NULL; - for (int i = 0; i < d->_arr.items(); i++) - { - _vDesc* vv = (_vDesc*)&(d->_arr[i]); - if (strcmp(vv->_codiva,*_pim_codiva) == 0) - { vd = vv; break; } - } - if (vd == NULL) { vd = new _vDesc; } - - vd->_acq += (imponibile+imposta); - d->_r0 += (imponibile+imposta); - - if (vd->_codiva.empty()) - { - vd->_codiva = *_pim_codiva; - d->_arr.add(vd); - } - } - else if ((is_month_ok(mese,month) || month == 13) && corrisp - && _pim->get_bool("B1") && - tipocr == 0 && tipomov == vendita) - // non sono sicurissimo della above condition - { - // somma alle vendite - _vDesc* vd = NULL; - for (int i = 0; i < d->_arr.items(); i++) - { - _vDesc* vv = (_vDesc*)&(d->_arr[i]); - if (strcmp(vv->_codiva,*_pim_codiva) == 0) - { vd = vv; break; } - } - if (vd == NULL) { vd = new _vDesc; } - - vd->_vnd += imponibile; - vd->_viv += imposta; - - d->_r1 += imponibile+imposta; - - if (vd->_codiva.empty()) - { - vd->_codiva = *_pim_codiva; - d->_arr.add(vd); - } - } - } - } - if (d->_r1.is_zero() || d->_r0.is_zero()) - delete d; - else - _descr_arr.add(d); -} - -void TLiquidazione_app::describe_agricolo(int month, const char* codatt) -{ - _DescrItem* d = new _DescrItem(REGAGR); - - for (int mese = 1; mese <= month; mese++) - { - if (!is_month_ok(mese,month)) - continue; - - if (!look_plm(mese, codatt)) - continue; - - d->_r0 += _plm->get_real("R5"); - d->_r1 += _plm->get_real("R6"); - d->_r2 += _plm->get_real("R7"); - d->_r3 += _plm->get_real("R8"); - d->_r4 += _plm->get_real("R9"); - d->_r5 += _plm->get_real("R10"); - d->_r6 += _plm->get_real("R11"); - d->_r7 += _pum->get_real("R10"); - d->_r8 += _pum->get_real("R11"); - } - _descr_arr.add(d); -} - -void TLiquidazione_app::describe_viaggio(int month, const char* codatt) -{ - if (!look_lim(month)) return; - - _DescrItem* d = new _DescrItem(REGVIA); - - for (int mese = 1; mese <= month; mese++) - { - if (!is_month_ok(mese,month) || !look_plm(mese, codatt)) - continue; - - d->_r0 += _plm->get_real("R5"); // corrispettivi CEE - d->_r1 += _plm->get_real("R9"); // corrispettivi misti CEE - d->_r2 += _plm->get_real("R6"); // corrispettivi fuori CE - d->_r3 += _plm->get_real("R7"); // acquisti CEE - d->_r4 += _plm->get_real("R10"); // acquisti misti parte CEE - d->_r5 += _plm->get_real("R8"); // acquisti fuori CEE - d->_r6 += _plm->get_real("R11"); // acquisti misti parte fuori CEE - } - - // percentuale ripartizione - d->_r7 = _lim->get_real("R4"); - // credito di costo precedente (CHECK annuale) - d->_r8 = credito_costo_prec(month); - - _descr_arr.add(d); -} - - -void TLiquidazione_app::describe_pims(int month, const char* codatt) - // le si passa una tokenstring (o un codatt) e lei, da brava, calcola - // cumulando per tutte le attivita' nominatele - // ogni riga riguarda un codiva ma tutti i registri - // se il mese e' 13 si guarda tutto l'anno - // se si tratta di una sola attivita' in att. mista evidenziata o servizievole, - // stampa solo vendite e corrispettivi -{ - TToken_string atts(codatt); - TString ref(atts.items() == 1 ? codatt : "ALL"); - const char* tmpatt; - int last = _descr_arr.last(); - bool isfirst = TRUE; - real t0, t1, t2, t3, t4, t5; - real autodafe, autodafe_iva; - - bool skip_acq = atts.items() == 1 && _mixed; - - // descrittore riga autodafe' - _DescrItem* ads = NULL; - // descrittore riga iva dovuta ag. viaggio' - _DescrItem* iads = NULL; - // questa cazzata serve per far apparire l'intestazione delle colonne - // anche se le colonne non ci sono; in tal modo si ottiene una peggior - // chiarezza, una peggiore efficienza, una gran rottura di coglioni, - // ma risulta identico al dio Sistema. - _DescrItem* hea = new _DescrItem(PIM_HEAD); - _descr_arr.add(hea); - - while ((tmpatt = atts.get()) != NULL) - { - TString att(tmpatt); - - for (_pim->first(); !_pim->eof(); _pim->next()) - { - _DescrItem* d = NULL; - // compute - bool ok = look_reg(*_pim_codreg); - ok |= look_iva(*_pim_codiva); - bool isnew = FALSE; - - if (!ok) continue; - - tiporeg tipomov = (tiporeg)_reg->get_long("I0"); - bool corrisp = _reg->get_bool("B0"); - TString tipoiva = _iva->get("S1"); - int tipodet = atoi(*_pim_tipodet); - TString codiva((const char*)(*_pim_codiva)); - TString other = _pim->get("S4"); - - // ACHTUNG! Corrispettivi da ventileer possono ventilare - // ad un altro codiva; in tal caso si scrive quello - if (corrisp && !other.empty()) - { - look_iva(other); - codiva = other; - } - // se e' corrispettivo da ventilare non - // scrivo un cannolo ripieno visto che e' stato ventilato - if (tipomov == vendita && tipoiva == "VE") continue; - - // se e' il dettaglio di una attivita' mista non stampa - // gli acquisti, il perche' losalamadonna - if (tipomov == acquisto && skip_acq) continue; - - // questi non vanno in liquidazione, i totali sono - // gia' calcolati altrove - if (tipodet == 1 || tipodet == 3 || tipodet == 9) - continue; - - // se ha tutti gli importi nulli viene da un annullamento di - // progressivi esistenti - if (_pim->get_real("R0").is_zero() && - _pim->get_real("R1").is_zero() && - _pim->get_real("R2").is_zero()) - continue; - - 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 - for(int i = last+1; i < _descr_arr.items(); i++) - { - d = (_DescrItem*)&_descr_arr[i]; - if (d->_flags == PIM_ROW && - d->_s0 == ref && - d->_s1 == codiva) - break; - if (d->_s1 > codiva) - { - isnew = TRUE; - _DescrItem* dd = new _DescrItem(PIM_ROW); - // CicciaPrassi li vuole in ordine crescente - _descr_arr.insert(dd,i); - // che due maron stereofonic: se quello dopo - // era il primo, quello prima va dopo - if (d->_f0) - { - dd->_f0 = TRUE; - d->_f0 = FALSE; - } - else if (isfirst) - { - d->_f0 = TRUE; - isfirst = FALSE; - } - d = dd; - break; - } - } - if (!isnew && i == _descr_arr.items()) - { - isnew = TRUE; - d = new _DescrItem(PIM_ROW); - if (isfirst) { d->_f0 = TRUE; isfirst = FALSE; } - _descr_arr.add(d); - } - - if (tipomov == acquisto) - { - d->_r4 += _pim->get_real("R0"); - d->_r5 += _pim->get_real("R1"); - t4 += _pim->get_real("R0"); - t5 += _pim->get_real("R1"); - } - else // vendita - { - // vedi corrispettivi veri e falsi - real cvi = _pim->get_real("R0"); // imp. totale - real cvv = _pim->get_real("R1"); // iva totale - real cfi = _pim->get_real("R13"); // imp. falsi corrispettivi - real cfv = _pim->get_real("R14"); // iva falsi corrispettivi - - if (corrisp) - { - cvi -= cfi; - cvv -= cfv; - } - - if (corrisp) - { - // usa R0 e R1 visto che la ventilazione e' gia' - // stata calcolata - real ifs(_pim->get_real("R5")); // imp. fatture con scontrino - real vfs(_pim->get_real("R6")); // iva fatture con scontrino - - d->_r2 += (cvi /* - ifs */); // tolgo FS dai corrispettivi - d->_r3 += (cvv /* - vfs */); - d->_r0 += ifs; // aggiungo FS alle vendite - d->_r1 += vfs; - t2 += (cvi /* - ifs */); // idem per i totali - t3 += (cvv /* - vfs */); // non sono molto convinto ma vogliono cio' - t0 += ifs; // ...avevo ragione e infatti l'ho cambiato - t1 += vfs; - } - - if (!corrisp || (!cfv.is_zero() || !cfi.is_zero())) - { - real adf, adi; // autofatture non residenti art. 17 - - real vendi = corrisp ? cfi : _pim->get_real("R0"); - real vendv = corrisp ? cfv : _pim->get_real("R1"); - - // si scorporano solo per l'annuale, altrimenti - // vengono normalmente considerati nelle vendite - if (month == 13) - { - adf = _pim->get_real("R7"); - adi = _pim->get_real("R8"); - } - - d->_r0 += vendi - adf; - d->_r1 += vendv - adi; - t0 += vendi /* - adf */; - t1 += vendv /* - adi */; - - autodafe += adf; - autodafe_iva += adi; - } - } - if (isnew) - { - d->_s0 = ref; - d->_s1 = codiva; - // flag per stampare l'intestazione colonne - } - } - } - - look_plm(month,att); - real iva74t = _pom->get_real("R13"); - if (iva74t.sign() > 0) - { - if(iads == NULL) iads = new _DescrItem(PIM_ROW); - iads->_s0 = "74TER"; // cosi' vollero - iads->_s1 = "IVA "; // cosi' vollero - iads->_s2 = " dovuta - 74 ter"; // cosi' vollero - iads->_r1 += iva74t; - t1 += iva74t; - if (isfirst) - { - isfirst = FALSE; - iads->_f0 = TRUE; - } - } - } - - if (autodafe.sign() > 0 || autodafe_iva.sign() > 0) - { - _DescrItem* ads = new _DescrItem(PIM_ROW); - ads->_s0 = ref; - ads->_s1 = "A35"; // cosi' vollero - ads->_r0 = autodafe; - ads->_r1 = autodafe_iva; - if (isfirst) - { - isfirst = FALSE; - ads->_f0 = TRUE; - } - _descr_arr.add(ads); - } - - // ag. viaggio: iva dovuta 74 ter la vogliono in mezzo ai progressivi - if (iads != NULL) _descr_arr.add(iads); - - // prepara una bella riga di totali - if (/* !isfirst */ TRUE) - { - _DescrItem* d = new _DescrItem(TOT_ROW); - d->_r0 = t0; d->_r1 = t1; - d->_r2 = t2; d->_r3 = t3; - d->_r4 = t4; d->_r5 = t5; - - // aggiunge dati ptm - _DescrItem* t = new _DescrItem(MISC_LIQ); - t->_f1 = isfirst; // per il form feed - - TToken_string ttm("0|0|0"); - - for (int m = 1; m <= month && m < 13; m++) - { - if (!is_month_ok(m,month)) continue; - - atts.restart(); - while ((tmpatt = atts.get()) != NULL) - { - TString att(tmpatt); - look_plm(m, att); - real ad1, ad2; - - d->_r6 += _pom->get_real("R0"); // acq. intracomunitari - d->_r7 += _pom->get_real("R1"); // inded. art 19 - d->_r8 += _pom->get_real("R2"); // IVA su inded. art. 19 - t->_r0 += _pom->get_real("R3"); // acq. ammortizz. detr - t->_r1 += _pom->get_real("R4"); // IVA acq. ammort. detr - t->_r2 += _pum->get_real("R2"); // ammort. detr. 6% - t->_r3 += _pum->get_real("R3"); // IVA ammort detr. 6% - t->_r4 += _pom->get_real("R5"); // acq. beni rivendita - t->_r5 += _pom->get_real("R6"); // IVA acq. beni rivendita - t->_r6 += _pom->get_real("R7"); // acq. leasing - t->_r7 += _pom->get_real("R8"); // IVA acq. leasing - t->_r8 += _pum->get_real("R0"); // cessioni beni ammort. - t->_r9 += _pum->get_real("R1"); // IVA su cessioni ammort. - t->_r10 += _pum->get_real("R4"); // tot. esenti IVA - t->_r11 += _plm->get_real("R2"); // pro-rata indetraibile - - ad1 = real(ttm.get(1)); - ad2 = real(ttm.get(2)); - ad1 += _pom->get_real("R11"); - ad2 += _pom->get_real("R12"); - ttm.add(_plm->get("R12"), 0); // % pro-rata - ttm.add(ad1.string(),1); // imp. acq. amm. indetr. - ttm.add(ad2.string(),2); // IVA acq. amm. indetr - t->_s0 = ttm; - - t->_f0 = !_prorata.is_zero() && (month != 13); // flag per segnalare l'esistenza - d->_r9 += _pom->get_real("R9"); // acq. inded. su ricavi esenti - d->_r10 += _pom->get_real("R10"); // IVA acq. inded. su ricavi esenti - - // passaggi interni - real aipip(d->_s0); // progressivo ... - real aipivp(d->_s1); // ... (che mazzata sulle palle...) - aipip += _pum->get_real("R8"); // acq. inded. per pass. int - aipivp += _pum->get_real("R9"); // IVA acq. inded. per pass. int - d->_s0 = aipip.string(); // risbatto ... - d->_s1 = aipivp.string(); // .. - - // spese generali. - real spgnp(t->_s2); // progressivo ... - real spgnvp(t->_s3); // ... (che doppia mazzata sulle palle...) - spgnp += _pam->get_real("R10"); // spese generali. - spgnvp += _pam->get_real("R11"); // IVA spese generali. - t->_s2 = spgnp.string(); // risbatto ... - t->_s3 = spgnvp.string(); // .. - - // sospensione imposta: non piu' due palle, ma QUATTRO - TToken_string tt(t->_s4); - real aqsi(tt.get(0)); - real aqsv(tt.get(1)); - real vnsi(tt.get(2)); - real vnsv(tt.get(3)); - - aqsi += _pam->get_real("R6"); - aqsv += _pam->get_real("R7"); - vnsi += _pam->get_real("R8"); - vnsv += _pam->get_real("R9"); - - tt = ""; - tt.add(aqsi.string()); - tt.add(aqsv.string()); - tt.add(vnsi.string()); - tt.add(vnsv.string()); - t->_s4 = tt; - - } // while (attivita') - } // for (mese ok) - - - // annual follows in _arr - 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 v1 = _pla->get_real("R14"); - real v2(_pla->get("S1")); - 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 iaq = _pla->get_real("R11"); // IVA acquisti - real ppg = _pla->get_real("R12"); // pro-rata pagato - - // calcola nuovo prorata per ogni attivita' (miste: 1+2) - real ris = v - am - e3; - - real pr(0.0); - if (!ris.is_zero()) - pr = (e1/ris) * CENTO; - real co = 0.0; - real topay = 0.0; - pr.round(ROUND_LIRA); - if (pr != _prorata) - { - // calcolo conguaglio -- se positivo e' a debito - topay = iaq * (pr / CENTO); - co = topay - ppg; - co.round(ROUND_LIRA); - } - - _DescrItem* dd = new _DescrItem(ANNUAL); - - // prorata - if (!_prorata.is_zero()) - dd->_f0 |= IS_PRORATA; - dd->_r0 = ris; - dd->_r1 = e1; - dd->_r2 = pr; - dd->_r3 = co; - dd->_r4 = e2; - dd->_r5 = e3; - dd->_r6 = topay; - t->_arr.add(dd); - } - } - _descr_arr.add(d); - _descr_arr.add(t); - } -} - - -void TLiquidazione_app::describe_liq(int month, const char* codatts, - _DescrItem* di) -{ - if (!_isprint || !_canprint) return; - - if (!look_lim(month)) return; - - _DescrItem* d = new _DescrItem(THE_END); - - // gli diamo la stessa struttura di LIM - d->_r0 = _lim->get_real("R0"); - d->_r1 = _lim->get_real("R1"); - d->_r2 = _lim->get_real("R2"); - d->_r3 = _lim->get_real("R3"); - d->_r4 = _lim->get_real("R4"); - d->_r5 = _lim->get_real("R5"); - d->_r6 = _lim->get_real("R6"); - d->_r7 = _lim->get_real("R14"); - d->_r9 = _lim->get_real("R9"); - d->_r10 = _lim->get_real("R7"); // totale conguaglio prorata - - TToken_string tt(80); - tt.add(_lam->get_real("R0").string()); - tt.add(_lam->get_real("R1").string()); - tt.add(_lam->get_real("R2").string()); - tt.add(_lam->get_real("R3").string()); - - d->_s0 = tt; - d->_s1 = _lim->get_real("R11").string(); - d->_s2 = _lim->get_real("R12").string(); - d->_s3 = _lim->get_real("R13").string(); - d->_r11 = (const char*)_lim->get("R10"); // tasso di interesse - - if (_is_visliq) - { - // tutti i versamenti, sempre e comunque - d->_r8 = versamenti_IVA(_month, "1", TRUE); - } - else - // rispettiamo tutte le casistiche per i versamenti - d->_r8 = _lim->get_real("R8"); - - - // aggiunge eventuale satellite per rimborso infraannuale - if (di != NULL) d->_arr.add(di); - - if (!_is_visliq) - { - _DescrItem* dv = describe_deleghe(month); - if (dv != NULL) d->_arr.add(dv); - } - _descr_arr.add(d); -} - -_DescrItem* TLiquidazione_app::describe_deleghe(int month) -{ - if (!look_del(month,1)) return NULL; - - _DescrItem* d = new _DescrItem(DELEGA); - - if (_del->get_bool("B0")) - { - d->_s0 = _del->get("S2"); // localita' - d->_s1 = _del->get("S1"); // banca - d->_s2 = _del->get("S7"); // ABI - d->_s3 = _del->get("S8"); // CAB - d->_r0 = _del->get_real("R0") + _del->get_real("R1"); - d->_d0 = _del->get_date("D0"); - } // altrimenti lascia tutto in bianco e ci scriveranno i dati a mano - - return d; -} - -void TLiquidazione_app::describe_consistence(const char* codatt) -{ - // controlla eventuali condizioni di conflitto con le normative - // per la ditta e crea i messaggi appropriati - // tutte le condizioni sono valutate sull'esercizio precedente - int pryear = atoi(_year) - 1; - TString att = codatt; - - _pla->zero(); - *_pla_ditta = get_firm(); - *_pla_anno = pryear; - *_pla_codatt = att; - - if (_pla->read() == NOERR) - { - real va = _pla->get_real("R0"); - - // 1) consistenza volume d'affari <-> frequenza versamenti - // deve essere: trimestrale ammesso solo se < 360.000.000 - // per servizi, < 1.000.000.000 per altre imprese - // a meno che non sia benzinaro che ha diritto comunque - - if (_freqviva == "T" && !_isbenzinaro) - { - bool err = FALSE; - if (_isservizio) err = va > SOGLIA_TRIM_SERVIZI; - else err = va > SOGLIA_TRIM_ALTRE; - if (err) - describe_error("Incoerenza volume affari/frequenza versamenti", - att); - } - } -} - - -void TLiquidazione_app::describe_error(const char* err, const char* codatt) -{ - if (!_isprint || !_canprint) return; - _errors.add(new _ErrItem(err,codatt,_nditte->curr().get("CODDITTA"))); -} - -// ---------------------------------------------------------------- -// Setrows -// ---------------------------------------------------------------- - -void TLiquidazione_app::set_firm(_DescrItem& d) -{ - TString tim_title(80); - tim_title << "Liquidazione IVA"; - - if (d._f1 == 13) - tim_title << format(": Riepilogo Annuale %s",(const char*)_year); - else - { - if (d._s2 == "T") - tim_title << format(" del %d° Trimestre %s", d._f1/3, (const char *) _year); - else - tim_title << format(" del mese di %s %s", itom(d._f1), - (const char*)_year); - } - - reset_header(); - int soh = 1; - if (!_isregis) - { - set_header(soh++,"Ditta %s %s@109gData @<@125gPag. @#", - (const char*)(d._s0), (const char*)(d._s1)); - set_header(soh++,""); - } - set_header(soh++,sep); - set_header(soh++,"%s@102gFrequenza %s", - (const char*)tim_title, - d._s2 == "T" ? "Trimestrale" : "Mensile"); - set_header(soh++,sep); - set_header(soh++,""); - - // notify errors if any - int j = 0; - for (int i = 0; i < _errors.items(); i++) - { - _ErrItem& s = (_ErrItem&)_errors[i]; - if (s._att == "ALL" && s._firm == d._s0) - { j++; set_row(i+3, "@5g@b*** %s ***@r", (const char*)s._err); } - } - if (j) set_row(i+3,""); -} - - -void TLiquidazione_app::set_att(_DescrItem& d) -{ - // set header - TString tim_title(78); - TString att_title(48); - - // Bookmark - TString book_name(d._s3); - char flags = (char)d._f3; - - if (flags == '1') book_name << " (servizi)"; - else if (flags == '2') book_name << " (altre)"; - else if (flags == 'M') book_name = "Riepilogo att. mista"; - else if (flags == 'Q') book_name = "Riepilogo quater"; - - if (_firm_bookmark == -1) - _firm_bookmark = set_bookmark(d._s1); - _att_bookmark = set_bookmark(book_name, _firm_bookmark); - - tim_title << "Liquidazione IVA"; - - if (d._f1 == 13) - { - if (d._s4 == "T" && !(d._f2)) // trimestrale e non benzinaro - tim_title << format(": Riepilogo Annuale %s",(const char*)_year); - else - tim_title << format(": Dichiarazione Annuale %s",(const char*)_year); - } - else - { - if (d._s4 == "T") - tim_title << format(" del %d° Trimestre %s", d._f1/3, (const char *) _year); - else - tim_title << format(" del mese di %s %s", itom(d._f1), - (const char*)_year); - } - - TString tipatt; - - if (d._f0 > 0) - tipatt.format(d._f0 == 1 ? "SERVIZI" : "ALTRE ATTIVITA'"); - - if (d._s3.empty()) - { - att_title = flags == 'M' ? "Riepilogo attivita' mista" : - "Riepilogo quater"; - // att_title << d._s2; - } - else - att_title = format("Attivita' %s %s %s", - (const char*)(d._s2), - (const char*)(d._s3), - (const char*)tipatt); - - reset_header(); - int soh = 1; - if (!_isregis) - { - set_header(soh++,"Ditta %s %s@109gData @<@125gPag. @#", - (const char*)(d._s0), (const char*)(d._s1)); - set_header(soh++,""); - } - set_header(soh++,sep); - set_header(soh++,"%s@55g%s", (const char*)tim_title, (const char*)att_title); - set_header(soh++,sep); - set_header(soh++,""); - - // notify errors if any - int j = 0; - for (int i = 0; i < _errors.items(); i++) - { - _ErrItem& s = (_ErrItem&)_errors[i]; - if (d._s2 == s._att && s._firm == d._s0) - { j++; set_row(i+10, "@5g@b*** %s ***@r", (const char*)s._err); } - } - if (j) set_auto_ff(TRUE); -} - - -void TLiquidazione_app::set_plafond(_DescrItem& d) -{ - if (_isregis) return; - - set_bookmark("Quadro plafond", _att_bookmark); - - real r1 = d._r2 - d._r1 - d._r0; - real r2 = d._r5 - d._r4 - d._r3; - real r3 = d._r8 - d._r7 - d._r6; - - set_print_zero(TRUE); - - set_row(1,"QUADRO RELATIVO ALLA DISPONIBILITA' ED ALL'UTILIZZO " - "MENSILE DEI PLAFOND"); - - set_row(2,""); set_row(3,""); - set_row(4,"Art. 8 1° comma lettere a-b@31gDisponibile@48g%r", - &(d._r2)); - set_row(5,"Utilizzato all'interno@48g%r", &(d._r0)); - set_row(6,"Utilizzato per l'importazione@48g%r@69gRiporto@78g%r", - &(d._r1), &r1); - - set_row(7,""); - set_row(8,"Art. 8bis 1° comma@31gDisponibile@48g%r", - &(d._r5)); - set_row(9,"Utilizzato all'interno@48g%r", &(d._r3)); - set_row(10,"Utilizzato per l'importazione@48g%r@69gRiporto@78g%r", - &(d._r4), &(r2)); - - set_row(11,""); - set_row(12,"Art. 9 1° comma@31gDisponibile@48g%r", - &(d._r8)); - set_row(13,"Utilizzato all'interno@48g%r", &(d._r6)); - set_row(14,"Utilizzato per l'importazione@48g%r@69gRiporto@78g%r", - &(d._r7), &r3); - - set_print_zero(FALSE); - set_auto_ff(); -} - -void TLiquidazione_app::set_pim_head() -{ - set_bookmark("Riepilogo progressivi", _att_bookmark); - set_row(1," Cod.@41gVENDITE@71gCORRISPETTIVI@106gACQUISTI"); - set_row(2," IVA Descrizione@30gImponibile@49gImposta@63gImponibile" - "@82gImposta@96gImponibile@115gImposta"); - set_row(3,""); -} - -void TLiquidazione_app::set_pim(_DescrItem& d) -{ - // succede con le autocazzate non residenti non moviomentate eccetera - if ((d._r0 + d._r1 + d._r2 + d._r3 + d._r4 + d._r5) == ZERO) - return; - - int rw = 1; - if (d._s1 == "A35") - d._s2 = "Artt.17c3/74c1"; - else if (d._s0 == "74TER") - rw++; - else - { - look_iva(d._s1); - d._s2 = _iva->get("S0"); - if (d._s2.len() > 19) d._s2.cut(19); - } - - if (d._f0) // e' il primo: non fa piu' nulla perche' l'intestazione - // viene fatta comunque da set_pim_head - {} - - set_row(rw++,"%4s %s@25g%r@41g%r@58g%r@74g%r@91g%r@107g%r", - (const char*)d._s1, - (const char*)d._s2, - &(d._r0), - &(d._r1), - &(d._r2), - &(d._r3), - &(d._r4), - &(d._r5)); -} - -void TLiquidazione_app::set_plm(_DescrItem& d) -{ - int rw = 1; - if (!(d._r0.is_zero() && - d._r1.is_zero() && - d._r2.is_zero() && - d._r3.is_zero() && - d._r4.is_zero() && - d._r5.is_zero())) - { - set_row(rw++,""); set_row(rw++,""); - set_row(rw++,"Totale@25g%r@41g%r@58g%r@74g%r@91g%r@107g%r", - &(d._r0), - &(d._r1), - &(d._r2), - &(d._r3), - &(d._r4), - &(d._r5)); - set_row(rw++,""); - } - if (!d._r6.is_zero()) - { - set_row(rw++,"di cui per acquisti intracomunitari@107g%r", &(d._r6)); - } - if (!(d._r7.is_zero() && d._r8.is_zero())) - { - set_row(rw++,"Totali acquisti indeducibili per art.19@91g%r@107g%r", - &(d._r7), &(d._r8)); - } - if (! (d._r9.is_zero() && d._r10.is_zero())) - { - set_row(rw++, "Totale acquisti indeducibili su ricavi esenti@91g%r@107g%r", - &(d._r9), - &(d._r10)); - } - - real acq_pint(d._s0); - real acq_pint_iva(d._s1); - - if (! (acq_pint.is_zero() && acq_pint_iva.is_zero())) - { - set_row(rw++, "Totale acquisti indeducibili per passaggi interni@91g%r@107g%r", - &acq_pint, - &acq_pint_iva); - } - - real tot1 = d._r7 + d._r4 + d._r9 + acq_pint; - real tot2 = d._r8 + d._r5 + d._r10 + acq_pint_iva; - - if (tot1 != d._r4 || tot2 != d._r5) - { - // i corrispettivi finiscono nelle vendite - d._r0 += d._r2; - d._r1 += d._r3; - d._r2 = ZERO; - d._r3 = ZERO; - // per ora lascio r2 e r3 anche se sono sempre 0 - set_row(rw++, ""); - set_row(rw++,"Totale Generale IVA@25g%r@41g%r@58g%r@74g%r@91g%r@107g%r", - &(d._r0), - &(d._r1), - &(d._r2), - &(d._r3), - &tot1, - &tot2); - } -} - - -void TLiquidazione_app::set_pumpam(_DescrItem& d) -{ - bool printed = FALSE; - - // d._f1 dice se c'era qualcosa sopra nella stessa pagina - real spgn(d._s2); - real spgn_iva(d._s3); - - TToken_string tt(d._s4); // Token String - TToken_string dp(d._s0); // Due Palle - real aqsi(tt.get(0)); - real aqsv(tt.get(1)); - real vnsi(tt.get(2)); - real vnsv(tt.get(3)); - real ammindi(dp.get(1)); - real ammindv(dp.get(2)); - - int row = 5; - - if (!(aqsi.is_zero() && aqsv.is_zero())) - { - printed = TRUE; - set_row(row++, "Acquisti in sospensione di imposta@50g%r@69g%r", - &aqsi, - &aqsv); - } - if (!(vnsi.is_zero() && vnsv.is_zero())) - { - printed = TRUE; - set_row(row++, "Vendite in sospensione di imposta@50g%r@69g%r", - &vnsi, - &vnsv); - } - if (!(d._r8.is_zero() && d._r9.is_zero())) - { - printed = TRUE; - set_row(row++, "Cessione beni ammortizzabili@50g%r@69g%r", - &(d._r8), - &(d._r9)); - } - if (! (d._r4.is_zero() && d._r5.is_zero())) - { - printed = TRUE; - set_row(row++, "Acquisto beni destinati alla rivendita@50g%r@69g%r", - &(d._r4), - &(d._r5)); - } - if (! (ammindi.is_zero() && ammindv.is_zero())) - { - printed = TRUE; - set_row(row++, "Acquisto beni ammortizzabili IVA indetraibile@50g%r@69g%r", - &ammindi, - &ammindv); - } - if (! (d._r0.is_zero() && d._r1.is_zero())) - { - printed = TRUE; - set_row(row++, "Acquisto beni ammortizzabili IVA detraibile@50g%r@69g%r", - &(d._r0), - &(d._r1)); - } - if (!(d._r6.is_zero() && d._r7.is_zero())) - { - printed = TRUE; - set_row(row++, "Altri beni strumentali acquisiti in leasing@50g%r@69g%r", - &(d._r6), - &(d._r7)); - } - if (!(d._r2.is_zero() && d._r3.is_zero())) - { - printed = TRUE; - real rn = d._r2 * real(DETRAZIONE_6PERCENTO); - set_row(row++, "Acquisto beni soggetti a detrazione (6%%)" - "@50g%r@69g%r@86g%r", - &(d._r2), - &(d._r3), - &rn); - } - if (!(spgn.is_zero() && spgn_iva.is_zero())) - { - printed = TRUE; - set_row(row++, "Spese generali@50g%r@69g%r", - &spgn, - &spgn_iva); - } - if (d._f0) - { - printed = TRUE; - real prc(dp.get(0)); - - set_row(row++, "%% PRO-RATA ed IVA non detraibile (%s%%)@69g%r", - (const char*)prc.string(), &(d._r11)); - } - - // items vari per dichiarazione annuale - for (int i = 0; i < d._arr.items(); i++) - { - _DescrItem& dd = (_DescrItem&)d._arr[i]; - printed |= set_annual(dd); - } - - if (printed) - { - set_bookmark("Altri dati", _att_bookmark); - - set_row(1,""); - set_row(2,""); - set_row(3,"ALTRI DATI RELATIVI ALLA DICHIARAZIONE@55gimponibile" - "@77gimposta@91gdetrazione"); - set_row(4,""); - } - else /* if (!d._f1) */ - set_row(1,""); - - // form feed - /* if (printed || !d._f1) */ set_auto_ff(TRUE); -} - -void TLiquidazione_app::set_grand(_DescrItem& d) -{ - real& risultato = d._r0; - real& rimborso = d._r1; - real& cred_cost = d._r2; - real& deb_mens = d._r3; - real& rettifiche = d._r5; - real& detrazioni = d._r6; - 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)); - real cred_prec(tt.get(2)); - real debt_prec(tt.get(3)); - - real acc_dec(d._s1); - real res_cred(d._s2); - real res_debt(d._s3); - real rett_debt(0.0); - real rett_cred(0.0); - real& interesse = d._r11; - - if (rettifiche.sign() > 0) rett_debt = rettifiche; - if (rettifiche.sign() < 0) rett_cred = -rettifiche; - - set_bookmark("Riepilogativo liquidazione", _firm_bookmark); - - set_row(1,""); set_row(2,""); set_row(3,""); set_row(4,""); - set_row(5,"@11g@bCALCOLO LIQUIDAZIONE D'IMPOSTA@r"); - set_row(6,""); int rw = 7; - set_row(rw++," @66gCredito@84gDebito"); set_row(rw++,""); - set_row(rw++,"@11gIva sulle operazioni di vendita@75g%r", &iva_vend); - set_row(rw++,"%s@11gRettifiche IVA a debito%s@75g%r", - _is_visliq ? "$[r]" : "", _is_visliq ? "$[n]" : "", &rett_debt); - set_row(rw++,"%s@11gIva chiesta a rimborso%s@75g%r", - _is_visliq ? "$[r]" : "", _is_visliq ? "$[n]" : "", &rimborso); - - // conguaglio prorata - if (conguaglio.sign() > 0) - { - set_row(rw++,"@11gConguaglio pro-rata@75g%r", &conguaglio); - } - - // debito liq. precedente < 50000 - if (debt_prec > ZERO) - set_row(rw++,"@11gDebito da liquidazione precedente@75g%r", &debt_prec); - - set_row(rw++,"@11gRISULTATO@75g%r", &res_debt); - set_row(rw++,"@11gIva sulle operazioni di acquisto@58g%r", &iva_acq); - if (_isannual) - set_row(rw++,"@11gCredito inizio anno@58g%r", &cred_prec); - else - set_row(rw++,"@11gCredito precedente@58g%r", &cred_prec); - - if (!acc_dec.is_zero()) - set_row(rw++,"%s@11gVersamento acconto dicembre%s@58g%r", - _is_visliq ? "$[r]" : "", _is_visliq ? "$[n]" : "", &acc_dec); - - if (!detrazioni.is_zero()) - set_row(rw++,"@11gUlteriori detrazioni@58g%r", &detrazioni); - - set_row(rw++,"%s@11gRettifiche IVA a credito%s@58g%r", - _is_visliq ? "$[r]" : "", _is_visliq ? "$[n]" : "", &rett_cred); - - if (_is_visliq) - { - // stampa ad uso visualizzazione liquidazione IVA - // set_row(rw++,"@11g$[r]Versamenti effettuati$[n]@58g%r", &versamenti); - } - else - { - // versamenti effettuati - if (!versamenti.is_zero()) - { - set_row(rw++,"@11gVersamenti effettuati@58g%r", &versamenti); - } - // versamenti integrativi - if (!vers_int.is_zero()) - { - set_row(rw++,"@11gVersamenti integrativi@58g%r", &vers_int); - } - } - if (conguaglio.sign() < 0) - { - real cg = conguaglio; - cg = -cg; - set_row(rw++,"@11gConguaglio pro-rata@58g%r", &cg); - } - set_row(rw++,"@11gRISULTATO@58g%r", &res_cred); - - // se non c'e' nulla da versare stampa solo una riga vuota - // Serve, non toglierla, stronzo. - if (risultato.is_zero()) - set_row(rw++,""); - else - { - if (risultato.sign() < 0) - { - real iva = abs(risultato); - if (_isannual || _isriepilogo) iva.round(ROUND_MILLELIRE); - set_row(rw++,"@23gCREDITO ATTUALE@58g%r",&iva); - } - else - { - real iva = risultato + interessi; - if (_isannual || _isriepilogo) iva.round(ROUND_MILLELIRE); - if (!iva.is_zero()) - { - if (!interessi.is_zero()) - { - set_row(rw++,"@23gIVA DOVUTA@75g%r",&risultato); - set_row(rw++,"@23gInteresse %6.2r %%@75g%r",&interesse, &interessi); - } - if (iva >= IVA_DA_RIPORTARE || _isannual || _isriepilogo) - set_row(rw++,"@23gIVA DA VERSARE@75g%r",&iva); - else - set_row(rw++,"@23gIVA A DEBITO DA NON VERSARE@75g%r",&iva); - } - } - } - - // rapportini per rimborso infraannuale - // non si stampano se la stampa serve per la visualizz. - //modifica del 07/07/1995 - //*** solo in st.di prova in coda ai registri deve scendere - // il prospetto di rimborso - //*** sempre (cioe' in bollato e in prova) deve scendere - // il prospettino versamento (boh???????????????????) - //if (d._arr.items() > 0 && !_is_visliq && !_isregis) - if (d._arr.items() > 0 && !_is_visliq) - { - for (int i = 0; i < d._arr.items(); i++) - { - _DescrItem& di = (_DescrItem&)d._arr[i]; - - if (di._flags == RIMBORSO) - { - if (!_isregis || (_isregis && !_isfinal)) - { - set_print_zero(TRUE); - set_row(rw++,""); - set_row(rw++,""); - - set_bookmark("Prospetto di rimborso", _firm_bookmark); - - set_row(rw++, " PROSPETTO DI RIMBORSO"); - - if (di._f0) - { - // esenti e non imponibili - set_row(rw++,""); - set_row(rw++,"1) Soggetto con quota di operazioni esenti e non" - " imponibili superiore al 25%%"); - - real perc = (di._r0/di._r1); perc *= CENTO; perc.round(ROUND_LIRA); - - TString sep(strlen(REAL_PICTURE)+2); sep.fill('-'); - set_row(rw++,""); - set_row(rw++,"@26gTotale operazioni esenti e non imp.@66g%r", - &(di._r0)); - set_row(rw++,"@66g%t x 100 = %3r%%", &sep, &perc); - set_row(rw++,"@26gVolume di affari lordo@66g%r", &(di._r1)); - set_row(rw++,""); - } - - if (di._f1) - { - set_row(rw++,""); - set_row(rw++,"2) Soggetto con acquisti ad aliquota media " - "superiore a quella delle vendite"); - TString sep(strlen(REAL_PICTURE)+2); sep.fill('-'); - set_row(rw++,""); - set_row(rw++,"@26gTotale imposte sugli acquisti@66g%r", &(di._r5)); - set_row(rw++,"@66g%t x 100 = %5.2r%%", &sep, &(di._r7)); - set_row(rw++,"@26gTotale imponibili sugli acquisti@66g%r", - &(di._r3)); - set_row(rw++,""); - set_row(rw++,"@26gTotale imposte sulle vendite@66g%r", &(di._r4)); - set_row(rw++,"@66g%t x 100 = %5.2r%%", &sep, &(di._r6)); - set_row(rw++,"@26gTotale imponibili sulle vendite@66g%r", &(di._r2)); - } - - set_print_zero(FALSE); - } - } - // prospettino versamento - else if (di._flags == DELEGA) - { - int rr = rw; - if (rw < (printer().formlen() - 10)) - rw = printer().formlen() - 10; - - for (int i = rr; i < rw; i++) set_row(i,""); - - set_bookmark("Riepilogo versamenti", _firm_bookmark); - - TString dt = di._d0.string(); - TString vr = di._r0.string("###.###.###.###"); - - // la cincia non vuole lo zero - if (atof(vr) == 0.0 && vr[vr.len()-1] == '0') vr[vr.len()-1] = ' '; - - set_row(rw++, "Versamento di L. %s effettuato il %s@68gdiretto all'ufficio IVA di %s", - (const char*)vr, - (const char*)dt, - (const char*)(di._s0)); - set_row(rw++, "@68gtramite %s", (const char*)(di._s1)); - set_row(rw++, "@68gcodice azienda %s codice dipendenza %s", - (const char*)(di._s2), (const char*)(di._s3)); - } - } - } - - if (!_is_visliq && !_isregis) set_auto_ff(TRUE); - else set_auto_ff(FALSE); - - _firm_bookmark = -1; -} - - -bool TLiquidazione_app::set_annual(_DescrItem& d) -{ - // chiamata internamente a set_pims - bool ret = FALSE; - - int row = get_maxrow()+1; - if (d._f0 & IS_PRORATA) - { - // non lo ha stampato prima se annuale, perche' vladimiro il nefido - // pretende l'assurdo aggiornamento della perc. a quella nuova - set_row(++row, "%% PRO-RATA ed IVA non detraibile (%s%%)@69g%r", - (const char*)(d._r2.string()), &(d._r6)); - row++; - - set_bookmark("Calcolo pro-rata", _att_bookmark); - - ret = TRUE; - set_print_zero(TRUE); - set_row(row++,""); - set_row(row++,"CALCOLO DELLA PERCENTUALE DI INDETRAIBILITA'"); - set_row(row++,""); - set_row(row++,"Operazioni esenti riga B1@30g%r", &(d._r1)); - set_row(row++,"Operazioni esenti riga B2@30g%r", &(d._r4)); - set_row(row++,"Operazioni esenti riga B3@30g%r", &(d._r5)); - set_row(row++,"Volume d'affari riga B4@30g%r", &(d._r0)); - set_row(row++,"Indetraibilita'@30g%r%%", &(d._r2)); - if (!(d._r3.is_zero())) - { - const char* sss = d._r3.sign() < 0 ? "credito" : "debito"; - real ccc = abs(d._r3); - set_row(row++,"Conguaglio a %s@30g%r", sss, &ccc); - } - set_print_zero(FALSE); - } - return ret; -} - - -void TLiquidazione_app::set_ventila(_DescrItem& d) -{ - if (d._arr.items() == 0 || d._r0.is_zero()) - return; - - set_bookmark("Prospetto ventilazione", _att_bookmark); - - set_row(1,"@54gPROSPETTO VENTILAZIONE"); - set_row(2,""); - set_row(3,""); - set_row(4,"@10gTotale acquisti destinati alla rivendita@55g%r", - &(d._r0)); - set_row(5,"@10gTotale dei corrispettivi da ventilare@55g%r", - &(d._r1)); - real m = d._r1 / d._r0; - set_row(6,"@10gMoltiplicatore@59g%3.9r",&m); - set_row(7,""); - set_row(8,"@10gCod."); - set_row(9,"@10gIVA@17gDescrizione@48gAcquisti" - "@65gImponibile vendite@89gImposta vendite"); - set_row(10,""); - int row = 11; - real t1, t2, t3; - for(int i = 0; i < d._arr.items(); i++) - { - _vDesc& vd = (_vDesc&)d._arr[i]; - look_iva(vd._codiva); - TString s0 = _iva->get("S0"); - set_row(row+i,"@8g%5s@17g%s@41g%r@68g%r@89g%r", - (const char*)vd._codiva, - (const char*)s0, - &(vd._acq), - &(vd._vnd), - &(vd._viv)); - t1 += vd._acq; - t2 += vd._vnd; - t3 += vd._viv; - } - set_row(row+i+1,""); - set_row(row+i+2,"@10gTotale@41g%r@68g%r@89g%r", - &t1, &t2, &t3); - set_auto_ff(TRUE); -} - -void TLiquidazione_app::set_regagr(_DescrItem& d) -{ - set_print_zero(TRUE); - - real& agr_1 = d._r0; - real& agr_2 = d._r1; - real& agr_3 = d._r2; - real& agr_4 = d._r3; - real& agr_5 = d._r4; - real& agr_6 = d._r5; - real& agr_7 = d._r6; - real& agr_1i = d._r7; - real& agr_2i = d._r8; - - real ara = agr_5 + agr_6; - real arn = agr_3 + agr_4; - - // percentuale detraibilita' - // real pdetr = (); - set_bookmark("Prospetto regime agricolo", _att_bookmark); - - set_row(1,"@50gPROSPETTO REGIME AGRICOLO"); - set_row(2,""); - set_row(3, "Cessioni in regime agricolo (Tabella A/I)@54g%r",&agr_1); - set_row(4, ""); - set_row(5, "Cessioni non in regime agricolo@54g%r",&agr_2); - set_row(6, ""); - set_row(7, "Acquisti in regime agricolo@54g%r",&ara); - set_row(8, ""); - set_row(9, "Acquisti non in regime agricolo@54g%r",&arn); - set_row(10, "... di cui beni ammortizzabili@54g%r",&agr_4); - set_row(11, ""); - set_row(12, "Acquisti ad uso promiscuo@54g%r",&agr_7); - - if (/*agr_7.sign() > 0*/ TRUE) - { - real pdetr = (agr_2i / (agr_1i + agr_2i)); - pdetr.round(2); - real ivadt = agr_7 * pdetr; - pdetr *= CENTO; - pdetr.round(ROUND_LIRA); - ivadt.round(ROUND_LIRA); - - TString up = agr_2i.string("."); - up << " x 100"; - TString dn = agr_1i.string("."); - dn << " + " << agr_2i.string("."); - int ln = max(up.len(), dn.len()) + 2; - TString den(ln); den.fill('-'); - up.center_just(ln); dn.center_just(ln); - - set_row(13, ""); - set_row(14, "@31g%s", (const char*)up); - set_row(15, "Percentuale di detraibilita'@31g%s = @54g%r", - (const char*)den, - &pdetr); - set_row(16, "@31g%s", (const char*)dn); - - up = agr_7.string("."); - up << " x " << pdetr.string("."); - dn = "100"; - if ((max(up.len(), dn.len()) + 2) > ln) - ln = max(up.len(), dn.len()) + 2; - TString den1(ln); den1.fill('-'); - up.center_just(ln); dn.center_just(ln); - - set_row(17, ""); - set_row(18, "@31g%s", (const char*)up); - set_row(19, "Iva detraibile@31g%s = @54g%r", - (const char*)den1, - &ivadt); - set_row(20, "@31g%s", (const char*)dn); - } - - set_auto_ff(TRUE); - set_print_zero(FALSE); -} - -void TLiquidazione_app::set_viaggio(_DescrItem& d) -{ - // the longest & stronzest - - // Nel corso della scrittura di questa funzione - // Berlusconi + Fini + Bossi hanno vinto le elezioni - // Il moderno imprenditore illuminato dalla fiamma tricolore - // ha rincoglionito gli imbecilli con la TV e gli stronzi con la P2 - // Che la rovina, la galera e la giustizia rossa - // possano aver campo su tutto - - set_print_zero(TRUE); - - set_bookmark("Prospetto 74 ter", _att_bookmark); - - set_row(1,""); - set_row(2,"@54gRIEPILOGO 74 TER"); - set_row(3,""); - set_row(4,"Ammontare dei corrispettivi relativi a viaggi eseguiti" - " interamente nella CEE .....................@100g%r", &(d._r0)); - set_row(5,"Ammontare dei corrispettivi relativi a viaggi misti (dentro" - " e fuori CEE) ......................... @100g%r", &(d._r1)); - set_row(6,"Ammontare dei corrispettivi relativi a viaggi eseguiti" - " interamente fuori CEE ..................... @100g%r", &(d._r2)); - - real tc = d._r0 + d._r1 + d._r2; - - set_row(7,""); - set_row(8,"@56gTotale corrispettivi@100g%r", &tc); - set_row(9,""); - - set_row(10,"Ammontare dei costi relativi a viaggi interamente" - " svolti nella CEE ............................... @100g%r", - &(d._r3)); - set_row(11,"Ammontare dei costi relativi a viaggi misti (per la" - " parte CEE) ................................... @100g%r", - &(d._r4)); - set_row(12,"Ammontare dei costi relativi a viaggi interamente" - " svolti fuori CEE ............................... @100g%r", - &(d._r5)); - set_row(13,"Ammontare dei costi relativi a viaggi misti (per la" - " parte fuori CEE) .............................@100g%r", - &(d._r6)); - - real tco = d._r3 + d._r4 + d._r5 + d._r6; - - set_row(14,""); - set_row(15,"@64gTotale costi@100g%r", &tco); - - set_row(16,""); - set_row(17,"DETERMINAZIONE CORRISPETTIVI IMPONIBILI " - "RELATIVI A VIAGGI MISTI"); - set_row(18,""); - - // la bella frazioncina della percentuale di ripartizione - TString tmp(d._r4.string(REAL_PICTURE)); tmp.ltrim(); - TString up = tmp; - up << " x 100"; - TString dn = tmp; - tmp = d._r6.string(REAL_PICTURE); tmp.ltrim(); - dn << " + " << tmp; - int ln = max(up.len(), dn.len()) + 2; - TString den(ln); den.fill('-'); - up.center_just(ln); dn.center_just(ln); - real rip = d._r7; rip.round(2); - - // la bella frazioncina degli imponibili viaggi misti - TString tmp2 = d._r1.string(REAL_PICTURE); tmp2.ltrim(); - TString up2 = tmp2; - up2 << " x " << rip.string(2); - TString dn2 = "100"; - int ln2 = max(up2.len(), 3) + 2; - TString den2(ln2); den2.fill('-'); - up2.center_just(ln2); dn2.center_just(ln2); - - // la gran frazionazza centrata e stupenda - int tot = 35 + ln + ln2; - int rem1 = (100 - tot)/2; if (rem1 < 0) rem1 = 0; - int pos1 = rem1 + 13; - int rem2 = pos1+ den.len() + 11; - int pos2 = rem2 + 20; - - real cim = (d._r1 * d._r7)/CENTO; cim.round(ROUND_LIRA); - - set_row(19,format("@%dg%%t@%dg%%t", pos1, pos2), - &up, &up2); - set_row(20,format("@%dgPerc. rip. = %%t = %%5.2r; @%dg" - "Imp. viaggi misti = %%t = @100g%%r", - rem1, rem2), - &den, &rip, &den2, &cim); - set_row(21,format("@%dg%%t@%dg%%t", pos1, pos2), - &dn, &dn2); - - real tmr = d._r0 + cim; - - // whew, come dicono su Topolino - - tmp = d._r0.string(REAL_PICTURE); tmp.ltrim(); - up = "("; up << tmp << " + "; - tmp = cim.string(REAL_PICTURE); tmp.ltrim(); - up << tmp << ")"; - den.fill('.',59-up.len()); - set_row(23,"Ammontare dei corrispettivi imponibili@40g%t %t@100g%r", - &up, &den, &tmr); - - // se e' l'annuale non ha senso altro - if (d._f1) return; - - real tma = d._r3 + d._r4; - tmp = d._r3.string(REAL_PICTURE); tmp.ltrim(); - up = "("; up << tmp << " + "; - tmp = d._r4.string(REAL_PICTURE); tmp.ltrim(); - up << tmp << ")"; - den.fill('.',59-up.len()); - set_row(24,"Ammontare dei costi deducibili@40g%t %t@100g%r", - &up, &den, &tma); - den.fill('.',60); - set_row(25,"Credito di costo precedente @40g%t@100g%r", &den, &(d._r8)); - - real bil = tmr - tma - d._r8; - - tmp = tmr.string(REAL_PICTURE); tmp.ltrim(); - up = "["; up << tmp << " - ("; - tmp = tma.string(REAL_PICTURE); tmp.ltrim(); - up << tmp << " + "; - tmp = d._r8.string(REAL_PICTURE); tmp.ltrim(); - up << tmp << ")]"; - den.fill('.',59-up.len()); - - set_row(26,"Base imponibile lorda@40g%t %t@100g%r", &up, &den, &bil); - set_row(27,""); - - if (bil.sign() > 0) - { - real aliva = aliquota_agvia(); - real alcnt = aliquota_agvia() + CENTO; - real dovuta = (bil/(alcnt/CENTO)) * (aliva/CENTO); - dovuta.ceil(ROUND_LIRA); // ceil voluto da MI3074 - - tmp = bil.string(REAL_PICTURE); tmp.ltrim(); - up = tmp; - up << " x " << aliva.string(5,2); - dn = alcnt.string(); - ln = max(up.len(), 3) + 2; - den.fill('-',ln); - up.center_just(ln); dn.center_just(ln); - - tmp.fill('.', 59 - den.len()); - - set_row(28,"@40g%t",&up); - set_row(29,"IVA A DEBITO@40g%t %t@100g%r", &den, &tmp, &dovuta); - set_row(30,"@40g%t", &dn); - } - else if (bil.sign() < 0) - { - bil = abs(bil); - set_row(28,""); - set_row(29,"CREDITO DI COSTO DA RIPORTARE@100g%r", &bil); - } - - set_print_zero(FALSE); - set_auto_ff(TRUE); -} - -void TLiquidazione_app::set_acconto_p(_DescrItem& d) -{ - set_print_zero(TRUE); - - const char* errmsg[3] = { - {"manca la tabella risultati liquidazione per l'anno corrente"}, -{"manca la tabella risultati liquidazione per l'anno precedente"}, -{"manca la tabella dichiarazione annuale per l'anno precedente"}}; - -set_row(1,"%t@8g%t",&(d._s0), &(d._s1)); -if (d._f2) - set_row(1,"@50g@b*** %s ***@r", errmsg[d._f2 -1]); -else -{ - if (d._f0) // base anno in corso - { - if (d._f1) // stampa base di calcolo - { - real bc = d._r0; - if (bc.sign() < 0) - { - bc = abs(bc); - set_row(1,"@73g%r@86g%r@119g%s", &bc, &d._r1, - d._f3 ? "Si" : "No"); - } - else - set_row(1,"@55g%r@86g%r@119g%s", &bc, &(d._r1), - d._f3 ? "Si" : "No"); - } - else - { - set_row(1,"@51g%r@75g%s", &(d._r1), d._f3 ? "Si" : "No"); - } - } - else - { - if (d._f1) // stampa base di calcolo - set_row(1,"@57g%r@85g%r", &(d._r0), &(d._r1)); - else - set_row(1,"@85g%r",&(d._r1)); - } -} -set_print_zero(FALSE); -} - -void TLiquidazione_app::set_acchead_p(_DescrItem& d) -{ - reset_header(); - set_header(1,"Gestione IVA@109gData @<@125gPag. @#"); - set_header(3,sep); - - if (d._f0) // base anno in corso - { - set_header(2,"@40gCALCOLO ACCONTI IVA DICEMBRE " - "1994 (base anno in corso)"); - if (d._f1) // stampa base calcolo - { - set_header(4,"@51g------- Base di calcolo -------"); - set_header(5,"@1gDitta@8gDenominazione@55gDebito@73gCredito" - "@86gACCONTO calcolato@109gLiq. differita"); - set_header(6,sep); - set_header(7,""); - } - else - { - set_header(4,"@1gDitta@8gDenominazione@51gACCONTO calcolato" - "@75gLiq. differita"); - set_header(5,sep); - set_header(6,""); - } - } - else - { - set_header(5,sep); - set_header(6,""); - if (d._f1) - set_header(4,"@1gDitta@8gDenominazione@57gBase di calcolo" - "@85gACCONTO calcolato"); - else - set_header(4,"@1gDitta@8gDenominazione@85gACCONTO calcolato"); - } -} - - -// --------------------------------------------------------------------- -// Tabulato deleghe -// --------------------------------------------------------------------- - -void TLiquidazione_app::set_deltab(_DescrItem& d, bool iscred) -{ - reset_header(); - int rw = 1; - static bool credpr; - - if (iscred) - { - // set header - set_header(1,"ELENCO DITTE A CREDITO@30g%s %s@109gData @<@125gPag. @#", - d._f0 == 13 ? "Annuale " : itom(d._f0), (const char*)_year); - set_header(2,sep); - set_header(3,"@40gF@60gImporto a"); - set_header(4,"Cod.@8gDenominazione@40gR@62gcredito"); - set_header(5,sep); - set_header(6,""); - - // set rows - for (int i = 0; i < d._arr.items(); i++) - { - TToken_string& tt = (TToken_string&)(d._arr)[i]; - TString cod(tt.get(0)); - TParagraph_string rgs(tt.get(1), 30); - TString diocantaro(rgs.get(0)); - TString frq(tt.get(2)); - real tp (tt.get(3)); - real in (tt.get(4)); - tp -= in; - tp = -tp; - set_row(rw++, "%-5s@8g%-30s@40g%1s@54g%r", - (const char*)cod, (const char*)diocantaro, - (const char*)frq, &tp); - for (int i = 1; i < rgs.items(); i++) - set_row(rw++, "@8g%-30s", (const char*)rgs.get(i)); - } - } - else - { - // set header - set_header(1,"ELENCO DITTE A DEBITO@30g%s %s@109gData @<@125gPag. @#", - d._f0 == 13 ? "Annuale " : itom(d._f0), (const char*)_year); - set_header(2,sep); - set_header(3,"@40gF@60gImporto da@73gCodice@83gCod."); - set_header(4,"Cod.@8gDenominazione@40gR Numero telefonico@63gversare Banca Dip. Con."); - set_header(5,sep); - set_header(6,""); - - - // set rows - for (int i = 0; i < d._arr.items(); i++) - { - TToken_string& tt = (TToken_string&)(d._arr)[i]; - TString cod(tt.get(0)); - TParagraph_string rgs(tt.get(1), 30); - TString diocantaro(rgs.get(0)); - TString frq(tt.get(2)); - real tp (tt.get(3)); - real in (tt.get(4)); - TString abi(tt.get(5)); - TString cab(tt.get(6)); - TString con(tt.get(7)); - TString tel(tt.get(8)); - if (!tel.blank()) - tel << '/'; - tel << tt.get(9); - tp += in; - - - set_row(rw++, "%-5s@8g%-30s@40g%1s %s @55g%r %5s %5s %3s", - (const char*)cod, (const char*)diocantaro, (const char*)frq, - (const char*)tel, &tp, (const char*)abi, - (const char*)cab, (const char*)con); - - for (int i = 1; i < rgs.items(); i++) - set_row(rw++, "@8g%-30s", (const char*)rgs.get(i)); - } - } - set_auto_ff(TRUE); -} +// ------------------------------------------------------------ +// Calcolo liquidazioni +// Part 5: stampa +// fv 21-1-94 +// ------------------------------------------------------------ + +#include + +#include "cg4300.h" + +// flags per annuale +#define IS_PRORATA 0x0001 + + +// minchietta per prospetto ventilazione +class _vDesc : public TObject +{ +public: + TString _codiva; + real _acq; + real _vnd; + real _viv; + _vDesc() : _codiva(5) {} + virtual ~_vDesc() {} +}; + +static char sep[] = +"------------------------------------------------------------------" +"------------------------------------------------------------------"; + +void TLiquidazione_app::set_page(int file, int cnt) +{ + _DescrItem& d = (_DescrItem&)_descr_arr[cnt]; + + set_auto_ff(FALSE); + reset_print(); + + switch(d._flags) + { + case CHG_PARMS: + set_att(d); + break; + case SET_FIRM: + set_firm(d); + break; + case PIM_ROW: + set_pim(d); + break; + case PIM_HEAD: + set_pim_head(); + break; + case MISC_LIQ: + set_pumpam(d); + break; + case TOT_ROW: + set_plm(d); + break; + case PLAFOND: + set_plafond(d); + break; + case VENTILA: + set_ventila(d); + break; + case REGAGR: + set_regagr(d); + break; + case REGVIA: + set_viaggio(d); + break; + case THE_END: + set_grand(d); + break; + case ACCONTO: + set_acconto_p(d); + break; + case ACCHEAD: + set_acchead_p(d); + break; + case DELDEB: + set_deltab(d, FALSE); + break; + case DELCRED: + set_deltab(d, TRUE); + break; + } +} + +print_action TLiquidazione_app::postprocess_page(int file, int cnt) +{ + if (_descr_arr.items() == 0 || cnt == _descr_arr.items()-1) + return NEXT_PAGE; + return REPEAT_PAGE; +} + +bool TLiquidazione_app::preprocess_page(int file, int cnt) +{ + return _descr_arr.items() != 0; +} + +// ---------------------------------------------------------------- +// Print description +// ---------------------------------------------------------------- + +void TLiquidazione_app::describe_att(int month, const char* codatt, + bool isresult, char flags) +{ + TToken_string atts(codatt); + + if (_isprint && _canprint) + { + describe_name(month, atts, flags); + if (atts.items() == 1 && _isplafond) + describe_plafond(month, codatt); + if (atts.items() == 1 && _isvent) + describe_ventilation(month, codatt); + if (atts.items() == 1 && _isagricolo) + describe_agricolo(month, codatt); + if (atts.items() == 1 && _isviaggio) + describe_viaggio(month, codatt); + if (/* isresult || month == 13 */ TRUE) + describe_pims(month,codatt); + if (atts.items() == 1) + describe_consistence(codatt); + } +} + +void TLiquidazione_app::describe_name(int month, TToken_string& codatts, char flags) +{ + _DescrItem* d = new _DescrItem(CHG_PARMS); + + d->_s0 = _nditte->curr().get("CODDITTA"); + d->_s1 = _nditte->curr().get("RAGSOC"); + d->_s2 = _nditte->curr(LF_ATTIV).get("CODATT"); + d->_s3 = codatts.items() == 1 ? (const char*)_nditte->curr(LF_ATTIV).get("DESCR") : ""; + d->_s4 = _freqviva; + + d->_f1 = month; + d->_f2 = _isbenzinaro; + d->_f3 = (word)flags; + + if (_mixed && codatts.items() == 1) + d->_f0 = atoi(codatts.mid(5)); + else d->_f0 = 0; + _descr_arr.add(d); +} + +void TLiquidazione_app::describe_firm(int month) +{ + if (!_isprint || !_canprint) return; + + _DescrItem* d = new _DescrItem(SET_FIRM); + + d->_s0 = _nditte->curr().get("CODDITTA"); + d->_s1 = _nditte->curr().get("RAGSOC"); + d->_s2 = _freqviva; + d->_f1 = month; + _descr_arr.add(d); + +} + + +void TLiquidazione_app::describe_plafond(int month, const char* codatt) +{ + // prepara la descrizione del riepilogo da stampare e lo accoda + real t1, t2, t3; + _DescrItem* d = new _DescrItem(PLAFOND); + + for (int jj = 1; jj <= 3; jj++) // three types of plafond + { + t1 = 0.0; t2 = 0.0; t3 = 0.0; + for (int m = 1; m <= month && m < 13; m++) + { + if (is_month_ok(m,month) && look_ppa(m,codatt,jj)) + { + t1 += _ppa->get_real("R0"); + t2 += _ppa->get_real("R1"); + t3 = _ppa->get_real("R2"); + } + } + switch (jj) + { + case 1: + d->_r0 = t1; d->_r1 = t2; d->_r2 = t3; + break; + case 2: + d->_r3 = t1; d->_r4 = t2; d->_r5 = t3; + break; + case 3: + d->_r6 = t1; d->_r7 = t2; d->_r8 = t3; + break; + } + } // for tipo esenzione plafond + + _descr_arr.add(d); + + // bookmark +} + +void TLiquidazione_app::describe_ventilation(int month, const char* codatt) +{ + if (!_isvent || _isagricolo || _isviaggio) return; + + _DescrItem* d = new _DescrItem(VENTILA); + TString att(codatt); + + look_plm(month, att); + + for (_pim->first(); !_pim->eof(); _pim->next()) + { + if (strcmp(*_pim_codatt,att) != 0) + continue; + + look_reg(*_pim_codreg); + look_iva(*_pim_codiva); + + int tipocr = atoi(*_pim_tipocr); + int tipodet = atoi(*_pim_tipodet); + int mese = atoi(*_pim_mese); + bool corrisp = _reg->get_bool("B0"); + real imponibile = _pim->get_real("R0"); + real imposta = _pim->get_real("R1"); + tiporeg tipomov = (tiporeg)_reg->get_long("I0"); + TString tipoiva = _iva->get("S1"); + + if (_year != *_pim_anno) continue; + + if (imponibile.is_zero() && imposta.is_zero()) continue; + + // questi non vanno in liquidazione, i totali sono + // gia' calcolati altrove + if (tipodet == 1 || (tipodet == 3 && tipocr == 5) || tipodet == 9) + continue; + + // questi non si devono vedere perche' so' bbrutti + if (tipoiva == "NS" || tipoiva == "ES" || tipoiva == "NI") + continue; + + if (mese <= month) + { + if (tipocr == 1 && tipomov == acquisto) + { + // somma agli acquisti + _vDesc* vd = NULL; + for (int i = 0; i < d->_arr.items(); i++) + { + _vDesc* vv = (_vDesc*)&(d->_arr[i]); + if (strcmp(vv->_codiva,*_pim_codiva) == 0) + { vd = vv; break; } + } + if (vd == NULL) { vd = new _vDesc; } + + vd->_acq += (imponibile+imposta); + d->_r0 += (imponibile+imposta); + + if (vd->_codiva.empty()) + { + vd->_codiva = *_pim_codiva; + d->_arr.add(vd); + } + } + else if ((is_month_ok(mese,month) || month == 13) && corrisp + && _pim->get_bool("B1") && + tipocr == 0 && tipomov == vendita) + // non sono sicurissimo della above condition + { + // somma alle vendite + _vDesc* vd = NULL; + for (int i = 0; i < d->_arr.items(); i++) + { + _vDesc* vv = (_vDesc*)&(d->_arr[i]); + if (strcmp(vv->_codiva,*_pim_codiva) == 0) + { vd = vv; break; } + } + if (vd == NULL) { vd = new _vDesc; } + + vd->_vnd += imponibile; + vd->_viv += imposta; + + d->_r1 += imponibile+imposta; + + if (vd->_codiva.empty()) + { + vd->_codiva = *_pim_codiva; + d->_arr.add(vd); + } + } + } + } + if (d->_r1.is_zero() || d->_r0.is_zero()) + delete d; + else + _descr_arr.add(d); +} + +void TLiquidazione_app::describe_agricolo(int month, const char* codatt) +{ + _DescrItem* d = new _DescrItem(REGAGR); + + for (int mese = 1; mese <= month; mese++) + { + if (!is_month_ok(mese,month)) + continue; + + if (!look_plm(mese, codatt)) + continue; + + d->_r0 += _plm->get_real("R5"); + d->_r1 += _plm->get_real("R6"); + d->_r2 += _plm->get_real("R7"); + d->_r3 += _plm->get_real("R8"); + d->_r4 += _plm->get_real("R9"); + d->_r5 += _plm->get_real("R10"); + d->_r6 += _plm->get_real("R11"); + d->_r7 += _pum->get_real("R10"); + d->_r8 += _pum->get_real("R11"); + } + _descr_arr.add(d); +} + +void TLiquidazione_app::describe_viaggio(int month, const char* codatt) +{ + if (!look_lim(month)) return; + + _DescrItem* d = new _DescrItem(REGVIA); + + for (int mese = 1; mese <= month; mese++) + { + if (!is_month_ok(mese,month) || !look_plm(mese, codatt)) + continue; + + d->_r0 += _plm->get_real("R5"); // corrispettivi CEE + d->_r1 += _plm->get_real("R9"); // corrispettivi misti CEE + d->_r2 += _plm->get_real("R6"); // corrispettivi fuori CE + d->_r3 += _plm->get_real("R7"); // acquisti CEE + d->_r4 += _plm->get_real("R10"); // acquisti misti parte CEE + d->_r5 += _plm->get_real("R8"); // acquisti fuori CEE + d->_r6 += _plm->get_real("R11"); // acquisti misti parte fuori CEE + } + + // percentuale ripartizione + d->_r7 = _lim->get_real("R4"); + // credito di costo precedente (CHECK annuale) + d->_r8 = credito_costo_prec(month); + + _descr_arr.add(d); +} + + +void TLiquidazione_app::describe_pims(int month, const char* codatt) + // le si passa una tokenstring (o un codatt) e lei, da brava, calcola + // cumulando per tutte le attivita' nominatele + // ogni riga riguarda un codiva ma tutti i registri + // se il mese e' 13 si guarda tutto l'anno + // se si tratta di una sola attivita' in att. mista evidenziata o servizievole, + // stampa solo vendite e corrispettivi +{ + TToken_string atts(codatt); + TString ref(atts.items() == 1 ? codatt : "ALL"); + const char* tmpatt; + int last = _descr_arr.last(); + bool isfirst = TRUE; + real t0, t1, t2, t3, t4, t5; + real autodafe, autodafe_iva; + + bool skip_acq = atts.items() == 1 && _mixed; + + // descrittore riga autodafe' + _DescrItem* ads = NULL; + // descrittore riga iva dovuta ag. viaggio' + _DescrItem* iads = NULL; + // questa cazzata serve per far apparire l'intestazione delle colonne + // anche se le colonne non ci sono; in tal modo si ottiene una peggior + // chiarezza, una peggiore efficienza, una gran rottura di coglioni, + // ma risulta identico al dio Sistema. + _DescrItem* hea = new _DescrItem(PIM_HEAD); + _descr_arr.add(hea); + + while ((tmpatt = atts.get()) != NULL) + { + TString att(tmpatt); + + for (_pim->first(); !_pim->eof(); _pim->next()) + { + _DescrItem* d = NULL; + // compute + bool ok = look_reg(*_pim_codreg); + ok |= look_iva(*_pim_codiva); + bool isnew = FALSE; + + if (!ok) continue; + + tiporeg tipomov = (tiporeg)_reg->get_long("I0"); + bool corrisp = _reg->get_bool("B0"); + TString tipoiva = _iva->get("S1"); + int tipodet = atoi(*_pim_tipodet); + TString codiva((const char*)(*_pim_codiva)); + TString other = _pim->get("S4"); + + // ACHTUNG! Corrispettivi da ventileer possono ventilare + // ad un altro codiva; in tal caso si scrive quello + if (corrisp && !other.empty()) + { + look_iva(other); + codiva = other; + } + // se e' corrispettivo da ventilare non + // scrivo un cannolo ripieno visto che e' stato ventilato + if (tipomov == vendita && tipoiva == "VE") continue; + + // se e' il dettaglio di una attivita' mista non stampa + // gli acquisti, il perche' losalamadonna + if (tipomov == acquisto && skip_acq) continue; + + // questi non vanno in liquidazione, i totali sono + // gia' calcolati altrove + if (tipodet == 1 || tipodet == 3 || tipodet == 9) + continue; + + // se ha tutti gli importi nulli viene da un annullamento di + // progressivi esistenti + if (_pim->get_real("R0").is_zero() && + _pim->get_real("R1").is_zero() && + _pim->get_real("R2").is_zero()) + continue; + + 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 + for(int i = last+1; i < _descr_arr.items(); i++) + { + d = (_DescrItem*)&_descr_arr[i]; + if (d->_flags == PIM_ROW && + d->_s0 == ref && + d->_s1 == codiva) + break; + if (d->_s1 > codiva) + { + isnew = TRUE; + _DescrItem* dd = new _DescrItem(PIM_ROW); + // CicciaPrassi li vuole in ordine crescente + _descr_arr.insert(dd,i); + // che due maron stereofonic: se quello dopo + // era il primo, quello prima va dopo + if (d->_f0) + { + dd->_f0 = TRUE; + d->_f0 = FALSE; + } + else if (isfirst) + { + d->_f0 = TRUE; + isfirst = FALSE; + } + d = dd; + break; + } + } + if (!isnew && i == _descr_arr.items()) + { + isnew = TRUE; + d = new _DescrItem(PIM_ROW); + if (isfirst) { d->_f0 = TRUE; isfirst = FALSE; } + _descr_arr.add(d); + } + + if (tipomov == acquisto) + { + d->_r4 += _pim->get_real("R0"); + d->_r5 += _pim->get_real("R1"); + t4 += _pim->get_real("R0"); + t5 += _pim->get_real("R1"); + } + else // vendita + { + // vedi corrispettivi veri e falsi + real cvi = _pim->get_real("R0"); // imp. totale + real cvv = _pim->get_real("R1"); // iva totale + real cfi = _pim->get_real("R13"); // imp. falsi corrispettivi + real cfv = _pim->get_real("R14"); // iva falsi corrispettivi + + if (corrisp) + { + cvi -= cfi; + cvv -= cfv; + } + + if (corrisp) + { + // usa R0 e R1 visto che la ventilazione e' gia' + // stata calcolata + real ifs(_pim->get_real("R5")); // imp. fatture con scontrino + real vfs(_pim->get_real("R6")); // iva fatture con scontrino + + d->_r2 += (cvi /* - ifs */); // tolgo FS dai corrispettivi + d->_r3 += (cvv /* - vfs */); + d->_r0 += ifs; // aggiungo FS alle vendite + d->_r1 += vfs; + t2 += (cvi /* - ifs */); // idem per i totali + t3 += (cvv /* - vfs */); // non sono molto convinto ma vogliono cio' + t0 += ifs; // ...avevo ragione e infatti l'ho cambiato + t1 += vfs; + } + + if (!corrisp || (!cfv.is_zero() || !cfi.is_zero())) + { + real adf, adi; // autofatture non residenti art. 17 + + real vendi = corrisp ? cfi : _pim->get_real("R0"); + real vendv = corrisp ? cfv : _pim->get_real("R1"); + + // si scorporano solo per l'annuale, altrimenti + // vengono normalmente considerati nelle vendite + if (month == 13) + { + adf = _pim->get_real("R7"); + adi = _pim->get_real("R8"); + } + + d->_r0 += vendi - adf; + d->_r1 += vendv - adi; + t0 += vendi /* - adf */; + t1 += vendv /* - adi */; + + autodafe += adf; + autodafe_iva += adi; + } + } + if (isnew) + { + d->_s0 = ref; + d->_s1 = codiva; + // flag per stampare l'intestazione colonne + } + } + } + + look_plm(month,att); + real iva74t = _pom->get_real("R13"); + if (iva74t.sign() > 0) + { + if(iads == NULL) iads = new _DescrItem(PIM_ROW); + iads->_s0 = "74TER"; // cosi' vollero + iads->_s1 = "IVA "; // cosi' vollero + iads->_s2 = " dovuta - 74 ter"; // cosi' vollero + iads->_r1 += iva74t; + t1 += iva74t; + if (isfirst) + { + isfirst = FALSE; + iads->_f0 = TRUE; + } + } + } + + if (autodafe.sign() > 0 || autodafe_iva.sign() > 0) + { + _DescrItem* ads = new _DescrItem(PIM_ROW); + ads->_s0 = ref; + ads->_s1 = "A35"; // cosi' vollero + ads->_r0 = autodafe; + ads->_r1 = autodafe_iva; + if (isfirst) + { + isfirst = FALSE; + ads->_f0 = TRUE; + } + _descr_arr.add(ads); + } + + // ag. viaggio: iva dovuta 74 ter la vogliono in mezzo ai progressivi + if (iads != NULL) _descr_arr.add(iads); + + // prepara una bella riga di totali + if (/* !isfirst */ TRUE) + { + _DescrItem* d = new _DescrItem(TOT_ROW); + d->_r0 = t0; d->_r1 = t1; + d->_r2 = t2; d->_r3 = t3; + d->_r4 = t4; d->_r5 = t5; + + // aggiunge dati ptm + _DescrItem* t = new _DescrItem(MISC_LIQ); + t->_f1 = isfirst; // per il form feed + + TToken_string ttm("0|0|0"); + + for (int m = 1; m <= month && m < 13; m++) + { + if (!is_month_ok(m,month)) continue; + + atts.restart(); + while ((tmpatt = atts.get()) != NULL) + { + TString att(tmpatt); + look_plm(m, att); + real ad1, ad2; + + d->_r6 += _pom->get_real("R0"); // acq. intracomunitari + d->_r7 += _pom->get_real("R1"); // inded. art 19 + d->_r8 += _pom->get_real("R2"); // IVA su inded. art. 19 + t->_r0 += _pom->get_real("R3"); // acq. ammortizz. detr + t->_r1 += _pom->get_real("R4"); // IVA acq. ammort. detr + t->_r2 += _pum->get_real("R2"); // ammort. detr. 6% + t->_r3 += _pum->get_real("R3"); // IVA ammort detr. 6% + t->_r4 += _pom->get_real("R5"); // acq. beni rivendita + t->_r5 += _pom->get_real("R6"); // IVA acq. beni rivendita + t->_r6 += _pom->get_real("R7"); // acq. leasing + t->_r7 += _pom->get_real("R8"); // IVA acq. leasing + t->_r8 += _pum->get_real("R0"); // cessioni beni ammort. + t->_r9 += _pum->get_real("R1"); // IVA su cessioni ammort. + t->_r10 += _pum->get_real("R4"); // tot. esenti IVA + t->_r11 += _plm->get_real("R2"); // pro-rata indetraibile + + ad1 = real(ttm.get(1)); + ad2 = real(ttm.get(2)); + ad1 += _pom->get_real("R11"); + ad2 += _pom->get_real("R12"); + ttm.add(_plm->get("R12"), 0); // % pro-rata + ttm.add(ad1.string(),1); // imp. acq. amm. indetr. + ttm.add(ad2.string(),2); // IVA acq. amm. indetr + t->_s0 = ttm; + + t->_f0 = !_prorata.is_zero() && (month != 13); // flag per segnalare l'esistenza + d->_r9 += _pom->get_real("R9"); // acq. inded. su ricavi esenti + d->_r10 += _pom->get_real("R10"); // IVA acq. inded. su ricavi esenti + + // passaggi interni + real aipip(d->_s0); // progressivo ... + real aipivp(d->_s1); // ... (che mazzata sulle palle...) + aipip += _pum->get_real("R8"); // acq. inded. per pass. int + aipivp += _pum->get_real("R9"); // IVA acq. inded. per pass. int + d->_s0 = aipip.string(); // risbatto ... + d->_s1 = aipivp.string(); // .. + + // spese generali. + real spgnp(t->_s2); // progressivo ... + real spgnvp(t->_s3); // ... (che doppia mazzata sulle palle...) + spgnp += _pam->get_real("R10"); // spese generali. + spgnvp += _pam->get_real("R11"); // IVA spese generali. + t->_s2 = spgnp.string(); // risbatto ... + t->_s3 = spgnvp.string(); // .. + + // sospensione imposta: non piu' due palle, ma QUATTRO + TToken_string tt(t->_s4); + real aqsi(tt.get(0)); + real aqsv(tt.get(1)); + real vnsi(tt.get(2)); + real vnsv(tt.get(3)); + + aqsi += _pam->get_real("R6"); + aqsv += _pam->get_real("R7"); + vnsi += _pam->get_real("R8"); + vnsv += _pam->get_real("R9"); + + tt = ""; + tt.add(aqsi.string()); + tt.add(aqsv.string()); + tt.add(vnsi.string()); + tt.add(vnsv.string()); + t->_s4 = tt; + + } // while (attivita') + } // for (mese ok) + + + // annual follows in _arr + 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 v1 = _pla->get_real("R14"); + real v2(_pla->get("S1")); + 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 iaq = _pla->get_real("R11"); // IVA acquisti + real ppg = _pla->get_real("R12"); // pro-rata pagato + + // calcola nuovo prorata per ogni attivita' (miste: 1+2) + real ris = v - am - e3; + + real pr(0.0); + if (!ris.is_zero()) + pr = (e1/ris) * CENTO; + real co = 0.0; + real topay = 0.0; + pr.round(ROUND_LIRA); + if (pr != _prorata) + { + // calcolo conguaglio -- se positivo e' a debito + topay = iaq * (pr / CENTO); + co = topay - ppg; + co.round(ROUND_LIRA); + } + + _DescrItem* dd = new _DescrItem(ANNUAL); + + // prorata + if (!_prorata.is_zero()) + dd->_f0 |= IS_PRORATA; + dd->_r0 = ris; + dd->_r1 = e1; + dd->_r2 = pr; + dd->_r3 = co; + dd->_r4 = e2; + dd->_r5 = e3; + dd->_r6 = topay; + t->_arr.add(dd); + } + } + _descr_arr.add(d); + _descr_arr.add(t); + } +} + + +void TLiquidazione_app::describe_liq(int month, const char* codatts, + _DescrItem* di) +{ + if (!_isprint || !_canprint) return; + + if (!look_lim(month)) return; + + _DescrItem* d = new _DescrItem(THE_END); + + // gli diamo la stessa struttura di LIM + d->_r0 = _lim->get_real("R0"); + d->_r1 = _lim->get_real("R1"); + d->_r2 = _lim->get_real("R2"); + d->_r3 = _lim->get_real("R3"); + d->_r4 = _lim->get_real("R4"); + d->_r5 = _lim->get_real("R5"); + d->_r6 = _lim->get_real("R6"); + d->_r7 = _lim->get_real("R14"); + d->_r9 = _lim->get_real("R9"); + d->_r10 = _lim->get_real("R7"); // totale conguaglio prorata + + TToken_string tt(80); + tt.add(_lam->get_real("R0").string()); + tt.add(_lam->get_real("R1").string()); + tt.add(_lam->get_real("R2").string()); + tt.add(_lam->get_real("R3").string()); + + d->_s0 = tt; + d->_s1 = _lim->get_real("R11").string(); + d->_s2 = _lim->get_real("R12").string(); + d->_s3 = _lim->get_real("R13").string(); + d->_r11 = (const char*)_lim->get("R10"); // tasso di interesse + + if (_is_visliq) + { + // tutti i versamenti, sempre e comunque + d->_r8 = versamenti_IVA(_month, "1", TRUE); + } + else + // rispettiamo tutte le casistiche per i versamenti + d->_r8 = _lim->get_real("R8"); + + + // aggiunge eventuale satellite per rimborso infraannuale + if (di != NULL) d->_arr.add(di); + + if (!_is_visliq) + { + _DescrItem* dv = describe_deleghe(month); + if (dv != NULL) d->_arr.add(dv); + } + _descr_arr.add(d); +} + +_DescrItem* TLiquidazione_app::describe_deleghe(int month) +{ + if (!look_del(month,1)) return NULL; + + _DescrItem* d = new _DescrItem(DELEGA); + + if (_del->get_bool("B0")) + { + d->_s0 = _del->get("S2"); // localita' + d->_s1 = _del->get("S1"); // banca + d->_s2 = _del->get("S7"); // ABI + d->_s3 = _del->get("S8"); // CAB + d->_r0 = _del->get_real("R0") + _del->get_real("R1"); + d->_d0 = _del->get_date("D0"); + } // altrimenti lascia tutto in bianco e ci scriveranno i dati a mano + + return d; +} + +void TLiquidazione_app::describe_consistence(const char* codatt) +{ + // controlla eventuali condizioni di conflitto con le normative + // per la ditta e crea i messaggi appropriati + // tutte le condizioni sono valutate sull'esercizio precedente + int pryear = atoi(_year) - 1; + TString att = codatt; + + _pla->zero(); + *_pla_ditta = get_firm(); + *_pla_anno = pryear; + *_pla_codatt = att; + + if (_pla->read() == NOERR) + { + real va = _pla->get_real("R0"); + + // 1) consistenza volume d'affari <-> frequenza versamenti + // deve essere: trimestrale ammesso solo se < 360.000.000 + // per servizi, < 1.000.000.000 per altre imprese + // a meno che non sia benzinaro che ha diritto comunque + + if (_freqviva == "T" && !_isbenzinaro) + { + bool err = FALSE; + if (_isservizio) err = va > SOGLIA_TRIM_SERVIZI; + else err = va > SOGLIA_TRIM_ALTRE; + if (err) + describe_error("Incoerenza volume affari/frequenza versamenti", + att); + } + } +} + + +void TLiquidazione_app::describe_error(const char* err, const char* codatt) +{ + if (!_isprint || !_canprint) return; + _errors.add(new _ErrItem(err,codatt,_nditte->curr().get("CODDITTA"))); +} + +// ---------------------------------------------------------------- +// Setrows +// ---------------------------------------------------------------- + +void TLiquidazione_app::set_firm(_DescrItem& d) +{ + TString tim_title(80); + tim_title << "Liquidazione IVA"; + + if (d._f1 == 13) + tim_title << format(": Riepilogo Annuale %s",(const char*)_year); + else + { + if (d._s2 == "T") + tim_title << format(" del %d° Trimestre %s", d._f1/3, (const char *) _year); + else + tim_title << format(" del mese di %s %s", itom(d._f1), + (const char*)_year); + } + + reset_header(); + int soh = 1; + if (!_isregis) + { + set_header(soh++,"Ditta %s %s@109gData @<@125gPag. @#", + (const char*)(d._s0), (const char*)(d._s1)); + set_header(soh++,""); + } + set_header(soh++,sep); + set_header(soh++,"%s@102gFrequenza %s", + (const char*)tim_title, + d._s2 == "T" ? "Trimestrale" : "Mensile"); + set_header(soh++,sep); + set_header(soh++,""); + + // notify errors if any + int j = 0; + for (int i = 0; i < _errors.items(); i++) + { + _ErrItem& s = (_ErrItem&)_errors[i]; + if (s._att == "ALL" && s._firm == d._s0) + { j++; set_row(i+3, "@5g@b*** %s ***@r", (const char*)s._err); } + } + if (j) set_row(i+3,""); +} + + +void TLiquidazione_app::set_att(_DescrItem& d) +{ + // set header + TString tim_title(78); + TString att_title(48); + + // Bookmark + TString book_name(d._s3); + char flags = (char)d._f3; + + if (flags == '1') book_name << " (servizi)"; + else if (flags == '2') book_name << " (altre)"; + else if (flags == 'M') book_name = "Riepilogo att. mista"; + else if (flags == 'Q') book_name = "Riepilogo quater"; + + if (_firm_bookmark == -1) + _firm_bookmark = set_bookmark(d._s1); + _att_bookmark = set_bookmark(book_name, _firm_bookmark); + + tim_title << "Liquidazione IVA"; + + if (d._f1 == 13) + { + if (d._s4 == "T" && !(d._f2)) // trimestrale e non benzinaro + tim_title << format(": Riepilogo Annuale %s",(const char*)_year); + else + tim_title << format(": Dichiarazione Annuale %s",(const char*)_year); + } + else + { + if (d._s4 == "T") + tim_title << format(" del %d° Trimestre %s", d._f1/3, (const char *) _year); + else + tim_title << format(" del mese di %s %s", itom(d._f1), + (const char*)_year); + } + + TString tipatt; + + if (d._f0 > 0) + tipatt.format(d._f0 == 1 ? "SERVIZI" : "ALTRE ATTIVITA'"); + + if (d._s3.empty()) + { + att_title = flags == 'M' ? "Riepilogo attivita' mista" : + "Riepilogo quater"; + // att_title << d._s2; + } + else + att_title = format("Attivita' %s %s %s", + (const char*)(d._s2), + (const char*)(d._s3), + (const char*)tipatt); + + reset_header(); + int soh = 1; + if (!_isregis) + { + set_header(soh++,"Ditta %s %s@109gData @<@125gPag. @#", + (const char*)(d._s0), (const char*)(d._s1)); + set_header(soh++,""); + } + set_header(soh++,sep); + set_header(soh++,"%s@55g%s", (const char*)tim_title, (const char*)att_title); + set_header(soh++,sep); + set_header(soh++,""); + + // notify errors if any + int j = 0; + for (int i = 0; i < _errors.items(); i++) + { + _ErrItem& s = (_ErrItem&)_errors[i]; + if (d._s2 == s._att && s._firm == d._s0) + { j++; set_row(i+10, "@5g@b*** %s ***@r", (const char*)s._err); } + } + if (j) set_auto_ff(TRUE); +} + + +void TLiquidazione_app::set_plafond(_DescrItem& d) +{ + if (_isregis) return; + + set_bookmark("Quadro plafond", _att_bookmark); + + real r1 = d._r2 - d._r1 - d._r0; + real r2 = d._r5 - d._r4 - d._r3; + real r3 = d._r8 - d._r7 - d._r6; + + set_print_zero(TRUE); + + set_row(1,"QUADRO RELATIVO ALLA DISPONIBILITA' ED ALL'UTILIZZO " + "MENSILE DEI PLAFOND"); + + set_row(2,""); set_row(3,""); + set_row(4,"Art. 8 1° comma lettere a-b@31gDisponibile@48g%r", + &(d._r2)); + set_row(5,"Utilizzato all'interno@48g%r", &(d._r0)); + set_row(6,"Utilizzato per l'importazione@48g%r@69gRiporto@78g%r", + &(d._r1), &r1); + + set_row(7,""); + set_row(8,"Art. 8bis 1° comma@31gDisponibile@48g%r", + &(d._r5)); + set_row(9,"Utilizzato all'interno@48g%r", &(d._r3)); + set_row(10,"Utilizzato per l'importazione@48g%r@69gRiporto@78g%r", + &(d._r4), &(r2)); + + set_row(11,""); + set_row(12,"Art. 9 1° comma@31gDisponibile@48g%r", + &(d._r8)); + set_row(13,"Utilizzato all'interno@48g%r", &(d._r6)); + set_row(14,"Utilizzato per l'importazione@48g%r@69gRiporto@78g%r", + &(d._r7), &r3); + + set_print_zero(FALSE); + set_auto_ff(); +} + +void TLiquidazione_app::set_pim_head() +{ + set_bookmark("Riepilogo progressivi", _att_bookmark); + set_row(1," Cod.@41gVENDITE@71gCORRISPETTIVI@106gACQUISTI"); + set_row(2," IVA Descrizione@30gImponibile@49gImposta@63gImponibile" + "@82gImposta@96gImponibile@115gImposta"); + set_row(3,""); +} + +void TLiquidazione_app::set_pim(_DescrItem& d) +{ + // succede con le autocazzate non residenti non moviomentate eccetera + if ((d._r0 + d._r1 + d._r2 + d._r3 + d._r4 + d._r5) == ZERO) + return; + + int rw = 1; + if (d._s1 == "A35") + d._s2 = "Artt.17c3/74c1"; + else if (d._s0 == "74TER") + rw++; + else + { + look_iva(d._s1); + d._s2 = _iva->get("S0"); + if (d._s2.len() > 19) d._s2.cut(19); + } + + if (d._f0) // e' il primo: non fa piu' nulla perche' l'intestazione + // viene fatta comunque da set_pim_head + {} + + set_row(rw++,"%4s %s@25g%r@41g%r@58g%r@74g%r@91g%r@107g%r", + (const char*)d._s1, + (const char*)d._s2, + &(d._r0), + &(d._r1), + &(d._r2), + &(d._r3), + &(d._r4), + &(d._r5)); +} + +void TLiquidazione_app::set_plm(_DescrItem& d) +{ + int rw = 1; + if (!(d._r0.is_zero() && + d._r1.is_zero() && + d._r2.is_zero() && + d._r3.is_zero() && + d._r4.is_zero() && + d._r5.is_zero())) + { + set_row(rw++,""); set_row(rw++,""); + set_row(rw++,"Totale@25g%r@41g%r@58g%r@74g%r@91g%r@107g%r", + &(d._r0), + &(d._r1), + &(d._r2), + &(d._r3), + &(d._r4), + &(d._r5)); + set_row(rw++,""); + } + if (!d._r6.is_zero()) + { + set_row(rw++,"di cui per acquisti intracomunitari@107g%r", &(d._r6)); + } + if (!(d._r7.is_zero() && d._r8.is_zero())) + { + set_row(rw++,"Totali acquisti indeducibili per art.19@91g%r@107g%r", + &(d._r7), &(d._r8)); + } + if (! (d._r9.is_zero() && d._r10.is_zero())) + { + set_row(rw++, "Totale acquisti indeducibili su ricavi esenti@91g%r@107g%r", + &(d._r9), + &(d._r10)); + } + + real acq_pint(d._s0); + real acq_pint_iva(d._s1); + + if (! (acq_pint.is_zero() && acq_pint_iva.is_zero())) + { + set_row(rw++, "Totale acquisti indeducibili per passaggi interni@91g%r@107g%r", + &acq_pint, + &acq_pint_iva); + } + + real tot1 = d._r7 + d._r4 + d._r9 + acq_pint; + real tot2 = d._r8 + d._r5 + d._r10 + acq_pint_iva; + + if (tot1 != d._r4 || tot2 != d._r5) + { + // i corrispettivi finiscono nelle vendite + d._r0 += d._r2; + d._r1 += d._r3; + d._r2 = ZERO; + d._r3 = ZERO; + // per ora lascio r2 e r3 anche se sono sempre 0 + set_row(rw++, ""); + set_row(rw++,"Totale Generale IVA@25g%r@41g%r@58g%r@74g%r@91g%r@107g%r", + &(d._r0), + &(d._r1), + &(d._r2), + &(d._r3), + &tot1, + &tot2); + } +} + + +void TLiquidazione_app::set_pumpam(_DescrItem& d) +{ + bool printed = FALSE; + + // d._f1 dice se c'era qualcosa sopra nella stessa pagina + real spgn(d._s2); + real spgn_iva(d._s3); + + TToken_string tt(d._s4); // Token String + TToken_string dp(d._s0); // Due Palle + real aqsi(tt.get(0)); + real aqsv(tt.get(1)); + real vnsi(tt.get(2)); + real vnsv(tt.get(3)); + real ammindi(dp.get(1)); + real ammindv(dp.get(2)); + + int row = 5; + + if (!(aqsi.is_zero() && aqsv.is_zero())) + { + printed = TRUE; + set_row(row++, "Acquisti in sospensione di imposta@50g%r@69g%r", + &aqsi, + &aqsv); + } + if (!(vnsi.is_zero() && vnsv.is_zero())) + { + printed = TRUE; + set_row(row++, "Vendite in sospensione di imposta@50g%r@69g%r", + &vnsi, + &vnsv); + } + if (!(d._r8.is_zero() && d._r9.is_zero())) + { + printed = TRUE; + set_row(row++, "Cessione beni ammortizzabili@50g%r@69g%r", + &(d._r8), + &(d._r9)); + } + if (! (d._r4.is_zero() && d._r5.is_zero())) + { + printed = TRUE; + set_row(row++, "Acquisto beni destinati alla rivendita@50g%r@69g%r", + &(d._r4), + &(d._r5)); + } + if (! (ammindi.is_zero() && ammindv.is_zero())) + { + printed = TRUE; + set_row(row++, "Acquisto beni ammortizzabili IVA indetraibile@50g%r@69g%r", + &ammindi, + &ammindv); + } + if (! (d._r0.is_zero() && d._r1.is_zero())) + { + printed = TRUE; + set_row(row++, "Acquisto beni ammortizzabili IVA detraibile@50g%r@69g%r", + &(d._r0), + &(d._r1)); + } + if (!(d._r6.is_zero() && d._r7.is_zero())) + { + printed = TRUE; + set_row(row++, "Altri beni strumentali acquisiti in leasing@50g%r@69g%r", + &(d._r6), + &(d._r7)); + } + if (!(d._r2.is_zero() && d._r3.is_zero())) + { + printed = TRUE; + real rn = d._r2 * real(DETRAZIONE_6PERCENTO); + set_row(row++, "Acquisto beni soggetti a detrazione (6%%)" + "@50g%r@69g%r@86g%r", + &(d._r2), + &(d._r3), + &rn); + } + if (!(spgn.is_zero() && spgn_iva.is_zero())) + { + printed = TRUE; + set_row(row++, "Spese generali@50g%r@69g%r", + &spgn, + &spgn_iva); + } + if (d._f0) + { + printed = TRUE; + real prc(dp.get(0)); + + set_row(row++, "%% PRO-RATA ed IVA non detraibile (%s%%)@69g%r", + (const char*)prc.string(), &(d._r11)); + } + + // items vari per dichiarazione annuale + for (int i = 0; i < d._arr.items(); i++) + { + _DescrItem& dd = (_DescrItem&)d._arr[i]; + printed |= set_annual(dd); + } + + if (printed) + { + set_bookmark("Altri dati", _att_bookmark); + + set_row(1,""); + set_row(2,""); + set_row(3,"ALTRI DATI RELATIVI ALLA DICHIARAZIONE@55gimponibile" + "@77gimposta@91gdetrazione"); + set_row(4,""); + } + else /* if (!d._f1) */ + set_row(1,""); + + // form feed + /* if (printed || !d._f1) */ set_auto_ff(TRUE); +} + +void TLiquidazione_app::set_grand(_DescrItem& d) +{ + real& risultato = d._r0; + real& rimborso = d._r1; + real& cred_cost = d._r2; + real& deb_mens = d._r3; + real& rettifiche = d._r5; + real& detrazioni = d._r6; + 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)); + real cred_prec(tt.get(2)); + real debt_prec(tt.get(3)); + + real acc_dec(d._s1); + real res_cred(d._s2); + real res_debt(d._s3); + real rett_debt(0.0); + real rett_cred(0.0); + real& interesse = d._r11; + + if (rettifiche.sign() > 0) rett_debt = rettifiche; + if (rettifiche.sign() < 0) rett_cred = -rettifiche; + + set_bookmark("Riepilogativo liquidazione", _firm_bookmark); + + set_row(1,""); set_row(2,""); set_row(3,""); set_row(4,""); + set_row(5,"@11g@bCALCOLO LIQUIDAZIONE D'IMPOSTA@r"); + set_row(6,""); int rw = 7; + set_row(rw++," @66gCredito@84gDebito"); set_row(rw++,""); + set_row(rw++,"@11gIva sulle operazioni di vendita@75g%r", &iva_vend); + set_row(rw++,"%s@11gRettifiche IVA a debito%s@75g%r", + _is_visliq ? "$[r]" : "", _is_visliq ? "$[n]" : "", &rett_debt); + set_row(rw++,"%s@11gIva chiesta a rimborso%s@75g%r", + _is_visliq ? "$[r]" : "", _is_visliq ? "$[n]" : "", &rimborso); + + // conguaglio prorata + if (conguaglio.sign() > 0) + { + set_row(rw++,"@11gConguaglio pro-rata@75g%r", &conguaglio); + } + + // debito liq. precedente < 50000 + if (debt_prec > ZERO) + set_row(rw++,"@11gDebito da liquidazione precedente@75g%r", &debt_prec); + + set_row(rw++,"@11gRISULTATO@75g%r", &res_debt); + set_row(rw++,"@11gIva sulle operazioni di acquisto@58g%r", &iva_acq); + if (_isannual) + set_row(rw++,"@11gCredito inizio anno@58g%r", &cred_prec); + else + set_row(rw++,"@11gCredito precedente@58g%r", &cred_prec); + + if (!acc_dec.is_zero()) + set_row(rw++,"%s@11gVersamento acconto dicembre%s@58g%r", + _is_visliq ? "$[r]" : "", _is_visliq ? "$[n]" : "", &acc_dec); + + if (!detrazioni.is_zero()) + set_row(rw++,"@11gUlteriori detrazioni@58g%r", &detrazioni); + + set_row(rw++,"%s@11gRettifiche IVA a credito%s@58g%r", + _is_visliq ? "$[r]" : "", _is_visliq ? "$[n]" : "", &rett_cred); + + if (_is_visliq) + { + // stampa ad uso visualizzazione liquidazione IVA + // set_row(rw++,"@11g$[r]Versamenti effettuati$[n]@58g%r", &versamenti); + } + else + { + // versamenti effettuati + if (!versamenti.is_zero()) + { + set_row(rw++,"@11gVersamenti effettuati@58g%r", &versamenti); + } + // versamenti integrativi + if (!vers_int.is_zero()) + { + set_row(rw++,"@11gVersamenti integrativi@58g%r", &vers_int); + } + } + if (conguaglio.sign() < 0) + { + real cg = conguaglio; + cg = -cg; + set_row(rw++,"@11gConguaglio pro-rata@58g%r", &cg); + } + set_row(rw++,"@11gRISULTATO@58g%r", &res_cred); + + // se non c'e' nulla da versare stampa solo una riga vuota + // Serve, non toglierla, stronzo. + if (risultato.is_zero()) + set_row(rw++,""); + else + { + if (risultato.sign() < 0) + { + real iva = abs(risultato); + if (_isannual || _isriepilogo) iva.round(ROUND_MILLELIRE); + set_row(rw++,"@23gCREDITO ATTUALE@58g%r",&iva); + } + else + { + real iva = risultato + interessi; + if (_isannual || _isriepilogo) iva.round(ROUND_MILLELIRE); + if (!iva.is_zero()) + { + if (!interessi.is_zero()) + { + set_row(rw++,"@23gIVA DOVUTA@75g%r",&risultato); + set_row(rw++,"@23gInteresse %6.2r %%@75g%r",&interesse, &interessi); + } + if (iva >= IVA_DA_RIPORTARE || _isannual || _isriepilogo) + set_row(rw++,"@23gIVA DA VERSARE@75g%r",&iva); + else + set_row(rw++,"@23gIVA A DEBITO DA NON VERSARE@75g%r",&iva); + } + } + } + + // rapportini per rimborso infraannuale + // non si stampano se la stampa serve per la visualizz. + //modifica del 07/07/1995 + //*** solo in st.di prova in coda ai registri deve scendere + // il prospetto di rimborso + //*** sempre (cioe' in bollato e in prova) deve scendere + // il prospettino versamento (boh???????????????????) + //if (d._arr.items() > 0 && !_is_visliq && !_isregis) + if (d._arr.items() > 0 && !_is_visliq) + { + for (int i = 0; i < d._arr.items(); i++) + { + _DescrItem& di = (_DescrItem&)d._arr[i]; + + if (di._flags == RIMBORSO) + { + if (!_isregis || (_isregis && !_isfinal)) + { + set_print_zero(TRUE); + set_row(rw++,""); + set_row(rw++,""); + + set_bookmark("Prospetto di rimborso", _firm_bookmark); + + set_row(rw++, " PROSPETTO DI RIMBORSO"); + + if (di._f0) + { + // esenti e non imponibili + set_row(rw++,""); + set_row(rw++,"1) Soggetto con quota di operazioni esenti e non" + " imponibili superiore al 25%%"); + + real perc = (di._r0/di._r1); perc *= CENTO; perc.round(ROUND_LIRA); + + TString sep(strlen(REAL_PICTURE)+2); sep.fill('-'); + set_row(rw++,""); + set_row(rw++,"@26gTotale operazioni esenti e non imp.@66g%r", + &(di._r0)); + set_row(rw++,"@66g%t x 100 = %3r%%", &sep, &perc); + set_row(rw++,"@26gVolume di affari lordo@66g%r", &(di._r1)); + set_row(rw++,""); + } + + if (di._f1) + { + set_row(rw++,""); + set_row(rw++,"2) Soggetto con acquisti ad aliquota media " + "superiore a quella delle vendite"); + TString sep(strlen(REAL_PICTURE)+2); sep.fill('-'); + set_row(rw++,""); + set_row(rw++,"@26gTotale imposte sugli acquisti@66g%r", &(di._r5)); + set_row(rw++,"@66g%t x 100 = %5.2r%%", &sep, &(di._r7)); + set_row(rw++,"@26gTotale imponibili sugli acquisti@66g%r", + &(di._r3)); + set_row(rw++,""); + set_row(rw++,"@26gTotale imposte sulle vendite@66g%r", &(di._r4)); + set_row(rw++,"@66g%t x 100 = %5.2r%%", &sep, &(di._r6)); + set_row(rw++,"@26gTotale imponibili sulle vendite@66g%r", &(di._r2)); + } + + set_print_zero(FALSE); + } + } + // prospettino versamento + else if (di._flags == DELEGA) + { + int rr = rw; + if (rw < (printer().formlen() - 10)) + rw = printer().formlen() - 10; + + for (int i = rr; i < rw; i++) set_row(i,""); + + set_bookmark("Riepilogo versamenti", _firm_bookmark); + + TString dt = di._d0.string(); + TString vr = di._r0.string("###.###.###.###"); + + // la cincia non vuole lo zero + if (atof(vr) == 0.0 && vr[vr.len()-1] == '0') vr[vr.len()-1] = ' '; + + set_row(rw++, "Versamento di L. %s effettuato il %s@68gdiretto all'ufficio IVA di %s", + (const char*)vr, + (const char*)dt, + (const char*)(di._s0)); + set_row(rw++, "@68gtramite %s", (const char*)(di._s1)); + set_row(rw++, "@68gcodice azienda %s codice dipendenza %s", + (const char*)(di._s2), (const char*)(di._s3)); + } + } + } + + if (!_is_visliq && !_isregis) set_auto_ff(TRUE); + else set_auto_ff(FALSE); + + _firm_bookmark = -1; +} + + +bool TLiquidazione_app::set_annual(_DescrItem& d) +{ + // chiamata internamente a set_pims + bool ret = FALSE; + + int row = get_maxrow()+1; + if (d._f0 & IS_PRORATA) + { + // non lo ha stampato prima se annuale, perche' vladimiro il nefido + // pretende l'assurdo aggiornamento della perc. a quella nuova + set_row(++row, "%% PRO-RATA ed IVA non detraibile (%s%%)@69g%r", + (const char*)(d._r2.string()), &(d._r6)); + row++; + + set_bookmark("Calcolo pro-rata", _att_bookmark); + + ret = TRUE; + set_print_zero(TRUE); + set_row(row++,""); + set_row(row++,"CALCOLO DELLA PERCENTUALE DI INDETRAIBILITA'"); + set_row(row++,""); + set_row(row++,"Operazioni esenti riga B1@30g%r", &(d._r1)); + set_row(row++,"Operazioni esenti riga B2@30g%r", &(d._r4)); + set_row(row++,"Operazioni esenti riga B3@30g%r", &(d._r5)); + set_row(row++,"Volume d'affari riga B4@30g%r", &(d._r0)); + set_row(row++,"Indetraibilita'@30g%r%%", &(d._r2)); + if (!(d._r3.is_zero())) + { + const char* sss = d._r3.sign() < 0 ? "credito" : "debito"; + real ccc = abs(d._r3); + set_row(row++,"Conguaglio a %s@30g%r", sss, &ccc); + } + set_print_zero(FALSE); + } + return ret; +} + + +void TLiquidazione_app::set_ventila(_DescrItem& d) +{ + if (d._arr.items() == 0 || d._r0.is_zero()) + return; + + set_bookmark("Prospetto ventilazione", _att_bookmark); + + set_row(1,"@54gPROSPETTO VENTILAZIONE"); + set_row(2,""); + set_row(3,""); + set_row(4,"@10gTotale acquisti destinati alla rivendita@55g%r", + &(d._r0)); + set_row(5,"@10gTotale dei corrispettivi da ventilare@55g%r", + &(d._r1)); + real m = d._r1 / d._r0; + set_row(6,"@10gMoltiplicatore@59g%3.9r",&m); + set_row(7,""); + set_row(8,"@10gCod."); + set_row(9,"@10gIVA@17gDescrizione@48gAcquisti" + "@65gImponibile vendite@89gImposta vendite"); + set_row(10,""); + int row = 11; + real t1, t2, t3; + for(int i = 0; i < d._arr.items(); i++) + { + _vDesc& vd = (_vDesc&)d._arr[i]; + look_iva(vd._codiva); + TString s0 = _iva->get("S0"); + set_row(row+i,"@8g%5s@17g%s@41g%r@68g%r@89g%r", + (const char*)vd._codiva, + (const char*)s0, + &(vd._acq), + &(vd._vnd), + &(vd._viv)); + t1 += vd._acq; + t2 += vd._vnd; + t3 += vd._viv; + } + set_row(row+i+1,""); + set_row(row+i+2,"@10gTotale@41g%r@68g%r@89g%r", + &t1, &t2, &t3); + set_auto_ff(TRUE); +} + +void TLiquidazione_app::set_regagr(_DescrItem& d) +{ + set_print_zero(TRUE); + + real& agr_1 = d._r0; + real& agr_2 = d._r1; + real& agr_3 = d._r2; + real& agr_4 = d._r3; + real& agr_5 = d._r4; + real& agr_6 = d._r5; + real& agr_7 = d._r6; + real& agr_1i = d._r7; + real& agr_2i = d._r8; + + real ara = agr_5 + agr_6; + real arn = agr_3 + agr_4; + + // percentuale detraibilita' + // real pdetr = (); + set_bookmark("Prospetto regime agricolo", _att_bookmark); + + set_row(1,"@50gPROSPETTO REGIME AGRICOLO"); + set_row(2,""); + set_row(3, "Cessioni in regime agricolo (Tabella A/I)@54g%r",&agr_1); + set_row(4, ""); + set_row(5, "Cessioni non in regime agricolo@54g%r",&agr_2); + set_row(6, ""); + set_row(7, "Acquisti in regime agricolo@54g%r",&ara); + set_row(8, ""); + set_row(9, "Acquisti non in regime agricolo@54g%r",&arn); + set_row(10, "... di cui beni ammortizzabili@54g%r",&agr_4); + set_row(11, ""); + set_row(12, "Acquisti ad uso promiscuo@54g%r",&agr_7); + + if (/*agr_7.sign() > 0*/ TRUE) + { + real pdetr = (agr_2i / (agr_1i + agr_2i)); + pdetr.round(2); + real ivadt = agr_7 * pdetr; + pdetr *= CENTO; + pdetr.round(ROUND_LIRA); + ivadt.round(ROUND_LIRA); + + TString up = agr_2i.string("."); + up << " x 100"; + TString dn = agr_1i.string("."); + dn << " + " << agr_2i.string("."); + int ln = max(up.len(), dn.len()) + 2; + TString den(ln); den.fill('-'); + up.center_just(ln); dn.center_just(ln); + + set_row(13, ""); + set_row(14, "@31g%s", (const char*)up); + set_row(15, "Percentuale di detraibilita'@31g%s = @54g%r", + (const char*)den, + &pdetr); + set_row(16, "@31g%s", (const char*)dn); + + up = agr_7.string("."); + up << " x " << pdetr.string("."); + dn = "100"; + if ((max(up.len(), dn.len()) + 2) > ln) + ln = max(up.len(), dn.len()) + 2; + TString den1(ln); den1.fill('-'); + up.center_just(ln); dn.center_just(ln); + + set_row(17, ""); + set_row(18, "@31g%s", (const char*)up); + set_row(19, "Iva detraibile@31g%s = @54g%r", + (const char*)den1, + &ivadt); + set_row(20, "@31g%s", (const char*)dn); + } + + set_auto_ff(TRUE); + set_print_zero(FALSE); +} + +void TLiquidazione_app::set_viaggio(_DescrItem& d) +{ + // the longest & stronzest + + // Nel corso della scrittura di questa funzione + // Berlusconi + Fini + Bossi hanno vinto le elezioni + // Il moderno imprenditore illuminato dalla fiamma tricolore + // ha rincoglionito gli imbecilli con la TV e gli stronzi con la P2 + // Che la rovina, la galera e la giustizia rossa + // possano aver campo su tutto + + set_print_zero(TRUE); + + set_bookmark("Prospetto 74 ter", _att_bookmark); + + set_row(1,""); + set_row(2,"@54gRIEPILOGO 74 TER"); + set_row(3,""); + set_row(4,"Ammontare dei corrispettivi relativi a viaggi eseguiti" + " interamente nella CEE .....................@100g%r", &(d._r0)); + set_row(5,"Ammontare dei corrispettivi relativi a viaggi misti (dentro" + " e fuori CEE) ......................... @100g%r", &(d._r1)); + set_row(6,"Ammontare dei corrispettivi relativi a viaggi eseguiti" + " interamente fuori CEE ..................... @100g%r", &(d._r2)); + + real tc = d._r0 + d._r1 + d._r2; + + set_row(7,""); + set_row(8,"@56gTotale corrispettivi@100g%r", &tc); + set_row(9,""); + + set_row(10,"Ammontare dei costi relativi a viaggi interamente" + " svolti nella CEE ............................... @100g%r", + &(d._r3)); + set_row(11,"Ammontare dei costi relativi a viaggi misti (per la" + " parte CEE) ................................... @100g%r", + &(d._r4)); + set_row(12,"Ammontare dei costi relativi a viaggi interamente" + " svolti fuori CEE ............................... @100g%r", + &(d._r5)); + set_row(13,"Ammontare dei costi relativi a viaggi misti (per la" + " parte fuori CEE) .............................@100g%r", + &(d._r6)); + + real tco = d._r3 + d._r4 + d._r5 + d._r6; + + set_row(14,""); + set_row(15,"@64gTotale costi@100g%r", &tco); + + set_row(16,""); + set_row(17,"DETERMINAZIONE CORRISPETTIVI IMPONIBILI " + "RELATIVI A VIAGGI MISTI"); + set_row(18,""); + + // la bella frazioncina della percentuale di ripartizione + TString tmp(d._r4.string(REAL_PICTURE)); tmp.ltrim(); + TString up = tmp; + up << " x 100"; + TString dn = tmp; + tmp = d._r6.string(REAL_PICTURE); tmp.ltrim(); + dn << " + " << tmp; + int ln = max(up.len(), dn.len()) + 2; + TString den(ln); den.fill('-'); + up.center_just(ln); dn.center_just(ln); + real rip = d._r7; rip.round(2); + + // la bella frazioncina degli imponibili viaggi misti + TString tmp2 = d._r1.string(REAL_PICTURE); tmp2.ltrim(); + TString up2 = tmp2; + up2 << " x " << rip.string(2); + TString dn2 = "100"; + int ln2 = max(up2.len(), 3) + 2; + TString den2(ln2); den2.fill('-'); + up2.center_just(ln2); dn2.center_just(ln2); + + // la gran frazionazza centrata e stupenda + int tot = 35 + ln + ln2; + int rem1 = (100 - tot)/2; if (rem1 < 0) rem1 = 0; + int pos1 = rem1 + 13; + int rem2 = pos1+ den.len() + 11; + int pos2 = rem2 + 20; + + real cim = (d._r1 * d._r7)/CENTO; cim.round(ROUND_LIRA); + + set_row(19,format("@%dg%%t@%dg%%t", pos1, pos2), + &up, &up2); + set_row(20,format("@%dgPerc. rip. = %%t = %%5.2r; @%dg" + "Imp. viaggi misti = %%t = @100g%%r", + rem1, rem2), + &den, &rip, &den2, &cim); + set_row(21,format("@%dg%%t@%dg%%t", pos1, pos2), + &dn, &dn2); + + real tmr = d._r0 + cim; + + // whew, come dicono su Topolino + + tmp = d._r0.string(REAL_PICTURE); tmp.ltrim(); + up = "("; up << tmp << " + "; + tmp = cim.string(REAL_PICTURE); tmp.ltrim(); + up << tmp << ")"; + den.fill('.',59-up.len()); + set_row(23,"Ammontare dei corrispettivi imponibili@40g%t %t@100g%r", + &up, &den, &tmr); + + // se e' l'annuale non ha senso altro + if (d._f1) return; + + real tma = d._r3 + d._r4; + tmp = d._r3.string(REAL_PICTURE); tmp.ltrim(); + up = "("; up << tmp << " + "; + tmp = d._r4.string(REAL_PICTURE); tmp.ltrim(); + up << tmp << ")"; + den.fill('.',59-up.len()); + set_row(24,"Ammontare dei costi deducibili@40g%t %t@100g%r", + &up, &den, &tma); + den.fill('.',60); + set_row(25,"Credito di costo precedente @40g%t@100g%r", &den, &(d._r8)); + + real bil = tmr - tma - d._r8; + + tmp = tmr.string(REAL_PICTURE); tmp.ltrim(); + up = "["; up << tmp << " - ("; + tmp = tma.string(REAL_PICTURE); tmp.ltrim(); + up << tmp << " + "; + tmp = d._r8.string(REAL_PICTURE); tmp.ltrim(); + up << tmp << ")]"; + den.fill('.',59-up.len()); + + set_row(26,"Base imponibile lorda@40g%t %t@100g%r", &up, &den, &bil); + set_row(27,""); + + if (bil.sign() > 0) + { + real aliva = aliquota_agvia(); + real alcnt = aliquota_agvia() + CENTO; + real dovuta = (bil/(alcnt/CENTO)) * (aliva/CENTO); + dovuta.ceil(ROUND_LIRA); // ceil voluto da MI3074 + + tmp = bil.string(REAL_PICTURE); tmp.ltrim(); + up = tmp; + up << " x " << aliva.string(5,2); + dn = alcnt.string(); + ln = max(up.len(), 3) + 2; + den.fill('-',ln); + up.center_just(ln); dn.center_just(ln); + + tmp.fill('.', 59 - den.len()); + + set_row(28,"@40g%t",&up); + set_row(29,"IVA A DEBITO@40g%t %t@100g%r", &den, &tmp, &dovuta); + set_row(30,"@40g%t", &dn); + } + else if (bil.sign() < 0) + { + bil = abs(bil); + set_row(28,""); + set_row(29,"CREDITO DI COSTO DA RIPORTARE@100g%r", &bil); + } + + set_print_zero(FALSE); + set_auto_ff(TRUE); +} + +void TLiquidazione_app::set_acconto_p(_DescrItem& d) +{ + set_print_zero(TRUE); + + const char* errmsg[3] = { + {"manca la tabella risultati liquidazione per l'anno corrente"}, +{"manca la tabella risultati liquidazione per l'anno precedente"}, +{"manca la tabella dichiarazione annuale per l'anno precedente"}}; + +set_row(1,"%t@8g%t",&(d._s0), &(d._s1)); +if (d._f2) + set_row(1,"@50g@b*** %s ***@r", errmsg[d._f2 -1]); +else +{ + if (d._f0) // base anno in corso + { + if (d._f1) // stampa base di calcolo + { + real bc = d._r0; + if (bc.sign() < 0) + { + bc = abs(bc); + set_row(1,"@73g%r@86g%r@119g%s", &bc, &d._r1, + d._f3 ? "Si" : "No"); + } + else + set_row(1,"@55g%r@86g%r@119g%s", &bc, &(d._r1), + d._f3 ? "Si" : "No"); + } + else + { + set_row(1,"@51g%r@75g%s", &(d._r1), d._f3 ? "Si" : "No"); + } + } + else + { + if (d._f1) // stampa base di calcolo + set_row(1,"@57g%r@85g%r", &(d._r0), &(d._r1)); + else + set_row(1,"@85g%r",&(d._r1)); + } +} +set_print_zero(FALSE); +} + +void TLiquidazione_app::set_acchead_p(_DescrItem& d) +{ + reset_header(); + set_header(1,"Gestione IVA@109gData @<@125gPag. @#"); + set_header(3,sep); + + if (d._f0) // base anno in corso + { + set_header(2,"@40gCALCOLO ACCONTI IVA DICEMBRE " + "1994 (base anno in corso)"); + if (d._f1) // stampa base calcolo + { + set_header(4,"@51g------- Base di calcolo -------"); + set_header(5,"@1gDitta@8gDenominazione@55gDebito@73gCredito" + "@86gACCONTO calcolato@109gLiq. differita"); + set_header(6,sep); + set_header(7,""); + } + else + { + set_header(4,"@1gDitta@8gDenominazione@51gACCONTO calcolato" + "@75gLiq. differita"); + set_header(5,sep); + set_header(6,""); + } + } + else + { + set_header(5,sep); + set_header(6,""); + if (d._f1) + set_header(4,"@1gDitta@8gDenominazione@57gBase di calcolo" + "@85gACCONTO calcolato"); + else + set_header(4,"@1gDitta@8gDenominazione@85gACCONTO calcolato"); + } +} + + +// --------------------------------------------------------------------- +// Tabulato deleghe +// --------------------------------------------------------------------- + +void TLiquidazione_app::set_deltab(_DescrItem& d, bool iscred) +{ + reset_header(); + int rw = 1; + static bool credpr; + + if (iscred) + { + // set header + set_header(1,"ELENCO DITTE A CREDITO@30g%s %s@109gData @<@125gPag. @#", + d._f0 == 13 ? "Annuale " : itom(d._f0), (const char*)_year); + set_header(2,sep); + set_header(3,"@40gF@60gImporto a"); + set_header(4,"Cod.@8gDenominazione@40gR@62gcredito"); + set_header(5,sep); + set_header(6,""); + + // set rows + for (int i = 0; i < d._arr.items(); i++) + { + TToken_string& tt = (TToken_string&)(d._arr)[i]; + TString cod(tt.get(0)); + TParagraph_string rgs(tt.get(1), 30); + TString diocantaro(rgs.get(0)); + TString frq(tt.get(2)); + real tp (tt.get(3)); + real in (tt.get(4)); + tp -= in; + tp = -tp; + set_row(rw++, "%-5s@8g%-30s@40g%1s@54g%r", + (const char*)cod, (const char*)diocantaro, + (const char*)frq, &tp); + for (int i = 1; i < rgs.items(); i++) + set_row(rw++, "@8g%-30s", (const char*)rgs.get(i)); + } + } + else + { + // set header + set_header(1,"ELENCO DITTE A DEBITO@30g%s %s@109gData @<@125gPag. @#", + d._f0 == 13 ? "Annuale " : itom(d._f0), (const char*)_year); + set_header(2,sep); + set_header(3,"@40gF@60gImporto da@73gCodice@83gCod."); + set_header(4,"Cod.@8gDenominazione@40gR Numero telefonico@63gversare Banca Dip. Con."); + set_header(5,sep); + set_header(6,""); + + + // set rows + for (int i = 0; i < d._arr.items(); i++) + { + TToken_string& tt = (TToken_string&)(d._arr)[i]; + TString cod(tt.get(0)); + TParagraph_string rgs(tt.get(1), 30); + TString diocantaro(rgs.get(0)); + TString frq(tt.get(2)); + real tp (tt.get(3)); + real in (tt.get(4)); + TString abi(tt.get(5)); + TString cab(tt.get(6)); + TString con(tt.get(7)); + TString tel(tt.get(8)); + if (!tel.blank()) + tel << '/'; + tel << tt.get(9); + tp += in; + + + set_row(rw++, "%-5s@8g%-30s@40g%1s %s @55g%r %5s %5s %3s", + (const char*)cod, (const char*)diocantaro, (const char*)frq, + (const char*)tel, &tp, (const char*)abi, + (const char*)cab, (const char*)con); + + for (int i = 1; i < rgs.items(); i++) + set_row(rw++, "@8g%-30s", (const char*)rgs.get(i)); + } + } + set_auto_ff(TRUE); +} diff --git a/cg/cg4305.cpp b/cg/cg4305.cpp index f8015b619..793e6beae 100755 --- a/cg/cg4305.cpp +++ b/cg/cg4305.cpp @@ -385,7 +385,7 @@ bool TLiquidazione_app::recalc_acconto(real& inf, real& ina) _year = thyear; } else if (_basecalc == incorso) -{ +{ // that's pazzesc but as it turns out there's no better way _comp_acconto = TRUE; // force recalc of current month diff --git a/cg/cg5500.cpp b/cg/cg5500.cpp index 69a9e1f7a..b35e52c96 100755 --- a/cg/cg5500.cpp +++ b/cg/cg5500.cpp @@ -1308,7 +1308,8 @@ void Visliq_app::write_general(TMask& m) if (orett.sign() < 0) risc -= nrett; else - risd += nrett; + risd += nrett; + // scrivi _lim->put("R5",nrett); } diff --git a/cg/cg5500b.uml b/cg/cg5500b.uml index 5fee3d6cc..3d8c94f3c 100755 --- a/cg/cg5500b.uml +++ b/cg/cg5500b.uml @@ -121,8 +121,6 @@ BEGIN ITEM " | " ITEM "D|Debito" ITEM "C|Credito" - INPUT 104 - OUTPUT 104 FLAGS "DU" END @@ -135,19 +133,17 @@ END NUMBER 105 15 BEGIN - PROMPT 1 6 "Debito/Credito " + PROMPT 1 6 "Rettifiche " FLAGS "R" PICTURE "." END LIST 106 1 8 BEGIN - PROMPT 1 7 "Importo a " + PROMPT 1 7 "Rettifica a " ITEM " | " ITEM "D|Debito" ITEM "C|Credito" - INPUT 104 - OUTPUT 104 FLAGS "U" END @@ -235,8 +231,6 @@ BEGIN ITEM " | " ITEM "D|Debito" ITEM "C|Credito" - INPUT 104 - OUTPUT 104 FLAGS "U" END */ diff --git a/cg/cg5500c.uml b/cg/cg5500c.uml index 428e4d995..80fb4798c 100755 --- a/cg/cg5500c.uml +++ b/cg/cg5500c.uml @@ -99,8 +99,6 @@ BEGIN ITEM " | " ITEM "D|Debito" ITEM "C|Credito" - INPUT 104 - OUTPUT 104 FLAGS "DU" END @@ -113,19 +111,17 @@ END NUMBER 105 15 BEGIN - PROMPT 1 5 "Debito/Credito " + PROMPT 1 5 "Rettifiche " FLAGS "R" PICTURE "." END LIST 106 1 8 BEGIN - PROMPT 1 6 "Importo a " + PROMPT 1 6 "Rettifica a " ITEM " | " ITEM "D|Debito" ITEM "C|Credito" - INPUT 104 - OUTPUT 104 FLAGS "U" END @@ -212,8 +208,6 @@ BEGIN PROMPT 1 7 "Importo a " ITEM "D|Debito" ITEM "C|Credito" - INPUT 104 - OUTPUT 104 FLAGS "U" END */