Corretto aggiornamento pagamenti

git-svn-id: svn://10.65.10.50/branches/R_10_00@22938 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
guy 2014-05-14 08:27:53 +00:00
parent 4cede5839b
commit db741508ef
2 changed files with 219 additions and 203 deletions

View File

@ -271,13 +271,13 @@ bool TSchedaPercipienti::codanagr_handler(TMask_field& f, KEY k)
return true; return true;
} }
void TSchedaPercipienti::calcola_riga_pag(TRectype & rec, void TSchedaPercipienti::calcola_riga_pag(TRectype& rec,
const real h_PercAssImp, const real& h_PercAssImp,
const real h_PercCassaPrev, const real& h_PercCassaPrev,
const real h_PercRitenuta, const real& h_PercRitenuta,
const real h_PercInps, const real& h_PercInps,
const real h_PercAssImpInps, const real& h_PercAssImpInps,
const real h_PercCommitInps) const real& h_PercCommitInps) const
{ {
const int fdec = TCurrency::get_firm_dec(); const int fdec = TCurrency::get_firm_dec();
real compenso = rec.get_real(PAG_COMPENSO); real compenso = rec.get_real(PAG_COMPENSO);
@ -321,53 +321,64 @@ void TSchedaPercipienti::calcola_riga_pag(TRectype & rec,
rec.put(PAG_COMNETTO, comnetto); 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); const long numreg = sch.get_long(SCH_NUMREG);
if (numreg > 0) if (numreg <= 0)
{ return false;
#ifdef DBG #ifdef DBG
if (numreg == 31723) if (numreg == 37788)
int cazzone = 1; int cazzone = 1;
#endif #endif
TPartite_array partarr; TPartite_array partarr;
partarr.add_numreg(numreg); partarr.add_numreg(numreg);
if (partarr.items() > 0) if (partarr.items() == 0)
{ return false;
TSchedaPE sc; TSchedaPE sc;
bool pag_udated = false; bool pag_udated = false;
sc.lfile().curr() = sch; TRectype& scur = sc.lfile().curr();
scur = sch;
sc.read(_isequal, _lock); sc.read(_isequal, _lock);
const real totrit = sc.lfile().get_real(SCH_TOTRIT); const real totrit = scur.get_real(SCH_TOTRIT);
const real totale = sc.lfile().get_real(SCH_TOTALE) - totrit; const real totdoc = scur.get_real(SCH_TOTALE);
const real spese = sc.lfile().get_real(SCH_SPESE); const real iva = scur.get_real(SCH_IVA);
const real iva = sc.lfile().get_real(SCH_IVA); const real totale = totdoc - totrit;
const real compenso = sc.lfile().get_real(SCH_COMPENSO); const real imponibile=totdoc - iva;
real spperc = spese / totale; spperc.round(8); const real spese = scur.get_real(SCH_SPESE);
real ivaperc = iva / totale; ivaperc.round(8); 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 = sc.lfile().get("CODCAUS"); const TString4 codcau = scur.get("CODCAUS");
const TRectype cau = cache().get("%CA7", codcau); const TRectype cau = cache().get("%CA7", codcau);
// leggo valori tabella causali per calcolo // 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_PercRitenuta = cau.get_real("R0");
const real h_PercInps = cau.get_real("R1"); const real h_PercInps = cau.get_real("R1");
const real h_PercAssImpInps = cau.get_real("R2"); const real h_PercAssImpInps = cau.get_real("R2");
const real h_PercCommitInps = cau.get_real("R3"); 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 row = p->prima_fattura(numreg); const int lastrow = p->last();
for (int row = p->prima_fattura(numreg); row > 0 && row <= lastrow; row = p->succ(row))
if (row >= 0)
{ {
TRiga_partite & rigapart = p->riga(row); const TRiga_partite& rigapart = p->riga(row);
const int nrate = rigapart.rate(); const int nrate = rigapart.tipo() == tm_fattura ? rigapart.rate() : 0;
TDate datapag; TDate datapag;
for (int r = 1; r <= nrate; r++) for (int r = 1; r <= nrate; r++)
@ -383,6 +394,8 @@ void TSchedaPercipienti::agg_pagamenti(const TRectype& sch, const TDate& pag_dal
{ {
const TRectype& pag = ratapart.row(rowp); // Riga pagamento const TRectype& pag = ratapart.row(rowp); // Riga pagamento
const TRiga_partite& sum = p->riga(rowp); // Riga partite const TRiga_partite& sum = p->riga(rowp); // Riga partite
if (sum.tipo() == tm_nota_credito)
continue;
if (pag_dal.ok()) // Filtro opzionale su data pagamento if (pag_dal.ok()) // Filtro opzionale su data pagamento
{ {
@ -406,14 +419,14 @@ void TSchedaPercipienti::agg_pagamenti(const TRectype& sch, const TDate& pag_dal
} }
if (lastsch > 9) if (lastsch > 9)
{ {
message_box("Attenzione! Troppi pagamenti diversi per la registrazione %ld.", numreg); warning_box("Attenzione! Troppi pagamenti diversi per la registrazione %ld.", numreg);
break; break;
} }
bool found = false; bool found = false;
imppag += TImporto(sez, pag.get_real(PAGSCA_RITENUTE)); imppag += TImporto(sez, pag.get_real(PAGSCA_RITENUTE));
imppag += TImporto(sum.sezione_ritsoc(), pag.get_real(PAGSCA_RITSOC)); imppag += TImporto(sum.sezione_ritsoc(), pag.get_real(PAGSCA_RITSOC));
real abbuoni = pag.get_real(PAGSCA_ABBUONI);
real abb = pag.get_real(PAGSCA_ABBUONI); real abb = pag.get_real(PAGSCA_ABBUONI);
if (!abb.is_zero()) if (!abb.is_zero())
imppag += TImporto(sez, abb); imppag += TImporto(sez, abb);
@ -440,17 +453,18 @@ void TSchedaPercipienti::agg_pagamenti(const TRectype& sch, const TDate& pag_dal
imppag.normalize('D'); imppag.normalize('D');
real spesep = imppag.valore() * spperc; real spesep = imppag.valore() * spperc;
real ivap = imppag.valore() * ivaperc;
spesep.round(TCurrency::get_firm_dec()); spesep.round(TCurrency::get_firm_dec());
real ivap = imppag.valore() * ivaperc / (UNO + ivaperc);
ivap.round(TCurrency::get_firm_dec());
if (abs(spesep) > abs(spese)) if (abs(spesep) > abs(spese))
spesep = spese; spesep = spese;
ivap.round(TCurrency::get_firm_dec());
if (abs(ivap) > abs(iva)) if (abs(ivap) > abs(iva))
ivap = iva; ivap = iva;
real compensop = imppag.valore() - spesep - ivap; real compensop = imppag.valore() - spesep - ivap;
compensop += compensop * h_PercRitenuta; compensop += compensop * h_PercRitenuta; /* / CENTO;*/
compensop.round(TCurrency::get_firm_dec()); compensop.round(TCurrency::get_firm_dec());
if (abs(compensop) > abs(compenso)) if (abs(compensop) > abs(compenso))
compensop = compenso; compensop = compenso;
@ -476,30 +490,31 @@ void TSchedaPercipienti::agg_pagamenti(const TRectype& sch, const TDate& pag_dal
for (int j = 0; j < 10 && numregp[j] > 0L; j++) for (int j = 0; j < 10 && numregp[j] > 0L; j++)
{ {
tot[j].normalize('D'); tot[j].normalize('D');
if (tot[j].valore() == ZERO) if (tot[j].is_zero())
break; break;
TRectype & pagrec = sc.pag(rows); TRectype& pagrec = sc.pag(rows+j);
pagrec.put(PAG_CODDITTA, scur.get(SCH_CODDITTA));
pagrec.put(PAG_CODDITTA, sc.lfile().get(SCH_CODDITTA)); pagrec.put(PAG_TIPOA, scur.get(SCH_TIPOA));
pagrec.put(PAG_TIPOA, sc.lfile().get(SCH_TIPOA)); pagrec.put(PAG_CODANAGR, scur.get(SCH_CODANAGR));
pagrec.put(PAG_CODANAGR, sc.lfile().get(SCH_CODANAGR)); pagrec.put(PAG_NPROG, scur.get(SCH_NPROG));
pagrec.put(PAG_NPROG, sc.lfile().get(SCH_NPROG)); pagrec.put(PAG_NRIGA, rows + j + 1);
pagrec.put(PAG_NRIGA, rows + 1);
pagrec.put(PAG_NUMVERS, -1); pagrec.put(PAG_NUMVERS, -1);
real spesepag = tot[j].valore() * spperc; const real& totj = tot[j].valore();
real ivapag = tot[j].valore() * ivaperc;
real spesepag = totj * spperc;
spesepag.round(TCurrency::get_firm_dec()); spesepag.round(TCurrency::get_firm_dec());
real ivapag = totj * ivaperc / (UNO + ivaperc);
ivapag.round(TCurrency::get_firm_dec());
if (abs(spesepag) > abs(spese)) if (abs(spesepag) > abs(spese))
spesepag = spese; spesepag = spese;
ivapag.round(TCurrency::get_firm_dec());
if (abs(ivapag) > abs(iva)) if (abs(ivapag) > abs(iva))
ivapag = iva; ivapag = iva;
real compensopag = tot[j].valore() - spesepag - ivapag; real compensopag = totj - spesepag - ivapag;
compensopag += compensopag * h_PercRitenuta; /* / CENTO*/;
compensopag += compensopag * h_PercRitenuta;
compensopag.round(TCurrency::get_firm_dec()); compensopag.round(TCurrency::get_firm_dec());
if (abs(compensopag) > abs(compenso)) if (abs(compensopag) > abs(compenso))
compensopag = compenso; compensopag = compenso;
@ -517,9 +532,10 @@ void TSchedaPercipienti::agg_pagamenti(const TRectype& sch, const TDate& pag_dal
} }
} }
} }
sc.rewrite(); const int err = sc.rewrite(); // ulocks too
} if (err != NOERR)
} cantwrite_box("Scheda percipiente");
return err == NOERR;
} }
static TDate _pag_dal; static TDate _pag_dal;
@ -2082,7 +2098,7 @@ void TSchedaPercipienti::from_struct_to_mask(Pag_struct& s, TMask& m)
m.set(dlg, s.numvers); 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.datapag = NULLDATE;
s.imponibile = ZERO; 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& TSchedaPercipienti::calcola_riga_pag(Pag_struct& s,
Pag_struct& c, Pag_struct& c,
bool force, bool force,
const real h_PercAssImp, const real& h_PercAssImp,
const real h_PercCassaPrev, const real& h_PercCassaPrev,
const real h_PercRitenuta, const real& h_PercRitenuta,
const real h_PercInps, const real& h_PercInps,
const real h_PercAssImpInps, const real& h_PercAssImpInps,
const real h_PercCommitInps) const real& h_PercCommitInps) const
{ {
const int fdec = TCurrency::get_firm_dec(); const int fdec = TCurrency::get_firm_dec();

View File

@ -146,7 +146,7 @@ class TSchedaPercipienti : public TRelation_application
// genera gli items per la causale quadro // genera gli items per la causale quadro
void build_causqua_items(TMask& m, const TString& quadro) const; void build_causqua_items(TMask& m, const TString& quadro) const;
// azzera struttura pagamento // azzera struttura pagamento
Pag_struct& clear_struct(Pag_struct& s); Pag_struct& clear_struct(Pag_struct& s) const;
// calcola una riga di pagamento dove <s> è la struttura con i dati, // calcola una riga di pagamento dove <s> è la struttura con i dati,
// <c> è la struttura con i calcolati per eventuali controlli, // <c> è la struttura con i calcolati per eventuali controlli,
// <force> consente di forzare la sostituzione dei valori di riga // <force> 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& calcola_riga_pag(Pag_struct& s,
Pag_struct& c, Pag_struct& c,
bool force, bool force,
const real h_PercAssImp, const real& h_PercAssImp,
const real h_PercCassaPrev, const real& h_PercCassaPrev,
const real h_PercRitenuta, const real& h_PercRitenuta,
const real h_PercInps, const real& h_PercInps,
const real h_PercAssImpInps, const real& h_PercAssImpInps,
const real h_PercCommitInps); const real& h_PercCommitInps) const;
void calcola_riga_pag (TRectype & rec, void calcola_riga_pag (TRectype& rec,
const real h_PercAssImp, const real& h_PercAssImp,
const real h_PercCassaPrev, const real& h_PercCassaPrev,
const real h_PercRitenuta, const real& h_PercRitenuta,
const real h_PercInps, const real& h_PercInps,
const real h_PercAssImpInps, const real& h_PercAssImpInps,
const real h_PercCommitInps); const real& h_PercCommitInps) const;
protected: protected:
@ -207,7 +207,7 @@ class TSchedaPercipienti : public TRelation_application
bool coll_datanum() const { return _coll._datadoc.not_empty() && _coll._numdoc.not_empty(); } bool coll_datanum() const { return _coll._datadoc.not_empty() && _coll._numdoc.not_empty(); }
long coll_numreg() const { return _coll._numreg; } long coll_numreg() const { return _coll._numreg; }
bool esiste_perc(const TMask& m, const char* coda=NULL); 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& pags() const;
TSheet_field& vers() const; TSheet_field& vers() const;