diff --git a/src/li/li0.cpp b/src/li/li0.cpp index ce4445731..e1e2da5e2 100755 --- a/src/li/li0.cpp +++ b/src/li/li0.cpp @@ -7,7 +7,7 @@ int main(int argc,char** argv) switch (r) { 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 2: li0300(argc,argv) ; break; // Impostazioni dichiarazione d'intento case 3: li0400(argc,argv) ; break; // Gestione archivio case 4: li0500(argc,argv) ; break; // Stampa archivio case 5: diff --git a/src/li/li0200.cpp b/src/li/li0200.cpp index 34ada95a6..51cd78987 100644 --- a/src/li/li0200.cpp +++ b/src/li/li0200.cpp @@ -21,15 +21,15 @@ 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 elabTipiDoc(TToken_string& tipi, TToken_string& stati, TToken_string& tipif, TToken_string& statif); }; void TResDI_mask::load_config() { //Anno - set(FLD_ANNO, TDate(TODAY).year()); + set(F_A_DATA, TDate(TODAY)); - set(FLD_TABIVA_CODTAB, ini_get_string(CONFIG_DITTA, "li", "CODIVA")); + set(F_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(); @@ -53,18 +53,36 @@ void TResDI_mask::load_config() sheet.show(); } -void TResDI_mask::elabTipiDoc(TToken_string& tipi, TToken_string& stati) +void TResDI_mask::elabTipiDoc(TToken_string& tipi, TToken_string& stati, TToken_string& tipif, TToken_string& statif) { + bool fattura; + TString tipo; for(int i = 0; i < sheet.items(); i++) { - TToken_string row = sheet.row(i); + TToken_string row = sheet.row(i); // Es. "F01|1|5" int statoin = row.get_int(1), statoout = row.get_int(2); + tipo = row.get(0); + + if(cache().get("%TIP", tipo).get_int("I1") == 2) // Se il tipo è una fattura + fattura = true; + else + fattura = false; + for(; statoin <= statoout; statoin++) { + // Aggiornamento: Ci sono 4 token string ora, due per le fatture e due per il resto. // 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); + if (fattura) + { + tipif.add(tipo); + statif.add(statoin); + } + else + { + tipi.add(tipo); + stati.add(statoin); + } } } } @@ -81,11 +99,11 @@ void TResDI_app::elab(TResDI_mask& m) { int clifoda = m.get_long(F_CODICE_CLIFO_DA); int clifoa = m.get_long(F_CODICE_CLIFO_A); - int anno = m.get_int(FLD_ANNO); + TDate aData(m.get_date(F_A_DATA)); // Creo le TToken_string necessarie per filtrare i documenti - TToken_string tipi, stati; - m.elabTipiDoc(tipi, stati); + TToken_string tipi, stati, tipif, statif; + m.elabTipiDoc(tipi, stati, tipif, statif); TRelation r_clifo(LF_CLIFO); TRectype fil_from(r_clifo.curr()), fil_to(r_clifo.curr()); @@ -105,11 +123,11 @@ void TResDI_app::elab(TResDI_mask& m) { TRectype row_clifo(c_clifo.curr()); - TLi_manager currentCli(row_clifo.get_char("TIPOCF"), row_clifo.get_long("CODCF"), anno); // Inizializzo l'oggetto per la gestione del plafond + TLi_manager currentCli(row_clifo.get_char("TIPOCF"), row_clifo.get_long("CODCF")); // Inizializzo l'oggetto per la gestione del plafond if(currentCli.hasValidPlafond()) { real plafond = currentCli.getPlafond(); - real resPlafond = currentCli.getPlaRes(tipi, stati); + real resPlafond = plafond - currentCli.elabUtil(tipi, stati, aData) - currentCli.elabUtil(tipif, statif); 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"; diff --git a/src/li/li0200a.h b/src/li/li0200a.h index 0cf9f7c96..c768ca01b 100644 --- a/src/li/li0200a.h +++ b/src/li/li0200a.h @@ -1,10 +1,10 @@ -#define FLD_TIPODOC 101 -#define FLD_STATODOCDA 102 -#define FLD_STATODOCA 103 +#define F_TIPODOC 101 +#define F_STATODOCDA 102 +#define F_STATODOCA 103 #define DOCUMENTI_STATO 201 -#define FLD_TABIVA_CODTAB 301 -#define FLD_ANNO 302 -#define F_CODICE_CLIFO_DA 303 -#define F_CODICE_CLIFO_A 304 \ No newline at end of file +#define F_TABIVA_CODTAB 301 +#define F_A_DATA 303 +#define F_CODICE_CLIFO_DA 304 +#define F_CODICE_CLIFO_A 305 \ No newline at end of file diff --git a/src/li/li0200a.msk b/src/li/li0200a.msk index 516c71177..89fcf98d6 100644 --- a/src/li/li0200a.msk +++ b/src/li/li0200a.msk @@ -6,34 +6,30 @@ ENDPAGE PAGE "Impostazioni dichiarazioni d'intento" 0 2 0 0 -STRING FLD_TABIVA_CODTAB 4 +STRING F_TABIVA_CODTAB 4 BEGIN PROMPT 1 1 "Codice IVA plafond:" FIELD CODTAB KEY 1 USE %IVA FLAGS "U" - INPUT CODTAB FLD_TABIVA_CODTAB + INPUT CODTAB F_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 + OUTPUT F_TABIVA_CODTAB CODTAB HELP "Inserire il codice IVA" CHECKTYPE REQUIRED VALIDATE ZEROFILL_FUNC 2 END -NUMBER FLD_ANNO 4 -BEGIN - PROMPT 1 2 "Anno:" - HELP "Inserire l'anno" - FIELD ANNO +DATE F_A_DATA +BEGIN + PROMPT 1 2 "A data " CHECKTYPE REQUIRED - WARNING "Inserire l'anno" - NUM_EXPR #FLD_ANNO>0 END NUMBER F_CODICE_CLIFO_DA 6 @@ -77,45 +73,45 @@ ENDMASK PAGE "Riga tipo numerazione" -1 -1 78 8 -STRING FLD_TIPODOC 4 +STRING F_TIPODOC 4 BEGIN PROMPT 2 1 "Tipo Documento " FIELD TIPODOC HELP "Codice tipo documento" USE %TIP - INPUT CODTAB FLD_TIPODOC + INPUT CODTAB F_TIPODOC DISPLAY "Codice" CODTAB DISPLAY "Descrizione@50" S0 - OUTPUT FLD_TIPODOC CODTAB + OUTPUT F_TIPODOC CODTAB CHECKTYPE REQUIRED END -STRING FLD_STATODOCDA 4 +STRING F_STATODOCDA 4 BEGIN PROMPT 2 2 "Da Numerazione " FIELD CODTAB KEY 1 USE %STD FLAGS "U" - INPUT CODTAB FLD_STATODOCA + INPUT CODTAB F_STATODOCA DISPLAY "Stato" CODTAB DISPLAY "Descrizione@50" S0 - OUTPUT FLD_STATODOCDA CODTAB + OUTPUT F_STATODOCDA CODTAB //CHECKTYPE REQUIRED END -STRING FLD_STATODOCA 4 +STRING F_STATODOCA 4 BEGIN PROMPT 2 3 "A Numerazione " FIELD CODTAB KEY 1 USE %STD FLAGS "U" - INPUT CODTAB FLD_STATODOCA + INPUT CODTAB F_STATODOCA DISPLAY "Stato" CODTAB DISPLAY "Descrizione@50" S0 - OUTPUT FLD_STATODOCA CODTAB - NUM_EXPR #FLD_STATODOCA>=#FLD_STATODOCDA + OUTPUT F_STATODOCA CODTAB + NUM_EXPR #F_STATODOCA>=#F_STATODOCDA //CHECKTYPE REQUIRED END diff --git a/src/li/lilib01.cpp b/src/li/lilib01.cpp index 74172dca5..a3765b5fd 100644 --- a/src/li/lilib01.cpp +++ b/src/li/lilib01.cpp @@ -69,7 +69,7 @@ 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) +const real TLi_manager::elabPlaRes(TToken_string tipi, TToken_string stati, TDate ad) { if(!validPlafond) return -UNO; @@ -77,7 +77,6 @@ const real TLi_manager::elabPlaRes(TToken_string tipi, TToken_string stati) real resPlafond = plafond; TLista_documenti din; // Legge tutti i documenti di input - TDate ad(31, 12, year); // Trovo tutti i documenti che mi interessano e sottraggo l'imponibile al plafond din.read('D', tipocf, codcli, year, tipi, stati, iniDicInt, ad); @@ -94,7 +93,6 @@ const real TLi_manager::elabPlaRes(TToken_string tipi, TToken_string stati) { resPlafond -= cache().get("%TIP", din[i].tipo().codice()).get_bool("B7") ? -totali->imp_orig() : totali->imp_orig(); } - //if(resPlafond < 0) break; // Nel caso il plafond trovato fosse una soluzione unica e ho già trovato dei documenti vuol dire che il plafond non è più valido if(soluzione) @@ -107,6 +105,42 @@ const real TLi_manager::elabPlaRes(TToken_string tipi, TToken_string stati) return resPlafond; } +const real TLi_manager::elabUtil(TToken_string tipi, TToken_string stati, TDate ad) +{ + if(!validPlafond) + return -UNO; + + real utilizzato = ZERO; + + TLista_documenti din; // Legge tutti i documenti di input + + // Trovo tutti i documenti che mi interessano e sottraggo l'imponibile al plafond + din.read('D', tipocf, codcli, year, tipi, stati, iniDicInt, ad); + + for(int i = 0; i < din.items(); i++) + { + TAssoc_array tabIva = din[i].tabella_iva(true); + TString numerazione = din[i].numerazione(); + int numdoc = din[i].numero(); + int anno = din[i].anno(); + TRiepilogo_iva * totali = dynamic_cast(tabIva.get()); + + if(totali->cod_iva().codice() == codiva) + { + utilizzato += cache().get("%TIP", din[i].tipo().codice()).get_bool("B7") ? -totali->imp_orig() : totali->imp_orig(); + } + + // Nel caso il plafond trovato fosse una soluzione unica e ho già trovato dei documenti vuol dire che il plafond non è più valido + if(soluzione) + { + utilizzato = -UNO; + break; + } + } + + return utilizzato; +} + bool TLi_manager::testPlafond(TLista_documenti dout, TLog_report& lerr) { bool err = false; diff --git a/src/li/lilib01.h b/src/li/lilib01.h index 6b4562754..fa98175b8 100644 --- a/src/li/lilib01.h +++ b/src/li/lilib01.h @@ -34,21 +34,25 @@ class TLi_manager : TObject void elabTipiStati(TToken_string& tipi, TToken_string& stati); // Preparo due token string con le tipi[0] -> stati[0], ... public: + // Getters + const real getPlafond() { return plafond; } // Ritorno il plafond + bool hasValidPlafond() { return validPlafond; } // Ritorno se il plafond è valido + bool isSoluzione() { return soluzione; } // Ritorna se è una dichiarazione di tipo soluzione + + // Setters + void setYear(int y) { year = y; } // Imposta l'anno, mai usata + + // Functions void elabPlafond(); // Vado a estrapolare il plafond + bool testPlafond(TLista_documenti dout, TLog_report& lerr); // Testo se con i documenti passati supero 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 - bool isSoluzione() { return soluzione; } // Ritorna se è una dichiarazione di tipo soluzione + const real elabPlaRes(TToken_string tipi, TToken_string stati, TDate ad = 0L); // Funzione che effettivamente effettua il calcolodalla data della dichiarazione alla data passata + const real elabUtil(TToken_string tipi, TToken_string stati, TDate ad = 0L); // Ritorna la quantità di plafond utilizzato dalla data della dichiarazione alla data passata // Costructors/Destructors TLi_manager(const char t, const long c, int y = -1); ~TLi_manager(); - - void setYear(int y) { year = y; } };