From a1ebb0c715e81fecaa34e1fa6f715c3b0bd20316 Mon Sep 17 00:00:00 2001 From: guy Date: Fri, 7 Mar 2014 14:13:42 +0000 Subject: [PATCH] git-svn-id: svn://10.65.10.50/branches/R_10_00@22919 c028cbd2-c16b-5b4b-a496-9718f37d4682 --- sc/sc0101.cpp | 2 +- sc/sc0300.cpp | 2 +- sc/sc1400.cpp | 141 ++++++++++++++++++++++++++++++++++++++++++-------- sc/sc2300.cpp | 46 +++++++++++++--- 4 files changed, 158 insertions(+), 33 deletions(-) diff --git a/sc/sc0101.cpp b/sc/sc0101.cpp index ebbd0dff6..f438fe870 100755 --- a/sc/sc0101.cpp +++ b/sc/sc0101.cpp @@ -1079,7 +1079,7 @@ bool TSaldaconto_app::totval_handler(TMask_field& f, KEY key) if (totdoc != imppag) { TString msg(80); - msg << TR("Il totale del documento in valuta e' diverso dall'importo pagato ") + msg << TR("Il totale del documento in valuta è diverso dall'importo pagato ") << imppag.string(".3") << TR("\nSi desidera continuare ugualmente?"); ok = f.yesno_box(msg); diff --git a/sc/sc0300.cpp b/sc/sc0300.cpp index 8b6b8e73c..4a197ee67 100644 --- a/sc/sc0300.cpp +++ b/sc/sc0300.cpp @@ -482,7 +482,7 @@ bool TPareggio_mask::ft2nc(const TRectype& rec) err = _iskeynotfound; } if (err != NOERR) - return error_box(FR("Impossibile modificare la partita associata la movimento %ld: errore %d"), numreg, err); + return error_box(FR("Impossibile modificare la partita associata al movimento %ld: errore %d"), numreg, err); return true; } diff --git a/sc/sc1400.cpp b/sc/sc1400.cpp index 87c5c8c39..24535a440 100755 --- a/sc/sc1400.cpp +++ b/sc/sc1400.cpp @@ -10,8 +10,10 @@ #include "../cg/cg2101.h" #include "../cg/cg2103.h" +#include "../cg/cglib02.h" #include "../cg/cgsaldac.h" + #include /////////////////////////////////////////////////////////// @@ -22,8 +24,8 @@ enum { C_CHECKED, C_GRUPPO, C_CONTO, C_CODCF, C_RAGSOC, C_IMPORTO, C_RESIDUO, C_ class TAbbuona_sheet : public TArray_sheet { +protected: virtual bool get_cell_colors(int row, int col, COLOR& fore, COLOR& back) const; - public: TAbbuona_sheet(); }; @@ -40,7 +42,7 @@ bool TAbbuona_sheet::get_cell_colors(int /*row*/, int col, COLOR& fore, COLOR& b } TAbbuona_sheet::TAbbuona_sheet() : TArray_sheet(0, 0, 0, 0, TR("Scadenze aperte"), - HR("@1C|Grp.@3|Cnt.@3|Codice@R|Ragione Sociale@50|Importo@10R|Residuo@10R|Val.|Data@10|Anno@R|Partita@8R|Riga@R|Rata@R"), + HR("@1C|Grp.@3|Cnt.@3|Codice@R|Ragione Sociale@50|Importo\nRata@10R|Residuo\nRata@10R|Val.|Data@10|Anno@R|Partita@8R|Riga@R|Rata@R|Non\nass.@3C"), 0x1, 1) {} @@ -145,12 +147,63 @@ protected: // Applicat virtual void main_loop(); bool genera_abbuono(TPartita& game, int nriga, int nrata, const TMovimentoPN& mov, TLog_report& log) const; + TImporto residuo(const TRiga_scadenze& rata, bool in_valuta) const; + int non_assegnati(const TPartita& part) const; public: void fill_sheet(const char tipocf, const TCurrency& impmin, TAbbuona_sheet& sheet); bool elabora(const TMask& msk, TAbbuona_sheet& sheet) const; }; +TImporto TAbbuona_partite::residuo(const TRiga_scadenze& rata, bool in_valuta) const +{ + TImporto res; + if (!rata.chiusa()) + { + // Controllo se è una sola rata + int rate_aperte = 0; + const TPartita& part = rata.partita(); + for (int r = part.last(); r > 0 && rate_aperte <= 0; r--) + { + const TRiga_partite& rp = part.riga(r); + if (rp.tipo() == tm_fattura) + { + for (int s = rp.rate(); s > 0; s--) + if (!rp.rata(s).chiusa()) + rate_aperte++; + } + } + + if (rate_aperte == 1) + res = part.calcola_saldo(in_valuta); + else + res = rata.residuo(in_valuta); + + const char tipocf = rata.get_char(SCAD_TIPOCF); + res.normalize(tipocf == 'C' ? 'D' : 'A'); + + } + return res; +} + +int TAbbuona_partite::non_assegnati(const TPartita& part) const +{ + const char tipocf = part.conto().tipo(); + int na = ((TPartita&)part).unassigned().rows(); + for (int r = part.last(); r > 0; r = part.pred(r)) + { + const TRiga_partite& riga = part.riga(r); + if (riga.tipo() == tm_fattura) + { + TImporto imp = riga.importo(true); + imp.normalize(tipocf == 'C' ? 'D' : 'A'); + if (imp.valore() < ZERO) + na++; + } + } + return na; +} + void TAbbuona_partite::fill_sheet(const char tipocf, const TCurrency& imp_min, TAbbuona_sheet& sheet) { const bool in_valuta = !imp_min.is_firm_value(); @@ -168,11 +221,11 @@ void TAbbuona_partite::fill_sheet(const char tipocf, const TCurrency& imp_min, T TString msg; msg << TR("Elaborazione scadenze aperte per meno di ") << imp_min.string(true) << ' '; msg << (in_valuta ? cod_val : TCurrency::get_firm_val()); - TProgind pi(scadenze.items(), msg); + TProgress_monitor pi(scadenze.items(), msg); TToken_string row; // Riga di lavoro sullo sheet for (bool ok = scadenze.move_first(); ok; ok = scadenze.move_next()) { - if (!pi.addstatus(1)) + if (!pi.add_status(1)) break; row.cut(0) << tipocf; @@ -205,11 +258,17 @@ void TAbbuona_partite::fill_sheet(const char tipocf, const TCurrency& imp_min, T if (!partita.esiste(nriga, nrata)) continue; - TRiga_scadenze& rata = partita.rata(nriga, nrata); - TImporto imp_res = rata.residuo(in_valuta); - imp_res.normalize(tipocf == 'C' ? 'D' : 'A'); + const TRiga_scadenze& rata = partita.rata(nriga, nrata); + TImporto imp_rat = rata.importo(in_valuta); + imp_rat.normalize(tipocf == 'C' ? 'D' : 'A'); + if (imp_rat.valore() < ZERO) + continue; // Nota di credito + + const TImporto imp_res = residuo(rata, in_valuta); const TCurrency residuo(imp_res.valore(), cod_val); - if (residuo > zero_val && residuo <= imp_min) + + // if (residuo > zero_val && residuo <= imp_min) // Vecchio modo (solo positivo) + if (!residuo.is_zero() && abs(residuo.get_num()) < imp_min.get_num()) // Nuovo modo (anche negativi) { TImporto imp_val = rata.importo(in_valuta); imp_val.normalize(imp_res.sezione()); @@ -228,6 +287,7 @@ void TAbbuona_partite::fill_sheet(const char tipocf, const TCurrency& imp_min, T row.add(scad.get(SCAD_NUMPART)); row.add(nriga); row.add(nrata); + row.add(non_assegnati(partita) ? "X" : ""); sheet.add(row); } } @@ -269,9 +329,22 @@ bool TAbbuona_partite::genera_abbuono(TPartita& game, int nriga, int nrata, // Creo una nuova riga di pagamento assegnado il flag di saldo TRiga_scadenze& scad = game.rata(nriga, nrata); TRectype new_pag = scad.new_row(nrigp); // Creo nuova riga e la duplico - new_pag.put(PAGSCA_ACCSAL, 'S'); // Pongo pagamento a saldo - const bool empty = game.modifica_pagamento(new_pag, valuta, true); + const bool unass = non_assegnati(game) > 0; + if (unass) // Pago la differenza ... e non mi fido + { + const TRiga_scadenze& r = game.rata(nriga, nrata); + TImporto res = residuo(r, false); + new_pag.put(PAGSCA_IMPORTO, res.valore()); + if (valuta.in_valuta()) + { + res = residuo(r, true); + new_pag.put(PAGSCA_IMPORTOVAL, res.valore()); + } + } + else + new_pag.put(PAGSCA_ACCSAL, 'S'); // Pongo pagamento a saldo ... e mi fido + const bool empty = game.modifica_pagamento(new_pag, valuta, true); if (empty) { msg.insert(TR("Errore di chiusura della rata")); @@ -279,7 +352,10 @@ bool TAbbuona_partite::genera_abbuono(TPartita& game, int nriga, int nrata, } else { - msg.insert(TR("Chiusa rata")); + if (unass) + msg.insert(TR("Chiusa partita con rata")); + else + msg.insert(TR("Chiusa singola rata")); log.log(0, msg); } return !empty; @@ -297,6 +373,7 @@ bool TAbbuona_partite::elabora(const TMask& msk, TAbbuona_sheet& scad_sheet) con const int annoes = esc.date2esc(datacomp); const TCausale caus(msk.get(F_CAUSALE), datareg.year()); + const int riga_abb = tipo_cf == 'C' ? RIGA_ABBUONI_PASSIVI : RIGA_ABBUONI_ATTIVI; TBill conto_abbuoni; caus.bill(riga_abb, conto_abbuoni); @@ -353,36 +430,44 @@ bool TAbbuona_partite::elabora(const TMask& msk, TAbbuona_sheet& scad_sheet) con can_write = false; } - TImporto abbuoni, diffcam; + TImporto banca, abbuoni, diffcam; for (int i = 0; i < mov.cg_items(); i++) { // Calcola importo speso sul saldaconto per ogni riga contabile - TImporto abb = partite.importo_speso(numreg, i+1, false, 0x2); + const TImporto abb = partite.importo_speso(numreg, i+1, false, 0x2); abbuoni -= abb; // Aggiungi abbuono al relativo totalizzatore - TImporto imp = abb; - TImporto dic; if (valuta.in_valuta()) { dic = partite.importo_speso(numreg, i+1, false, 0x4); diffcam -= dic; // Aggiungi differenza cambi al relativo totalizzatore - - imp += dic; - imp.normalize(); } + + const TImporto imp = partite.importo_speso(numreg, i+1); + banca -= imp; + banca += abb; + banca += dic; TRectype& rmov = mov.cg(i); rmov.put(RMV_SEZIONE, imp.sezione()); rmov.put(RMV_IMPORTO, imp.valore()); rmov.put(RMV_ANNOES, annoes); } - if (abbuoni.is_zero()) + if (!banca.is_zero()) { - log.log(2, TR("Il totale degli abbuoni è nullo.")); - can_write = false; + banca.normalize(); + + TRectype& rmov = mov.cg(-1); + rmov.put(RMV_ROWTYPE, 'I'); // Importi + rmov.put(RMV_SEZIONE, banca.sezione()); + rmov.put(RMV_IMPORTO, banca.valore()); + rmov.put(RMV_ANNOES, annoes); + conto_abbuoni.put(rmov); + + mov.curr().add(MOV_TOTDOC, -banca.valore()); } - else + if (!abbuoni.is_zero()) { abbuoni.normalize(); @@ -393,7 +478,6 @@ bool TAbbuona_partite::elabora(const TMask& msk, TAbbuona_sheet& scad_sheet) con rmov.put(RMV_ANNOES, annoes); conto_abbuoni.put(rmov); } - if (!diffcam.is_zero()) { diffcam.normalize(); @@ -415,6 +499,16 @@ bool TAbbuona_partite::elabora(const TMask& msk, TAbbuona_sheet& scad_sheet) con log.log(0, msg.cut(0)); msg << TR("Aggiornato saldaconto legato al movimento n.") << numreg; log.log(1, msg); + + TSaldo_agg sa; + for (int i = 0; i < mov.cg_items(); i++) + { + const TRectype& rmov = mov.cg(i); + sa.aggiorna(rmov); + } + sa.set_num_ulmov(mov.curr().get_long(MOV_NUMREG)); + sa.set_data_ulmov(mov.curr().get_date(MOV_DATAREG)); + sa.registra(); } else { @@ -455,3 +549,4 @@ int sc1400(int argc, char** argv) return 0; } + diff --git a/sc/sc2300.cpp b/sc/sc2300.cpp index 4adc9ad2b..da2b19a6e 100755 --- a/sc/sc2300.cpp +++ b/sc/sc2300.cpp @@ -129,7 +129,7 @@ public: void print_header(); void update_totals(bool what,real& res,real& non,real& buo, real& s1,real& s2,real& s3,real& s4,real& s5, real& s6, real& s7); - void compute_unassigned(TPartita& p); + void compute_unassigned(const TPartita& p); void compute_all(TPartita& p, TBill& bill); TStampaScaduto(); }; @@ -182,17 +182,22 @@ void TStampaScaduto::update_totals(bool what, real& res, real& non, real& buo, a.add(_codval,ll,is_key); } -void TStampaScaduto::compute_unassigned(TPartita& p) +void TStampaScaduto::compute_unassigned(const TPartita& p) { - TRecord_array& ra = p.unassigned(); + const TRecord_array& ra = ((TPartita&)p).unassigned(); - _uns = ZERO; _unsnc = ZERO; + _uns = _unsnc = ZERO; for (int r = ra.last_row(); r > 0; r = ra.pred_row(r)) { const TRectype& rec = ra.row(r); const TRiga_partite& sum = p.riga(rec.get_int(PAGSCA_NRIGP)); + + const TDate data_reg = sum.get_date(PART_DATAREG); + if (data_reg > _limop || p.chiusa()) // Ignoro partite chiuse dal 27-01-2014 + continue; + const char * field = (_stvaluta && sum.in_valuta() ? PAGSCA_IMPORTOVAL : PAGSCA_IMPORTO); - if (sum.get_int(PART_TIPOMOV) == 2) // Is it a credit note ? + if (sum.tipo() == tm_nota_credito) // Is it a credit note ? _unsnc += rec.get_real(field); else _uns += rec.get_real(field); @@ -201,6 +206,29 @@ void TStampaScaduto::compute_unassigned(TPartita& p) void TStampaScaduto::compute_all(TPartita& p, TBill& bill) { + // 27-01-2014 Se una partita ha l'utlimo pagamento prima della data limite, posso ignorarla + if (p.chiusa()) + { + TDate last_pag; + for (int r = p.last(); r > 0; r = p.pred(r)) // Browse all rows (partite) + { + const TRiga_partite& rp = p.riga(r); + if (rp.tipo() > tm_fattura) + { + const TDate datareg = rp.get(PART_DATAREG); + if (datareg > last_pag) + { + last_pag = datareg; + if (last_pag > _limop) + break; + } + } + } + if (last_pag.ok() && last_pag <= _limop) + return; // Ignora partite chiuse da tempo immemorabile + } + + TGameLog gl(p); real residuo,nonscad,buonf,s1,s2,s3,s4,s5,s6,s7,res_pagati; @@ -211,7 +239,9 @@ void TStampaScaduto::compute_all(TPartita& p, TBill& bill) // se la data di registrazione della partita ' > di _limop (data lim operazione) // non deve scorrere le scadenze const TDate data_reg = rp.get_date(PART_DATAREG); - if (data_reg > _limop) continue; + if (data_reg > _limop) + continue; + for (int n=rp.rate(); n > 0; n--) // Browse all rows (scadenze) { const TRiga_scadenze& rs = rp.rata(n); @@ -248,11 +278,11 @@ void TStampaScaduto::compute_all(TPartita& p, TBill& bill) const TRectype pg = rs.row(pp); const TRiga_partite& sum = p.riga(pp); const char sez = sum.sezione(); - const int tipomov = sum.get_int(PART_TIPOMOV); + const tipo_movimento tipomov = sum.tipo(); // se tipomov e' 2 (Nota di credito assegnata) // storna da scdz. In entrambi i casi si ha l'operatore +=, perche' nel TImporto e' gia' // compresa la sezione opposta - if (tipomov==2) + if (tipomov==tm_nota_credito) { work_imp = TImporto(sez,pg.get_real(field)); scd += work_imp;