Patch level : 12.00 1384

Files correlati     : sc2.exe sc2300a.msk

Bug                 :

Commento:
Selezione analitica sulla stampa scaduto e stampa estratti conti
This commit is contained in:
Alessandro Bonazzi 2025-03-18 00:54:59 +01:00
parent 7f74c3f3c5
commit b805a88a8e
8 changed files with 506 additions and 15 deletions

View File

@ -1,12 +1,17 @@
#include <dongle.h>
#include <modaut.h>
#include <printer.h>
#include <progind.h>
#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;
}

View File

@ -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

View File

@ -1,6 +1,9 @@
#include <printapp.h>
#include <dongle.h>
#include <modaut.h>
#include "../cg/cgsaldac.h"
#include "../ca/calib01.h"
#include "sc2.h"
#include "sc2201.h"
#include "sc2300.h"
@ -9,6 +12,8 @@
#include <nditte.h>
#include <partite.h>
#include <pconti.h>
#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;
}

View File

@ -9,3 +9,6 @@
#define F_VALUTA 107
#define F_NOTE 108
#define SCAD_ANAL0 150
#define SCAD_DESANAL0 175

View File

@ -185,4 +185,5 @@ BEGIN
END
ENDPAGE
ENDMASK

View File

@ -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

View File

@ -15,7 +15,7 @@
#include <modaut.h>
#include <printer.h>
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;
}

View File

@ -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);