#include #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; TDate _dataold, _dataini, _datafin; TString16 _tipodon, _luogodon, _luogoold, _sezold, _gruppoold, _gruppoazie; TString16 _sezini, _sotini, _sezfin, _sotfin; TString16 _tipostampa, _ordinamento, _controllo, _prima; bool _stampa80, _primedon, _breve; TParagraph_string _cognome_nome; TArray _giorni, _mesi, _giornifinale; bool _riepfinale, _pergruppo; 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, const TString16 gruppoazie); 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 (_breve) { 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(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,"#########")); set_row(1,"@116g#t", &_prima); } else 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,"@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(2,"@79g#t", &_prima); } 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 = " "; bool prima = current_cursor()->curr().get_bool(DON_PRIMADON); if (prima) _prima = "X"; else _prima = " "; // 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 sezione = current_cursor()->curr().get(DON_CODSEZ); TString16 sottog = current_cursor()->curr().get(DON_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; case 'G': { TString16 grupponew = current_cursor()->curr(LF_SOGGETTI).get(SOG_GRUPPOAZIE); if (grupponew != _gruppoold ) { if (_gruppoold != "****") footer_stampa(); _gruppoold = grupponew; header_stampa(NULLDATE,"","","",grupponew); _contatore = 0; } } break; } if (_riepfinale) { TDate datadon = current_cursor()->curr().get(DON_DATADON); int giorno = datadon.day(); int mese = datadon.month(); if (mese == _dataini.month()) { real* valore = (real*)_giorni.objptr(giorno-1); *valore += 1; real* valorefinale = (real*)_giornifinale.objptr(giorno-1); *valorefinale += 1; } real* valore1 = (real*)_mesi.objptr(mese-1); *valore1 += 1; if (!((datadon >= _dataini) && (datadon <= _datafin))) return FALSE; } // 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 && _contatore != _totfinestampa) fine_stampa(); return NEXT_PAGE; } void TControlloDonazioni::footer_stampa() { // stampa totale soggetti a fine pagina if (_contatore > 0) { reset_footer(); TString sep(80); sep.fill('-'); set_footer(1, (const char *) sep); if (_dataini == _datafin) set_footer(2,"TOTALE DONAZIONI DEL %s %d", _dataini.string(), _contatore); else { TString d1 = _dataini.string(); TString d2 = _datafin.string(); set_footer(2,"TOTALE DONAZIONI DAL %s AL %s %d", (const char*)d1, (const char*)d2, _contatore); } if (_riepfinale) { TString16 valore; TString256 rigastampa = "GIO. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31"; set_footer(3,rigastampa); rigastampa = "TOT."; int pos = 5; for (int i=0;i<31;i++) { valore = ""; real* numero = (real*)_giorni.objptr(i); real numero1 = *numero; valore.format("%3d",numero1.integer()); rigastampa.overwrite((const char*)valore, pos); pos=pos+4; } set_footer(4,rigastampa); rigastampa = "MESE GEN. FEB. MAR. APR. MAG. GIU. LUG. AGO. SET. OTT. NOV. DIC. TOTALE"; set_footer(6,rigastampa); rigastampa = "TOT."; pos = 8; real totale = ZERO; for (int j=0;j<12;j++) { valore = ""; real* numero = (real*)_mesi.objptr(j); real numero1 = *numero; totale+=numero1; valore.format("%4d",numero1.integer()); rigastampa.overwrite((const char*)valore, pos); pos=pos+5; } pos=pos+4; valore = ""; valore.format("%4d",totale.integer()); rigastampa.overwrite((const char*)valore, pos); set_footer(7,rigastampa); } printer().formfeed(); reset_footer(); } _giorni.destroy(); _mesi.destroy(); for (int i=0;i<31;i++) _giorni.add(new real(ZERO),i); for (int j=0;j<12;j++) _mesi.add(new real(ZERO),j); } 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); if (_riepfinale) { TString16 valore; TString256 rigastampa = "GIO. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31"; set_footer(3,rigastampa); rigastampa = "TOT."; int pos = 5; for (int i=0;i<31;i++) { valore = ""; real* numero = (real*)_giornifinale.objptr(i); real numero1 = *numero; valore.format("%3d",numero1.integer()); rigastampa.overwrite((const char*)valore, pos); pos=pos+4; } set_footer(4,rigastampa); } printer().formfeed(); reset_footer(); } void TControlloDonazioni::header_stampa(const TDate data, const TString16 luogo, const TString16 sezione, const TString16 sottog, const TString16 gruppoazie) { 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 << " "; intestazione << cache().get("LDN", luogo).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; case 'G': { intestazione << "PER GRUPPO AZIENDALE "; if (gruppoazie.not_empty()) { intestazione << " "; TTable gaz("GAZ"); gaz.put("CODTAB",gruppoazie); if (gaz.read() == NOERR) intestazione << gaz.get("S0"); } } 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); _sezfin = _msk->get(F_SEZFIN); _sotfin = _msk->get(F_SOTFIN); _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); _breve = _msk->get_bool(F_BREVE); if (_breve) _cognome_nome.set_width(50); _pergruppo = _msk->get_bool(F_PERGRUPPO); if (_pergruppo) _gruppoazie = _msk->get(F_GRUPPOAZIE); _tipostampa = _msk->get(F_TIPOSTAMPA); _ordinamento = _msk->get(F_ORDINAMENTO); _riepfinale = _msk->get_bool(F_RIEPFINALE); TString80 chiave = ""; switch (_tipostampa[0]) { case 'D': chiave = "92->DATADON|"; break; case 'L': chiave = "92->LUOGODON|"; break; case 'S': chiave = "92->CODSEZ|92->CODSOT|"; break; case 'G': chiave = "90->GRUPPOAZIE|"; break; } switch (_ordinamento[0]) { case 'C': chiave << "92->DATADON|UPPER(90->COGNOME)|UPPER(90->NOME)"; break; case 'I': chiave << "92->DATADON|92->PROGINS"; break; case 'E': chiave << "92->DATADON|92->ETICHETTA"; break; case 'X': chiave << "UPPER(90->COGNOME)|UPPER(90->NOME)|92->DATADON"; break; case 'Y': chiave << "92->PROGINS|92->DATADON"; break; case 'Z': chiave << "92->ETICHETTA|92->DATADON"; break; } TString256 filtro = ""; TString80 filtrotmp =""; // filtro per tipo donazione if (_tipodon.not_empty()) filtro.format("(TIPODON == \"%s\")",(const char*)_tipodon); // filtro per luogo donazione if (_luogodon.not_empty()) { filtrotmp.format("(LUOGODON == \"%s\")",(const char*)_luogodon); if (filtro.not_empty()) filtro << " && "; filtro << filtrotmp; } // filtro per prime donazioni if (_primedon) { filtrotmp.format("(PRIMADON == \"X\")"); if (filtro.not_empty()) filtro << " && "; filtro << filtrotmp; } // filtro per gruppo aziendale if (_pergruppo) { if (_gruppoazie.not_empty()) filtrotmp.format("(90->GRUPPOAZIE == \"%s\")",(const char*)_gruppoazie); else filtrotmp.format("(90->GRUPPOAZIE != \"\")"); if (filtro.not_empty()) filtro << " && "; filtro << filtrotmp; } // filtro per sezione/sottogruppo TString16 inizio = ""; inizio << _sezini; inizio << _sotini; TString16 fine = ""; fine << _sezfin; fine << _sotfin; if (inizio.not_empty()) { if (filtro.empty()) filtro = format("(92->CODSEZ+92->CODSOT >= \"%s\")",(const char*)inizio); else { filtro << " && "; filtro << format("(92->CODSEZ+92->CODSOT >= \"%s\")",(const char*)inizio); } } if (fine.not_empty()) { if (filtro.empty()) filtro = format("(92->CODSEZ+92->CODSOT <= \"%s\")",(const char*)fine); else { filtro << " && "; filtro << format("(92->CODSEZ+92->CODSOT <= \"%s\")",(const char*)fine); } } // filtro per data TRectype da(LF_DONAZ); TRectype a (LF_DONAZ); if (_riepfinale) { TDate inizio (_dataini); TDate fine (_datafin); inizio.set_day(1); inizio.set_month(1); fine.set_end_month(); da.put(DON_DATADON, inizio); a.put(DON_DATADON, fine); _giorni.destroy(); _mesi.destroy(); _giornifinale.destroy(); for (int i=0;i<31;i++) { _giorni.add(new real(ZERO),i); _giornifinale.add(new real(ZERO),i); } for (int j=0;j<12;j++) _mesi.add(new real(ZERO),j); } else { 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 = "****"; _gruppoold = "****"; reset_files(); add_file(LF_DONAZ); reset_print(); printer().footerlen(0); 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 (_breve) { set_header(3,"@0gData@11gPunto@20gTipo@25gCognome e nome@76gSe/So@82gAB0 Rh/A Fen.Rh Kell Du@106gEtichetta@116g1d"); set_header(4,"@0g----------@11g-----@20g----@25g--------------------------------------------------@76g-----@82g--- ---- ------ ---- --@106g---------@116g--"); } else if (_stampa80) { set_header(3,"@0gProg.@6gEt.sacca@16gCodice@25gCognome e nome@61gSe@64gData don.@75gGr.@79gCo"); set_header(4,"@16gTessera@25gData nascita@61gSo@64gTipo don.@75gRh@79g1d"); set_header(5,"@0g-----@6g---------@16g--------@25g-----------------------------------@61g--@64g----------@75g---@79g--"); } 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--- ---"); } if (_riepfinale) printer().footerlen(9); else printer().footerlen(5); } 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 _contsan; delete _msk; delete _rel; return TRUE; } int at6300(int argc, char* argv[]) { TControlloDonazioni a; a.run(argc, argv, "Stampa di controllo donazioni"); return 0; }