From 1ceb9c070880e0d30e91a3492e1a3187afd4055a Mon Sep 17 00:00:00 2001 From: alex Date: Wed, 26 Aug 2009 08:58:10 +0000 Subject: [PATCH] Patch level : 10.0 410 Files correlati : cg4.exe Ricompilazione Demo : [ ] Commento IVA per cassa con saldaconto git-svn-id: svn://10.65.10.50/trunk@19227 c028cbd2-c16b-5b4b-a496-9718f37d4682 --- cg/cg4301.cpp | 181 ++++++++++++++++++++++++++++++++++++++++++++---- cg/cgsaldac.cpp | 174 ++++++++++++++++++++++++++++++++++++++-------- cg/cgsaldac.h | 5 ++ 3 files changed, 317 insertions(+), 43 deletions(-) diff --git a/cg/cg4301.cpp b/cg/cg4301.cpp index 7a3058b15..80f706159 100755 --- a/cg/cg4301.cpp +++ b/cg/cg4301.cpp @@ -5,11 +5,13 @@ // ------------------------------------------------------------ #include +#include #include #include #include #include "cg4300.h" +#include "cgsaldac.h" #include #include @@ -564,6 +566,7 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt) // occhecasino. Se _comp_acconto e' TRUE, i movimenti considerati // saranno solo quelli di dicembre per data <= 20/12; { + const bool has_sc = has_module(SCAUT, CHK_DONGLE); real totintra = ZERO; real nond19_imp = ZERO; real nond19_iva = ZERO; @@ -743,10 +746,14 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt) t.set_month(month < 12 ? 12 : _freqviva == "M" ? 1 : 3); } t.set_end_month(); + TDate inizio(f); + + --inizio; TDate todate(1, month == 13 ? 12 : month, year_int); todate.set_end_month(); + const TDate fine(todate); from.put(MOV_REG, fromreg); to.put(MOV_REG, toreg); @@ -811,8 +818,6 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt) const bool cau_intra = rcs.get_bool("INTRACOM"); const bool cau_valintra = rcs.get_bool("VALINTRA"); const bool movdiff = _isdiff && _mov->get_bool(MOV_LIQDIFF); - // if (movdiff) - // int i = 1; TDate datainc = _mov->get_date(MOV_DATAINC); @@ -837,7 +842,46 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt) if (diffpayed) date = datainc; - const bool dok = is_date_ok(date, month, liqmonth, year_int); + real pagatt; + real totfat; + TImporto pagprec; + TImporto pag; + bool dok = is_date_ok(date, month, liqmonth, year_int); + TPartite_array arrpart; + const long numreg = _mov->get_long(MOV_NUMREG); + + if (has_sc && movdiff) + { + arrpart.add_numreg(numreg); + if (arrpart.utilizzata(numreg, 1)) + { + const int items = arrpart.items(); + const char sez = (tipomov == vendita ? 'A' : 'D'); + + for (TPartita * p = arrpart.first(); p != NULL; p = arrpart.next()) + { + int row = p->mov2rig(numreg, 1); + + if (row >= 0) + { + TRiga_partite rp = p->riga(row); + + totfat += rp.get_real(PART_IMPORTO); + pagprec += rp.calcola_pagato_al(false, inizio, inizio, inizio, 9); pagprec.normalize(sez); + pag += rp.calcola_pagato_al(false, fine, fine, fine, 9); pag.normalize(sez); + } + } + + if ((diffpayed && dok) || (pag.valore() > totfat)) + pag.set(sez, totfat); + pagatt = pag.valore() - pagprec.valore(); + + if (pagatt > ZERO) + dok = true; + } + } + + /* * check register present, rmoviva present and date OK * @@ -885,7 +929,7 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt) do { - int tipoatt= _rmoviva->get_int(RMI_TIPOATT); + int tipoatt = _rmoviva->get_int(RMI_TIPOATT); /* * puo' capitare per motivi brutalmente prassici * SENSU Sergio 1995, Guido @@ -949,20 +993,129 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt) real impon_det; // Imponibile detraibile real impos_det; // Imposta detraibile - if (difftopay) + if (pagatt > ZERO) { - diff_imp = imponibile_orig; - diff_iva = imposta_orig; - } - else - if (diffpayed) + if (pag.valore() >= totfat) { - incdiff_imp = imponibile_orig; - incdiff_iva = imposta_orig; + TDate from(_mov->get(MOV_DATAREG)); + real impprec; + real ivaprec; + + if (month < 13) + { + TDate to(inizio); + + from.set_day(1); + --from; + while (from < to) + { + TDate endp(from); + + if (_freqviva == "M") + endp.addmonth(); + else + endp.set_month((endp.month() / 3 + 1) * 3); + endp.set_end_month(); + if (arrpart.utilizzata(numreg, 1)) + { + const int items = arrpart.items(); + const char sez = (tipomov == vendita ? 'A' : 'D'); + TImporto pagtmp; + + for (TPartita * p = arrpart.first(); p != NULL; p = arrpart.next()) + { + int row = p->mov2rig(numreg, 1); + + if (row >= 0) + { + TRiga_partite rp = p->riga(row); + + pagtmp += rp.calcola_pagato_al(false, endp, endp, endp, 9); + pagtmp -= rp.calcola_pagato_al(false, from, from, from, 9); + pagtmp.normalize(sez); + } + } + if (!pagtmp.is_zero()) + { + real perc = pagtmp.valore() / totfat; + + real imp = imponibile_orig * perc; + real iva = imposta_orig * perc; + + imp.round(TCurrency::get_firm_dec()); + impprec += imp; + iva.round(TCurrency::get_firm_dec()); + ivaprec += iva; + } + from = endp; + } + } + } + else + { + if (from.year() != fromdate.year()) + { + if (arrpart.utilizzata(numreg, 1)) + { + TDate to(31,12, from.year()); + const int items = arrpart.items(); + const char sez = (tipomov == vendita ? 'A' : 'D'); + TImporto pagtmp; + + for (TPartita * p = arrpart.first(); p != NULL; p = arrpart.next()) + { + int row = p->mov2rig(numreg, 1); + + if (row >= 0) + { + TRiga_partite rp = p->riga(row); + + pagtmp += rp.calcola_pagato_al(false, to, to, to, 9); + pagtmp.normalize(sez); + } + } + if (!pagtmp.is_zero()) + { + real perc = pagtmp.valore() / totfat; + real imp = imponibile_orig * perc; + real iva = imposta_orig * perc; + + imp.round(TCurrency::get_firm_dec()); + impprec = imp; + iva.round(TCurrency::get_firm_dec()); + ivaprec = iva; + } + } + } + } + incdiff_imp = imponibile_orig - impprec; + incdiff_iva = imposta_orig - ivaprec; } else - analizza_IVA(imponibile_orig, imposta_orig, percind, corrisp, false, codiva, - impon_det, impos_det, impon_ind, impos_ind); + { + real perc = pagatt / totfat; + + incdiff_imp = imponibile_orig * perc; + incdiff_imp.round(TCurrency::get_firm_dec()); + incdiff_iva = imposta_orig * perc; + incdiff_iva.round(TCurrency::get_firm_dec()); + } + } + else + if (difftopay) + { + diff_imp = imponibile_orig; + diff_iva = imposta_orig; + } + else + if (diffpayed) + { + incdiff_imp = imponibile_orig; + incdiff_iva = imposta_orig; + } + else + analizza_IVA(imponibile_orig, imposta_orig, percind, corrisp, false, codiva, + impon_det, impos_det, impon_ind, impos_ind); // qui for (int is_detraibile = 0; is_detraibile < 2; is_detraibile++) diff --git a/cg/cgsaldac.cpp b/cg/cgsaldac.cpp index 1cb08f2a9..8238f1d3d 100755 --- a/cg/cgsaldac.cpp +++ b/cg/cgsaldac.cpp @@ -315,6 +315,60 @@ bool TRiga_scadenze::chiusa(bool update) const return chiusa; } +// Calcola il totale dei pagamenti alla data (eventualmente in valuta) +TImporto TRiga_scadenze::importo_pagato_al(bool val, const TDate & al, int mode) const +{ + CHECKD(mode > 0x0 && mode <= 0xFF, "Bad importo_pagato mode ", mode); + const TPartita& game = partita(); + const bool in_val = in_valuta(); + const char* imp_field = (val && in_val) ? PAGSCA_IMPORTOVAL : PAGSCA_IMPORTO; + + TImporto totale; + for (int p = last(); p > 0; p = pred(p)) + { + const TRectype& pag = row(p); // Riga pagamento + const TRiga_partite& sum = game.riga(p); // Riga partite + const TDate & datapag = sum.get_date(PART_DATAPAG); + + if (datapag <= al) + { + const char sez = sum.sezione(); + + if (mode & 0x1) + totale += TImporto(sez, pag.get_real(imp_field)); + if (!in_val && (mode & 0x8)) // Le ritenute non esistono nei pagamenti in valuta + { + totale += TImporto(sez, pag.get_real(PAGSCA_RITENUTE)); + totale += TImporto(sum.sezione_ritsoc(), pag.get_real(PAGSCA_RITSOC)); + } + + if (mode & 0x2) // Voglio anche gli abbuoni + { + real abb = pag.get_real(PAGSCA_ABBUONI); + if (!abb.is_zero()) + { + if (in_val && !val) // Gli abbuoni sono sempre in valuta e quindi + { // devono essere convertiti opportunamente + const TExchange cmb(sum); + TCurrency cur(abb, cmb); + cur.change_to_firm_val(); + abb = cur.get_num(); + } + totale += TImporto(sez, abb); + } + } + + if (in_val && !val && (mode & 0x4)) // Voglio anche le differenze cambio + { // Esse esistono solo nei pagamenti in valuta + const TImporto diffcam(sez, pag.get_real(PAGSCA_DIFFCAM)); + totale += diffcam; + } + } + } + + return totale.normalize(); +} + // Calcola il totale dei pagamenti (eventualmente in valuta) TImporto TRiga_scadenze::importo_pagato(bool val, int mode) const { @@ -466,6 +520,45 @@ TImporto TRiga_scadenze::residuo(bool val, int mode) const return residuo; } +TImporto TRiga_scadenze::esposto_al(bool valuta, const TDate & al, const TDate & data_scad, const TDate & data_rischio, bool & sbf) const +{ + TImporto esposto; + const bool rischio = data_scad != data_rischio; + TDate data(get(SCAD_DATASCAD)); + const int lasts = last(); + + sbf = false; + for (int p = first(); p <= lasts; p = succ(p)) + { + const TRiga_partite & pag = riga().partita().riga(p); + TDate datapag = pag.get_date(PART_DATAPAG); + + if (data.ok() && datapag > data) + datapag = data; + if (datapag <= al) + { + const int tp = pag.get_int(PART_TIPOPAG); + + if (tp >= 2 && tp <= 7) + { + const char sez = pag.sezione(); + const TImporto imp(sez, pag.get_real(valuta ? PAGSCA_IMPORTOVAL : PAGSCA_IMPORTO)); + + if (rischio && datapag > data_rischio && datapag <= data_scad) + { + esposto += imp; + sbf = true; + } + else + if (datapag > data_scad) + esposto += imp; + } + } + } + + return esposto; +} + TImporto TRiga_scadenze::esposto(bool valuta, const TDate & data_scad, const TDate & data_rischio, bool & sbf) const { TImporto esposto; @@ -486,7 +579,7 @@ TImporto TRiga_scadenze::esposto(bool valuta, const TDate & data_scad, const TDa TDate datapag(pag.get(PART_DATAPAG)); if (data.ok() && datapag > data) - datapag = datapag; + datapag = data; // controllo if (rischio && datapag > data_rischio && datapag <= data_scad) { esposto += imp; @@ -925,7 +1018,7 @@ TImporto TRiga_partite::esposto(bool valuta, const TDate & data_scad, const TDat if (rischio && datapag > data_rischio && datapag <= data_scad) { esposto += imp; - sbf = TRUE; + sbf = true; } else if (datapag > data_scad) @@ -934,6 +1027,33 @@ TImporto TRiga_partite::esposto(bool valuta, const TDate & data_scad, const TDat return esposto; } +TImporto TRiga_partite::calcola_pagato_al(bool valuta,const TDate& al, const TDate & data_scaduto, const TDate& data_rischio, int mode) const +{ + TImporto pagato; + + if (is_fattura()) + { + const int nrigp = get_int(PART_NRIGA); + const char sez = sezione(); + const bool rischio = data_scaduto != data_rischio; + const int lastr = rate(); + + for (int r = lastr; r > 0; r--) + { + const TRiga_scadenze& scad = rata(r); + const TImporto pag = scad.importo_pagato_al(valuta, al, mode); + + pagato += pag; + if (!pag.is_zero() && rischio) + { + bool sbf = false; + pagato -= scad.esposto_al(valuta, al, data_scaduto, data_rischio, sbf); + } + } + } + return pagato; +} + /////////////////////////////////////////////////////////// // TPartita /////////////////////////////////////////////////////////// @@ -1562,6 +1682,7 @@ void TPartita::calcola_saldo(TImporto& saldo, TImporto& doc, TImporto& pag, TImp TImporto TPartita::calcola_saldo(bool valuta) const { TImporto saldo; + for (int r = last(); r > 0; r = pred(r)) { const TRiga_partite& row = riga(r); @@ -1570,45 +1691,40 @@ TImporto TPartita::calcola_saldo(bool valuta) const return saldo; } -TImporto TPartita::calcola_saldo_al(bool valuta,const TDate& al, const TDate & data_scaduto, const TDate& data_rischio) const +TImporto TPartita::calcola_pagato_al(bool valuta,const TDate& al, const TDate & data_scaduto, const TDate& data_rischio) const { - TImporto saldo; -// const bool calcolo_rischio = data_rischio.ok(); + TImporto pagato; for (int r = last(); r > 0; r = pred(r)) { const TRiga_partite& row = riga(r); -/* vecchia implementazione - if (row.is_fattura()) - { - for (int s = row.rate(); s > 0 ;s--) - { - const TRiga_scadenze & rata = row.rata(s); - const TDate data(rata.get(SCAD_DATASCAD)); + const TDate data(row.get(PART_DATAREG)); if (data <= al) - saldo += rata.importo(valuta); - } - } - else { - const TDate data = row.get(PART_DATAPAG); - if (calcolo_rischio) + pagato += row.importo(valuta); + if (!row.is_fattura()) { const int tipopag = row.get_int(PART_TIPOPAG); - if (tipopag < 2 || tipopag > 7) + + if (tipopag >= 2 && tipopag <= 7) { - if (data <= al) - saldo += row.importo(valuta); + bool sbf = false; + pagato -= row.esposto(valuta, data_scaduto, data_rischio, sbf); } - else - if (data <= data_rischio) - saldo += row.importo(valuta); } - else - if (data <= al) - saldo += row.importo(valuta); -*/ + } + } + return pagato; +} + +TImporto TPartita::calcola_saldo_al(bool valuta,const TDate& al, const TDate & data_scaduto, const TDate& data_rischio) const +{ + TImporto saldo; + + for (int r = last(); r > 0; r = pred(r)) + { + const TRiga_partite& row = riga(r); const TDate data(row.get(PART_DATAREG)); if (data <= al) @@ -2166,4 +2282,4 @@ TRiga_partite* TPartite_array::mov2rig(long numreg, int numrig) return &game->riga(r); } return NULL; -} \ No newline at end of file +} diff --git a/cg/cgsaldac.h b/cg/cgsaldac.h index b24c38212..bd57aaff0 100755 --- a/cg/cgsaldac.h +++ b/cg/cgsaldac.h @@ -143,9 +143,11 @@ public: TPartita& partita() const; TRiga_partite& riga() const { return *_riga; } // Riga partite + TImporto importo_pagato_al(bool val, const TDate & al, int mode = 0xF) const; TImporto importo_pagato(bool val, int mode = 0xF) const; TImporto importo(bool val) const; TImporto residuo(bool val, int mode = 0xF) const; // Differenza delle due funzioni precedenti + TImporto esposto_al(bool valuta, const TDate & al, const TDate & data_scad, const TDate & data_rischio, bool & sbf) const; TImporto esposto(bool valuta, const TDate & data_scad, const TDate & data_rischio, bool & sbf) const ; bool esistono_abbuoni_diffcam() const; @@ -192,6 +194,8 @@ public: TImporto importo(bool valuta, int mode = 0xF) const; TImporto esposto(bool valuta, const TDate & data_scad, const TDate & data_rischio, bool & sbf) const; + TImporto calcola_pagato_al(bool valuta,const TDate& al, const TDate & data_scaduto, const TDate& data_rischio, int mode = 0xF) const; + const TString& codice_valuta() const; bool in_valuta() const; @@ -288,6 +292,7 @@ public: void update_reg(long nreg, const TRectype& mov, TPartite_array& pa); void calcola_saldo(TImporto& saldo, TImporto& doc, TImporto& pag, TImporto& imp) const; TImporto calcola_saldo(bool valuta) const; + TImporto calcola_pagato_al(bool valuta,const TDate& al, const TDate & data_scaduto, const TDate& data_rischio) const; TImporto calcola_saldo_al(bool valuta, const TDate& al, const TDate& data_scaduto, const TDate& data_rischio) const; real calcola_scaduto_al(bool valuta, const TDate& al = botime) const; TImporto importo_pagato_unassigned(bool val, int mode = 0xF) const;