#include #include #include #include #include #include #include #include #include #include #include #include #include #include "at0.h" // nomi campi maschera #include "at0300a.h" // nomi dei campi #include "soggetti.h" #include "donaz.h" #include "contsan.h" #include "idoneita.h" #include "atlib.h" #define ALIAS_CTD 700 class TGiornalieroC : public TApplication { TMask* _msk; TRelation* _rel; TLocalisamfile* _soggetti; TLocalisamfile* _donaz; TLocalisamfile* _contsan; TLocalisamfile* _idoneita; TRecord_array* _sdonazioni; TRecord_array* _scontrolli; TRecord_array* _sidoneita; TAssoc_array* _asoggetti; // array dei soggetti inseriti per controllare doppio ins. bool _modified; 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; } TAssoc_array& get_array_sogg() { return *_asoggetti; } int write(TSheet_field& s); bool check_sog_sheet(const char* codsog); static bool nome_handler(TMask_field& f, KEY k); static bool codice_handler(TMask_field& f, KEY k); //static bool tipocon_handler(TMask_field& f, KEY k); static bool soggetti_notify(TSheet_field& s, int r, KEY k); void add_rows_soggetti(TSheet_field& s, int count = 20, int start = 0); public: TGiornalieroC() {} }; HIDDEN inline TGiornalieroC& app() { return (TGiornalieroC&) main_app(); } void TGiornalieroC::add_rows_soggetti(TSheet_field& s, int count, int start) { if (start == 0) s.destroy(); for (int r=start; r<=start+count-1; r++) s.row(r); } bool TGiornalieroC::create() { TApplication::create(); _modified = FALSE; _msk = new TMask("at0300a"); _rel = new TRelation(LF_SOGGETTI); _rel->add("CTD", "CODTAB==CATDON",1,0,ALIAS_CTD); _donaz = new TLocalisamfile(LF_DONAZ); _contsan = new TLocalisamfile(LF_CONTSAN); _idoneita = new TLocalisamfile(LF_IDONEITA); _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); ss.set_notify(soggetti_notify); ss.sheet_mask().set_handler(F_S_NOME,nome_handler); ss.sheet_mask().set_handler(F_S_CODICE,codice_handler); //ss.sheet_mask().set_handler(F_S_TIPOCON,tipocon_handler); dispatch_e_menu(BAR_ITEM(1)); return TRUE; } bool TGiornalieroC::destroy() { delete _rel; delete _msk; delete _donaz; delete _contsan; delete _idoneita; delete _sdonazioni; delete _scontrolli; delete _sidoneita; delete _asoggetti; return TApplication::destroy(); } bool TGiornalieroC::menu(MENU_TAG m) { TMask& msk = get_mask(); const TDate oggi(TODAY); KEY tasto; do { TSheet_field& s = (TSheet_field&)msk.field(F_SOGGETTI); //s.reset(); if (s.items() == 0) add_rows_soggetti(s); _asoggetti->destroy(); msk.set(F_DATACON,oggi); tasto = msk.run(); switch (tasto) { case K_ESC: // annulla { if (_modified) if (yesno_box("Registrare le modifiche?")) TGiornalieroC::write(s); _modified = FALSE; msk.reset(); } break; case K_SAVE: // registra { TGiornalieroC::write(s); _modified = FALSE; msk.reset(); } break; case K_INS: // nuovo { if (_modified) if (yesno_box("Registrare le modifiche?")) TGiornalieroC::write(s); _modified = FALSE; msk.reset(); } break; case K_QUIT: // fine { if (_modified) if (yesno_box("Registrare le modifiche?")) TGiornalieroC::write(s); msk.reset(); _modified = FALSE; } break; } } while (tasto != K_QUIT); return FALSE; } int TGiornalieroC::write(TSheet_field& s) { const TMask& m = s.mask(); const TDate datagen = m.get(F_DATACON); const TString16 tipogen = m.get(F_TIPOCON); const TDate prdatagen = m.get(F_PROSSDATA); const TString16 prtipogen = m.get(F_PROSSTIPO); int items = s.items(); TProgind *pi; pi = new TProgind(items,"Registrazione controlli", FALSE, TRUE, 10); pi->setstatus(1); for (int r=1; r<=s.items(); r++) { pi->addstatus(1); TToken_string& row = s.row(r-1); const long codsog = row.get_long(0); if (codsog != 0) { TLocalisamfile& sog = get_relation()->lfile(); sog.setkey(1); sog.zero(); sog.put(SOG_CODICE, codsog); int err = sog.read(); if (err == NOERR) { TString16 tipocon = row.get(3); TString16 prosstipo = row.get(4); TDate prossdata = row.get(5); if (tipocon.blank()) tipocon = tipogen; if (prosstipo.blank()) prosstipo = prtipogen; if (!prossdata.ok()) prossdata = prdatagen; if (!tipocon.blank()) { TRectype* recc = new TRectype(LF_CONTSAN); recc->put(CON_CODICE, row.get(0)); recc->put(CON_DATACON, datagen); recc->put(CON_TIPOCON, tipocon); recc->put(CON_PROSSTIPO, prosstipo); recc->put(CON_PROSSDATA, prossdata); if (modstato_tcs(tipocon) == 'I') { recc->put(CON_IDON1, sog.get(SOG_IDON1)); recc->put(CON_IDON2, sog.get(SOG_IDON2)); recc->put(CON_IDON3, sog.get(SOG_IDON3)); recc->put(CON_IDON4, sog.get(SOG_IDON4)); recc->put(CON_INTSI, sog.get(SOG_INTSI)); recc->put(CON_INTAF, sog.get(SOG_INTAF)); } bool insert = FALSE; bool exist = FALSE; TRectype* keyc = new TRectype(LF_CONTSAN); keyc->put(CON_CODICE, row.get(0)); int err = _scontrolli->read(keyc); if (err == NOERR) { int r=_scontrolli->rows(); while (r>=1 && !insert && !exist) { const TRectype& riga = _scontrolli->row(r); const TDate d = riga.get(CON_DATACON); if (datagen==d) // esiste gia' un controllo in questa data { exist=TRUE; r=0; } else if (datagen > d) { recc->put(CON_PROGCON,r+1); _scontrolli->insert_row(recc); insert=TRUE; } r--; } if (!exist && !insert) { recc->put(CON_PROGCON,1); _scontrolli->insert_row(recc); } } else if (err == _iseof || err == _isemptyfile) { recc->put(CON_PROGCON,1); _scontrolli->insert_row(recc); } if (!exist) _scontrolli->write(TRUE); 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()); const TDate dataprossi = sog.get_date(SOG_DATAPROSSI); const TDate dataconv = sog.get_date(SOG_DATACONV); const char stato = modstato_tcs(sog.get(SOG_STATO)); const TString16 statosi = sog.get(SOG_STATOSI); // cancellazione data convocazione se sospeso // o se è venuto a donare (la dataprossi diventa > della dataconvoc. if ((stato == 'S') || (statosi == SOSPENSIONE) || (dataprossi > dataconv)) { const TDate datanulla(NULLDATE); sog.put(SOG_DATACONV, datanulla); const int numzero = 0; sog.put(SOG_NUMCONV,numzero); } sog.rewrite(); } } } } delete pi; return NOERR; } bool TGiornalieroC::check_sog_sheet(const char* codsog) { TAssoc_array& array_sogg = app().get_array_sogg(); if (array_sogg.is_key(codsog)) return FALSE; else return TRUE; } bool TGiornalieroC::soggetti_notify(TSheet_field& s, int r, KEY k) { bool ok = TRUE; switch (k) { case K_CTRL+K_DEL: // avvenuta cancellazione riga break; case K_SPACE: // inizio modifica riga break; case K_TAB: // entrata riga { static bool entering = TRUE; if (entering) { entering = FALSE; if ((r == s.items()-1) && (r == s.first_empty())) app().add_rows_soggetti(s,10,r+1); TToken_string& row = s.row(r); if (row.empty_items()) s.select(r); entering = TRUE; } } break; case K_ENTER: // uscita da riga modificata case K_CTRL+K_TAB: // uscita riga { TToken_string& row = s.row(r); if (!row.empty_items()) app()._modified = TRUE; 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; } return ok; } bool TGiornalieroC::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 TGiornalieroC::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 = app().get_relation()->lfile(); 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 TGiornalieroC::tipocon_handler(TMask_field& f, KEY k) { bool ok = TRUE; if (k == K_TAB && !f.focusdirty()) { const TString16 tipo = m.get(F_S_TIPOCON); const char modstato = modstato_tcs(tipo); if ( modstato == 'I' || modstato == 'M') { m.field(F_S_IDON1).enable(); m.field(F_S_IDON2).enable(); m.field(F_S_IDON3).enable(); m.field(F_S_IDON4).enable(); m.field(F_S_INTSI).disable(); m.field(F_S_INTAF).disable(); const TString16 idon1 = m.get(F_S_IDON1); const TString16 idon2 = m.get(F_S_IDON2); const TString16 idon3 = m.get(F_S_IDON3); const TString16 idon4 = m.get(F_S_IDON4); if (is_idon(idon1,idon2,idon3,idon4,IDON_SI)) m.field(F_S_INTSI).enable(); else m.field(F_S_INTSI).reset(); if (is_idon(idon1,idon2,idon3,idon4,IDON_AF)) m.field(F_S_INTAF).enable(); else m.field(F_S_INTAF).reset(); // propongo i dati precedenti per idoneita' if (idon1.empty() && idon2.empty() && idon3.empty() && idon4.empty()) { const TMask& mask = *(app().get_mask()); m.set(F_S_IDON1,mask.get(F_IDON1)); m.set(F_S_IDON2,mask.get(F_IDON2)); m.set(F_S_IDON3,mask.get(F_IDON3)); m.set(F_S_IDON4,mask.get(F_IDON4)); m.set(F_S_INTSI,mask.get(F_INTSI)); m.set(F_S_INTAF,mask.get(F_INTAF)); } } else { m.field(F_S_IDON1).reset(); m.field(F_S_IDON1).disable(); m.field(F_S_IDON2).reset(); m.field(F_S_IDON2).disable(); m.field(F_S_IDON3).reset(); m.field(F_S_IDON3).disable(); m.field(F_S_IDON4).reset(); m.field(F_S_IDON4).disable(); m.field(F_S_INTSI).reset(); m.field(F_S_INTSI).disable(); m.field(F_S_INTAF).reset(); m.field(F_S_INTAF).disable(); } } return TRUE; } */ int at0300(int argc, char* argv[]) { TGiornalieroC a; a.run(argc, argv, "Giornaliero controlli"); return 0; }