#include #include #include #include #include #include "..\ve\velib.h" #include #include "lilib01.h" #include "letint.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, TToken_string& tipif, TToken_string& statif); }; void TResDI_mask::load_config() { //Anno set(F_A_DATA, TDate(TODAY)); 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(); 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, TToken_string& tipif, TToken_string& statif) { bool fattura; TString tipo; for(int i = 0; i < sheet.items(); 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} if (fattura) { tipif.add(tipo); statif.add(statoin); } else { tipi.add(tipo); 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); int clifoa = m.get_long(F_CODICE_CLIFO_A); TDate aData(m.get_date(F_A_DATA)); // Creo le TToken_string necessarie per filtrare i documenti 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()); 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 cli(row_clifo.get_long("CODCF"), aData.year()); // Inizializzo l'oggetto per la gestione del plafond if (cli.has_valid_plafond()) { TArray arr = cli.get_plafond_array(); const int rows = arr.items(); for (int r = 0; r < rows; r++) { const TRectype & reclint = (const TRectype &) arr[r]; const int numprot = reclint.get_int(LETINT_NUMPROT); real plafond = reclint.get_real(LETINT_IMPORTO); real utilizzato = reclint.get_real(LETINT_UTILIZZATO); real residuo = plafond - utilizzato; const int tipo = reclint.get_int(LETINT_TIPOOP); const TDate dal = reclint.get_date(LETINT_DAL); const TDate al = reclint.get_date(LETINT_AL); TString msg; msg << TR("Dichiarazione di intento cliente ") << row_clifo.get_long(CLI_CODCF) << " - "<< row_clifo.get(CLI_RAGSOC) << '\n'; log.log(0, msg); msg.cut(0) << TR("Protocollo: ") << numprot << " - " << TR("Plafond disponibile: ") << residuo << "€" << '\n'; log.log(0, msg); msg.cut(0) << TR("Tipo dichiarazione: "); switch (tipo) { case SOLUZIONE_UNICA: msg << TR("Singola") << '\n'; break; case FINO_A_PLAFOND: msg << TR("A concorrenza ") << TR("Dal ") << dal << '\n'; break; case A_TEMPO: msg << TR("Dal ") << dal << TR("Al ") << al << '\n'; break; default: break; } log.log(0, msg); log.log(0, ""); } } } 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; }