From a084716017dee1b339831002e8b358b3531eb5c1 Mon Sep 17 00:00:00 2001 From: guy Date: Thu, 7 Dec 1995 17:05:07 +0000 Subject: [PATCH] Gestione importo scaduto git-svn-id: svn://10.65.10.50/trunk@2260 c028cbd2-c16b-5b4b-a496-9718f37d4682 --- sc/sc2100.cpp | 132 +++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 105 insertions(+), 27 deletions(-) diff --git a/sc/sc2100.cpp b/sc/sc2100.cpp index 94c403798..139c9c1a0 100755 --- a/sc/sc2100.cpp +++ b/sc/sc2100.cpp @@ -57,30 +57,34 @@ TEC_form* TEC_form::_form = NULL; /////////////////////////////////////////////////////////// // TEC_row +// Rappresenta una singola riga di stampa /////////////////////////////////////////////////////////// class TEC_row : public TSortable { - TDate _data; - int _riga; - int _rata; + TDate _data; // Data scadenza o pagamento + int _riga; // Riga della fattura + int _rata; // Numero rata o progrssivo - TString _causale; - TString _descrizione; + TString _causale; // Codice causale + TString _descrizione; // Sua descrizione - TDate _data_doc; - TString _num_doc; - long _num_prot; - TImporto _importo; - TImporto _importo_lire; - real _scaduto; - real _totale; - TValuta _valuta; + TDate _data_doc; // Data del documento + TString _num_doc; // Numero documento + long _num_prot; // Protocollo IVA + TImporto _importo; // Importo in valuta + TImporto _importo_lire; // Importo in lire + real _scaduto; // Importo scaduto + real _totale; // Totale documento + TValuta _valuta; // Codice valuta, data cambio e cambio protected: // TSortable virtual int compare(const TSortable& s) const; public: + int riga() const { return _riga; } + int rata() const { return _rata; } + void descrizione(const char* s) { _descrizione = s; } void scaduto(const real& s) { _scaduto = s; } @@ -118,7 +122,7 @@ TEC_row::TEC_row(const char* desc, const TImporto& imp) _importo = imp; _importo.normalize(); } -// Le righe dell'estratto conto sono ordinate per data, riga partita, numero rata, +// Le righe dell'estratto conto sono ordinate per data, riga partita, numero rata o // posizione iniziale nell'array (in caso di uguaglianza di tutto il resto) int TEC_row::compare(const TSortable& s) const { @@ -195,15 +199,22 @@ void TEC_row::print_on(TPrint_section& body) /////////////////////////////////////////////////////////// class TEC_array : public TArray -{ - const TEC_form* _form; +{ + TArray _scaduto; // Array di importi scaduti + + const TEC_form* _form; // Form che contiene l'array di righe protected: TEC_row& new_row(const TRiga_partite& row, const TDate& data, const TImporto& imp, int rata = 0); void add_row(const TRiga_partite& row); const TEC_form& form() const { return *_form; } - void calcola_scaduto(const TRiga_scadenze& rata, real& scaduto) const; + real calcola_scaduto(const TRiga_scadenze& rata, bool valuta); + + TImporto* importo_riga_scaduto_ptr(int n) const { return (TImporto*)_scaduto.objptr(n); } + TImporto& importo_riga_scaduto(int n); + + TImporto importo(const TPartita& game, const TRectype& pag, bool valuta) const; public: TEC_row& row(int r) const { return (TEC_row&)operator[](r); } @@ -212,28 +223,81 @@ public: virtual ~TEC_array() {} }; -void TEC_array::calcola_scaduto(const TRiga_scadenze& rata, real& scaduto) const +// Calcola l'importo su di una riga di pagamento +TImporto TEC_array::importo(const TPartita& game, const TRectype& pag, bool valuta) const +{ + const int nriga = pag.get_int(PAGSCA_NRIGA); + const TRiga_partite& fat = game.riga(nriga); + const bool fat_val = fat.in_valuta(); + + const int nrigp = pag.get_int(PAGSCA_NRIGP); + const TRiga_partite& sum = game.riga(nrigp); + const char sez = sum.sezione(); + + const char* const field = valuta && fat_val ? PAGSCA_IMPORTOVAL : PAGSCA_IMPORTO; + TImporto imp(sez, pag.get_real(PAGSCA_IMPORTO)); + + if (!fat_val) + imp.valore() += pag.get_real(PAGSCA_RITENUTE); + + if (pag.get_char(PAGSCA_ACCSAL) == 'S') + { + real abb(pag.get(PAGSCA_ABBUONI)); + if (!valuta && fat_val) + { + const TValuta val(sum); + val.val2lit(abb); + abb += pag.get_real(PAGSCA_DIFFCAM); + } + imp.valore() += abb; + } + + return imp; +} + +TImporto& TEC_array::importo_riga_scaduto(int n) +{ + TImporto* imp = importo_riga_scaduto_ptr(n); + if (imp == NULL) + { + imp = new TImporto; + _scaduto.add(imp); + } + return *imp; +} + +real TEC_array::calcola_scaduto(const TRiga_scadenze& rata, bool valuta) { const TPartita& game = rata.partita(); - TImporto imp_scaduto = rata.importo(TRUE); + + TImporto scaduto_rata = rata.importo(TRUE); - const char* const field = rata.in_valuta() ? PAGSCA_IMPORTOVAL : PAGSCA_IMPORTO; - TImporto imp; + int riga_corrente_scaduto = 0; - for (int p = rata.last(); p > 0; p = rata.pred(p)) + const int lastp = rata.last(); // Ultimo pagamento sulla rata corrente + for (int p = rata.first(); p <= lastp; p = rata.succ(p)) // Qui bisogna andare in avanti! { const TRectype& pag = rata.row(p); const TRiga_partite& sum = game.riga(pag.get_int(PAGSCA_NRIGP)); const tipo_movimento tm = sum.tipo(); - if (tm != tm_insoluto && tm != tm_pagamento_insoluto) + const TImporto imp = importo(game, pag, valuta); + if (tm == tm_insoluto && tm == tm_pagamento_insoluto) + { + if (tm == tm_insoluto) + riga_corrente_scaduto = pag.get_int(PAGSCA_NRIGP); + else + CHECKD(riga_corrente_scaduto > 0, "Pagamento insoluto senza insoluto ", p); + importo_riga_scaduto(riga_corrente_scaduto) += imp; + } + else { - imp.set(sum.sezione(), pag.get_real(field)); - imp_scaduto += imp; + scaduto_rata += imp; } } + const char sezione = game.conto().tipo() == 'C' ? 'D' : 'A'; - imp_scaduto.normalize(sezione); - scaduto = imp_scaduto.valore(); + scaduto_rata.normalize(sezione); + return scaduto_rata.valore(); } TEC_row& TEC_array::new_row(const TRiga_partite& row, const TDate& data, @@ -298,6 +362,19 @@ TEC_array::TEC_array(const TPartita& game, const TEC_form* f) { for (int r = game.last(); r > 0; r = game.pred(r)) add_row(game.riga(r)); + + const char sezione = game.conto().tipo() == 'C' ? 'D' : 'A'; + for (r = items()-1; r >= 0; r--) + { + TEC_row& s = row(r); + TImporto* imp = importo_riga_scaduto_ptr(s.riga()); + if (imp != NULL) + { + imp->normalize(sezione); + s.scaduto(imp->valore()); + } + } + sort(); } @@ -317,6 +394,7 @@ void TEC_form::ec_header_handler(TPrinter& pr) pr.setheaderline(j, head.row(j)); } +// Confronta due valute alfabeticamente static int val_compare(const void* o1, const void* o2) { const THash_object* h1 = (const THash_object*)o1;