From db741508ef9934c4b10675898bef29787ec1ebea Mon Sep 17 00:00:00 2001 From: guy Date: Wed, 14 May 2014 08:27:53 +0000 Subject: [PATCH] Corretto aggiornamento pagamenti git-svn-id: svn://10.65.10.50/branches/R_10_00@22938 c028cbd2-c16b-5b4b-a496-9718f37d4682 --- m770/770100.cpp | 392 +++++++++++++++++++++++++----------------------- m770/770102.h | 30 ++-- 2 files changed, 219 insertions(+), 203 deletions(-) diff --git a/m770/770100.cpp b/m770/770100.cpp index 3a315df55..375fc19fa 100755 --- a/m770/770100.cpp +++ b/m770/770100.cpp @@ -271,13 +271,13 @@ bool TSchedaPercipienti::codanagr_handler(TMask_field& f, KEY k) return true; } -void TSchedaPercipienti::calcola_riga_pag(TRectype & rec, - const real h_PercAssImp, - const real h_PercCassaPrev, - const real h_PercRitenuta, - const real h_PercInps, - const real h_PercAssImpInps, - const real h_PercCommitInps) +void TSchedaPercipienti::calcola_riga_pag(TRectype& rec, + const real& h_PercAssImp, + const real& h_PercCassaPrev, + const real& h_PercRitenuta, + const real& h_PercInps, + const real& h_PercAssImpInps, + const real& h_PercCommitInps) const { const int fdec = TCurrency::get_firm_dec(); real compenso = rec.get_real(PAG_COMPENSO); @@ -321,205 +321,221 @@ void TSchedaPercipienti::calcola_riga_pag(TRectype & rec, rec.put(PAG_COMNETTO, comnetto); } -void TSchedaPercipienti::agg_pagamenti(const TRectype& sch, const TDate& pag_dal) +bool TSchedaPercipienti::agg_pagamenti(const TRectype& sch, const TDate& pag_dal) const { const long numreg = sch.get_long(SCH_NUMREG); - if (numreg > 0) - { + if (numreg <= 0) + return false; + #ifdef DBG - if (numreg == 31723) - int cazzone = 1; + if (numreg == 37788) + int cazzone = 1; #endif - TPartite_array partarr; - partarr.add_numreg(numreg); - if (partarr.items() > 0) - { - TSchedaPE sc; - bool pag_udated = false; + TPartite_array partarr; - sc.lfile().curr() = sch; - sc.read(_isequal, _lock); - const real totrit = sc.lfile().get_real(SCH_TOTRIT); - const real totale = sc.lfile().get_real(SCH_TOTALE) - totrit; - const real spese = sc.lfile().get_real(SCH_SPESE); - const real iva = sc.lfile().get_real(SCH_IVA); - const real compenso = sc.lfile().get_real(SCH_COMPENSO); - real spperc = spese / totale; spperc.round(8); - real ivaperc = iva / totale; ivaperc.round(8); + partarr.add_numreg(numreg); + if (partarr.items() == 0) + return false; - const TString4 codcau = sc.lfile().get("CODCAUS"); - const TRectype cau = cache().get("%CA7", codcau); + TSchedaPE sc; + bool pag_udated = false; - // leggo valori tabella causali per calcolo - const real h_PercAssImp = cau.get_real("R4"); - const real h_PercCassaPrev = cau.get_real("R5"); - const real h_PercRitenuta = cau.get_real("R0"); - const real h_PercInps = cau.get_real("R1"); - const real h_PercAssImpInps = cau.get_real("R2"); - const real h_PercCommitInps = cau.get_real("R3"); + TRectype& scur = sc.lfile().curr(); + scur = sch; + sc.read(_isequal, _lock); + const real totrit = scur.get_real(SCH_TOTRIT); + const real totdoc = scur.get_real(SCH_TOTALE); + const real iva = scur.get_real(SCH_IVA); + const real totale = totdoc - totrit; + const real imponibile=totdoc - iva; + const real spese = scur.get_real(SCH_SPESE); + const real compenso = scur.get_real(SCH_COMPENSO); + real spperc, ivaperc; + if (!imponibile.is_zero()) + { + spperc = spese / totale; spperc.round(8); + ivaperc = iva / totale; + ivaperc = iva / imponibile; + ivaperc.round(8); + } + + const TString4 codcau = scur.get("CODCAUS"); + const TRectype cau = cache().get("%CA7", codcau); + + // leggo valori tabella causali per calcolo + const real h_PercRitenuta = cau.get_real("R0"); + const real h_PercInps = cau.get_real("R1"); + const real h_PercAssImpInps = cau.get_real("R2"); + const real h_PercCommitInps = cau.get_real("R3"); + const real h_PercAssImp = cau.get_real("R4"); + const real h_PercCassaPrev = cau.get_real("R5"); - for (TPartita* p = partarr.first(); p != NULL; p =partarr.next()) + for (TPartita* p = partarr.first(); p != NULL; p = partarr.next()) + { + const int lastrow = p->last(); + for (int row = p->prima_fattura(numreg); row > 0 && row <= lastrow; row = p->succ(row)) + { + const TRiga_partite& rigapart = p->riga(row); + const int nrate = rigapart.tipo() == tm_fattura ? rigapart.rate() : 0; + TDate datapag; + + for (int r = 1; r <= nrate; r++) { - const int row = p->prima_fattura(numreg); + TRiga_scadenze & ratapart = rigapart.rata(r); + TImporto tot[10]; + long numregp[10] = {0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L}; + int lastsch = 0; - if (row >= 0) + const int rows = sc.pag_items(); + + for (int rowp = ratapart.last(); rowp > 0; rowp = ratapart.pred(rowp)) { - TRiga_partite & rigapart = p->riga(row); - const int nrate = rigapart.rate(); - TDate datapag; + const TRectype& pag = ratapart.row(rowp); // Riga pagamento + const TRiga_partite& sum = p->riga(rowp); // Riga partite + if (sum.tipo() == tm_nota_credito) + continue; - for (int r = 1; r <= nrate; r++) + if (pag_dal.ok()) // Filtro opzionale su data pagamento + { + const TDate sum_datapag = sum.get(PART_DATAPAG); + if (sum_datapag < pag_dal) + continue; + } + + const char sez = sum.sezione(); + TImporto imppag(sez, pag.get_real(PAGSCA_IMPORTO)); + const long num = sum.get_long(PART_NREG); + if (lastsch == 0 && numregp[0] == 0L) { - TRiga_scadenze & ratapart = rigapart.rata(r); - TImporto tot[10]; - long numregp[10] = {0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L}; - int lastsch = 0; - - const int rows = sc.pag_items(); - - for (int rowp = ratapart.last(); rowp > 0; rowp = ratapart.pred(rowp)) - { - const TRectype& pag = ratapart.row(rowp); // Riga pagamento - const TRiga_partite& sum = p->riga(rowp); // Riga partite - - if (pag_dal.ok()) // Filtro opzionale su data pagamento - { - const TDate sum_datapag = sum.get(PART_DATAPAG); - if (sum_datapag < pag_dal) - continue; - } - - const char sez = sum.sezione(); - TImporto imppag(sez, pag.get_real(PAGSCA_IMPORTO)); - const long num = sum.get_long(PART_NREG); - if (lastsch == 0 && numregp[0] == 0L) - { - numregp[lastsch] = num; - tot[lastsch].reset(); - } - if (num != numregp[lastsch]) - { - numregp[++lastsch] = num; - tot[lastsch].reset(); - } - if (lastsch > 9) - { - message_box("Attenzione! Troppi pagamenti diversi per la registrazione %ld.", numreg); - break; - } + numregp[lastsch] = num; + tot[lastsch].reset(); + } + if (num != numregp[lastsch]) + { + numregp[++lastsch] = num; + tot[lastsch].reset(); + } + if (lastsch > 9) + { + warning_box("Attenzione! Troppi pagamenti diversi per la registrazione %ld.", numreg); + break; + } - bool found = false; - imppag += TImporto(sez, pag.get_real(PAGSCA_RITENUTE)); - imppag += TImporto(sum.sezione_ritsoc(), pag.get_real(PAGSCA_RITSOC)); - real abbuoni = pag.get_real(PAGSCA_ABBUONI); - real abb = pag.get_real(PAGSCA_ABBUONI); - if (!abb.is_zero()) - imppag += TImporto(sez, abb); - for (int i = 0; !found && i < rows; i++) + bool found = false; + imppag += TImporto(sez, pag.get_real(PAGSCA_RITENUTE)); + imppag += TImporto(sum.sezione_ritsoc(), pag.get_real(PAGSCA_RITSOC)); + + real abb = pag.get_real(PAGSCA_ABBUONI); + if (!abb.is_zero()) + imppag += TImporto(sez, abb); + for (int i = 0; !found && i < rows; i++) + { + TRectype& pagrec = sc.pag(i); + const long numsch = pagrec.get_long(PAG_NUMREG); + found = num == numsch; + if (numsch == 0L && !found) + { + TDate data(sum.get_date(PART_DATADOC)); + if (!data.ok()) + data = sum.get_date(PART_DATAREG); + if (!data.ok()) + data = sum.get_date(PART_DATAPAG); + const TDate datasch = pagrec.get(PAG_DATAPAG); + if (data == datasch) { - TRectype& pagrec = sc.pag(i); - const long numsch = pagrec.get_long(PAG_NUMREG); - found = num == numsch; - if (numsch == 0L && !found) - { - TDate data(sum.get_date(PART_DATADOC)); - if (!data.ok()) - data = sum.get_date(PART_DATAREG); - if (!data.ok()) - data = sum.get_date(PART_DATAPAG); - const TDate datasch = pagrec.get(PAG_DATAPAG); - if (data == datasch) - { - pagrec.put(PAG_NUMREG, num); - found = true; - } - else - { - imppag.normalize('D'); + pagrec.put(PAG_NUMREG, num); + found = true; + } + else + { + imppag.normalize('D'); - real spesep = imppag.valore() * spperc; - real ivap = imppag.valore() * ivaperc; + real spesep = imppag.valore() * spperc; + spesep.round(TCurrency::get_firm_dec()); + + real ivap = imppag.valore() * ivaperc / (UNO + ivaperc); + ivap.round(TCurrency::get_firm_dec()); - spesep.round(TCurrency::get_firm_dec()); - if (abs(spesep) > abs(spese)) - spesep = spese; - ivap.round(TCurrency::get_firm_dec()); - if (abs(ivap) > abs(iva)) - ivap = iva; + if (abs(spesep) > abs(spese)) + spesep = spese; + if (abs(ivap) > abs(iva)) + ivap = iva; - real compensop = imppag.valore() - spesep - ivap; - compensop += compensop * h_PercRitenuta; - compensop.round(TCurrency::get_firm_dec()); - if (abs(compensop) > abs(compenso)) - compensop = compenso; - if (compensop == pagrec.get_real(PAG_COMPENSO)) - { - pagrec.put(PAG_NUMREG, num); - found = true; - } - } + real compensop = imppag.valore() - spesep - ivap; + compensop += compensop * h_PercRitenuta; /* / CENTO;*/ + compensop.round(TCurrency::get_firm_dec()); + if (abs(compensop) > abs(compenso)) + compensop = compenso; + if (compensop == pagrec.get_real(PAG_COMPENSO)) + { + pagrec.put(PAG_NUMREG, num); + found = true; } } - if (!found) - { - tot[lastsch] += imppag; - if (!datapag.ok()) - datapag = sum.get_date(PART_DATADOC); - if (!datapag.ok()) - datapag = sum.get_date(PART_DATAREG); - if (!datapag.ok()) - datapag = sum.get_date(PART_DATAPAG); - } } - for (int j = 0; j < 10 && numregp[j] > 0L; j++) - { - tot[j].normalize('D'); - if (tot[j].valore() == ZERO) - break; + } + if (!found) + { + tot[lastsch] += imppag; + if (!datapag.ok()) + datapag = sum.get_date(PART_DATADOC); + if (!datapag.ok()) + datapag = sum.get_date(PART_DATAREG); + if (!datapag.ok()) + datapag = sum.get_date(PART_DATAPAG); + } + } + for (int j = 0; j < 10 && numregp[j] > 0L; j++) + { + tot[j].normalize('D'); + if (tot[j].is_zero()) + break; - TRectype & pagrec = sc.pag(rows); + TRectype& pagrec = sc.pag(rows+j); + pagrec.put(PAG_CODDITTA, scur.get(SCH_CODDITTA)); + pagrec.put(PAG_TIPOA, scur.get(SCH_TIPOA)); + pagrec.put(PAG_CODANAGR, scur.get(SCH_CODANAGR)); + pagrec.put(PAG_NPROG, scur.get(SCH_NPROG)); + pagrec.put(PAG_NRIGA, rows + j + 1); + pagrec.put(PAG_NUMVERS, -1); + const real& totj = tot[j].valore(); - pagrec.put(PAG_CODDITTA, sc.lfile().get(SCH_CODDITTA)); - pagrec.put(PAG_TIPOA, sc.lfile().get(SCH_TIPOA)); - pagrec.put(PAG_CODANAGR, sc.lfile().get(SCH_CODANAGR)); - pagrec.put(PAG_NPROG, sc.lfile().get(SCH_NPROG)); - pagrec.put(PAG_NRIGA, rows + 1); - pagrec.put(PAG_NUMVERS, -1); - real spesepag = tot[j].valore() * spperc; - real ivapag = tot[j].valore() * ivaperc; + real spesepag = totj * spperc; + spesepag.round(TCurrency::get_firm_dec()); + + real ivapag = totj * ivaperc / (UNO + ivaperc); + ivapag.round(TCurrency::get_firm_dec()); - spesepag.round(TCurrency::get_firm_dec()); - if (abs(spesepag) > abs(spese)) - spesepag = spese; - ivapag.round(TCurrency::get_firm_dec()); - if (abs(ivapag) > abs(iva)) - ivapag = iva; + if (abs(spesepag) > abs(spese)) + spesepag = spese; + if (abs(ivapag) > abs(iva)) + ivapag = iva; - real compensopag = tot[j].valore() - spesepag - ivapag; - - compensopag += compensopag * h_PercRitenuta; - compensopag.round(TCurrency::get_firm_dec()); - if (abs(compensopag) > abs(compenso)) - compensopag = compenso; - pagrec.put(PAG_COMPENSO, compensopag); - pagrec.put(PAG_SPESA, spesepag); - pagrec.put(PAG_DATAPAG, datapag); - sc.lfile().put(SCH_ANNOC, datapag.year()); - sc.lfile().put(SCH_MESEC, datapag.month()); - pagrec.put(PAG_PERC, h_PercRitenuta); // percentuale ritenuta acconto - pagrec.put(PAG_ALQIMP10, h_PercAssImpInps);// percentuale 10% INPS - pagrec.put(PAG_NUMREG, numregp[j]); - pagrec.put(PAG_COD10, "C"); - calcola_riga_pag(pagrec, h_PercAssImp, h_PercCassaPrev, h_PercRitenuta, h_PercInps, h_PercAssImpInps, h_PercCommitInps); - } - } - } + real compensopag = totj - spesepag - ivapag; + compensopag += compensopag * h_PercRitenuta; /* / CENTO*/; + compensopag.round(TCurrency::get_firm_dec()); + if (abs(compensopag) > abs(compenso)) + compensopag = compenso; + pagrec.put(PAG_COMPENSO, compensopag); + pagrec.put(PAG_SPESA, spesepag); + pagrec.put(PAG_DATAPAG, datapag); + sc.lfile().put(SCH_ANNOC, datapag.year()); + sc.lfile().put(SCH_MESEC, datapag.month()); + pagrec.put(PAG_PERC, h_PercRitenuta); // percentuale ritenuta acconto + pagrec.put(PAG_ALQIMP10, h_PercAssImpInps);// percentuale 10% INPS + pagrec.put(PAG_NUMREG, numregp[j]); + pagrec.put(PAG_COD10, "C"); + calcola_riga_pag(pagrec, h_PercAssImp, h_PercCassaPrev, h_PercRitenuta, h_PercInps, h_PercAssImpInps, h_PercCommitInps); + } } - sc.rewrite(); } } + const int err = sc.rewrite(); // ulocks too + if (err != NOERR) + cantwrite_box("Scheda percipiente"); + return err == NOERR; } static TDate _pag_dal; @@ -1201,11 +1217,11 @@ void TSchedaPercipienti::mask2rel(const TMask& m) const int nprogr = m.get_int(F_NPROG); // leggo valori tabella causali per calcolo - const real h_PercAssImp = m.get_real(F_QUOTAIMP); - const real h_PercCassaPrev = m.get_real(F_CASSA_PREV); - const real h_PercRitenuta = m.get_real(F_PERRIT); - const bool h_FlagInps = m.get_bool(F_FLAG_INPS); - const real h_PercInps = m.get_real(F_PERC_INPS); + const real h_PercAssImp = m.get_real(F_QUOTAIMP); + const real h_PercCassaPrev = m.get_real(F_CASSA_PREV); + const real h_PercRitenuta = m.get_real(F_PERRIT); + const bool h_FlagInps = m.get_bool(F_FLAG_INPS); + const real h_PercInps = m.get_real(F_PERC_INPS); const real h_PercAssImpInps = m.get_real(F_PERC_ASS_INPS); const real h_PercCommitInps = m.get_real(F_PERC_COMMIT_INPS); @@ -2082,7 +2098,7 @@ void TSchedaPercipienti::from_struct_to_mask(Pag_struct& s, TMask& m) m.set(dlg, s.numvers); } -Pag_struct& TSchedaPercipienti::clear_struct(Pag_struct& s) +Pag_struct& TSchedaPercipienti::clear_struct(Pag_struct& s) const { s.datapag = NULLDATE; s.imponibile = ZERO; @@ -2122,12 +2138,12 @@ Pag_struct& TSchedaPercipienti::clear_struct(Pag_struct& s) Pag_struct& TSchedaPercipienti::calcola_riga_pag(Pag_struct& s, Pag_struct& c, bool force, - const real h_PercAssImp, - const real h_PercCassaPrev, - const real h_PercRitenuta, - const real h_PercInps, - const real h_PercAssImpInps, - const real h_PercCommitInps) + const real& h_PercAssImp, + const real& h_PercCassaPrev, + const real& h_PercRitenuta, + const real& h_PercInps, + const real& h_PercAssImpInps, + const real& h_PercCommitInps) const { const int fdec = TCurrency::get_firm_dec(); diff --git a/m770/770102.h b/m770/770102.h index d8fa8aba5..e36a6499b 100755 --- a/m770/770102.h +++ b/m770/770102.h @@ -146,7 +146,7 @@ class TSchedaPercipienti : public TRelation_application // genera gli items per la causale quadro void build_causqua_items(TMask& m, const TString& quadro) const; // azzera struttura pagamento - Pag_struct& clear_struct(Pag_struct& s); + Pag_struct& clear_struct(Pag_struct& s) const; // calcola una riga di pagamento dove è la struttura con i dati, // è la struttura con i calcolati per eventuali controlli, // consente di forzare la sostituzione dei valori di riga @@ -154,19 +154,19 @@ class TSchedaPercipienti : public TRelation_application Pag_struct& calcola_riga_pag(Pag_struct& s, Pag_struct& c, bool force, - const real h_PercAssImp, - const real h_PercCassaPrev, - const real h_PercRitenuta, - const real h_PercInps, - const real h_PercAssImpInps, - const real h_PercCommitInps); - void calcola_riga_pag (TRectype & rec, - const real h_PercAssImp, - const real h_PercCassaPrev, - const real h_PercRitenuta, - const real h_PercInps, - const real h_PercAssImpInps, - const real h_PercCommitInps); + const real& h_PercAssImp, + const real& h_PercCassaPrev, + const real& h_PercRitenuta, + const real& h_PercInps, + const real& h_PercAssImpInps, + const real& h_PercCommitInps) const; + void calcola_riga_pag (TRectype& rec, + const real& h_PercAssImp, + const real& h_PercCassaPrev, + const real& h_PercRitenuta, + const real& h_PercInps, + const real& h_PercAssImpInps, + const real& h_PercCommitInps) const; protected: @@ -207,7 +207,7 @@ class TSchedaPercipienti : public TRelation_application bool coll_datanum() const { return _coll._datadoc.not_empty() && _coll._numdoc.not_empty(); } long coll_numreg() const { return _coll._numreg; } bool esiste_perc(const TMask& m, const char* coda=NULL); - void agg_pagamenti(const TRectype& sch, const TDate& pag_dal); + bool agg_pagamenti(const TRectype& sch, const TDate& pag_dal) const; TSheet_field& pags() const; TSheet_field& vers() const;