From d399fa5e3f3b4e7445ec0dbac6a64552cd9e8a5b Mon Sep 17 00:00:00 2001 From: Alessandro Bonazzi Date: Sun, 19 Jul 2026 10:07:49 +0200 Subject: [PATCH] Patch level : 12.00 1414 Files correlati : sc2.exe sc2300.msk Commento : Sampa codici analitica sulla stampa scaduto --- src/sc/sc2300.cpp | 245 +++++++++++++++++++++++++++++++++++++++------ src/sc/sc2300.h | 1 + src/sc/sc2300a.uml | 6 ++ 3 files changed, 223 insertions(+), 29 deletions(-) diff --git a/src/sc/sc2300.cpp b/src/sc/sc2300.cpp index 2f473185f..521820191 100755 --- a/src/sc/sc2300.cpp +++ b/src/sc/sc2300.cpp @@ -75,10 +75,16 @@ class TScad_mask : public TSelection_ext_mask _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: + short cdc_start() const { return _cdc_start; } + short cdc_end() const { return _cdc_end; } + short cms_start() const { return _cms_start; } + short cms_end() const { return _cms_end; } + short fas_start() const { return _fas_start; } + short fas_end() const { return _fas_end; } + const TToken_string & get_anal_filter() const; TScad_mask(); virtual ~TScad_mask() = default; }; @@ -253,7 +259,6 @@ int TScad_mask::insert_anal_fields(TMask& m, int page, int lf, int& y, 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; @@ -288,10 +293,10 @@ struct _LineTotal : public TObject //Oggetto di base per i TAssoc_array dei tot class TStampaScaduto : public TPrintapp { TRelation *_rel1, *_rel2; // Relazioni di lavoro... - int _cur1, _cur2, // Identificatori dei cursori di lavoro... - _cur3, _cur4; - - TSelection_ext_mask *_m; + int _cur1, _cur2, // Identificatori dei cursori di lavoro... + _cur3, _cur4; + + TScad_mask *_m; tipo_st _tipost; // Tipo di stampa impostato bool _end_printed, @@ -311,7 +316,9 @@ class TStampaScaduto : public TPrintapp TDecoder _anal; TToken_string _anal_filter; bool _select_analitica; - + bool _st_analitica; + + static TString80 _last_game; static bool fil_function(const TRelation *); @@ -776,16 +783,103 @@ bool TStampaScaduto::preprocess_page(int file, int counter) (_tipost == clienti && !_buonfin.empty()); if (to_print) { - if (curr.get_int(PART_NRIGA) == 1) - { - if (_pending_clifo) - { - set_page_clifoco(nriga); // Setta le righe per stampare le informazioni del cli/fo/conto - set_row(++nriga,""); - nriga++; - _pending_clifo = false; - } - set_page_part(nriga); + if (curr.get_int(PART_NRIGA) == 1) + { + if (_pending_clifo) + { + set_page_clifoco(nriga); // Setta le righe per stampare le informazioni del cli/fo/conto + set_row(++nriga, ""); + nriga++; + _pending_clifo = false; + } + set_page_part(nriga); + } + if (_st_analitica && r > 0) //Skip next partita if no fatture! + { + TRiga_partite& rp = p.riga(r); + const TString& numregcg = rp.get(PART_NREG); + const long numreg = atol(_anal.decode(numregcg)); + + if (numreg > 0) + { + TAnal_mov anal_mov(numreg); + TRecord_array & rows = anal_mov.body(); + TAssoc_array cods; + int nrows = rows.rows(); + + for (int r = 1; r <= nrows; r++) + { + const TRectype & row = rows[r]; + TToken_string cod(row.get(RMOVANA_CODCMS)); + int pos = 12; + + cod.add(row.get(RMOVANA_CODCCOSTO)); + cod.add(row.get(RMOVANA_CODFASE)); + if (!cods.is_key(cod)) + { + cods.add(cod); + ++nriga; + if (_m->cms_start() > 0) + { + for (short dlg = _m->cms_start(); dlg <= _m->cms_end(); dlg++) + { + TString format; + int len = _m->field(dlg).size(); + TFieldref fld(*_m->field(dlg).field()); + + fld.set_name(RMOVANA_CODCMS); + + const TString val = fld.read(row); + + format << "@" << pos << "g%s"; + set_row(nriga, format, (const char *)val); + if (len < (int)strlen(_m->field(dlg).prompt())) + len = strlen(_m->field(dlg).prompt()); + pos += len + 1; + } + } + if (_m->cdc_start() > 0) + { + for (short dlg = _m->cdc_start(); dlg <= _m->cdc_end(); dlg++) + { + TString format; + int len = _m->field(dlg).size(); + TFieldref fld(*_m->field(dlg).field()); + + fld.set_name(RMOVANA_CODCCOSTO); + + const TString val = fld.read(row); + + + format << "@" << pos << "g%s"; + set_row(nriga, format, (const char *)val); + if (len < (int)strlen(_m->field(dlg).prompt())) + len = strlen(_m->field(dlg).prompt()); + pos += len + 1; + } + } + if (_m->fas_start() > 0) + { + for (short dlg = _m->fas_start(); dlg <= _m->fas_end(); dlg++) + { + TString format; + int len = _m->field(dlg).size(); + TFieldref fld(*_m->field(dlg).field()); + + fld.set_name(RMOVANA_CODFASE); + + const TString val = fld.read(row); + + format << "@" << pos << "g%s"; + set_row(nriga, format, (const char *)val); + if (len < (int)strlen(_m->field(dlg).prompt())) + len = strlen(_m->field(dlg).prompt()); + pos += len + 1; + } + } + } + } + } } } } @@ -816,7 +910,7 @@ print_action TStampaScaduto::postprocess_page(int file, int counter) void TStampaScaduto::on_firm_change() { - if (_m != NULL) + if (_m != nullptr) { const bool valuta = ini_get_bool(CONFIG_DITTA, "cg", "GesVal"); _m->enable(F_VALUTA, valuta); @@ -851,9 +945,9 @@ bool TStampaScaduto::user_create() bool TStampaScaduto::user_destroy() { - if (_rel1) delete _rel1; - if (_rel2) delete _rel2; - if (_m) delete _m; + safe_delete(_rel1); + safe_delete(_rel2); + safe_delete(_m); _t.destroy(); _s_date.destroy(); return true; @@ -872,8 +966,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(); - + _st_analitica = (dongle().active(CAAUT) || dongle().active(CMAUT)); + _select_analitica = _st_analitica && _anal_filter.full(); + _st_analitica &= _m->get_bool(F_ANALITICA); _m->update_assoc(); reset_files(); reset_print(); @@ -1081,7 +1176,6 @@ void TStampaScaduto::print_header() o = 4; } set_header (soh++,FR("@73gAl %s Operazioni al %s"),(const char*)limscad, (const char*)limop); - rw.fill('-'); set_header(soh++, (const char *) rw); set_header(soh++,FR("CODICE@18gC O G N O M E E N O M E ")); set_header(soh++,FR("Riferim.@12gNumero@20gNumero@27gData@50gResiduo@102g" @@ -1091,14 +1185,59 @@ void TStampaScaduto::print_header() "@50gDocumento@67gNon Scaduto@86g%s@112g%s@129g%s@148g%s@167g%s@185g%s@204g%s@223g%s"), (const char*)s1,scaglioni[0],scaglioni[1+o],scaglioni[2+o], scaglioni[3+o],scaglioni[4+o],(const char*) s2, (const char*) s3); - set_header(soh++,(const char *)rw); + if (_st_analitica) + { + int pos = 12; + + rw.zap(); + if (_m->cms_start() > 0) + { + + for (short dlg = _m->cms_start(); dlg <= _m->cms_end(); dlg++) + { + rw << "@" << pos << "g" << _m->field(dlg).prompt(); + int len = _m->field(dlg).size(); + + if (len < (int) strlen(_m->field(dlg).prompt())) + len = strlen(_m->field(dlg).prompt()); + pos += len + 1; + } + } + if (_m->cdc_start() > 0) + { + for (short dlg = _m->cdc_start(); dlg <= _m->cdc_end(); dlg++) + { + rw << "@" << pos << "g" << _m->field(dlg).prompt(); + int len = _m->field(dlg).size(); + + if (len < (int) strlen(_m->field(dlg).prompt())) + len = strlen(_m->field(dlg).prompt()); + pos += len + 1; + } + } + if (_m->fas_start() > 0) + { + for (short dlg = _m->fas_start(); dlg <= _m->fas_end(); dlg++) + { + rw << "@" << pos << "g" << _m->field(dlg).prompt(); + int len = _m->field(dlg).size(); + + if (len < (int) strlen(_m->field(dlg).prompt())) + len = strlen(_m->field(dlg).prompt()); + pos += len + 1; + } + } + set_header(soh++, rw); + } + rw.zap(); + rw.fill('-'); + set_header(soh++,(const char *)rw); break; } case altri: // Piano dei conti { set_header(soh++,FR("@79g** SCADUTO **")); set_header (soh++,FR("@73gAl %s Operazioni al %s"),(const char*)limscad, (const char*)limop); - rw.fill('-'); set_header(soh++, (const char *) rw); set_header(soh++,FR("CONTO@18gD E S C R I Z I O N E")); set_header(soh++,FR("Riferim.@12gNumero@20gNumero@27gData@50gResiduo@102g" @@ -1107,8 +1246,56 @@ void TStampaScaduto::print_header() "@50gDocumento@67gNon Scaduto@112g%s@129g%s@148g%s@167g%s@185g%s"), scaglioni[0],scaglioni[5],scaglioni[6], scaglioni[7],scaglioni[8]); - set_header(soh++,(const char *)rw); - break; + if (_st_analitica) + { + int pos = 12; + + rw.zap(); + if (_m->cms_start() > 0) + { + + for (short dlg = _m->cms_start(); dlg <= _m->cms_end(); dlg++) + { + rw << "@" << pos << "g" << _m->field(dlg).prompt(); + int len = _m->field(dlg).size(); + + if (len < (int) strlen(_m->field(dlg).prompt())) + len = strlen(_m->field(dlg).prompt()); + pos += len + 1; + } + } + if (_m->cdc_start() > 0) + { + for (short dlg = _m->cdc_start(); dlg <= _m->cdc_end(); dlg++) + { + rw << "@" << pos << "g" << _m->field(dlg).prompt(); + int len = _m->field(dlg).size(); + + if (len < (int) strlen(_m->field(dlg).prompt())) + len = strlen(_m->field(dlg).prompt()); + pos += len + 1; + } + } + if (_m->fas_start() > 0) + { + for (short dlg = _m->fas_start(); dlg <= _m->fas_end(); dlg++) + { + rw << "@" << pos << "g" << _m->field(dlg).prompt(); + int len = _m->field(dlg).size(); + + if (len < (int) strlen(_m->field(dlg).prompt())) + len = strlen(_m->field(dlg).prompt()); + pos += len + 1; + } + } + set_header(soh++, FR("@12gDocum.@20gProt.@27gDocumento@38gValuta" + "@50gDocumento@67gNon Scaduto") + ); + } + rw.zap(); + rw.fill('-'); + set_header(soh++, (const char *)rw); + break; } default: break; @@ -1157,7 +1344,7 @@ void TStampaScaduto::set_page(int file, int counter) TStampaScaduto::TStampaScaduto() : _note("", 200), _anal(LF_MOVANA, MOVANA_NUMREG, 3) { - _rel1=_rel2=NULL; + _rel1=_rel2=nullptr; } int sc2300(int argc, char** argv) diff --git a/src/sc/sc2300.h b/src/sc/sc2300.h index 588ffba5f..4fce7b70b 100755 --- a/src/sc/sc2300.h +++ b/src/sc/sc2300.h @@ -8,6 +8,7 @@ #define F_GIORNI 106 #define F_VALUTA 107 #define F_NOTE 108 +#define F_ANALITICA 109 #define SCAD_ANAL0 150 #define SCAD_DESANAL0 175 diff --git a/src/sc/sc2300a.uml b/src/sc/sc2300a.uml index 7c7429396..94a480550 100755 --- a/src/sc/sc2300a.uml +++ b/src/sc/sc2300a.uml @@ -72,6 +72,12 @@ BEGIN HELP "Selezionare se si vuole la stampa delle note delle scadenze" END +BOOLEAN F_ANALITICA +BEGIN + PROMPT 23 8 "Stampa analitica" + HELP "Selezionare se si vuole dei codici di analitica" +END + RADIOBUTTON SC_CLIFO 20 BEGIN PROMPT 1 10 "Selezione"