#include #include #include #include #include #include "donaz.h" #include "contsan.h" #include "soggetti.h" #include "sezioni.h" #include "at6.h" #include "at6300a.h" #define ALIAS_LDN 400 class TControlloDonazioni : public TPrintapp { TRelation* _rel; TMask* _msk; TLocalisamfile* _contsan; int _contatore, _totfinestampa; int _cur; TDate _dataold, _dataini, _datafin; TString16 _tipodon, _luogodon, _luogoold, _sezold; TString16 _sezini, _sotini, _tipostampa,_ordinamento; TString16 _controllo; bool _stampa80, _primedon; TParagraph_string _cognome_nome; 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); public: void crea_intestazione(); void header_stampa(const TDate data, const TString16 luogo, const TString16 sezione, const TString16 sottog); void footer_stampa(); void fine_stampa(); TMask& app_mask() { return *_msk; } TControlloDonazioni() : _cognome_nome("",35) {} }; HIDDEN inline TControlloDonazioni& app() { return (TControlloDonazioni&) main_app(); } void TControlloDonazioni::set_page(int file, int cnt) { 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) { TString80 nome = current_cursor()->curr(LF_SOGGETTI).get(SOG_COGNOME); nome << " "; nome << current_cursor()->curr(LF_SOGGETTI).get(SOG_NOME); _cognome_nome = nome; // verifico se ha un controllo sanitario nella data della donazione TLocalisamfile contsan(LF_CONTSAN); contsan.setkey(2); contsan.zero(); contsan.put(CON_DATACON,current_cursor()->curr().get(DON_DATADON)); contsan.put(CON_CODICE,current_cursor()->curr().get(DON_CODICE)); if (contsan.read() == NOERR) _controllo = contsan.get(CON_TIPOCON); else _controllo = " "; // salto pagina se cambio punto di rottura switch (_tipostampa[0]) { case 'D': { const TDate datanew = current_cursor()->curr().get(DON_DATADON); if (datanew != _dataold ) { if (_dataold.ok()) footer_stampa(); _dataold = datanew; header_stampa(datanew,"","",""); _contatore = 0; } } break; case 'L': { const TString16 luogonew = current_cursor()->curr().get(DON_LUOGODON); if (luogonew != _luogoold ) { if (_luogoold != "****") footer_stampa(); _luogoold = luogonew; header_stampa(NULLDATE,luogonew,"",""); _contatore = 0; } } break; case 'S': { TString16 sezione = current_cursor()->curr(LF_SOGGETTI).get(SOG_CODSEZ); TString16 sottog = current_cursor()->curr(LF_SOGGETTI).get(SOG_CODSOT); TString16 seznew = ""; seznew << sezione; seznew << "/"; seznew << sottog; if (seznew != _sezold ) { if (_sezold != "****") footer_stampa(); _sezold = seznew; header_stampa(NULLDATE,"",sezione,sottog); _contatore = 0; } } break; } // salto pagina se non ci sono abbastanza righe per il record if ((_stampa80) && (printer().rows_left() < 2)) printer().formfeed(); _contatore++; _totfinestampa++; return TRUE; } print_action TControlloDonazioni::postprocess_print(int file, int counter) { if (_contatore > 0) footer_stampa(); if (_totfinestampa > 0) fine_stampa(); return NEXT_PAGE; } void TControlloDonazioni::footer_stampa() { // stampa totale soggetti a fine pagina reset_footer(); TString sep(80); sep.fill('-'); set_footer(1, (const char *) sep); set_footer(2,"TOTALE DONAZIONI %d", _contatore); printer().formfeed(); reset_footer(); } void TControlloDonazioni::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,"DONAZIONI TOTALI STAMPATE %d", _totfinestampa); printer().formfeed(); reset_footer(); } void TControlloDonazioni::header_stampa(const TDate data, const TString16 luogo, const TString16 sezione, const TString16 sottog) { TString intestazione(132); intestazione = "STAMPA DI CONTROLLO DONAZIONI "; switch (_tipostampa[0]) { case 'D': { intestazione << "PER DATA "; intestazione << data; } break; case 'L': { intestazione << "PER PUNTO DI PRELIEVO "; intestazione << luogo; intestazione << " "; TTable ldn("LDN"); ldn.put("CODTAB",luogo); if (ldn.read() == NOERR) intestazione << ldn.get("S0"); } break; case 'S': { intestazione << "PER SEZIONE "; intestazione << sezione; if (sottog.not_empty()) { intestazione << "/"; intestazione << sottog; } TLocalisamfile sez(LF_SEZIONI); sez.setkey(1); TRectype& recsez = sez.curr(); recsez.zero(); recsez.put(SEZ_CODSEZ, sezione); recsez.put(SEZ_CODSOT, sottog); if (sez.read() == NOERR) { intestazione << " "; intestazione << recsez.get(SEZ_DENSEZ); TString80 densot = recsez.get(SEZ_DENSOT); if (densot.not_empty()) { intestazione << "/"; intestazione << densot; } } } break; } if (_stampa80) intestazione.center_just(80); else intestazione.center_just(132); set_header(1,"@0g%s", (const char*) intestazione); intestazione = "Pag. @#"; if (_stampa80) set_header(1, "@73g%s", (const char*) intestazione); else set_header(1, "@110g%s", (const char*) intestazione); return; } bool TControlloDonazioni::set_print(int m) { KEY tasto; tasto = _msk->run(); if (tasto == K_ENTER) { _sezini = _msk->get(F_SEZINI); _sotini = _msk->get(F_SOTINI); _dataini = _msk->get_date(F_DATAINI); _datafin = _msk->get_date(F_DATAFIN); _tipodon = _msk->get(F_TIPODON); _luogodon = _msk->get(F_LUOGODON); _primedon = _msk->get_bool(F_PRIMEDON); _tipostampa = _msk->get(F_TIPOSTAMPA); _ordinamento = _msk->get(F_ORDINAMENTO); TString80 chiave = ""; switch (_tipostampa[0]) { case 'D': chiave = "92->DATADON|"; break; case 'L': chiave = "92->LUOGODON|92->DATADON|"; break; case 'S': chiave = "90->CODSEZ|90->CODSOT|92->DATADON|"; break; } switch (_ordinamento[0]) { case 'C': chiave << "UPPER(90->COGNOME)|UPPER(90->NOME)"; break; case 'I': chiave << "92->PROGINS"; break; case 'E': chiave << "92->ETICHETTA"; break; } TString256 filtro = ""; // filtro per tipo donazione if (_tipodon.not_empty()) filtro = format("(TIPODON == \"%s\")",(const char*)_tipodon); // filtro per luogo donazione if (_luogodon.not_empty()) { if (filtro.empty()) filtro = format("(LUOGODON == \"%s\")",(const char*)_luogodon); else { filtro << " && "; filtro << format("(LUOGODON == \"%s\")",(const char*)_luogodon); } } if (_primedon) { if (filtro.empty()) filtro = format("(PRIMADON == \"X\")"); else { filtro << " && "; filtro << format("(PRIMADON == \"X\")"); } } // 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); } } } // 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); current_cursor()->setregion(da, a); current_cursor()->setfilter(filtro, TRUE); ((TSorted_cursor*)current_cursor())->change_order(chiave); _contatore = 0; _totfinestampa = 0; _dataold = NULLDATE; _luogoold = "****"; _sezold = "****"; reset_files(); add_file(LF_DONAZ); reset_print(); crea_intestazione(); return TRUE; } else return FALSE; } void TControlloDonazioni::crea_intestazione() { reset_header(); TString sep(132); if (_primedon) sep = "PRIME DONAZIONI EFFETTUATE "; else { sep = "Selezioni della stampa: "; if (_sezini.not_empty()) { sep << "Sez. "; sep << _sezini; if (_sotini.not_empty()) { sep << "/"; sep << _sotini; } sep << "; "; } } if (_dataini.ok()) { sep << "Dal "; sep << _dataini.string(); } if (_datafin.ok()) { sep << " Al "; sep << _datafin.string(); } if (_dataini.ok() || _datafin.ok()) sep << "; "; if (_tipodon.not_empty()) { sep << "Tipo "; sep << _tipodon; sep << "; "; } if (_luogodon.not_empty()) { sep << "Luogo "; sep << _luogodon; sep << "; "; } if (_stampa80) sep.center_just(80); 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---"); } 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); } bool TControlloDonazioni::user_create() { _rel = new TRelation(LF_DONAZ); _rel->add(LF_SOGGETTI, "CODICE==CODICE"); _rel->add("LDN", "CODTAB==LUOGODON",1,0,ALIAS_LDN); _msk = new TMask("at6300a"); _contsan = new TLocalisamfile(LF_CONTSAN); add_cursor(new TSorted_cursor(_rel,"","",2)); TConfig config(CONFIG_STUDIO); _stampa80 = config.get_bool("Stampa80"); return TRUE; } bool TControlloDonazioni::user_destroy() { delete _msk; delete _rel; delete _contsan; return TRUE; } int at6300(int argc, char* argv[]) { TControlloDonazioni a; a.run(argc, argv, "Stampa di controllo donazioni"); return 0; }