diff --git a/src/sc/sc2101.cpp b/src/sc/sc2101.cpp index a5d0ac84d..84c23d259 100755 --- a/src/sc/sc2101.cpp +++ b/src/sc/sc2101.cpp @@ -1,12 +1,17 @@ +#include +#include #include #include #include "../pr/agenti.h" +#include "../ca/calib01.h" #include "sc2101.h" #include "sc2100a.h" #include "sc21pec.h" - +#include "../ca/movana.h" +#include "../ca/rmovana.h" + bool TEC_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) { switch (o.dlg()) @@ -21,9 +26,9 @@ bool TEC_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) return true; break; case F_CODPROF: - if (e == fe_close) + if (e == fe_modify) { - o.check_type(CHECK_REQUIRED); + o.check_type(CHECK_NORMAL); const bool ok = o.check(); @@ -76,6 +81,8 @@ bool TEC_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) update_checked(); safe_delete(_form); set_export(false); + form().stampa_saldo(stampa_saldo()); + form().anal_filter(get_anal_filter()); TForm_item& nec = form().find_field('H', odd_page, PEC_NUMPROG); @@ -99,13 +106,69 @@ bool TEC_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) return TSelection_mask::on_field_event(o, e, jolly); } -TEC_mask::TEC_mask(const char* name) : TSelection_mask(name), _ditta(LF_NDITTE), _ec_mail("sc2100b"), _form(nullptr), _games(nullptr), _export(false) +TEC_mask::TEC_mask(const char* name) : TSelection_mask(name), _ditta(LF_NDITTE), _ec_mail("sc2100b"), _form(nullptr), _games(nullptr), _export(false), _anal(LF_MOVANA, MOVANA_NUMREG, 3) { _ditta.add(LF_ANAG, "TIPOA==TIPOA|CODANAGR==CODANAGR"); _ditta.add(LF_COMUNI, "COM==COMRF(COMRES)", 1, LF_ANAG, 101); _ditta.add(LF_COMUNI, "COM==COMRES", 1, LF_ANAG, 102); _tiponumec = ini_get_string(CONFIG_DITTA, "cg", "NumEC")[0]; _lastnumec = ini_get_long(CONFIG_DITTA, "cg", "LastEC"); + _cdc_start = 0; + _cdc_end = 0; + _cms_start = 0; + _cms_end = 0; + _fas_start = 0; + _fas_end = 0; + + if (dongle().active(CAAUT) || dongle().active(CMAUT)) + { + create_page("Selezione analitica", 1); + const TMultilevel_code_info& fasinfo = ca_multilevel_code_info(LF_FASI); + const bool use_fsc = fasinfo.levels() > 0; + TConfig& ini = ca_config(); + + int y = 3; + short dlg = PEC_ANAL0; // id del primo campo da generare + short dlgd = PEC_DESANAL0; + + for (int i = 0; i < 2; i++) + { + const TString& level = ini.get("Level", NULL, i + 1); // Legge il livello 1 o 2 + if (level == "CDC") // Crea centro di costo + { + _cdc_start = dlg; + _cdc_end = _cdc_start + ca_multilevel_code_info(LF_CDC).levels() - 1; + if (use_fsc && fasinfo.parent() == LF_CDC) + { + _fas_start = _cdc_end + 1; + _fas_end = _fas_start + ca_multilevel_code_info(LF_FASI).levels() - ca_multilevel_code_info(LF_COMMESSE).levels() - 1; + insert_anal_fields(*this, 1, LF_FASI, y, dlg, dlgd); + } + else + insert_anal_fields(*this, 1, LF_CDC, y, dlg, dlgd); + } + else + if (level == "CMS") // Crea commessa + { + _cms_start = dlg; + _cms_end = _cms_start + ca_multilevel_code_info(LF_COMMESSE).levels() - 1; + if (use_fsc && fasinfo.parent() == LF_COMMESSE) + { + _fas_start = _cms_end + 1; + _fas_end = _fas_start + ca_multilevel_code_info(LF_FASI).levels() - ca_multilevel_code_info(LF_COMMESSE).levels() - 1; + insert_anal_fields(*this, 1, LF_FASI, y, dlg, dlgd); + } + else + insert_anal_fields(*this, 1, LF_COMMESSE, y, dlg, dlgd); + } + } + if (use_fsc && fasinfo.parent() <= 0) + { + _fas_start = dlg; + _fas_end = _fas_start + ca_multilevel_code_info(LF_FASI).levels() - 1; + insert_anal_fields(*this, 1, LF_FASI, y, dlg, dlgd); + } + } } TEC_mask::~TEC_mask() @@ -136,6 +199,36 @@ TESSL_form & TEC_mask::form() return *_form; } +int TEC_mask::insert_anal_fields(TMask& m, int page, int lf, int& y, + short& dlg, short& dlgd) +{ + const int h = ca_create_fields(m, page, lf, 2, y, dlg, dlgd); + + for (int i = 0; i < h; i++) + { + TEdit_field& fld = m.efield(dlg + i); + int logic = lf; + + if (logic == LF_FASI) + { + const TMultilevel_code_info& fasinfo = ca_multilevel_code_info(LF_FASI); + if (fasinfo.parent() != 0) + { + const TMultilevel_code_info& parinfo = ca_multilevel_code_info(fasinfo.parent()); + if (i < parinfo.levels()) + logic = fasinfo.parent(); + } + } + + TEdit_field& dfld = m.efield(dlgd + i); + + dfld.set_field(EMPTY_STRING); // Toglie campi che fan saltare gli output! + + } + y += h + 1; + dlg += h; dlgd += h; + return h; +} bool TEC_mask::print_selected() { @@ -563,6 +656,8 @@ int TEC_mask::print_one(const char * tipo, const long codice) TWait_cursor hourglass; const bool printing = _form->printing(); int printed = 0; // Non ho stampato ancora nulla + TToken_string anal_filter = form().get_anal_filter(); + const bool select_analitica = (dongle().active(CAAUT) || dongle().active(CMAUT)) && anal_filter.full(); if (printing && _form->cursor()->curr().num() == LF_CLIFO) { @@ -639,6 +734,52 @@ int TEC_mask::print_one(const char * tipo, const long codice) TPartita game(curr); + if (select_analitica) + { + bool print = false; + + for (int r = game.first(); !print && r <= game.last(); r = game.succ(r)) + { + const TRiga_partite& row = game.riga(r); + const TString& numregcg = row.get(PART_NREG); + const long numreg = atol(_anal.decode(numregcg)); + + if (numreg > 0) + { + TAnal_mov anal_mov(numreg); + TRecord_array & rows = anal_mov.body(); + const int nrows = rows.rows(); + TString s; + + for (int i = 1; !print && i <= nrows; i++) + { + const TRectype & row = anal_mov.body().row(i); + TString f = anal_filter.get(0); + f.trim(); + + if (f.full()) + { + s = row.get(RMOVANA_CODCMS); + print |= s.match(f); + } + f = anal_filter.get(); + if (f.full()) + { + s = row.get(RMOVANA_CODCCOSTO); + print |= s.match(f); + } + f = anal_filter.get(); + if (f.full()) + { + s = row.get(RMOVANA_CODFASE); + print |= s.match(f); + } + } + } + } + if (!print) + return 0; + } // Non fregare i clienti agli altri agenti! if (_games != nullptr && !_games->has_game(curr)) continue; @@ -712,3 +853,89 @@ int TEC_mask::print_one(const char * tipo, const long codice) xvtil_statbar_set(nullptr); return printed; } + +const TToken_string & TEC_mask::get_anal_filter() const +{ + TToken_string &f = get_tmp_string(100); + TString s; + TString codfase; + const TMultilevel_code_info & fasi = ca_multilevel_code_info(LF_FASI); + TConfig& cfg = ca_config(); + bool full = false; + bool empty = true; + + if (_cms_start > 0) + { + s.cut(0); + for (short dlg = _cms_start; dlg <= _cms_end; dlg++) + { + const int len = field(dlg).size(); + TString val = get(dlg); + + full |= val.full(); + if (val.full()) + val.rpad(len); + else + val.fill('?', len); + s << val; + } + } + if (full) + { + empty = false; + f.add(s); + } + else + f.add(""); + if (_cdc_start > 0) + { + full = false; + s.cut(0); + for (short dlg = _cdc_start; dlg <= _cdc_end; dlg++) + { + const int len = field(dlg).size(); + TString val = get(dlg); + + full |= val.full(); + if (val.full()) + val.rpad(len); + else + val.fill('?', len); + s << val; + } + } + if (full) + { + empty = false; + f.add(s); + } + else + f.add(""); + if (_fas_start > 0) + { + full = false; + s.cut(0); + for (short dlg = _fas_start; dlg <= _fas_end; dlg++) + { + const int len = field(dlg).size(); + TString val = get(dlg); + + full |= val.full(); + if (val.full()) + val.rpad(len); + else + val.fill('?', len); + s << val; + } + } + if (full) + { + empty = false; + f.add(s); + } + else + f.add(""); + if (empty) + f.cut(0); + return f; +} diff --git a/src/sc/sc2101.h b/src/sc/sc2101.h index 7be0f262e..fd2b3b2b3 100755 --- a/src/sc/sc2101.h +++ b/src/sc/sc2101.h @@ -118,8 +118,6 @@ public: void set_pagam(const TString& codpag); - - TEC_recordset& recordset() const { CHECK(_export == true, "Not exporting"); return *_recordset; } TEC_form(const TEC_mask& m, bool gesval); @@ -136,13 +134,21 @@ class TEC_mask : public TSelection_mask long _lastnumec; // Ultimo numero EC 'G' TAssoc_array _lastnumcf; // Ultimo numero stampato 'A' bool _export; + short _cdc_start, + _cdc_end, + _cms_start, + _cms_end, + _fas_start, + _fas_end; + TDecoder _anal; protected: // TMask virtual void on_firm_change(); virtual void start_run(); virtual TESSL_form & form() override; - virtual const TToken_string & get_anal_filter() const override { return EMPTY_STRING; } + int insert_anal_fields(TMask& m, int page, int lf, int& y, short& dlg, short& dlgd); + const TToken_string & get_anal_filter() const; virtual bool some_to_print(const char * tipo, const long codice) override; virtual int print_one(const char * tipo, const long codice) override; bool print_selected(); // print selected items diff --git a/src/sc/sc2300.cpp b/src/sc/sc2300.cpp index 6404a4abe..2f473185f 100755 --- a/src/sc/sc2300.cpp +++ b/src/sc/sc2300.cpp @@ -1,6 +1,9 @@ #include +#include +#include #include "../cg/cgsaldac.h" +#include "../ca/calib01.h" #include "sc2.h" #include "sc2201.h" #include "sc2300.h" @@ -9,6 +12,8 @@ #include #include #include +#include "../ca/movana.h" +#include "../ca/rmovana.h" /////////////////////////////////////////////////////////// // Log @@ -60,6 +65,201 @@ TGameLog::~TGameLog() __trace(_str); } +class TScad_mask : public TSelection_ext_mask +{ + short _cdc_start, + _cdc_end, + _cms_start, + _cms_end, + _fas_start, + _fas_end; + +protected: + const TToken_string & get_anal_filter() const; + int insert_anal_fields(TMask& m, int page, int lf, int& y, short& dlg, short& dlgd); + +public: + TScad_mask(); + virtual ~TScad_mask() = default; +}; + +TScad_mask::TScad_mask() : TSelection_ext_mask("sc2300a") +{ + _cdc_start = 0; + _cdc_end = 0; + _cms_start = 0; + _cms_end = 0; + _fas_start = 0; + _fas_end = 0; + + if (dongle().active(CAAUT) || dongle().active(CMAUT)) + { + create_page("Selezione analitica", 1); + const TMultilevel_code_info& fasinfo = ca_multilevel_code_info(LF_FASI); + const bool use_fsc = fasinfo.levels() > 0; + TConfig& ini = ca_config(); + + int y = 3; + short dlg = SCAD_ANAL0; // id del primo campo da generare + short dlgd = SCAD_DESANAL0; + + for (int i = 0; i < 2; i++) + { + const TString& level = ini.get("Level", NULL, i + 1); // Legge il livello 1 o 2 + if (level == "CDC") // Crea centro di costo + { + _cdc_start = dlg; + _cdc_end = _cdc_start + ca_multilevel_code_info(LF_CDC).levels() - 1; + if (use_fsc && fasinfo.parent() == LF_CDC) + { + _fas_start = _cdc_end + 1; + _fas_end = _fas_start + ca_multilevel_code_info(LF_FASI).levels() - ca_multilevel_code_info(LF_COMMESSE).levels() - 1; + insert_anal_fields(*this, 1, LF_FASI, y, dlg, dlgd); + } + else + insert_anal_fields(*this, 1, LF_CDC, y, dlg, dlgd); + } + else + if (level == "CMS") // Crea commessa + { + _cms_start = dlg; + _cms_end = _cms_start + ca_multilevel_code_info(LF_COMMESSE).levels() - 1; + if (use_fsc && fasinfo.parent() == LF_COMMESSE) + { + _fas_start = _cms_end + 1; + _fas_end = _fas_start + ca_multilevel_code_info(LF_FASI).levels() - ca_multilevel_code_info(LF_COMMESSE).levels() - 1; + insert_anal_fields(*this, 1, LF_FASI, y, dlg, dlgd); + } + else + insert_anal_fields(*this, 1, LF_COMMESSE, y, dlg, dlgd); + } + } + if (use_fsc && fasinfo.parent() <= 0) + { + _fas_start = dlg; + _fas_end = _fas_start + ca_multilevel_code_info(LF_FASI).levels() - 1; + insert_anal_fields(*this, 1, LF_FASI, y, dlg, dlgd); + } + } +} + +const TToken_string & TScad_mask::get_anal_filter() const +{ + TToken_string &f = get_tmp_string(100); + TString s; + TString codfase; + const TMultilevel_code_info & fasi = ca_multilevel_code_info(LF_FASI); + TConfig& cfg = ca_config(); + bool full = false; + bool empty = true; + + if (_cms_start > 0) + { + s.cut(0); + for (short dlg = _cms_start; dlg <= _cms_end; dlg++) + { + const int len = field(dlg).size(); + TString val = get(dlg); + + full |= val.full(); + if (val.full()) + val.rpad(len); + else + val.fill('?', len); + s << val; + } + } + if (full) + { + empty = false; + f.add(s); + } + else + f.add(""); + if (_cdc_start > 0) + { + full = false; + s.cut(0); + for (short dlg = _cdc_start; dlg <= _cdc_end; dlg++) + { + const int len = field(dlg).size(); + TString val = get(dlg); + + full |= val.full(); + if (val.full()) + val.rpad(len); + else + val.fill('?', len); + s << val; + } + } + if (full) + { + empty = false; + f.add(s); + } + else + f.add(""); + if (_fas_start > 0) + { + full = false; + s.cut(0); + for (short dlg = _fas_start; dlg <= _fas_end; dlg++) + { + const int len = field(dlg).size(); + TString val = get(dlg); + + full |= val.full(); + if (val.full()) + val.rpad(len); + else + val.fill('?', len); + s << val; + } + } + if (full) + { + empty = false; + f.add(s); + } + else + f.add(""); + if (empty) + f.cut(0); + return f; +} + +int TScad_mask::insert_anal_fields(TMask& m, int page, int lf, int& y, + short& dlg, short& dlgd) +{ + const int h = ca_create_fields(m, page, lf, 2, y, dlg, dlgd); + + for (int i = 0; i < h; i++) + { + TEdit_field& fld = m.efield(dlg + i); + int logic = lf; + + if (logic == LF_FASI) + { + const TMultilevel_code_info& fasinfo = ca_multilevel_code_info(LF_FASI); + if (fasinfo.parent() != 0) + { + const TMultilevel_code_info& parinfo = ca_multilevel_code_info(fasinfo.parent()); + if (i < parinfo.levels()) + logic = fasinfo.parent(); + } + } + + TEdit_field& dfld = m.efield(dlgd + i); + + dfld.set_field(EMPTY_STRING); // Toglie campi che fan saltare gli output! + + } + y += h + 1; + dlg += h; dlgd += h; + return h; +} + /////////////////////////////////////////////////////////// // Stampa scaduto /////////////////////////////////////////////////////////// @@ -108,6 +308,9 @@ class TStampaScaduto : public TPrintapp real _unsnc,_uns; // Unassigned per partita. TArray _t, // Array per i totali _s_date; // Date per lo scaduto + TDecoder _anal; + TToken_string _anal_filter; + bool _select_analitica; static TString80 _last_game; static bool fil_function(const TRelation *); @@ -233,7 +436,54 @@ void TStampaScaduto::compute_all(TPartita& p, TBill& bill) TGameLog gl(p); real residuo,nonscad,buonf,s1,s2,s3,s4,s5,s6,s7,res_pagati; + TToken_string anal_filter = _anal_filter; + if (_select_analitica) + { + bool print = false; + + for (int r = p.first(); !print && r <= p.last(); r = p.succ(r)) + { + const TRiga_partite& row = p.riga(r); + const TString& numregcg = row.get(PART_NREG); + const long numreg = atol(_anal.decode(numregcg)); + + if (numreg > 0) + { + TAnal_mov anal_mov(numreg); + TRecord_array & rows = anal_mov.body(); + const int nrows = rows.rows(); + TString s; + + for (int i = 1; !print && i <= nrows; i++) + { + const TRectype & row = anal_mov.body().row(i); + TString f = anal_filter.get(0); + f.trim(); + + if (f.full()) + { + s = row.get(RMOVANA_CODCMS); + print |= s.match(f); + } + f = anal_filter.get(); + if (f.full()) + { + s = row.get(RMOVANA_CODCCOSTO); + print |= s.match(f); + } + f = anal_filter.get(); + if (f.full()) + { + s = row.get(RMOVANA_CODFASE); + print |= s.match(f); + } + } + } + } + if (!print) + return; + } compute_unassigned(p); for (int r = p.last(); r > 0; r = p.pred(r)) // Browse all rows (partite) { @@ -592,7 +842,7 @@ bool TStampaScaduto::user_create() _s_date.add(new TDate); const bool valuta = ini_get_bool(CONFIG_DITTA, "cg", "GesVal"); - _m = new TSelection_ext_mask("sc2300a"); + _m = new TScad_mask; _m->enable(F_VALUTA, valuta); enable_print_menu(); @@ -621,6 +871,9 @@ bool TStampaScaduto::set_print(int) if (rt) { + _anal_filter = _m->get_anal_filter(); + _select_analitica = (dongle().active(CAAUT) || dongle().active(CMAUT)) && _anal_filter.full(); + _m->update_assoc(); reset_files(); reset_print(); @@ -902,7 +1155,7 @@ void TStampaScaduto::set_page(int file, int counter) print_header(); } -TStampaScaduto::TStampaScaduto() : _note("", 200) +TStampaScaduto::TStampaScaduto() : _note("", 200), _anal(LF_MOVANA, MOVANA_NUMREG, 3) { _rel1=_rel2=NULL; } diff --git a/src/sc/sc2300.h b/src/sc/sc2300.h index 73fec877a..588ffba5f 100755 --- a/src/sc/sc2300.h +++ b/src/sc/sc2300.h @@ -9,3 +9,6 @@ #define F_VALUTA 107 #define F_NOTE 108 +#define SCAD_ANAL0 150 +#define SCAD_DESANAL0 175 + diff --git a/src/sc/sc2300a.uml b/src/sc/sc2300a.uml index 6028e2b97..7c7429396 100755 --- a/src/sc/sc2300a.uml +++ b/src/sc/sc2300a.uml @@ -185,4 +185,5 @@ BEGIN END ENDPAGE + ENDMASK diff --git a/src/sc/sc2401.cpp b/src/sc/sc2401.cpp index cca1442ba..14bf490e1 100755 --- a/src/sc/sc2401.cpp +++ b/src/sc/sc2401.cpp @@ -58,7 +58,7 @@ bool TESSL_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) // Attiva la stampa del saldo partita form().stampa_saldo(stampa_saldo()); - form().anal_filter(get_anal_filter()); + form().anal_filter(get_anal_filter()); // filtra il cursore del form in modo che diventi uguale al cursor_sheet corrente // Qui sarebbe bello copiarsi l'indice dell'altro cursore diff --git a/src/sc/sc2402.cpp b/src/sc/sc2402.cpp index 4903c4c8d..32721d9a9 100755 --- a/src/sc/sc2402.cpp +++ b/src/sc/sc2402.cpp @@ -15,7 +15,7 @@ #include #include -TSol_mask::TSol_mask(const char *name) : _sol_mail("sc2400b"), TESSL_mask(name), _form(nullptr) +TSol_mask::TSol_mask(const char *name) : _sol_mail("sc2400b"), TESSL_mask(name), _form(nullptr), _anal(LF_MOVANA, MOVANA_NUMREG, 3) { _cdc_start = 0; _cdc_end = 0; @@ -230,7 +230,7 @@ bool TSol_mask::some_to_print(const char * tipo, const long codice) int TSol_mask::print_one(const char * tipo, const long codice) { - TSol_form & f = (TSol_form&)form(); + TSol_form& f = (TSol_form&)form(); // preparazione variabili per controllo lingua ; @@ -274,7 +274,6 @@ int TSol_mask::print_one(const char * tipo, const long codice) const TDate data_limite_scaduto = f.data_limite_scaduto(); TToken_string anal_filter = form().get_anal_filter(); const bool select_analitica = (dongle().active(CAAUT) || dongle().active(CMAUT)) && anal_filter.full(); - TDecoder anal(LF_MOVANA, MOVANA_NUMREG, 3); const TDate data_rischio = f.data_inizio_rischio(); TAssoc_array games_in_range; @@ -311,11 +310,12 @@ int TSol_mask::print_one(const char * tipo, const long codice) if (select_analitica) { bool print = false; + for (int r = game.first(); !print && r <= game.last(); r = game.succ(r)) { const TRiga_partite& row = game.riga(r); const TString& numregcg = row.get(PART_NREG); - const long numreg = atol(anal.decode(numregcg)); + const long numreg = atol(_anal.decode(numregcg)); if (numreg > 0) { @@ -372,7 +372,7 @@ int TSol_mask::print_one(const char * tipo, const long codice) } } *cur = savepos; - cur->setkey(savekey); + cur->setkey(savekey); return one_printed ? 1 : 0; } diff --git a/src/sc/sc2402.h b/src/sc/sc2402.h index 1e5dc4681..54bc61ff5 100755 --- a/src/sc/sc2402.h +++ b/src/sc/sc2402.h @@ -62,6 +62,7 @@ class TSol_mask : public TESSL_mask _fas_start, _fas_end; TSol_form * _form; + TDecoder _anal; protected: int insert_anal_fields(TMask& m, int page, int lf, int& y, short& dlg, short& dlgd);