From b8723c664442b4555dd832fe240e79a96d8b4fc1 Mon Sep 17 00:00:00 2001 From: mtollari Date: Wed, 15 Feb 2017 13:29:34 +0000 Subject: [PATCH] Patch level : 12.0 344 Files correlati : li0 Commento : - Aggiunta programma per il resoconto delle dichiarazioni di intento - Adattata libreria per il nuovo programma - Sistemati errori di danneggiamento dell'heap causati dal distruttore di TLi_manager git-svn-id: svn://10.65.10.50/branches/R_10_00@23618 c028cbd2-c16b-5b4b-a496-9718f37d4682 --- src/li/li0.cpp | 11 ++-- src/li/li0.h | 1 + src/li/li0200.cpp | 135 +++++++++++++++++++++++++++++++++++++++++++++ src/li/li0200a.h | 9 +++ src/li/li0200a.msk | 134 ++++++++++++++++++++++++++++++++++++++++++++ src/li/li0500.cpp | 2 +- src/li/lilib01.cpp | 54 +++++++++++------- src/li/lilib01.h | 26 ++++----- src/li/limenu.men | 1 + 9 files changed, 334 insertions(+), 39 deletions(-) create mode 100644 src/li/li0200.cpp create mode 100644 src/li/li0200a.h create mode 100644 src/li/li0200a.msk diff --git a/src/li/li0.cpp b/src/li/li0.cpp index 2573b55d1..ce4445731 100755 --- a/src/li/li0.cpp +++ b/src/li/li0.cpp @@ -6,11 +6,12 @@ int main(int argc,char** argv) const int r = (argc > 1) ? atoi(&argv[1][1]) : -1; switch (r) { - case 2: li0300(argc,argv) ; break; // Impostazioni dichiarazione d'intento (ma perchè li600 è di default sciabolette!?) - case 3: li0400(argc,argv) ; break; // Gestione archivio - case 4: li0500(argc,argv) ; break; // Stampa archivio - case 5: - default: li0600(argc,argv) ; break; // Invio dati + case 1: li0200(argc,argv) ; break; // Visualizzazione riepilogo plafond + case 2: li0300(argc,argv) ; break; // Impostazioni dichiarazione d'intento (ma perchè li600 è di default sciabolette!?) + case 3: li0400(argc,argv) ; break; // Gestione archivio + case 4: li0500(argc,argv) ; break; // Stampa archivio + case 5: + default: li0600(argc,argv) ; break; // Invio dati } return 0; } diff --git a/src/li/li0.h b/src/li/li0.h index 58308b0a4..7ef83b22f 100755 --- a/src/li/li0.h +++ b/src/li/li0.h @@ -1,6 +1,7 @@ #ifndef __LI0_H #define __LI0_H +int li0200(int argc, char* argv[]); int li0300(int argc, char* argv[]); int li0400(int argc, char* argv[]); int li0500(int argc, char* argv[]); diff --git a/src/li/li0200.cpp b/src/li/li0200.cpp new file mode 100644 index 000000000..4ba5ced8c --- /dev/null +++ b/src/li/li0200.cpp @@ -0,0 +1,135 @@ +#include +#include +#include +#include +#include +#include +#include +#include "lilib01.h" + +#include "li0.h" +#include "li0200a.h" + +#define CONFIG_DICINT "DICINT.ini" + +class TResDI_mask : public TAutomask +{ +private: + TSheet_field& sheet; // Sheet + +public: + bool on_field_event(TOperable_field& o, TField_event e, long jolly) { return true; }; + TResDI_mask() : TAutomask("li0200a"), sheet(sfield(DOCUMENTI_STATO)) { load_config(); }; + void load_config(); + void elabTipiDoc(TToken_string& tipi, TToken_string& stati); +}; + +void TResDI_mask::load_config() +{ + set(FLD_TABIVA_CODTAB, ini_get_string(CONFIG_DITTA, "li", "CODIVA")); + TToken_string tipidoc(ini_get_string(CONFIG_DITTA, "li", "TIPIDOC")); + + TString_array& strarr = sheet.rows_array(); + sheet.hide(); + sheet.destroy(); + + for(int i = 0; i < tipidoc.items(); i++) + { + TString td = tipidoc.get(i); + TToken_string stati(ini_get_string(CONFIG_DITTA, "li", td)); + for(int j = 0; j < stati.items(); j++) + { + TToken_string row, s(stati.get(j), ','); + row.add(td); + row.add(s.get(0)); + row.add(s.get(1)); + strarr.add(row); + } + } + sheet.force_update(); + sheet.show(); +} + +void TResDI_mask::elabTipiDoc(TToken_string& tipi, TToken_string& stati) +{ + for(int i = 0; i < sheet.items(); i++) + { + TToken_string row = sheet.row(i); + int statoin = row.get_int(1), statoout = row.get_int(2); + for(; statoin <= statoout; statoin++) + { + // Immetto nelle due TToken_string i valori per gestire la classe TLista_documenti + // Per ogni posizione metto il documento e stato interessato, es. F01: da 1 a 3 -> tipi {F01|F01|F01} stati {1|2|3} + tipi.add(row.get(0)); + stati.add(statoin); + } + } +} + +class TResDI_app : public TSkeleton_application +{ + + void elab(TResDI_mask& m); +public: + virtual void main_loop(); +}; + +void TResDI_app::elab(TResDI_mask& m) +{ + int clifoda = m.get_long(F_CODICE_CLIFO_DA), clifoa = m.get_long(F_CODICE_CLIFO_A); + + // Creo le TToken_string necessarie per filtrare i documenti + TToken_string tipi, stati; + m.elabTipiDoc(tipi, stati); + + TRelation r_clifo(LF_CLIFO); + TRectype fil_from(r_clifo.curr()), fil_to(r_clifo.curr()); + fil_from.put("TIPOCF", "C"); + fil_to.put("TIPOCF", "C"); + + if(clifoda > 0) + fil_from.put("CODCF", clifoda); + + if(clifoa > 0) + fil_to.put("CODCF", clifoa); + + TCursor c_clifo(&r_clifo, "", 1, &fil_from, &fil_to); + + TLog_report log(TR("Resoconto plafond")); + for(c_clifo = 0; c_clifo.pos() < c_clifo.items(); ++c_clifo) + { + TRectype row_clifo(c_clifo.curr()); + + TLi_manager currentCli(row_clifo.get_char("TIPOCF"), row_clifo.get_long("CODCF"), TDate(TODAY).year()); // Inizializzo l'oggetto per la gestione del plafond + if(currentCli.hasValidPlafond()) + { + real plafond = currentCli.getPlafond(); + real resPlafond = currentCli.getPlaRes(tipi, stati); + + TString msg; + msg << "\nDichiarazione di intento cliente N." << row_clifo.get_long("CODCF") << "\nRagione sociale: " << row_clifo.get("RAGSOC") << "\nPlafond totale: " << static_cast(plafond).string() << "€\n"; + log.log(0, msg); + msg = TString("Plafond disponibile: ") << static_cast(resPlafond).string() << "€\n"; + log.log(0, msg); + } + } + log.print_or_preview(); +} + + +void TResDI_app::main_loop() +{ + TResDI_mask m; + while (m.run() == K_ENTER) + { + elab(m); + } +} + + +int li0200(int argc, char* argv[]) +{ + TResDI_app a; + a.run(argc, argv, TR("Stato lettere di intento")); + return 0; +} \ No newline at end of file diff --git a/src/li/li0200a.h b/src/li/li0200a.h new file mode 100644 index 000000000..b0b56008f --- /dev/null +++ b/src/li/li0200a.h @@ -0,0 +1,9 @@ +#define FLD_TIPODOC 101 +#define FLD_STATODOCDA 102 +#define FLD_STATODOCA 103 + +#define DOCUMENTI_STATO 201 + +#define FLD_TABIVA_CODTAB 301 +#define F_CODICE_CLIFO_DA 302 +#define F_CODICE_CLIFO_A 303 \ No newline at end of file diff --git a/src/li/li0200a.msk b/src/li/li0200a.msk new file mode 100644 index 000000000..790499b73 --- /dev/null +++ b/src/li/li0200a.msk @@ -0,0 +1,134 @@ +#include "li0200a.h" + +TOOLBAR "topbar" 0 0 0 2 +#include +ENDPAGE + +PAGE "Impostazioni dichiarazioni d'intento" 0 2 0 0 + +STRING FLD_TABIVA_CODTAB 4 +BEGIN + PROMPT 1 1 "Codice IVA plafond:" + FIELD CODTAB + KEY 1 + USE %IVA + FLAGS "U" + INPUT CODTAB FLD_TABIVA_CODTAB + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + DISPLAY "Tipo" S1 + DISPLAY "%@5" R0 + DISPLAY "Vent." S6 + DISPLAY "Sospeso" B2 + OUTPUT FLD_TABIVA_CODTAB CODTAB + HELP "Inserire il codice IVA" + CHECKTYPE REQUIRED + VALIDATE ZEROFILL_FUNC 2 +END + +NUMBER F_CODICE_CLIFO_DA 6 +BEGIN + PROMPT 1 2 "Da cod. cliente " + FLAG "UR" + USE LF_CLIFO + INPUT TIPOCF "C" + INPUT CODCF F_CODICE_CLIFO_DA + DISPLAY "Cliente" CODCF + DISPLAY "Ragione sociale@60" RAGSOC + OUTPUT F_CODICE_CLIFO_DA CODCF + GROUP 1 +END + +NUMBER F_CODICE_CLIFO_A 6 +BEGIN + PROMPT 32 2 "a " + FLAG "UR" + USE LF_CLIFO + INPUT TIPOCF "C" + INPUT CODCF F_CODICE_CLIFO_A + COPY DISPLAY F_CODICE_CLIFO_DA + OUTPUT F_CODICE_CLIFO_A CODCF + NUM_EXPR #F_CODICE_CLIFO_A>=#F_CODICE_CLIFO_DA + WARNING "Digitare un codice maggiore o uguale al campo 'da codice cliente'" + GROUP 1 +END + +SPREADSHEET DOCUMENTI_STATO 45 10 +BEGIN + PROMPT 1 5 "" + ITEM "Tipo Numerazione" + ITEM "Da stato" + ITEM "A stato" +END + +ENDPAGE + +ENDMASK + +PAGE "Riga tipo numerazione" -1 -1 78 8 + +STRING FLD_TIPODOC 4 +BEGIN + PROMPT 2 1 "Tipo Documento " + FIELD TIPODOC + HELP "Codice tipo documento" + USE %TIP + INPUT CODTAB FLD_TIPODOC + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT FLD_TIPODOC CODTAB + CHECKTYPE REQUIRED +END + +STRING FLD_STATODOCDA 4 +BEGIN + PROMPT 2 2 "Da Numerazione " + FIELD CODTAB + KEY 1 + USE %STD + FLAGS "U" + INPUT CODTAB FLD_STATODOCA + DISPLAY "Stato" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT FLD_STATODOCDA CODTAB + //CHECKTYPE REQUIRED +END + +STRING FLD_STATODOCA 4 +BEGIN + PROMPT 2 3 "A Numerazione " + FIELD CODTAB + KEY 1 + USE %STD + FLAGS "U" + INPUT CODTAB FLD_STATODOCA + DISPLAY "Stato" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT FLD_STATODOCA CODTAB + NUM_EXPR #FLD_STATODOCA>=#FLD_STATODOCDA + //CHECKTYPE REQUIRED +END + +ENDPAGE + +TOOLBAR "Documento" 0 0 0 2 + +BUTTON DLG_OK 2 2 +BEGIN + PROMPT 1 1 "" +END + +BUTTON DLG_DELREC 2 2 +BEGIN + PROMPT 1 1 "" +END + +BUTTON DLG_CANCEL 2 2 +BEGIN + PROMPT 1 1 "" +END + + +ENDPAGE + +ENDMASK diff --git a/src/li/li0500.cpp b/src/li/li0500.cpp index 283a35c77..c9fce066b 100755 --- a/src/li/li0500.cpp +++ b/src/li/li0500.cpp @@ -183,7 +183,7 @@ class TLetint_report : public TReport word _last_printed_page; protected: - virtual bool use_mask() { return false;} + virtual bool use_mask() { return false; } virtual word last_printed_page() const { return _last_printed_page; } public: diff --git a/src/li/lilib01.cpp b/src/li/lilib01.cpp index 46d1fe8fd..1b2d8c72d 100644 --- a/src/li/lilib01.cpp +++ b/src/li/lilib01.cpp @@ -5,12 +5,12 @@ void TLi_manager::elabTipiStati(TToken_string& tipi, TToken_string& stati) { - for(int i = 0; i < tipidoc.items(); i++) + for(int i = 0; i < tipidoc->items(); i++) { - TToken_string statidoc(ini_get_string(CONFIG_DITTA, "li", tipidoc.get(i)), ','); + TToken_string statidoc(ini_get_string(CONFIG_DITTA, "li", tipidoc->get(i)), ','); for(int j = statidoc.get_int(0); j <= statidoc.get_int(1); j++) { - tipi.add(tipidoc.get(i)); + tipi.add(tipidoc->get(i)); stati.add(j); } } @@ -29,31 +29,42 @@ void TLi_manager::elabPlafond() TSorted_cursor c_dicint(&letint, "ANNO-|NUMPROT-", "", 2, &filtro, &filtro); validPlafond = false; + bool done = false; if(c_dicint.items() > 0) { - for(c_dicint = 0; c_dicint.pos() < c_dicint.items(); ++c_dicint) + for(c_dicint = 0; c_dicint.pos() < c_dicint.items() && !done; ++c_dicint) { TRectype row = c_dicint.curr(); if(!row.get_bool("CHIUSA")) { - if(row.get_int("TIPOOP") != FINO_A_PLAFOND) - { - plafond = -UNO; - return; - } + done = true; + if(row.get_int("TIPOOP") != FINO_A_PLAFOND) continue; + year = row.get_int("ANNO"); iniDicInt = row.get_date("VSDATA"); plafond = row.get_real("IMPORTO"); validPlafond = true; - return; } } } - plafond = -UNO; + if(!validPlafond) + plafond = -UNO; } const real TLi_manager::getPlaRes() +{ + TToken_string tipi, stati; + elabTipiStati(tipi, stati); + return elabPlaRes(tipi, stati); +} + +const real TLi_manager::getPlaRes(TToken_string tipi, TToken_string stati) +{ + return elabPlaRes(tipi, stati); +} + +const real TLi_manager::elabPlaRes(TToken_string tipi, TToken_string stati) { if(!validPlafond) return -UNO; @@ -61,8 +72,6 @@ const real TLi_manager::getPlaRes() real resPlafond = plafond; TLista_documenti din; // Legge tutti i documenti di input - TToken_string tipi, stati; - elabTipiStati(tipi, stati); TDate ad(31, 12, year); // Trovo tutti i documenti che mi interessano e sottraggo l'imponibile al plafond @@ -74,8 +83,9 @@ const real TLi_manager::getPlaRes() TString numerazione = din[i].numerazione(); int numdoc = din[i].numero(); int anno = din[i].anno(); - TRiepilogo_iva * totali = static_cast(tabIva.get()); - if(totali->cod_iva() == codiva) + TRiepilogo_iva * totali = dynamic_cast(tabIva.get()); + + if(totali->cod_iva().codice() == *codiva) { resPlafond -= cache().get("%TIP", din[i].tipo().codice()).get_bool("B7") ? -totali->imp_orig() : totali->imp_orig(); } @@ -101,7 +111,7 @@ bool TLi_manager::testPlafond(TLista_documenti dout, TLog_report& lerr) int numdoc = dout[i].numero(); int anno = dout[i].anno(); TRiepilogo_iva * totali = static_cast(tabIva.get()); - if(totali->cod_iva() == codiva) + if(totali->cod_iva().codice() == *codiva) { resPlafond -= totali->imp_orig(); totFatt += totali->imp_orig(); @@ -121,10 +131,16 @@ bool TLi_manager::testPlafond(TLista_documenti dout, TLog_report& lerr) // TIPOCF, CODCLI, ANNO TLi_manager::TLi_manager(const char t, const long c, int y) - : tipocf(t), codcli(c), year(y), iniDicInt() + : tipocf(t), codcli(c), year(y), iniDicInt(), plafond(-UNO), validPlafond(false) { - tipidoc = ini_get_string(CONFIG_DITTA, "li", "TIPIDOC"); + tipidoc = new TToken_string(ini_get_string(CONFIG_DITTA, "li", "TIPIDOC")); elabPlafond(); // Estrapolo il codice iva - codiva = TCodiceIVA(ini_get_string(CONFIG_DITTA, "li", "CODIVA")); + codiva = new TString(ini_get_string(CONFIG_DITTA, "li", "CODIVA")); +} + +TLi_manager::~TLi_manager() +{ + delete codiva; + delete tipidoc; } \ No newline at end of file diff --git a/src/li/lilib01.h b/src/li/lilib01.h index c0343a985..57c17cf78 100644 --- a/src/li/lilib01.h +++ b/src/li/lilib01.h @@ -1,10 +1,6 @@ #ifndef __LILIB01_H #define __LILIB01_H -/* -#ifndef __REAL_H -#include -#endif -*/ + #ifndef __DATE_H #include #endif @@ -29,24 +25,26 @@ class TLi_manager : TObject const long codcli; TDate iniDicInt; - TToken_string tipidoc; + TToken_string* tipidoc; real plafond; - TCodiceIVA codiva; + TString* codiva; void elabTipiStati(TToken_string& tipi, TToken_string& stati); // Preparo due token string con le tipi[0] -> stati[0], ... - void elabPlafond(); // Vado a estrapolare il plafond - const real getPlaRes(); // Calcolo il rimanente del plafond public: - const real getPlafond() { return plafond; }; // Rirno il plafond - bool hasValidPlafond() { return validPlafond;} // Ritorno se il plafond è valido - bool testPlafond(TLista_documenti dout, TLog_report& lerr); // Testo se con i documenti passati supero il plafond - bool checkModule(); // Controllo se il modulo è attivo + void elabPlafond(); // Vado a estrapolare il plafond + const real getPlaRes(); // Calcolo il rimanente del plafond + const real getPlaRes(TToken_string tipi, TToken_string stati); // Calcolo il rimanente del plafond su tipi e stati documento passati + const real elabPlaRes(TToken_string tipi, TToken_string stati); // Funzione che effettivamente effettua il calcolo + const real getPlafond() { return plafond; } // Ritorno il plafond + bool hasValidPlafond() { return validPlafond; } // Ritorno se il plafond è valido + bool testPlafond(TLista_documenti dout, TLog_report& lerr); // Testo se con i documenti passati supero il plafond + bool checkModule(); // Controllo se il modulo è attivo // Costructors/Destructors TLi_manager(const char t, const long c, int y = -1); - virtual ~TLi_manager() {}; + ~TLi_manager(); void setYear(int y) { year = y; } }; diff --git a/src/li/limenu.men b/src/li/limenu.men index 3047a99d3..ce2747903 100755 --- a/src/li/limenu.men +++ b/src/li/limenu.men @@ -5,5 +5,6 @@ Module = 16 Flags = "F" Item_01 = "Dichiarazioni d'intento", "li0 -3", "" Item_02 = "Stampa dichiarazioni", "li0 -4", "" +Item_03 = "Riepilogo dichiarazioni", li0 -1", "" Item_03 = "Impostazioni", "li0 -2", ""