#include #include #include #include #include "at0.h" #include "atlib.h" #define ALIAS_TCS 200 #define ALIAS_CTD 700 #define FINE_SOSPENSIONE "FS" #define SOSPENSIONE "SO" // nomi campi maschera #include "at0700a.h" // nomi dei campi #include "soggetti.h" #include "contsan.h" #include "idoneita.h" #include "sezioni.h" class TSbloccoSospesi : public TPrintapp { TMask* _msk; TRelation* _rel; TLocalisamfile* _contsan; TLocalisamfile* _idoneita; TRecord_array* _scontrolli; TRecord_array* _sidoneita; int _cur; int _contatore, _totale; TDate _data_sblocco; // data scadenza sospensione fino a _data_sblocco TDate _data_stampa; TString16 _tiposo; // tipo sospesione da sbloccare TString16 _codsez, _codsot; bool _definitiva, _anchedimessi, _persezione; TParagraph_string _cognome_nome, _operazione; TString16 _finesospensione; int _intsi_f1, _intsi_f2, _intsi_m, _intaf_m, _etadonne; int _numdon1, _numdon2; TString16 _catini1, _catfin1, _catini2, _catfin2; bool _sttess2, _dataisc, _nomessage, _autoid; static bool filter_func_sbloccosospesi(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); virtual print_action postprocess_print(int file, int counter); static bool data_handler(TMask_field&f, KEY k); public: void filtra_sezioni(); void crea_intestazione(); 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("",45) {} }; HIDDEN inline TSbloccoSospesi& app() { return (TSbloccoSospesi&) main_app(); } bool TSbloccoSospesi::data_handler(TMask_field& f, KEY k) { if (f.to_check(k)) { const TDate oggi(TODAY); const TDate data = f.get(); if (data > oggi) return f.yesno_box("ATTENZIONE! La data di sblocco é superiore alla data di sistema. Confermi lo sblocco?"); } return TRUE; } print_action TSbloccoSospesi::postprocess_print(int file, int counter) { if (_contatore > 0) footer_sezione(); fine_stampa(); return NEXT_PAGE; } void TSbloccoSospesi::fine_stampa() { // stampa totale soggetti a fine stampa reset_footer(); TString sep(80); sep.fill('-'); set_footer(2, (const char *) sep); if (_totale > 0) { if (_totale != _contatore) { set_footer(3,"TOTALE SOGGETTI SBLOCCATI %d", _totale); printer().formfeed(); } } else { set_footer(3,"NON CI SONO SOGGETTI SOSPESI DA SBLOCCARE"); printer().formfeed(); } reset_footer(); } void TSbloccoSospesi::footer_sezione() { if (_persezione) if (_contatore > 0) { reset_footer(); TString sep(80); sep.fill('-'); set_footer(2, (const char *) sep); set_footer(3,"TOTALE SOGGETTI STAMPATI %d", _contatore); printer().formfeed(); reset_footer(); } } void TSbloccoSospesi::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); } bool TSbloccoSospesi::preprocess_page(int file, int counter) { TRectype& recsog = current_cursor()->curr(); TRectype& reccon = current_cursor()->curr(LF_CONTSAN); TString80 nome = recsog.get(SOG_COGNOME); nome << " "; nome << recsog.get(SOG_NOME); _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); TDate datafinesi(NULLDATE); TDate datafineaf(NULLDATE); if (statosi == SOSPENSIONE) { datafinesi = recsog.get_date(SOG_FINESOSSI); if ((datafine == datafinesi) && (stato == statosi) && (pros_stato != FINE_SOSPENSIONE)) datafinesi = NULLDATE; } if (statoaf == SOSPENSIONE) { datafineaf = recsog.get_date(SOG_FINESOSAF); if ((datafine == datafineaf) && (stato == statoaf) && (pros_stato != FINE_SOSPENSIONE)) datafineaf = NULLDATE; } TString80 operazione = ""; TString80 motivo = reccon.get(CON_MOTIVO); if (current_cursor()->curr(-ALIAS_TCS).get("S6") == "S" && 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 << format("%4s -- -- -- %2s %2s", (const char*) motivo, (const char*) stato, (const char*) pros_stato); } else if (statosi == SOSPENSIONE && datafinesi.ok() && datafinesi <= app()._data_sblocco) { const TDate datastato = recsog.get_date(SOG_DATASI); operazione.format("%s %s %4s SI SO ID", datastato.string(), datafinesi.string(), (const char*) motivo); } else if (statoaf == SOSPENSIONE && datafineaf.ok() && datafineaf <= app()._data_sblocco) { const TDate datastato = recsog.get_date(SOG_DATAAF); operazione.format("%s %s %4s AF SO ID", datastato.string(), datafineaf.string(), (const char*) motivo); } TDate datarif = app()._data_sblocco; datarif.set_year(datarif.year()-2); TDate dataultdon = recsog.get_date(SOG_DATAULTDON); if (dataultdon.ok()) { if (dataultdon < datarif) operazione << " **"; } else { TDate dataultido = recsog.get_date(SOG_DATAULTID); TString16 idon1 = recsog.get(SOG_IDON1); TString16 idon2 = recsog.get(SOG_IDON2); TString16 idon3 = recsog.get(SOG_IDON3); TString16 idon4 = recsog.get(SOG_IDON4); if (dataultido.ok() && is_idon(idon1, idon2, idon3, idon4, IDON_SI)) if (dataultido < datarif) operazione << " **"; } _operazione = operazione; if (_definitiva) { if (current_cursor()->curr(-ALIAS_TCS).get("S6") == "S" && datafine.ok() && datafine <= app()._data_sblocco) { TRectype* key = new TRectype(LF_CONTSAN); long codice = recsog.get_long(SOG_CODICE); key->put(CON_CODICE, codice); int err = _scontrolli->read(key); TRectype* key1 = new TRectype(LF_IDONEITA); key1->put(IDO_CODICE, codice); err = _sidoneita->read(key1); int progcon = _scontrolli->rows()+1; TRectype& reccon = _contsan->curr(); reccon.zero(); reccon.put(CON_CODICE, codice); reccon.put(CON_PROGCON, progcon); reccon.put(CON_DATACON, _data_stampa); reccon.put(CON_TIPOCON, FINE_SOSPENSIONE); TString80 resp = user(); resp << " - SBLOCCO AUTOMATICO"; reccon.put(CON_RESPONSAB, resp); _scontrolli->add_row(reccon); _scontrolli->rewrite(); recsog.put(SOG_DATACONV,NULLDATE); recsog.put(SOG_DATAULTSOL,NULLDATE); recsog.put(SOG_NUMCONV,0); //current_cursor()->file().rewrite(); } if ((statosi == SOSPENSIONE && datafinesi.ok() && datafinesi <= app()._data_sblocco) || (statoaf == SOSPENSIONE && datafineaf.ok() && datafineaf <= app()._data_sblocco)) { TRectype* key = new TRectype(LF_IDONEITA); long codice = recsog.get_long(SOG_CODICE); key->put(IDO_CODICE, codice); int err = _sidoneita->read(key); // Aggiunte le righe relative a key1 da Marco in data 20/12/99 // per gestire le sospensioni parziali in quanto per tali soggetti non veniva mai passato, // alla funzione CON_REORD, lo spreadsheet dei controlli sanitari ma solo quello delle idoneita'. TRectype* key1 = new TRectype(LF_CONTSAN); key1->put(CON_CODICE, codice); err = _scontrolli->read(key1); if (statosi == SOSPENSIONE && datafinesi.ok() && datafinesi <= app()._data_sblocco) { int progido = _sidoneita->rows()+1; TRectype& recido = _idoneita->curr(); recido.zero(); recido.put(IDO_CODICE, codice); recido.put(IDO_PROGIDO, progido); recido.put(IDO_DATAIDO, _data_stampa); recido.put(IDO_IDO_SOS, "ID"); recido.put(IDO_TIPOIDO, "SI"); recido.put(IDO_INTERVALLO, recsog.get(SOG_INTSI)); if (recsog.get_int(SOG_INTSI) == 0) { const char sesso = recsog.get_char(SOG_SESSO); if (sesso == '2') { TDate datanasc = recsog.get_date(SOG_DATANASC); int eta = _data_stampa.year() - datanasc.year(); if(eta <= _etadonne) recido.put(IDO_INTERVALLO, _intsi_f1); else recido.put(IDO_INTERVALLO, _intsi_f2); } else recido.put(IDO_INTERVALLO, _intsi_m); } TString80 resp = user(); resp << " - SBLOCCO AUTOMATICO"; recido.put(IDO_RESPONSAB, resp); _sidoneita->add_row(recido); _sidoneita->rewrite(); recsog.put(SOG_DATACONV,NULLDATE); recsog.put(SOG_DATAULTSOL,NULLDATE); recsog.put(SOG_NUMCONV,0); } if (statoaf == SOSPENSIONE && datafineaf.ok() && datafineaf <= app()._data_sblocco) { int progido = _sidoneita->rows()+1; TRectype& recido = _idoneita->curr(); recido.zero(); recido.put(IDO_CODICE, codice); recido.put(IDO_PROGIDO, progido); recido.put(IDO_DATAIDO, _data_stampa); recido.put(IDO_IDO_SOS, "ID"); recido.put(IDO_TIPOIDO, "AF"); recido.put(IDO_INTERVALLO, recsog.get(SOG_INTAF)); if (recsog.get_int(SOG_INTAF) == 0) recido.put(IDO_INTERVALLO, _intaf_m); TString80 resp = user(); resp << " - SBLOCCO AUTOMATICO"; recido.put(IDO_RESPONSAB, resp); _sidoneita->add_row(recido); _sidoneita->rewrite(); } } con_reord(recsog, _scontrolli, _sidoneita); const TDate oggi(TODAY); recsog.put(SOG_DATAULTAGG,oggi); recsog.put(SOG_UTENULTAGG,user()); TString16 catdon = recsog.get(SOG_CATDON); const TRectype& ctd = cache().get("CTD", catdon); const int totdon = recsog.get_int(SOG_TOTDON); if (ctd.get_bool("B0")) { const TString16 catcoll = ctd.get("S6"); if (catcoll.not_empty()) { recsog.put(SOG_CATDON, catcoll); recsog.put(SOG_DATADIM,NULLDATE); catdon = catcoll; } } if ((catdon == _catini1 || _catini1.empty()) && (totdon>=_numdon1) && _catfin1.not_empty()) { recsog.put(SOG_CATDON, _catfin1); catdon = _catfin1; } bool tstampata = recsog.get_bool(SOG_T_STAMPATA); if ((catdon == _catini2 || _catini2.empty()) && (totdon>=_numdon2) && _catfin2.not_empty() && (!_sttess2 || tstampata)) { recsog.put(SOG_CATDON, _catfin2); catdon = _catfin2; } current_cursor()->file().rewrite(); } // 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 != "**") && (_contatore > 0)) footer_sezione(); _contatore = 0; _codsez = codsez; _codsot = codsot; header_sezione(codsez, codsot); } _contatore++; _totale++; return TRUE; } void TSbloccoSospesi::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@S", FLD(LF_SOGGETTI,SOG_TESSAVIS)); set_row(1,"@56g@S", FLD(LF_SOGGETTI,SOG_CODSEZ)); set_row(1,"@59g@S", FLD(LF_SOGGETTI,SOG_CODSOT)); set_row(1,"@62g#a", &_operazione); set_row(1,"@110g@ld", FLD(LF_SOGGETTI,SOG_DATAPROSSI)); set_row(1,"@121g@S", FLD(LF_SOGGETTI,SOG_TELABI)); set_row(2,"@121g@S", FLD(LF_SOGGETTI,SOG_TELLAV)); set_row(3,"@121g@S", FLD(LF_SOGGETTI,SOG_TELALT)); set_row(4,""); } bool TSbloccoSospesi::filter_func_sbloccosospesi(const TRelation* rel) { bool filtrato = TRUE; TRectype& recsog = rel->lfile().curr(); if (!app()._anchedimessi) filtrato = !(rel->lfile(-ALIAS_CTD).get_bool("B0")); if (filtrato) { filtrato = FALSE; 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); if (app()._tiposo.not_empty()) filtrato = filtrato || ((stato == app()._tiposo) && (statopros == FINE_SOSPENSIONE)); else { filtrato = ((statosi == SOSPENSIONE) || (statoaf == SOSPENSIONE)); filtrato = filtrato || ((rel->lfile(-ALIAS_TCS).get("S6") == "S") && (statopros == FINE_SOSPENSIONE)); } if (filtrato) { TDate datafine(NULLDATE); if (statopros == FINE_SOSPENSIONE) datafine = recsog.get_date(SOG_DATA_PROS); TDate datafinesi(NULLDATE); TDate datafineaf(NULLDATE); if (statosi == SOSPENSIONE) { datafinesi = recsog.get_date(SOG_FINESOSSI); if ((stato == statosi) && (statopros != FINE_SOSPENSIONE)) datafinesi = NULLDATE; } if (statoaf == SOSPENSIONE) { datafineaf = recsog.get_date(SOG_FINESOSAF); if ((stato == statoaf) && (statopros != FINE_SOSPENSIONE)) datafineaf = NULLDATE; } filtrato = (datafine.ok()) && (datafine <= app()._data_sblocco) && (statopros == FINE_SOSPENSIONE); if ((!filtrato) && (datafinesi.ok() || datafineaf.ok())) filtrato = ((datafinesi.ok() && (datafinesi <= app()._data_sblocco)) || (datafineaf.ok() && (datafineaf <= app()._data_sblocco))); } } return filtrato; } void TSbloccoSospesi::header_sezione(const TString16 codsez, const TString16 codsot) { if (_persezione) { const TString80 densez = current_cursor()->curr(LF_SEZIONI).get(SEZ_DENSEZ); const TString80 densot = current_cursor()->curr(LF_SEZIONI).get(SEZ_DENSOT); TString intestazione(115); intestazione = "Sezione: "; intestazione << codsez; intestazione << "/"; intestazione << codsot; intestazione << " "; intestazione << densez; if (densot.not_empty()) { intestazione << "/"; intestazione << densot; } intestazione.center_just(); set_header(1,"@0g%s", (const char*) intestazione); } return; } bool TSbloccoSospesi::set_print(int) { KEY tasto; tasto = _msk->run(); if (tasto == K_ENTER) { _codsez = "**"; _codsot = "**"; _data_sblocco = _msk->get(F_DATA); _tiposo = _msk->get(F_TIPO); _definitiva = _msk->get_bool(F_DEFINITIVA); _anchedimessi = _msk->get_bool(F_ANCHEDIMESSI); _persezione = _msk->get_bool(F_PERSEZIONE); _contatore = 0; _totale = 0; filtra_sezioni(); if (_persezione) ((TSorted_cursor*)current_cursor())->change_order("90->CODSEZ|90->CODSOT|90->COGNOME|90->NOME|90->DATANASC"); else ((TSorted_cursor*)current_cursor())->change_order("90->COGNOME|90->NOME|90->DATANASC"); reset_files(); add_file(LF_SOGGETTI); // filtro per tipo sospensione /* TString256 filtro = ""; if (_tiposo.not_empty()) filtro.format("(((STATO == \"%s\") && (PROS_STATO == \"FS\"))",(const char*)_tiposo); else filtro << "(((TCS->S6 == \"S\") && (PROS_STATO == \"FS\"))"; filtro << " || (STATOSI == \"SO\") || (STATOAF == \"SO\"))"; current_cursor()->setfilter(filtro, TRUE); */ current_cursor()->set_filterfunction(filter_func_sbloccosospesi,TRUE); reset_print(); printer().footerlen(0); crea_intestazione(); return TRUE; } else return FALSE; } void TSbloccoSospesi::crea_intestazione() { reset_header(); TString sep(136); if (_definitiva) sep = "SBLOCCO DEFINITIVO SOSPESI "; else sep = "STAMPA PROVVISORIA PER SBLOCCO SOSPESI "; sep << _tiposo; sep << " FINO ALLA DATA "; TString16 data_stampa = _data_sblocco.string(); sep << data_stampa; 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); sep = ""; sep.fill('-'); set_header(3, (const char *) sep); set_header(4,"@0gCod.@9gC.@12gCognome e nome@38gNato il@49gTess.@56gSe/So@62gData sosp.@73gScadenza@84gMot. @89gDo Da A Sogg.@110gData pr.SI@121gTel. abi."); set_header(5,"@121gTel. lav."); set_header(6,"@121gTel. altro"); set_header(7,"@0g------@9g--@12g-------------------------@38g----------@49g------@56g-- --@62g----------@73g----------@84g----@89g---------------------@110g----------@121g--------------"); printer().footerlen(3); } bool TSbloccoSospesi::user_create() { _msk = new TMask("at0700a"); _msk->set_handler(F_DATA,data_handler); _rel = new TRelation(LF_SOGGETTI); _rel->add(LF_CONTSAN,"DATACON==DATASTATO|CODICE==CODICE", 2); _rel->add(LF_SEZIONI,"CODSEZ==CODSEZ|CODSOT==CODSOT"); _rel->add("TCS", "CODTAB==STATO",1,0,ALIAS_TCS); _rel->add("CTD", "CODTAB==CATDON",1,0,ALIAS_CTD); //cursore ordinamento per sezione+sottogruppo+cognome+nome add_cursor(new TSorted_cursor(_rel,"","",3)); _contsan = new TLocalisamfile(LF_CONTSAN); _idoneita = new TLocalisamfile(LF_IDONEITA); _scontrolli = new TRecord_array(LF_CONTSAN, CON_PROGCON); _sidoneita = new TRecord_array(LF_IDONEITA, IDO_PROGIDO); TConfig config(CONFIG_STUDIO); _numdon1 = config.get_int("NumDon1"); _numdon2 = config.get_int("NumDon2"); _catini1 = config.get("CatIni1"); _catfin1 = config.get("CatFin1"); _catini2 = config.get("CatIni2"); _catfin2 = config.get("CatFin2"); _sttess2 = config.get_bool("StTess2"); _dataisc = config.get_bool("DataIsc"); _nomessage = config.get_bool("NoMessage"); _etadonne = config.get_int("EtaDonne"); _intsi_f1 = config.get_int("IntSI_F1"); _intsi_f2 = config.get_int("IntSI_F2"); _intsi_m = config.get_int("IntSI_M"); _intaf_m = config.get_int("IntAF_M"); return TRUE; } bool TSbloccoSospesi::user_destroy() { delete _sidoneita; delete _scontrolli; delete _idoneita; delete _contsan; delete _rel; delete _msk; return TRUE; } int at0700(int argc, char* argv[]) { TSbloccoSospesi a; a.run(argc, argv, "Sblocco sospesi"); return 0; }