From edb0d968edc95b1aa4db1365cf0244c233d31c97 Mon Sep 17 00:00:00 2001 From: cris Date: Wed, 4 Feb 1998 13:46:27 +0000 Subject: [PATCH] Aggiornamento versione al 4 febrraio 1998 git-svn-id: svn://10.65.10.50/trunk@6104 c028cbd2-c16b-5b4b-a496-9718f37d4682 --- at/at0100a.h | 51 +-- at/at0100a.uml | 48 ++- at/at0100c.uml | 2 +- at/at0200.cpp | 30 +- at/at0300.cpp | 9 +- at/at0400.cpp | 154 ++++++- at/at0400a.h | 8 +- at/at0400a.uml | 132 +++++- at/at0500.cpp | 23 +- at/at0500a.h | 1 + at/at0500a.uml | 31 +- at/at0700.cpp | 50 ++- at/at0900.cpp | 2 +- at/at1100.cpp | 1 + at/at1200.cpp | 310 +++++++++----- at/at1200a.h | 32 +- at/at1200a.uml | 129 ++---- at/at1500.cpp | 1 + at/at2.cpp | 4 +- at/at2.h | 1 + at/at2.url | 5 + at/at2100.cpp | 1 + at/at2200.cpp | 109 +++-- at/at2300.cpp | 1 + at/at2400.cpp | 1 + at/at2500.cpp | 1 + at/at2600.cpp | 1 + at/at2700.cpp | 2 + at/at2800.cpp | 1 + at/at2900.cpp | 414 ++++++++++++++++++ at/at2900a.h | 31 ++ at/at2900a.uml | 289 +++++++++++++ at/at3.cpp | 18 +- at/at3.h | 6 + at/at3.url | 50 +-- at/at3100.cpp | 567 ++++++++++++++++++++++--- at/at3100a.h | 19 + at/at3100a.uml | 198 ++++++++- at/at3200.cpp | 642 ++++++++++++++++++++++++++++ at/at3200a.h | 16 + at/at3200a.uml | 168 ++++++++ at/at3300.cpp | 526 +++++++++++++++++++++++ at/at3300a.h | 14 + at/at3300a.uml | 146 +++++++ at/at3400.cpp | 698 ++++++++++++++++++++++++++++++ at/at3400a.h | 16 + at/at3400a.uml | 153 +++++++ at/at3500.cpp | 876 +++++++++++++++++++++++--------------- at/at3500a.h | 15 + at/at3500a.uml | 153 +++++++ at/at3600.cpp | 1074 +++++++++++++++++++++++++++++++++-------------- at/at3600a.h | 26 +- at/at3600a.uml | 168 ++++++++ at/at3700.cpp | 601 ++++++++++++++++++++++++++ at/at3700a.h | 15 + at/at3700a.uml | 163 +++++++ at/at4.url | 2 +- at/at4100.cpp | 180 +++++++- at/at4100a.h | 5 +- at/at4100a.uml | 14 +- at/at4200.cpp | 1 + at/at4400.cpp | 5 +- at/at4500.cpp | 1 + at/at6.cpp | 6 +- at/at6.h | 2 - at/at6.url | 16 - at/at6300.cpp | 114 +++-- at/at6300a.h | 5 +- at/at6300a.uml | 5 + at/at6400.cpp | 2 + at/at7300.cpp | 146 ++++--- at/at7300a.uml | 3 +- at/at_pagin.frm | 2 +- at/atlib.h | 3 +- at/atlib1.cpp | 332 +++++++++------ at/atopera.h | 10 + at/atropera.h | 5 + at/atstatd.h | 6 +- at/kell.h | 3 + at/skell.h | 6 + 80 files changed, 7679 insertions(+), 1398 deletions(-) create mode 100755 at/at2900.cpp create mode 100755 at/at2900a.h create mode 100755 at/at2900a.uml create mode 100755 at/at3100a.h create mode 100755 at/at3200.cpp create mode 100755 at/at3200a.h create mode 100755 at/at3200a.uml create mode 100755 at/at3300.cpp create mode 100755 at/at3300a.h create mode 100755 at/at3300a.uml create mode 100755 at/at3400.cpp create mode 100755 at/at3400a.h create mode 100755 at/at3400a.uml create mode 100755 at/at3500a.h create mode 100755 at/at3500a.uml create mode 100755 at/at3600a.uml create mode 100755 at/at3700.cpp create mode 100755 at/at3700a.h create mode 100755 at/at3700a.uml create mode 100755 at/atopera.h create mode 100755 at/atropera.h diff --git a/at/at0100a.h b/at/at0100a.h index 92f196917..0d7f65da3 100755 --- a/at/at0100a.h +++ b/at/at0100a.h @@ -15,31 +15,32 @@ #define F_DESC_CATDON 111 #define F_DATAISC 112 #define F_DATADIM 113 -#define F_DOM_INDIR 114 -#define F_DOM_CODCOM 115 -#define F_DOM_DENCOM 116 -#define F_DOM_CAPCOM 117 -#define F_DOM_PROVCOM 118 -#define F_DOM_CODLOC 119 -#define F_DOM_DENLOC 120 -#define F_DOM_STRADA 121 -#define F_DOM_DISTRI 122 -#define F_RES_INDIR 123 -#define F_RES_CODCOM 124 -#define F_RES_DENCOM 125 -#define F_RES_CAPCOM 126 -#define F_RES_PROVCOM 127 -#define F_RES_CODLOC 128 -#define F_RES_DENLOC 129 -#define F_COMNASC 130 -#define F_DENCOMNASC 131 -#define F_PROVCOMNASC 132 -#define F_SESSO 133 -#define F_CF 134 -#define F_DOCID 135 -#define F_TELABI 136 -#define F_TELLAV 137 -#define F_TELALT 138 +#define F_COGNOME_SP 114 +#define F_DOM_INDIR 115 +#define F_DOM_CODCOM 116 +#define F_DOM_DENCOM 117 +#define F_DOM_CAPCOM 118 +#define F_DOM_PROVCOM 119 +#define F_DOM_CODLOC 120 +#define F_DOM_DENLOC 121 +#define F_DOM_STRADA 122 +#define F_DOM_DISTRI 123 +#define F_RES_INDIR 124 +#define F_RES_CODCOM 125 +#define F_RES_DENCOM 126 +#define F_RES_CAPCOM 127 +#define F_RES_PROVCOM 128 +#define F_RES_CODLOC 129 +#define F_RES_DENLOC 130 +#define F_COMNASC 131 +#define F_DENCOMNASC 132 +#define F_PROVCOMNASC 133 +#define F_SESSO 134 +#define F_CF 135 +#define F_DOCID 136 +#define F_TELABI 137 +#define F_TELLAV 138 +#define F_TELALT 139 // pagina 2 #define F_CATNOND1 201 diff --git a/at/at0100a.uml b/at/at0100a.uml index 4fd42fd76..c9e894d13 100755 --- a/at/at0100a.uml +++ b/at/at0100a.uml @@ -132,7 +132,7 @@ BEGIN WARNING "Codice sezione assente" END -STRING F_DENSEZ 24 +STRING F_DENSEZ 30 24 BEGIN PROMPT 12 6 "" MESSAGE COPY,14@ @@ -162,7 +162,7 @@ BEGIN WARNING "Codice sottogruppo assente" END -STRING F_DENSOT 24 +STRING F_DENSOT 30 24 BEGIN PROMPT 50 6 "" MESSAGE COPY,16@ @@ -220,30 +220,36 @@ BEGIN PROMPT 1 9 "Dati anagrafici" END +STRING F_COGNOME_SP 25 +BEGIN + PROMPT 2 10 "Cognome da sposata " + FIELD COGNOME_SP +END + TEXT DLG_NULL BEGIN - PROMPT 2 10 "Domicilio: " + PROMPT 2 11 "Domicilio: " END STRING F_DOM_INDIR 30 BEGIN - PROMPT 13 10 "Indirizzo " + PROMPT 13 11 "Indirizzo " FIELD DOM_INDIR END STRING F_DOM_STRADA 5 BEGIN - PROMPT 55 10 "St. " + PROMPT 55 11 "St. " END STRING F_DOM_DISTRI 4 BEGIN - PROMPT 66 10 "Dist. " + PROMPT 66 11 "Dist. " END STRING F_DOM_CODCOM 4 BEGIN - PROMPT 13 11 "Comune " + PROMPT 13 12 "Comune " FIELD DOM_CODCOM FLAGS "U" USE LF_COMUNI @@ -261,7 +267,7 @@ END STRING F_DOM_DENCOM 50 30 BEGIN - PROMPT 30 11 "" + PROMPT 30 12 "" USE LF_COMUNI KEY 2 INPUT DENCOM F_DOM_DENCOM #include @@ -273,7 +279,7 @@ END STRING F_DOM_CODLOC 4 BEGIN - PROMPT 13 12 "Localita' " + PROMPT 13 13 "Localita' " FIELD DOM_CODLOC FLAGS "U" USE LCP SELECT S7=#F_DOM_CODCOM @@ -292,7 +298,7 @@ END STRING F_DOM_DENLOC 30 BEGIN - PROMPT 30 12 "" + PROMPT 30 13 "" USE LCP KEY 2 SELECT S7=#F_DOM_CODCOM INPUT S0 F_DOM_DENLOC DISPLAY "Localita'@30" S0 @@ -306,31 +312,31 @@ END STRING F_DOM_CAPCOM 5 BEGIN - PROMPT 66 11 "CAP " + PROMPT 66 12 "CAP " FIELD DOM_CAP //FLAGS "D" END STRING F_DOM_PROVCOM 5 BEGIN - PROMPT 66 12 "Prov." + PROMPT 66 13 "Prov." FLAGS "D" END TEXT DLG_NULL BEGIN - PROMPT 2 13 "Residenza: " + PROMPT 2 14 "Residenza: " END STRING F_RES_INDIR 30 BEGIN - PROMPT 13 13 "Indirizzo " + PROMPT 13 14 "Indirizzo " FIELD RES_INDIR END STRING F_RES_CODCOM 4 BEGIN - PROMPT 13 14 "Comune " + PROMPT 13 15 "Comune " FIELD RES_CODCOM FLAGS "U" USE LF_COMUNI @@ -348,7 +354,7 @@ END STRING F_RES_DENCOM 50 30 BEGIN - PROMPT 30 14 "" + PROMPT 30 15 "" USE LF_COMUNI KEY 2 INPUT DENCOM F_RES_DENCOM #include @@ -360,7 +366,7 @@ END STRING F_RES_CODLOC 4 BEGIN - PROMPT 13 15 "Localita' " + PROMPT 13 16 "Localita' " FIELD RES_CODLOC FLAGS "U" USE LCP SELECT S7=#F_RES_CODLOC @@ -379,7 +385,7 @@ END STRING F_RES_DENLOC 30 BEGIN - PROMPT 30 15 "" + PROMPT 30 16 "" USE LCP SELECT S7=#F_RES_CODLOC INPUT S0 F_RES_DENLOC DISPLAY "Localita'@30" S0 @@ -393,14 +399,14 @@ END STRING F_RES_CAPCOM 5 BEGIN - PROMPT 66 14 "CAP " + PROMPT 66 15 "CAP " FIELD RES_CAP //FLAGS "D" END STRING F_RES_PROVCOM 5 BEGIN - PROMPT 66 15 "Prov." + PROMPT 66 16 "Prov." FLAGS "D" END @@ -803,7 +809,7 @@ LISTBOX F_KELL 4 BEGIN PROMPT 54 13 "Kell " FIELD KELL - FLAGS "U" + //FLAGS "U" #include "skell.h" END diff --git a/at/at0100c.uml b/at/at0100c.uml index 7810dc582..a36ee8e3d 100755 --- a/at/at0100c.uml +++ b/at/at0100c.uml @@ -125,7 +125,7 @@ BEGIN FLAGS "RG" USE LF_SOGGETTI KEY 1 INPUT CODICE F_F_CODICE - DISPLAY "Codice@6" CODICE + DISPLAY "Codice@8" CODICE DISPLAY "Cognome@25" COGNOME DISPLAY "Nome@25" NOME DISPLAY "Nato il@10" DATANASC diff --git a/at/at0200.cpp b/at/at0200.cpp index 5d21f8ad8..27660723a 100755 --- a/at/at0200.cpp +++ b/at/at0200.cpp @@ -21,6 +21,7 @@ #include "soggetti.h" #include "donaz.h" #include "contsan.h" +#include "idoneita.h" #include "rconvoc.h" #include "atlib.h" @@ -38,6 +39,7 @@ class TGiornalieroDC : public TApplication TLocalisamfile* _rconvoc; TRecord_array* _sdonazioni; TRecord_array* _scontrolli; + TRecord_array* _sidoneita; // array dei soggetti inseriti per controllare doppio inserimento TAssoc_array* _asoggetti; bool _modified, _ricerca; @@ -107,6 +109,7 @@ bool TGiornalieroDC::create() _rconvoc = new TLocalisamfile(LF_RCONVOC); _sdonazioni = new TRecord_array(LF_DONAZ,DON_PROGDON); _scontrolli = new TRecord_array(LF_CONTSAN,CON_PROGCON); + _sidoneita = new TRecord_array(LF_IDONEITA,IDO_PROGIDO); _asoggetti = new TAssoc_array(); _msk->set_handler(F_INS_CONTROLLI,ins_controlli_handler); TSheet_field& ss = (TSheet_field&)_msk->field(F_SOGGETTI); @@ -139,6 +142,7 @@ bool TGiornalieroDC::destroy() delete _rconvoc; delete _sdonazioni; delete _scontrolli; + delete _sidoneita; delete _asoggetti; return TApplication::destroy(); } @@ -369,7 +373,10 @@ int TGiornalieroDC::write(TSheet_field& s) if (!exist) { _scontrolli->write(TRUE); - con_reord(sog.curr(),_scontrolli); + TRectype* keyc = new TRectype(LF_IDONEITA); + keyc->put(IDO_CODICE, row.get(0)); + int err = _sidoneita->read(keyc); + con_reord(sog.curr(),_scontrolli,_sidoneita); } } _progins++; @@ -650,6 +657,7 @@ bool TGiornalieroDC::soggetti_notify(TSheet_field& s, int r, KEY k) if (!row.empty_items()) app()._modified = TRUE; const long codsog = row.get_long(0); + const long etichetta = row.get_long(5); if (codsog != 0) for (int i=s.items()-1; i>=0; i--) { @@ -658,6 +666,26 @@ bool TGiornalieroDC::soggetti_notify(TSheet_field& s, int r, KEY k) TToken_string& row = s.row(i); if (codsog == row.get_long(0)) return s.sheet_mask().field(F_S_CODICE).error_box("Soggetto gia' inserito"); + else + if (etichetta != 0) + { + if (etichetta == row.get_long(5)) + return s.sheet_mask().field(F_S_ETICHETTA).error_box("Etichetta sacca gia' inserita"); + else + { + TLocalisamfile donaz(LF_DONAZ); + donaz.setkey(5); + donaz.zero(); + donaz.put(DON_ETICHETTA, etichetta); + for(donaz.read(); !donaz.eof(); donaz.next()) + { + const long etic = donaz.get_long(DON_ETICHETTA); + const TDate datadon = donaz.get_date(DON_DATADON); + if (etichetta!=etic) break; + if ((etichetta==etic) && (app()._datadon.year()==datadon.year())) return s.sheet_mask().field(F_S_ETICHETTA).error_box("Etichetta sacca gia' inserita"); + } + } + } } } else diff --git a/at/at0300.cpp b/at/at0300.cpp index 6db000dc1..f22757c9a 100755 --- a/at/at0300.cpp +++ b/at/at0300.cpp @@ -21,6 +21,7 @@ #include "soggetti.h" #include "donaz.h" #include "contsan.h" +#include "idoneita.h" #include "atlib.h" @@ -36,6 +37,7 @@ class TGiornalieroC : public TApplication TLocalisamfile* _contsan; TRecord_array* _sdonazioni; TRecord_array* _scontrolli; + TRecord_array* _sidoneita; TAssoc_array* _asoggetti; // array dei soggetti inseriti per controllare doppio ins. bool _modified; @@ -82,6 +84,7 @@ bool TGiornalieroC::create() _contsan = new TLocalisamfile(LF_CONTSAN); _sdonazioni = new TRecord_array(LF_DONAZ,DON_PROGDON); _scontrolli = new TRecord_array(LF_CONTSAN,CON_PROGCON); + _sidoneita = new TRecord_array(LF_IDONEITA,IDO_PROGIDO); _asoggetti = new TAssoc_array(); TSheet_field& ss = (TSheet_field&)_msk->field(F_SOGGETTI); @@ -105,6 +108,7 @@ bool TGiornalieroC::destroy() delete _contsan; delete _sdonazioni; delete _scontrolli; + delete _sidoneita; delete _asoggetti; return TApplication::destroy(); } @@ -261,7 +265,10 @@ int TGiornalieroC::write(TSheet_field& s) } if (!exist) _scontrolli->write(TRUE); - con_reord(sog.curr(), _scontrolli); + TRectype* keyi = new TRectype(LF_IDONEITA); + keyi->put(IDO_CODICE, row.get(0)); + err = _sidoneita->read(keyi); + con_reord(sog.curr(),_scontrolli,_sidoneita); const TDate oggi(TODAY); sog.put(SOG_DATAULTAGG,oggi); sog.put(SOG_UTENULTAGG,user()); diff --git a/at/at0400.cpp b/at/at0400.cpp index 775464ebe..608b2ed02 100755 --- a/at/at0400.cpp +++ b/at/at0400.cpp @@ -59,7 +59,13 @@ protected: virtual bool changing_mask(int mode) { return FALSE; } virtual TMask* get_mask( int mode = 0) { return _msk; } virtual TRelation* get_relation() const { return _rel; } - + virtual void init_query_insert_mode(TMask& m); + virtual void init_query_mode(TMask& m) { init_query_insert_mode(m);}; + virtual void init_modify_mode(TMask& m); + virtual void init_insert_mode(TMask& m) { init_modify_mode(m); } + + static bool nome_handler(TMask_field& f, KEY k); + static bool codice_handler(TMask_field& f, KEY k); static bool convocati_notify(TSheet_field& s, int r, KEY k); static bool esegui_handler(TMask_field& f, KEY k); static bool data_handler(TMask_field&f, KEY k); @@ -74,6 +80,19 @@ public: HIDDEN inline TGestioneConvocazioni& app() { return (TGestioneConvocazioni&) main_app(); } +void TGestioneConvocazioni::init_query_insert_mode(TMask& m) +{ + disable_menu_item(M_FILE_NEW); + m.hide(-1); + m.show(-2); +} + +void TGestioneConvocazioni::init_modify_mode(TMask& m) +{ + m.show(-1); + m.hide(-2); +} + bool TGestioneConvocazioni::filter_func_convoc(const TRelation* rel) { bool filtrato = FALSE; @@ -390,7 +409,51 @@ bool TGestioneConvocazioni::esegui_handler(TMask_field& f, KEY k) } return TRUE; } + +bool TGestioneConvocazioni::nome_handler(TMask_field& f, KEY k) +{ + bool ok = TRUE; + if (f.to_check(k)) + { + TMask& m = f.mask(); + long codsog = m.get_long(F_S_CODICE); + if (codsog == 0) + f.on_key(K_F9); + } + return ok; +} +bool TGestioneConvocazioni::codice_handler(TMask_field& f, KEY k) +{ + bool ok = TRUE; + if (f.to_check(k)) + { + TMask& m = f.mask(); + long codsog = m.get_long(F_S_CODICE); + if (codsog != 0) + { + TLocalisamfile sog(LF_SOGGETTI); ; + sog.setkey(1); + sog.zero(); + sog.put(SOG_CODICE, codsog); + int err = sog.read(); + if (err == NOERR) + { + m.set(F_S_COGNOME, sog.get(SOG_COGNOME)); + m.set(F_S_NOME, sog.get(SOG_NOME)); + m.set(F_S_DATANASC, sog.get(SOG_DATANASC)); + m.set(F_S_TESSAVIS, sog.get(SOG_TESSAVIS)); + m.set(F_S_CODSEZ, sog.get(SOG_CODSEZ)); + m.set(F_S_CODSOT, sog.get(SOG_CODSOT)); + m.set(F_S_CATDON, sog.get(SOG_CATDON)); + } + else + ok = FALSE; // codice non esistente + } + } + return ok; +} + bool TGestioneConvocazioni::user_create() { _msk = new TMask("at0400a"); @@ -411,6 +474,9 @@ bool TGestioneConvocazioni::user_create() _msk->set_handler(F_CODSOT,sezione_handler); TSheet_field& sc = (TSheet_field&)_msk->field(F_CONVOCATI); sc.set_notify(convocati_notify); + sc.sheet_mask().set_handler(F_S_NOME,nome_handler); + sc.sheet_mask().set_handler(F_S_CODICE,codice_handler); + _rel->lfile().last(); _lastcod = _rel->lfile().get_long(COV_NUMERO); enable_menu_item(M_FILE_PRINT); @@ -441,6 +507,40 @@ bool TGestioneConvocazioni::remove() // cancella testata convocazione bool ok = TRUE; // cancella convocati + // prima cancella dall'archivio soggetti la data ultima convocazione + TLocalisamfile soggetti(LF_SOGGETTI); + TLocalisamfile rconvoc(LF_RCONVOC); + rconvoc.setkey(3); + for (int r=1; r<=_sconvocati->rows(); r++) + { + const TRectype& riga = _sconvocati->row(r); + const long codice = riga.get_long(RCV_CODICE); + const TDate dataconv = riga.get_date(RCV_DATACONV); + soggetti.put(SOG_CODICE,codice); + if (soggetti.read() == NOERR) + { + int numconv = soggetti.get_int(SOG_NUMCONV); + if (numconv > 0) + { + numconv--; + soggetti.put(SOG_NUMCONV,numconv); + TDate dataprec(NULLDATE); + rconvoc.put(RCV_CODICE,codice); + rconvoc.put(RCV_DATACONV,dataconv); + if (rconvoc.read() == NOERR) + { + --rconvoc; + const long codprec = rconvoc.get_long(RCV_CODICE); + if (codprec == codice) + soggetti.put(SOG_DATACONV, rconvoc.get(RCV_DATACONV)); + } + soggetti.put(SOG_DATACONV,dataprec); + } + else + soggetti.put(SOG_DATACONV, NULLDATE); + soggetti.rewrite(); + } + } int err = _sconvocati->remove(); if (err == _iseof || err == _isemptyfile) err = NOERR; @@ -539,20 +639,20 @@ int TGestioneConvocazioni::scrivi(const TMask& m, bool ri) rec.put(RCV_CHIAMATA,chiamata); rec.put(RCV_STAMPATO,row.get(5)); rec.put(RCV_ANNULLATO,row.get(6)); - if (!ri) + //if (!ri) + //{ + // aggiornamento archivio soggetti + soggetti.put(SOG_CODICE,codice); + if (soggetti.read() == NOERR) { - // aggiornamento archivio soggetti - soggetti.put(SOG_CODICE,codice); - if (soggetti.read() == NOERR) - { - if (chiamata == 'S') - soggetti.put(SOG_DATAULTSOL,dataconv); - soggetti.put(SOG_DATACONV,dataconv); - int numconv = soggetti.get_int(SOG_NUMCONV); - soggetti.put(SOG_NUMCONV,numconv+1); - soggetti.rewrite(); - } - } + if (chiamata == 'S') + soggetti.put(SOG_DATAULTSOL,dataconv); + soggetti.put(SOG_DATACONV,dataconv); + int numconv = soggetti.get_int(SOG_NUMCONV); + soggetti.put(SOG_NUMCONV,numconv+1); + soggetti.rewrite(); + } + //} } err = ri ? _sconvocati->rewrite() : _sconvocati->write(); } @@ -570,6 +670,30 @@ bool TGestioneConvocazioni::convocati_notify(TSheet_field& s, int r, KEY k) s.mask().set(F_NUMCONV,numconv-1); } break; + case K_CTRL+K_TAB: + // uscita riga + { + TToken_string& row = s.row(r); + const long codsog = row.get_long(0); + if (codsog != 0) + for (int i=s.items()-1; i>=0; i--) + { + if (i != r) + { + TToken_string& row = s.row(i); + if (codsog == row.get_long(0)) + return s.sheet_mask().field(F_S_CODICE).error_box("Soggetto gia' inserito"); + } + } + else + { + const char* cognome = row.get(1); + if ((cognome != NULL) && (cognome != "\0")) + s.sheet_mask().field(F_S_NOME).set_focusdirty(); + //s.set_focus_cell(r,2); + } + } + break; case K_CTRL+K_INS: { int numconv = s.mask().get_int(F_NUMCONV); @@ -577,7 +701,7 @@ bool TGestioneConvocazioni::convocati_notify(TSheet_field& s, int r, KEY k) } break; case K_INS: - result = FALSE; + //result = FALSE; break; } return result; diff --git a/at/at0400a.h b/at/at0400a.h index a550cbcb0..11a1e371e 100755 --- a/at/at0400a.h +++ b/at/at0400a.h @@ -21,6 +21,8 @@ #define F_NUMSOLL 118 #define F_NUMRIT 119 #define F_CONVOCATI 120 +#define F_CODSEZH 151 +#define F_CODSOTH 152 #define F_ESEGUI 140 @@ -35,5 +37,9 @@ #define F_S_DATANASC 108 #define F_S_CATDON 109 #define F_S_TESSAVIS 110 +#define F_S_CODSEZ 111 +#define F_S_CODSOT 112 -#define F_S_DESC_CATDON 151 +#define F_S_DENSEZ 151 +#define F_S_DENSOT 152 +#define F_S_DESC_CATDON 153 diff --git a/at/at0400a.uml b/at/at0400a.uml index bb65e4e4a..6e609f7b6 100755 --- a/at/at0400a.uml +++ b/at/at0400a.uml @@ -168,6 +168,30 @@ BEGIN CHECKTYPE SEARCH HELP "Codice sezione da convocare" ADD MASK batbsez + MESSAGE COPY,F_CODSEZH + GROUP 1 +END + +STRING F_CODSEZH 2 +BEGIN + PROMPT 2 5 "Sezione " + FIELD CODSEZ + FLAGS "U" + USE LF_CONVOC KEY 3 + INPUT CODSEZ F_CODSEZ + INPUT CODSOT F_CODSOT + DISPLAY "Cod.sez" CODSEZ + DISPLAY "Cod.sot." CODSOT + DISPLAY "Data@10" DATA + DISPLAY "Punto" PUNTO + OUTPUT F_NUMERO NUMERO + OUTPUT F_CODSEZ CODSEZ + OUTPUT F_CODSOT CODSOT + OUTPUT F_DATA DATA + OUTPUT F_PUNTO PUNTO + CHECKTYPE NORMAL + GROUP 2 + MESSAGE COPY,F_CODSEZH END STRING F_DENSEZ 25 @@ -194,6 +218,19 @@ BEGIN CHECKTYPE NORMAL HELP "Codice sottogruppo da convocare" ADD MASK batbsez + GROUP 1 + MESSAGE COPY,F_CODSOTH +END + +STRING F_CODSOTH 2 +BEGIN + PROMPT 2 6 "Sottogruppo " + FIELD CODSOT + FLAGS "U" + COPY ALL F_CODSEZH + CHECKTYPE NORMAL + GROUP 2 + MESSAGE COPY,F_CODSOTH END STRING F_DENSOT 25 @@ -273,7 +310,7 @@ PAGE "Soggetti" -1 -1 78 20 SPREADSHEET F_CONVOCATI BEGIN PROMPT 1 1 "Convocati" - ITEM "Codice@6" + ITEM "Codice@10" ITEM "Cognome@25" ITEM "Nome@25" ITEM "Data conv." @@ -283,6 +320,8 @@ BEGIN ITEM "Nato il@10" ITEM "Cat." ITEM "Tessera" + ITEM "Se" + ITEM "So" END ENDPAGE @@ -291,9 +330,9 @@ ENDMASK PAGE "Soggetto " -1 -1 78 20 -GROUPBOX DLG_NULL 77 5 +GROUPBOX DLG_NULL 77 6 BEGIN - PROMPT 1 0 "" + PROMPT 1 0 "Dati identificativi soggetto" FLAGS "R" END @@ -317,7 +356,9 @@ BEGIN OUTPUT F_S_DATANASC DATANASC OUTPUT F_S_CATDON CATDON OUTPUT F_S_TESSAVIS TESSAVIS - CHECKTYPE NORMAL + OUTPUT F_S_CODSEZ CODSEZ + OUTPUT F_S_CODSOT CODSOT + //CHECKTYPE NORMAL ADD RUN at0 -0 END @@ -336,7 +377,7 @@ BEGIN DISPLAY "C." CATDON DISPLAY "Tessera" TESSAVIS COPY OUTPUT F_S_CODICE - CHECKTYPE SEARCH + //CHECKTYPE SEARCH HELP "Cognome del soggetto" ADD RUN at0 -0 END @@ -344,31 +385,51 @@ END STRING F_S_NOME 25 BEGIN PROMPT 46 2 "" - COPY ALL F_S_COGNOME + USE LF_SOGGETTI KEY 2 + INPUT COGNOME F_S_COGNOME + INPUT NOME F_S_NOME + DISPLAY "Cognome@25" COGNOME + DISPLAY "Nome@25" NOME + DISPLAY "Nato il@10" DATANASC + DISPLAY "Codice@8" CODICE + DISPLAY "Sez." CODSEZ + DISPLAY "Sot." CODSOT + DISPLAY "C." CATDON + DISPLAY "Tessera" TESSAVIS COPY OUTPUT F_S_CODICE - CHECKTYPE SEARCH HELP "Nome del soggetto" +// CHECKTYPE NORMAL ADD RUN at0 -0 END +GROUPBOX DLG_NULL 77 5 +BEGIN + PROMPT 1 7 "Dati convocazione" + FLAGS "R" +END + DATE F_S_DATACONV BEGIN - PROMPT 2 5 "Convocato il " + PROMPT 2 8 "Convocato il " END -STRING F_S_CHIAMATA 1 +LISTBOX F_S_CHIAMATA 15 BEGIN - PROMPT 30 5 "Chiamata " + PROMPT 30 8 "Tipo convocazione " + FLAGS "U" + ITEM "C|Convocato" + ITEM "S|Sollecitato" + ITEM "R|Ritardatario" END BOOLEAN F_S_STAMPATO BEGIN - PROMPT 2 6 "Convocazione stampata" + PROMPT 2 9 "Convocazione stampata" END BOOLEAN F_S_ANNULLATO BEGIN - PROMPT 2 7 "Convocazione annullata" + PROMPT 2 10 "Convocazione annullata" END DATE F_S_DATANASC @@ -379,26 +440,57 @@ END STRING F_S_CATDON 2 BEGIN - PROMPT 2 8 "Cat. " + PROMPT 60 3 "Categoria " FLAGS "D" - USE CTD - INPUT CODTAB F_S_CATDON - OUTPUT F_S_DESC_CATDON S0 - CHECKTYPE NORMAL + //USE CTD + //INPUT CODTAB F_S_CATDON + //OUTPUT F_S_DESC_CATDON S0 + //CHECKTYPE NORMAL END STRING F_S_TESSAVIS 10 BEGIN - PROMPT 52 8 "Tessera AVIS " + PROMPT 33 3 "Tessera AVIS " FLAGS "D" END -STRING F_S_DESC_CATDON 25 +STRING F_S_CODSEZ 2 BEGIN - PROMPT 12 8 "" + PROMPT 2 4 "Sez./Sottog. " FLAGS "D" END +STRING F_S_CODSOT 2 +BEGIN + PROMPT 46 4 "" + FLAGS "D" + USE LF_SEZIONI + INPUT CODSEZ F_S_CODSEZ + INPUT CODSOT F_S_CODSOT + OUTPUT F_S_DENSEZ DENSEZ + OUTPUT F_S_DENSOT DENSOT + CHECKTYPE NORMAL +END + +STRING F_S_DENSOT 25 23 +BEGIN + PROMPT 49 4 "" + FLAGS "D" +END + +STRING F_S_DENSEZ 25 23 +BEGIN + PROMPT 20 4 "" + FLAGS "D" +END + + +//STRING F_S_DESC_CATDON 25 +//BEGIN +// PROMPT 12 8 "" +// FLAGS "D" +//END + BUTTON DLG_OK 9 2 BEGIN PROMPT -13 -1 "" diff --git a/at/at0500.cpp b/at/at0500.cpp index 1e1e9c9c9..492f92524 100755 --- a/at/at0500.cpp +++ b/at/at0500.cpp @@ -23,8 +23,10 @@ class TSpostamentoConv : public TPrintapp TString16 _punto,_tipo, _sezione, _sottog; TString16 _codsez, _codsot; int _quanti; // numero di convocazioni per giorni - int _spostati; // contatore dei soggetti spostati + int _spostati; // contatore dei soggetti spostati per giorno + int _contatore; TDate _data; // data a cui spostare + bool _stampa; //static bool filter_func_stconvoc(const TRelation* rel); protected: @@ -33,6 +35,7 @@ protected: virtual bool set_print(int m); virtual void set_page(int file, int cnt); virtual bool preprocess_page(int file, int counter); + virtual print_action postprocess_print(int file, int counter); public: TMask& app_mask() { return *_msk; } @@ -56,9 +59,17 @@ void TSpostamentoConv::set_page(int file, int cnt) set_row(3, ""); } +print_action TSpostamentoConv::postprocess_print(int file, int counter) +{ + if (_contatore > 0) + _msk->set(F_SPOSTATI,_contatore); + return NEXT_PAGE; +} + bool TSpostamentoConv::preprocess_page(int file, int counter) { TDate& data = app()._data; + app()._contatore++; app()._spostati++; if (app()._spostati > app()._quanti) { @@ -73,14 +84,17 @@ bool TSpostamentoConv::preprocess_page(int file, int counter) current_cursor()->file().setkey(2); current_cursor()->curr(LF_SOGGETTI).put(SOG_DATACONV,data); current_cursor()->file(LF_SOGGETTI).rewrite(); - return TRUE; + return app()._stampa; } bool TSpostamentoConv::set_print(int m) { + _stampa = FALSE; KEY tasto; tasto = _msk->run(); - if (tasto == K_ENTER) + if (tasto == F_STAMPA) + _stampa = TRUE; + if (tasto != K_QUIT) { _dataini = _msk->get(F_DATAINI); _datafin = _msk->get(F_DATAFIN); @@ -89,7 +103,8 @@ bool TSpostamentoConv::set_print(int m) _codsez = _msk->get(F_CODSEZ); _codsot = _msk->get(F_CODSOT); _spostadal = _msk->get(F_SPOSTADAL); - _spostaal = _msk->get(F_SPOSTAAL); + _spostaal = _msk->get(F_SPOSTAAL); + _contatore = 1; TString80 filtro = ""; // filtro per punto di prelievo if (_punto.not_empty()) diff --git a/at/at0500a.h b/at/at0500a.h index dd60e3a7c..af2d68498 100755 --- a/at/at0500a.h +++ b/at/at0500a.h @@ -14,3 +14,4 @@ #define F_SPOSTADAL 111 #define F_SPOSTAAL 112 #define F_SPOSTATI 113 +#define F_STAMPA 201 diff --git a/at/at0500a.uml b/at/at0500a.uml index 664622daa..11233df90 100755 --- a/at/at0500a.uml +++ b/at/at0500a.uml @@ -1,5 +1,26 @@ #include "at0500a.h" +TOOLBAR "" 0 20 0 2 + +BUTTON F_STAMPA 9 2 +BEGIN + PROMPT -13 -11 "~Stampa" + MESSAGE EXIT,F_STAMPA +END + +BUTTON DLG_OK 9 2 +BEGIN + PROMPT -23 -11 "" + MESSAGE EXIT,K_ENTER +END + +BUTTON DLG_QUIT 9 2 +BEGIN + PROMPT -33 -11 "" +END + +ENDPAGE + PAGE "Spostamento convocazioni" -1 -1 78 20 GROUPBOX DLG_NULL 77 8 @@ -135,15 +156,5 @@ BEGIN FLAGS "D" END -BUTTON DLG_OK 9 2 -BEGIN - PROMPT -12 16 "" -END - -BUTTON DLG_QUIT 9 2 -BEGIN - PROMPT -22 16 "" -END - ENDPAGE ENDMASK diff --git a/at/at0700.cpp b/at/at0700.cpp index 1ed870a6c..144df1656 100755 --- a/at/at0700.cpp +++ b/at/at0700.cpp @@ -55,7 +55,7 @@ public: void header_sezione(const TString16 codsez, const TString16 codsot); void footer_sezione(); void fine_stampa(); - TSbloccoSospesi() : _data_sblocco(TODAY), _data_stampa(TODAY), _tiposo(""), _cognome_nome("",25), _operazione("",25) {} + TSbloccoSospesi() : _data_sblocco(TODAY), _data_stampa(TODAY), _tiposo(""), _cognome_nome("",25), _operazione("",40) {} }; HIDDEN inline TSbloccoSospesi& app() { return (TSbloccoSospesi&) main_app(); } @@ -122,6 +122,7 @@ bool TSbloccoSospesi::preprocess_page(int file, int counter) _cognome_nome = nome; const TString16 stato = recsog.get(SOG_STATO); + const TString16 pros_stato = recsog.get(SOG_PROS_STATO); const TString16 statosi = recsog.get(SOG_STATOSI); const TString16 statoaf = recsog.get(SOG_STATOAF); const TDate datafine = recsog.get_date(SOG_DATA_PROS); @@ -133,17 +134,38 @@ bool TSbloccoSospesi::preprocess_page(int file, int counter) datafineaf = recsog.get_date(SOG_FINESOSAF); TString80 operazione = ""; - if (stato == "SO" && datafine.ok() && datafine <= app()._data_sblocco) + if (stato=="SO" && pros_stato==FINE_SOSPENSIONE && datafine.ok() && datafine<=app()._data_sblocco) + { + const TDate datastato = recsog.get_date(SOG_DATASTATO); + operazione << datastato.string(); + operazione << " "; + operazione << datafine.string(); + operazione << " "; operazione << "-- -- -- SO FS"; + } else if (statosi == "SO" && datafinesi.ok() && datafinesi <= app()._data_sblocco) + { + const TDate datastato = recsog.get_date(SOG_DATASI); + operazione << datastato.string(); + operazione << " "; + operazione << datafinesi.string(); + operazione << " "; operazione << "SI SO ID"; + } else if (statoaf == "SO" && datafineaf.ok() && datafineaf <= app()._data_sblocco) + { + const TDate datastato = recsog.get_date(SOG_DATAAF); + operazione << datastato.string(); + operazione << " "; + operazione << datafineaf.string(); + operazione << " "; operazione << "AF SO ID"; + } _operazione = operazione; if (_definitiva) - { + { if (stato == "SO" && datafine.ok() && datafine <= app()._data_sblocco) { TRectype* key = new TRectype(LF_CONTSAN); @@ -159,7 +181,7 @@ bool TSbloccoSospesi::preprocess_page(int file, int counter) reccon.put(CON_TIPOCON, FINE_SOSPENSIONE); _scontrolli->add_row(reccon); _scontrolli->rewrite(); - con_reord(recsog, _scontrolli); + //con_reord(recsog, _scontrolli); current_cursor()->file().rewrite(); } if ((statosi == "SO" && datafinesi.ok() && datafinesi <= app()._data_sblocco) || (statoaf == "SO" && datafineaf.ok() && datafineaf <= app()._data_sblocco)) @@ -167,9 +189,10 @@ bool TSbloccoSospesi::preprocess_page(int file, int counter) TRectype* key = new TRectype(LF_IDONEITA); long codice = recsog.get_long(SOG_CODICE); key->put(IDO_CODICE, codice); + int err = _sidoneita->read(key); if (statosi == "SO" && datafinesi.ok() && datafinesi <= app()._data_sblocco) { - int err = _sidoneita->read(key); + //int err = _sidoneita->read(key); int progido = _sidoneita->rows()+1; TRectype& recido = _idoneita->curr(); recido.zero(); @@ -184,7 +207,7 @@ bool TSbloccoSospesi::preprocess_page(int file, int counter) } if (statoaf == "SO" && datafineaf.ok() && datafineaf <= app()._data_sblocco) { - int err = _sidoneita->read(key); + //int err = _sidoneita->read(key); int progido = _sidoneita->rows()+1; TRectype& recido = _idoneita->curr(); recido.zero(); @@ -197,7 +220,7 @@ bool TSbloccoSospesi::preprocess_page(int file, int counter) _sidoneita->add_row(recido); _sidoneita->rewrite(); } - ido_reord(recsog, _sidoneita); + //ido_reord(recsog, _sidoneita); current_cursor()->file().rewrite(); } } @@ -225,9 +248,10 @@ void TSbloccoSospesi::set_page(int file, int cnt) set_row(1,"@12g#a", &_cognome_nome); set_row(1,"@38g@ld", FLD(LF_SOGGETTI,SOG_DATANASC)); set_row(1,"@49g@S", FLD(LF_SOGGETTI,SOG_TESSAVIS)); - set_row(1,"@57g@ld", FLD(LF_SOGGETTI,SOG_DATASTATO)); - set_row(1,"@68g@ld", FLD(LF_SOGGETTI,SOG_DATA_PROS)); - set_row(1,"@79g#a", &_operazione); + //set_row(1,"@57g@ld", FLD(LF_SOGGETTI,SOG_DATASTATO)); + //set_row(1,"@68g@ld", FLD(LF_SOGGETTI,SOG_DATA_PROS)); + //set_row(1,"@79g#a", &_operazione); + set_row(1,"@57g#a", &_operazione); } bool TSbloccoSospesi::filter_func_sbloccosospesi(const TRelation* rel) @@ -235,9 +259,13 @@ bool TSbloccoSospesi::filter_func_sbloccosospesi(const TRelation* rel) bool filtrato = FALSE; TRectype& recsog = rel->lfile().curr(); const TString16 stato = recsog.get(SOG_STATO); + const TString16 statopros = recsog.get(SOG_PROS_STATO); const TString16 statosi = recsog.get(SOG_STATOSI); const TString16 statoaf = recsog.get(SOG_STATOAF); - const TDate datafine = recsog.get_date(SOG_DATA_PROS); + + TDate datafine(NULLDATE); + if (statopros == "FS") + datafine = recsog.get_date(SOG_DATA_PROS); TDate datafinesi(NULLDATE); TDate datafineaf(NULLDATE); if (statosi == "SO") diff --git a/at/at0900.cpp b/at/at0900.cpp index dd9d1bc51..111cba68c 100755 --- a/at/at0900.cpp +++ b/at/at0900.cpp @@ -99,7 +99,7 @@ bool TModificaIntervalli::preprocess_page(int file, int counter) reccon.put(CON_INTAF, recsog.get_int(SOG_INTAF)); _scontrolli->add_row(reccon); _scontrolli->rewrite(); - con_reord(recsog, _scontrolli); + //con_reord(recsog, _scontrolli); current_cursor()->file().rewrite(); // salto pagina se cambio sezione diff --git a/at/at1100.cpp b/at/at1100.cpp index b2cd4a2a7..e65351782 100755 --- a/at/at1100.cpp +++ b/at/at1100.cpp @@ -303,6 +303,7 @@ bool TStampaDonBen::set_print(int m) // filtro per sezioni selezionati filtra_sezioni(); // filtro per categorie + _categorie.destroy(); const TString16 catpri = _msk->get(F_CAT1); const TString16 catsec = _msk->get(F_CAT2); const TString16 catter = _msk->get(F_CAT3); diff --git a/at/at1200.cpp b/at/at1200.cpp index 2cf68b281..d2c41d102 100755 --- a/at/at1200.cpp +++ b/at/at1200.cpp @@ -1,6 +1,8 @@ #include #include +#include #include +#include #include #include #include @@ -15,6 +17,8 @@ #include "donaz.h" #include "benem.h" #include "sezioni.h" +#include "atopera.h" +#include "atropera.h" #define ALIAS_GAZ 300 @@ -24,22 +28,20 @@ class TAttribuzioneBenemerenze : public TPrintapp TRelation* _rel; TLocalisamfile* _donaz; TLocalisamfile* _benem; + TLocalisamfile* _atopera; + TLocalisamfile* _atropera; + TLocalisamfile* _sezioni; TRecord_array* _sdonazioni; TRecord_array* _sbenemerenze; + TCursor* _cur; TAssoc_array _catdon; - TString16 _gruppoazie, _gruppoold; + TAssoc_array _tabben; + TString16 _gruppoazie, _oldben; TDate _dataela, _datapre; bool _anchegruppi; - TString16 _tipoben; // tipo benemerenza da assegnare bool _definitiva; - int _numdon; // numero donazioni necessarie - TDate _data_stampa; - TString16 _codsez, _codsot; TParagraph_string _cognome_nome; int _contatore; - - static bool filter_func_attriben(const TRelation* rel); - protected: virtual bool user_create(); virtual bool user_destroy(); @@ -49,81 +51,57 @@ protected: public: void crea_intestazione(); - void header_sezione(const TString16 codsez, const TString16 codsot); - TAttribuzioneBenemerenze() : _data_stampa(TODAY), _cognome_nome("",25) {} + void header_ben(const TString16 tipoben); + TAttribuzioneBenemerenze() : _cognome_nome("",25) {} }; HIDDEN inline TAttribuzioneBenemerenze& app() { return (TAttribuzioneBenemerenze&) main_app(); } bool TAttribuzioneBenemerenze::preprocess_page(int file, int counter) { - TRectype& recsez = current_cursor()->curr(LF_SEZIONI); - TRectype& recsog = current_cursor()->curr(); - TLocalisamfile& filesog = current_cursor()->file(); - - + TRectype& recsog = current_cursor()->curr(LF_SOGGETTI); TString80 nome = recsog.get(SOG_COGNOME); nome << " "; nome << recsog.get(SOG_NOME); _cognome_nome = nome; - - const int totdon = recsog.get_int(SOG_TOTDON); - // salto pagina se cambio sezione - const TString16 codsez = recsog.get(SOG_CODSEZ); - const TString16 codsot = recsog.get(SOG_CODSOT); - if ((_codsez!=codsez)||(_codsot!=codsot)) + // salto pagina se cambio benemerenza + const TString16 tipoben = current_cursor()->curr().get(ROP_S0); + if (tipoben!=_oldben) { - if (_codsez != "**") + if (_oldben != "**") printer().formfeed(); - _codsez = codsez; - _codsot = codsot; - header_sezione(codsez, codsot); + _oldben = tipoben; + header_ben(tipoben); } return TRUE; } void TAttribuzioneBenemerenze::set_page(int file, int cnt) -{ - set_row(1,"@0g@pn", FLD(LF_SOGGETTI,SOG_CODICE,"########")); - set_row(1,"@9g@S", FLD(LF_SOGGETTI,SOG_CATDON)); - set_row(1,"@12g#a", &_cognome_nome); - set_row(1,"@38g@ld", FLD(LF_SOGGETTI,SOG_DATANASC)); - set_row(1,"@49g@pn", FLD(LF_SOGGETTI,SOG_TOTDON,"###")); -} - -bool TAttribuzioneBenemerenze::filter_func_attriben(const TRelation* rel) -{ - bool filtrato; - // filtro chi non ha già ricevuto la benemerenza richiesta - TLocalisamfile ben(LF_BENEM); - ben.setkey(3); - TRectype& recben = ben.curr(); - recben.zero(); - recben.put(BEN_CODICE, rel->lfile().curr().get_long(SOG_CODICE)); - recben.put(BEN_TIPOBEN, app()._tipoben); - filtrato = (ben.read() != NOERR); // se ha gia' la ben. non va filtrato - // filtro chi ha il numero donazioni giuste - if (filtrato) - filtrato = rel->lfile().curr().get_int(SOG_TOTDON) >= app()._numdon; - return filtrato; -} - -void TAttribuzioneBenemerenze::header_sezione(const TString16 codsez, const TString16 codsot) -{ - const TString80 densez = current_cursor()->curr(LF_SEZIONI).get(SEZ_DENSEZ); - const TString80 densot = current_cursor()->curr(LF_SEZIONI).get(SEZ_DENSOT); - TString intestazione(132); - intestazione = "Sezione: "; - intestazione << codsez; - intestazione << "/"; - intestazione << codsot; - intestazione << " "; - intestazione << densez; - if ((densot.ok())&& (densot.not_empty())) +{ + if (file == LF_SOGGETTI) { - intestazione << "/"; - intestazione << densot; - } + set_row(1,"@0g#a", &_cognome_nome); + set_row(1,"@26g@S", FLD(LF_SOGGETTI,SOG_CATDON)); + set_row(1,"@29g@S", FLD(LF_SOGGETTI,SOG_TESSAVIS)); + set_row(1,"@39g@pn", FLD(LF_SOGGETTI,SOG_TOTDON,"###")); + } + else + set_row(1,""); +} + +void TAttribuzioneBenemerenze::header_ben(const TString16 tipoben) +{ + TString intestazione(132); + intestazione = "Benemerenza "; + intestazione << tipoben; + intestazione << " "; + TTable ben("BNZ"); + ben.zero(); + ben.put("CODTAB", tipoben); + ben.read(); + if (ben.good()) + + intestazione << ben.get("S0"); intestazione.center_just(); set_header(1,"@0g%s", (const char*) intestazione); return; @@ -135,47 +113,14 @@ bool TAttribuzioneBenemerenze::set_print(int) tasto = _msk->run(); if (tasto == K_ENTER) { - _codsez = "**"; - _codsot = "**"; - _gruppoold = "**"; + _oldben = "**"; _contatore = 0; - TString80 chiave = ""; _dataela = _msk->get(F_DATAELA); _datapre = _msk->get(F_DATAPRE); _gruppoazie = _msk->get(F_GRUPPOAZIE); _anchegruppi = _msk->get_bool(F_ANCHEGRUPPI); - _tipoben = _msk->get(F_TIPOBEN); _definitiva = _msk->get_bool(F_DEFINITIVA); - if (_gruppoazie.not_empty()) - chiave << "90->GRUPPOAZIE|UPPER(90->COGNOME)|UPPER(90->NOME)"; - else - chiave = "90->CODSEZ|90->CODSOT|UPPER(90->COGNOME)|UPPER(90->NOME)"; - TString80 filtro = ""; - if (_gruppoazie.not_empty()) - filtro.format("(90->GRUPPOAZIE == \"%s\")",(const char*)_gruppoazie); - else - if (!_anchegruppi) - filtro.format("(90->GRUPPOAZIE == \"\")"); - // filtro per sezioni - const TString16 sezini = _msk->get(F_SEZINI); - const TString16 sotini = _msk->get(F_SOTINI); - const TString16 sezfin = _msk->get(F_SEZFIN); - const TString16 sotfin = _msk->get(F_SOTFIN); - TRectype da(LF_SOGGETTI); - TRectype a(LF_SOGGETTI); - if (sezini.not_empty()) - da.put(SOG_CODSEZ, sezini); - if (sotini.not_empty()) - da.put(SOG_CODSOT, sotini); - if (sezfin.not_empty()) - a.put(SOG_CODSEZ, sezfin); - if (sotfin.not_empty()) - a.put(SOG_CODSOT, sotfin); - current_cursor()->setregion(da, a); - current_cursor()->setfilter(filtro, TRUE); - ((TSorted_cursor*)current_cursor())->change_order(chiave); - reset_files(); - add_file(LF_SOGGETTI); + _catdon.destroy(); const TString16 catpri = _msk->get(F_CAT1); const TString16 catsec = _msk->get(F_CAT2); const TString16 catter = _msk->get(F_CAT3); @@ -194,8 +139,145 @@ bool TAttribuzioneBenemerenze::set_print(int) _catdon.add((const char*) catqui); if (catses.not_empty() && catses.ok()) _catdon.add((const char*) catses); - current_cursor()->setfilter("TOTDON!=0"); - current_cursor()->set_filterfunction(filter_func_attriben,TRUE); + _tabben.destroy(); + TTable ben("BNZ"); + for(ben.first(); !ben.eof(); ben.next()) + { + TString16 codben = ben.get("CODTAB"); + int numdonben = ben.get_int("I0"); + real* oggetto = new real(numdonben); + _tabben.add((const char*)codben, (TObject*) oggetto); + } + TString80 filtro = ""; + if (_gruppoazie.not_empty()) + filtro.format("(90->GRUPPOAZIE == \"%s\")",(const char*)_gruppoazie); + else + if (!_anchegruppi) + filtro.format("(90->GRUPPOAZIE == \"\")"); + // filtro per sezioni + const TString16 sezini = _msk->get(F_SEZINI); + const TString16 sotini = _msk->get(F_SOTINI); + TRectype da(LF_SOGGETTI); + if (sezini.not_empty()) + da.put(SOG_CODSEZ, sezini); + if (sotini.not_empty()) + da.put(SOG_CODSOT, sotini); + _cur = new TCursor(_rel, "", 3, &da, &da); + _cur->setfilter(filtro, TRUE); + + TLocalisamfile atopera(LF_ATOPERA); + atopera.last(); + int progope = atopera.get_int(OPE_PROGOPE); + progope++; + atopera.zero(); + atopera.put(OPE_PROGOPE, progope); + atopera.put(OPE_CODSEZ,sezini); + atopera.put(OPE_CODSOT,sotini); + atopera.put(OPE_GRUPPOAZIE,_gruppoazie); + atopera.put(OPE_DATA1,_dataela); + atopera.put(OPE_DATA2,_datapre); + atopera.put(OPE_FLAG1,_anchegruppi); + atopera.put(OPE_UTENTE,user()); + atopera.write(); + TLocalisamfile atropera(LF_ATROPERA); + // cancelliamo l'elaborazione precedente + for (atropera.first(); !atropera.eof(); atropera.next()) + atropera.remove(); + TRectype& sog = _cur->curr(); + long last = _cur->items(); + _benem->setkey(3); + TProgind prg (last, "Elaborazione in corso... Prego attendere", FALSE, TRUE, 30); + for ( *_cur=0; _cur->pos() < last; ++(*_cur) ) + { + prg.addstatus(1); + // controllare la categoria + bool filtrato = TRUE; + + long codice = sog.get_long(SOG_CODICE); + if (_catdon.items() != 0) + { + const TString16 cat = sog.get(SOG_CATDON); + filtrato = _catdon.is_key((const char*) cat); + } + if (filtrato) + { + TRectype* key = new TRectype(LF_DONAZ); + key->put(DON_CODICE, codice); + int err = _sdonazioni->read(key); + if (err == NOERR) + { + int precsi = sog.get_int(SOG_DONPRECSI); + int precaf = sog.get_int(SOG_DONPRECAF); + int numdon = 0; + if (precsi>0) + numdon = numdon+precsi; + if (precaf>0) + numdon = numdon+precaf; + for (int r=1; r<=_sdonazioni->rows(); r++) + { + const TRectype& riga = _sdonazioni->row(r); + TDate datadon = riga.get_date(DON_DATADON); + if (datadon<=_dataela) + numdon++; + } + TString16 ultben = "**"; + TRectype* key = new TRectype(LF_BENEM); + key->put(BEN_CODICE, codice); + int err = _sbenemerenze->read(key); + if (err == NOERR) + { + for (int r=1; r<=_sbenemerenze->rows(); r++) + { + const TRectype& riga = _sbenemerenze->row(r); + ultben = riga.get(BEN_TIPOBEN); + } + } + int bonusctrl = 0; + if (ultben != "**") + { + real& ndonult = (real&) _tabben.find((const char*) ultben); + bonusctrl = ndonult.integer(); + } + _tabben.restart(); + real* c; + for (c = (real*) _tabben.first_item(); c != NULL; c = (real*) _tabben.succ_item()) + { + const char* tipoben = _tabben.get_hashobj()->key(); + int bonus = c->integer(); + if (bonus > bonusctrl) + { + if (numdon >= bonus) + { + // controllo che non abbia ricevuto la benemerenza + //const char* tipoben = _tabben.get_hashobj()->key(); + _benem->zero(); + _benem->put(BEN_CODICE, codice); + _benem->put(BEN_TIPOBEN, tipoben); + _benem->read(); + if (_benem->bad()) + { + atropera.zero(); + atropera.put(ROP_PROGOPE, progope); + atropera.put(ROP_CODICE, codice); + atropera.put(ROP_S0, tipoben); + atropera.write(); + } + } + } + } + } + } + } + reset_files(); + TRelation* relope = new TRelation(LF_ATROPERA); + relope->add(LF_SOGGETTI, "CODICE==CODICE"); + TString80 chiave = "131->S0|UPPER(90->COGNOME)|UPPER(90->NOME)"; + int curope = add_cursor(new TSorted_cursor(relope, (const char*) chiave, "", 1)); + filtro = ""; + current_cursor()->setfilter((const char*) filtro, TRUE); + + add_file(LF_ATROPERA); + add_file(LF_SOGGETTI,LF_ATROPERA); reset_print(); crea_intestazione(); return TRUE; @@ -209,18 +291,11 @@ void TAttribuzioneBenemerenze::crea_intestazione() reset_header(); TString sep(132); - sep = "ATTRIBUZIONE BENEMERENZA "; - sep << _tipoben; - const TString80 descr = _msk->get(F_D_TIPOBEN); - sep << " "; - sep << descr; + sep = "ATTRIBUZIONE BENEMERENZE "; sep << " ALLA DATA "; - TString16 data_stampa = _dataela.string(); - sep << data_stampa; + sep << _dataela.string();; sep.center_just(); set_header(2, "@0g%s", (const char*) sep); - data_stampa = _data_stampa.string(); - set_header(2,"@0g%10s", (const char*) data_stampa); sep = ""; sep << "Pag. @#"; set_header(2, "@120g%s", (const char*) sep); @@ -228,21 +303,23 @@ void TAttribuzioneBenemerenze::crea_intestazione() sep = ""; sep.fill('-'); set_header(3, (const char *) sep); - set_header(4,"@0gCod.@7gC.@10gCognome e nome@36gNato il@47Num.don."); - set_header(5,"@0g------@9g--@12g-------------------------@38g----------@49g--------"); + set_header(4,"@0gCognome e nome@26gC.@29gTessera@39gTot.don."); + set_header(5,"@0-------------------------@26g--@29g--------@39g--------"); } bool TAttribuzioneBenemerenze::user_create() -{ +{ _msk = new TMask("at1200a"); _rel = new TRelation(LF_SOGGETTI); _rel->add(LF_SEZIONI,"CODSEZ==CODSEZ|CODSOT==CODSOT"); _rel->add("GAZ", "CODTAB==GRUPPOAZIE",1,0,ALIAS_GAZ); - add_cursor(new TSorted_cursor(_rel,"SOG_CODSEZ","",3)); _donaz = new TLocalisamfile(LF_DONAZ); _benem = new TLocalisamfile(LF_BENEM); _sdonazioni = new TRecord_array(LF_DONAZ,DON_PROGDON); _sbenemerenze = new TRecord_array(LF_BENEM, BEN_PROGBEN); + _atopera = new TLocalisamfile(LF_ATOPERA); + _atropera = new TLocalisamfile(LF_ATROPERA); + _sezioni = new TLocalisamfile(LF_SEZIONI); return TRUE; } @@ -254,6 +331,9 @@ bool TAttribuzioneBenemerenze::user_destroy() delete _benem; delete _sdonazioni; delete _sbenemerenze; + delete _atopera; + delete _atropera; + delete _sezioni; return TRUE; } diff --git a/at/at1200a.h b/at/at1200a.h index f502d934e..6e9074d6b 100755 --- a/at/at1200a.h +++ b/at/at1200a.h @@ -5,10 +5,10 @@ #define F_D_SEZINI 102 #define F_SOTINI 103 #define F_D_SOTINI 104 -#define F_SEZFIN 105 -#define F_D_SEZFIN 106 -#define F_SOTFIN 107 -#define F_D_SOTFIN 108 +//#define F_SEZFIN 105 +//#define F_D_SEZFIN 106 +//#define F_SOTFIN 107 +//#define F_D_SOTFIN 108 #define F_CAT1 201 #define F_D_CAT1 202 @@ -23,11 +23,19 @@ #define F_CAT6 211 #define F_D_CAT6 212 -#define F_DATAELA 109 -#define F_DATAPRE 110 -#define F_GRUPPOAZIE 111 -#define F_D_GRUPPOAZIE 112 -#define F_ANCHEGRUPPI 113 -#define F_TIPOBEN 114 -#define F_D_TIPOBEN 115 -#define F_DEFINITIVA 116 +#define F_DATAELA 309 +#define F_DATAPRE 310 +#define F_GRUPPOAZIE 311 +#define F_D_GRUPPOAZIE 312 +#define F_ANCHEGRUPPI 313 +//#define F_TIPOBEN 314 +//#define F_D_TIPOBEN 315 +#define F_DEFINITIVA 314 + +#define F_O_CODSEZ 401 +#define F_O_CODSOT 402 +//#define F_O_GRUPPOAZIE 403 +//#define F_O_DATA1 404 +//#define F_O_DATA2 405 +//#define F_O_FLAG1 406 +//#define F_O_UTENTE 407 diff --git a/at/at1200a.uml b/at/at1200a.uml index afc7cad82..3cceffca7 100755 --- a/at/at1200a.uml +++ b/at/at1200a.uml @@ -17,12 +17,12 @@ PAGE "Attribuzione benemerenze" -1 -1 78 18 GROUPBOX DLG_NULL 77 4 BEGIN - PROMPT 1 0 "Scelta sezioni/sottogruppi" + PROMPT 1 0 "Scelta sezione/sottogruppo" END STRING F_SEZINI 2 BEGIN - PROMPT 2 1 "Da " + PROMPT 2 1 "Sezione " FLAGS "U" USE LF_SEZIONI INPUT CODSEZ F_SEZINI @@ -36,12 +36,12 @@ BEGIN OUTPUT F_SOTINI CODSOT OUTPUT F_D_SOTINI DENSOT CHECKTYPE SEARCH - HELP "Codice sezione da cui partire" + HELP "Codice sezione da stampare" END STRING F_D_SEZINI 25 BEGIN - PROMPT 11 1 "" + PROMPT 20 1 "" FLAGS "U" USE LF_SEZIONI KEY 2 INPUT DENSEZ F_D_SEZINI @@ -51,20 +51,20 @@ BEGIN DISPLAY "Cod.sot." CODSOT COPY OUTPUT F_SEZINI CHECKTYPE NORMAL - HELP "Sezione da cui partire" + HELP "Sezione da stampare" END STRING F_SOTINI 2 BEGIN - PROMPT 2 2 " " + PROMPT 2 2 "Sottogruppo " COPY ALL F_SEZINI CHECKTYPE SEARCH - HELP "Codice sottogruppo da cui partire" + HELP "Codice sottogruppo da stampare" END STRING F_D_SOTINI 25 BEGIN - PROMPT 11 2 "" + PROMPT 20 2 "" FLAGS "U" COPY USE F_D_SEZINI INPUT DENSEZ F_D_SEZINI @@ -75,61 +75,6 @@ BEGIN HELP "Sottogruppo da cui partire" END -STRING F_SEZFIN 2 -BEGIN - PROMPT 41 1 "A " - FLAGS "U" - USE LF_SEZIONI - INPUT CODSEZ F_SEZFIN - INPUT CODSOT F_SOTFIN - DISPLAY "Cod.sez" CODSEZ - DISPLAY "Cod.sot." CODSOT - DISPLAY "Sezione@25" DENSEZ - DISPLAY "Sottogruppo@25" DENSOT - OUTPUT F_SEZFIN CODSEZ - OUTPUT F_D_SEZFIN DENSEZ - OUTPUT F_SOTFIN CODSOT - OUTPUT F_D_SOTFIN DENSOT - CHECKTYPE SEARCH - HELP "Codice sezione finale" -END - -STRING F_D_SEZFIN 25 -BEGIN - PROMPT 49 1 "" - FLAGS "U" - USE LF_SEZIONI KEY 2 - INPUT DENSEZ F_D_SEZFIN - DISPLAY "Sezione@25" DENSEZ - DISPLAY "Sottogruppo@25" DENSOT - DISPLAY "Cod.sez" CODSEZ - DISPLAY "Cod.sot." CODSOT - COPY OUTPUT F_SEZFIN - CHECKTYPE NORMAL - HELP "Sezione finale" -END - -STRING F_SOTFIN 2 -BEGIN - PROMPT 41 2 " " - COPY ALL F_SEZFIN - CHECKTYPE SEARCH - HELP "Codice sottogruppo finale" -END - -STRING F_D_SOTFIN 25 -BEGIN - PROMPT 49 2 "" - FLAGS "U" - COPY USE F_D_SEZFIN - INPUT DENSEZ F_D_SEZFIN - INPUT DENSOT F_D_SOTFIN - COPY DISPLAY F_D_SEZFIN - COPY OUTPUT F_D_SEZFIN - CHECKTYPE NORMAL - HELP "Sottogruppo finale" -END - GROUPBOX DLG_NULL 77 5 BEGIN PROMPT 1 4 "Categorie donatori" @@ -256,7 +201,7 @@ BEGIN FLAGS "D" END -GROUPBOX DLG_NULL 77 8 +GROUPBOX DLG_NULL 77 7 BEGIN PROMPT 1 9 "Opzioni per l'attribuzione" END @@ -285,6 +230,8 @@ BEGIN OUTPUT F_GRUPPOAZIE CODTAB OUTPUT F_D_GRUPPOAZIE S0 CHECKTYPE NORMAL + MESSAGE DISABLE,F_ANCHEGRUPPI + MESSAGE EMPTY ENABLE,F_ANCHEGRUPPI WARNING "Codice gruppo aziendale non presente" HELP "Gruppo aziendale di appartenenza" END @@ -308,33 +255,41 @@ BEGIN PROMPT 2 13 "Includi soggetti appartenenti a gruppi aziendali" END -STRING F_TIPOBEN 2 -BEGIN - PROMPT 2 14 "Benemerenza da attribuire " - FLAGS "U" - USE BNZ - INPUT CODTAB F_TIPOBEN - DISPLAY "Codice" CODTAB - DISPLAY "Descrizione@40" S0 - OUTPUT F_TIPOBEN CODTAB - OUTPUT F_D_TIPOBEN S0 - CHECKTYPE REQUIRED - VALIDATE NOT_EMPTY_FUNC - WARNING "Codice benemerenza non presente" - HELP "Benemerenza da assegnare" -END - -STRING F_D_TIPOBEN 25 -BEGIN - PROMPT 35 14 "" - FLAGS "D" -END - BOOLEAN F_DEFINITIVA BEGIN - PROMPT 2 15 "Attribuzione definitiva" + PROMPT 2 14 "Attribuzione definitiva" HELP "Se attribuzione definitiva, le benemerenze stampate verranno registrate" END +ENDPAGE + +PAGE "Ricerca" -1 -1 78 18 + +STRING F_O_CODSEZ 2 +BEGIN + PROMPT 2 1 "Sezione " + FLAGS "U" + USE LF_ATOPERA KEY 2 + INPUT CODSEZ F_O_CODSEZ + INPUT CODSOT F_O_CODSOT + DISPLAY "Cod.sez" CODSEZ + DISPLAY "Cod.sot." CODSOT + DISPLAY "Gr.az." GRUPPOAZIE + DISPLAY "Data ela.@10" DATA1 + DISPLAY "Data pr.con.@10" DATA2 + DISPLAY "Anche gruppi" FLAG1 + DISPLAY "Utente" UTENTE + CHECKTYPE NORMAL +END + +STRING F_O_CODSOT 2 +BEGIN + PROMPT 2 2 "Sottogruppo " + COPY ALL F_O_CODSEZ + CHECKTYPE SEARCH + HELP "Codice sottogruppo da stampare" +END + + ENDPAGE ENDMASK diff --git a/at/at1500.cpp b/at/at1500.cpp index 499e2e9dc..015d14ada 100755 --- a/at/at1500.cpp +++ b/at/at1500.cpp @@ -311,6 +311,7 @@ bool TControlloBenemerenze::set_print(int m) ((TSorted_cursor*)current_cursor())->change_order(chiave); reset_files(); add_file(LF_SOGGETTI); + _catdon.destroy(); const TString16 catpri = _msk->get(F_CAT1); const TString16 catsec = _msk->get(F_CAT2); const TString16 catter = _msk->get(F_CAT3); diff --git a/at/at2.cpp b/at/at2.cpp index 920203020..a8638478d 100755 --- a/at/at2.cpp +++ b/at/at2.cpp @@ -3,7 +3,7 @@ #include "at2.h" -#define usage "Error - usage : %s -[0|1|2|3|4|5|6|7]" +#define usage "Error - usage : %s -[0|1|2|3|4|5|6|7|8]" int main(int argc, char** argv) { @@ -28,6 +28,8 @@ int main(int argc, char** argv) rt = at2700(argc, argv); break; case 7: rt = at2800(argc, argv); break; + case 8: + rt = at2900(argc, argv); break; default: error_box(usage, argv[0]) ; rt = 1; break; } diff --git a/at/at2.h b/at/at2.h index 0d05f2686..5cab54b39 100755 --- a/at/at2.h +++ b/at/at2.h @@ -9,6 +9,7 @@ int at2500(int argc, char* argv[]); // elenco soggetti idonei int at2600(int argc, char* argv[]); // elenco soggetti iscritti/dimessi int at2700(int argc, char* argv[]); // elenco soggetti per categorie int at2800(int argc, char* argv[]); // elenco soggetti che non donano dal +int at2900(int argc, char* argv[]); // elenco soggetti per frequenza donazioni #endif // __AT2_H diff --git a/at/at2.url b/at/at2.url index b12230a46..adef74f01 100755 --- a/at/at2.url +++ b/at/at2.url @@ -44,3 +44,8 @@ MENUBAR MENU_BAR(7) MENU MENU_BAR(7) SUBMENU MENU_FILE "~File" +/* at2 -8 elenco soggetti per frequenza donazione */ +MENUBAR MENU_BAR(8) +MENU MENU_BAR(8) + SUBMENU MENU_FILE "~File" + diff --git a/at/at2100.cpp b/at/at2100.cpp index 73fd58415..a4b1e760f 100755 --- a/at/at2100.cpp +++ b/at/at2100.cpp @@ -210,6 +210,7 @@ bool TStampaSospesi::set_print(int m) else current_cursor()->setfilter("TCS->S6 == \"S\"", TRUE); // filtro per categorie + _categorie.destroy(); const TString16 catpri = _msk->get(F_CAT1); const TString16 catsec = _msk->get(F_CAT2); const TString16 catter = _msk->get(F_CAT3); diff --git a/at/at2200.cpp b/at/at2200.cpp index 0df9fea0f..aa302e01d 100755 --- a/at/at2200.cpp +++ b/at/at2200.cpp @@ -42,6 +42,8 @@ class TStampaPerEta : public TPrintapp ts _tipostampa; TString16 _codsez, _codsot; int _etlarghezza, _etcolonne; + bool _stampa80; + protected: virtual bool user_create(); @@ -91,28 +93,60 @@ void TStampaPerEta::set_page(int file, int cnt) case etichette: { TPrint_section& corpo = _form_eti->get_body(); - corpo.update(); - for (word i = 0; i < corpo.height(); i++) - { - TPrintrow& riga = corpo.row(i); - set_row(i+1,riga); - } - // serve perchè alla prossima etichetta rifaccia la setpage - // altrimenti stampa sempre la stessa etichetta - force_setpage(TRUE); + for (int r=1;r<=_etcolonne;r++) + { + if (current_cursor()->pos()items()) + { + force_setpage(TRUE); + corpo.update(); + for (word i = 0; i < corpo.height(); i++) + { + TPrintrow& riga = corpo.row(i); + TString256 riga1 = riga.row(); + riga1.cut(_etlarghezza); + int colonna = ((r-1)*_etlarghezza); + TString16 formato; + formato << '@' << colonna << "g"; + riga1.insert(formato,0); + set_row(i+1,riga1); + } + if (r < _etcolonne) + ++(*current_cursor()); + } + } } break; case elenco: { - set_row(1,"@0g@pn", FLD(LF_SOGGETTI,SOG_CODICE,"########")); - set_row(1,"@9g@S", FLD(LF_SOGGETTI,SOG_CATDON)); - set_row(1,"@12g#a", &_cognome_nome); - set_row(1,"@38g@ld", FLD(LF_SOGGETTI,SOG_DATANASC)); - set_row(1,"@49g@S", FLD(LF_SOGGETTI,SOG_DOM_INDIR)); - set_row(1,"@100g@S", FLD(LF_SOGGETTI,SOG_TELABI)); - set_row(1,"@116g@S", FLD(LF_SOGGETTI,SOG_TELLAV)); - set_row(2,"@49g#a", &_dencom); - set_row(2,"@116g@S", FLD(LF_SOGGETTI,SOG_TELALT)); + if (_stampa80) + { + set_row(1,"@0g@pn", FLD(LF_SOGGETTI,SOG_CODICE,"########")); + set_row(2,"@6g@S", FLD(LF_SOGGETTI,SOG_CATDON)); + set_row(3,"@2g@S", FLD(LF_SOGGETTI,SOG_TESSAVIS)); + + set_row(1,"@12g#a", &_cognome_nome); + set_row(2,"@12g@ld", FLD(LF_SOGGETTI,SOG_DATANASC)); + set_row(3,"@12g@S", FLD(LF_SOGGETTI,SOG_DOM_INDIR)); + set_row(4,"@12g#a", &_dencom); + + set_row(1,"@62g@S", FLD(LF_SOGGETTI,SOG_TELABI)); + set_row(2,"@62g@S", FLD(LF_SOGGETTI,SOG_TELLAV)); + set_row(3,"@62g@S", FLD(LF_SOGGETTI,SOG_TELALT)); + + set_row(5,""); + } + else + { + set_row(1,"@0g@pn", FLD(LF_SOGGETTI,SOG_CODICE,"########")); + set_row(1,"@9g@S", FLD(LF_SOGGETTI,SOG_CATDON)); + set_row(1,"@12g#a", &_cognome_nome); + set_row(1,"@38g@ld", FLD(LF_SOGGETTI,SOG_DATANASC)); + set_row(1,"@49g@S", FLD(LF_SOGGETTI,SOG_DOM_INDIR)); + set_row(1,"@100g@S", FLD(LF_SOGGETTI,SOG_TELABI)); + set_row(1,"@116g@S", FLD(LF_SOGGETTI,SOG_TELLAV)); + set_row(2,"@49g#a", &_dencom); + set_row(2,"@116g@S", FLD(LF_SOGGETTI,SOG_TELALT)); + } } break; } @@ -157,7 +191,10 @@ void TStampaPerEta::header_sezione(const TString16 codsez, const TString16 codso intestazione << "/"; intestazione << densot; } - intestazione.center_just(); + if (_stampa80) + intestazione.center_just(80); + else + intestazione.center_just(132); set_header(1,"@0g%s", (const char*) intestazione); return; } @@ -199,6 +236,8 @@ bool TStampaPerEta::preprocess_page(int file, int counter) _codsot = codsot; header_sezione(codsez, codsot); } + if (printer().rows_left()<5) + printer().formfeed(); } if (_tipostampa==etichette) if (printer().rows_left() < _form_eti->get_body().height()) @@ -229,6 +268,7 @@ bool TStampaPerEta::set_print(int m) filtra_sezioni(); _dataini = _msk->get(F_DATAINI); _datafin = _msk->get(F_DATAFIN); + _categorie.destroy(); const TString16 catpri = _msk->get(F_CAT1); const TString16 catsec = _msk->get(F_CAT2); const TString16 catter = _msk->get(F_CAT3); @@ -274,20 +314,38 @@ void TStampaPerEta::crea_intestazione() { sep << " al "; sep << data.string(); - } - sep.center_just(); + } + if (_stampa80) + sep.center_just(80); + else + sep.center_just(132); set_header(2, "@0g%s", (const char*) sep); TString16 data_stampa = _data_stampa.string(); set_header(2,"@0g%10s", (const char*) data_stampa); sep = ""; sep << "Pag. @#"; - set_header(2, "@120g%s", (const char*) sep); + if (_stampa80) + set_header(2, "@73g%s", (const char*) sep); + else + set_header(2, "@110g%s", (const char*) sep); sep = ""; sep.fill('-'); set_header(3, (const char *) sep); - set_header(4,"@0gCodice@9gC.@12gCognome e nome@38gNato il@49gIndirizzo@100gTelefono abit.@116gTelefono lavoro"); - set_header(5,"@49gCAP/Località/Comune/Prov.@116gTelefono altro"); - set_header(6,"@0g--------@9g--@12g-------------------------@38g----------@49g--------------------------------------------------@100g---------------@116g---------------"); + if (_stampa80) + { + _cognome_nome.set_width(51); + set_header(4,"@0gCodice@9gCognome e nome@62gTelefono abit."); + set_header(5,"@0gCat.@9gData di nascita@62gTelefono lavoro"); + set_header(6,"@0gTessera@9gIndirizzo@62gTelefono altro"); + set_header(7,"@0g--------@9g--------------------------------------------------@62g---------------"); + } + else + { + _cognome_nome.set_width(25); + set_header(4,"@0gCodice@9gC.@12gCognome e nome@38gNato il@49gIndirizzo@100gTelefono abit.@116gTelefono lavoro"); + set_header(5,"@49gCAP/Località/Comune/Prov.@116gTelefono altro"); + set_header(6,"@0g--------@9g--@12g-------------------------@38g----------@49g--------------------------------------------------@100g---------------@116g---------------"); + } } } @@ -305,6 +363,7 @@ bool TStampaPerEta::user_create() _etcolonne = config.get_int("EtColonne"); _form_eti = new TEti_pereta_form(etformato); _msk = new TMask("at2200a"); + _stampa80 = config.get_bool("Stampa80"); return TRUE; } diff --git a/at/at2300.cpp b/at/at2300.cpp index f92356e4e..bb1dff6d1 100755 --- a/at/at2300.cpp +++ b/at/at2300.cpp @@ -213,6 +213,7 @@ bool TStampaEsclusi::set_print(int) else current_cursor()->setfilter("ESCLUSO != \"\""); // filtro per categorie + _categorie.destroy(); const TString16 catpri = _msk->get(F_CAT1); const TString16 catsec = _msk->get(F_CAT2); const TString16 catter = _msk->get(F_CAT3); diff --git a/at/at2400.cpp b/at/at2400.cpp index 254638d7d..24f87a136 100755 --- a/at/at2400.cpp +++ b/at/at2400.cpp @@ -254,6 +254,7 @@ bool TStampaModificati::set_print(int) _dataini = _msk->get(F_DATAINI); filtra_sezioni(); // filtro per categorie + _categorie.destroy(); const TString16 catpri = _msk->get(F_CAT1); const TString16 catsec = _msk->get(F_CAT2); const TString16 catter = _msk->get(F_CAT3); diff --git a/at/at2500.cpp b/at/at2500.cpp index 034c6eb07..e6c6fceeb 100755 --- a/at/at2500.cpp +++ b/at/at2500.cpp @@ -251,6 +251,7 @@ bool TStampaIdonei::set_print(int m) else current_cursor()->setfilter("(TCS->S6 == \"I\") || (TCS->S6 == \"F\")", TRUE); // filtro per categorie + _categorie.destroy(); const TString16 catpri = _msk->get(F_CAT1); const TString16 catsec = _msk->get(F_CAT2); const TString16 catter = _msk->get(F_CAT3); diff --git a/at/at2600.cpp b/at/at2600.cpp index 726fe6e88..b26260376 100755 --- a/at/at2600.cpp +++ b/at/at2600.cpp @@ -227,6 +227,7 @@ bool TStampaIscritti::set_print(int m) // filtro per sezioni filtra_sezioni(); // filtro per categorie + _categorie.destroy(); const TString16 catpri = _msk->get(F_CAT1); const TString16 catsec = _msk->get(F_CAT2); const TString16 catter = _msk->get(F_CAT3); diff --git a/at/at2700.cpp b/at/at2700.cpp index 6e194a538..1c3c5ee64 100755 --- a/at/at2700.cpp +++ b/at/at2700.cpp @@ -635,6 +635,7 @@ bool TStampaPerCategorie::set_print(int m) ((TSorted_cursor*)current_cursor())->change_order(chiave); reset_files(); add_file(LF_SOGGETTI); + _catdon.destroy(); const TString16 catpri = _msk->get(F_CAT1); const TString16 catsec = _msk->get(F_CAT2); const TString16 catter = _msk->get(F_CAT3); @@ -653,6 +654,7 @@ bool TStampaPerCategorie::set_print(int m) _catdon.add((const char*) catqui); if (catses.not_empty() && catses.ok()) _catdon.add((const char*) catses); + _catnondon.destroy(); const TString16 catnpri = _msk->get(F_CATN1); const TString16 catnsec = _msk->get(F_CATN2); const TString16 catnter = _msk->get(F_CATN3); diff --git a/at/at2800.cpp b/at/at2800.cpp index 3256bc1fc..0e8c19abf 100755 --- a/at/at2800.cpp +++ b/at/at2800.cpp @@ -265,6 +265,7 @@ bool TStampaNonDon::set_print(int m) add_file(LF_SOGGETTI); filtra_sezioni(); _data = _msk->get(F_DATA); + _categorie.destroy(); const TString16 catpri = _msk->get(F_CAT1); const TString16 catsec = _msk->get(F_CAT2); const TString16 catter = _msk->get(F_CAT3); diff --git a/at/at2900.cpp b/at/at2900.cpp new file mode 100755 index 000000000..f64e6d388 --- /dev/null +++ b/at/at2900.cpp @@ -0,0 +1,414 @@ +#include +#include +#include +#include +#include + +#include "donaz.h" +#include "soggetti.h" +#include "sezioni.h" +#include + +#include "at2.h" +#include "at2900a.h" + +#define ALIAS_LCP 100 +#define ALIAS_TCS 200 + +enum ts { undefined = 0, elenco = 1, etichette = 2 }; + +// definizione form per etichette +class TEti_freq_form : public TForm +{ +public: + + virtual TCursor* cursor() const; + virtual TRelation* relation() const; + TPrint_section& get_body() { return section('B'); } ; + TEti_freq_form(): TForm() {}; + TEti_freq_form(const char* form, const char * code = "", int editlevel = 0, const char* desc = "") + : TForm(form,code,editlevel,desc) {}; + virtual ~TEti_freq_form() {}; +}; + +class TFrequenza : public TPrintapp +{ + static bool filter_func_freq(const TRelation* rel); + + TRelation* _rel; + TMask* _msk; + TLocalisamfile* _donaz; + TRecord_array* _sdonazioni; + TEti_freq_form* _form_eti; + TAssoc_array _categorie; + int _cur; + TParagraph_string _cognome_nome, _dencom, _numdonsog; + TDate _data_stampa; + TDate _dataini,_datafin; + int _numdon; + ts _tipostampa; + TString16 _codsez, _codsot; + int _etlarghezza, _etcolonne; + bool _stampa80; + +protected: + virtual bool user_create(); + virtual bool user_destroy(); + virtual bool set_print(int m); + virtual void set_page(int file, int cnt); + virtual bool preprocess_page (int file, int counter); + +public: + void crea_intestazione(); + void filtra_sezioni(); + void header_sezione(const TString16 codsez, const TString16 codsot); + TMask& app_mask() { return *_msk; } + + TFrequenza() : _data_stampa(TODAY), _cognome_nome("",25), _dencom("",50), _numdonsog("",5) {} +}; + +HIDDEN inline TFrequenza& app() { return (TFrequenza&) main_app(); } + +TCursor* TEti_freq_form::cursor() const { return app().current_cursor(); } + +TRelation* TEti_freq_form::relation() const { return cursor()->relation(); } + +void TFrequenza::filtra_sezioni() +{ + const TString16 sezini = _msk->get(F_SEZINI); + const TString16 sotini = _msk->get(F_SOTINI); + const TString16 sezfin = _msk->get(F_SEZFIN); + const TString16 sotfin = _msk->get(F_SOTFIN); + TRectype da(LF_SOGGETTI); + TRectype a(LF_SOGGETTI); + if (sezini.not_empty()) + da.put(SOG_CODSEZ, sezini); + if (sotini.not_empty()) + da.put(SOG_CODSOT, sotini); + if (sezfin.not_empty()) + a.put(SOG_CODSEZ, sezfin); + if (sotfin.not_empty()) + a.put(SOG_CODSOT, sotfin); + current_cursor()->setregion(da, a); +} + +void TFrequenza::set_page(int file, int cnt) +{ + switch (_tipostampa) + { + case etichette: + { + TPrint_section& corpo = _form_eti->get_body(); + for (int r=1;r<=_etcolonne;r++) + { + if (current_cursor()->pos()items()) + { + force_setpage(TRUE); + corpo.update(); + for (word i = 0; i < corpo.height(); i++) + { + TPrintrow& riga = corpo.row(i); + TString256 riga1 = riga.row(); + riga1.cut(_etlarghezza); + int colonna = ((r-1)*_etlarghezza); + TString16 formato; + formato << '@' << colonna << "g"; + riga1.insert(formato,0); + set_row(i+1,riga1); + } + if (r < _etcolonne) + ++(*current_cursor()); + } + } + } + break; + case elenco: + { + if (_stampa80) + { + set_row(1,"@0g@pn", FLD(LF_SOGGETTI,SOG_CODICE,"########")); + set_row(2,"@0g@8,rs", FLD(LF_SOGGETTI,SOG_TESSAVIS)); + set_row(3,"@6g@S", FLD(LF_SOGGETTI,SOG_CATDON)); + set_row(1,"@9g#a", &_cognome_nome); + set_row(3,"@9g@ld", FLD(LF_SOGGETTI,SOG_DATANASC)); + set_row(1,"@44g@S", FLD(LF_SOGGETTI,SOG_TELABI)); + set_row(2,"@44g@S", FLD(LF_SOGGETTI,SOG_TELLAV)); + set_row(3,"@44g@S", FLD(LF_SOGGETTI,SOG_TELALT)); + //set_row(1,"@60g@ld", FLD(LF_SOGGETTI,SOG_DATAULTDON)); + //set_row(2,"@64g@S", FLD(LF_SOGGETTI,SOG_TIPOULTDON)); + set_row(1,"@60g#a", &_numdonsog); + set_row(4,""); + } + else + { + set_row(1,"@0g@pn", FLD(LF_SOGGETTI,SOG_CODICE,"########")); + set_row(1,"@9g@S", FLD(LF_SOGGETTI,SOG_CATDON)); + set_row(1,"@12g#a", &_cognome_nome); + set_row(1,"@38g@ld", FLD(LF_SOGGETTI,SOG_DATANASC)); + set_row(1,"@49g@S", FLD(LF_SOGGETTI,SOG_DOM_INDIR)); + set_row(1,"@100g@S", FLD(LF_SOGGETTI,SOG_TELABI)); + set_row(1,"@116g@S", FLD(LF_SOGGETTI,SOG_TELLAV)); + //set_row(1,"@132g@ld", FLD(LF_SOGGETTI,SOG_DATAULTDON)); + set_row(2,"@49g#a", &_dencom); + set_row(2,"@116g@S", FLD(LF_SOGGETTI,SOG_TELALT)); + //set_row(2,"@132g@S", FLD(LF_SOGGETTI,SOG_TIPOULTDON)); + set_row(1,"@132g#a", &_numdonsog); + } + } + break; + } +} + +bool TFrequenza::filter_func_freq(const TRelation* rel) +{ + bool filtrato = TRUE; + TLocalisamfile& sog = rel->lfile(); + // filtro per categorie + TAssoc_array& categorie = app()._categorie; + if (categorie.items() != 0) + { + const TString16 cat = sog.get(SOG_CATDON); + filtrato = categorie.is_key((const char*) cat); + } + // filtro per numero donazioni nel periodo + if (filtrato) + { + filtrato = FALSE; + const long codice = sog.get_long(SOG_CODICE); + TRectype* key = new TRectype(LF_DONAZ); + key->put(DON_CODICE, codice); + int err = app()._sdonazioni->read(key); + if (err == NOERR) + { + int numdon = 0; + for (int r=1; r<=app()._sdonazioni->rows(); r++) + { + const TRectype& riga = app()._sdonazioni->row(r); + TDate datadon = riga.get_date(DON_DATADON); + if ((datadon>=app()._dataini) && (datadon<=app()._datafin)) + numdon++; + } + if (numdon >= app()._numdon) + filtrato = TRUE; + } + } + return filtrato; +} + +void TFrequenza::header_sezione(const TString16 codsez, const TString16 codsot) +{ + const TString80 densez = current_cursor()->curr(LF_SEZIONI).get(SEZ_DENSEZ); + const TString80 densot = current_cursor()->curr(LF_SEZIONI).get(SEZ_DENSOT); + TString intestazione(132); + intestazione = "Sezione: "; + intestazione << codsez; + intestazione << "/"; + intestazione << codsot; + intestazione << " "; + intestazione << densez; + if ((densot.ok())&& (densot.not_empty())) + { + intestazione << "/"; + intestazione << densot; + } + if (_stampa80) + intestazione.center_just(80); + else + intestazione.center_just(132); + set_header(1,"@0g%s", (const char*) intestazione); + return; +} + +bool TFrequenza::preprocess_page(int file, int counter) +{ + if (_tipostampa == elenco) + { + TRectype recsog = current_cursor()->curr(); + const long codice = recsog.get_long(SOG_CODICE); + TRectype* key = new TRectype(LF_DONAZ); + key->put(DON_CODICE, codice); + int err = _sdonazioni->read(key); + if (err == NOERR) + { + int numdon = 0; + for (int r=1; r<=_sdonazioni->rows(); r++) + { + const TRectype& riga = _sdonazioni->row(r); + TDate datadon = riga.get_date(DON_DATADON); + if ((datadon>=_dataini) && (datadon<=_datafin)) + numdon++; + } + _numdonsog = format("%3d",numdon); + } + TString80 nome = recsog.get(SOG_COGNOME); + nome << " "; + nome << recsog.get(SOG_NOME); + _cognome_nome = nome; + TString256 localita = ""; + localita << current_cursor()->curr(-ALIAS_LCP).get("S6"); + if (localita.not_empty() && localita.ok()) + { + localita << " "; + localita << current_cursor()->curr(-ALIAS_LCP).get("S0"); + localita << " - "; + } + else + { + localita = current_cursor()->curr(LF_COMUNI).get(COM_CAPCOM); + localita << " "; + } + localita << current_cursor()->curr(LF_COMUNI).get(COM_DENCOM); + localita.trim(); + _dencom = localita; + + // salto pagina se cambio sezione + const TString16 codsez = recsog.get(SOG_CODSEZ); + const TString16 codsot = recsog.get(SOG_CODSOT); + if ((_codsez!=codsez)||(_codsot!=codsot)) + { + if (_codsez != "**") + printer().formfeed(); + _codsez = codsez; + _codsot = codsot; + header_sezione(codsez, codsot); + } + } + if (_tipostampa==etichette) + if (printer().rows_left() < _form_eti->get_body().height()) + printer().formfeed(); + return TRUE; +} + +bool TFrequenza::set_print(int m) +{ + _tipostampa = undefined; + KEY tasto; + tasto = _msk->run(); + switch (tasto) + { + case F_ELENCO: + _tipostampa = elenco; + _codsez = "**"; + _codsot = "**"; + break; + case F_ETICHETTE: + _tipostampa = etichette; + break; + } + if (_tipostampa != undefined) + { + reset_files(); + add_file(LF_SOGGETTI); + filtra_sezioni(); + _numdon = _msk->get_int(F_NUMDON); + _dataini = _msk->get(F_DATAINI); + _datafin = _msk->get(F_DATAFIN); + _categorie.destroy(); + const TString16 catpri = _msk->get(F_CAT1); + const TString16 catsec = _msk->get(F_CAT2); + const TString16 catter = _msk->get(F_CAT3); + const TString16 catqua = _msk->get(F_CAT4); + const TString16 catqui = _msk->get(F_CAT5); + const TString16 catses = _msk->get(F_CAT6); + if (catpri.not_empty() && catpri.ok()) + _categorie.add((const char*) catpri); + if (catsec.not_empty() && catsec.ok()) + _categorie.add((const char*) catsec); + if (catter.not_empty() && catter.ok()) + _categorie.add((const char*) catter); + if (catqua.not_empty() && catqua.ok()) + _categorie.add((const char*) catqua); + if (catqui.not_empty() && catqui.ok()) + _categorie.add((const char*) catqui); + if (catses.not_empty() && catses.ok()) + _categorie.add((const char*) catses); + current_cursor()->set_filterfunction (filter_func_freq); + reset_print(); + crea_intestazione(); + return TRUE; + } + else + return FALSE; +} + +void TFrequenza::crea_intestazione() +{ + reset_header(); + if (_tipostampa == elenco) + { + TString sep(132); + sep = "SOGGETTI CHE HANNO FATTO ALMENO "; + sep << _numdon; + sep << " DONAZIONI DAL "; + sep << _dataini.string(); + sep << " AL "; + sep << _datafin.string(); + if (_stampa80) + sep.center_just(80); + else + sep.center_just(132); + set_header(2, "@0g%s", (const char*) sep); + TString16 data_stampa = _data_stampa.string(); + set_header(2,"@0g%10s", (const char*) data_stampa); + sep = ""; + sep << "Pag. @#"; + if (_stampa80) + set_header(2, "@73g%s", (const char*) sep); + else + set_header(2, "@110g%s", (const char*) sep); + set_header(3, ""); + if (_stampa80) + { + set_header(4,"@0gCodice@9gCognome e nome@44gTelefono abit.@60gNum.don."); + set_header(5,"@0gTessera@44gTelefono lavoro"); + set_header(6,"@0gCateg.@9gNato il@44gTelefono altro"); + set_header(7,"@0g--------@9g----------------------------------@44g--------------@60g--------"); + _cognome_nome.set_width(35); + + } + else + { + set_header(4,"@0gCodice@9gC.@12gCognome e nome@38gNato il@49gIndirizzo@100gTelefono abit.@116gTelefono lavoro@132gNum.don."); + set_header(5,"@49gCAP/Località/Comune/Prov.@116gTelefono altro"); + set_header(6,"@0g--------@9g--@12g-------------------------@38g----------@49g--------------------------------------------------@100g---------------@116g---------------@132g--------"); + _cognome_nome.set_width(25); + } + } +} + +bool TFrequenza::user_create() +{ + _rel = new TRelation(LF_SOGGETTI); + _rel->add("TCS", "CODTAB==STATO",1,0,ALIAS_TCS); + _rel->add("LCP", "CODTAB==DOM_CODLOC",1,0,ALIAS_LCP); + _rel->add(LF_COMUNI, "COM==DOM_CODCOM"); + _rel->add(LF_SEZIONI, "CODSEZ==CODSEZ|CODSOT==CODSOT"); + _cur = add_cursor(new TCursor(_rel, "", 3)); + _msk = new TMask("at2900a"); + _donaz = new TLocalisamfile(LF_DONAZ); + _sdonazioni = new TRecord_array(LF_DONAZ,DON_PROGDON); + TConfig config(CONFIG_STUDIO); + TString16 etformato = config.get("EtFormato"); + _etlarghezza = config.get_int("EtLarghezza"); + _etcolonne = config.get_int("EtColonne"); + _form_eti = new TEti_freq_form(etformato); + _stampa80 = config.get_bool("Stampa80"); + return TRUE; +} + +bool TFrequenza::user_destroy() +{ + delete _msk; + delete _rel; + delete _form_eti; + delete _donaz; + delete _sdonazioni; + return TRUE; +} + +int at2900(int argc, char* argv[]) +{ + TFrequenza a; + a.run(argc, argv, "Soggetti per frequenza di donazione"); + return 0; +} diff --git a/at/at2900a.h b/at/at2900a.h new file mode 100755 index 000000000..8c010f6ae --- /dev/null +++ b/at/at2900a.h @@ -0,0 +1,31 @@ +// stampa lista frequenza +// definizione campi per maschera di selezione + +#define F_SEZINI 101 +#define F_D_SEZINI 102 +#define F_SOTINI 103 +#define F_D_SOTINI 104 +#define F_SEZFIN 105 +#define F_D_SEZFIN 106 +#define F_SOTFIN 107 +#define F_D_SOTFIN 108 + +#define F_CAT1 201 +#define F_D_CAT1 202 +#define F_CAT2 203 +#define F_D_CAT2 204 +#define F_CAT3 205 +#define F_D_CAT3 206 +#define F_CAT4 207 +#define F_D_CAT4 208 +#define F_CAT5 209 +#define F_D_CAT5 210 +#define F_CAT6 211 +#define F_D_CAT6 212 + +#define F_NUMDON 301 +#define F_DATAINI 302 +#define F_DATAFIN 303 + +#define F_ELENCO 401 +#define F_ETICHETTE 402 diff --git a/at/at2900a.uml b/at/at2900a.uml new file mode 100755 index 000000000..6535cf772 --- /dev/null +++ b/at/at2900a.uml @@ -0,0 +1,289 @@ +#include "at2900a.h" + +PAGE "Soggetti per frequenza di donazione" -1 -1 78 20 + +GROUPBOX DLG_NULL 77 4 +BEGIN + PROMPT 1 1 "Scelta sezioni/sottogruppi" +END + +STRING F_SEZINI 2 +BEGIN + PROMPT 2 2 "Da " + FLAGS "U" + USE LF_SEZIONI + INPUT CODSEZ F_SEZINI + INPUT CODSOT F_SOTINI + DISPLAY "Cod.sez" CODSEZ + DISPLAY "Cod.sot." CODSOT + DISPLAY "Sezione@25" DENSEZ + DISPLAY "Sottogruppo@25" DENSOT + OUTPUT F_SEZINI CODSEZ + OUTPUT F_D_SEZINI DENSEZ + OUTPUT F_SOTINI CODSOT + OUTPUT F_D_SOTINI DENSOT + CHECKTYPE SEARCH + HELP "Codice sezione da cui partire" +END + +STRING F_D_SEZINI 25 +BEGIN + PROMPT 11 2 "" + FLAGS "U" + USE LF_SEZIONI KEY 2 + INPUT DENSEZ F_D_SEZINI + DISPLAY "Sezione@25" DENSEZ + DISPLAY "Sottogruppo@25" DENSOT + DISPLAY "Cod.sez" CODSEZ + DISPLAY "Cod.sot." CODSOT + COPY OUTPUT F_SEZINI + CHECKTYPE NORMAL + HELP "Sezione da cui partire" +END + +STRING F_SOTINI 2 +BEGIN + PROMPT 2 3 " " + COPY ALL F_SEZINI + CHECKTYPE SEARCH + HELP "Codice sottogruppo da cui partire" +END + +STRING F_D_SOTINI 25 +BEGIN + PROMPT 11 3 "" + FLAGS "U" + COPY USE F_D_SEZINI + INPUT DENSEZ F_D_SEZINI + INPUT DENSOT F_D_SOTINI + COPY DISPLAY F_D_SEZINI + COPY OUTPUT F_D_SEZINI + CHECKTYPE NORMAL + HELP "Sottogruppo da cui partire" +END + +STRING F_SEZFIN 2 +BEGIN + PROMPT 41 2 "A " + FLAGS "U" + USE LF_SEZIONI + INPUT CODSEZ F_SEZFIN + INPUT CODSOT F_SOTFIN + DISPLAY "Cod.sez" CODSEZ + DISPLAY "Cod.sot." CODSOT + DISPLAY "Sezione@25" DENSEZ + DISPLAY "Sottogruppo@25" DENSOT + OUTPUT F_SEZFIN CODSEZ + OUTPUT F_D_SEZFIN DENSEZ + OUTPUT F_SOTFIN CODSOT + OUTPUT F_D_SOTFIN DENSOT + CHECKTYPE SEARCH + HELP "Codice sezione finale" +END + +STRING F_D_SEZFIN 25 +BEGIN + PROMPT 49 2 "" + FLAGS "U" + USE LF_SEZIONI KEY 2 + INPUT DENSEZ F_D_SEZFIN + DISPLAY "Sezione@25" DENSEZ + DISPLAY "Sottogruppo@25" DENSOT + DISPLAY "Cod.sez" CODSEZ + DISPLAY "Cod.sot." CODSOT + COPY OUTPUT F_SEZFIN + CHECKTYPE NORMAL + HELP "Sezione finale" +END + +STRING F_SOTFIN 2 +BEGIN + PROMPT 41 3 " " + COPY ALL F_SEZFIN + CHECKTYPE SEARCH + HELP "Codice sottogruppo finale" +END + +STRING F_D_SOTFIN 25 +BEGIN + PROMPT 49 3 "" + FLAGS "U" + COPY USE F_D_SEZFIN + INPUT DENSEZ F_D_SEZFIN + INPUT DENSOT F_D_SOTFIN + COPY DISPLAY F_D_SEZFIN + COPY OUTPUT F_D_SEZFIN + CHECKTYPE NORMAL + HELP "Sottogruppo finale" +END + +GROUPBOX DLG_NULL 77 5 +BEGIN + PROMPT 1 5 "Categorie" +END + +STRING F_CAT1 2 +BEGIN + PROMPT 2 6 "" + FLAGS "U" + USE CTD + INPUT CODTAB F_CAT1 + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@30" S0 + OUTPUT F_CAT1 CODTAB + OUTPUT F_D_CAT1 S0 + CHECKTYPE NORMAL + WARNING "Codice non presente" + HELP "Categoria di appartenenza" +END + +STRING F_D_CAT1 30 +BEGIN + PROMPT 8 6 "" + FLAGS "D" +END + +STRING F_CAT2 2 +BEGIN + PROMPT 2 7 "" + FLAGS "U" + USE CTD + INPUT CODTAB F_CAT2 + COPY DISPLAY F_CAT1 + OUTPUT F_CAT2 CODTAB + OUTPUT F_D_CAT2 S0 + CHECKTYPE NORMAL + WARNING "Codice non presente" + HELP "Categoria di appartenenza" +END + +STRING F_D_CAT2 30 +BEGIN + PROMPT 8 7 "" + FLAGS "D" +END + +STRING F_CAT3 2 +BEGIN + PROMPT 2 8 "" + FLAGS "U" + USE CTD + INPUT CODTAB F_CAT3 + COPY DISPLAY F_CAT1 + OUTPUT F_CAT3 CODTAB + OUTPUT F_D_CAT3 S0 + CHECKTYPE NORMAL + WARNING "Codice non presente" + HELP "Categoria di appartenenza" +END + +STRING F_D_CAT3 30 +BEGIN + PROMPT 8 8 "" + FLAGS "D" +END + +STRING F_CAT4 2 +BEGIN + PROMPT 40 6 "" + FLAGS "U" + USE CTD + INPUT CODTAB F_CAT4 + COPY DISPLAY F_CAT1 + OUTPUT F_CAT4 CODTAB + OUTPUT F_D_CAT4 S0 + CHECKTYPE NORMAL + WARNING "Codice non presente" + HELP "Categoria di appartenenza" +END + +STRING F_D_CAT4 30 +BEGIN + PROMPT 46 6 "" + FLAGS "D" +END + +STRING F_CAT5 2 +BEGIN + PROMPT 40 7 "" + FLAGS "U" + USE CTD + INPUT CODTAB F_CAT5 + COPY DISPLAY F_CAT1 + OUTPUT F_CAT5 CODTAB + OUTPUT F_D_CAT5 S0 + CHECKTYPE NORMAL + WARNING "Codice non presente" + HELP "Categoria di appartenenza" +END + +STRING F_D_CAT5 30 +BEGIN + PROMPT 46 7 "" + FLAGS "D" +END + +STRING F_CAT6 2 +BEGIN + PROMPT 40 8 "" + FLAGS "U" + USE CTD + INPUT CODTAB F_CAT6 + COPY DISPLAY F_CAT1 + OUTPUT F_CAT6 CODTAB + OUTPUT F_D_CAT6 S0 + CHECKTYPE NORMAL + WARNING "Codice non presente" + HELP "Categoria di appartenenza" +END + +STRING F_D_CAT6 30 +BEGIN + PROMPT 46 8 "" + FLAGS "D" +END + +GROUPBOX DLG_NULL 77 3 +BEGIN + PROMPT 1 10 "Opzioni di elaborazione" +END + +NUMBER F_NUMDON 3 +BEGIN + PROMPT 2 11 "Almeno " +END + +DATE F_DATAINI +BEGIN + PROMTP 14 11 "donazioni dal " +END + +DATE F_DATAFIN +BEGIN + PROMPT 40 11 "al " +END + +GROUPBOX DLG_NULL 77 4 +BEGIN + PROMPT 1 13 "Stampa" +END + +BUTTON F_ELENCO 9 2 +BEGIN + PROMPT -13 14 "Elenco" + MESSAGE EXIT,F_ELENCO +END + +BUTTON F_ETICHETTE 9 2 +BEGIN + PROMPT -23 14 "Etichette" + MESSAGE EXIT,F_ETICHETTE +END + +BUTTON DLG_QUIT 9 2 +BEGIN + PROMPT -33 14 "" +END + +ENDPAGE +ENDMASK diff --git a/at/at3.cpp b/at/at3.cpp index c0707008f..b04621315 100755 --- a/at/at3.cpp +++ b/at/at3.cpp @@ -4,18 +4,28 @@ #include "at3.h" -#define usage "Error - usage : %s -{0}" +#define usage "Error - usage : %s -{0|1|2|3|4|5|6}" int main(int argc,char** argv) - { - int rt = -1 ; + int rt = -1 ; const int r = (argc > 1) ? atoi(&argv[1][1]) : -1; - switch (r) { case 0: rt = at3100(argc,argv) ; break; + case 1: + rt = at3200(argc,argv) ; break; + case 2: + rt = at3300(argc,argv) ; break; + case 3: + rt = at3400(argc,argv) ; break; + case 4: + rt = at3500(argc,argv) ; break; + case 5: + rt = at3600(argc,argv) ; break; + case 6: + rt = at3700(argc,argv) ; break; default: error_box(usage, argv[0]) ; break; } diff --git a/at/at3.h b/at/at3.h index 99b52ea0c..6dbc94a0f 100755 --- a/at/at3.h +++ b/at/at3.h @@ -2,6 +2,12 @@ #define __AT3_H int at3100(int argc, char* argv[]); +int at3200(int argc, char* argv[]); +int at3300(int argc, char* argv[]); +int at3400(int argc, char* argv[]); +int at3500(int argc, char* argv[]); +int at3600(int argc, char* argv[]); +int at3700(int argc, char* argv[]); #endif // __AT3_H diff --git a/at/at3.url b/at/at3.url index 24bf8ed17..aa196e964 100755 --- a/at/at3.url +++ b/at/at3.url @@ -5,53 +5,37 @@ #include -/* ---------------------------------------------------- - * at3 -0 - * ---------------------------------------------------- */ +/* at3 -0 statistica soggetti per sesso e fascia di eta'*/ MENU TASK_MENUBAR - SUBMENU MENU_FILE "~File" + SUBMENU MENU_FILE "~File" -/* ---------------------------------------------------- - * at1 -1 - * ---------------------------------------------------- */ +/* at3 -1 statistica donazioni per mese e gruppo/rh */ MENUBAR MENU_BAR(1) - MENU MENU_BAR(1) - SUBMENU MENU_FILE "~File" - - -/* ---------------------------------------------------- - * at1 -2 - * ---------------------------------------------------- */ + SUBMENU MENU_FILE "~File" +/* at3 -2 statistica soggetti per categorie */ MENUBAR MENU_BAR(2) - MENU MENU_BAR(2) - SUBMENU MENU_FILE "~File" - -/* ---------------------------------------------------- - * at1 -3 - * - * ----------------------------------------------------*/ + SUBMENU MENU_FILE "~File" +/* at3 -3 statistica donazioni per mese e tipo don. */ MENUBAR MENU_BAR(3) - MENU MENU_BAR(3) - SUBMENU MENU_FILE "~File" + SUBMENU MENU_FILE "~File" -/* ---------------------------------------------------- - * at1 -4 - * ---------------------------------------------------- */ +/* at3 -4 statistica giornaliera donazioni per tipo */ MENUBAR MENU_BAR(4) - MENU MENU_BAR(4) - SUBMENU MENU_FILE "~File" + SUBMENU MENU_FILE "~File" -/* ---------------------------------------------------- - * at1 -5 - * ---------------------------------------------------- */ +/* at3 -5 statistica donazioni/donatori per sesso, gruppo e rh */ MENUBAR MENU_BAR(5) - MENU MENU_BAR(5) - SUBMENU MENU_FILE "~File" + SUBMENU MENU_FILE "~File" + +/* at3 -6 statistica soggetti per sesso, gruppo e rh */ +MENUBAR MENU_BAR(6) +MENU MENU_BAR(6) + SUBMENU MENU_FILE "~File" diff --git a/at/at3100.cpp b/at/at3100.cpp index 7a15deeb9..402bbbe8a 100755 --- a/at/at3100.cpp +++ b/at/at3100.cpp @@ -1,113 +1,562 @@ #include -#include #include +#include +#include #include +#include #include +#include #include -#include <..\include\filetext.h> -#include <..\include\filetext.cpp> -#include +#include #include "at3.h" // nomi campi maschera -//#include "at3100a.h" +#include "at3100a.h" // nomi dei campi #include "soggetti.h" +#include "atstats.h" +#include "sezioni.h" -//#include "atlib.h" +// classe per la definizione di una riga di statistica +class TRigaSFascia : public TObject +{ + int _etaini,_etafin; + TArray _valori; -class TCarica_app : public TApplication +protected: + const TRigaSFascia& copy(const TRigaSFascia& riga); +public: + const int etaini() const { return _etaini; } + const int etafin() const { return _etafin; } + TObject* dup() const { return new TRigaSFascia(*this); } + const TRigaSFascia& operator = (const TRigaSFascia& riga); + const real& operator [] (int colonna) const; + void aggiorna_valore(int colonna, const real& numero) ; + void azzera_valori(); + // costruttore + TRigaSFascia(int etaini, int etafin) {_etaini = etaini; _etafin = etafin;} + // costruttore di copia + TRigaSFascia(const TRigaSFascia& riga) { copy(riga); } + virtual ~TRigaSFascia() {}; +}; + +const TRigaSFascia& TRigaSFascia::copy(const TRigaSFascia& riga) +{ + _etaini = riga._etaini; + _etafin = riga._etafin; + _valori = riga._valori; + return (*this); +} + +const TRigaSFascia& TRigaSFascia::operator = (const TRigaSFascia& riga) +{ + copy(riga); + return (*this); +} + +const real& TRigaSFascia::operator [] (int colonna) const +{ + real* valore = (real*)_valori.objptr(colonna); + if (valore == NULL) + return ZERO; + else + return *valore; +} + +void TRigaSFascia::aggiorna_valore(int colonna, const real& numero) +{ + real* valore = (real*)_valori.objptr(colonna); + if (valore == NULL) + _valori.add(new real(numero), colonna); + else + *valore += numero; +} + +void TRigaSFascia::azzera_valori() +{ + _valori.destroy(); +} + +class TStatSogxEta : public TApplication { TMask* _msk; TRelation* _rel; - TFile_text* _trasfile; - - TLocalisamfile* _soggetti; - + TCursor* _cur; + TLocalisamfile* _sezioni; + TLocalisamfile* _soggetti; + TLocalisamfile* _atstats; + TAssoc_array* _colonne; + TArray _righe; + TString16 _sezini, _sotini, _sezfin, _sotfin; + TString16 _catdon; + TDate _data; + TArray _etaini, _etafin; + protected: virtual bool create(); virtual bool destroy(); virtual bool menu(MENU_TAG m); virtual TMask& get_mask() { return *_msk; } virtual TRelation* get_relation() const { return _rel; } - - int write(); - + int data2row(const int eta); + bool riepilogo(); + bool stampa(); + bool crea_colonne(); + bool crea_righe(); + void azzera_righe(); + void stampa_sezione(TString16 codsez, TString16 codsot); + void crea_intestazione(); public: - TCarica_app() {} + TStatSogxEta() {} }; -HIDDEN inline TCarica_app& app() { return (TCarica_app&) main_app(); } +HIDDEN inline TStatSogxEta& app() { return (TStatSogxEta&) main_app(); } -bool TCarica_app::create() +int TStatSogxEta::data2row(const int eta) +{ + int indice = 0; + for (int i=0; i<_etaini.items(); i++) + { + real valore; + real* val1 = (real*) _etaini.objptr(i); + valore = *val1; + int etaini = valore.integer(); + real* val2 = (real*) _etafin.objptr(i); + valore = *val2; + int etafin = valore.integer(); + if ((eta >= etaini) && (eta <= etafin)) + indice = i; + } + return indice; +} + +bool TStatSogxEta::crea_colonne() +{ + _colonne->destroy(); + real contatore(ZERO); + real* oggetto = new real(contatore); + const char* indice = "0"; + _colonne->add(indice,(TObject*)oggetto); + indice = "1"; // maschi + contatore = contatore+1; + real* oggetto2 = new real(contatore); + _colonne->add(indice,(TObject*)oggetto2); + indice = "2"; // femmine + contatore = contatore+1; + real* oggetto3 = new real(contatore); + _colonne->add(indice,(TObject*)oggetto3); + indice = "9"; // non spec. + contatore = contatore+1; + real* oggetto4 = new real(contatore); + _colonne->add(indice,(TObject*)oggetto4); + return TRUE; +} + +bool TStatSogxEta::crea_righe() +{ + for (int i=0;i<_etaini.items();i++) + { + real valore; + real* val1 = (real*) _etaini.objptr(i); + valore = *val1; + int etaini = valore.integer(); + real* val2 = (real*) _etafin.objptr(i); + valore = *val2; + int etafin = valore.integer(); + _righe.add(new TRigaSFascia(etaini, etafin), i); + } + return _righe.items()>0; +} + +bool TStatSogxEta::create() { TApplication::create(); _msk = new TMask("at3100a"); _rel = new TRelation(LF_SOGGETTI); - _trasfile = new TFile_text("sogg.txt","sogg.ini"); + _soggetti = new TLocalisamfile(LF_SOGGETTI); + _atstats = new TLocalisamfile(LF_ATSTATS); + _sezioni = new TLocalisamfile(LF_SEZIONI); + _colonne = new TAssoc_array(); dispatch_e_menu(BAR_ITEM(1)); - return TRUE; } -bool TCarica_app::destroy() +bool TStatSogxEta::destroy() { delete _rel; delete _msk; - delete _trasfile; + delete _soggetti; + delete _atstats; + delete _sezioni; + delete _colonne; return TApplication::destroy(); } -bool TCarica_app::menu(MENU_TAG m) +bool TStatSogxEta::menu(MENU_TAG m) { TMask& msk = get_mask(); KEY tasto; - do - { - tasto = msk.run(); - switch (tasto) - { - case K_ENTER: // registra - { - TCarica_app::write(); - } - break; - } - } - while (tasto != K_QUIT); - return FALSE; + tasto = msk.run(); + if (tasto == K_ENTER) + { + _sezini = _msk->get(F_SEZINI); + _sotini = _msk->get(F_SOTINI); + _sezfin = _msk->get(F_SEZFIN); + _sotfin = _msk->get(F_SOTFIN); + _catdon = _msk->get(F_CATDON); + _data = _msk->get_date(F_DATA); + TSheet_field& s = (TSheet_field&)_msk->field(F_FASCIE); + for (int r=0; rsetstatus(1); - - _trasfile->open("sogg.txt",'r'); - _rel->lfile().setkey(2); - _rel->write_enable(); - TRecord_text rec; - while (_trasfile->ok_r()) - { - pi->addstatus(1); - if (_trasfile->read(rec) == NOERR) - { - _trasfile->autosave(*_rel, rec); - } - } - delete pi; - - return NOERR; + TPrintrow row; + TString256 sep; + sep = "STATISTICA SOGGETTI PER SESSO E ETA' al "; + sep << _data.string(); + sep.center_just(80); + row.put(sep); + row.put("@>", 1); + row.put("Pag. @#", 70); + printer().setheaderline(2, row); + sep = ""; + sep << "Categoria "; + sep << _catdon; + sep.center_just(80); + row.reset(); + row.put(sep); + printer().setheaderline(3, row); + sep = ""; + sep << "Fascia di eta' Sconosciuto Maschi Femmine Non spec. Totale"; + row.reset(); + row.put(sep); + printer().setheaderline(5, row); + sep = ""; + sep.fill('-'); + row.reset(); + row.put(sep); + printer().setheaderline(6, row); } +bool TStatSogxEta::stampa() +{ + if (printer().open()) + { + crea_intestazione(); + TRelation* relstat = new TRelation(LF_ATSTATS); + TCursor* curstat = new TCursor(relstat, "", 1); + TString16 oldsez = "**"; + TString16 oldsot = "**"; + double numero; + TString16 actsez, actsot; + TString16 sesso; + int fascia; + long last = curstat->items(); + for ( *curstat=0; curstat->pos() < last; ++(*curstat) ) + { + actsez = curstat->curr().get(ATSS_CODSEZ); + actsot = curstat->curr().get(ATSS_CODSOT); + fascia = curstat->curr().get_int(ATSS_FASCIA); + sesso = curstat->curr().get(ATSS_SESSO); + if (sesso.empty()) + sesso = "9"; + numero = (double)curstat->curr().get_int(ATSS_NUMERO); + if (actsez != oldsez || actsot != oldsot) + { + if (oldsez != "**" && oldsot != "**") + { + stampa_sezione(oldsez,oldsot); + azzera_righe(); + } + oldsez = actsez; + oldsot = actsot; + } + TRigaSFascia& riga = (TRigaSFascia&)_righe[fascia]; + real& colonna = (real&)_colonne->find((const char*)sesso); + real n = numero; + riga.aggiorna_valore(colonna.integer(),n); + } + if (oldsez != "**" && oldsot != "**") + stampa_sezione(oldsez,oldsot); + delete curstat; + delete relstat; + printer().close(); + return TRUE; + } + else + return FALSE; +} + +void TStatSogxEta::azzera_righe() +{ + for (int i=0;i<_etaini.items();i++) + { + TRigaSFascia& riga = (TRigaSFascia&)_righe[i]; + riga.azzera_valori(); + } +} + +void TStatSogxEta::stampa_sezione(TString16 codsez, TString16 codsot) +{ + TPrintrow row; + TString256 rigastampa; + rigastampa = "Sezione: "; + rigastampa << codsez; + if (codsot.not_empty()) + { + rigastampa << "/"; + rigastampa << codsot; + } + rigastampa << " "; + TLocalisamfile sezioni(LF_SEZIONI); + sezioni.setkey(1); + sezioni.zero(); + sezioni.put(SEZ_CODSEZ,codsez); + sezioni.put(SEZ_CODSOT,codsot); + if (sezioni.read() == NOERR) + { + TString80 den = sezioni.get(SEZ_DENSEZ); + rigastampa << den; + den = sezioni.get(SEZ_DENSOT); + if (den.not_empty()) + { + rigastampa << "/"; + rigastampa << den; + } + } + rigastampa.center_just(80); + row.put(rigastampa); + printer().setheaderline(1, row); + + TRigaSFascia rigatotali(0,0); + TString16 valore; + real totalefascia = ZERO; + for (int r=0;r<_etaini.items();r++) + { + TRigaSFascia& riga = (TRigaSFascia&)_righe[r]; + row.reset(); + real valreal; + rigastampa = "da "; + real* val1 = (real*)_etaini.objptr(r); + valreal = *val1; + rigastampa << valreal.string(); + rigastampa << " a "; + real* val2 = (real*)_etafin.objptr(r); + valreal = *val2; + rigastampa << valreal.string(); + rigastampa << " anni"; + totalefascia = ZERO; + // ciclo per totali + for (int i=0;i<_colonne->items();i++) + { + rigatotali.aggiorna_valore(i,riga[i]); + totalefascia+=riga[i]; + } + // ciclo per stampa + int pos = 15; + for (int j=0;j<_colonne->items();j++) + { + //rigatotali.aggiorna_valore(i,riga[i]); + //totalefascia+=riga[i]; + valore = ""; + valore.format("%8d",riga[i].integer()); + rigastampa.overwrite((const char*)valore, pos); + real perc = (riga[j]/totalefascia)*100; + pos=pos+6; + valore = ""; + valore << perc.string(3,2); + rigastampa.overwrite((const char*)valore, pos); + pos = pos+10; + } + if (totalefascia != 0) + { + valore = ""; + valore.format("%8d",totalefascia.integer()); + rigastampa.overwrite((const char*)valore, pos+4); + row.put((const char*) rigastampa); + printer().print(row); + } + } + + // stampa totali per sezione + rigastampa = ""; + rigastampa.fill('-'); + row.reset(); + row.put(rigastampa); + printer().print(row); + row.reset(); + rigastampa = ""; + rigastampa = "Totale"; + real totale; + totale = ZERO; + int pos = 21; + for (int i=0;i<_colonne->items();i++) + { + totale+=rigatotali[i]; + valore = ""; + valore.format("%8d",rigatotali[i].integer()); + rigastampa.overwrite((const char*)valore, pos); + pos = pos+10; + } + valore = ""; + valore.format("%8d",totale.integer()); + rigastampa.overwrite((const char*)valore, pos+4); + row.put((const char*) rigastampa); + printer().print(row); + printer().formfeed(); +} + +bool TStatSogxEta::riepilogo() +{ + if (crea_colonne() && crea_righe()) + { + // cancello i risultati della elaborazione precedente + TLocalisamfile stat(LF_ATSTATS); + for (stat.first(); !stat.eof(); stat.next()) + stat.remove(); + stat.setkey(1); + _cur = new TCursor(_rel, "", 1); + TString256 filtro = ""; + + // filtro per categoria + if (_catdon.not_empty()) + { + if (filtro.empty()) + filtro = format("(90->CATDON == \"%s\")",(const char*)_catdon); + else + { + filtro << " && "; + filtro << format("(90->CATDON == \"%s\")",(const char*)_catdon); + } + if (_data.ok()) + { + TTable ctd("CTD"); + ctd.put("CODTAB",_catdon); + if (ctd.read() == NOERR) + { + bool dimissione = ctd.get_bool("B0"); + if (dimissione) + filtro << " && (ANSI(90->DATADIM)<=" << _data.string(ANSI) << ")"; + else + filtro << " && (ANSI(90->DATAISC)<=" << _data.string(ANSI) << ")"; + } + } + } + // filtro per sezione/sottogruppo + if (_sezini.not_empty()) + { + if (filtro.empty()) + filtro = format("(90->CODSEZ >= \"%s\")",(const char*)_sezini); + else + { + filtro << " && "; + filtro << format("(90->CODSEZ >= \"%s\")",(const char*)_sezini); + } + if (_sotini.not_empty()) + { + if (filtro.empty()) + filtro = format("(90->CODSOT >= \"%s\")",(const char*)_sotini); + else + { + filtro << " && "; + filtro << format("(90->CODSOT >= \"%s\")",(const char*)_sotini); + } + } + } + if (_sezfin.not_empty()) + { + if (filtro.empty()) + filtro = format("(90->CODSEZ <= \"%s\")",(const char*)_sezfin); + else + { + filtro << " && "; + filtro << format("(90->CODSEZ <= \"%s\")",(const char*)_sezfin); + } + if (_sotfin.not_empty()) + { + if (filtro.empty()) + filtro = format("(90->CODSOT <= \"%s\")",(const char*)_sotfin); + else + { + filtro << " && "; + filtro << format("(90->CODSOT <= \"%s\")",(const char*)_sotfin); + } + } + } + + _cur->setfilter((const char*) filtro, TRUE); + TString16 codsez, codsot; + long numero; + TString16 sesso; + int eta, fascia; + TDate datanasc; + + const TDate oggi(TODAY); + const int anno = oggi.year(); + TRectype& recsog = _cur->curr(); + long last = _cur->items(); + TProgind prg (last, "Elaborazione in corso... Prego attendere", FALSE, TRUE, 30); + for ( *_cur=0; _cur->pos() < last; ++(*_cur) ) + { + prg.addstatus(1); + codsez = recsog.get(SOG_CODSEZ); + codsot = recsog.get(SOG_CODSOT); + datanasc = recsog.get_date(SOG_DATANASC); + eta = _data.year() - datanasc.year(); + fascia = data2row(eta); + sesso = recsog.get(SOG_SESSO); + if (sesso.empty()) + sesso = "9"; + stat.zero(); + stat.put(ATSS_CODSEZ, codsez); + stat.put(ATSS_CODSOT, codsot); + stat.put(ATSS_SESSO, sesso); + stat.put(ATSS_FASCIA, fascia); + if (stat.read() == NOERR) + { + numero = stat.get_long(ATSS_NUMERO); + numero++; + stat.put(ATSS_NUMERO, numero); + stat.rewrite(); + } + else + { + stat.put(ATSS_CODSEZ, codsez); + stat.put(ATSS_CODSOT, codsot); + stat.put(ATSS_SESSO, sesso); + stat.put(ATSS_FASCIA, fascia); + numero = 1; + stat.put(ATSS_NUMERO, numero); + stat.write(); + } + } + return (stat.eod() > 0); + } + else + return FALSE; +} + int at3100(int argc, char* argv[]) { - TCarica_app a; - a.run(argc, argv, "Carica dati da file di testo"); + TStatSogxEta a; + a.run(argc, argv, "Statistica soggetti per sesso e eta'"); return 0; } \ No newline at end of file diff --git a/at/at3100a.h b/at/at3100a.h new file mode 100755 index 000000000..d4412532f --- /dev/null +++ b/at/at3100a.h @@ -0,0 +1,19 @@ +// statistica donatori per sesso e fascie di eta' +// definizione campi per maschera di selezione + +#define F_SEZINI 101 +#define F_D_SEZINI 102 +#define F_SOTINI 103 +#define F_D_SOTINI 104 +#define F_SEZFIN 105 +#define F_D_SEZFIN 106 +#define F_SOTFIN 107 +#define F_D_SOTFIN 108 + +#define F_CATDON 301 +#define F_D_CATDON 302 +#define F_DATA 303 +#define F_FASCIE 304 + +#define F_ETAINI 101 +#define F_ETAFIN 102 diff --git a/at/at3100a.uml b/at/at3100a.uml index bb4c7c133..2d3a81898 100755 --- a/at/at3100a.uml +++ b/at/at3100a.uml @@ -1,22 +1,204 @@ -TOOLBAR "" 0 20 0 2 +#include "at3100a.h" -BUTTON DLG_OK 10 2 +PAGE "Statistica donatori per sesso e fascie di eta'" -1 -1 78 20 + +GROUPBOX DLG_NULL 77 4 BEGIN - PROMPT -12 -11 "" + PROMPT 1 1 "Scelta sezioni/sottogruppi" END -BUTTON DLG_QUIT 10 2 +STRING F_SEZINI 2 BEGIN - PROMPT -22 -11 "" + PROMPT 2 2 "Da " + FLAGS "U" + USE LF_SEZIONI + INPUT CODSEZ F_SEZINI + INPUT CODSOT F_SOTINI + DISPLAY "Cod.sez" CODSEZ + DISPLAY "Cod.sot." CODSOT + DISPLAY "Sezione@25" DENSEZ + DISPLAY "Sottogruppo@25" DENSOT + OUTPUT F_SEZINI CODSEZ + OUTPUT F_D_SEZINI DENSEZ + OUTPUT F_SOTINI CODSOT + OUTPUT F_D_SOTINI DENSOT + CHECKTYPE SEARCH + HELP "Codice sezione da cui partire" END -ENDPAGE +STRING F_D_SEZINI 25 +BEGIN + PROMPT 11 2 "" + FLAGS "U" + USE LF_SEZIONI KEY 2 + INPUT DENSEZ F_D_SEZINI + DISPLAY "Sezione@25" DENSEZ + DISPLAY "Sottogruppo@25" DENSOT + DISPLAY "Cod.sez" CODSEZ + DISPLAY "Cod.sot." CODSOT + COPY OUTPUT F_SEZINI + CHECKTYPE NORMAL + HELP "Sezione da cui partire" +END -PAGE "Trasferimento dati da file di testo: prova" -1 -1 78 20 +STRING F_SOTINI 2 +BEGIN + PROMPT 2 3 " " + COPY ALL F_SEZINI + CHECKTYPE SEARCH + HELP "Codice sottogruppo da cui partire" +END + +STRING F_D_SOTINI 25 +BEGIN + PROMPT 11 3 "" + FLAGS "U" + COPY USE F_D_SEZINI + INPUT DENSEZ F_D_SEZINI + INPUT DENSOT F_D_SOTINI + COPY DISPLAY F_D_SEZINI + COPY OUTPUT F_D_SEZINI + CHECKTYPE NORMAL + HELP "Sottogruppo da cui partire" +END + +STRING F_SEZFIN 2 +BEGIN + PROMPT 41 2 "A " + FLAGS "U" + USE LF_SEZIONI + INPUT CODSEZ F_SEZFIN + INPUT CODSOT F_SOTFIN + DISPLAY "Cod.sez" CODSEZ + DISPLAY "Cod.sot." CODSOT + DISPLAY "Sezione@25" DENSEZ + DISPLAY "Sottogruppo@25" DENSOT + OUTPUT F_SEZFIN CODSEZ + OUTPUT F_D_SEZFIN DENSEZ + OUTPUT F_SOTFIN CODSOT + OUTPUT F_D_SOTFIN DENSOT + CHECKTYPE SEARCH + HELP "Codice sezione finale" +END + +STRING F_D_SEZFIN 25 +BEGIN + PROMPT 49 2 "" + FLAGS "U" + USE LF_SEZIONI KEY 2 + INPUT DENSEZ F_D_SEZFIN + DISPLAY "Sezione@25" DENSEZ + DISPLAY "Sottogruppo@25" DENSOT + DISPLAY "Cod.sez" CODSEZ + DISPLAY "Cod.sot." CODSOT + COPY OUTPUT F_SEZFIN + CHECKTYPE NORMAL + HELP "Sezione finale" +END + +STRING F_SOTFIN 2 +BEGIN + PROMPT 41 3 " " + COPY ALL F_SEZFIN + CHECKTYPE SEARCH + HELP "Codice sottogruppo finale" +END + +STRING F_D_SOTFIN 25 +BEGIN + PROMPT 49 3 "" + FLAGS "U" + COPY USE F_D_SEZFIN + INPUT DENSEZ F_D_SEZFIN + INPUT DENSOT F_D_SOTFIN + COPY DISPLAY F_D_SEZFIN + COPY OUTPUT F_D_SEZFIN + CHECKTYPE NORMAL + HELP "Sottogruppo finale" +END + +GROUPBOX DLG_NULL 77 14 +BEGIN + PROMPT 1 5 "Opzioni per la statistica" +END + +STRING F_CATDON 2 +BEGIN + PROMPT 2 6 "Cat. " + FLAGS "U" + USE CTD + INPUT CODTAB F_CATDON + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@40" S0 + OUTPUT F_CATDON CODTAB + OUTPUT F_D_CATDON S0 + CHECKTYPE NORMAL + WARNING "Codice categoria non presente" + HELP "Categoria di appartenenza" +END + +STRING F_D_CATDON 25 +BEGIN + PROMPT 12 6 "" + FLAGS "D" +END + +DATE F_DATA +BEGIN + PROMPT 45 6 "Data elaborazione " +END TEXT DLG_NULL BEGIN - PROMPT 5 5 "Premere CONFERMA per iniziare" + PROMPT 2 7 "Fascie di eta'" +END + +SPREADSHEET F_FASCIE 15 9 +BEGIN + PROMPT 3 8 "" + ITEM "Da " + ITEM "A " +END + +BUTTON DLG_OK 9 2 +BEGIN + PROMPT -12 -1 "" +END + +BUTTON DLG_QUIT 9 2 +BEGIN + PROMPT -22 -1 "" +END + +ENDPAGE +ENDMASK + +PAGE "Fascia di eta'" -1 -1 75 16 + +NUMBER F_ETAINI 3 +BEGIN + PROMPT 2 2 "Eta' iniziale " +END + +NUMBER F_ETAFIN 3 +BEGIN + PROMPT 3 2 "Eta' finale " +END + +BUTTON DLG_OK 9 2 +BEGIN + PROMPT -13 -1 "" +END + +BUTTON DLG_CANCEL 9 2 +BEGIN + PROMPT -23 -1 "" +END + +BUTTON DLG_DELREC 9 2 +BEGIN + PROMPT -33 -1 "" + MESSAGE EXIT, K_DEL END ENDPAGE diff --git a/at/at3200.cpp b/at/at3200.cpp new file mode 100755 index 000000000..0583612a1 --- /dev/null +++ b/at/at3200.cpp @@ -0,0 +1,642 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "at3.h" + +// nomi campi maschera +#include "at3200a.h" + +// nomi dei campi +#include "soggetti.h" +#include "donaz.h" +#include "atstatd.h" +#include "sezioni.h" + +// classe per la definizione di una riga di statistica +class TRigaMDxG : public TObject +{ + int _anno, _mese; + TArray _valori; + +protected: + const TRigaMDxG& copy(const TRigaMDxG& riga); +public: + const int anno() const { return _anno; } + const int mese() const { return _mese; } + TObject* dup() const { return new TRigaMDxG(*this); } + const TRigaMDxG& operator = (const TRigaMDxG& riga); + const real& operator [] (int colonna) const; + void aggiorna_valore(int colonna, const real& numero) ; + void azzera_valori(); + // costruttore + TRigaMDxG(int anno, int mese) {_anno = anno; _mese = mese;} + // costruttore di copia + TRigaMDxG(const TRigaMDxG& riga) { copy(riga); } + virtual ~TRigaMDxG() {}; +}; + +const TRigaMDxG& TRigaMDxG::copy(const TRigaMDxG& riga) +{ + _anno = riga._anno; + _mese = riga._mese; + _valori = riga._valori; + return (*this); +} + +const TRigaMDxG& TRigaMDxG::operator = (const TRigaMDxG& riga) +{ + copy(riga); + return (*this); +} + +const real& TRigaMDxG::operator [] (int colonna) const +{ + real* valore = (real*)_valori.objptr(colonna); + if (valore == NULL) + return ZERO; + else + return *valore; +} + +void TRigaMDxG::aggiorna_valore(int colonna, const real& numero) +{ + real* valore = (real*)_valori.objptr(colonna); + if (valore == NULL) + _valori.add(new real(numero), colonna); + else + *valore += numero; +} + +void TRigaMDxG::azzera_valori() +{ + _valori.destroy(); +} + +class TMensileDonxGr : public TApplication +{ + TMask* _msk; + TRelation* _rel; + TCursor* _cur; + TLocalisamfile* _sezioni; + TLocalisamfile* _soggetti; + TLocalisamfile* _donaz; + TLocalisamfile* _atstatd; + TDate _dataini, _datafin; + TAssoc_array* _colonne; + TArray _righe; // array per riepilogo donazioni + TString16 _sezini, _sotini, _sezfin, _sotfin; + +protected: + virtual bool create(); + virtual bool destroy(); + virtual bool menu(MENU_TAG m); + virtual TMask& get_mask() { return *_msk; } + virtual TRelation* get_relation() const { return _rel; } + int data2row(const int anno, const int mese); + TString16 gruppo2col(TString16 gruppo, TString16 rh); + bool riepilogo(); + bool stampa(); + bool crea_colonne(); + bool crea_righe(); + void azzera_righe(); + void stampa_sezione(TString16 codsez, TString16 codsot); + void crea_intestazione(); + TString16 int2month(const int month); +public: + TMensileDonxGr() {} + +}; + +HIDDEN inline TMensileDonxGr& app() { return (TMensileDonxGr&) main_app(); } + +TString16 TMensileDonxGr::int2month(const int month) +{ + TString16 mese = ""; + switch (month) + { + case 1: + mese << "GENNAIO "; + break; + case 2: + mese << "FEBBRAIO "; + break; + case 3: + mese << "MARZO "; + break; + case 4: + mese << "APRILE "; + break; + case 5: + mese << "MAGGIO "; + break; + case 6: + mese << "GIUGNO "; + break; + case 7: + mese << "LUGLIO "; + break; + case 8: + mese << "AGOSTO "; + break; + case 9: + mese << "SETTEMBRE"; + break; + case 10: + mese << "OTTOBRE "; + break; + case 11: + mese << "NOVEMBRE "; + break; + case 12: + mese << "DICEMBRE "; + break; + } + return mese; +} + +int TMensileDonxGr::data2row(const int anno, const int mese) +{ + const int annoini = _dataini.year(); + return (anno-annoini)*12 + mese; +} + +bool TMensileDonxGr::crea_colonne() +{ + _colonne->destroy(); + real contatore(ZERO); + real* oggetto = new real(contatore); + const char* indice = "0P"; + _colonne->add(indice,(TObject*)oggetto); + indice = "0N"; + contatore = contatore+1; + real* oggetto2 = new real(contatore); + _colonne->add(indice,(TObject*)oggetto2); + indice = "AP"; + contatore = contatore+1; + real* oggetto3 = new real(contatore); + _colonne->add(indice,(TObject*)oggetto3); + indice = "AN"; + contatore = contatore+1; + real* oggetto4 = new real(contatore); + _colonne->add(indice,(TObject*)oggetto4); + indice = "BP"; + contatore = contatore+1; + real* oggetto5 = new real(contatore); + _colonne->add(indice,(TObject*)oggetto5); + indice = "BN"; + contatore = contatore+1; + real* oggetto6 = new real(contatore); + _colonne->add(indice,(TObject*)oggetto6); + indice = "CP"; + contatore = contatore+1; + real* oggetto7 = new real(contatore); + _colonne->add(indice,(TObject*)oggetto7); + indice = "CN"; + contatore = contatore+1; + real* oggetto8 = new real(contatore); + _colonne->add(indice,(TObject*)oggetto8); + indice = "NN"; + contatore = contatore+1; + real* oggetto9 = new real(contatore); + _colonne->add(indice,(TObject*)oggetto9); + return TRUE; +} + +TString16 TMensileDonxGr::gruppo2col(TString16 gruppo, TString16 rh) +{ + TString16 indice = "NN"; + if (gruppo == "0") + indice = "0"; + if (gruppo == "A") + indice = "A"; + if (gruppo == "A1") + indice = "A"; + if (gruppo == "A2") + indice = "A"; + if (gruppo == "A1B") + indice = "C"; + if (gruppo == "A2B") + indice = "C"; + if (gruppo == "AB") + indice = "C"; + if (gruppo == "B") + indice = "B"; + if (rh.empty()) + indice = "NN"; + if (rh == "POS") + indice << "P";; + if (rh == "NEG") + indice << "N";; + return indice; +} +bool TMensileDonxGr::crea_righe() +{ + int anno = _dataini.year(); + int meseini, mesefin; + while (anno<=_datafin.year()) + { + if (anno == _dataini.year()) + meseini = _dataini.month(); + else + meseini = 1; + if (anno == _datafin.year()) + mesefin = _datafin.month(); + else + mesefin = 12; + for (int mese=meseini;mese<=mesefin;mese++) + _righe.add(new TRigaMDxG(anno, mese), data2row(anno, mese)); + anno++; + } + return _righe.items()>0; +} + +bool TMensileDonxGr::create() +{ + TApplication::create(); + _msk = new TMask("at3200a"); + _rel = new TRelation(LF_DONAZ); + _rel->add(LF_SOGGETTI, "CODICE==CODICE"); + _soggetti = new TLocalisamfile(LF_SOGGETTI); + _donaz = new TLocalisamfile(LF_DONAZ); + _atstatd = new TLocalisamfile(LF_ATSTATD); + _sezioni = new TLocalisamfile(LF_SEZIONI); + _colonne = new TAssoc_array(); + dispatch_e_menu(BAR_ITEM(1)); + return TRUE; +} + +bool TMensileDonxGr::destroy() +{ + delete _rel; + delete _msk; + delete _soggetti; + delete _donaz; + delete _atstatd; + delete _sezioni; + delete _colonne; + return TApplication::destroy(); +} + +bool TMensileDonxGr::menu(MENU_TAG m) +{ + TMask& msk = get_mask(); + KEY tasto; + tasto = msk.run(); + if (tasto == K_ENTER) + { + _dataini = msk.get(F_DATAINI); + _datafin = msk.get(F_DATAFIN); + _sezini = _msk->get(F_SEZINI); + _sotini = _msk->get(F_SOTINI); + _sezfin = _msk->get(F_SEZFIN); + _sotfin = _msk->get(F_SOTFIN); + if (riepilogo()) + stampa(); + } + return FALSE; +} + +void TMensileDonxGr::crea_intestazione() +{ + TPrintrow row; + TString256 sep; + sep = "MENSILE DONAZIONI PER GRUPPO E RH"; + sep.center_just(80); + row.put(sep); + row.put("@>", 1); + row.put("Pag. @#", 70); + printer().setheaderline(2, row); + row.reset(); + sep = ""; + if (_dataini.ok()) + { + sep << " dal "; + sep << _dataini.string(); + } + if (_datafin.ok()) + { + sep << " al "; + sep << _datafin.string(); + } + sep.center_just(80); + row.put(sep); + printer().setheaderline(3, row); + row.reset(); + printer().setheaderline(4, row); + sep = "Mese "; + int pos = 21; + sep.overwrite("0 POS 0 NEG A POS A NEG B POS B NEG AB POS AB NEG NON DEF. TOTALE",pos); + //sep.overwrite("Totale",pos); + row.put(sep); + printer().setheaderline(5, row); + sep = ""; + sep.fill('-'); + row.reset(); + row.put(sep); + printer().setheaderline(6, row); +} + +bool TMensileDonxGr::stampa() +{ + if (printer().open()) + { + crea_intestazione(); + TRelation* relstat = new TRelation(LF_ATSTATD); + TCursor* curstat = new TCursor(relstat, "", 1); + TString16 oldsez = "**"; + TString16 oldsot = "**"; + double numero; + TString16 actsez, actsot, gruppo, rh; + int anno, mese; + long last = curstat->items(); + for ( *curstat=0; curstat->pos() < last; ++(*curstat) ) + { + actsez = curstat->curr().get(ATS_CODSEZ); + actsot = curstat->curr().get(ATS_CODSOT); + anno = curstat->curr().get_int(ATS_ANNO); + mese = curstat->curr().get_int(ATS_MESE); + gruppo = curstat->curr().get(ATS_GRUPPO); + rh = curstat->curr().get(ATS_RH); + numero = (double)curstat->curr().get_int(ATS_NUMERO); + if (actsez != oldsez || actsot != oldsot) + { + if (oldsez != "**" && oldsot != "**") + { + stampa_sezione(oldsez,oldsot); + azzera_righe(); + } + oldsez = actsez; + oldsot = actsot; + } + TRigaMDxG& riga = (TRigaMDxG&)_righe[data2row(anno,mese)]; + TString16 indcol = gruppo2col(gruppo,rh); + real& colonna = (real&)_colonne->find((const char*)indcol); + real n = numero; + riga.aggiorna_valore(colonna.integer(),n); + } + if (oldsez != "**" && oldsot != "**") + stampa_sezione(oldsez,oldsot); + delete curstat; + delete relstat; + printer().close(); + return TRUE; + } + else + return FALSE; +} + +void TMensileDonxGr::azzera_righe() +{ + int anno = _dataini.year(); + int meseini, mesefin; + while (anno<=_datafin.year()) + { + if (anno == _dataini.year()) + meseini = _dataini.month(); + else + meseini = 1; + if (anno == _datafin.year()) + mesefin = _datafin.month(); + else + mesefin = 12; + for (int mese=meseini;mese<=mesefin;mese++) + { + TRigaMDxG& riga = (TRigaMDxG&)_righe[data2row(anno,mese)]; + riga.azzera_valori(); + } + anno++; + } +} + +void TMensileDonxGr::stampa_sezione(TString16 codsez, TString16 codsot) +{ + TPrintrow row; + TString256 rigastampa; + rigastampa = "Sezione: "; + rigastampa << codsez; + if (codsot.not_empty()) + { + rigastampa << "/"; + rigastampa << codsot; + } + rigastampa << " "; + TLocalisamfile sezioni(LF_SEZIONI); + sezioni.setkey(1); + sezioni.zero(); + sezioni.put(SEZ_CODSEZ,codsez); + sezioni.put(SEZ_CODSOT,codsot); + if (sezioni.read() == NOERR) + { + TString80 den = sezioni.get(SEZ_DENSEZ); + rigastampa << den; + den = sezioni.get(SEZ_DENSOT); + if (den.not_empty()) + { + rigastampa << "/"; + rigastampa << den; + } + } + rigastampa.center_just(80); + row.put(rigastampa); + printer().setheaderline(1, row); + + TRigaMDxG rigatotali(0,0); + int anno = _dataini.year(); + int meseini, mesefin; + real totalemese = ZERO; + TString16 valore; + while (anno<=_datafin.year()) + { + if (anno == _dataini.year()) + meseini = _dataini.month(); + else + meseini = 1; + if (anno == _datafin.year()) + mesefin = _datafin.month(); + else + mesefin = 12; + for (int mese=meseini;mese<=mesefin;mese++) + { + TRigaMDxG& riga = (TRigaMDxG&)_righe[data2row(anno,mese)]; + row.reset(); + rigastampa = ""; + rigastampa.format("%s %4d", (const char*)int2month(mese), anno); + totalemese = ZERO; + int pos = 16; + for (int i=0;i<_colonne->items();i++) + { + rigatotali.aggiorna_valore(i,riga[i]); + totalemese+=riga[i]; + valore = ""; + valore.format("%8d",riga[i].integer()); + rigastampa.overwrite((const char*)valore, pos); + pos = pos+8; + } + valore = ""; + valore.format("%8d",totalemese.integer()); + rigastampa.overwrite((const char*)valore, pos+4); + row.put((const char*) rigastampa); + printer().print(row); + } + anno++; + } + // stampa totali per sezione + rigastampa = ""; + rigastampa.fill('-'); + row.reset(); + row.put(rigastampa); + printer().print(row); + row.reset(); + rigastampa = ""; + rigastampa = "Totale periodo"; + totalemese = ZERO; + int pos = 16; + for (int i=0;i<_colonne->items();i++) + { + totalemese+=rigatotali[i]; + valore = ""; + valore.format("%8d",rigatotali[i].integer()); + rigastampa.overwrite((const char*)valore, pos); + pos = pos+8; + } + valore = ""; + valore.format("%8d",totalemese.integer()); + rigastampa.overwrite((const char*)valore, pos+4); + row.put((const char*) rigastampa); + printer().print(row); + printer().formfeed(); +} + +bool TMensileDonxGr::riepilogo() +{ + if (crea_colonne() && crea_righe()) + { + // cancello i risultati della elaborazione precedente + TLocalisamfile stat(LF_ATSTATD); + for (stat.first(); !stat.eof(); stat.next()) + stat.remove(); + stat.setkey(1); + // filtro per data + TRectype da(LF_DONAZ); + TRectype a (LF_DONAZ); + if (_dataini.ok()) + da.put(DON_DATADON, _dataini); + if (_datafin.ok()) + a.put(DON_DATADON, _datafin); + _cur = new TCursor(_rel, "", 2, &da, &a); + TString256 filtro = ""; + + // filtro per sezione/sottogruppo + if (_sezini.not_empty()) + { + if (filtro.empty()) + filtro = format("(90->CODSEZ >= \"%s\")",(const char*)_sezini); + else + { + filtro << " && "; + filtro << format("(90->CODSEZ >= \"%s\")",(const char*)_sezini); + } + if (_sotini.not_empty()) + { + if (filtro.empty()) + filtro = format("(90->CODSOT >= \"%s\")",(const char*)_sotini); + else + { + filtro << " && "; + filtro << format("(90->CODSOT >= \"%s\")",(const char*)_sotini); + } + } + } + if (_sezfin.not_empty()) + { + if (filtro.empty()) + filtro = format("(90->CODSEZ <= \"%s\")",(const char*)_sezfin); + else + { + filtro << " && "; + filtro << format("(90->CODSEZ <= \"%s\")",(const char*)_sezfin); + } + if (_sotfin.not_empty()) + { + if (filtro.empty()) + filtro = format("(90->CODSOT <= \"%s\")",(const char*)_sotfin); + else + { + filtro << " && "; + filtro << format("(90->CODSOT <= \"%s\")",(const char*)_sotfin); + } + } + } + _cur->setfilter((const char*) filtro, TRUE); + TString16 codsez, codsot, gruppo, rh; + TDate datadon; + int anno, mese; + long numero; + TRectype& recdon = _cur->curr(); + TRectype& recsog = _cur->curr(LF_SOGGETTI); + long last = _cur->items(); + TProgind prg (last, "Elaborazione in corso... Prego attendere", FALSE, TRUE, 30); + for ( *_cur=0; _cur->pos() < last; ++(*_cur) ) + { + prg.addstatus(1); + codsez = recdon.get(DON_CODSEZ); + codsot = recdon.get(DON_CODSOT); + if (codsez.empty()) + { + codsez = recsog.get(SOG_CODSEZ); + codsot = recsog.get(SOG_CODSOT); + } + datadon = recdon.get_date(DON_DATADON); + anno = datadon.year(); + mese = datadon.month(); + gruppo = recsog.get(SOG_GRUPPOAB0); + rh = recsog.get(SOG_RHANTID); + stat.zero(); + stat.put(ATS_CODSEZ, codsez); + stat.put(ATS_CODSOT, codsot); + stat.put(ATS_ANNO, anno); + stat.put(ATS_MESE, mese); + stat.put(ATS_TIPODON, " "); + stat.put(ATS_GRUPPO, gruppo); + stat.put(ATS_RH, rh); + if (stat.read() == NOERR) + { + numero = stat.get_long(ATS_NUMERO); + numero++; + stat.put(ATS_NUMERO, numero); + stat.rewrite(); + } + else + { + stat.zero(); + stat.put(ATS_CODSEZ, codsez); + stat.put(ATS_CODSOT, codsot); + stat.put(ATS_ANNO, anno); + stat.put(ATS_MESE, mese); + stat.put(ATS_TIPODON, " "); + stat.put(ATS_GRUPPO, gruppo); + stat.put(ATS_RH, rh); + numero = 1; + stat.put(ATS_NUMERO, numero); + stat.write(); + } + } + return (stat.eod() > 0); + } + else + return FALSE; +} + +int at3200(int argc, char* argv[]) +{ + TMensileDonxGr a; + a.run(argc, argv, "Mensile donazioni per gruppo e rh"); + return 0; +} \ No newline at end of file diff --git a/at/at3200a.h b/at/at3200a.h new file mode 100755 index 000000000..ba1ded1d6 --- /dev/null +++ b/at/at3200a.h @@ -0,0 +1,16 @@ +// statistica donazioni per gruppo e rh +// definizione campi per maschera di selezione + +#define F_SEZINI 101 +#define F_D_SEZINI 102 +#define F_SOTINI 103 +#define F_D_SOTINI 104 +#define F_SEZFIN 105 +#define F_D_SEZFIN 106 +#define F_SOTFIN 107 +#define F_D_SOTFIN 108 + +#define F_DATAINI 301 +#define F_DATAFIN 302 +//#define F_TIPODON 303 +//#define F_D_TIPODON 304 diff --git a/at/at3200a.uml b/at/at3200a.uml new file mode 100755 index 000000000..276497953 --- /dev/null +++ b/at/at3200a.uml @@ -0,0 +1,168 @@ +#include "at3200a.h" + +PAGE "Mensile donazioni per gruppo e rh" -1 -1 78 12 + +GROUPBOX DLG_NULL 77 4 +BEGIN + PROMPT 1 1 "Scelta sezioni/sottogruppi" +END + +STRING F_SEZINI 2 +BEGIN + PROMPT 2 2 "Da " + FLAGS "U" + USE LF_SEZIONI + INPUT CODSEZ F_SEZINI + INPUT CODSOT F_SOTINI + DISPLAY "Cod.sez" CODSEZ + DISPLAY "Cod.sot." CODSOT + DISPLAY "Sezione@25" DENSEZ + DISPLAY "Sottogruppo@25" DENSOT + OUTPUT F_SEZINI CODSEZ + OUTPUT F_D_SEZINI DENSEZ + OUTPUT F_SOTINI CODSOT + OUTPUT F_D_SOTINI DENSOT + CHECKTYPE SEARCH + HELP "Codice sezione da cui partire" +END + +STRING F_D_SEZINI 25 +BEGIN + PROMPT 11 2 "" + FLAGS "U" + USE LF_SEZIONI KEY 2 + INPUT DENSEZ F_D_SEZINI + DISPLAY "Sezione@25" DENSEZ + DISPLAY "Sottogruppo@25" DENSOT + DISPLAY "Cod.sez" CODSEZ + DISPLAY "Cod.sot." CODSOT + COPY OUTPUT F_SEZINI + CHECKTYPE NORMAL + HELP "Sezione da cui partire" +END + +STRING F_SOTINI 2 +BEGIN + PROMPT 2 3 " " + COPY ALL F_SEZINI + CHECKTYPE SEARCH + HELP "Codice sottogruppo da cui partire" +END + +STRING F_D_SOTINI 25 +BEGIN + PROMPT 11 3 "" + FLAGS "U" + COPY USE F_D_SEZINI + INPUT DENSEZ F_D_SEZINI + INPUT DENSOT F_D_SOTINI + COPY DISPLAY F_D_SEZINI + COPY OUTPUT F_D_SEZINI + CHECKTYPE NORMAL + HELP "Sottogruppo da cui partire" +END + +STRING F_SEZFIN 2 +BEGIN + PROMPT 41 2 "A " + FLAGS "U" + USE LF_SEZIONI + INPUT CODSEZ F_SEZFIN + INPUT CODSOT F_SOTFIN + DISPLAY "Cod.sez" CODSEZ + DISPLAY "Cod.sot." CODSOT + DISPLAY "Sezione@25" DENSEZ + DISPLAY "Sottogruppo@25" DENSOT + OUTPUT F_SEZFIN CODSEZ + OUTPUT F_D_SEZFIN DENSEZ + OUTPUT F_SOTFIN CODSOT + OUTPUT F_D_SOTFIN DENSOT + CHECKTYPE SEARCH + HELP "Codice sezione finale" +END + +STRING F_D_SEZFIN 25 +BEGIN + PROMPT 49 2 "" + FLAGS "U" + USE LF_SEZIONI KEY 2 + INPUT DENSEZ F_D_SEZFIN + DISPLAY "Sezione@25" DENSEZ + DISPLAY "Sottogruppo@25" DENSOT + DISPLAY "Cod.sez" CODSEZ + DISPLAY "Cod.sot." CODSOT + COPY OUTPUT F_SEZFIN + CHECKTYPE NORMAL + HELP "Sezione finale" +END + +STRING F_SOTFIN 2 +BEGIN + PROMPT 41 3 " " + COPY ALL F_SEZFIN + CHECKTYPE SEARCH + HELP "Codice sottogruppo finale" +END + +STRING F_D_SOTFIN 25 +BEGIN + PROMPT 49 3 "" + FLAGS "U" + COPY USE F_D_SEZFIN + INPUT DENSEZ F_D_SEZFIN + INPUT DENSOT F_D_SOTFIN + COPY DISPLAY F_D_SEZFIN + COPY OUTPUT F_D_SEZFIN + CHECKTYPE NORMAL + HELP "Sottogruppo finale" +END + +GROUPBOX DLG_NULL 77 4 +BEGIN + PROMPT 1 5 "Opzioni per la statistica" +END + +DATE F_DATAINI +BEGIN + PROMPT 2 6 "Donazioni effettuate dal " + HELP "Data iniziale" +END + +DATE F_DATAFIN +BEGIN + PROMPT 40 6 "al " + HELP "Data finale" +END + +//STRING F_TIPODON 2 +//BEGIN +// PROMPT 2 7 "Tipo donazioni " +// FLAGS "U" +// USE TDN +// INPUT CODTAB F_TIPODON +// DISPLAY "Codice" CODTAB +// DISPLAY "Descrizione@30" S0 +// OUTPUT F_TIPODON CODTAB +// OUTPUT F_D_TIPODON S0 +// CHECKTYPE NORMAL +// WARNING "Codice non presente" +//END + +//STRING F_D_TIPODON 30 +//BEGIN +// PROMPT 23 7 "" +// FLAGS "D" +//END + +BUTTON DLG_OK 9 2 +BEGIN + PROMPT -12 -1 "" +END + +BUTTON DLG_QUIT 9 2 +BEGIN + PROMPT -22 -1 "" +END + +ENDPAGE +ENDMASK diff --git a/at/at3300.cpp b/at/at3300.cpp new file mode 100755 index 000000000..70dffc639 --- /dev/null +++ b/at/at3300.cpp @@ -0,0 +1,526 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "at3.h" + +// nomi campi maschera +#include "at3300a.h" + +// nomi dei campi +#include "soggetti.h" +#include "atstats.h" +#include "sezioni.h" + +// classe per la definizione di una riga di statistica +class TRigaSxCat : public TObject +{ + TString16 _catdon; + TArray _valori; + +protected: + const TRigaSxCat& copy(const TRigaSxCat& riga); +public: + const TString16 catdon() const { return _catdon; } + TObject* dup() const { return new TRigaSxCat(*this); } + const TRigaSxCat& operator = (const TRigaSxCat& riga); + const real& operator [] (int colonna) const; + void aggiorna_valore(int colonna, const real& numero) ; + void azzera_valori(); + // costruttore + TRigaSxCat(TString16 catdon) {_catdon = catdon;} + // costruttore di copia + TRigaSxCat(const TRigaSxCat& riga) { copy(riga); } + virtual ~TRigaSxCat() {}; +}; + +const TRigaSxCat& TRigaSxCat::copy(const TRigaSxCat& riga) +{ + _catdon = riga._catdon; + _valori = riga._valori; + return (*this); +} + +const TRigaSxCat& TRigaSxCat::operator = (const TRigaSxCat& riga) +{ + copy(riga); + return (*this); +} + +const real& TRigaSxCat::operator [] (int colonna) const +{ + real* valore = (real*)_valori.objptr(colonna); + if (valore == NULL) + return ZERO; + else + return *valore; +} + +void TRigaSxCat::aggiorna_valore(int colonna, const real& numero) +{ + real* valore = (real*)_valori.objptr(colonna); + if (valore == NULL) + _valori.add(new real(numero), colonna); + else + *valore += numero; +} + +void TRigaSxCat::azzera_valori() +{ + _valori.destroy(); +} + +class TStatSogxCat : public TApplication +{ + TMask* _msk; + TRelation* _rel; + TCursor* _cur; + TLocalisamfile* _sezioni; + TLocalisamfile* _soggetti; + TLocalisamfile* _atstats; + TAssoc_array* _colonne; + TAssoc_array* _categorie; + TArray _righe; + TString16 _sezini, _sotini, _sezfin, _sotfin; + TDate _dataini, _datafin; + +protected: + virtual bool create(); + virtual bool destroy(); + virtual bool menu(MENU_TAG m); + virtual TMask& get_mask() { return *_msk; } + virtual TRelation* get_relation() const { return _rel; } + int data2row(const TString16 catdon); + bool riepilogo(); + bool stampa(); + bool crea_colonne(); + bool crea_righe(); + void azzera_righe(); + void stampa_sezione(TString16 codsez, TString16 codsot); + void crea_intestazione(); +public: + TStatSogxCat() {} + +}; + +HIDDEN inline TStatSogxCat& app() { return (TStatSogxCat&) main_app(); } + +int TStatSogxCat::data2row(const TString16 catdon) +{ + real& indicer = (real&)_categorie->find((const char*) catdon); + return indicer.integer(); +} + +bool TStatSogxCat::crea_colonne() +{ + _colonne->destroy(); + real contatore(ZERO); + real* oggetto = new real(contatore); + const char* indice = "N"; // nuovi + _colonne->add(indice,(TObject*)oggetto); + indice = "T"; // totale + contatore = contatore+1; + real* oggetto2 = new real(contatore); + _colonne->add(indice,(TObject*)oggetto2); + return TRUE; +} + +bool TStatSogxCat::crea_righe() +{ + TTable ctd("CTD"); + TString16 catdon = "**"; + int indice = 0; + _categorie->destroy(); + real* oggetto1 = new real(indice); + _categorie->add((const char*) catdon, (TObject*) oggetto1); + _righe.add(new TRigaSxCat(catdon), indice); + for (ctd.first(); !ctd.eof(); ctd.next()) + { + indice++; + catdon = ctd.get("CODTAB"); + _righe.add(new TRigaSxCat(catdon), indice); + real* oggetto = new real(indice); + _categorie->add((const char*) catdon,(TObject*) oggetto); + } + return _righe.items()>0; +} + +bool TStatSogxCat::create() +{ + TApplication::create(); + _msk = new TMask("at3300a"); + _rel = new TRelation(LF_SOGGETTI); + _soggetti = new TLocalisamfile(LF_SOGGETTI); + _atstats = new TLocalisamfile(LF_ATSTATS); + _sezioni = new TLocalisamfile(LF_SEZIONI); + _colonne = new TAssoc_array(); + _categorie = new TAssoc_array(); + dispatch_e_menu(BAR_ITEM(1)); + return TRUE; +} + +bool TStatSogxCat::destroy() +{ + delete _rel; + delete _msk; + delete _soggetti; + delete _atstats; + delete _sezioni; + delete _colonne; + delete _categorie; + return TApplication::destroy(); +} + +bool TStatSogxCat::menu(MENU_TAG m) +{ + TMask& msk = get_mask(); + KEY tasto; + tasto = msk.run(); + if (tasto == K_ENTER) + { + _sezini = _msk->get(F_SEZINI); + _sotini = _msk->get(F_SOTINI); + _sezfin = _msk->get(F_SEZFIN); + _sotfin = _msk->get(F_SOTFIN); + _dataini = _msk->get_date(F_DATAINI); + _datafin = _msk->get_date(F_DATAFIN); + if (riepilogo()) + stampa(); + } + return FALSE; +} + +void TStatSogxCat::crea_intestazione() +{ + TPrintrow row; + TString256 sep; + sep = "STATISTICA SOGGETTI PER CATEGORIA"; + sep.center_just(80); + row.put(sep); + row.put("@>", 1); + row.put("Pag. @#", 70); + printer().setheaderline(2, row); + sep = "dal "; + sep << _dataini.string(); + sep << " al "; + sep << _datafin.string(); + sep.center_just(80); + row.reset(); + row.put(sep); + printer().setheaderline(3, row); + sep = ""; + sep << "Categoria Nuovi Totale"; + row.reset(); + row.put(sep); + printer().setheaderline(5, row); + sep = ""; + sep.fill('-'); + row.reset(); + row.put(sep); + printer().setheaderline(6, row); +} + +bool TStatSogxCat::stampa() +{ + if (printer().open()) + { + crea_intestazione(); + TRelation* relstat = new TRelation(LF_ATSTATS); + TCursor* curstat = new TCursor(relstat, "", 1); + TString16 oldsez = "**"; + TString16 oldsot = "**"; + double numero, numero2; + TString16 actsez, actsot; + TString16 catdon; + long last = curstat->items(); + for ( *curstat=0; curstat->pos() < last; ++(*curstat) ) + { + actsez = curstat->curr().get(ATSS_CODSEZ); + actsot = curstat->curr().get(ATSS_CODSOT); + catdon = curstat->curr().get(ATSS_CATDON); + numero = (double)curstat->curr().get_int(ATSS_NUMERO); + numero2 = (double)curstat->curr().get_int(ATSS_NUMERO2); + if (actsez != oldsez || actsot != oldsot) + { + if (oldsez != "**" && oldsot != "**") + { + stampa_sezione(oldsez,oldsot); + azzera_righe(); + } + oldsez = actsez; + oldsot = actsot; + } + if (catdon.empty()) + catdon = "**"; + TRigaSxCat& riga = (TRigaSxCat&)_righe[data2row(catdon)]; + const char* indicen = "N"; + real& colonnan = (real&)_colonne->find(indicen); + real n = numero; + riga.aggiorna_valore(colonnan.integer(),n); + const char* indicet = "T"; + real& colonnat = (real&)_colonne->find(indicet); + n = numero2; + riga.aggiorna_valore(colonnat.integer(),n); + } + if (oldsez != "**" && oldsot != "**") + stampa_sezione(oldsez,oldsot); + delete curstat; + delete relstat; + printer().close(); + return TRUE; + } + else + return FALSE; +} + +void TStatSogxCat::azzera_righe() +{ + TString16 catdon = "**"; + int indice = data2row(catdon); + TRigaSxCat& riga = (TRigaSxCat&)_righe[indice]; + riga.azzera_valori(); + TTable ctd("CTD"); + for (ctd.first(); !ctd.eof(); ctd.next()) + { + catdon = ctd.get("CODTAB"); + indice = data2row(catdon); + TRigaSxCat& riga = (TRigaSxCat&)_righe[indice]; + riga.azzera_valori(); + } +} + +void TStatSogxCat::stampa_sezione(TString16 codsez, TString16 codsot) +{ + TPrintrow row; + TString256 rigastampa; + rigastampa = "Sezione: "; + rigastampa << codsez; + if (codsot.not_empty()) + { + rigastampa << "/"; + rigastampa << codsot; + } + rigastampa << " "; + TLocalisamfile sezioni(LF_SEZIONI); + sezioni.setkey(1); + sezioni.zero(); + sezioni.put(SEZ_CODSEZ,codsez); + sezioni.put(SEZ_CODSOT,codsot); + if (sezioni.read() == NOERR) + { + TString80 den = sezioni.get(SEZ_DENSEZ); + rigastampa << den; + den = sezioni.get(SEZ_DENSOT); + if (den.not_empty()) + { + rigastampa << "/"; + rigastampa << den; + } + } + rigastampa.center_just(80); + row.put(rigastampa); + printer().setheaderline(1, row); + + TRigaSxCat rigatotali(" "); + TString16 valore; + TString16 catdon; + + TTable ctd("CTD"); + for (ctd.first(); !ctd.eof(); ctd.next()) + { + TString16 catdon = ctd.get("CODTAB"); + TRigaSxCat& riga = (TRigaSxCat&)_righe[data2row(catdon)]; + row.reset(); + rigastampa = ""; + rigastampa << catdon; + rigastampa << " "; + rigastampa << ctd.get("S0"); + int pos = 41; + const char* indicen = "N"; + real& colonnan = (real&)_colonne->find(indicen); + rigatotali.aggiorna_valore(colonnan.integer(),riga[colonnan.integer()]); + valore = ""; + valore.format("%8d",riga[colonnan.integer()].integer()); + rigastampa.overwrite((const char*)valore, pos); + pos = pos+8; + const char* indicet = "T"; + real& colonnat = (real&)_colonne->find(indicet); + rigatotali.aggiorna_valore(colonnat.integer(),riga[colonnat.integer()]); + valore = ""; + valore.format("%8d",riga[colonnat.integer()].integer()); + rigastampa.overwrite((const char*)valore, pos); + pos = pos+8; + row.put((const char*) rigastampa); + printer().print(row); + } + + // stampa totali per sezione + rigastampa = ""; + rigastampa.fill('-'); + row.reset(); + row.put(rigastampa); + printer().print(row); + row.reset(); + rigastampa = ""; + rigastampa = "Totale"; + int pos = 41; + const char* indicen = "N"; + real& colonnan = (real&)_colonne->find(indicen); + valore = ""; + valore.format("%8d",rigatotali[colonnan.integer()].integer()); + rigastampa.overwrite((const char*)valore, pos); + pos = pos+8; + const char* indicet = "T"; + real& colonnat = (real&)_colonne->find(indicet); + valore = ""; + valore.format("%8d",rigatotali[colonnat.integer()].integer()); + rigastampa.overwrite((const char*)valore, pos); + pos = pos+8; + row.put((const char*) rigastampa); + printer().print(row); + printer().formfeed(); +} + +bool TStatSogxCat::riepilogo() +{ + if (crea_colonne() && crea_righe()) + { + // cancello i risultati della elaborazione precedente + TLocalisamfile stat(LF_ATSTATS); + for (stat.first(); !stat.eof(); stat.next()) + stat.remove(); + stat.setkey(1); + _cur = new TCursor(_rel, "", 1); + TString256 filtro = ""; + + // filtro per sezione/sottogruppo + if (_sezini.not_empty()) + { + if (filtro.empty()) + filtro = format("(90->CODSEZ >= \"%s\")",(const char*)_sezini); + else + { + filtro << " && "; + filtro << format("(90->CODSEZ >= \"%s\")",(const char*)_sezini); + } + if (_sotini.not_empty()) + { + if (filtro.empty()) + filtro = format("(90->CODSOT >= \"%s\")",(const char*)_sotini); + else + { + filtro << " && "; + filtro << format("(90->CODSOT >= \"%s\")",(const char*)_sotini); + } + } + } + if (_sezfin.not_empty()) + { + if (filtro.empty()) + filtro = format("(90->CODSEZ <= \"%s\")",(const char*)_sezfin); + else + { + filtro << " && "; + filtro << format("(90->CODSEZ <= \"%s\")",(const char*)_sezfin); + } + if (_sotfin.not_empty()) + { + if (filtro.empty()) + filtro = format("(90->CODSOT <= \"%s\")",(const char*)_sotfin); + else + { + filtro << " && "; + filtro << format("(90->CODSOT <= \"%s\")",(const char*)_sotfin); + } + } + } + _cur->setfilter((const char*) filtro, TRUE); + TString16 codsez, codsot; + long numero,numero2; + TString16 catdon; + TDate dataisc, datadim; + bool nuovo, totale; + TTable ctd("CTD"); + TRectype& recsog = _cur->curr(); + long last = _cur->items(); + TProgind prg (last, "Elaborazione in corso... Prego attendere", FALSE, TRUE, 30); + for ( *_cur=0; _cur->pos() < last; ++(*_cur) ) + { + prg.addstatus(1); + nuovo = FALSE; + totale = FALSE; + codsez = recsog.get(SOG_CODSEZ); + codsot = recsog.get(SOG_CODSOT); + catdon = recsog.get(SOG_CATDON); + if (catdon.not_empty()) + { + ctd.put("CODTAB",catdon); + if (ctd.read() == NOERR) + { + bool dimissione = ctd.get_bool("B0"); + if (dimissione) + { + datadim = recsog.get_date(SOG_DATADIM); + nuovo = (datadim >= _dataini && datadim <= _datafin); + totale = (datadim <= _datafin); + } + else + { + dataisc = recsog.get_date(SOG_DATAISC); + nuovo = (dataisc >= _dataini && dataisc <= _datafin); + totale = (dataisc <= _datafin); + } + } + } + stat.zero(); + stat.put(ATSS_CODSEZ, codsez); + stat.put(ATSS_CODSOT, codsot); + stat.put(ATSS_CATDON, catdon); + if (stat.read() == NOERR) + { + numero = stat.get_long(ATSS_NUMERO); + numero2 = stat.get_long(ATSS_NUMERO2); + if (nuovo) + numero++; + if (totale) + numero2++; + stat.put(ATSS_NUMERO, numero); + stat.put(ATSS_NUMERO2, numero2); + stat.rewrite(); + } + else + { + stat.put(ATSS_CODSEZ, codsez); + stat.put(ATSS_CODSOT, codsot); + stat.put(ATSS_CATDON, catdon); + if (nuovo) + numero = 1; + else + numero = 0; + if (totale) + numero2 = 1; + else + numero2 = 0; + stat.put(ATSS_NUMERO, numero); + stat.put(ATSS_NUMERO2, numero2); + stat.write(); + } + } + return (stat.eod() > 0); + } + else + return FALSE; +} + +int at3300(int argc, char* argv[]) +{ + TStatSogxCat a; + a.run(argc, argv, "Statistica soggetti per categoria"); + return 0; +} \ No newline at end of file diff --git a/at/at3300a.h b/at/at3300a.h new file mode 100755 index 000000000..4ce31e0bb --- /dev/null +++ b/at/at3300a.h @@ -0,0 +1,14 @@ +// statistica SOGGETTI PER CATEGORIE con nuovi iscritti +// definizione campi per maschera di selezione + +#define F_SEZINI 101 +#define F_D_SEZINI 102 +#define F_SOTINI 103 +#define F_D_SOTINI 104 +#define F_SEZFIN 105 +#define F_D_SEZFIN 106 +#define F_SOTFIN 107 +#define F_D_SOTFIN 108 + +#define F_DATAINI 301 +#define F_DATAFIN 302 diff --git a/at/at3300a.uml b/at/at3300a.uml new file mode 100755 index 000000000..b07f749fe --- /dev/null +++ b/at/at3300a.uml @@ -0,0 +1,146 @@ +#include "at3300a.h" + +PAGE "Statistica donatori per categoria" -1 -1 78 12 + +GROUPBOX DLG_NULL 77 4 +BEGIN + PROMPT 1 1 "Scelta sezioni/sottogruppi" +END + +STRING F_SEZINI 2 +BEGIN + PROMPT 2 2 "Da " + FLAGS "U" + USE LF_SEZIONI + INPUT CODSEZ F_SEZINI + INPUT CODSOT F_SOTINI + DISPLAY "Cod.sez" CODSEZ + DISPLAY "Cod.sot." CODSOT + DISPLAY "Sezione@25" DENSEZ + DISPLAY "Sottogruppo@25" DENSOT + OUTPUT F_SEZINI CODSEZ + OUTPUT F_D_SEZINI DENSEZ + OUTPUT F_SOTINI CODSOT + OUTPUT F_D_SOTINI DENSOT + CHECKTYPE SEARCH + HELP "Codice sezione da cui partire" +END + +STRING F_D_SEZINI 25 +BEGIN + PROMPT 11 2 "" + FLAGS "U" + USE LF_SEZIONI KEY 2 + INPUT DENSEZ F_D_SEZINI + DISPLAY "Sezione@25" DENSEZ + DISPLAY "Sottogruppo@25" DENSOT + DISPLAY "Cod.sez" CODSEZ + DISPLAY "Cod.sot." CODSOT + COPY OUTPUT F_SEZINI + CHECKTYPE NORMAL + HELP "Sezione da cui partire" +END + +STRING F_SOTINI 2 +BEGIN + PROMPT 2 3 " " + COPY ALL F_SEZINI + CHECKTYPE SEARCH + HELP "Codice sottogruppo da cui partire" +END + +STRING F_D_SOTINI 25 +BEGIN + PROMPT 11 3 "" + FLAGS "U" + COPY USE F_D_SEZINI + INPUT DENSEZ F_D_SEZINI + INPUT DENSOT F_D_SOTINI + COPY DISPLAY F_D_SEZINI + COPY OUTPUT F_D_SEZINI + CHECKTYPE NORMAL + HELP "Sottogruppo da cui partire" +END + +STRING F_SEZFIN 2 +BEGIN + PROMPT 41 2 "A " + FLAGS "U" + USE LF_SEZIONI + INPUT CODSEZ F_SEZFIN + INPUT CODSOT F_SOTFIN + DISPLAY "Cod.sez" CODSEZ + DISPLAY "Cod.sot." CODSOT + DISPLAY "Sezione@25" DENSEZ + DISPLAY "Sottogruppo@25" DENSOT + OUTPUT F_SEZFIN CODSEZ + OUTPUT F_D_SEZFIN DENSEZ + OUTPUT F_SOTFIN CODSOT + OUTPUT F_D_SOTFIN DENSOT + CHECKTYPE SEARCH + HELP "Codice sezione finale" +END + +STRING F_D_SEZFIN 25 +BEGIN + PROMPT 49 2 "" + FLAGS "U" + USE LF_SEZIONI KEY 2 + INPUT DENSEZ F_D_SEZFIN + DISPLAY "Sezione@25" DENSEZ + DISPLAY "Sottogruppo@25" DENSOT + DISPLAY "Cod.sez" CODSEZ + DISPLAY "Cod.sot." CODSOT + COPY OUTPUT F_SEZFIN + CHECKTYPE NORMAL + HELP "Sezione finale" +END + +STRING F_SOTFIN 2 +BEGIN + PROMPT 41 3 " " + COPY ALL F_SEZFIN + CHECKTYPE SEARCH + HELP "Codice sottogruppo finale" +END + +STRING F_D_SOTFIN 25 +BEGIN + PROMPT 49 3 "" + FLAGS "U" + COPY USE F_D_SEZFIN + INPUT DENSEZ F_D_SEZFIN + INPUT DENSOT F_D_SOTFIN + COPY DISPLAY F_D_SEZFIN + COPY OUTPUT F_D_SEZFIN + CHECKTYPE NORMAL + HELP "Sottogruppo finale" +END + +GROUPBOX DLG_NULL 77 3 +BEGIN + PROMPT 1 5 "Opzioni per la statistica" +END + +DATE F_DATAINI +BEGIN + PROMPT 2 6 "Segnala i cambi di categoria dal " +END + +DATE F_DATAFIN +BEGIN + PROMPT 50 6 "al " +END + +BUTTON DLG_OK 9 2 +BEGIN + PROMPT -12 -1 "" +END + +BUTTON DLG_QUIT 9 2 +BEGIN + PROMPT -22 -1 "" +END + +ENDPAGE +ENDMASK diff --git a/at/at3400.cpp b/at/at3400.cpp new file mode 100755 index 000000000..ecf62a3c4 --- /dev/null +++ b/at/at3400.cpp @@ -0,0 +1,698 @@ +#include +//#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "at3.h" + +// nomi campi maschera +#include "at3400a.h" + +// nomi dei campi +#include "soggetti.h" +#include "donaz.h" +#include "atstatd.h" +#include "sezioni.h" + +// classe per la definizione di una riga di statistica +class TRiga : public TObject +{ + int _anno, _mese; + TArray _valori; + +protected: + const TRiga& copy(const TRiga& riga); +public: + const int anno() const { return _anno; } + const int mese() const { return _mese; } + TObject* dup() const { return new TRiga(*this); } + const TRiga& operator = (const TRiga& riga); + const real& operator [] (int colonna) const; + void aggiorna_valore(int colonna, const real& numero) ; + void azzera_valori(); + // costruttore + TRiga(int anno, int mese) {_anno = anno; _mese = mese;} + // costruttore di copia + TRiga(const TRiga& riga) { copy(riga); } + virtual ~TRiga() {}; +}; + +const TRiga& TRiga::copy(const TRiga& riga) +{ + _anno = riga._anno; + _mese = riga._mese; + _valori = riga._valori; + return (*this); +} + +const TRiga& TRiga::operator = (const TRiga& riga) +{ + copy(riga); + return (*this); +} + +const real& TRiga::operator [] (int colonna) const +{ + real* valore = (real*)_valori.objptr(colonna); + if (valore == NULL) + return ZERO; + else + return *valore; +} + +void TRiga::aggiorna_valore(int colonna, const real& numero) +{ + real* valore = (real*)_valori.objptr(colonna); + if (valore == NULL) + _valori.add(new real(numero), colonna); + else + *valore += numero; +} + +void TRiga::azzera_valori() +{ + _valori.destroy(); +} + +class TRiepilogoDonazioni : public TApplication +{ + TMask* _msk; + TRelation* _rel; + TCursor* _cur; + TLocalisamfile* _sezioni; + TLocalisamfile* _soggetti; + TLocalisamfile* _donaz; + TLocalisamfile* _atstatd; + TDate _dataini, _datafin; + bool _primedon; + bool _perpunto; + TAssoc_array* _colonne; + TArray _righe; // array per riepilogo donazioni + TArray _righe_prime; // array per riepilogo prime don + TString16 _sezini, _sotini, _sezfin, _sotfin; + +protected: + virtual bool create(); + virtual bool destroy(); + virtual bool menu(MENU_TAG m); + virtual TMask& get_mask() { return *_msk; } + virtual TRelation* get_relation() const { return _rel; } + int data2row(const int anno, const int mese); + bool riepilogo(); + bool stampa(); + bool crea_colonne(); + bool crea_righe(); + void azzera_righe(); + void stampa_sezione(TString16 codsez, TString16 codsot); + void crea_intestazione(); + TString16 int2month(const int month); +public: + TRiepilogoDonazioni() {} + +}; + +HIDDEN inline TRiepilogoDonazioni& app() { return (TRiepilogoDonazioni&) main_app(); } + +TString16 TRiepilogoDonazioni::int2month(const int month) +{ + TString16 mese = ""; + switch (month) + { + case 1: + mese << "GENNAIO "; + break; + case 2: + mese << "FEBBRAIO "; + break; + case 3: + mese << "MARZO "; + break; + case 4: + mese << "APRILE "; + break; + case 5: + mese << "MAGGIO "; + break; + case 6: + mese << "GIUGNO "; + break; + case 7: + mese << "LUGLIO "; + break; + case 8: + mese << "AGOSTO "; + break; + case 9: + mese << "SETTEMBRE"; + break; + case 10: + mese << "OTTOBRE "; + break; + case 11: + mese << "NOVEMBRE "; + break; + case 12: + mese << "DICEMBRE "; + break; + } + return mese; +} + +int TRiepilogoDonazioni::data2row(const int anno, const int mese) +{ + const int annoini = _dataini.year(); + return (anno-annoini)*12 + mese; +} + +bool TRiepilogoDonazioni::crea_colonne() +{ + _colonne->destroy(); + TTable tdn("TDN"); + real contatore(ZERO); + for (tdn.first(); !tdn.eof(); tdn.next()) + { + real* oggetto = new real(contatore); + _colonne->add((const char*)tdn.get("CODTAB"),(TObject*)oggetto); + contatore+=1; + } + return !tdn.empty(); +} + +bool TRiepilogoDonazioni::crea_righe() +{ + int anno = _dataini.year(); + int meseini, mesefin; + while (anno<=_datafin.year()) + { + if (anno == _dataini.year()) + meseini = _dataini.month(); + else + meseini = 1; + if (anno == _datafin.year()) + mesefin = _datafin.month(); + else + mesefin = 12; + for (int mese=meseini;mese<=mesefin;mese++) + { + _righe.add(new TRiga(anno, mese), data2row(anno, mese)); + if (_primedon) + _righe_prime.add(new TRiga(anno, mese), data2row(anno, mese)); + } + anno++; + } + return _righe.items()>0; +} + +bool TRiepilogoDonazioni::create() +{ + TApplication::create(); + _msk = new TMask("at3400a"); + _rel = new TRelation(LF_DONAZ); + _rel->add(LF_SOGGETTI, "CODICE==CODICE"); + _soggetti = new TLocalisamfile(LF_SOGGETTI); + _donaz = new TLocalisamfile(LF_DONAZ); + _atstatd = new TLocalisamfile(LF_ATSTATD); + _sezioni = new TLocalisamfile(LF_SEZIONI); + _colonne = new TAssoc_array(); + dispatch_e_menu(BAR_ITEM(1)); + return TRUE; +} + +bool TRiepilogoDonazioni::destroy() +{ + delete _rel; + delete _msk; + delete _soggetti; + delete _donaz; + delete _atstatd; + delete _sezioni; + delete _colonne; + return TApplication::destroy(); +} + +bool TRiepilogoDonazioni::menu(MENU_TAG m) +{ + TMask& msk = get_mask(); + KEY tasto; + tasto = msk.run(); + if (tasto == K_ENTER) + { + _dataini = msk.get(F_DATAINI); + _datafin = msk.get(F_DATAFIN); + _primedon = msk.get_bool(F_PRIMEDON); + //_perpunto = msk.get_bool(F_PERPUNTO); + _sezini = _msk->get(F_SEZINI); + _sotini = _msk->get(F_SOTINI); + _sezfin = _msk->get(F_SEZFIN); + _sotfin = _msk->get(F_SOTFIN); + if (riepilogo()) + stampa(); + } + return FALSE; +} + +void TRiepilogoDonazioni::crea_intestazione() +{ + TPrintrow row; + TString256 sep; + sep = "MENSILE DONAZIONI"; + //if (_perpunto) + // sep << " PER PUNTO PRELIEVO"; + if (_dataini.ok()) + { + sep << " dal "; + sep << _dataini.string(); + } + if (_datafin.ok()) + { + sep << " al "; + sep << _datafin.string(); + } + sep.center_just(80); + row.put(sep); + row.put("@>", 1); + row.put("Pag. @#", 70); + printer().setheaderline(2, row); + row.reset(); + printer().setheaderline(3, row); + sep = "Mese "; + TTable tdn("TDN"); + int pos = 27; + for (tdn.first(); !tdn.eof(); tdn.next()) + { + sep.overwrite((const char*)tdn.get("CODTAB"),pos); + pos = pos+10; + } + sep.overwrite("Totale",pos); + row.put(sep); + printer().setheaderline(5, row); + sep = ""; + sep.fill('-'); + row.reset(); + row.put(sep); + printer().setheaderline(6, row); +} + +bool TRiepilogoDonazioni::stampa() +{ + if (printer().open()) + { + crea_intestazione(); + TRelation* relstat = new TRelation(LF_ATSTATD); + TCursor* curstat = new TCursor(relstat, "", 2); + TString16 oldsez = "**"; + TString16 oldsot = "**"; + double numero, numprime; + TString16 actsez, actsot; + TString16 tipodon; + int anno, mese; + long last = curstat->items(); + for ( *curstat=0; curstat->pos() < last; ++(*curstat) ) + { + actsez = curstat->curr().get(ATS_CODSEZ); + actsot = curstat->curr().get(ATS_CODSOT); + anno = curstat->curr().get_int(ATS_ANNO); + mese = curstat->curr().get_int(ATS_MESE); + tipodon = curstat->curr().get(ATS_TIPODON); + numero = (double)curstat->curr().get_int(ATS_NUMERO); + numprime = (double)curstat->curr().get_int(ATS_NUMPRIME); + if (actsez != oldsez || actsot != oldsot) + { + if (oldsez != "**" && oldsot != "**") + { + stampa_sezione(oldsez,oldsot); + azzera_righe(); + } + oldsez = actsez; + oldsot = actsot; + } + TRiga& riga = (TRiga&)_righe[data2row(anno,mese)]; + real& colonna = (real&)_colonne->find((const char*)tipodon); + real n = numero; + riga.aggiorna_valore(colonna.integer(),n); + if (_primedon) + { + TRiga& riga_prime = (TRiga&)_righe_prime[data2row(anno,mese)]; + n = numprime; + riga_prime.aggiorna_valore(colonna.integer(), n); + } + } + if (oldsez != "**" && oldsot != "**") + stampa_sezione(oldsez,oldsot); + delete curstat; + delete relstat; + printer().close(); + return TRUE; + } + else + return FALSE; +} + +void TRiepilogoDonazioni::azzera_righe() +{ + int anno = _dataini.year(); + int meseini, mesefin; + while (anno<=_datafin.year()) + { + if (anno == _dataini.year()) + meseini = _dataini.month(); + else + meseini = 1; + if (anno == _datafin.year()) + mesefin = _datafin.month(); + else + mesefin = 12; + for (int mese=meseini;mese<=mesefin;mese++) + { + TRiga& riga = (TRiga&)_righe[data2row(anno,mese)]; + riga.azzera_valori(); + if (_primedon) + { + TRiga& riga_prime = (TRiga&)_righe_prime[data2row(anno,mese)]; + riga_prime.azzera_valori(); + } + } + anno++; + } +} + +void TRiepilogoDonazioni::stampa_sezione(TString16 codsez, TString16 codsot) +{ + TPrintrow row; + TString256 rigastampa; + rigastampa = "Sezione: "; + rigastampa << codsez; + if (codsot.not_empty()) + { + rigastampa << "/"; + rigastampa << codsot; + } + rigastampa << " "; + TLocalisamfile sezioni(LF_SEZIONI); + sezioni.setkey(1); + sezioni.zero(); + sezioni.put(SEZ_CODSEZ,codsez); + sezioni.put(SEZ_CODSOT,codsot); + if (sezioni.read() == NOERR) + { + TString80 den = sezioni.get(SEZ_DENSEZ); + rigastampa << den; + den = sezioni.get(SEZ_DENSOT); + if (den.not_empty()) + { + rigastampa << "/"; + rigastampa << den; + } + } + rigastampa.center_just(80); + row.put(rigastampa); + printer().setheaderline(1, row); + + TRiga rigatotali(0,0); + int anno = _dataini.year(); + int meseini, mesefin; + real totalemese = ZERO; + TString16 valore; + while (anno<=_datafin.year()) + { + if (anno == _dataini.year()) + meseini = _dataini.month(); + else + meseini = 1; + if (anno == _datafin.year()) + mesefin = _datafin.month(); + else + mesefin = 12; + for (int mese=meseini;mese<=mesefin;mese++) + { + TRiga& riga = (TRiga&)_righe[data2row(anno,mese)]; + row.reset(); + rigastampa = ""; + rigastampa.format("%s %4d", (const char*)int2month(mese), anno); + totalemese = ZERO; + int pos = 21; + for (int i=0;i<_colonne->items();i++) + { + rigatotali.aggiorna_valore(i,riga[i]); + totalemese+=riga[i]; + valore = ""; + valore.format("%8d",riga[i].integer()); + rigastampa.overwrite((const char*)valore, pos); + pos = pos+10; + } + valore = ""; + valore.format("%8d",totalemese.integer()); + rigastampa.overwrite((const char*)valore, pos+4); + row.put((const char*) rigastampa); + printer().print(row); + } + anno++; + } + // stampa totali per sezione + rigastampa = ""; + rigastampa.fill('-'); + row.reset(); + row.put(rigastampa); + printer().print(row); + row.reset(); + rigastampa = ""; + rigastampa = "Totale periodo"; + totalemese = ZERO; + int pos = 21; + for (int i=0;i<_colonne->items();i++) + { + totalemese+=rigatotali[i]; + valore = ""; + valore.format("%8d",rigatotali[i].integer()); + rigastampa.overwrite((const char*)valore, pos); + pos = pos+10; + } + valore = ""; + valore.format("%8d",totalemese.integer()); + rigastampa.overwrite((const char*)valore, pos+4); + row.put((const char*) rigastampa); + printer().print(row); + + if (_primedon) + { + rigatotali.azzera_valori(); + row.reset(); + printer().print(row); + printer().print(row); + printer().print(row); + printer().print(row); + //printer().skip(4); + rigastampa = "RIEPILOGO PRIME DONAZIONI"; + rigastampa.center_just(); + row.put(rigastampa); + row.reset(); + row.put(rigastampa); + printer().print(row); + rigastampa = ""; + rigastampa.fill('-'); + row.reset(); + row.put(rigastampa); + printer().print(row); + row.reset(); + printer().print(row); + anno = _dataini.year(); + while (anno<=_datafin.year()) + { + if (anno == _dataini.year()) + meseini = _dataini.month(); + else + meseini = 1; + if (anno == _datafin.year()) + mesefin = _datafin.month(); + else + mesefin = 12; + for (int mese=meseini;mese<=mesefin;mese++) + { + TRiga& riga = (TRiga&)_righe_prime[data2row(anno,mese)]; + row.reset(); + rigastampa = ""; + rigastampa.format("%s %4d", (const char*)int2month(mese), anno); + totalemese = ZERO; + int pos = 21; + for (int i=0;i<_colonne->items();i++) + { + rigatotali.aggiorna_valore(i,riga[i]); + totalemese+=riga[i]; + valore = ""; + valore.format("%8d",riga[i].integer()); + rigastampa.overwrite((const char*)valore, pos); + pos = pos+10; + } + valore = ""; + valore.format("%8d",totalemese.integer()); + rigastampa.overwrite((const char*)valore, pos+4); + row.put((const char*) rigastampa); + printer().print(row); + } + anno++; + } + // stampa totali per sezione + rigastampa = ""; + rigastampa.fill('-'); + row.reset(); + row.put(rigastampa); + printer().print(row); + row.reset(); + rigastampa = ""; + rigastampa = "Totale periodo"; + totalemese = ZERO; + int pos = 21; + for (int i=0;i<_colonne->items();i++) + { + totalemese+=rigatotali[i]; + valore = ""; + valore.format("%8d",rigatotali[i].integer()); + rigastampa.overwrite((const char*)valore, pos); + pos = pos+10; + } + valore = ""; + valore.format("%8d",totalemese.integer()); + rigastampa.overwrite((const char*)valore, pos+4); + row.put((const char*) rigastampa); + printer().print(row); + } + printer().formfeed(); +} + +bool TRiepilogoDonazioni::riepilogo() +{ + if (crea_colonne() && crea_righe()) + { + // cancello i risultati della elaborazione precedente + TLocalisamfile stat(LF_ATSTATD); + for (stat.first(); !stat.eof(); stat.next()) + stat.remove(); + stat.setkey(2); + // filtro per data + TRectype da(LF_DONAZ); + TRectype a (LF_DONAZ); + if (_dataini.ok()) + da.put(DON_DATADON, _dataini); + if (_datafin.ok()) + a.put(DON_DATADON, _datafin); + _cur = new TCursor(_rel, "", 2, &da, &a); + TString256 filtro = ""; + + // filtro per sezione/sottogruppo + if (_sezini.not_empty()) + { + if (filtro.empty()) + filtro = format("(90->CODSEZ >= \"%s\")",(const char*)_sezini); + else + { + filtro << " && "; + filtro << format("(90->CODSEZ >= \"%s\")",(const char*)_sezini); + } + if (_sotini.not_empty()) + { + if (filtro.empty()) + filtro = format("(90->CODSOT >= \"%s\")",(const char*)_sotini); + else + { + filtro << " && "; + filtro << format("(90->CODSOT >= \"%s\")",(const char*)_sotini); + } + } + } + if (_sezfin.not_empty()) + { + if (filtro.empty()) + filtro = format("(90->CODSEZ <= \"%s\")",(const char*)_sezfin); + else + { + filtro << " && "; + filtro << format("(90->CODSEZ <= \"%s\")",(const char*)_sezfin); + } + if (_sotfin.not_empty()) + { + if (filtro.empty()) + filtro = format("(90->CODSOT <= \"%s\")",(const char*)_sotfin); + else + { + filtro << " && "; + filtro << format("(90->CODSOT <= \"%s\")",(const char*)_sotfin); + } + } + } + _cur->setfilter((const char*) filtro, TRUE); + TString16 codsez, codsot, tipodon; + TDate datadon; + int anno, mese; + long numero; + bool primadon; + TRectype& recdon = _cur->curr(); + TRectype& recsog = _cur->curr(LF_SOGGETTI); + long last = _cur->items(); + TProgind prg (last, "Elaborazione in corso... Prego attendere", FALSE, TRUE, 30); + for ( *_cur=0; _cur->pos() < last; ++(*_cur) ) + { + prg.addstatus(1); + codsez = recdon.get(DON_CODSEZ); + codsot = recdon.get(DON_CODSOT); + if (codsez.empty()) + { + codsez = recsog.get(SOG_CODSEZ); + codsot = recsog.get(SOG_CODSOT); + } + datadon = recdon.get_date(DON_DATADON); + tipodon = recdon.get(DON_TIPODON); + primadon = recdon.get_bool(DON_PRIMADON); + anno = datadon.year(); + mese = datadon.month(); + stat.zero(); + stat.put(ATS_CODSEZ, codsez); + stat.put(ATS_CODSOT, codsot); + stat.put(ATS_ANNO, anno); + stat.put(ATS_MESE, mese); + stat.put(ATS_TIPODON, tipodon); + if (stat.read() == NOERR) + { + numero = stat.get_long(ATS_NUMERO); + numero++; + stat.put(ATS_NUMERO, numero); + if (_primedon && primadon) + { + numero = stat.get_long(ATS_NUMPRIME); + numero++; + stat.put(ATS_NUMPRIME, numero); + } + stat.rewrite(); + } + else + { + stat.zero(); + stat.put(ATS_CODSEZ, codsez); + stat.put(ATS_CODSOT, codsot); + stat.put(ATS_ANNO, anno); + stat.put(ATS_MESE, mese); + stat.put(ATS_TIPODON, tipodon); + numero = 1; + stat.put(ATS_NUMERO, numero); + if (_primedon && primadon) + stat.put(ATS_NUMPRIME, numero); + stat.write(); + } + } + return (stat.eod() > 0); + } + else + return FALSE; +} + +int at3400(int argc, char* argv[]) +{ + TRiepilogoDonazioni a; + a.run(argc, argv, "Riepilogo mensile donazioni"); + return 0; +} \ No newline at end of file diff --git a/at/at3400a.h b/at/at3400a.h new file mode 100755 index 000000000..5bc4b7885 --- /dev/null +++ b/at/at3400a.h @@ -0,0 +1,16 @@ +// riepilogo mensile donazioni +// definizione campi per maschera di selezione + +#define F_SEZINI 101 +#define F_D_SEZINI 102 +#define F_SOTINI 103 +#define F_D_SOTINI 104 +#define F_SEZFIN 105 +#define F_D_SEZFIN 106 +#define F_SOTFIN 107 +#define F_D_SOTFIN 108 + +#define F_DATAINI 301 +#define F_DATAFIN 302 +#define F_PRIMEDON 303 +//#define F_PERPUNTO 304 diff --git a/at/at3400a.uml b/at/at3400a.uml new file mode 100755 index 000000000..83b8600c9 --- /dev/null +++ b/at/at3400a.uml @@ -0,0 +1,153 @@ +#include "at3400a.h" + +PAGE "Riepilogo mensile donazioni" -1 -1 78 12 + +GROUPBOX DLG_NULL 77 4 +BEGIN + PROMPT 1 1 "Scelta sezioni/sottogruppi" +END + +STRING F_SEZINI 2 +BEGIN + PROMPT 2 2 "Da " + FLAGS "U" + USE LF_SEZIONI + INPUT CODSEZ F_SEZINI + INPUT CODSOT F_SOTINI + DISPLAY "Cod.sez" CODSEZ + DISPLAY "Cod.sot." CODSOT + DISPLAY "Sezione@25" DENSEZ + DISPLAY "Sottogruppo@25" DENSOT + OUTPUT F_SEZINI CODSEZ + OUTPUT F_D_SEZINI DENSEZ + OUTPUT F_SOTINI CODSOT + OUTPUT F_D_SOTINI DENSOT + CHECKTYPE SEARCH + HELP "Codice sezione da cui partire" +END + +STRING F_D_SEZINI 25 +BEGIN + PROMPT 11 2 "" + FLAGS "U" + USE LF_SEZIONI KEY 2 + INPUT DENSEZ F_D_SEZINI + DISPLAY "Sezione@25" DENSEZ + DISPLAY "Sottogruppo@25" DENSOT + DISPLAY "Cod.sez" CODSEZ + DISPLAY "Cod.sot." CODSOT + COPY OUTPUT F_SEZINI + CHECKTYPE NORMAL + HELP "Sezione da cui partire" +END + +STRING F_SOTINI 2 +BEGIN + PROMPT 2 3 " " + COPY ALL F_SEZINI + CHECKTYPE SEARCH + HELP "Codice sottogruppo da cui partire" +END + +STRING F_D_SOTINI 25 +BEGIN + PROMPT 11 3 "" + FLAGS "U" + COPY USE F_D_SEZINI + INPUT DENSEZ F_D_SEZINI + INPUT DENSOT F_D_SOTINI + COPY DISPLAY F_D_SEZINI + COPY OUTPUT F_D_SEZINI + CHECKTYPE NORMAL + HELP "Sottogruppo da cui partire" +END + +STRING F_SEZFIN 2 +BEGIN + PROMPT 41 2 "A " + FLAGS "U" + USE LF_SEZIONI + INPUT CODSEZ F_SEZFIN + INPUT CODSOT F_SOTFIN + DISPLAY "Cod.sez" CODSEZ + DISPLAY "Cod.sot." CODSOT + DISPLAY "Sezione@25" DENSEZ + DISPLAY "Sottogruppo@25" DENSOT + OUTPUT F_SEZFIN CODSEZ + OUTPUT F_D_SEZFIN DENSEZ + OUTPUT F_SOTFIN CODSOT + OUTPUT F_D_SOTFIN DENSOT + CHECKTYPE SEARCH + HELP "Codice sezione finale" +END + +STRING F_D_SEZFIN 25 +BEGIN + PROMPT 49 2 "" + FLAGS "U" + USE LF_SEZIONI KEY 2 + INPUT DENSEZ F_D_SEZFIN + DISPLAY "Sezione@25" DENSEZ + DISPLAY "Sottogruppo@25" DENSOT + DISPLAY "Cod.sez" CODSEZ + DISPLAY "Cod.sot." CODSOT + COPY OUTPUT F_SEZFIN + CHECKTYPE NORMAL + HELP "Sezione finale" +END + +STRING F_SOTFIN 2 +BEGIN + PROMPT 41 3 " " + COPY ALL F_SEZFIN + CHECKTYPE SEARCH + HELP "Codice sottogruppo finale" +END + +STRING F_D_SOTFIN 25 +BEGIN + PROMPT 49 3 "" + FLAGS "U" + COPY USE F_D_SEZFIN + INPUT DENSEZ F_D_SEZFIN + INPUT DENSOT F_D_SOTFIN + COPY DISPLAY F_D_SEZFIN + COPY OUTPUT F_D_SEZFIN + CHECKTYPE NORMAL + HELP "Sottogruppo finale" +END + +GROUPBOX DLG_NULL 77 5 +BEGIN + PROMPT 1 5 "Opzioni per il riepilogo" +END + +DATE F_DATAINI +BEGIN + PROMPT 2 6 "Donazioni effettuate dal " + HELP "Data iniziale" +END + +DATE F_DATAFIN +BEGIN + PROMPT 40 6 "al " + HELP "Data finale" +END + +BOOLEAN F_PRIMEDON +BEGIN + PROMPT 2 7 "Riepilogo per prime donazioni" +END + +BUTTON DLG_OK 9 2 +BEGIN + PROMPT -12 -1 "" +END + +BUTTON DLG_QUIT 9 2 +BEGIN + PROMPT -22 -1 "" +END + +ENDPAGE +ENDMASK diff --git a/at/at3500.cpp b/at/at3500.cpp index 23917b5ca..6b2ff346c 100755 --- a/at/at3500.cpp +++ b/at/at3500.cpp @@ -1,360 +1,580 @@ +#include +//#include #include -#include -#include +#include +#include +#include +#include +#include +#include #include -#include "lf.h" +#include "at3.h" + +// nomi campi maschera +#include "at3500a.h" + +// nomi dei campi #include "soggetti.h" +#include "donaz.h" +#include "atstatd.h" #include "sezioni.h" -#include "at3.h" -#include "at3500a.h" +// classe per la definizione di una riga di statistica +class TRigaG : public TObject +{ + TDate _data; + TArray _valori; -#define ALIAS_LCP 100 -#define ALIAS_TCS 200 -#define IDON_SI "SI" -#define IDON_AF "AF" - -enum ts { undefined = 0, elenco = 1, etichette = 2, cartoline = 3 }; - -// definizione form per etichette -class TScadenze_form : public TForm -{ -public: - - virtual TCursor* cursor() const; - virtual TRelation* relation() const; - TPrint_section& get_body() { return section('B'); } ; - TScadenze_form(): TForm() {}; - TScadenze_form(const char* form, const char * code = "", int editlevel = 0, const char* desc = "") - : TForm(form,code,editlevel,desc) {}; - virtual ~TScadenze_form() {}; -}; - -class TScadenze_application : public TPrintapp -{ - TRelation* _rel; - TMask* _msk; - TScadenze_form* _form_eti; - TAssoc_array _categorie; - - int _cur1, _cur2, _cur3, _cur4; - TParagraph_string _cognome_nome; - TDate _data_stampa; - TDate _dataini, _datafin; - TString16 _procdon; - ts _tipo_stampa; - TString16 _codsez, _codsot; - - static bool filter_func_scadenze(const TRelation* rel); - protected: - virtual bool user_create(); - virtual bool user_destroy(); - virtual bool set_print(int m); - virtual void set_page(int file, int cnt); - virtual bool preprocess_page(int file, int counter); - + const TRigaG& copy(const TRigaG& riga); public: - void crea_intestazione(); - void filtra_sezioni(); - void header_sezione(TString16 codsez, TString16 codsot); - TMask& app_mask() { return *_msk; } - TScadenze_application() : _data_stampa(TODAY), _cognome_nome("",25) {} + const TDate data() const { return _data; } + TObject* dup() const { return new TRigaG(*this); } + const TRigaG& operator = (const TRigaG& riga); + const real& operator [] (int colonna) const; + void aggiorna_valore(int colonna, const real& numero) ; + void azzera_valori(); + // costruttore + TRigaG(TDate data) {_data = data;} + // costruttore di copia + TRigaG(const TRigaG& riga) { copy(riga); } + virtual ~TRigaG() {}; }; -HIDDEN inline TScadenze_application& app() { return (TScadenze_application&) main_app(); } - -TCursor* TScadenze_form::cursor() const { return app().current_cursor(); } - -TRelation* TScadenze_form::relation() const { return cursor()->relation(); } - -void TScadenze_application::filtra_sezioni() +const TRigaG& TRigaG::copy(const TRigaG& riga) { - TString16 sezini = _msk->get(F_SEZINI); - TString16 sotini = _msk->get(F_SOTINI); - TString16 sezfin = _msk->get(F_SEZFIN); - TString16 sotfin = _msk->get(F_SOTFIN); - select_cursor(_cur4); - TLocalisamfile& fl = current_cursor()->file(LF_SOGGETTI); - TRectype da(fl.curr()); - TRectype a(fl.curr()); - da.zero(); - a.zero(); - if ((sezini.not_empty()) && (sezini.ok())) - da.put(SOG_CODSEZ, sezini); - if ((sotini.not_empty()) && (sotini.ok())) - da.put(SOG_CODSOT, sotini); - if ((sezfin.not_empty()) && (sezfin.ok())) - a.put(SOG_CODSEZ, sezfin); - if ((sotfin.not_empty()) && (sotfin.ok())) - a.put(SOG_CODSOT, sotfin); - current_cursor()->setregion(da, a); + _data = riga._data; + _valori = riga._valori; + return (*this); +} + +const TRigaG& TRigaG::operator = (const TRigaG& riga) +{ + copy(riga); + return (*this); +} + +const real& TRigaG::operator [] (int colonna) const +{ + real* valore = (real*)_valori.objptr(colonna); + if (valore == NULL) + return ZERO; + else + return *valore; +} + +void TRigaG::aggiorna_valore(int colonna, const real& numero) +{ + real* valore = (real*)_valori.objptr(colonna); + if (valore == NULL) + _valori.add(new real(numero), colonna); + else + *valore += numero; +} + +void TRigaG::azzera_valori() +{ + _valori.destroy(); +} + +class TRiepilogoGiornaliero : public TApplication +{ + TMask* _msk; + TRelation* _rel; + TCursor* _cur; + TLocalisamfile* _sezioni; + TLocalisamfile* _soggetti; + TLocalisamfile* _donaz; + TLocalisamfile* _atstatd; + bool _primedon; + TDate _dataini, _datafin; + TAssoc_array* _colonne; + TArray _righe; // array per riepilogo donazioni + TArray _righe_prime; // array per riepilogo prime don + TString16 _sezini, _sotini, _sezfin, _sotfin; + +protected: + virtual bool create(); + virtual bool destroy(); + virtual bool menu(MENU_TAG m); + virtual TMask& get_mask() { return *_msk; } + virtual TRelation* get_relation() const { return _rel; } + int data2row(const TDate data) { return data-_dataini; } + bool riepilogo(); + bool stampa(); + bool crea_colonne(); + bool crea_righe(); + void azzera_righe(); + void stampa_sezione(TString16 codsez, TString16 codsot); + void crea_intestazione(); +public: + TRiepilogoGiornaliero() {} + +}; + +HIDDEN inline TRiepilogoGiornaliero& app() { return (TRiepilogoGiornaliero&) main_app(); } + +bool TRiepilogoGiornaliero::crea_colonne() +{ + _colonne->destroy(); + TTable tdn("TDN"); + real contatore(ZERO); + for (tdn.first(); !tdn.eof(); tdn.next()) + { + real* oggetto = new real(contatore); + _colonne->add((const char*)tdn.get("CODTAB"),(TObject*)oggetto); + contatore+=1; + } + return !tdn.empty(); +} + +bool TRiepilogoGiornaliero::crea_righe() +{ + TDate data = _dataini; + while (data<=_datafin) + { + _righe.add(new TRigaG(data), data2row(data)); + if (_primedon) + _righe_prime.add(new TRigaG(data), data2row(data)); + ++data; + } + return _righe.items()>0; +} + +bool TRiepilogoGiornaliero::create() +{ + TApplication::create(); + _msk = new TMask("at3500a"); + _rel = new TRelation(LF_DONAZ); + _rel->add(LF_SOGGETTI, "CODICE==CODICE"); + _soggetti = new TLocalisamfile(LF_SOGGETTI); + _donaz = new TLocalisamfile(LF_DONAZ); + _atstatd = new TLocalisamfile(LF_ATSTATD); + _sezioni = new TLocalisamfile(LF_SEZIONI); + _colonne = new TAssoc_array(); + dispatch_e_menu(BAR_ITEM(1)); + return TRUE; } -void TScadenze_application::set_page(int file, int cnt) +bool TRiepilogoGiornaliero::destroy() { - // costruzione etichette - switch (_tipo_stampa) - { - case etichette: - { - TPrint_section& corpo = _form_eti->get_body(); - corpo.reset(); - corpo.update(); - for (int i = 0; i < corpo.height(); i++) - { - TPrintrow& riga = corpo.row(i); - set_row(i+1,riga); - } - force_setpage(TRUE); // serve perchè alla prossima etichetta rifaccia la setpage - // altrimenti stampa sempre la stessa etichetta - } - break; - case elenco: - { - set_row(1,"@0g@pn", FLD(LF_SOGGETTI,SOG_CODICE,"######")); - set_row(1,"@7g@S", FLD(LF_SOGGETTI,SOG_CATDON)); - set_row(1,"@10g#a", &_cognome_nome); - set_row(1,"@36g@ld", FLD(LF_SOGGETTI,SOG_DATANASC)); - set_row(1,"@47g@ld", FLD(LF_SOGGETTI,SOG_DATAULTID)); // potremmo mettere anche datastato - set_row(1,"@58g@S", FLD(LF_SOGGETTI,SOG_IDON1)); - set_row(1,"@61g@S", FLD(LF_SOGGETTI,SOG_IDON2)); - set_row(1,"@64g@S", FLD(LF_SOGGETTI,SOG_IDON3)); - set_row(1,"@67g@S", FLD(LF_SOGGETTI,SOG_IDON4)); - - set_row(2,"@50g@S", FLD(LF_SOGGETTI,SOG_STATO)); - } - break; - } + delete _rel; + delete _msk; + delete _soggetti; + delete _donaz; + delete _atstatd; + delete _sezioni; + delete _colonne; + return TApplication::destroy(); } -bool TScadenze_application::filter_func_scadenze(const TRelation* rel) -{ - bool filtrato = TRUE; - TLocalisamfile& sog = rel->lfile(); - // filtro per categorie - TAssoc_array categorie = app()._categorie; - if (categorie.items() != 0) - { - TString16 cat = sog.get(SOG_CATDON); - filtrato = categorie.is_key((const char*) cat); - } - // filtro per data di prossima donazione - if (filtrato) - { - TRectype from = sog->curr(); - TRectype to = sog->curr(); - from.zero(); - to.zero(); - if (app()._dataini.ok()) - { - if (app()._procdon == IDON_SI) - from.put(SOG_DATAPROSSI, app()._dataini); - else - from.put(SOG_DATAPROSAF, app()._dataini); - } - if (app()._datafin.ok()) - { - if (app()._procdon == IDON_SI) - to.put(SOG_DATAPROSSI, app()._datafin); - else - to.put(SOG_DATAPROSAF, app()._datafin); - } - filtrato = (sog->curr() >= from) && (sog->curr() <= to); - } - return filtrato; -} - -bool TScadenze_application::preprocess_page(int file, int counter) -{ - // contatore soggetti stampati - // per ora non c'è - if (_tipo_stampa == elenco) - { - TString80 nome = current_cursor()->curr().get(SOG_COGNOME); - nome << " "; - nome << current_cursor()->curr().get(SOG_NOME); - _cognome_nome = nome; - - // salto pagina se cambio sezione - TString16 codsez = current_cursor()->curr().get(SOG_CODSEZ); - TString16 codsot = current_cursor()->curr().get(SOG_CODSOT); - if ((_codsez!=codsez)||(_codsot!=codsot)) - { - if (_codsez != "**") - printer().formfeed(); - _codsez = codsez; - _codsot = codsot; - header_sezione(codsez, codsot); - } - } - return TRUE; -} - -void TScadenze_application::header_sezione(TString16 codsez, TString16 codsot) -{ - TString80 densez = current_cursor()->curr(LF_SEZIONI).get(SEZ_DENSEZ); - TString80 densot = current_cursor()->curr(LF_SEZIONI).get(SEZ_DENSOT); - TString256 intestazione(132); - intestazione = "Sezione: "; - intestazione << codsez; - intestazione << "/"; - intestazione << codsot; - intestazione << " "; - intestazione << densez; - if ((densot.ok())&& (densot.not_empty())) - { - intestazione << "/"; - intestazione << densot; - } - intestazione.center_just(); - set_header(1,"@0g%s", (const char*) intestazione); - return; -} - -bool TScadenze_application::set_print(int m) +bool TRiepilogoGiornaliero::menu(MENU_TAG m) { - _tipo_stampa = undefined; - KEY tasto; - tasto = _msk->run(); - switch (tasto) - { - case F_ELENCO: - _tipo_stampa = elenco; - _codsez = "**"; - _codsot = "**"; - break; - case F_ETICHETTE: - _tipo_stampa = etichette; - case F_CARTOLINE: - _tipo_stampa = cartoline; - break; - } - if (_tipo_stampa != undefined) - { - reset_files(); - add_file(LF_SOGGETTI); - _dataini = _msk->get(F_DATAINI); - _datafin = _msk->get(F_DATAFIN); - _procdon = _msk->get(F_PROCDON1); - // filtro per sezioni selezionati - filtra_sezioni(); - // filtro per categorie - TString16 catpri = _msk->get(F_CAT1); - TString16 catsec = _msk->get(F_CAT2); - TString16 catter = _msk->get(F_CAT3); - TString16 catqua = _msk->get(F_CAT4); - TString16 catqui = _msk->get(F_CAT5); - TString16 catses = _msk->get(F_CAT6); - if (catpri.not_empty() && catpri.ok()) - _categorie.add((const char*) catpri); - if (catsec.not_empty() && catsec.ok()) - _categorie.add((const char*) catsec); - if (catter.not_empty() && catter.ok()) - _categorie.add((const char*) catter); - if (catqua.not_empty() && catqua.ok()) - _categorie.add((const char*) catqua); - if (catqui.not_empty() && catqui.ok()) - _categorie.add((const char*) catqui); - if (catses.not_empty() && catses.ok()) - _categorie.add((const char*) catses); - // filtro per idoneo e non escluso - current_cursor()->setfilter("((TCS->S6 == \"I\" ) || (TCS->S6 == \"F\")) && (ESCLUSO == \"\")", TRUE); - - // filtro per procedura di donazione (controllo che abbia la data) - /* questo filtro è nella filter_function - TString16 procdon = _msk->get(F_PROCDON1); - if (procdon == IDON_SI) - current_cursor()->setfilter("(DATAPROSSI == \"\")", TRUE); - else - current_cursor()->setfilter("(DATAPROSAF == \"\")", TRUE); - */ - // filtro per categorie - current_cursor()->set_filterfunction(filter_func_scadenze); - reset_print(); + TMask& msk = get_mask(); + KEY tasto; + tasto = msk.run(); + if (tasto == K_ENTER) + { + _dataini = msk.get(F_DATAINI); + _datafin = msk.get(F_DATAFIN); + _primedon = msk.get_bool(F_PRIMEDON); + _sezini = _msk->get(F_SEZINI); + _sotini = _msk->get(F_SOTINI); + _sezfin = _msk->get(F_SEZFIN); + _sotfin = _msk->get(F_SOTFIN); + if (riepilogo()) + stampa(); + } + return FALSE; +} + +void TRiepilogoGiornaliero::crea_intestazione() +{ + TPrintrow row; + TString256 sep; + sep = "GIORNALIERO DONAZIONI"; + if (_dataini.ok()) + { + sep << " dal "; + sep << _dataini.string(); + } + if (_datafin.ok()) + { + sep << " al "; + sep << _datafin.string(); + } + sep.center_just(80); + row.put(sep); + row.put("@>", 1); + row.put("Pag. @#", 70); + printer().setheaderline(2, row); + row.reset(); + printer().setheaderline(3, row); + sep = "Data "; + TTable tdn("TDN"); + int pos = 27; + for (tdn.first(); !tdn.eof(); tdn.next()) + { + sep.overwrite((const char*)tdn.get("CODTAB"),pos); + pos = pos+10; + } + sep.overwrite("Totale",pos); + row.put(sep); + printer().setheaderline(5, row); + sep = ""; + sep.fill('-'); + row.reset(); + row.put(sep); + printer().setheaderline(6, row); +} + +bool TRiepilogoGiornaliero::stampa() +{ + if (printer().open()) + { crea_intestazione(); - return TRUE; - } - else - return FALSE; + TRelation* relstat = new TRelation(LF_ATSTATD); + TCursor* curstat = new TCursor(relstat, "", 1); + TString16 oldsez = "**"; + TString16 oldsot = "**"; + double numero, numprime; + TString16 actsez, actsot; + TString16 tipodon; + TDate data; + long last = curstat->items(); + for ( *curstat=0; curstat->pos() < last; ++(*curstat) ) + { + actsez = curstat->curr().get(ATS_CODSEZ); + actsot = curstat->curr().get(ATS_CODSOT); + data = curstat->curr().get_date(ATS_DATA); + tipodon = curstat->curr().get(ATS_TIPODON); + numero = (double)curstat->curr().get_int(ATS_NUMERO); + numprime = (double)curstat->curr().get_int(ATS_NUMPRIME); + if (actsez != oldsez || actsot != oldsot) + { + if (oldsez != "**" && oldsot != "**") + { + stampa_sezione(oldsez,oldsot); + azzera_righe(); + } + oldsez = actsez; + oldsot = actsot; + } + TRigaG& riga = (TRigaG&)_righe[data2row(data)]; + real& colonna = (real&)_colonne->find((const char*)tipodon); + real n = numero; + riga.aggiorna_valore(colonna.integer(),n); + if (_primedon) + { + TRigaG& riga_prime = (TRigaG&)_righe_prime[data2row(data)]; + n = numprime; + riga_prime.aggiorna_valore(colonna.integer(), n); + } + } + if (oldsez != "**" && oldsot != "**") + stampa_sezione(oldsez,oldsot); + delete curstat; + delete relstat; + printer().close(); + return TRUE; + } + else + return FALSE; } -void TScadenze_application::crea_intestazione() +void TRiepilogoGiornaliero::azzera_righe() { - reset_header(); - - if (_tipo_stampa == elenco) - { - TString256 sep(132); - sep = "SCADENZE DI DONAZIONE "; - TString16 procdon = _msk->get(F_PROCDON1); - sep << procdon ; - TDate data = _msk->get(F_DATAINI); - if (data.ok()) + TDate data = _dataini; + while (data<=_datafin) + { + TRigaG& riga = (TRigaG&)_righe[data2row(data)]; + riga.azzera_valori(); + if (_primedon) { - sep << " dal "; - sep << data.string(); + TRigaG& riga_prime = (TRigaG&)_righe_prime[data2row(data)]; + riga_prime.azzera_valori(); } - data = _msk->get(F_DATAFIN); - if (data.ok()) + ++data; + } +} + +void TRiepilogoGiornaliero::stampa_sezione(TString16 codsez, TString16 codsot) +{ + TPrintrow row; + TString256 rigastampa; + rigastampa = "Sezione: "; + rigastampa << codsez; + if (codsot.not_empty()) + { + rigastampa << "/"; + rigastampa << codsot; + } + rigastampa << " "; + TLocalisamfile sezioni(LF_SEZIONI); + sezioni.setkey(1); + sezioni.zero(); + sezioni.put(SEZ_CODSEZ,codsez); + sezioni.put(SEZ_CODSOT,codsot); + if (sezioni.read() == NOERR) + { + TString80 den = sezioni.get(SEZ_DENSEZ); + rigastampa << den; + den = sezioni.get(SEZ_DENSOT); + if (den.not_empty()) { - sep << " al "; - sep << data.string(); + rigastampa << "/"; + rigastampa << den; } - sep.center_just(); - set_header(2, "@0g%s", (const char*) sep); - TString16 data_stampa = _data_stampa.string(); - set_header(2,"@0g%10s", (const char*) data_stampa); - sep = ""; - sep << "Pag. @#"; - set_header(2, "@120g%s", (const char*) sep); - - sep = ""; - sep.fill('-'); - set_header(3, (const char *) sep); - - set_header(4,"@0gCod.@7gC.@10gCognome e nome@36gNato il@47gData ID@58gTipi idon."); - set_header(5,"@47gTipo/Esito"); - set_header(6,"@0g------@7g--@10g-------------------------@36g----------@47g----------@58g-- -- -- --"); - } -} - -bool TScadenze_application::user_create() -{ - _rel = new TRelation(LF_SOGGETTI); - _rel->add("TCS", "CODTAB==STATO",1,0,ALIAS_TCS); - _rel->add("LCP", "CODTAB==LOCALITA",1,0,ALIAS_LCP); - _rel->add(LF_COMUNI, "COM==COM"); - // per stampare la denominazione della sezione nell'intestazione - _rel->add(LF_SEZIONI, "CODSEZ==CODSEZ|CODSOT==CODSOT"); - - _cur1 = add_cursor(new TCursor(_rel, "", 1)); //cursore ordinamento per codice - _cur2 = add_cursor(new TCursor(_rel, "", 2)); //cursore ordinamento per cognome e nome - _cur3 = add_cursor(new TCursor(_rel, "", 3)); //cursore ordinamento per sezione+sottogruppo+codice - _cur4 = add_cursor(new TCursor(_rel, "", 4)); //cursore ordinamento per sezione+sottogruppo+cognome e nome - - _msk = new TMask("at3500a"); + } + rigastampa.center_just(80); + row.put(rigastampa); + printer().setheaderline(1, row); - _form_eti = new TScadenze_form("AT_ETSOG"); - - return TRUE; + TRigaG rigatotali(NULLDATE); + TDate data = _dataini; + real totaledata = ZERO; + TString16 valore; + while (data<=_datafin) + { + TRigaG& riga = (TRigaG&)_righe[data2row(data)]; + row.reset(); + rigastampa = ""; + rigastampa.format("%s", (const char*)data.string()); + totaledata = ZERO; + int pos = 21; + for (int i=0;i<_colonne->items();i++) + { + rigatotali.aggiorna_valore(i,riga[i]); + totaledata+=riga[i]; + valore = ""; + valore.format("%8d",riga[i].integer()); + rigastampa.overwrite((const char*)valore, pos); + pos = pos+10; + } + valore = ""; + valore.format("%8d",totaledata.integer()); + rigastampa.overwrite((const char*)valore, pos+4); + row.put((const char*) rigastampa); + printer().print(row); + ++data; + } + // stampa totali per sezione + rigastampa = ""; + rigastampa.fill('-'); + row.reset(); + row.put(rigastampa); + printer().print(row); + row.reset(); + rigastampa = ""; + rigastampa = "Totale periodo"; + totaledata = ZERO; + int pos = 21; + for (int i=0;i<_colonne->items();i++) + { + totaledata+=rigatotali[i]; + valore = ""; + valore.format("%8d",rigatotali[i].integer()); + rigastampa.overwrite((const char*)valore, pos); + pos = pos+10; + } + valore = ""; + valore.format("%8d",totaledata.integer()); + rigastampa.overwrite((const char*)valore, pos+4); + row.put((const char*) rigastampa); + printer().print(row); + + if (_primedon) + { + printer().formfeed(); + rigatotali.azzera_valori(); + data = _dataini; + while (data<=_datafin) + { + TRigaG& riga = (TRigaG&)_righe_prime[data2row(data)]; + row.reset(); + rigastampa = ""; + rigastampa.format("%s", (const char*)data.string()); + totaledata = ZERO; + int pos = 21; + for (int i=0;i<_colonne->items();i++) + { + rigatotali.aggiorna_valore(i,riga[i]); + totaledata+=riga[i]; + valore = ""; + valore.format("%8d",riga[i].integer()); + rigastampa.overwrite((const char*)valore, pos); + pos = pos+10; + } + valore = ""; + valore.format("%8d",totaledata.integer()); + rigastampa.overwrite((const char*)valore, pos+4); + row.put((const char*) rigastampa); + printer().print(row); + ++data; + } + // stampa totali per sezione + rigastampa = ""; + rigastampa.fill('-'); + row.reset(); + row.put(rigastampa); + printer().print(row); + row.reset(); + rigastampa = ""; + rigastampa = "Totale periodo"; + totaledata = ZERO; + int pos = 21; + for (int i=0;i<_colonne->items();i++) + { + totaledata+=rigatotali[i]; + valore = ""; + valore.format("%8d",rigatotali[i].integer()); + rigastampa.overwrite((const char*)valore, pos); + pos = pos+10; + } + valore = ""; + valore.format("%8d",totaledata.integer()); + rigastampa.overwrite((const char*)valore, pos+4); + row.put((const char*) rigastampa); + printer().print(row); + } + row.reset(); + printer().setheaderline(3, row); + printer().formfeed(); } -bool TScadenze_application::user_destroy() -{ - delete _msk; - delete _rel; - delete _form_eti; - return TRUE; -} +bool TRiepilogoGiornaliero::riepilogo() +{ + if (crea_colonne() && crea_righe()) + { + // cancello i risultati della elaborazione precedente + TLocalisamfile stat(LF_ATSTATD); + for (stat.first(); !stat.eof(); stat.next()) + stat.remove(); + // filtro per data + TRectype da(LF_DONAZ); + TRectype a (LF_DONAZ); + if (_dataini.ok()) + da.put(DON_DATADON, _dataini); + if (_datafin.ok()) + a.put(DON_DATADON, _datafin); + _cur = new TCursor(_rel, "", 2, &da, &a); + TString256 filtro = ""; + + // filtro per sezione/sottogruppo + if (_sezini.not_empty()) + { + if (filtro.empty()) + filtro = format("(90->CODSEZ >= \"%s\")",(const char*)_sezini); + else + { + filtro << " && "; + filtro << format("(90->CODSEZ >= \"%s\")",(const char*)_sezini); + } + if (_sotini.not_empty()) + { + if (filtro.empty()) + filtro = format("(90->CODSOT >= \"%s\")",(const char*)_sotini); + else + { + filtro << " && "; + filtro << format("(90->CODSOT >= \"%s\")",(const char*)_sotini); + } + } + } + if (_sezfin.not_empty()) + { + if (filtro.empty()) + filtro = format("(90->CODSEZ <= \"%s\")",(const char*)_sezfin); + else + { + filtro << " && "; + filtro << format("(90->CODSEZ <= \"%s\")",(const char*)_sezfin); + } + if (_sotfin.not_empty()) + { + if (filtro.empty()) + filtro = format("(90->CODSOT <= \"%s\")",(const char*)_sotfin); + else + { + filtro << " && "; + filtro << format("(90->CODSOT <= \"%s\")",(const char*)_sotfin); + } + } + } + _cur->setfilter((const char*) filtro, TRUE); + TString16 codsez, codsot, tipodon; + int anno, mese, giorno; + TDate data; + long numero; + bool primadon; + TRectype& recdon = _cur->curr(); + TRectype& recsog = _cur->curr(LF_SOGGETTI); + long last = _cur->items(); + TProgind prg (last, "Elaborazione in corso... Prego attendere", FALSE, TRUE, 30); + for ( *_cur=0; _cur->pos() < last; ++(*_cur) ) + { + prg.addstatus(1); + codsez = recdon.get(DON_CODSEZ); + codsot = recdon.get(DON_CODSOT); + if (codsez.empty()) + { + codsez = recsog.get(SOG_CODSEZ); + codsot = recsog.get(SOG_CODSOT); + } + data = recdon.get_date(DON_DATADON); + anno = data.year(); + mese = data.month(); + giorno = data.day(); + tipodon = recdon.get(DON_TIPODON); + primadon = recdon.get_bool(DON_PRIMADON); + stat.zero(); + stat.put(ATS_CODSEZ, codsez); + stat.put(ATS_CODSOT, codsot); + //stat.put(ATS_DATA, data); + stat.put(ATS_ANNO, anno); + stat.put(ATS_MESE, mese); + stat.put(ATS_GIORNO, giorno); + stat.put(ATS_TIPODON, tipodon); + if (stat.read() == NOERR) + { + numero = stat.get_long(ATS_NUMERO); + numero++; + stat.put(ATS_NUMERO, numero); + if (_primedon && primadon) + { + numero = stat.get_long(ATS_NUMPRIME); + numero++; + stat.put(ATS_NUMPRIME, numero); + } + int err = stat.rewrite(); + } + else + { + stat.zero(); + stat.put(ATS_CODSEZ, codsez); + stat.put(ATS_CODSOT, codsot); + stat.put(ATS_ANNO, anno); + stat.put(ATS_MESE, mese); + stat.put(ATS_GIORNO, giorno); + stat.put(ATS_DATA, data); + stat.put(ATS_TIPODON, tipodon); + numero = 1; + stat.put(ATS_NUMERO, numero); + if (_primedon && primadon) + stat.put(ATS_NUMPRIME, numero); + int err = stat.write(); + } + } + return (stat.eod() > 0); + } + else + return FALSE; +} int at3500(int argc, char* argv[]) { - - TScadenze_application a; - - a.run(argc, argv, "Scadenze di donazione"); - - return 0; -} + TRiepilogoGiornaliero a; + a.run(argc, argv, "Riepilogo giornaliero donazioni"); + return 0; +} \ No newline at end of file diff --git a/at/at3500a.h b/at/at3500a.h new file mode 100755 index 000000000..f1f54fcd7 --- /dev/null +++ b/at/at3500a.h @@ -0,0 +1,15 @@ +// riepilogo gironaliero donazioni +// definizione campi per maschera di selezione + +#define F_SEZINI 101 +#define F_D_SEZINI 102 +#define F_SOTINI 103 +#define F_D_SOTINI 104 +#define F_SEZFIN 105 +#define F_D_SEZFIN 106 +#define F_SOTFIN 107 +#define F_D_SOTFIN 108 + +#define F_DATAINI 301 +#define F_DATAFIN 302 +#define F_PRIMEDON 303 diff --git a/at/at3500a.uml b/at/at3500a.uml new file mode 100755 index 000000000..6a160f0a2 --- /dev/null +++ b/at/at3500a.uml @@ -0,0 +1,153 @@ +#include "at3500a.h" + +PAGE "Riepilogo giornaliero donazioni" -1 -1 78 12 + +GROUPBOX DLG_NULL 77 4 +BEGIN + PROMPT 1 1 "Scelta sezioni/sottogruppi" +END + +STRING F_SEZINI 2 +BEGIN + PROMPT 2 2 "Da " + FLAGS "U" + USE LF_SEZIONI + INPUT CODSEZ F_SEZINI + INPUT CODSOT F_SOTINI + DISPLAY "Cod.sez" CODSEZ + DISPLAY "Cod.sot." CODSOT + DISPLAY "Sezione@25" DENSEZ + DISPLAY "Sottogruppo@25" DENSOT + OUTPUT F_SEZINI CODSEZ + OUTPUT F_D_SEZINI DENSEZ + OUTPUT F_SOTINI CODSOT + OUTPUT F_D_SOTINI DENSOT + CHECKTYPE SEARCH + HELP "Codice sezione da cui partire" +END + +STRING F_D_SEZINI 25 +BEGIN + PROMPT 11 2 "" + FLAGS "U" + USE LF_SEZIONI KEY 2 + INPUT DENSEZ F_D_SEZINI + DISPLAY "Sezione@25" DENSEZ + DISPLAY "Sottogruppo@25" DENSOT + DISPLAY "Cod.sez" CODSEZ + DISPLAY "Cod.sot." CODSOT + COPY OUTPUT F_SEZINI + CHECKTYPE NORMAL + HELP "Sezione da cui partire" +END + +STRING F_SOTINI 2 +BEGIN + PROMPT 2 3 " " + COPY ALL F_SEZINI + CHECKTYPE SEARCH + HELP "Codice sottogruppo da cui partire" +END + +STRING F_D_SOTINI 25 +BEGIN + PROMPT 11 3 "" + FLAGS "U" + COPY USE F_D_SEZINI + INPUT DENSEZ F_D_SEZINI + INPUT DENSOT F_D_SOTINI + COPY DISPLAY F_D_SEZINI + COPY OUTPUT F_D_SEZINI + CHECKTYPE NORMAL + HELP "Sottogruppo da cui partire" +END + +STRING F_SEZFIN 2 +BEGIN + PROMPT 41 2 "A " + FLAGS "U" + USE LF_SEZIONI + INPUT CODSEZ F_SEZFIN + INPUT CODSOT F_SOTFIN + DISPLAY "Cod.sez" CODSEZ + DISPLAY "Cod.sot." CODSOT + DISPLAY "Sezione@25" DENSEZ + DISPLAY "Sottogruppo@25" DENSOT + OUTPUT F_SEZFIN CODSEZ + OUTPUT F_D_SEZFIN DENSEZ + OUTPUT F_SOTFIN CODSOT + OUTPUT F_D_SOTFIN DENSOT + CHECKTYPE SEARCH + HELP "Codice sezione finale" +END + +STRING F_D_SEZFIN 25 +BEGIN + PROMPT 49 2 "" + FLAGS "U" + USE LF_SEZIONI KEY 2 + INPUT DENSEZ F_D_SEZFIN + DISPLAY "Sezione@25" DENSEZ + DISPLAY "Sottogruppo@25" DENSOT + DISPLAY "Cod.sez" CODSEZ + DISPLAY "Cod.sot." CODSOT + COPY OUTPUT F_SEZFIN + CHECKTYPE NORMAL + HELP "Sezione finale" +END + +STRING F_SOTFIN 2 +BEGIN + PROMPT 41 3 " " + COPY ALL F_SEZFIN + CHECKTYPE SEARCH + HELP "Codice sottogruppo finale" +END + +STRING F_D_SOTFIN 25 +BEGIN + PROMPT 49 3 "" + FLAGS "U" + COPY USE F_D_SEZFIN + INPUT DENSEZ F_D_SEZFIN + INPUT DENSOT F_D_SOTFIN + COPY DISPLAY F_D_SEZFIN + COPY OUTPUT F_D_SEZFIN + CHECKTYPE NORMAL + HELP "Sottogruppo finale" +END + +GROUPBOX DLG_NULL 77 4 +BEGIN + PROMPT 1 5 "Opzioni per il riepilogo" +END + +DATE F_DATAINI +BEGIN + PROMPT 2 6 "Donazioni effettuate dal " + HELP "Data iniziale" +END + +DATE F_DATAFIN +BEGIN + PROMPT 40 6 "al " + HELP "Data finale" +END + +BOOLEAN F_PRIMEDON +BEGIN + PROMPT 2 7 "Riepilogo per prime donazioni" +END + +BUTTON DLG_OK 9 2 +BEGIN + PROMPT -12 -1 "" +END + +BUTTON DLG_QUIT 9 2 +BEGIN + PROMPT -22 -1 "" +END + +ENDPAGE +ENDMASK diff --git a/at/at3600.cpp b/at/at3600.cpp index e4f5c3f75..8cbecd683 100755 --- a/at/at3600.cpp +++ b/at/at3600.cpp @@ -1,347 +1,795 @@ -#include +#include #include -#include +#include +#include +#include +#include +#include +#include #include -#include "lf.h" +#include "at3.h" + +// nomi campi maschera +#include "at3600a.h" + +// nomi dei campi #include "soggetti.h" +#include "donaz.h" +#include "atstatd.h" #include "sezioni.h" -#include "at3.h" -#include "at3600a.h" +// classe per la definizione di una riga di statistica +class TRigaGruppo : public TObject +{ + TString16 _gruppo, _rh; + TArray _valori; -#define ALIAS_LCP 100 -#define ALIAS_TDN 200 -#define IDON_SI "SI" -#define IDON_AF "AF" - -enum ts { undefined = 0, elenco = 1, etichette = 2, cartoline = 3 }; - -// definizione form per etichette -class TConvBO_form : public TForm -{ -public: - - virtual TCursor* cursor() const; - virtual TRelation* relation() const; - TPrint_section& get_body() { return section('B'); } ; - TConvBO_form(): TForm() {}; - TConvBO_form(const char* form, const char * code = "", int editlevel = 0, const char* desc = "") - : TForm(form,code,editlevel,desc) {}; - virtual ~TConvBO_form() {}; -}; - -class TConvBO_application : public TPrintapp -{ - TRelation* _rel; - TMask* _msk; - TConvBO_form* _form_eti; - - - - int _cur1, _cur2, _cur3, _cur4; - TParagraph_string _cognome_nome; - TDate _data_stampa; - TDate _dataini, _datafin; - TString16 _procdon; - ts _tipo_stampa; - TString16 _codsez, _codsot; - - - static bool filter_func_convBO(const TRelation* rel); - protected: - virtual bool user_create(); - virtual bool user_destroy(); - virtual bool set_print(int m); - virtual void set_page(int file, int cnt); - virtual bool preprocess_page(int file, int counter); - + const TRigaGruppo& copy(const TRigaGruppo& riga); public: - void crea_intestazione(); - void filtra_sezioni(); - void header_sezione(const TString16 codsez, const TString16 codsot); - TMask& app_mask() { return *_msk; } - TConvBO_application() : _data_stampa(TODAY), _cognome_nome("",25) {} + const TString16 gruppo() const { return _gruppo; } + const TString16 rh() const { return _rh; } + TObject* dup() const { return new TRigaGruppo(*this); } + const TRigaGruppo& operator = (const TRigaGruppo& riga); + const real& operator [] (int colonna) const; + void aggiorna_valore(int colonna, const real& numero) ; + void azzera_valori(); + // costruttore + TRigaGruppo(TString16 gruppo, TString16 rh) {_gruppo = gruppo; _rh = rh;} + // costruttore di copia + TRigaGruppo(const TRigaGruppo& riga) { copy(riga); } + virtual ~TRigaGruppo() {}; }; -HIDDEN inline TConvBO_application& app() { return (TConvBO_application&) main_app(); } - -TCursor* TConvBO_form::cursor() const { return app().current_cursor(); } - -TRelation* TConvBO_form::relation() const { return cursor()->relation(); } - -void TConvBO_application::filtra_sezioni() +const TRigaGruppo& TRigaGruppo::copy(const TRigaGruppo& riga) { - const TString16 sez = _msk->get(F_CODSEZ); - const TString16 sot = _msk->get(F_CODSOT); - select_cursor(_cur4); - TRectype da(LF_SOGGETTI); - if (sez.not_empty()) - da.put(SOG_CODSEZ, sez); - if (sot.not_empty()) - da.put(SOG_CODSOT, sot); - current_cursor()->setregion(da, da); + _gruppo = riga._gruppo; + _rh = riga._rh; + _valori = riga._valori; + return (*this); +} + +const TRigaGruppo& TRigaGruppo::operator = (const TRigaGruppo& riga) +{ + copy(riga); + return (*this); +} + +const real& TRigaGruppo::operator [] (int colonna) const +{ + real* valore = (real*)_valori.objptr(colonna); + if (valore == NULL) + return ZERO; + else + return *valore; +} + +void TRigaGruppo::aggiorna_valore(int colonna, const real& numero) +{ + real* valore = (real*)_valori.objptr(colonna); + if (valore == NULL) + _valori.add(new real(numero), colonna); + else + *valore += numero; +} + +void TRigaGruppo::azzera_valori() +{ + _valori.destroy(); +} + +class TStatDonGrRh : public TApplication +{ + TMask* _msk; + TRelation* _rel; + TCursor* _cur; + TLocalisamfile* _sezioni; + TLocalisamfile* _soggetti; + TLocalisamfile* _donaz; + TLocalisamfile* _atstatd; + TDate _dataini, _datafin; + TString16 _tipodon; + TAssoc_array* _colonne; + TArray _righe; // array per riepilogo donazioni + TString16 _sezini, _sotini, _sezfin, _sotfin; + TAssoc_array* _asoggetti; + +protected: + virtual bool create(); + virtual bool destroy(); + virtual bool menu(MENU_TAG m); + virtual TMask& get_mask() { return *_msk; } + virtual TRelation* get_relation() const { return _rel; } + int data2row(const TString16 gruppo, const TString16 rh); + bool riepilogo(); + bool stampa(); + bool crea_colonne(); + bool crea_righe(); + void azzera_righe(); + void stampa_sezione(TString16 codsez, TString16 codsot); + void crea_intestazione(); +public: + TStatDonGrRh() {} + +}; + +HIDDEN inline TStatDonGrRh& app() { return (TStatDonGrRh&) main_app(); } + +int TStatDonGrRh::data2row(const TString16 gruppo, const TString16 rh) +{ + int igruppo = 0; + int irh = 0; + if (gruppo == "0") + igruppo = 1; + if (gruppo == "A") + igruppo = 2; + if (gruppo == "A1") + igruppo = 3; + if (gruppo == "A2") + igruppo = 4; + if (gruppo == "A1B") + igruppo = 5; + if (gruppo == "A2B") + igruppo = 6; + if (gruppo == "AB") + igruppo = 7; + if (gruppo == "B") + igruppo = 8; + if (rh == "POS") + irh = 1; + if (rh == "NEG") + irh = 2; + return igruppo*10 + irh; +} + +bool TStatDonGrRh::crea_colonne() +{ + _colonne->destroy(); + real contatore(ZERO); + real* oggettodm = new real(contatore); + const char* indicedm = "DM"; // donazioni maschi + _colonne->add(indicedm,(TObject*)oggettodm); + const char* indicedf = "DF"; // donazioni femmine + contatore = contatore+1; + real* oggettodf = new real(contatore); + _colonne->add(indicedf,(TObject*)oggettodf); + const char* indicesm = "SM"; // soggetti maschi + contatore = contatore+1; + real* oggettosm = new real(contatore); + _colonne->add(indicesm,(TObject*)oggettosm); + const char* indicesf = "SF"; // soggetti femmine + contatore = contatore+1; + real* oggettosf = new real(contatore); + _colonne->add(indicesf,(TObject*)oggettosf); + return TRUE; +} + +bool TStatDonGrRh::crea_righe() +{ + TString16 gruppo, rh; + for (int igruppo=0;igruppo<=8;igruppo++) + { + switch (igruppo) + { + case 0 : gruppo = ""; break; + case 1 : gruppo = "0"; break; + case 2 : gruppo = "A"; break; + case 3 : gruppo = "A1"; break; + case 4 : gruppo = "A2"; break; + case 5 : gruppo = "A1B"; break; + case 6 : gruppo = "A2B"; break; + case 7 : gruppo = "AB"; break; + case 8 : gruppo = "B"; break; + } + for (int irh=0;irh <=2;irh++) + { + switch (irh) + { + case 1 : rh = "POS"; break; + case 2 : rh = "NEG"; break; + default : rh = " "; break; + } + _righe.add(new TRigaGruppo(gruppo, rh), data2row(gruppo, rh)); + } + } + return _righe.items()>0; +} + +bool TStatDonGrRh::create() +{ + TApplication::create(); + _msk = new TMask("at3600a"); + _rel = new TRelation(LF_DONAZ); + _rel->add(LF_SOGGETTI, "CODICE==CODICE"); + _soggetti = new TLocalisamfile(LF_SOGGETTI); + _donaz = new TLocalisamfile(LF_DONAZ); + _atstatd = new TLocalisamfile(LF_ATSTATD); + _sezioni = new TLocalisamfile(LF_SEZIONI); + _colonne = new TAssoc_array(); + _asoggetti = new TAssoc_array(); + dispatch_e_menu(BAR_ITEM(1)); + return TRUE; } -void TConvBO_application::set_page(int file, int cnt) +bool TStatDonGrRh::destroy() { - // costruzione etichette - switch (_tipo_stampa) - { - case etichette: - { - TPrint_section& corpo = _form_eti->get_body(); - corpo.reset(); - corpo.update(); - for (int i = 0; i < corpo.height(); i++) - { - TPrintrow& riga = corpo.row(i); - set_row(i+1,riga); - } - force_setpage(TRUE); // serve perchè alla prossima etichetta rifaccia la setpage - // altrimenti stampa sempre la stessa etichetta - } - break; - case elenco: - { - set_row(1,"@0g@pn", FLD(LF_SOGGETTI,SOG_CODICE,"######")); - set_row(1,"@7g@S", FLD(LF_SOGGETTI,SOG_CATDON)); - set_row(1,"@10g#a", &_cognome_nome); - set_row(1,"@36g@ld", FLD(LF_SOGGETTI,SOG_DATANASC)); - set_row(1,"@47g@ld", FLD(LF_SOGGETTI,SOG_DATAULTID)); // potremmo mettere anche datastato - set_row(1,"@58g@S", FLD(LF_SOGGETTI,SOG_IDON1)); - set_row(1,"@61g@S", FLD(LF_SOGGETTI,SOG_IDON2)); - set_row(1,"@64g@S", FLD(LF_SOGGETTI,SOG_IDON3)); - set_row(1,"@67g@S", FLD(LF_SOGGETTI,SOG_IDON4)); - - set_row(2,"@50g@S", FLD(LF_SOGGETTI,SOG_STATO)); - } - break; - } + delete _rel; + delete _msk; + delete _soggetti; + delete _donaz; + delete _atstatd; + delete _sezioni; + delete _colonne; + delete _asoggetti; + return TApplication::destroy(); } -bool TConvBO_application::filter_func_convBO(const TRelation* rel) -{ - - bool filtrato = TRUE; - - TLocalisamfile& sog = rel->lfile(); - -/* - TString16 catsog = sog.get(SOG_CATDON); - TString - if (categoria non di dimissione) && (punto di raccolta = scelto o vuoto) - filtrato = TRUE; - else - filtrato = FALSE; - if (filtrato) - { - - // filtro per età - TRectype from (sog->curr()); - TRectype to (sog->curr()); - from.zero(); - to.zero(); - if (app()._dataini.ok()) - { - if (app()._procdon == IDON_SI) - from.put(SOG_DATAPROSSI, app()._dataini); - else - from.put(SOG_DATAPROSAF, app()._dataini); - } - if (app()._datafin.ok()) - { - if (app()._procdon == IDON_SI) - to.put(SOG_DATAPROSSI, app()._datafin); - else - to.put(SOG_DATAPROSAF, app()._datafin); - } - if ((sog->curr() >= from) && (sog->curr() <= to)) - filtrato = TRUE; - else - filtrato = FALSE; - - } - */ - return filtrato; -} - -bool TConvBO_application::preprocess_page(int file, int counter) -{ - // contatore soggetti stampati - // per ora non c'è - if (_tipo_stampa == elenco) - { - TString80 nome = current_cursor()->curr().get(SOG_COGNOME); - nome << " "; - nome << current_cursor()->curr().get(SOG_NOME); - _cognome_nome = nome; - - // salto pagina se cambio sezione - const TString16 codsez = current_cursor()->curr().get(SOG_CODSEZ); - const TString16 codsot = current_cursor()->curr().get(SOG_CODSOT); - if ((_codsez!=codsez)||(_codsot!=codsot)) - { - if (_codsez != "**") - printer().formfeed(); - _codsez = codsez; - _codsot = codsot; - header_sezione(codsez, codsot); - } - } - return TRUE; -} - -void TConvBO_application::header_sezione(const TString16 codsez, const TString16 codsot) -{ - const TString80 densez = current_cursor()->curr(LF_SEZIONI).get(SEZ_DENSEZ); - const TString80 densot = current_cursor()->curr(LF_SEZIONI).get(SEZ_DENSOT); - TString intestazione(132); - intestazione = "Sezione: "; - intestazione << codsez; - intestazione << "/"; - intestazione << codsot; - intestazione << " "; - intestazione << densez; - if ((densot.ok())&& (densot.not_empty())) - { - intestazione << "/"; - intestazione << densot; - } - intestazione.center_just(); - set_header(1,"@0g%s", (const char*) intestazione); - return; -} - -bool TConvBO_application::set_print(int m) +bool TStatDonGrRh::menu(MENU_TAG m) { - _tipo_stampa = undefined; - KEY tasto; - tasto = _msk->run(); - switch (tasto) - { - case F_ELENCO: - _tipo_stampa = elenco; - _codsez = "**"; - _codsot = "**"; - break; - case F_ETICHETTE: - _tipo_stampa = etichette; - case F_CARTOLINE: - _tipo_stampa = cartoline; - break; - } - if (_tipo_stampa != undefined) - { - reset_files(); - add_file(LF_SOGGETTI); + TMask& msk = get_mask(); + KEY tasto; + tasto = msk.run(); + if (tasto == K_ENTER) + { + _dataini = msk.get(F_DATAINI); + _datafin = msk.get(F_DATAFIN); + _tipodon = msk.get(F_TIPODON); + _sezini = msk.get(F_SEZINI); + _sotini = msk.get(F_SOTINI); + _sezfin = msk.get(F_SEZFIN); + _sotfin = msk.get(F_SOTFIN); + if (riepilogo()) + stampa(); + } + return FALSE; +} -/* - _dataini = _msk->get(F_DATAINI); - _datafin = _msk->get(F_DATAFIN); - _procdon = _msk->get(F_PROCDON1); -*/ - // filtro per sezioni selezionati - filtra_sezioni(); +void TStatDonGrRh::crea_intestazione() +{ + TPrintrow row; + TString256 sep; + sep = "STATISTICA DONAZIONI/DONATORI PER SESSO, GRUPPO E RH"; + sep.center_just(80); + row.put(sep); + printer().setheaderline(2, row); + sep = ""; + if (_tipodon.not_empty()) + { + sep << "Tipo "; + sep << _tipodon; + } + if (_dataini.ok()) + { + sep << " dal "; + sep << _dataini.string(); + } + if (_datafin.ok()) + { + sep << " al "; + sep << _datafin.string(); + } + sep.center_just(80); + row.reset(); + row.put(sep); + row.put("@>", 1); + row.put("Pag. @#", 70); + printer().setheaderline(3, row); + row.reset(); + printer().setheaderline(4, row); + sep = ""; + sep << "Gruppo/Rh Donazioni Donatori Donazioni/Donatori"; + row.put(sep); + printer().setheaderline(5, row); + sep = ""; + sep << " Maschi Femmine Totali Maschi Femmine Totali Maschi Femmine Totali"; + row.reset(); + row.put(sep); + printer().setheaderline(6, row); + sep = ""; + sep.fill('-'); + row.reset(); + row.put(sep); + printer().setheaderline(7, row); +} - // filtro per idoneo e non escluso - current_cursor()->setfilter("((TCS->S6 == \"I\" ) || (TCS->S6 == \"F\")) && (ESCLUSO == \"\")", TRUE); - - // filtro per procedura di donazione (controllo che abbia la data) - /* questo filtro è nella filter_function - TString16 procdon = _msk->get(F_PROCDON1); - if (procdon == IDON_SI) - current_cursor()->setfilter("(DATAPROSSI == \"\")", TRUE); - else - current_cursor()->setfilter("(DATAPROSAF == \"\")", TRUE); - */ - // filtro per categorie - current_cursor()->set_filterfunction(filter_func_convBO); - reset_print(); +bool TStatDonGrRh::stampa() +{ + if (printer().open()) + { crea_intestazione(); - return TRUE; - } - else - return FALSE; + TRelation* relstat = new TRelation(LF_ATSTATD); + TCursor* curstat = new TCursor(relstat, "", 3); + TString16 oldsez = "**"; + TString16 oldsot = "**"; + double numero,numsog,numero2,numsog2; + TString16 actsez, actsot; + TString16 gruppo, rh; + long last = curstat->items(); + for ( *curstat=0; curstat->pos() < last; ++(*curstat) ) + { + actsez = curstat->curr().get(ATS_CODSEZ); + actsot = curstat->curr().get(ATS_CODSOT); + gruppo = curstat->curr().get(ATS_GRUPPO); + rh = curstat->curr().get(ATS_RH); + numero = (double)curstat->curr().get_int(ATS_NUMERO); + numsog = (double)curstat->curr().get_int(ATS_NUMPRIME); + numero2 = (double)curstat->curr().get_int(ATS_NUMERO2); + numsog2 = (double)curstat->curr().get_int(ATS_NUMPRIME2); + + if (actsez != oldsez || actsot != oldsot) + { + if (oldsez != "**" && oldsot != "**") + { + stampa_sezione(oldsez,oldsot); + azzera_righe(); + } + oldsez = actsez; + oldsot = actsot; + } + TRigaGruppo& riga = (TRigaGruppo&)_righe[data2row(gruppo,rh)]; + const char* indicedm = "DM"; + real& colonnadm = (real&)_colonne->find(indicedm); + real n = numero; + riga.aggiorna_valore(colonnadm.integer(),n); + const char* indicedf = "DF"; + real& colonnadf = (real&)_colonne->find(indicedf); + n = numero2; + riga.aggiorna_valore(colonnadf.integer(),n); + const char* indicesm = "SM"; + real& colonnasm = (real&)_colonne->find(indicesm); + n = numsog; + riga.aggiorna_valore(colonnasm.integer(),n); + const char* indicesf = "SF"; + real& colonnasf = (real&)_colonne->find(indicesf); + n = numsog2; + riga.aggiorna_valore(colonnasf.integer(),n); + } + if (oldsez != "**" && oldsot != "**") + stampa_sezione(oldsez,oldsot); + delete curstat; + delete relstat; + printer().close(); + return TRUE; + } + else + return FALSE; } -void TConvBO_application::crea_intestazione() +void TStatDonGrRh::azzera_righe() { - reset_header(); - - if (_tipo_stampa == elenco) - { - TString sep(132); - sep = "SCADENZE DI DONAZIONE "; -/* TString16 procdon = _msk->get(F_PROCDON1); - sep << procdon ; - TDate data = _msk->get(F_DATAINI); - if (data.ok()) + TString16 gruppo, rh; + for (int igruppo=0;igruppo<=8;igruppo++) + { + switch (igruppo) + { + case 0 : gruppo = ""; break; + case 1 : gruppo = "0"; break; + case 2 : gruppo = "A"; break; + case 3 : gruppo = "A1"; break; + case 4 : gruppo = "A2"; break; + case 5 : gruppo = "A1B"; break; + case 6 : gruppo = "A2B"; break; + case 7 : gruppo = "AB"; break; + case 8 : gruppo = "B"; break; + } + for (int irh=0;irh <=2;irh++) { - sep << " dal "; - sep << data.string(); + switch (irh) + { + case 1 : rh = "POS"; break; + case 2 : rh = "NEG"; break; + default : rh = " "; break; + } + TRigaGruppo& riga = (TRigaGruppo&)_righe[data2row(gruppo,rh)]; + riga.azzera_valori(); } - data = _msk->get(F_DATAFIN); - if (data.ok()) + } +} + + + +void TStatDonGrRh::stampa_sezione(TString16 codsez, TString16 codsot) +{ + TPrintrow row; + TString256 rigastampa; + rigastampa = "Sezione: "; + rigastampa << codsez; + if (codsot.not_empty()) + { + rigastampa << "/"; + rigastampa << codsot; + } + rigastampa << " "; + TLocalisamfile sezioni(LF_SEZIONI); + sezioni.setkey(1); + sezioni.zero(); + sezioni.put(SEZ_CODSEZ,codsez); + sezioni.put(SEZ_CODSOT,codsot); + if (sezioni.read() == NOERR) + { + TString80 den = sezioni.get(SEZ_DENSEZ); + rigastampa << den; + den = sezioni.get(SEZ_DENSOT); + if (den.not_empty()) { - sep << " al "; - sep << data.string(); + rigastampa << "/"; + rigastampa << den; } -*/ - sep.center_just(); - set_header(2, "@0g%s", (const char*) sep); - TString16 data_stampa = _data_stampa.string(); - set_header(2,"@0g%10s", (const char*) data_stampa); - sep = ""; - sep << "Pag. @#"; - set_header(2, "@120g%s", (const char*) sep); - - sep = ""; - sep.fill('-'); - set_header(3, (const char *) sep); - - set_header(4,"@0gCod.@7gC.@10gCognome e nome@36gNato il@47gData ID@58gTipi idon."); - set_header(5,"@47gTipo/Esito"); - set_header(6,"@0g------@7g--@10g-------------------------@36g----------@47g----------@58g-- -- -- --"); - } -} - -bool TConvBO_application::user_create() -{ - _rel = new TRelation(LF_SOGGETTI); -// _rel->add("TCS", "CODTAB==STATO",1,0,ALIAS_TCS); - _rel->add("LCP", "CODTAB==LOCALITA",1,0,ALIAS_LCP); - _rel->add(LF_COMUNI, "COM==COM"); - // per stampare la denominazione della sezione nell'intestazione - _rel->add(LF_SEZIONI, "CODSEZ==CODSEZ|CODSOT==CODSOT"); - - _cur1 = add_cursor(new TCursor(_rel, "", 1)); //cursore ordinamento per codice - _cur2 = add_cursor(new TCursor(_rel, "", 2)); //cursore ordinamento per cognome e nome - _cur3 = add_cursor(new TCursor(_rel, "", 3)); //cursore ordinamento per sezione+sottogruppo+codice - _cur4 = add_cursor(new TCursor(_rel, "", 4)); //cursore ordinamento per sezione+sottogruppo+cognome e nome - - _msk = new TMask("at3600a"); + } + rigastampa.center_just(80); + row.put(rigastampa); + printer().setheaderline(1, row); - _form_eti = new TConvBO_form("AT_ETSOG"); - - return TRUE; + TRigaGruppo rigatotali(" "," "); + TString16 valore; + TString16 gruppo, rh; + real totsoggetti = ZERO; + real totdonazioni = ZERO; + for (int igruppo=0;igruppo<=8;igruppo++) + { + switch (igruppo) + { + case 0 : gruppo = ""; break; + case 1 : gruppo = "0"; break; + case 2 : gruppo = "A"; break; + case 3 : gruppo = "A1"; break; + case 4 : gruppo = "A2"; break; + case 5 : gruppo = "A1B"; break; + case 6 : gruppo = "A2B"; break; + case 7 : gruppo = "AB"; break; + case 8 : gruppo = "B"; break; + } + for (int irh=0;irh <=2;irh++) + { + switch (irh) + { + case 1 : rh = "POS"; break; + case 2 : rh = "NEG"; break; + default : rh = " "; break; + } + totsoggetti = ZERO; + totdonazioni = ZERO; + TRigaGruppo& riga = (TRigaGruppo&)_righe[data2row(gruppo,rh)]; + row.reset(); + rigastampa = ""; + rigastampa << gruppo; + rigastampa << " "; + rigastampa << rh; + int pos = 12; + const char* indicedm = "DM"; + real& colonnadm = (real&)_colonne->find(indicedm); + rigatotali.aggiorna_valore(colonnadm.integer(),riga[colonnadm.integer()]); + totdonazioni+=riga[colonnadm.integer()]; + valore = ""; + valore.format("%8d",riga[colonnadm.integer()].integer()); + rigastampa.overwrite((const char*)valore, pos); + pos = pos+8; + const char* indicedf = "DF"; + real& colonnadf = (real&)_colonne->find(indicedf); + rigatotali.aggiorna_valore(colonnadf.integer(),riga[colonnadf.integer()]); + totdonazioni+=riga[colonnadf.integer()]; + valore = ""; + valore.format("%8d",riga[colonnadf.integer()].integer()); + rigastampa.overwrite((const char*)valore, pos); + pos = pos+8; + // stampo totale donazioni + valore = ""; + valore.format("%8d",totdonazioni.integer()); + rigastampa.overwrite((const char*)valore, pos); + pos = pos+10; + + const char* indicesm = "SM"; + real& colonnasm = (real&)_colonne->find(indicesm); + totsoggetti+=riga[colonnasm.integer()]; + rigatotali.aggiorna_valore(colonnasm.integer(),riga[colonnasm.integer()]); + valore = ""; + valore.format("%8d",riga[colonnasm.integer()].integer()); + rigastampa.overwrite((const char*)valore, pos); + pos = pos+8; + const char* indicesf = "SF"; + real& colonnasf = (real&)_colonne->find(indicesf); + totsoggetti+=riga[colonnasf.integer()]; + rigatotali.aggiorna_valore(colonnasf.integer(),riga[colonnasf.integer()]); + valore = ""; + valore.format("%8d",riga[colonnasf.integer()].integer()); + rigastampa.overwrite((const char*)valore, pos); + pos = pos+8; + // stampo totale donatori + valore = ""; + valore.format("%8d",totsoggetti.integer()); + rigastampa.overwrite((const char*)valore, pos); + pos = pos+14; + + // percentuale + if (totsoggetti.integer()!=0) + { + // maschi + if (riga[colonnasm.integer()].integer() != 0) + { + valore = ""; + real perc = riga[colonnadm.integer()] / riga[colonnasm.integer()]; + valore << perc.string(3,3); + rigastampa.overwrite((const char*)valore, pos); + } + pos = pos+8; + // femmine + if (riga[colonnasf.integer()].integer() != 0) + { + valore = ""; + real perc = riga[colonnadf.integer()] / riga[colonnasf.integer()]; + valore << perc.string(3,3); + rigastampa.overwrite((const char*)valore, pos); + } + pos = pos+8; + // totale + valore = ""; + real perc = totdonazioni / totsoggetti; + valore << perc.string(3,3); + rigastampa.overwrite((const char*)valore, pos); + pos = pos+10; + } + + if (totdonazioni!=0) + { + row.put((const char*) rigastampa); + printer().print(row); + } + } + } + // stampa totali per sezione + rigastampa = ""; + rigastampa.fill('-'); + row.reset(); + row.put(rigastampa); + printer().print(row); + row.reset(); + rigastampa = ""; + rigastampa = "Totale"; + + totsoggetti = ZERO; + totdonazioni = ZERO; + int pos = 12; + const char* indicedm = "DM"; + real& colonnadm = (real&)_colonne->find(indicedm); + totdonazioni+=rigatotali[colonnadm.integer()]; + valore = ""; + valore.format("%8d",rigatotali[colonnadm.integer()].integer()); + rigastampa.overwrite((const char*)valore, pos); + pos = pos+8; + const char* indicedf = "DF"; + real& colonnadf = (real&)_colonne->find(indicedf); + totdonazioni+=rigatotali[colonnadf.integer()]; + valore = ""; + valore.format("%8d",rigatotali[colonnadf.integer()].integer()); + rigastampa.overwrite((const char*)valore, pos); + pos = pos+8; + // stampo totale donazioni + valore = ""; + valore.format("%8d",totdonazioni.integer()); + rigastampa.overwrite((const char*)valore, pos); + pos = pos+10; + const char* indicesm = "SM"; + real& colonnasm = (real&)_colonne->find(indicesm); + totsoggetti+=rigatotali[colonnasm.integer()]; + valore = ""; + valore.format("%8d",rigatotali[colonnasm.integer()].integer()); + rigastampa.overwrite((const char*)valore, pos); + pos = pos+8; + const char* indicesf = "SF"; + real& colonnasf = (real&)_colonne->find(indicesf); + totsoggetti+=rigatotali[colonnasf.integer()]; + valore = ""; + valore.format("%8d",rigatotali[colonnasf.integer()].integer()); + rigastampa.overwrite((const char*)valore, pos); + pos = pos+8; + // stampo totale donatori + valore = ""; + valore.format("%8d",totsoggetti.integer()); + rigastampa.overwrite((const char*)valore, pos); + + pos = pos+14; + + // percentuale + if (totsoggetti.integer()!=0) + { + // maschi + if (rigatotali[colonnasm.integer()].integer() != 0) + { + valore = ""; + real perc = rigatotali[colonnadm.integer()] / rigatotali[colonnasm.integer()]; + valore << perc.string(3,3); + rigastampa.overwrite((const char*)valore, pos); + } + pos = pos+8; + // femmine + if (rigatotali[colonnasf.integer()].integer() != 0) + { + valore = ""; + real perc = rigatotali[colonnadf.integer()] / rigatotali[colonnasf.integer()]; + valore << perc.string(3,3); + rigastampa.overwrite((const char*)valore, pos); + } + pos = pos+8; + // totale + valore = ""; + real perc = totdonazioni / totsoggetti; + valore << perc.string(3,3); + rigastampa.overwrite((const char*)valore, pos); + pos = pos+10; + } + row.put((const char*) rigastampa); + printer().print(row); + printer().formfeed(); } -bool TConvBO_application::user_destroy() -{ - delete _msk; - delete _rel; - delete _form_eti; - return TRUE; -} +bool TStatDonGrRh::riepilogo() +{ + if (crea_colonne() && crea_righe()) + { + _asoggetti->destroy(); + // cancello i risultati della elaborazione precedente + TLocalisamfile stat(LF_ATSTATD); + for (stat.first(); !stat.eof(); stat.next()) + stat.remove(); + stat.setkey(3); + // filtro per data + TRectype da(LF_DONAZ); + TRectype a (LF_DONAZ); + if (_dataini.ok()) + da.put(DON_DATADON, _dataini); + if (_datafin.ok()) + a.put(DON_DATADON, _datafin); + _cur = new TCursor(_rel, "", 2, &da, &a); + TString256 filtro = ""; + // filtro per tipo donazione + if (_tipodon.not_empty()) + { + if (filtro.empty()) + filtro = format("(92->TIPODON == \"%s\")",(const char*)_tipodon); + else + { + filtro << " && "; + filtro << format("(92->TIPODON == \"%s\")",(const char*)_tipodon); + } + } + // filtro per sezione/sottogruppo + if (_sezini.not_empty()) + { + if (filtro.empty()) + filtro = format("(90->CODSEZ >= \"%s\")",(const char*)_sezini); + else + { + filtro << " && "; + filtro << format("(90->CODSEZ >= \"%s\")",(const char*)_sezini); + } + if (_sotini.not_empty()) + { + if (filtro.empty()) + filtro = format("(90->CODSOT >= \"%s\")",(const char*)_sotini); + else + { + filtro << " && "; + filtro << format("(90->CODSOT >= \"%s\")",(const char*)_sotini); + } + } + } + if (_sezfin.not_empty()) + { + if (filtro.empty()) + filtro = format("(90->CODSEZ <= \"%s\")",(const char*)_sezfin); + else + { + filtro << " && "; + filtro << format("(90->CODSEZ <= \"%s\")",(const char*)_sezfin); + } + if (_sotfin.not_empty()) + { + if (filtro.empty()) + filtro = format("(90->CODSOT <= \"%s\")",(const char*)_sotfin); + else + { + filtro << " && "; + filtro << format("(90->CODSOT <= \"%s\")",(const char*)_sotfin); + } + } + } + _cur->setfilter((const char*) filtro, TRUE); + TString16 codsez, codsot, tipodon, sesso; + TDate datadon; + TString16 gruppo, rh; + long numero; + bool esiste; + TRectype& recdon = _cur->curr(); + TRectype& recsog = _cur->curr(LF_SOGGETTI); + long last = _cur->items(); + TProgind prg (last, "Elaborazione in corso... Prego attendere", FALSE, TRUE, 30); + for ( *_cur=0; _cur->pos() < last; ++(*_cur) ) + { + prg.addstatus(1); + const char* codice = recsog.get(SOG_CODICE); + if (_asoggetti->is_key(codice)) + esiste = TRUE; + else + { + _asoggetti->add(codice); + esiste = FALSE; + } + codsez = recdon.get(DON_CODSEZ); + codsot = recdon.get(DON_CODSOT); + if (codsez.empty()) + { + codsez = recsog.get(SOG_CODSEZ); + codsot = recsog.get(SOG_CODSOT); + } + sesso = recsog.get(SOG_SESSO); + gruppo = recsog.get(SOG_GRUPPOAB0); + if (gruppo == "A1" || gruppo == "A2") + gruppo = "A"; + if (gruppo == "A1B" || gruppo == "A2B") + gruppo = "AB"; + + rh = recsog.get(SOG_RHANTID); + stat.zero(); + stat.put(ATS_CODSEZ, codsez); + stat.put(ATS_CODSOT, codsot); + stat.put(ATS_GRUPPO, gruppo); + stat.put(ATS_RH, rh); + if (stat.read() == NOERR) + { + if (sesso == "1") + numero = stat.get_long(ATS_NUMERO); + else + numero = stat.get_long(ATS_NUMERO2); + numero++; + if (sesso == "1") + stat.put(ATS_NUMERO, numero); + else + stat.put(ATS_NUMERO2, numero); + if (!esiste) + { + if (sesso == "1") + numero = stat.get_long(ATS_NUMPRIME); + else + numero = stat.get_long(ATS_NUMPRIME2); + numero++; + if (sesso == "1") + stat.put(ATS_NUMPRIME, numero); + else + stat.put(ATS_NUMPRIME2, numero); + } + stat.rewrite(); + } + else + { + stat.zero(); + stat.put(ATS_CODSEZ, codsez); + stat.put(ATS_CODSOT, codsot); + stat.put(ATS_GRUPPO, gruppo); + stat.put(ATS_RH, rh); + numero = 1; + if (sesso == "1") + { + stat.put(ATS_NUMERO, numero); + stat.put(ATS_NUMPRIME, numero); + } + else + { + stat.put(ATS_NUMERO2, numero); + stat.put(ATS_NUMPRIME2, numero); + } + stat.write(); + } + } + return (stat.eod() > 0); + } + else + return FALSE; +} int at3600(int argc, char* argv[]) { - - TConvBO_application a; - - a.run(argc, argv, "Convocazioni su punto di raccolta"); - - return 0; -} + TStatDonGrRh a; + a.run(argc, argv, "Statistica donazioni/donatori"); + return 0; +} \ No newline at end of file diff --git a/at/at3600a.h b/at/at3600a.h index 705a2dd5b..994d6bd06 100755 --- a/at/at3600a.h +++ b/at/at3600a.h @@ -1,16 +1,16 @@ -// Convocazione per BOLOGNA +// statistica donazioni per gruppo e rh // definizione campi per maschera di selezione -#define F_DATACONV 101 -#define F_PUNTO 102 -#define F_D_PUNTO 103 -#define F_TIPODON 104 -#define F_D_TIPODON 105 -#define F_CODSEZ 106 -#define F_DENSEZ 107 -#define F_CODSOT 108 -#define F_DENSOT 109 +#define F_SEZINI 101 +#define F_D_SEZINI 102 +#define F_SOTINI 103 +#define F_D_SOTINI 104 +#define F_SEZFIN 105 +#define F_D_SEZFIN 106 +#define F_SOTFIN 107 +#define F_D_SOTFIN 108 -#define F_ELENCO 401 -#define F_ETICHETTE 402 -#define F_CARTOLINE 403 +#define F_DATAINI 301 +#define F_DATAFIN 302 +#define F_TIPODON 303 +#define F_D_TIPODON 304 diff --git a/at/at3600a.uml b/at/at3600a.uml new file mode 100755 index 000000000..9d298dc80 --- /dev/null +++ b/at/at3600a.uml @@ -0,0 +1,168 @@ +#include "at3600a.h" + +PAGE "Statistica donazioni/donatori" -1 -1 78 12 + +GROUPBOX DLG_NULL 77 4 +BEGIN + PROMPT 1 1 "Scelta sezioni/sottogruppi" +END + +STRING F_SEZINI 2 +BEGIN + PROMPT 2 2 "Da " + FLAGS "U" + USE LF_SEZIONI + INPUT CODSEZ F_SEZINI + INPUT CODSOT F_SOTINI + DISPLAY "Cod.sez" CODSEZ + DISPLAY "Cod.sot." CODSOT + DISPLAY "Sezione@25" DENSEZ + DISPLAY "Sottogruppo@25" DENSOT + OUTPUT F_SEZINI CODSEZ + OUTPUT F_D_SEZINI DENSEZ + OUTPUT F_SOTINI CODSOT + OUTPUT F_D_SOTINI DENSOT + CHECKTYPE SEARCH + HELP "Codice sezione da cui partire" +END + +STRING F_D_SEZINI 25 +BEGIN + PROMPT 11 2 "" + FLAGS "U" + USE LF_SEZIONI KEY 2 + INPUT DENSEZ F_D_SEZINI + DISPLAY "Sezione@25" DENSEZ + DISPLAY "Sottogruppo@25" DENSOT + DISPLAY "Cod.sez" CODSEZ + DISPLAY "Cod.sot." CODSOT + COPY OUTPUT F_SEZINI + CHECKTYPE NORMAL + HELP "Sezione da cui partire" +END + +STRING F_SOTINI 2 +BEGIN + PROMPT 2 3 " " + COPY ALL F_SEZINI + CHECKTYPE SEARCH + HELP "Codice sottogruppo da cui partire" +END + +STRING F_D_SOTINI 25 +BEGIN + PROMPT 11 3 "" + FLAGS "U" + COPY USE F_D_SEZINI + INPUT DENSEZ F_D_SEZINI + INPUT DENSOT F_D_SOTINI + COPY DISPLAY F_D_SEZINI + COPY OUTPUT F_D_SEZINI + CHECKTYPE NORMAL + HELP "Sottogruppo da cui partire" +END + +STRING F_SEZFIN 2 +BEGIN + PROMPT 41 2 "A " + FLAGS "U" + USE LF_SEZIONI + INPUT CODSEZ F_SEZFIN + INPUT CODSOT F_SOTFIN + DISPLAY "Cod.sez" CODSEZ + DISPLAY "Cod.sot." CODSOT + DISPLAY "Sezione@25" DENSEZ + DISPLAY "Sottogruppo@25" DENSOT + OUTPUT F_SEZFIN CODSEZ + OUTPUT F_D_SEZFIN DENSEZ + OUTPUT F_SOTFIN CODSOT + OUTPUT F_D_SOTFIN DENSOT + CHECKTYPE SEARCH + HELP "Codice sezione finale" +END + +STRING F_D_SEZFIN 25 +BEGIN + PROMPT 49 2 "" + FLAGS "U" + USE LF_SEZIONI KEY 2 + INPUT DENSEZ F_D_SEZFIN + DISPLAY "Sezione@25" DENSEZ + DISPLAY "Sottogruppo@25" DENSOT + DISPLAY "Cod.sez" CODSEZ + DISPLAY "Cod.sot." CODSOT + COPY OUTPUT F_SEZFIN + CHECKTYPE NORMAL + HELP "Sezione finale" +END + +STRING F_SOTFIN 2 +BEGIN + PROMPT 41 3 " " + COPY ALL F_SEZFIN + CHECKTYPE SEARCH + HELP "Codice sottogruppo finale" +END + +STRING F_D_SOTFIN 25 +BEGIN + PROMPT 49 3 "" + FLAGS "U" + COPY USE F_D_SEZFIN + INPUT DENSEZ F_D_SEZFIN + INPUT DENSOT F_D_SOTFIN + COPY DISPLAY F_D_SEZFIN + COPY OUTPUT F_D_SEZFIN + CHECKTYPE NORMAL + HELP "Sottogruppo finale" +END + +GROUPBOX DLG_NULL 77 4 +BEGIN + PROMPT 1 5 "Opzioni per la statistica" +END + +DATE F_DATAINI +BEGIN + PROMPT 2 6 "Donazioni effettuate dal " + HELP "Data iniziale" +END + +DATE F_DATAFIN +BEGIN + PROMPT 40 6 "al " + HELP "Data finale" +END + +STRING F_TIPODON 2 +BEGIN + PROMPT 2 7 "Tipo donazioni " + FLAGS "U" + USE TDN + INPUT CODTAB F_TIPODON + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@30" S0 + OUTPUT F_TIPODON CODTAB + OUTPUT F_D_TIPODON S0 + CHECKTYPE NORMAL + WARNING "Codice non presente" +END + +STRING F_D_TIPODON 30 +BEGIN + PROMPT 23 7 "" + FLAGS "D" +END + +BUTTON DLG_OK 9 2 +BEGIN + PROMPT -12 -1 "" +END + +BUTTON DLG_QUIT 9 2 +BEGIN + PROMPT -22 -1 "" +END + +ENDPAGE +ENDMASK diff --git a/at/at3700.cpp b/at/at3700.cpp new file mode 100755 index 000000000..256d9fc56 --- /dev/null +++ b/at/at3700.cpp @@ -0,0 +1,601 @@ +#include +//#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "at3.h" + +// nomi campi maschera +#include "at3700a.h" + +// nomi dei campi +#include "soggetti.h" +#include "atstats.h" +#include "sezioni.h" + +// classe per la definizione di una riga di statistica +class TRigaSGruppo : public TObject +{ + TString16 _gruppo, _rh; + TArray _valori; + +protected: + const TRigaSGruppo& copy(const TRigaSGruppo& riga); +public: + const TString16 gruppo() const { return _gruppo; } + const TString16 rh() const { return _rh; } + TObject* dup() const { return new TRigaSGruppo(*this); } + const TRigaSGruppo& operator = (const TRigaSGruppo& riga); + const real& operator [] (int colonna) const; + void aggiorna_valore(int colonna, const real& numero) ; + void azzera_valori(); + // costruttore + TRigaSGruppo(TString16 gruppo, TString16 rh) {_gruppo = gruppo; _rh = rh;} + // costruttore di copia + TRigaSGruppo(const TRigaSGruppo& riga) { copy(riga); } + virtual ~TRigaSGruppo() {}; +}; + +const TRigaSGruppo& TRigaSGruppo::copy(const TRigaSGruppo& riga) +{ + _gruppo = riga._gruppo; + _rh = riga._rh; + _valori = riga._valori; + return (*this); +} + +const TRigaSGruppo& TRigaSGruppo::operator = (const TRigaSGruppo& riga) +{ + copy(riga); + return (*this); +} + +const real& TRigaSGruppo::operator [] (int colonna) const +{ + real* valore = (real*)_valori.objptr(colonna); + if (valore == NULL) + return ZERO; + else + return *valore; +} + +void TRigaSGruppo::aggiorna_valore(int colonna, const real& numero) +{ + real* valore = (real*)_valori.objptr(colonna); + if (valore == NULL) + _valori.add(new real(numero), colonna); + else + *valore += numero; +} + +void TRigaSGruppo::azzera_valori() +{ + _valori.destroy(); +} + +class TStatisticaSog : public TApplication +{ + TMask* _msk; + TRelation* _rel; + TCursor* _cur; + TLocalisamfile* _sezioni; + TLocalisamfile* _soggetti; + TLocalisamfile* _atstats; + TAssoc_array* _colonne; + TArray _righe; + TString16 _sezini, _sotini, _sezfin, _sotfin; + TString16 _catdon; + TDate _data; + +protected: + virtual bool create(); + virtual bool destroy(); + virtual bool menu(MENU_TAG m); + virtual TMask& get_mask() { return *_msk; } + virtual TRelation* get_relation() const { return _rel; } + int data2row(const TString16 gruppo, const TString16 rh); + bool riepilogo(); + bool stampa(); + bool crea_colonne(); + bool crea_righe(); + void azzera_righe(); + void stampa_sezione(TString16 codsez, TString16 codsot); + void crea_intestazione(); +public: + TStatisticaSog() {} + +}; + +HIDDEN inline TStatisticaSog& app() { return (TStatisticaSog&) main_app(); } + +int TStatisticaSog::data2row(const TString16 gruppo, const TString16 rh) +{ + int igruppo = 0; + int irh = 0; + if (gruppo == "0") + igruppo = 1; + if (gruppo == "A") + igruppo = 2; + if (gruppo == "A1") + igruppo = 3; + if (gruppo == "A2") + igruppo = 4; + if (gruppo == "A1B") + igruppo = 5; + if (gruppo == "A2B") + igruppo = 6; + if (gruppo == "AB") + igruppo = 7; + if (gruppo == "B") + igruppo = 8; + if (rh == "POS") + irh = 1; + if (rh == "NEG") + irh = 2; + return igruppo*10 + irh; +} + +bool TStatisticaSog::crea_colonne() +{ + _colonne->destroy(); + real contatore(ZERO); + real* oggetto = new real(contatore); + const char* indice = "0"; + _colonne->add(indice,(TObject*)oggetto); + indice = "1"; // maschi + contatore = contatore+1; + real* oggetto2 = new real(contatore); + _colonne->add(indice,(TObject*)oggetto2); + indice = "2"; // femmine + contatore = contatore+1; + real* oggetto3 = new real(contatore); + _colonne->add(indice,(TObject*)oggetto3); + indice = "9"; // non spec. + contatore = contatore+1; + real* oggetto4 = new real(contatore); + _colonne->add(indice,(TObject*)oggetto4); + return TRUE; +} + +bool TStatisticaSog::crea_righe() +{ + TString16 gruppo, rh; + for (int igruppo=0;igruppo<=8;igruppo++) + { + switch (igruppo) + { + case 0 : gruppo = ""; break; + case 1 : gruppo = "0"; break; + case 2 : gruppo = "A"; break; + case 3 : gruppo = "A1"; break; + case 4 : gruppo = "A2"; break; + case 5 : gruppo = "A1B"; break; + case 6 : gruppo = "A2B"; break; + case 7 : gruppo = "AB"; break; + case 8 : gruppo = "B"; break; + } + for (int irh=0;irh <=2;irh++) + { + switch (irh) + { + case 1 : rh = "POS"; break; + case 2 : rh = "NEG"; break; + default : rh = " "; break; + } + _righe.add(new TRigaSGruppo(gruppo, rh), data2row(gruppo, rh)); + } + } + return _righe.items()>0; +} + + + +bool TStatisticaSog::create() +{ + TApplication::create(); + _msk = new TMask("at3700a"); + _rel = new TRelation(LF_SOGGETTI); + _soggetti = new TLocalisamfile(LF_SOGGETTI); + _atstats = new TLocalisamfile(LF_ATSTATS); + _sezioni = new TLocalisamfile(LF_SEZIONI); + _colonne = new TAssoc_array(); + dispatch_e_menu(BAR_ITEM(1)); + return TRUE; +} + +bool TStatisticaSog::destroy() +{ + delete _rel; + delete _msk; + delete _soggetti; + delete _atstats; + delete _sezioni; + delete _colonne; + return TApplication::destroy(); +} + +bool TStatisticaSog::menu(MENU_TAG m) +{ + TMask& msk = get_mask(); + KEY tasto; + tasto = msk.run(); + if (tasto == K_ENTER) + { + _sezini = _msk->get(F_SEZINI); + _sotini = _msk->get(F_SOTINI); + _sezfin = _msk->get(F_SEZFIN); + _sotfin = _msk->get(F_SOTFIN); + _catdon = _msk->get(F_CATDON); + _data = _msk->get_date(F_DATA); + if (riepilogo()) + stampa(); + } + return FALSE; +} + +void TStatisticaSog::crea_intestazione() +{ + TPrintrow row; + TString256 sep; + sep = "STATISTICA SOGGETTI PER SESSO, GRUPPO E RH al "; + sep << _data.string(); + sep.center_just(80); + row.put(sep); + row.put("@>", 1); + row.put("Pag. @#", 70); + printer().setheaderline(2, row); + sep = ""; + sep << "Categoria "; + sep << _catdon; + sep.center_just(80); + row.reset(); + row.put(sep); + printer().setheaderline(3, row); + sep = ""; + sep << "Gruppo/Rh Sconosciuto Maschi Femmine Non spec. Totale"; + row.reset(); + row.put(sep); + printer().setheaderline(5, row); + sep = ""; + sep.fill('-'); + row.reset(); + row.put(sep); + printer().setheaderline(6, row); +} + +bool TStatisticaSog::stampa() +{ + if (printer().open()) + { + crea_intestazione(); + TRelation* relstat = new TRelation(LF_ATSTATS); + TCursor* curstat = new TCursor(relstat, "", 1); + TString16 oldsez = "**"; + TString16 oldsot = "**"; + double numero; + TString16 actsez, actsot; + TString16 gruppo, rh, sesso; + long last = curstat->items(); + for ( *curstat=0; curstat->pos() < last; ++(*curstat) ) + { + actsez = curstat->curr().get(ATSS_CODSEZ); + actsot = curstat->curr().get(ATSS_CODSOT); + gruppo = curstat->curr().get(ATSS_GRUPPO); + rh = curstat->curr().get(ATSS_RH); + sesso = curstat->curr().get(ATSS_SESSO); + if (sesso.empty()) + sesso = "9"; + numero = (double)curstat->curr().get_int(ATSS_NUMERO); + if (actsez != oldsez || actsot != oldsot) + { + if (oldsez != "**" && oldsot != "**") + { + stampa_sezione(oldsez,oldsot); + azzera_righe(); + } + oldsez = actsez; + oldsot = actsot; + } + TRigaSGruppo& riga = (TRigaSGruppo&)_righe[data2row(gruppo,rh)]; + real& colonna = (real&)_colonne->find((const char*)sesso); + real n = numero; + riga.aggiorna_valore(colonna.integer(),n); + } + if (oldsez != "**" && oldsot != "**") + stampa_sezione(oldsez,oldsot); + delete curstat; + delete relstat; + printer().close(); + return TRUE; + } + else + return FALSE; +} + +void TStatisticaSog::azzera_righe() +{ + TString16 gruppo, rh; + for (int igruppo=0;igruppo<=8;igruppo++) + { + switch (igruppo) + { + case 0 : gruppo = ""; break; + case 1 : gruppo = "0"; break; + case 2 : gruppo = "A"; break; + case 3 : gruppo = "A1"; break; + case 4 : gruppo = "A2"; break; + case 5 : gruppo = "A1B"; break; + case 6 : gruppo = "A2B"; break; + case 7 : gruppo = "AB"; break; + case 8 : gruppo = "B"; break; + } + for (int irh=0;irh <=2;irh++) + { + switch (irh) + { + case 1 : rh = "POS"; break; + case 2 : rh = "NEG"; break; + default : rh = " "; break; + } + TRigaSGruppo& riga = (TRigaSGruppo&)_righe[data2row(gruppo,rh)]; + riga.azzera_valori(); + } + } +} + +void TStatisticaSog::stampa_sezione(TString16 codsez, TString16 codsot) +{ + TPrintrow row; + TString256 rigastampa; + rigastampa = "Sezione: "; + rigastampa << codsez; + if (codsot.not_empty()) + { + rigastampa << "/"; + rigastampa << codsot; + } + rigastampa << " "; + TLocalisamfile sezioni(LF_SEZIONI); + sezioni.setkey(1); + sezioni.zero(); + sezioni.put(SEZ_CODSEZ,codsez); + sezioni.put(SEZ_CODSOT,codsot); + if (sezioni.read() == NOERR) + { + TString80 den = sezioni.get(SEZ_DENSEZ); + rigastampa << den; + den = sezioni.get(SEZ_DENSOT); + if (den.not_empty()) + { + rigastampa << "/"; + rigastampa << den; + } + } + rigastampa.center_just(80); + row.put(rigastampa); + printer().setheaderline(1, row); + + TRigaSGruppo rigatotali(" "," "); + TString16 valore; + TString16 gruppo, rh; + real totalegruppo = ZERO; + for (int igruppo=0;igruppo<=8;igruppo++) + { + switch (igruppo) + { + case 0 : gruppo = ""; break; + case 1 : gruppo = "0"; break; + case 2 : gruppo = "A"; break; + case 3 : gruppo = "A1"; break; + case 4 : gruppo = "A2"; break; + case 5 : gruppo = "A1B"; break; + case 6 : gruppo = "A2B"; break; + case 7 : gruppo = "AB"; break; + case 8 : gruppo = "B"; break; + } + for (int irh=0;irh <=2;irh++) + { + switch (irh) + { + case 1 : rh = "POS"; break; + case 2 : rh = "NEG"; break; + default : rh = " "; break; + } + TRigaSGruppo& riga = (TRigaSGruppo&)_righe[data2row(gruppo,rh)]; + row.reset(); + rigastampa = ""; + rigastampa << gruppo; + rigastampa << " "; + rigastampa << rh; + totalegruppo = ZERO; + int pos = 21; + for (int i=0;i<_colonne->items();i++) + { + rigatotali.aggiorna_valore(i,riga[i]); + totalegruppo+=riga[i]; + valore = ""; + valore.format("%8d",riga[i].integer()); + rigastampa.overwrite((const char*)valore, pos); + pos = pos+10; + } + if (totalegruppo != 0) + { + valore = ""; + valore.format("%8d",totalegruppo.integer()); + rigastampa.overwrite((const char*)valore, pos+4); + row.put((const char*) rigastampa); + printer().print(row); + } + } + } + + // stampa totali per sezione + rigastampa = ""; + rigastampa.fill('-'); + row.reset(); + row.put(rigastampa); + printer().print(row); + row.reset(); + rigastampa = ""; + rigastampa = "Totale"; + real totale; + totale = ZERO; + int pos = 21; + for (int i=0;i<_colonne->items();i++) + { + totale+=rigatotali[i]; + valore = ""; + valore.format("%8d",rigatotali[i].integer()); + rigastampa.overwrite((const char*)valore, pos); + pos = pos+10; + } + valore = ""; + valore.format("%8d",totale.integer()); + rigastampa.overwrite((const char*)valore, pos+4); + row.put((const char*) rigastampa); + printer().print(row); + printer().formfeed(); +} + +bool TStatisticaSog::riepilogo() +{ + if (crea_colonne() && crea_righe()) + { + // cancello i risultati della elaborazione precedente + TLocalisamfile stat(LF_ATSTATS); + for (stat.first(); !stat.eof(); stat.next()) + stat.remove(); + stat.setkey(1); + _cur = new TCursor(_rel, "", 1); + TString256 filtro = ""; + + // filtro per categoria + if (_catdon.not_empty()) + { + if (filtro.empty()) + filtro = format("(90->CATDON == \"%s\")",(const char*)_catdon); + else + { + filtro << " && "; + filtro << format("(90->CATDON == \"%s\")",(const char*)_catdon); + } + if (_data.ok()) + { + TTable ctd("CTD"); + ctd.put("CODTAB",_catdon); + if (ctd.read() == NOERR) + { + bool dimissione = ctd.get_bool("B0"); + if (dimissione) + filtro << " && (ANSI(90->DATADIM)<=" << _data.string(ANSI) << ")"; + else + filtro << " && (ANSI(90->DATAISC)<=" << _data.string(ANSI) << ")"; + } + } + } + // filtro per sezione/sottogruppo + if (_sezini.not_empty()) + { + if (filtro.empty()) + filtro = format("(90->CODSEZ >= \"%s\")",(const char*)_sezini); + else + { + filtro << " && "; + filtro << format("(90->CODSEZ >= \"%s\")",(const char*)_sezini); + } + if (_sotini.not_empty()) + { + if (filtro.empty()) + filtro = format("(90->CODSOT >= \"%s\")",(const char*)_sotini); + else + { + filtro << " && "; + filtro << format("(90->CODSOT >= \"%s\")",(const char*)_sotini); + } + } + } + if (_sezfin.not_empty()) + { + if (filtro.empty()) + filtro = format("(90->CODSEZ <= \"%s\")",(const char*)_sezfin); + else + { + filtro << " && "; + filtro << format("(90->CODSEZ <= \"%s\")",(const char*)_sezfin); + } + if (_sotfin.not_empty()) + { + if (filtro.empty()) + filtro = format("(90->CODSOT <= \"%s\")",(const char*)_sotfin); + else + { + filtro << " && "; + filtro << format("(90->CODSOT <= \"%s\")",(const char*)_sotfin); + } + } + } + _cur->setfilter((const char*) filtro, TRUE); + TString16 codsez, codsot; + long numero; + TString16 gruppo, rh, sesso; + + TRectype& recsog = _cur->curr(); + long last = _cur->items(); + TProgind prg (last, "Elaborazione in corso... Prego attendere", FALSE, TRUE, 30); + for ( *_cur=0; _cur->pos() < last; ++(*_cur) ) + { + prg.addstatus(1); + codsez = recsog.get(SOG_CODSEZ); + codsot = recsog.get(SOG_CODSOT); + gruppo = recsog.get(SOG_GRUPPOAB0); + rh = recsog.get(SOG_RHANTID); + sesso = recsog.get(SOG_SESSO); + if (sesso.empty()) + sesso = "9"; + if (gruppo == "A1" || gruppo == "A2") + gruppo = "A"; + if (gruppo == "A1B" || gruppo == "A2B") + gruppo = "AB"; + stat.zero(); + stat.put(ATSS_CODSEZ, codsez); + stat.put(ATSS_CODSOT, codsot); + stat.put(ATSS_SESSO, sesso); + stat.put(ATSS_GRUPPO, gruppo); + stat.put(ATSS_RH, rh); + if (stat.read() == NOERR) + { + numero = stat.get_long(ATSS_NUMERO); + numero++; + stat.put(ATSS_NUMERO, numero); + stat.rewrite(); + } + else + { + stat.put(ATSS_CODSEZ, codsez); + stat.put(ATSS_CODSOT, codsot); + stat.put(ATSS_SESSO, sesso); + stat.put(ATSS_GRUPPO, gruppo); + stat.put(ATSS_RH, rh); + numero = 1; + stat.put(ATSS_NUMERO, numero); + stat.write(); + } + } + return (stat.eod() > 0); + } + else + return FALSE; +} + +int at3700(int argc, char* argv[]) +{ + TStatisticaSog a; + a.run(argc, argv, "Statistica soggetti per sesso, gruppo e rh"); + return 0; +} \ No newline at end of file diff --git a/at/at3700a.h b/at/at3700a.h new file mode 100755 index 000000000..8232df6b0 --- /dev/null +++ b/at/at3700a.h @@ -0,0 +1,15 @@ +// statistica SOGGETTI PER SESSO E GRUPPO/RH +// definizione campi per maschera di selezione + +#define F_SEZINI 101 +#define F_D_SEZINI 102 +#define F_SOTINI 103 +#define F_D_SOTINI 104 +#define F_SEZFIN 105 +#define F_D_SEZFIN 106 +#define F_SOTFIN 107 +#define F_D_SOTFIN 108 + +#define F_CATDON 301 +#define F_D_CATDON 302 +#define F_DATA 303 diff --git a/at/at3700a.uml b/at/at3700a.uml new file mode 100755 index 000000000..232e0a34c --- /dev/null +++ b/at/at3700a.uml @@ -0,0 +1,163 @@ +#include "at3700a.h" + +PAGE "Statistica donatori per sesso, gruppo e rh" -1 -1 78 12 + +GROUPBOX DLG_NULL 77 4 +BEGIN + PROMPT 1 1 "Scelta sezioni/sottogruppi" +END + +STRING F_SEZINI 2 +BEGIN + PROMPT 2 2 "Da " + FLAGS "U" + USE LF_SEZIONI + INPUT CODSEZ F_SEZINI + INPUT CODSOT F_SOTINI + DISPLAY "Cod.sez" CODSEZ + DISPLAY "Cod.sot." CODSOT + DISPLAY "Sezione@25" DENSEZ + DISPLAY "Sottogruppo@25" DENSOT + OUTPUT F_SEZINI CODSEZ + OUTPUT F_D_SEZINI DENSEZ + OUTPUT F_SOTINI CODSOT + OUTPUT F_D_SOTINI DENSOT + CHECKTYPE SEARCH + HELP "Codice sezione da cui partire" +END + +STRING F_D_SEZINI 25 +BEGIN + PROMPT 11 2 "" + FLAGS "U" + USE LF_SEZIONI KEY 2 + INPUT DENSEZ F_D_SEZINI + DISPLAY "Sezione@25" DENSEZ + DISPLAY "Sottogruppo@25" DENSOT + DISPLAY "Cod.sez" CODSEZ + DISPLAY "Cod.sot." CODSOT + COPY OUTPUT F_SEZINI + CHECKTYPE NORMAL + HELP "Sezione da cui partire" +END + +STRING F_SOTINI 2 +BEGIN + PROMPT 2 3 " " + COPY ALL F_SEZINI + CHECKTYPE SEARCH + HELP "Codice sottogruppo da cui partire" +END + +STRING F_D_SOTINI 25 +BEGIN + PROMPT 11 3 "" + FLAGS "U" + COPY USE F_D_SEZINI + INPUT DENSEZ F_D_SEZINI + INPUT DENSOT F_D_SOTINI + COPY DISPLAY F_D_SEZINI + COPY OUTPUT F_D_SEZINI + CHECKTYPE NORMAL + HELP "Sottogruppo da cui partire" +END + +STRING F_SEZFIN 2 +BEGIN + PROMPT 41 2 "A " + FLAGS "U" + USE LF_SEZIONI + INPUT CODSEZ F_SEZFIN + INPUT CODSOT F_SOTFIN + DISPLAY "Cod.sez" CODSEZ + DISPLAY "Cod.sot." CODSOT + DISPLAY "Sezione@25" DENSEZ + DISPLAY "Sottogruppo@25" DENSOT + OUTPUT F_SEZFIN CODSEZ + OUTPUT F_D_SEZFIN DENSEZ + OUTPUT F_SOTFIN CODSOT + OUTPUT F_D_SOTFIN DENSOT + CHECKTYPE SEARCH + HELP "Codice sezione finale" +END + +STRING F_D_SEZFIN 25 +BEGIN + PROMPT 49 2 "" + FLAGS "U" + USE LF_SEZIONI KEY 2 + INPUT DENSEZ F_D_SEZFIN + DISPLAY "Sezione@25" DENSEZ + DISPLAY "Sottogruppo@25" DENSOT + DISPLAY "Cod.sez" CODSEZ + DISPLAY "Cod.sot." CODSOT + COPY OUTPUT F_SEZFIN + CHECKTYPE NORMAL + HELP "Sezione finale" +END + +STRING F_SOTFIN 2 +BEGIN + PROMPT 41 3 " " + COPY ALL F_SEZFIN + CHECKTYPE SEARCH + HELP "Codice sottogruppo finale" +END + +STRING F_D_SOTFIN 25 +BEGIN + PROMPT 49 3 "" + FLAGS "U" + COPY USE F_D_SEZFIN + INPUT DENSEZ F_D_SEZFIN + INPUT DENSOT F_D_SOTFIN + COPY DISPLAY F_D_SEZFIN + COPY OUTPUT F_D_SEZFIN + CHECKTYPE NORMAL + HELP "Sottogruppo finale" +END + +GROUPBOX DLG_NULL 77 3 +BEGIN + PROMPT 1 5 "Opzioni per la statistica" +END + +STRING F_CATDON 2 +BEGIN + PROMPT 2 6 "Cat. " + FLAGS "U" + USE CTD + INPUT CODTAB F_CATDON + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@40" S0 + OUTPUT F_CATDON CODTAB + OUTPUT F_D_CATDON S0 + CHECKTYPE NORMAL + WARNING "Codice categoria non presente" + HELP "Categoria di appartenenza" +END + +STRING F_D_CATDON 25 +BEGIN + PROMPT 12 6 "" + FLAGS "D" +END + +DATE F_DATA +BEGIN + PROMPT 45 6 "Data elaborazione " +END + + +BUTTON DLG_OK 9 2 +BEGIN + PROMPT -12 -1 "" +END + +BUTTON DLG_QUIT 9 2 +BEGIN + PROMPT -22 -1 "" +END + +ENDPAGE +ENDMASK diff --git a/at/at4.url b/at/at4.url index e1ddd2bd5..3a21b5350 100755 --- a/at/at4.url +++ b/at/at4.url @@ -47,7 +47,7 @@ MENUBAR MENU_BAR(6) MENU MENU_BAR(6) SUBMENU MENU_FILE "~File" -/* at4 -6 stampa cartoline/... da codice a codice */ +/* at4 -7 stampa cartoline/... da codice a codice */ MENUBAR MENU_BAR(7) MENU MENU_BAR(7) diff --git a/at/at4100.cpp b/at/at4100.cpp index 985cbf860..ddb3e900d 100755 --- a/at/at4100.cpp +++ b/at/at4100.cpp @@ -4,19 +4,32 @@ #include #include "soggetti.h" -#include "sezioni.h" +#include "sezioni.h" +#include #include "at4.h" #include "at4100a.h" #include "at4100b.h" #include "at4100c.h" -#define ALIAS_LCP 100 -#define ALIAS_TCS 200 +#define ALIAS_CTD 700 // categoria donatori +#define ALIAS_CTN1 701 // categoria non donatori 1 +#define ALIAS_CTN2 702 // categoria non donatori 2 + +#define ALIAS_TCS 200 // tipi/esiti controlli sanitari +#define ALIAS_LDN 400 // punti di prelievo + +#define ALIAS_LCPDOM 100 // localita' postale di domicilio +#define ALIAS_COMDOM 501 // comune di domicilio +#define ALIAS_COMNAS 500 // comune di nascita + +#define ALIAS_BNZ 600 // benemerenze +#define ALIAS_GAZ 300 // gruppi aziendale + #define IDON_SI "SI" #define IDON_AF "AF" -enum ts { undefined = 0, elenco = 1, etichette = 2, cartoline = 3 }; +enum ts { undefined = 0, elenco = 1, completo = 2, etichette = 3, cartoline = 4 }; // definizione form per etichette class TScadenze_form : public TForm @@ -39,7 +52,7 @@ class TStampaScadenze : public TPrintapp TScadenze_form* _form_eti; TScadenze_form* _form_car; TAssoc_array _categorie; - TParagraph_string _cognome_nome; + TParagraph_string _cognome_nome, _dencom; TDate _data_stampa; TDate _dataini, _datafin, _dataultid; bool _usomodo, _usasez; @@ -50,6 +63,7 @@ class TStampaScadenze : public TPrintapp TString80 _invitoper, _data, _presso1, _presso2, _presso3, _presso4; TString80 _note, _intest1, _intest2, _intest3, _intest4; int _etlarghezza, _etcolonne; + int _contatore, _totfinestampa; static bool filter_func_scadenze(const TRelation* rel); @@ -59,15 +73,18 @@ protected: virtual bool set_print(int m); virtual void set_page(int file, int cnt); virtual bool preprocess_page(int file, int counter); + virtual print_action postprocess_print(int file, int counter); ts dati_cartoline(); public: void crea_intestazione(); void filtra_sezioni(); + void footer_sezione(); + void fine_stampa(); void header_sezione(const TString16 codsez, const TString16 codsot); void dati_sezione(const TString16 codsez, const TString16 codsot); TMask& app_mask() { return *_msk; } - TStampaScadenze() : _data_stampa(TODAY), _cognome_nome("",25) {} + TStampaScadenze() : _data_stampa(TODAY), _cognome_nome("",25), _dencom("",25) {} }; HIDDEN inline TStampaScadenze& app() { return (TStampaScadenze&) main_app(); } @@ -97,6 +114,29 @@ ts TStampaScadenze::dati_cartoline() return undefined; } +void TStampaScadenze::fine_stampa() +{ + // stampa totale soggetti a fine stampa + + reset_footer(); + printer().footerlen(20); + TString sep(80); + sep.fill('-'); + set_footer(1, (const char *) sep); + set_footer(2,"TOTALE SOGGETTI IN SCADENZA %d", _totfinestampa); + printer().formfeed(); + reset_footer(); +} + +print_action TStampaScadenze::postprocess_print(int file, int counter) +{ + if (_contatore > 0) + footer_sezione(); + if (_totfinestampa > 0 && _contatore != _totfinestampa) + fine_stampa(); + return NEXT_PAGE; +} + void TStampaScadenze::filtra_sezioni() { const TString16 sezini = _msk->get(F_SEZINI); @@ -223,6 +263,39 @@ void TStampaScadenze::set_page(int file, int cnt) //set_row(3,""); } break; + case completo: + { + set_row(1,"@0g@pn", FLD(LF_SOGGETTI,SOG_CODICE,"#########")); + set_row(1,"@10g#a", &_cognome_nome); + set_row(3,"@10g@ld", FLD(LF_SOGGETTI,SOG_DATANASC)); + + set_row(1,"@36g@S", FLD(LF_SOGGETTI,SOG_DOM_INDIR)); + set_row(2,"@36g#a", &_dencom); + + set_row(1,"@62g@S", FLD(LF_SOGGETTI,SOG_TELABI)); + set_row(2,"@62g@S", FLD(LF_SOGGETTI,SOG_TELLAV)); + set_row(3,"@62g@S", FLD(LF_SOGGETTI,SOG_TELALT)); + + + set_row(1,"@77g@ld", FLD(LF_SOGGETTI,SOG_DATAPROSSI)); + set_row(2,"@77g@ld", FLD(LF_SOGGETTI,SOG_DATAPROSAF)); + + set_row(1,"@88g@ld", FLD(LF_SOGGETTI,SOG_DATAULTSI)); + set_row(2,"@88g@ld", FLD(LF_SOGGETTI,SOG_DATAULTAF)); + + set_row(1,"@99g@ld", FLD(LF_SOGGETTI,SOG_DATAULTID)); + + set_row(3,"@77g@S", FLD(LF_SOGGETTI,SOG_GRUPPOAB0)); + set_row(3,"@81g@S", FLD(LF_SOGGETTI,SOG_RHANTID)); + set_row(3,"@85g@S", FLD(LF_SOGGETTI,SOG_FENOTIPORH)); + set_row(3,"@92g@S", FLD(LF_SOGGETTI,SOG_KELL)); + set_row(3,"@96g@S", FLD(LF_SOGGETTI,SOG_DU)); + set_row(3,"@100g@S", FLD(LF_SOGGETTI,SOG_ANTICORPI)); + set_row(3,"@102g@S", FLD(LF_SOGGETTI,SOG_CMV)); + set_row(4,""); + } + break; + } } @@ -297,7 +370,7 @@ bool TStampaScadenze::filter_func_scadenze(const TRelation* rel) bool TStampaScadenze::preprocess_page(int file, int counter) { - if (_tipostampa==elenco) + if (_tipostampa==elenco || _tipostampa== completo) { TRectype& recsog = current_cursor()->curr(); const TString16 codsez = recsog.get(SOG_CODSEZ); @@ -305,19 +378,41 @@ bool TStampaScadenze::preprocess_page(int file, int counter) TString80 nome = recsog.get(SOG_COGNOME); nome << " "; nome << recsog.get(SOG_NOME); + nome << " "; + nome << recsog.get(SOG_COGNOME_SP); _cognome_nome = nome; + TString256 localita = ""; + localita << current_cursor()->curr(-ALIAS_LCPDOM).get("S6"); + if (localita.not_empty() && localita.ok()) + { + localita << " "; + localita << current_cursor()->curr(-ALIAS_LCPDOM).get("S0"); + localita << " - "; + } + else + { + localita = current_cursor()->curr(LF_COMUNI).get(COM_CAPCOM); + localita << " "; + } + localita << current_cursor()->curr(LF_COMUNI).get(COM_DENCOM); + localita.trim(); + _dencom = localita; + // salto pagina se cambio sezione if ((_codsez!=codsez)||(_codsot!=codsot)) { if (_codsez != "**") - printer().formfeed(); + footer_sezione(); _codsez = codsez; _codsot = codsot; header_sezione(codsez, codsot); + _contatore = 0; } - else - if (printer().rows_left() < 4) + else + if ((printer().rows_left()<4 && _tipostampa==elenco) || (printer().rows_left()<3 && _tipostampa==completo)) printer().formfeed(); + _contatore++; + _totfinestampa++; } if (_tipostampa==etichette) if (printer().rows_left() < _form_eti->get_body().height()) @@ -346,6 +441,20 @@ void TStampaScadenze::header_sezione(const TString16 codsez, const TString16 cod return; } +void TStampaScadenze::footer_sezione() +{ + // stampa totale soggetti a fine pagina + reset_footer(); + TString sep(80); + sep.fill('-'); + set_footer(1, (const char *) sep); + set_footer(2,"SOGGETTI IN SCADENZA PER SEZIONE %d", _contatore); + printer().formfeed(); + reset_footer(); +} + + + void TStampaScadenze::dati_sezione(const TString16 codsez, const TString16 codsot) { _intest1 = current_cursor()->curr(LF_SEZIONI).get(SEZ_INTESTAZ1); @@ -379,6 +488,9 @@ bool TStampaScadenze::set_print(int m) case F_ELENCO: _tipostampa = elenco; break; + case F_COMPLETO: + _tipostampa = completo; + break; case F_ETICHETTE: _tipostampa = etichette; break; @@ -419,7 +531,8 @@ bool TStampaScadenze::set_print(int m) _giorni[6] = 'X'; // filtro per sezioni selezionati filtra_sezioni(); - // filtro per categorie + // filtro per categorie + _categorie.destroy(); const TString16 catpri = _msk->get(F_CAT1); const TString16 catsec = _msk->get(F_CAT2); const TString16 catter = _msk->get(F_CAT3); @@ -445,6 +558,8 @@ bool TStampaScadenze::set_print(int m) current_cursor()->setfilter("((TCS->S6 == \"I\" ) || (TCS->S6 == \"F\")) && (ESCLUSO == \"\")", TRUE); // filtro per categorie e altro current_cursor()->set_filterfunction(filter_func_scadenze); + _contatore = 0; + _totfinestampa = 0; reset_print(); crea_intestazione(); return TRUE; @@ -456,7 +571,7 @@ bool TStampaScadenze::set_print(int m) void TStampaScadenze::crea_intestazione() { reset_header(); - if (_tipostampa == elenco) + if (_tipostampa == elenco || _tipostampa == completo) { TString sep(132); sep = "SCADENZE DI DONAZIONE "; @@ -474,6 +589,26 @@ void TStampaScadenze::crea_intestazione() sep << " al "; sep << data.string(); } + if (_ab01.not_empty()) + { + sep << " Gruppi "; + sep << _ab01; + } + if (_ab02.not_empty()) + { + sep << ", "; + sep << _ab02; + } + if (_ab03.not_empty()) + { + sep << ", "; + sep << _ab03; + } + if (_rh.not_empty()) + { + sep << " - Rh "; + sep << _rh; + } sep.center_just(); set_header(2, "@0g%s", (const char*) sep); TString16 data_stampa = _data_stampa.string(); @@ -484,9 +619,20 @@ void TStampaScadenze::crea_intestazione() sep = ""; sep.fill('-'); set_header(3, (const char *) sep); - set_header(5,"@0gCod.@10gC.@13gCognome@39gNato il@50gData pr.SI@61gData pr.AF@72gData/Tipo@83gData/Tipo@94gIdon.@100gAB0"); - set_header(6,"@13gNome@50gInterv. SI@61gInterv. AF@72gult. don.@83gult. idon.@94gper@100gRh"); - set_header(7,"@0g---------@10g--@13g-------------------------@39g----------@50g----------@61g----------@72g----------@83g----------@94g-----"); + if (_tipostampa == elenco) + { + set_header(5,"@0gCod.@10gC.@13gCognome@39gNato il@50gData pr.SI@61gData pr.AF@72gData/Tipo@83gData/Tipo@94gIdon.@100gAB0"); + set_header(6,"@13gNome@50gInterv. SI@61gInterv. AF@72gult. don.@83gult. idon.@94gper@100gRh"); + set_header(7,"@0g---------@10g--@13g-------------------------@39g----------@50g----------@61g----------@72g----------@83g----------@94g-----"); + } + if (_tipostampa == completo) + { + set_header(5,"@0gCod.@10gCognome e Nome@36gIndirizzo@62gTelefoni@77gData pr.SI@88gData ult.SI@99g Ult.idon."); + set_header(6,"@10gData nasc.@77gData pr.AF@88gData ult.AF"); + set_header(7,"@77gGr. Rh. Fen. Kell Du A CMV"); + set_header(8,""); + } + printer().footerlen(3); } } @@ -494,8 +640,8 @@ bool TStampaScadenze::user_create() { _rel = new TRelation(LF_SOGGETTI); _rel->add("TCS", "CODTAB==STATO",1,0,ALIAS_TCS); - _rel->add("LCP", "CODTAB==DOM_CODLOC",1,0,ALIAS_LCP); - _rel->add(LF_COMUNI, "COM==DOM_CODCOM"); + _rel->add("LCP", "CODTAB==DOM_CODLOC",1,0,ALIAS_LCPDOM); + _rel->add(LF_COMUNI, "COM==DOM_CODCOM",1,0,ALIAS_COMDOM); _rel->add(LF_SEZIONI, "CODSEZ==CODSEZ|CODSOT==CODSOT"); add_cursor(new TCursor(_rel, "", 3)); _msk = new TMask("at4100a"); diff --git a/at/at4100a.h b/at/at4100a.h index 6d2c5cb90..77484e443 100755 --- a/at/at4100a.h +++ b/at/at4100a.h @@ -43,5 +43,6 @@ #define F_RHANTID 318 #define F_ELENCO 401 -#define F_ETICHETTE 402 -#define F_CARTOLINE 403 +#define F_COMPLETO 402 +#define F_ETICHETTE 403 +#define F_CARTOLINE 404 diff --git a/at/at4100a.uml b/at/at4100a.uml index a46dcacc2..dfef891f4 100755 --- a/at/at4100a.uml +++ b/at/at4100a.uml @@ -366,25 +366,31 @@ END BUTTON F_ELENCO 9 2 BEGIN - PROMPT -14 18 "Elenco" + PROMPT -15 18 "Elenco" MESSAGE EXIT,F_ELENCO END +BUTTON F_COMPLETO 9 2 +BEGIN + PROMPT -25 18 "Completo" + MESSAGE EXIT,F_COMPLETO +END + BUTTON F_ETICHETTE 9 2 BEGIN - PROMPT -24 18 "Etichette" + PROMPT -35 18 "Etichette" MESSAGE EXIT,F_ETICHETTE END BUTTON F_CARTOLINE 9 2 BEGIN - PROMPT -34 18 "Cartoline" + PROMPT -45 18 "Cartoline" MESSAGE EXIT,F_CARTOLINE END BUTTON DLG_QUIT 9 2 BEGIN - PROMPT -44 18 "" + PROMPT -55 18 "" END ENDPAGE diff --git a/at/at4200.cpp b/at/at4200.cpp index df67deba1..bc4a1684f 100755 --- a/at/at4200.cpp +++ b/at/at4200.cpp @@ -303,6 +303,7 @@ bool TStampaUrgenze::set_print(int) add_file(LF_SOGGETTI); filtra_sezioni(); // filtro per categorie + _categorie.destroy(); const TString16 catpri = _msk->get(F_CAT1); const TString16 catsec = _msk->get(F_CAT2); const TString16 catter = _msk->get(F_CAT3); diff --git a/at/at4400.cpp b/at/at4400.cpp index 32ed2d4be..d993c7b28 100755 --- a/at/at4400.cpp +++ b/at/at4400.cpp @@ -189,6 +189,7 @@ void TConvocazioniPerSezione::set_page(int file, int cnt) set_row(1,"@59g@S", FLD(LF_SOGGETTI,SOG_TIPOULTDON)); set_row(1,"@62g@ld", FLD(LF_RCONVOC,RCV_DATACONV)); set_row(1,"@73g@S", FLD(LF_RCONVOC,RCV_CHIAMATA)); + set_row(1,"@75g@S", FLD(LF_CONVOC,COV_DATA)); } break; } @@ -317,8 +318,8 @@ bool TConvocazioniPerSezione::set_print(int m) _datafin = _msk->get(F_DATAFIN); _punto = _msk->get(F_PUNTO); _tipo = _msk->get(F_TIPO); - _codsez = _msk->get(F_CODSEZ); - _codsot = _msk->get(F_CODSOT); + _sezione = _msk->get(F_CODSEZ); + _sottog = _msk->get(F_CODSOT); _aggiorna = _msk->get_bool(F_AGGIORNA); _ordina = _msk->get(F_ORDINA); TString256 chiave = ""; diff --git a/at/at4500.cpp b/at/at4500.cpp index 2bcb5d237..80364e7ee 100755 --- a/at/at4500.cpp +++ b/at/at4500.cpp @@ -178,6 +178,7 @@ bool TStampaTessere::set_print(int m) //const char* filtro = format("T_STAMPATA!=\"X\""); //const char* filtro = format("TOTDON>=%i",_numdon); //current_cursor()->setfilter(filtro); + _categorie.destroy(); const TString16 catpri = _msk->get(F_CAT1); const TString16 catsec = _msk->get(F_CAT2); const TString16 catter = _msk->get(F_CAT3); diff --git a/at/at6.cpp b/at/at6.cpp index 76c6bf062..c6ccdedaf 100755 --- a/at/at6.cpp +++ b/at/at6.cpp @@ -3,7 +3,7 @@ #include "at6.h" -#define usage "Error - usage : %s -[0|1|2|3|4|5|6]" +#define usage "Error - usage : %s -[0|1|2|3|4]" int main(int argc, char** argv) { @@ -22,10 +22,6 @@ int main(int argc, char** argv) rt = at6400(argc, argv); break; case 4: rt = at6500(argc, argv); break; - case 5: - rt = at6600(argc, argv); break; - case 6: - rt = at6700(argc, argv); break; default: error_box(usage, argv[0]) ; rt = 1; break; } diff --git a/at/at6.h b/at/at6.h index 65d0d2918..3771599f0 100755 --- a/at/at6.h +++ b/at/at6.h @@ -6,7 +6,5 @@ int at6200(int argc, char* argv[]); // stampa tabella sezioni/sottogruppi int at6300(int argc, char* argv[]); // stampa di controllo donazioni int at6400(int argc, char* argv[]); // stampa di controllo soggetti incompleti int at6500(int argc, char* argv[]); // stampa di controllo controlli sanitari -int at6600(int argc, char* argv[]); // riepilogo mensile donazioni -int at6700(int argc, char* argv[]); // riepilogo giornaliero donazioni #endif // __AT6_H diff --git a/at/at6.url b/at/at6.url index 7dec3886f..13143908c 100755 --- a/at/at6.url +++ b/at/at6.url @@ -11,36 +11,20 @@ MENU TASK_MENUBAR /* at6 -1 stampa archivio sezioni */ MENUBAR MENU_BAR(1) - MENU MENU_BAR(1) SUBMENU MENU_FILE "~File" /* at6 -2 stampa di controllo donazioni */ MENUBAR MENU_BAR(2) - MENU MENU_BAR(2) SUBMENU MENU_FILE "~File" /* at6 -3 stampa soggetti incompleti */ MENUBAR MENU_BAR(3) - MENU MENU_BAR(3) SUBMENU MENU_FILE "~File" /* at6 -4 stampa di controllo controlli sanitari */ MENUBAR MENU_BAR(4) - MENU MENU_BAR(4) SUBMENU MENU_FILE "~File" - -/* at6 -5 riepilogo mensile donazioni */ -MENUBAR MENU_BAR(5) - -MENU MENU_BAR(5) - SUBMENU MENU_FILE "~File" - -/* at6 -6 riepilogo giornaliero donazioni */ -MENUBAR MENU_BAR(6) - -MENU MENU_BAR(6) - SUBMENU MENU_FILE "~File" diff --git a/at/at6300.cpp b/at/at6300.cpp index a2d7c8025..6b0cd3eea 100755 --- a/at/at6300.cpp +++ b/at/at6300.cpp @@ -25,7 +25,7 @@ class TControlloDonazioni : public TPrintapp TString16 _tipodon, _luogodon, _luogoold, _sezold; TString16 _sezini, _sotini, _tipostampa,_ordinamento; TString16 _controllo; - bool _stampa80, _primedon; + bool _stampa80, _primedon, _breve; TParagraph_string _cognome_nome; protected: @@ -49,42 +49,58 @@ HIDDEN inline TControlloDonazioni& app() { return (TControlloDonazioni&) main_ap void TControlloDonazioni::set_page(int file, int cnt) { - if (_stampa80) + if (_breve) { - set_row(1,"@0g#D", &_contatore); - set_row(1,"@6g@pn", FLD(LF_DONAZ,DON_ETICHETTA,"#########")); - set_row(1,"@16g@pn", FLD(LF_SOGGETTI,SOG_CODICE,"########")); - set_row(2,"@16g@8,rs", FLD(LF_SOGGETTI,SOG_TESSAVIS)); + set_row(1,"@0g@ld", FLD(LF_DONAZ,DON_DATADON)); + set_row(1,"@11g@S", FLD(LF_DONAZ, DON_LUOGODON)); + set_row(1,"@20g@S", FLD(LF_DONAZ,DON_TIPODON)); set_row(1,"@25g#a", &_cognome_nome); - set_row(2,"@25g@ld", FLD(LF_SOGGETTI,SOG_DATANASC)); - set_row(1,"@61g@S", FLD(LF_SOGGETTI,SOG_CODSEZ)); - set_row(2,"@64g@S", FLD(LF_SOGGETTI,SOG_CODSOT)); - set_row(1,"@64g@ld", FLD(LF_DONAZ,DON_DATADON)); - set_row(2,"@64g@S", FLD(LF_DONAZ,DON_TIPODON)); - //set_row(1,"@104g@S", FLD(LF_DONAZ, DON_LUOGODON)); - set_row(1,"@75g@S", FLD(LF_SOGGETTI, SOG_GRUPPOAB0)); - set_row(2,"@75g@S", FLD(LF_SOGGETTI, SOG_RHANTID)); - set_row(1,"@79g#t", &_controllo); + set_row(1,"@76g@S", FLD(LF_SOGGETTI,SOG_CODSEZ)); + set_row(1,"@79g@S", FLD(LF_SOGGETTI,SOG_CODSOT)); + set_row(1,"@82g@S", FLD(LF_SOGGETTI, SOG_GRUPPOAB0)); + set_row(1,"@87g@S", FLD(LF_SOGGETTI, SOG_RHANTID)); + set_row(1,"@91g@S", FLD(LF_SOGGETTI, SOG_FENOTIPORH)); + set_row(1,"@98g@S", FLD(LF_SOGGETTI, SOG_KELL)); + set_row(1,"@102g@S", FLD(LF_SOGGETTI, SOG_DU)); + set_row(1,"@106g@pn", FLD(LF_DONAZ,DON_ETICHETTA,"#########")); } else - { - set_row(1,"@0g#D", &_contatore); - set_row(1,"@7g@pn", FLD(LF_DONAZ,DON_ETICHETTA,"#########")); - set_row(1,"@17g@pn", FLD(LF_SOGGETTI,SOG_CODICE,"########")); - set_row(1,"@26g@S", FLD(LF_SOGGETTI,SOG_TESSAVIS)); - set_row(1,"@34g#a", &_cognome_nome); - set_row(1,"@70g@ld", FLD(LF_SOGGETTI,SOG_DATANASC)); - set_row(1,"@81g@S", FLD(LF_SOGGETTI,SOG_CODSEZ)); - set_row(1,"@84g@S", FLD(LF_SOGGETTI,SOG_CODSOT)); - set_row(1,"@87g@ld", FLD(LF_DONAZ,DON_DATADON)); - set_row(1,"@98g@S", FLD(LF_DONAZ,DON_TIPODON)); - set_row(1,"@104g@S", FLD(LF_DONAZ, DON_LUOGODON)); - set_row(1,"@110g@S", FLD(LF_SOGGETTI, SOG_GRUPPOAB0)); - set_row(1,"@114g@S", FLD(LF_SOGGETTI, SOG_RHANTID)); - set_row(1,"@118g@S", FLD(LF_SOGGETTI, SOG_FENOTIPORH)); - set_row(1,"@125g@S", FLD(LF_SOGGETTI, SOG_KELL)); - set_row(1,"@129g@S", FLD(LF_SOGGETTI, SOG_DU)); - } + if (_stampa80) + { + set_row(1,"@0g#D", &_contatore); + set_row(1,"@6g@pn", FLD(LF_DONAZ,DON_ETICHETTA,"#########")); + set_row(1,"@16g@pn", FLD(LF_SOGGETTI,SOG_CODICE,"########")); + set_row(2,"@16g@8,rs", FLD(LF_SOGGETTI,SOG_TESSAVIS)); + set_row(1,"@25g#a", &_cognome_nome); + set_row(2,"@25g@ld", FLD(LF_SOGGETTI,SOG_DATANASC)); + set_row(1,"@61g@S", FLD(LF_SOGGETTI,SOG_CODSEZ)); + set_row(2,"@64g@S", FLD(LF_SOGGETTI,SOG_CODSOT)); + set_row(1,"@64g@ld", FLD(LF_DONAZ,DON_DATADON)); + set_row(2,"@64g@S", FLD(LF_DONAZ,DON_TIPODON)); + //set_row(1,"@104g@S", FLD(LF_DONAZ, DON_LUOGODON)); + set_row(1,"@75g@S", FLD(LF_SOGGETTI, SOG_GRUPPOAB0)); + set_row(2,"@75g@S", FLD(LF_SOGGETTI, SOG_RHANTID)); + set_row(1,"@79g#t", &_controllo); + } + else + { + set_row(1,"@0g#D", &_contatore); + set_row(1,"@7g@pn", FLD(LF_DONAZ,DON_ETICHETTA,"#########")); + set_row(1,"@17g@pn", FLD(LF_SOGGETTI,SOG_CODICE,"########")); + set_row(1,"@26g@S", FLD(LF_SOGGETTI,SOG_TESSAVIS)); + set_row(1,"@34g#a", &_cognome_nome); + set_row(1,"@70g@ld", FLD(LF_SOGGETTI,SOG_DATANASC)); + set_row(1,"@81g@S", FLD(LF_SOGGETTI,SOG_CODSEZ)); + set_row(1,"@84g@S", FLD(LF_SOGGETTI,SOG_CODSOT)); + set_row(1,"@87g@ld", FLD(LF_DONAZ,DON_DATADON)); + set_row(1,"@98g@S", FLD(LF_DONAZ,DON_TIPODON)); + set_row(1,"@104g@S", FLD(LF_DONAZ, DON_LUOGODON)); + set_row(1,"@110g@S", FLD(LF_SOGGETTI, SOG_GRUPPOAB0)); + set_row(1,"@114g@S", FLD(LF_SOGGETTI, SOG_RHANTID)); + set_row(1,"@118g@S", FLD(LF_SOGGETTI, SOG_FENOTIPORH)); + set_row(1,"@125g@S", FLD(LF_SOGGETTI, SOG_KELL)); + set_row(1,"@129g@S", FLD(LF_SOGGETTI, SOG_DU)); + } } bool TControlloDonazioni::preprocess_page(int file, int counter) @@ -163,7 +179,7 @@ print_action TControlloDonazioni::postprocess_print(int file, int counter) { if (_contatore > 0) footer_stampa(); - if (_totfinestampa > 0) + if (_totfinestampa > 0 && _contatore != _totfinestampa) fine_stampa(); return NEXT_PAGE; } @@ -272,7 +288,9 @@ bool TControlloDonazioni::set_print(int m) _tipodon = _msk->get(F_TIPODON); _luogodon = _msk->get(F_LUOGODON); _primedon = _msk->get_bool(F_PRIMEDON); - + _breve = _msk->get_bool(F_BREVE); + if (_breve) + _cognome_nome.set_width(50); _tipostampa = _msk->get(F_TIPOSTAMPA); _ordinamento = _msk->get(F_ORDINAMENTO); TString80 chiave = ""; @@ -422,17 +440,23 @@ void TControlloDonazioni::crea_intestazione() else sep.center_just(132); set_header(2,"@0g%s", (const char*) sep); - if (_stampa80) - { - set_header(3,"@0gProg.@6gEt.sacca@16gCodice@25gCognome e nome@61gSe@64gData don.@75gGr."); - set_header(4,"@16gTessera@25gData nascita@61gSo@64gTipo don.@75gRh"); - set_header(5,"@0g-----@6g---------@16g--------@25g-----------------------------------@61g--@64g----------@75g---"); + if (_breve) + { + set_header(3,"@0gData@11gPunto@20gTipo@25gCognome e nome@76gSe/So@82gAB0 Rh/A Fen.Rh Kell Du@106gEtichetta"); + set_header(4,"@0g----------@11g-----@20g----@25g--------------------------------------------------@76g-----@82g--- ---- ------ ---- --@106g---------"); } - else - { - set_header(3,"@0gProg.@7gEt.sacca@17gCodice@26gTessera@34gCognome e nome@70gNato il@81gSe/So@87gData don.@98gTipo@104gLuogo@110gGr.@114gRh@118gFen.Rh@125gKellDu"); - set_header(4,"@0g------@7g---------@17g--------@26g-------@34g-----------------------------------@70g----------@81g-----@87g----------@98g----@104g-----@110g---@114g---@118g------@125g--- ---"); - } + else + if (_stampa80) + { + set_header(3,"@0gProg.@6gEt.sacca@16gCodice@25gCognome e nome@61gSe@64gData don.@75gGr."); + set_header(4,"@16gTessera@25gData nascita@61gSo@64gTipo don.@75gRh"); + set_header(5,"@0g-----@6g---------@16g--------@25g-----------------------------------@61g--@64g----------@75g---"); + } + else + { + set_header(3,"@0gProg.@7gEt.sacca@17gCodice@26gTessera@34gCognome e nome@70gNato il@81gSe/So@87gData don.@98gTipo@104gLuogo@110gGr.@114gRh@118gFen.Rh@125gKellDu"); + set_header(4,"@0g------@7g---------@17g--------@26g-------@34g-----------------------------------@70g----------@81g-----@87g----------@98g----@104g-----@110g---@114g---@118g------@125g--- ---"); + } printer().footerlen(3); } diff --git a/at/at6300a.h b/at/at6300a.h index 21bb2e0cc..8ed005013 100755 --- a/at/at6300a.h +++ b/at/at6300a.h @@ -14,7 +14,8 @@ #define F_TIPODON 111 #define F_LUOGODON 112 #define F_PRIMEDON 113 -#define F_TIPOSTAMPA 114 -#define F_ORDINAMENTO 115 +#define F_BREVE 114 +#define F_TIPOSTAMPA 115 +#define F_ORDINAMENTO 116 #define F_D_TIPODON 201 #define F_D_LUOGODON 202 diff --git a/at/at6300a.uml b/at/at6300a.uml index ec5bc638e..0e4905ff0 100755 --- a/at/at6300a.uml +++ b/at/at6300a.uml @@ -177,6 +177,11 @@ BEGIN PROMPT 2 9 "Stampa solo prime donazioni" END +BOOLEAN F_BREVE +BEGIN + PROMPT 36 9 "Formato di stampa breve" +END + RADIOBUTTON F_TIPOSTAMPA 25 BEGIN PROMPT 1 11 "Stampa per " diff --git a/at/at6400.cpp b/at/at6400.cpp index ef6c94064..85d02774d 100755 --- a/at/at6400.cpp +++ b/at/at6400.cpp @@ -229,6 +229,7 @@ bool TStampaIncompleti::set_print(int m) reset_files(); add_file(LF_SOGGETTI); filtra_sezioni(); + _catdon.destroy(); const TString16 catpri = _msk->get(F_CAT1); const TString16 catsec = _msk->get(F_CAT2); const TString16 catter = _msk->get(F_CAT3); @@ -247,6 +248,7 @@ bool TStampaIncompleti::set_print(int m) _catdon.add((const char*) catqui); if (catses.not_empty() && catses.ok()) _catdon.add((const char*) catses); + _catnondon.destroy(); const TString16 catnpri = _msk->get(F_CATN1); const TString16 catnsec = _msk->get(F_CATN2); const TString16 catnter = _msk->get(F_CATN3); diff --git a/at/at7300.cpp b/at/at7300.cpp index 29af16c73..bccbf6e44 100755 --- a/at/at7300.cpp +++ b/at/at7300.cpp @@ -1,28 +1,28 @@ #include #include -#include #include +#include #include #include #include "at7.h" - #include "atlib.h" - + // nomi dei campi #include "soggetti.h" #include "contsan.h" +#include "idoneita.h" -class TFS_NoData_app : public TPrintapp +class TBologna90 : public TPrintapp { TMask* _msk; TRelation* _rel; - int _cur; - TLocalisamfile* _soggetti; - TLocalisamfile* _contsan; - TRecord_array* _scontrolli; - TString16 _sospensione, _finesospensione; - + int _cur; + TLocalisamfile* _contsan; + TRecord_array* _scontrolli; + TLocalisamfile* _idoneita; + TRecord_array* _sidoneita; + protected: virtual bool user_create(); virtual bool user_destroy(); @@ -31,94 +31,122 @@ protected: virtual bool preprocess_page(int file, int counter); public: - TFS_NoData_app() {} + TBologna90() {} }; -HIDDEN inline TFS_NoData_app& app() { return (TFS_NoData_app&) main_app(); } +HIDDEN inline TBologna90& app() { return (TBologna90&) main_app(); } -bool TFS_NoData_app::preprocess_page(int file, int counter) +bool TBologna90::preprocess_page(int file, int counter) { - - bool rew = FALSE; + bool rewrite = FALSE; TRectype& recsog = current_cursor()->curr(); - const long codice = recsog.get_long(SOG_CODICE); - TRectype* key = new TRectype(LF_CONTSAN); - key->put(CON_CODICE, codice); - int err = _scontrolli->read(key); - if (err == NOERR) - { - const int numrighe = _scontrolli->rows(); - if (numrighe > 0) - { - const TRectype& riga = _scontrolli->row(numrighe); - const TString16 tipocon = riga.get(CON_TIPOCON); - const TString16 prosstipo = riga.get(CON_PROSSTIPO); - const TDate prossdata = riga.get(CON_PROSSDATA); - const TDate datanulla(NULLDATE); - if ((tipocon == _sospensione) && (prosstipo == _finesospensione) && (prossdata != datanulla)) - { - TString16 statopross = recsog.get(SOG_PROS_STATO); - TDate datapross = recsog.get(SOG_DATA_PROS); - if (statopross.empty() && datapross == datanulla) + const int intaf = recsog.get_int(SOG_INTAF); + if (intaf != 0 && intaf != 45) + { + recsog.put(SOG_INTAF, 45); + const long codice = recsog.get_long(SOG_CODICE); + TRectype* keyc = new TRectype(LF_CONTSAN); + keyc->put(CON_CODICE, codice); + int err = _scontrolli->read(keyc); + TRectype* keyi = new TRectype(LF_IDONEITA); + keyi->put(IDO_CODICE, codice); + int erri = _sidoneita->read(keyi); + if ((err == NOERR || erri == NOERR) && (_scontrolli->rows() > 0 || _sidoneita->rows() > 0)) + { + for (int c=1; c<=_scontrolli->rows(); c++) + { + TRectype& riga = _scontrolli->row(c, TRUE); + int intaf = riga.get_int(CON_INTAF); + if (intaf != 0 && intaf != 45) + riga.put(CON_INTAF, 45); + } + for (int r=1; r<=_sidoneita->rows(); r++) + { + TRectype& riga = _sidoneita->row(r, TRUE); + const TString16 tipoido = riga.get(IDO_TIPOIDO); + if (tipoido == "AF") { - recsog.put(SOG_PROS_STATO, prosstipo); - recsog.put(SOG_DATA_PROS, prossdata); - current_cursor()->file().rewrite(); - rew = TRUE; - } - } - } - } - return rew; + int intaf = riga.get_int(IDO_INTERVALLO); + if (intaf != 0 && intaf != 45) + riga.put(CON_INTAF, 45); + } + } + _scontrolli->rewrite(); + _sidoneita->rewrite(); + con_reord(recsog,_scontrolli, _sidoneita); + //ido_reord(recsog,_sidoneita); + rewrite = TRUE; + } + } + if (rewrite) + current_cursor()->file().rewrite(); + return rewrite; } -void TFS_NoData_app::set_page(int file, int cnt) +void TBologna90::set_page(int file, int cnt) { set_row(1,"@0g@pn", FLD(LF_SOGGETTI,SOG_CODICE,"########")); - set_row(1,"@10g@S", FLD(LF_SOGGETTI,SOG_COGNOME)); - set_row(1,"@36g@S", FLD(LF_SOGGETTI,SOG_NOME)); + //set_row(1,"@10g@S", FLD(LF_SOGGETTI,SOG_COGNOME)); + //set_row(1,"@36g@S", FLD(LF_SOGGETTI,SOG_NOME)); } -bool TFS_NoData_app::set_print(int) +bool TBologna90::set_print(int) { KEY tasto; tasto = _msk->run(); if (tasto == K_ENTER) { - reset_files(); + /* + TRectype da(LF_SOGGETTI); + TRectype a(LF_SOGGETTI); + const long codini = _msk->get_long(F_CODINI); + const long codfin = _msk->get_long(F_CODFIN); + da.zero(); + a.zero(); + if (codini != 0) + da.put(SOG_CODICE, codini); + if (codfin != 0) + a.put(SOG_CODICE, codfin); + current_cursor()->setregion(da,a); + */ + //current_cursor()->setfilter(format("STATO == \"RF\"")); + + reset_files(); add_file(LF_SOGGETTI); reset_print(); - _sospensione = "SO"; - _finesospensione = "FS"; - current_cursor()->setfilter(format("STATO == \"%s\"",(const char*)_sospensione)); return TRUE; } else return FALSE; } -bool TFS_NoData_app::user_create() +bool TBologna90::user_create() { _msk = new TMask("at7300a"); _rel = new TRelation(LF_SOGGETTI); - _contsan = new TLocalisamfile(LF_CONTSAN); - _scontrolli = new TRecord_array(LF_CONTSAN,CON_PROGCON); + _contsan = new TLocalisamfile(LF_CONTSAN); + _scontrolli = new TRecord_array(LF_CONTSAN,CON_PROGCON); + _idoneita = new TLocalisamfile(LF_IDONEITA); + _sidoneita = new TRecord_array(LF_IDONEITA,IDO_PROGIDO); _cur = add_cursor(new TCursor(_rel, "", 1)); + long items = _rel->lfile().items(); return TRUE; } -bool TFS_NoData_app::user_destroy() +bool TBologna90::user_destroy() { - delete _rel; delete _msk; - delete _contsan; + delete _rel; delete _scontrolli; + delete _contsan; + delete _sidoneita; + delete _idoneita; return TRUE; } int at7300(int argc, char* argv[]) { - TFS_NoData_app a; - a.run(argc, argv, "Correzione stato e data prossimo stato"); + TBologna90 a; + a.run(argc, argv, "Bologna: intaf = 90"); return 0; } \ No newline at end of file diff --git a/at/at7300a.uml b/at/at7300a.uml index b31d196e6..db9459050 100755 --- a/at/at7300a.uml +++ b/at/at7300a.uml @@ -1,5 +1,4 @@ -PAGE "Stampa SO senza data FS" -1 -1 78 20 - +PAGE "Bologna AF 90->45" -1 -1 78 20 BUTTON DLG_OK 9 2 BEGIN PROMPT -12 14 "" diff --git a/at/at_pagin.frm b/at/at_pagin.frm index 7a4fc45ae..d12db9b46 100755 --- a/at/at_pagin.frm +++ b/at/at_pagin.frm @@ -35,7 +35,7 @@ BEGIN GRID "" END -SECTION BODY ODD 60 +SECTION BODY ODD 30 STRINGA 1 50 BEGIN diff --git a/at/atlib.h b/at/atlib.h index f47bb270e..d261826af 100755 --- a/at/atlib.h +++ b/at/atlib.h @@ -5,6 +5,7 @@ bool is_idon_one(TString16 idon, const char* tipo); bool is_idon(TString16 id1, TString16 id2, TString16 id3, TString16 id4, const char* tipo); bool is_donaz(TString16 don, const char* tipo); char modstato_tcs(TString16 tipo); -void con_reord(TRectype& soggetto, TRecord_array* controlli); +void con_reord(TRectype& soggetto, TRecord_array* controlli, TRecord_array* idoneita); void ido_reord(TRectype& soggetto, TRecord_array* idoneita); void don_datepross(TRectype& soggetto); +void calcola_donazioni_lib(TRectype& soggetto, TRecord_array* donazioni); diff --git a/at/atlib1.cpp b/at/atlib1.cpp index 2d8469dff..0f71834f4 100755 --- a/at/atlib1.cpp +++ b/at/atlib1.cpp @@ -4,6 +4,7 @@ #include "soggetti.h" #include "contsan.h" +#include "donaz.h" #include "idoneita.h" #define IDON_SI "SI" @@ -62,37 +63,31 @@ char modstato_tcs(TString16 tipo) return modstato; } -void con_reord(TRectype& soggetto, TRecord_array* controlli) -{ - TDate data, prossdata; - TString16 tipo, prosstipo; +void con_reord(TRectype& soggetto, TRecord_array* controlli, TRecord_array* idoneita) +{ + const TDate datanulla(NULLDATE); + TDate data(NULLDATE); + TDate prossdata(NULLDATE); + TString16 tipo = " "; + TString16 prosstipo = " "; char modstato = ' '; - int r_modifica = -1; // eventuale ultima riga di modifica id. - int r_ultid = -1; // riga ultima idoneità - int r_ultstato = -1; // riga ultimo stato valido + int r_ultid = -1; // riga ultima idoneità + int r_ultstato = -1; // riga ultimo stato valido char penultstato = ' '; // penultimo stato valido char ultstato = ' '; // ultimo stato valido TDate dataultstato(NULLDATE); // data ultimo stato valido - for (int r=controlli->rows(); r>=1; r--) + for (int r=controlli->rows(); r>0; r--) { const TRectype& row = controlli->row(r); tipo = row.get(CON_TIPOCON); modstato = modstato_tcs(tipo); - if (modstato == 'M') - { - if (r_modifica == -1) - r_modifica = r; - } - else - { - if ((modstato != ' ') && (r_ultstato == -1)) + if ((modstato != 'N') && (r_ultstato == -1)) r_ultstato = r; - else if ((modstato != ' ') && (penultstato == ' ')) + else if ((modstato != 'N') && (penultstato == ' ')) penultstato = modstato; if ((modstato == 'I') && (r_ultid == -1)) r_ultid = r; - } } TString16 id1 = ' '; TString16 id2 = ' '; @@ -116,16 +111,6 @@ void con_reord(TRectype& soggetto, TRecord_array* controlli) id4 = row.get(CON_IDON4); intsi = row.get_int(CON_INTSI); intaf = row.get_int(CON_INTAF); - if (r_modifica > r_ultid) - { - const TRectype& rowm = controlli->row(r_modifica); - id1 = rowm.get(CON_IDON1); - id2 = rowm.get(CON_IDON2); - id3 = rowm.get(CON_IDON3); - id4 = rowm.get(CON_IDON4); - intsi = rowm.get_int(CON_INTSI); - intaf = rowm.get_int(CON_INTAF); - } } soggetto.put(SOG_DATAULTID,data); soggetto.put(SOG_TIPOULTID,tipo); @@ -133,13 +118,10 @@ void con_reord(TRectype& soggetto, TRecord_array* controlli) soggetto.put(SOG_IDON2,id2); soggetto.put(SOG_IDON3,id3); soggetto.put(SOG_IDON4,id4); - const int intsisog = soggetto.get_int(SOG_INTSI); - if (intsi > 0 || intsisog == 0) + if (intsi > 0) soggetto.put(SOG_INTSI,intsi); - const int intafsog = soggetto.get_int(SOG_INTAF); - if (intaf > 0 || intafsog == 0) + if (intaf > 0) soggetto.put(SOG_INTAF,intaf); - tipo = ' '; if (r_ultstato != -1) { @@ -154,100 +136,124 @@ void con_reord(TRectype& soggetto, TRecord_array* controlli) soggetto.put(SOG_DATASTATO,dataultstato); soggetto.put(SOG_PROS_STATO,prosstipo); soggetto.put(SOG_DATA_PROS,prossdata); - + + soggetto.put(SOG_STATOSI, " "); + soggetto.put(SOG_STATOAF, " "); + soggetto.put(SOG_DATASI, datanulla); + soggetto.put(SOG_DATAAF, datanulla); + soggetto.put(SOG_FINESOSSI, datanulla); + soggetto.put(SOG_FINESOSAF, datanulla); + + // riordino le idoneita + for (int ri=1; ri<=idoneita->rows(); ri++) + { + const TRectype& row = idoneita->row(ri); + TDate dataido = row.get_date(IDO_DATAIDO); + TString16 tipoido = row.get(IDO_TIPOIDO); + TString16 ido_sos = row.get(IDO_IDO_SOS); + int intervallo = row.get_int(IDO_INTERVALLO); + TDate finesos = row.get_date(IDO_FINESOS); + if (tipoido == IDON_SI) + if ((intervallo != 0) && (intsi == 0)) + soggetto.put(SOG_INTSI, intervallo); + if (tipoido == IDON_AF) + if ((intervallo != 0) && (intaf == 0)) + soggetto.put(SOG_INTAF, intervallo); + if (dataido >= dataultstato) + { + if (tipoido == IDON_SI) + { + soggetto.put(SOG_DATASI,dataido); + soggetto.put(SOG_STATOSI,ido_sos); + soggetto.put(SOG_FINESOSSI,finesos); + if (intervallo != 0 && ido_sos == IDONEITA) + { + soggetto.put(SOG_INTSI,intervallo); + if (id1 != IDON_SI && id2 != IDON_SI && id3 != IDON_SI && id4 != IDON_SI) + if (id1.empty()) + soggetto.put(SOG_IDON1,IDON_SI); + else + if (id2.empty()) + soggetto.put(SOG_IDON2,IDON_SI); + else + if (id3.empty()) + soggetto.put(SOG_IDON3,IDON_SI); + else + if (id4.empty()) + soggetto.put(SOG_IDON4,IDON_SI); + } + } + if (tipoido == IDON_AF) + { + soggetto.put(SOG_DATAAF,dataido); + soggetto.put(SOG_STATOAF,ido_sos); + soggetto.put(SOG_FINESOSAF,finesos); + if (intervallo != 0 && ido_sos == IDONEITA) + { + soggetto.put(SOG_INTAF,intervallo); + } + } + } + } + /* + TTable tcs("TCS"); + tcs.put("CODTAB",tipo); + if (tcs.read() == NOERR) + { + TString catcoll = tcs.get("S7"); + if (catcoll.not_empty()) + { + mask.set(F_CATDON,catcoll); + mask.field(F_CATDON).on_key(K_TAB); + } + } + */ + // verifico la concordanza di stato soggetto e stato idoneita + TString16 statosi = soggetto.get(SOG_STATOSI); + TString16 statoaf = soggetto.get(SOG_STATOAF); + TDate datastatosi = soggetto.get_date(SOG_DATASI); + TDate datastatoaf = soggetto.get_date(SOG_DATAAF); + if (statosi.not_empty() || statoaf.not_empty()) + { + TString16 stato = soggetto.get(SOG_STATO); + char modstato = modstato_tcs(stato); + if ((statosi == IDONEITA || statosi.empty()) && (statoaf == IDONEITA || statoaf.empty())) + if ((modstato != 'I') || (modstato != 'F')) + stato = IDONEITA; + if ((statosi == SOSPENSIONE || statosi.empty()) && (statoaf == SOSPENSIONE || statoaf.empty())) + if (modstato != 'S') + stato = SOSPENSIONE; + char statocalcolato = modstato_tcs(stato); + if (modstato != statocalcolato) + { + soggetto.put(SOG_STATO, stato); + soggetto.put(SOG_PROS_STATO," "); + soggetto.put(SOG_DATA_PROS, datanulla); + if (statocalcolato == 'I') + { + TDate datacalcolata = NULLDATE; + if (statosi == IDONEITA) + datacalcolata = datastatosi; + if ((statoaf == IDONEITA) && (datastatoaf > datacalcolata)) + datacalcolata = datastatoaf; + soggetto.put(SOG_DATASTATO,datacalcolata); + } + else + if (datastatoaf > datastatosi) + soggetto.put(SOG_DATASTATO,datastatoaf); + else + soggetto.put(SOG_DATASTATO,datastatosi); + } + } don_datepross(soggetto); - - if ((penultstato == 'S') && ((ultstato == 'I') || (ultstato == 'F'))) + + if (((penultstato == 'S') || (penultstato == 'I')) && ((ultstato == 'I') || (ultstato == 'F'))) { data = soggetto.get_date(SOG_DATAPROSSI); if (data < dataultstato && data.ok()) soggetto.put(SOG_DATAPROSSI,dataultstato); data = soggetto.get_date(SOG_DATAPROSAF); if (data < dataultstato && data.ok()) soggetto.put(SOG_DATAPROSAF,dataultstato); - } - if ((penultstato == '1') && (ultstato == 'F')) - { - data = soggetto.get_date(SOG_DATAPROSSI); - if (data < dataultstato) soggetto.put(SOG_DATAPROSSI,dataultstato); - } - if ((penultstato == '2') && (ultstato == 'F')) - { - data = soggetto.get_date(SOG_DATAPROSAF); - if (data < dataultstato) soggetto.put(SOG_DATAPROSAF,dataultstato); - } -} - -void ido_reord(TRectype& soggetto, TRecord_array* idoneita) -{ - TDate dataido, finesos; - TString16 tipoido, ido_sos; - int intervallo; - bool fattoSI = FALSE; - bool fattoAF = FALSE; - TString16 id1 = soggetto.get(SOG_IDON1); - TString16 id2 = soggetto.get(SOG_IDON2); - TString16 id3 = soggetto.get(SOG_IDON3); - TString16 id4 = soggetto.get(SOG_IDON4); - const TDate datastato = soggetto.get_date(SOG_DATASTATO); - for (int r=idoneita->rows(); r>=1; r--) - { - const TRectype& row = idoneita->row(r); - dataido = row.get_date(IDO_DATAIDO); - if (dataido >= datastato) - { - tipoido = row.get(IDO_TIPOIDO); - ido_sos = row.get(IDO_IDO_SOS); - intervallo = row.get_int(IDO_INTERVALLO); - finesos = row.get_date(IDO_FINESOS); - if (tipoido == IDON_SI && !fattoSI) - { - fattoSI = TRUE; - soggetto.put(SOG_DATASI,dataido); - soggetto.put(SOG_STATOSI,ido_sos); - soggetto.put(SOG_FINESOSSI,finesos); - if (intervallo != 0 && ido_sos == IDONEITA) - soggetto.put(SOG_INTSI,intervallo); - // sistemare le idoneita idon1,2,3,4 - } - if (tipoido == IDON_AF && !fattoAF) - { - fattoAF = TRUE; - soggetto.put(SOG_DATAAF,dataido); - soggetto.put(SOG_STATOAF,ido_sos); - soggetto.put(SOG_FINESOSAF,finesos); - if (intervallo != 0 && ido_sos == IDONEITA) - soggetto.put(SOG_INTAF,intervallo); - // sistemare le idoneita idon1,2,3,4 - } - } - } - if (fattoSI || fattoAF) - { - TDate datastato = soggetto.get_date(SOG_DATASTATO); - TDate datastatosi = soggetto.get_date(SOG_DATASI); - TDate datastatoaf = soggetto.get_date(SOG_DATAAF); - if (datastato < datastatosi || datastato < datastatoaf) - { - TString16 stato = soggetto.get(SOG_STATO); - TString16 statosi = soggetto.get(SOG_STATOSI); - TString16 statoaf = soggetto.get(SOG_STATOAF); - if (statosi == SOSPENSIONE && statoaf == SOSPENSIONE) - stato = SOSPENSIONE; - else - stato = IDONEITA; - soggetto.put(SOG_STATO,stato); - don_datepross(soggetto); - } - } - else - { - soggetto.put(SOG_STATOSI," "); - soggetto.put(SOG_DATASI,NULLDATE); - soggetto.put(SOG_FINESOSSI,NULLDATE); - soggetto.put(SOG_STATOAF," "); - soggetto.put(SOG_DATAAF,NULLDATE); - soggetto.put(SOG_FINESOSAF,NULLDATE); - don_datepross(soggetto); - } + } } void don_datepross(TRectype& soggetto) @@ -271,11 +277,11 @@ void don_datepross(TRectype& soggetto) bool id_af = FALSE; // il soggetto è idoneo per af? modstato = modstato_tcs(stato); - if (modstato == 'I' || modstato == 'F' || modstato == '1' || modstato == '2') // il soggetto è idoneo + if (modstato == 'I' || modstato == 'F') // il soggetto è idoneo { - id_si = (is_idon(id1,id2,id3,id4,IDON_SI) && intsi != 0); // il soggetto è idoneo SI - id_af = (is_idon(id1,id2,id3,id4,IDON_AF) && intaf != 0); // il soggetto è idoneo AF - + id_si = ((is_idon(id1,id2,id3,id4,IDON_SI) || (soggetto.get(SOG_STATOSI) == IDONEITA)) && (intsi != 0)); // il soggetto è idoneo SI + id_af = ((is_idon(id1,id2,id3,id4,IDON_AF) || (soggetto.get(SOG_STATOAF) == IDONEITA)) && (intaf != 0)); // il soggetto è idoneo AF + if (dataultdon.ok()) // se ha fatto almeno una donazione { if (is_donaz(tipoultdon,IDON_SI)) // se l'ultima donazione è una SI @@ -326,11 +332,79 @@ void don_datepross(TRectype& soggetto) dataaf = soggetto.get_date(SOG_DATAULTID); } } - if (modstato == '1') - datasi = NULLDATE; - if (modstato == '2') - dataaf = NULLDATE; + TString16 statoparziale; + TDate datastatoparziale; + statoparziale = soggetto.get(SOG_STATOSI); + datastatoparziale = soggetto.get_date(SOG_DATASI); + if (statoparziale == SOSPENSIONE) + datasi = NULLDATE; + if (statoparziale == IDONEITA) + if (datastatoparziale > datasi) + datasi = datastatoparziale; + statoparziale = soggetto.get(SOG_STATOAF); + datastatoparziale = soggetto.get_date(SOG_DATAAF); + if (statoparziale == SOSPENSIONE) + dataaf = NULLDATE; + if (statoparziale == IDONEITA) + if (datastatoparziale > dataaf) + dataaf = datastatoparziale; soggetto.put(SOG_DATAPROSSI,datasi); soggetto.put(SOG_DATAPROSAF,dataaf); } +void calcola_donazioni_lib(TRectype& soggetto, TRecord_array* donazioni) +{ + TDate ultdata(NULLDATE); + TString16 ulttipo = ' '; + const int i = donazioni->rows(); + const int donprecsi = soggetto.get_int(SOG_DONPRECSI); + const int donprecaf = soggetto.get_int(SOG_DONPRECAF); + if (i < 0) // non ha donazioni + { + int zerodon = 0; + soggetto.put(SOG_DATAULTDON,ultdata); + soggetto.put(SOG_DATAULTSI,ultdata); + soggetto.put(SOG_DATAULTAF,ultdata); + soggetto.put(SOG_TOTDONSI,donprecsi); + soggetto.put(SOG_TOTDONAF,donprecaf); + soggetto.put(SOG_TIPOULTDON,ulttipo); + } + else + { + const TRectype& row = donazioni->row(i); + + ultdata = row.get_date(DON_DATADON); + ulttipo = row.get(DON_TIPODON); + soggetto.put(SOG_DATAULTDON,ultdata); + soggetto.put(SOG_TIPOULTDON,ulttipo); + TDate dataultsi(NULLDATE); + TDate dataultaf(NULLDATE); + int totdonsi = 0; + int totdonaf = 0; + for (int r=1; r<=donazioni->rows(); r++) + { + const TRectype& row = donazioni->row(r); + ultdata = row.get_date(DON_DATADON); + ulttipo = row.get(DON_TIPODON); + if (is_donaz(ulttipo,IDON_SI)) + { + dataultsi = ultdata; + totdonsi++; + } + else + if (is_donaz(ulttipo,IDON_AF)) + { + dataultaf = ultdata; + totdonaf++; + } + } + soggetto.put(SOG_DATAULTSI, dataultsi); + soggetto.put(SOG_TOTDONSI, totdonsi+donprecsi); + soggetto.put(SOG_DATAULTAF, dataultaf); + soggetto.put(SOG_TOTDONAF, totdonaf+donprecaf); + + soggetto.put(SOG_TOTDON, totdonsi+donprecsi+totdonaf+donprecaf); + } + don_datepross(soggetto); +} + diff --git a/at/atopera.h b/at/atopera.h new file mode 100755 index 000000000..3f3de75fc --- /dev/null +++ b/at/atopera.h @@ -0,0 +1,10 @@ +// definizione campi dell'archivio ATOPERA + +#define OPE_PROGOPE "PROGOPE" +#define OPE_CODSEZ "CODSEZ" +#define OPE_CODSOT "CODSOT" +#define OPE_GRUPPOAZIE "GRUPPOAZIE" +#define OPE_DATA1 "DATA1" +#define OPE_DATA2 "DATA2" +#define OPE_FLAG1 "FLAG1" +#define OPE_UTENTE "UTENTE" diff --git a/at/atropera.h b/at/atropera.h new file mode 100755 index 000000000..104182a07 --- /dev/null +++ b/at/atropera.h @@ -0,0 +1,5 @@ +// definizione campi dell'archivio ATROPERA + +#define ROP_PROGOPE "PROGOPE" +#define ROP_CODICE "CODICE" +#define ROP_S0 "S0" diff --git a/at/atstatd.h b/at/atstatd.h index 31cd62335..4cadee942 100755 --- a/at/atstatd.h +++ b/at/atstatd.h @@ -8,4 +8,8 @@ #define ATS_GIORNO "GIORNO" #define ATS_TIPODON "TIPODON" #define ATS_NUMERO "NUMERO" -#define ATS_NUMPRIME "NUMPRIME" \ No newline at end of file +#define ATS_NUMPRIME "NUMPRIME" +#define ATS_NUMERO2 "NUMERO2" +#define ATS_NUMPRIME2 "NUMPRIME2" +#define ATS_GRUPPO "GRUPPO" +#define ATS_RH "RH" diff --git a/at/kell.h b/at/kell.h index dd101fc93..e456b9ff1 100755 --- a/at/kell.h +++ b/at/kell.h @@ -4,3 +4,6 @@ ITEM " |" ITEM "NEG|NEG" ITEM "POS|POS" ITEM "DPO|++" +ITEM "KK|KK" +ITEM "Kk|Kk" +ITEM "kk|kk" diff --git a/at/skell.h b/at/skell.h index df9d2bd70..116ea5334 100755 --- a/at/skell.h +++ b/at/skell.h @@ -8,3 +8,9 @@ ITEM "POS|POS" MESSAGE COPY,9@ ITEM "DPO|++" MESSAGE COPY,9@ +ITEM "KK|KK" +MESSAGE COPY,9@ +ITEM "Kk|Kk" +MESSAGE COPY,9@ +ITEM "kk|kk" +MESSAGE COPY,9@