From 944e5898b33343667768608bdd5bf62bee980ab2 Mon Sep 17 00:00:00 2001 From: cris Date: Thu, 24 Oct 2002 09:03:03 +0000 Subject: [PATCH] Patch level : AT Files correlati : Ricompilazione Demo : [ ] Commento : non capisco ma mi adeguo git-svn-id: svn://10.65.10.50/trunk@10561 c028cbd2-c16b-5b4b-a496-9718f37d4682 --- at/at0100.cpp | 4826 ++++++++++++++++++++++++------------------------- 1 file changed, 2404 insertions(+), 2422 deletions(-) diff --git a/at/at0100.cpp b/at/at0100.cpp index 8acc594cf..1c33db457 100755 --- a/at/at0100.cpp +++ b/at/at0100.cpp @@ -1,2423 +1,2405 @@ -#include -#include -#include -#include -#include -#include -#include - -#include "at0.h" -#include "atlib.h" - -// nomi campi maschera -#include "at0100a.h" // maschera principale -#include "at0100b.h" // maschera genera donazioni -#include "at0100c.h" // maschera famigliari -#include "at0100d.h" // maschera ricerca parziale -#include "at0100e.h" // maschera richiesta password - -// nomi dei campi -#include "soggetti.h" -#include "donaz.h" -#include "contsan.h" -#include "benem.h" -#include "storico.h" -#include "famiglie.h" -#include "convoc.h" -#include "rconvoc.h" -#include "idoneita.h" - -class TGestioneSoggetti : public TRelation_application -{ - TMask* _msk; - TRelation* _rel; - TLocalisamfile* _donaz; - TLocalisamfile* _contsan; - TLocalisamfile* _benem; - TLocalisamfile* _storico; - TLocalisamfile* _famiglie; - TLocalisamfile* _convoc; - TLocalisamfile* _rconvoc; - TLocalisamfile* _idoneita; - TRecord_array* _sdonazioni; // sheet donazioni - TRecord_array* _scontrolli; // sheet controlli - TRecord_array* _sbenemerenze; // sheet benemerenze - TRecord_array* _sstorico; // sheet storico - TRecord_array* _sfamiglia; // sheet famiglia - TRecord_array* _sidoneita; // sheet idoneita - TArray* _aconvocazioni; // array delle convocazioni - long _lastcod; // ultimo codice soggetto assegnato - long _lastfam; // ultimo codice famiglia assegnato - long _famprec; // codice famiglia precedente - long _famatt; // codice famiglia attuale - long _codice; // codice soggetto attuale (per famiglie) - bool _nuovaconv; // nuova convocazione da registrare - TDate _oldconv; // data ultima convocazione registrata su soggetto - - // parametri di sezione - int _numdon1, _numdon2; - TString16 _catini1, _catfin1, _catini2, _catfin2, _oldgruppo, _oldrh, _oldkell, _oldfen, _olddu; - bool _sttess2, _dataisc, _ctrlpass, _permesso; - -protected: - virtual bool user_create(); - virtual bool user_destroy(); - virtual const char* get_next_key(); - virtual int scrivi(const TMask& m, bool ri); - virtual int write(const TMask& m); - virtual int rewrite(const TMask& m); - virtual int read(TMask& m); - virtual bool remove(); - 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 on_firm_change(); - - virtual void init_insert_mode(TMask& m); - virtual void init_modify_mode(TMask& m); - virtual void init_query_mode(TMask& m); - - // notify degli sheet - static bool donazioni_notify(TSheet_field& s, int r, KEY k); - static bool controlli_notify(TSheet_field& s, int r, KEY k); - static bool benemerenze_notify(TSheet_field& s, int r, KEY k); - static bool storico_notify(TSheet_field& s, int r, KEY k); - static bool famiglia_notify(TSheet_field& s, int r, KEY k); - static bool idoneita_notify(TSheet_field& s, int r, KEY k); - // handler dei campi o bottoni - static bool ricparz_handler(TMask_field& f, KEY k); - static bool convoc_handler(TMask_field& f, KEY k); - static bool datanasc_handler(TMask_field& f, KEY k); - static bool catdon_handler(TMask_field& f, KEY k); - static bool dataconv_handler(TMask_field& f, KEY k); - static bool genera_handler(TMask_field& f, KEY k); - static bool famiglia_handler(TMask_field& f, KEY k); - static bool collega_handler(TMask_field& f, KEY k); - static bool nome_handler(TMask_field& f, KEY k); - static bool nuova_handler(TMask_field& f, KEY k); - static bool eseguigen_handler(TMask_field& f, KEY k); - static bool tipocon_handler(TMask_field& f, KEY k); - static bool idosos_handler(TMask_field& f, KEY k); - static bool idoncon_handler(TMask_field& f, KEY k); - static bool datadon_handler(TMask_field& f, KEY k); - static bool datacon_handler(TMask_field& f, KEY k); - static bool donprecsi_handler(TMask_field& f, KEY k); - static bool donprecaf_handler(TMask_field& f, KEY k); - static bool donazioni_handler(TMask_field& f, KEY k); - static bool controlli_handler(TMask_field& f, KEY k); - static bool idoneita_handler(TMask_field& f, KEY k); - static bool storico_handler(TMask_field& f, KEY k); - static bool benem_handler(TMask_field& f, KEY k); - static bool gruppo_handler(TMask_field& f, KEY k); - static bool rhantid_handler(TMask_field& f, KEY k); - static bool kell_handler(TMask_field& f, KEY k); - static bool fenotiporh_handler(TMask_field& f, KEY k); - static bool du_handler(TMask_field& f, KEY k); - static void c_reord(TSheet_field& controlli, TSheet_field& idoneita); - - // setta le abilitazioni ai campi di una riga dei controlli - void tipocon_set_row(TMask& m); - // setta le abilitazioni ai campi di una riga delle idoneita - void idosos_set_row(TMask& m); - // setta le abilitazioni ai campi di tutto lo sheet dei controlli - void tipocon_set_sheet(TSheet_field& s); - // setta le abilitazioni ai campi di tutto lo sheet dei controlli - void idosos_set_sheet(TSheet_field& s); - -public: - void calcola_donazioni(TMask& mask, TSheet_field& s); - bool richiesta_password(); - TGestioneSoggetti() {} -}; - -HIDDEN inline TGestioneSoggetti& app() { return (TGestioneSoggetti&) main_app(); } - -static int compare_date(const TObject** o1, const TObject** o2) -{ - TToken_string* s1 = (TToken_string*)*o1; - TToken_string* s2 = (TToken_string*)*o2; - - const TDate d1(s1->get(0)); - const TDate d2(s2->get(0)); - - int d=0; - if (d1>d2) d=+1; - else - if (d1 datasi) - datasi = dataultsi; - } - if (id_af) - { - dataaf=dataultdon; - dataaf+=intaf; - } - } - } - else - { - if (id_si) - datasi= m.get_date(F_DATAULTID); - if (id_af) - dataaf= m.get_date(F_DATAULTID); - } - } - TString16 statoparziale; - TDate datastatoparziale; - statoparziale = m.get(F_STATOSI); - datastatoparziale = (TDate)m.get(F_DATASI); - if (statoparziale == SOSPENSIONE) - datasi = NULLDATE; - if (statoparziale == IDONEITA) - if (datastatoparziale > datasi) - datasi = datastatoparziale; - statoparziale = m.get(F_STATOAF); - datastatoparziale = (TDate)m.get(F_DATAAF); - if (statoparziale == SOSPENSIONE) - dataaf = NULLDATE; - if (statoparziale == IDONEITA) - if (datastatoparziale > dataaf) - dataaf = datastatoparziale; - m.set(F_DATAPROSSI,datasi); - m.set(F_DATAPROSAF,dataaf); -} - -void TGestioneSoggetti::calcola_donazioni(TMask& mask, TSheet_field& s) -{ - TDate ultdata(NULLDATE); - TString16 ulttipo = ' '; - TMask_field& f = mask.field(F_TIPOULTDON); - const int i = s.items()-1; - const int donprecsi = mask.get_int(F_DONPRECSI); - const int donprecaf = mask.get_int(F_DONPRECAF); - if (i < 0) // non ha donazioni - { - int zerodon = 0; - mask.set(F_DATAULTDON,ultdata); - mask.set(F_DATAULTSI,ultdata); - mask.set(F_DATAULTAF,ultdata); - mask.set(F_TOTDONSI,donprecsi); - mask.set(F_TOTDONAF,donprecaf); - f.set(ulttipo); - f.on_key(K_TAB); - } - else - { - TToken_string& row = s.row(i); - ultdata = TDate(row.get(0)); - ulttipo = row.get(); - mask.set(F_DATAULTDON,ultdata); - f.set(ulttipo); - f.on_key(K_TAB); - TDate dataultsi(NULLDATE); - TDate dataultaf(NULLDATE); - int totdonsi = 0; - int totdonaf = 0; - for (int r=0; r=_numdon1) && _catfin1.not_empty()) - { - mask.set(F_CATDON, _catfin1); - catdon = _catfin1; - } - if ((catdon == _catini2 || _catini2.empty()) && (totdon>=_numdon2) && _catfin2.not_empty() && !_sttess2) - { - mask.set(F_CATDON, _catfin2); - catdon = _catfin2; - } - mask.field(F_CATDON).on_key(K_TAB); - TDate dataisc = mask.get_date(F_DATAISC); - if (!dataisc.ok() && _dataisc) - { - if (!mask.get_date(F_DATAPRISI) == NULLDATE) - mask.set(F_DATAISC,mask.get(F_DATAPRISI)); - else - { - TToken_string& row = s.row(0); - TDate primadata = TDate(row.get(0)); - mask.set(F_DATAISC,primadata); - } - } - } - d_datepross(s); -} - -void TGestioneSoggetti::init_insert_mode(TMask& m) -{ - m.set(F_NOTIZIARIO,TRUE); - m.set(F_BENEM,TRUE); - m.hide(F_RICPARZ); -} - -void TGestioneSoggetti::init_modify_mode(TMask& m) -{ - m.hide(F_RICPARZ); - _oldgruppo = m.get(F_GRUPPOAB0); - _oldrh = m.get(F_RHANTID); - _oldfen = m.get(F_FENOTIPORH); - _oldkell = m.get(F_KELL); - _olddu = m.get(F_DU); -} - -void TGestioneSoggetti::init_query_mode(TMask& m) -{ - m.show(F_RICPARZ); -} - -bool TGestioneSoggetti::donazioni_handler(TMask_field& f, KEY k) -{ - if (!f.mask().is_running()) - { - TSheet_field& s = (TSheet_field&)f; - const int n = s.items()-1; - if (n >= 0) - s.select(n, TRUE); - } - return TRUE; -} - -bool TGestioneSoggetti::controlli_handler(TMask_field& f, KEY k) -{ - if (!f.mask().is_running()) - { - TSheet_field& s = (TSheet_field&)f; - const int n = s.items()-1; - if (n >= 0) - s.select(n, TRUE); - } - return TRUE; -} - -bool TGestioneSoggetti::idoneita_handler(TMask_field& f, KEY k) -{ - if (!f.mask().is_running()) - { - TSheet_field& s = (TSheet_field&)f; - const int n = s.items()-1; - if (n >= 0) - s.select(n, TRUE); - } - return TRUE; -} - -bool TGestioneSoggetti::storico_handler(TMask_field& f, KEY k) -{ - if (!f.mask().is_running()) - { - TSheet_field& s = (TSheet_field&)f; - const int n = s.items()-1; - if (n >= 0) - s.select(n, TRUE); - } - return TRUE; -} - -bool TGestioneSoggetti::benem_handler(TMask_field& f, KEY k) -{ - if (!f.mask().is_running()) - { - TSheet_field& s = (TSheet_field&)f; - const int n = s.items()-1; - if (n >= 0) - s.select(n, TRUE); - } - return TRUE; -} - -bool TGestioneSoggetti::datadon_handler(TMask_field& f, KEY k) -{ - if (f.to_check(k)) - { - TMask& m = f.mask(); - - TSheet_field& s = *m.get_sheet(); - const TString16 datadon = f.get(); - for (int r=s.items()-1; r>=0; r--) - { - if (r != s.selected()) - { - TToken_string& row = s.row(r); - if (datadon == row.get(0)) - return f.error_box("Data donazione %s gia' inserita",(const char*)datadon); - } - } - } - return TRUE; -} - -bool TGestioneSoggetti::datacon_handler(TMask_field& f, KEY k) -{ - if (f.to_check(k)) - { - TMask& m = f.mask(); - - TSheet_field& s = *m.get_sheet(); - const TDate datacon = f.get(); - for (int r=s.items()-1; r>=0; r--) - { - if (r != s.selected()) - { - TToken_string& row = s.row(r); - TDate datarow = TDate(row.get(0)); - if (datacon == datarow) - return f.error_box("Data controllo %s gia' inserita",(const char*)datacon.string()); - else - if (datacon < datarow) - return f.yesno_box("ATTENZIONE! Esiste un controllo sanitario %s con data successiva. Vuoi continuare?", row.get(1)); - } - } - TMask& mask = s.mask(); - TDate datastato = mask.get_date(F_DATASTATO); - if (datacon < datastato) - return f.yesno_box("ATTENZIONE! Data controllo inferiore alla data stato.;Vuoi continuare?"); - datastato = mask.get_date(F_DATASI); - if (datacon < datastato) - return f.yesno_box("ATTENZIONE! Data controllo inferiore alla data stato SI.;Vuoi continuare?"); - datastato = mask.get_date(F_DATAAF); - if (datacon < datastato) - return f.yesno_box("ATTENZIONE! Data controllo inferiore alla data stato AF.;Vuoi continuare?"); - } - return TRUE; -} - -bool TGestioneSoggetti::donprecsi_handler(TMask_field& f, KEY k) -{ - static int oldprecsi; - if (k==K_TAB) - { - TMask& m = f.mask(); - const int donprecsi = m.get_int(F_DONPRECSI); - if (f.focusdirty()) - { - const int totdonsi = m.get_int(F_TOTDONSI); - m.set(F_TOTDONSI,totdonsi-oldprecsi+donprecsi); - int totdon = m.get_int(F_TOTDON)-oldprecsi+donprecsi; - //Le righe seguenti sono state aggiunte da Marco in data 05/08/99 per gestire il cambio di categoria in caso di donazioni non dettagliate - //m.set(F_TOTDON,totdon-oldprecsi+donprecsi); unica riga usata da Cristina - m.set(F_TOTDON,totdon); - TString16 catdon = m.get(F_CATDON); - if ((catdon == app()._catini1 || app()._catini1.empty()) && (totdon>=app()._numdon1) && app()._catfin1.not_empty()) - { - m.set(F_CATDON, app()._catfin1); - catdon = app()._catfin1; - } - if ((catdon == app()._catini2 || app()._catini2.empty()) && (totdon>=app()._numdon2) && app()._catfin2.not_empty() && !app()._sttess2) - { - m.set(F_CATDON, app()._catfin2); - catdon = app()._catfin2; - } - m.field(F_CATDON).on_key(K_TAB); - // fino a qui - } - oldprecsi = donprecsi; - } - return TRUE; -} - -bool TGestioneSoggetti::donprecaf_handler(TMask_field& f, KEY k) -{ - static int oldprecaf; - if (k==K_TAB) - { - TMask& m = f.mask(); - const int donprecaf = m.get_int(F_DONPRECAF); - if (f.focusdirty()) - { - const int totdonaf = m.get_int(F_TOTDONAF); - m.set(F_TOTDONAF,totdonaf-oldprecaf+donprecaf); - const int totdon = m.get_int(F_TOTDON); - m.set(F_TOTDON,totdon-oldprecaf+donprecaf); - } - oldprecaf = donprecaf; - } - return TRUE; -} - -bool TGestioneSoggetti::datanasc_handler(TMask_field& f, KEY k) -{ - if (f.to_check(k) || k == K_ENTER) - { - TMask& m = f.mask(); - if (f.empty()) - { - if (m.insert_mode()) - return f.error_box("La data di nascita e' obbligatoria"); - if (m.edit_mode()) - f.warning_box("La data di nascita e' vuota."); - } - else - { - if (m.insert_mode()) - { - TLocalisamfile sog(LF_SOGGETTI); - sog.setkey(2); - sog.zero(); - sog.put(SOG_COGNOME,m.get(F_COGNOME)); - sog.put(SOG_NOME,m.get(F_NOME)); - sog.put(SOG_DATANASC,m.get_date(F_DATANASC)); - if (sog.read() == NOERR && (m.get_long(F_CODICE) != sog.get_long(SOG_CODICE))) - return f.error_box("Soggetto con cognome, nome e data di nascita uguali già esistente"); - } - } - } - return TRUE; -} - -bool TGestioneSoggetti::catdon_handler(TMask_field& f, KEY k) -{ - if (f.to_check(k)) - { - TMask& m = f.mask(); - if (m.get(F_CATNOND1).not_empty() || m.get(F_CATNOND2).not_empty()) - { - TTable ctd("CTD"); - ctd.put("CODTAB",m.get(F_CATDON)); - if (ctd.read() == NOERR) - { - const bool dimissione = ctd.get_bool("B0"); - if (dimissione) - f.warning_box("ATTENZIONE: il soggetto ha almeno una categoria non donatori. Verificare!"); - } - } - } - return TRUE; -} - -bool TGestioneSoggetti::dataconv_handler(TMask_field& f, KEY k) -{ - if ((k == K_TAB) && (f.focusdirty()) && (!f.empty())) - { - const char modstato = modstato_tcs(f.mask().get(F_STATO)); - const char modstatosi = modstato_tcs(f.mask().get(F_STATOSI)); - if (modstato == 'S' || modstatosi == 'S') - { - f.error_box("ATTENZIONE!\nSoggetto sospeso.\nNon e' possibile inserire una convocazione."); - f.mask().set(F_DATACONV, app()._oldconv); - } - else - if (yesno_box("ATTENZIONE!\nNuova convocazione per il soggetto.\nConfermare la convocazione?")) - { - TLocalisamfile rconvoc(LF_RCONVOC); - rconvoc.setkey(3); - rconvoc.zero(); - rconvoc.put(RCV_CODICE, f.mask().get(F_CODICE)); - rconvoc.put(RCV_DATACONV, f.mask().get(F_DATACONV)); - if (rconvoc.read() == NOERR) - { - if (!(rconvoc.get_bool(RCV_ANNULLATO))) - { - f.error_box("Convocazione gia' esistente per il soggetto"); - f.mask().set(F_DATACONV, app()._oldconv); - } - else - { - app()._nuovaconv = TRUE; - f.mask().field(F_STAMPATACONV).enable(); - } - } - else - { - app()._nuovaconv = TRUE; - f.mask().field(F_STAMPATACONV).enable(); - } - } - else - f.mask().set(F_DATACONV, app()._oldconv); - } - return TRUE; -} - -bool TGestioneSoggetti::eseguigen_handler(TMask_field& f, KEY k) -{ - if (k == K_SPACE) - { - TMask& m = f.mask(); - const int quante = m.get_int(F_QUANTEGEN); - if (quante > 0) - { - const bool automatica = (m.get(F_COMEGEN) == "A"); - TDate finoal = m.get_date(F_FINOALGEN); - TSheet_field& g = (TSheet_field&)m.field(F_DONGEN); - g.destroy(); - const TString16 tipo = m.get(F_TIPOGEN); - const TString16 luogo = m.get(F_LUOGOGEN); - for (int r=0;rput(FAM_FAMIGLIA, fam.get_long(FAM_FAMIGLIA)); - TRecord_array a_famiglia(LF_FAMIGLIE, FAM_PROGFAM); - a_famiglia.read(key); - TSheet_field& s = (TSheet_field&)m.field(F_FAMIGLIARI); - s.destroy(); - for (int r=1; r<=a_famiglia.rows(); r++) - { - TToken_string& row = s.row(r-1); - const TRectype& riga = a_famiglia.row(r); - row.add(riga.get(FAM_GRADOPAR)); - row.add(riga.get(FAM_CODFAM)); - s.check_row(r-1); - } - const int ar = s.items(); - TToken_string& row = s.row(ar); - row.add(" "); - row.add(app()._codice); - s.check_row(ar); - s.force_update(); - m.show(F_FAMIGLIARI); - m.hide(-1); - } - } - return TRUE; -} - -bool TGestioneSoggetti::nuova_handler(TMask_field& f, KEY k) -{ - if (k == K_SPACE) - { - app()._famatt = -1; // significa che devo attribuire alla famiglia un nuovo codice - TMask& m = f.mask(); - TSheet_field& s = (TSheet_field&)m.field(F_FAMIGLIARI); - TToken_string& row = s.row(0); - row.add("CA"); - row.add(app()._codice); - s.check_row(0); - s.force_update(0); - m.show(F_FAMIGLIARI); - m.hide(-1); - } - return TRUE; -} - -bool TGestioneSoggetti::famiglia_handler(TMask_field& f, KEY k) -{ - if (k == K_SPACE) - { - TMask& m = f.mask(); - app()._codice = m.get_long(F_CODICE); - TMask msk("at0100c"); - msk.set_handler(F_ES_CODICE, collega_handler); - msk.set_handler(F_ES_COGNOME, collega_handler); - msk.set_handler(F_ES_NOME, nome_handler); - msk.set_handler(F_NUOVA,nuova_handler); - TSheet_field& s = (TSheet_field&)msk.field(F_FAMIGLIARI); - s.set_notify(famiglia_notify); - s.destroy(); - for (int r=1; r<=app()._sfamiglia->rows(); r++) - { - TToken_string& row = s.row(r-1); - const TRectype& riga = app()._sfamiglia->row(r); - row.add(riga.get(FAM_GRADOPAR)); - row.add(riga.get(FAM_CODFAM)); - s.check_row(r-1); - } - if (app()._sfamiglia->rows() == 0) - { - msk.show(-1); - msk.hide(F_FAMIGLIARI); - } - else - { - s.force_update(); - msk.hide(-1); - msk.show(F_FAMIGLIARI); - } - - if (msk.run() == K_ENTER) - { - app()._sfamiglia->destroy_rows(); - for (int r=s.items(); r>0; r--) - { - TToken_string& row = s.row(r-1); - TRectype& rec = app()._sfamiglia->row(r,TRUE); - rec.put(FAM_GRADOPAR, row.get(0)); - rec.put(FAM_CODFAM, row.get()); - } - } - } - return TRUE; -} - -bool TGestioneSoggetti::genera_handler(TMask_field& f, KEY k) -{ - if (k == K_SPACE) - { - TMask msk("at0100b"); - msk.set_handler(F_ESEGUIGEN,eseguigen_handler); - - if (msk.run() == K_ENTER) - { - TSheet_field& g = (TSheet_field&)msk.field(F_DONGEN); - if (g.items() > 0) - { - TMask& m = f.mask(); - TSheet_field& s = (TSheet_field&)m.field(F_DONAZIONI); - for (int r=0;rPUNTO"); head.add("Punto"); - fields.add(RCV_CHIAMATA); head.add("Tipo"); - fields.add(RCV_STAMPATO); head.add("St."); - fields.add(RCV_ANNULLATO); head.add("Ann."); - fields.add("115->DATA"); head.add("Data conv."); - fields.add(RCV_NUMERO); head.add("Conv.num."); - TCursor_sheet sconv(&cur,fields,"Convocazioni del soggetto",head); - sconv.run(); - } - } - return TRUE; -} - -void TGestioneSoggetti::tipocon_set_row(TMask& m) -{ - const TString16 tipo = m.get(F_C_TIPOCON); - const char modstato = modstato_tcs(tipo); - if ( modstato == 'I' || modstato == 'M') - { - m.field(F_C_IDON1).enable(); - m.field(F_C_IDON2).enable(); - m.field(F_C_IDON3).enable(); - m.field(F_C_IDON4).enable(); - m.field(F_C_INTSI).disable(); - m.field(F_C_INTAF).disable(); - TString16 idon1 = m.get(F_C_IDON1); - TString16 idon2 = m.get(F_C_IDON2); - TString16 idon3 = m.get(F_C_IDON3); - TString16 idon4 = m.get(F_C_IDON4); - // propongo i dati precedenti per idoneita' - if (idon1.empty() && idon2.empty() && idon3.empty() && idon4.empty()) - { - const TMask& mask = *(app().get_mask()); - m.set(F_C_IDON1,mask.get(F_IDON1)); - m.set(F_C_IDON2,mask.get(F_IDON2)); - m.set(F_C_IDON3,mask.get(F_IDON3)); - m.set(F_C_IDON4,mask.get(F_IDON4)); - m.set(F_C_INTSI,mask.get(F_INTSI)); - m.set(F_C_INTAF,mask.get(F_INTAF)); - idon1 = m.get(F_C_IDON1); - idon2 = m.get(F_C_IDON2); - idon3 = m.get(F_C_IDON3); - idon4 = m.get(F_C_IDON4); - } - if (is_idon(idon1,idon2,idon3,idon4,IDON_SI)) - m.field(F_C_INTSI).enable(); - else - m.field(F_C_INTSI).reset(); - if (is_idon(idon1,idon2,idon3,idon4,IDON_AF)) - m.field(F_C_INTAF).enable(); - else - m.field(F_C_INTAF).reset(); - } - else - { - m.field(F_C_IDON1).reset(); - m.field(F_C_IDON1).disable(); - m.field(F_C_IDON2).reset(); - m.field(F_C_IDON2).disable(); - m.field(F_C_IDON3).reset(); - m.field(F_C_IDON3).disable(); - m.field(F_C_IDON4).reset(); - m.field(F_C_IDON4).disable(); - m.field(F_C_INTSI).reset(); - m.field(F_C_INTSI).disable(); - m.field(F_C_INTAF).reset(); - m.field(F_C_INTAF).disable(); - } -} - -void TGestioneSoggetti::idosos_set_row(TMask& m) -{ - const TString16 idosos = m.get(F_I_IDO_SOS); - if (idosos == IDONEITA) - { - m.field(F_I_INTERVALLO).enable(); - const int intervallo = m.get_int(F_I_INTERVALLO); - if (intervallo==0) - { - const TMask& mask = *(app().get_mask()); - const TString idon = m.get(F_I_TIPOIDO); - if (idon == IDON_SI) - m.set(F_I_INTERVALLO,mask.get(F_INTSI)); - else - m.set(F_I_INTERVALLO,mask.get(F_INTAF)); - } - m.field(F_I_FINESOS).reset(); - m.field(F_I_FINESOS).disable(); - } - else - { - m.field(F_I_INTERVALLO).reset(); - m.field(F_I_INTERVALLO).disable(); - m.field(F_I_FINESOS).enable(); - } -} - -void TGestioneSoggetti::tipocon_set_sheet(TSheet_field& s) -{ - for (int r=0;rlfile().last(); - _lastcod = _rel->lfile().get_long(SOG_CODICE); -} - -bool TGestioneSoggetti::user_create() -{ - _msk = new TMask("at0100a"); - _rel = new TRelation(LF_SOGGETTI); - - _donaz = new TLocalisamfile(LF_DONAZ); - _contsan = new TLocalisamfile(LF_CONTSAN); - _benem = new TLocalisamfile(LF_BENEM); - _storico = new TLocalisamfile(LF_STORICO); - _famiglie = new TLocalisamfile(LF_FAMIGLIE); - _convoc = new TLocalisamfile(LF_CONVOC); - _rconvoc = new TLocalisamfile(LF_RCONVOC); - _idoneita = new TLocalisamfile(LF_IDONEITA); - - _sdonazioni = new TRecord_array(LF_DONAZ,DON_PROGDON); - _scontrolli = new TRecord_array(LF_CONTSAN,CON_PROGCON); - _sbenemerenze = new TRecord_array(LF_BENEM,BEN_PROGBEN); - _sstorico = new TRecord_array(LF_STORICO,STO_PROGSTO); - _sfamiglia = new TRecord_array(LF_FAMIGLIE, FAM_PROGFAM); - _sidoneita = new TRecord_array(LF_IDONEITA, IDO_PROGIDO); - - _msk->set_handler(F_RICPARZ,ricparz_handler); - _msk->set_handler(F_CONVOCAZIONI,convoc_handler); - _msk->set_handler(F_DATANASC,datanasc_handler); - _msk->set_handler(F_CATDON,catdon_handler); - _msk->set_handler(F_DATACONV,dataconv_handler); - _msk->set_handler(F_GENERA,genera_handler); - _msk->set_handler(F_FAMIGLIA,famiglia_handler); - _msk->set_handler(F_DONPRECSI,donprecsi_handler); - _msk->set_handler(F_DONPRECAF,donprecaf_handler); - _msk->set_handler(F_GRUPPOAB0,gruppo_handler); - _msk->set_handler(F_RHANTID,rhantid_handler); - _msk->set_handler(F_KELL,kell_handler); - _msk->set_handler(F_FENOTIPORH,fenotiporh_handler); - _msk->set_handler(F_DU,du_handler); - TSheet_field& sd = (TSheet_field&)_msk->field(F_DONAZIONI); - sd.set_handler(donazioni_handler); - sd.set_notify(donazioni_notify); - TMask& sdmask = sd.sheet_mask(); - sdmask.set_handler(F_D_DATADON, datadon_handler); - - TSheet_field& sc = (TSheet_field&)_msk->field(F_CONTROLLI); - sc.set_handler(controlli_handler); - sc.set_notify(controlli_notify); - TMask& scmask = sc.sheet_mask(); - scmask.set_handler(F_C_DATACON, datacon_handler); - scmask.set_handler(F_C_TIPOCON, tipocon_handler); - scmask.set_handler(F_C_IDON1, idoncon_handler); - scmask.set_handler(F_C_IDON2, idoncon_handler); - scmask.set_handler(F_C_IDON3, idoncon_handler); - scmask.set_handler(F_C_IDON4, idoncon_handler); - - TSheet_field& si = (TSheet_field&)_msk->field(F_IDONEITA); - si.set_handler(idoneita_handler); - si.set_notify(idoneita_notify); - TMask& simask = si.sheet_mask(); - simask.set_handler(F_I_IDO_SOS, idosos_handler); - - TSheet_field& sb = (TSheet_field&)_msk->field(F_BENEMERENZE); - sb.set_handler(benem_handler); - sb.set_notify(benemerenze_notify); - TSheet_field& ss = (TSheet_field&)_msk->field(F_STORICO); - ss.set_handler(storico_handler); - ss.set_notify(storico_notify); - - _rel->lfile().last(); - _lastcod = _rel->lfile().get_long(SOG_CODICE); - - _famiglie->last(); - _lastfam = _famiglie->get_long(FAM_FAMIGLIA); - _famatt = _famprec = 0; - - set_search_field(F_COGNOME); - - 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"); - _ctrlpass = config.get_bool("CtrlPass"); - if (_ctrlpass) - _permesso = richiesta_password(); - return TRUE; -} - -bool TGestioneSoggetti::user_destroy() -{ - delete _sidoneita; - delete _sfamiglia; - delete _sstorico; - delete _sbenemerenze; - delete _scontrolli; - delete _sdonazioni; - delete _idoneita; - delete _rconvoc; - delete _convoc; - delete _famiglie; - delete _storico; - delete _benem; - delete _contsan; - delete _donaz; - delete _rel; - delete _msk; - return TRUE; -} - -const char* TGestioneSoggetti::get_next_key() -{ - // per gestione famiglie - _famatt = _famprec = 0; - // autonumerazione progressiva dei soggetti - return format("%d|%ld", F_CODICE, _lastcod+1 ); -} - -bool TGestioneSoggetti::remove() -{ - // cancella donazioni - // cancella controlli sanitari - // cancella storico - // sistema nucleo familiare ** da fare - // annulla convocazioni del soggetto - // alla fine: cancella il soggetto! - - bool ok = TRUE; - int err; - ok = yesno_box("ATTENZIONE!\nCon questa operazione si elimina definitivamente tutta la scheda del soggetto.\nConfermare l'eliminazione?"); - - if (ok) - { - // cancella donazioni - err = _sdonazioni->remove(); - if (err == _iseof || err == _isemptyfile) - err = NOERR; - - // cancella controlli sanitari - if (err = NOERR) err = _scontrolli->remove(); - if (err == _iseof || err == _isemptyfile) - err = NOERR; - - // cancella benemerenze - if (err = NOERR) err = _sbenemerenze->remove(); - if (err == _iseof || err == _isemptyfile) - err = NOERR; - - // cancella storico - if (err == NOERR) err = _sstorico->remove(); - if (err == _iseof || err == _isemptyfile) - err = NOERR; - - // cancellare le convocazioni del soggetto - - // cancella il soggetto - if (err == NOERR) ok = TRelation_application::remove(); - return (ok && err==NOERR); - } - else - return TRUE; -} - -int TGestioneSoggetti::read(TMask& m) -{ - _famatt = _famprec = 0; - _nuovaconv = FALSE; - _oldconv = NULLDATE; - int err = TRelation_application::read(m); - if (err == NOERR) - { - _oldconv = m.get_date(F_DATACONV); - m.field(F_STAMPATACONV).reset(); - m.field(F_STAMPATACONV).disable(); - TRectype* key = new TRectype(LF_DONAZ); - key->put(DON_CODICE, m.get(F_CODICE)); - err = _sdonazioni->read(key); - if (err == NOERR) - { - TSheet_field& s = (TSheet_field&)m.field(F_DONAZIONI); - s.destroy(); - for (int r=1; r<=_sdonazioni->rows(); r++) - { - TToken_string& row = s.row(r-1); - const TRectype& riga = _sdonazioni->row(r); - row.add(riga.get(DON_DATADON)); // 0 - row.add(riga.get(DON_TIPODON)); // 1 - row.add(riga.get(DON_LUOGODON)); // 2 - row.add(""); // descrizione luogo // 3 - row.add(riga.get(DON_ETICHETTA)); // 4 - row.add(riga.get(DON_PRIMADON)); // 5 - row.add(riga.get(DON_CODSEZ)); // 6 - row.add(riga.get(DON_CODSOT)); // 7 - row.add(""); // denominazione sezione // 8 - row.add(""); // denominazione sottogruppo// 9 - row.add(riga.get(DON_CC)); // 10 - row.add(riga.get(DON_PA)); // 11 - row.add(riga.get(DON_HB)); // 12 - row.add(riga.get(DON_SGPT)); // 13 - row.add(riga.get(DON_PROTIDEMIA)); // 14 - s.check_row(r-1); - } - } - else - if (err == _iseof || err == _isemptyfile) - err = NOERR; - } - if (err == NOERR) - { - TRectype* key = new TRectype(LF_CONTSAN); - key->put(CON_CODICE, m.get(F_CODICE)); - err = _scontrolli->read(key); - if (err == NOERR) - { - TSheet_field& s = (TSheet_field&)m.field(F_CONTROLLI); - s.destroy(); - for (int r=1; r<=_scontrolli->rows(); r++) - { - TToken_string& row = s.row(r-1); - const TRectype& riga = _scontrolli->row(r); - row.add(riga.get(CON_DATACON)); - row.add(riga.get(CON_TIPOCON)); - row.add(riga.get(CON_IDON1)); - row.add(riga.get(CON_IDON2)); - row.add(riga.get(CON_IDON3)); - row.add(riga.get(CON_IDON4)); - row.add(riga.get(CON_INTSI)); - row.add(riga.get(CON_INTAF)); - row.add(riga.get(CON_PROSSTIPO)); - row.add(riga.get(CON_PROSSDATA)); - row.add(riga.get(CON_MOTIVO)); - row.add(riga.get(CON_RESPONSAB)); - } - TGestioneSoggetti::tipocon_set_sheet(s); - } - else - if (err == _iseof || err == _isemptyfile) - err = NOERR; - } - if (err == NOERR) - { - TRectype* key = new TRectype(LF_IDONEITA); - key->put(IDO_CODICE, m.get(F_CODICE)); - err = _sidoneita->read(key); - if (err == NOERR) - { - TSheet_field& s = (TSheet_field&)m.field(F_IDONEITA); - s.destroy(); - for (int r=1; r<=_sidoneita->rows(); r++) - { - TToken_string& row = s.row(r-1); - const TRectype& riga = _sidoneita->row(r); - row.add(riga.get(IDO_DATAIDO)); - row.add(riga.get(IDO_TIPOIDO)); - row.add(riga.get(IDO_IDO_SOS)); - row.add(riga.get(IDO_INTERVALLO)); - row.add(riga.get(IDO_FINESOS)); - row.add(riga.get(IDO_MOTIVO)); - row.add(riga.get(IDO_RESPONSAB)); - } - TGestioneSoggetti::idosos_set_sheet(s); - } - else - if (err == _iseof || err == _isemptyfile) - err = NOERR; - } - - if (err == NOERR) - { - TRectype* key = new TRectype(LF_BENEM); - key->put(BEN_CODICE, m.get(F_CODICE)); - err = _sbenemerenze->read(key); - if (err == NOERR) - { - TSheet_field& s = (TSheet_field&)m.field(F_BENEMERENZE); - s.destroy(); - for (int r=1; r<=_sbenemerenze->rows(); r++) - { - TToken_string& row = s.row(r-1); - const TRectype& riga = _sbenemerenze->row(r); - row.add(riga.get(BEN_TIPOBEN)); - row.add(""); // descrizione benemerenze - row.add(riga.get(BEN_DATAMAT)); - row.add(riga.get(BEN_BONUS)); - row.add(riga.get(BEN_DATABEN)); - row.add(riga.get(BEN_DATACON)); - row.add(riga.get(BEN_RITIRATA)); - row.add(riga.get(BEN_CODSEZ)); - row.add(riga.get(BEN_CODSOT)); - row.add(riga.get(BEN_GRUPPOAZIE)); - row.add(""); // denominazione sezione - row.add(""); // denominazione sottogruppo - row.add(""); // denominazione gruppo aziendale - s.check_row(r-1); - } - } - else - if (err == _iseof || err == _isemptyfile) - err = NOERR; - } - if (err == NOERR) - { - TRectype* key = new TRectype(LF_STORICO); - key->put(STO_CODICE, m.get(F_CODICE)); - err = _sstorico->read(key); - if (err == NOERR) - { - TSheet_field& s = (TSheet_field&)m.field(F_STORICO); - s.destroy(); - for (int r=1; r<=_sstorico->rows(); r++) - { - TToken_string& row = s.row(r-1); - const TRectype& riga = _sstorico->row(r); - row.add(riga.get(STO_DATAISC)); - row.add(riga.get(STO_DATADIM)); - row.add(riga.get(STO_CODSEZ)); - row.add(riga.get(STO_CODSOT)); - row.add(riga.get(STO_CATISC)); - row.add(riga.get(STO_MOTDIM)); - } - } - else - if (err == _iseof || err == _isemptyfile) - err = NOERR; - } - if (err == NOERR) - { - TLocalisamfile fam(LF_FAMIGLIE); - fam.setkey(2); - TRectype& recfam = fam.curr(); - recfam.zero(); - recfam.put(FAM_CODFAM, m.get(F_CODICE)); - if (fam.read() == NOERR) - { - TRectype* key = new TRectype(LF_FAMIGLIE); - _famprec = _famatt = fam.get_long(FAM_FAMIGLIA); - key->put(FAM_FAMIGLIA, _famprec); - _sfamiglia->read(key); - } - else - { - _famprec = _famatt = 0; - _sfamiglia->destroy_rows(); - } - } - return err; -} - -int TGestioneSoggetti::write(const TMask& m) -{ - long curcod = m.get_long(F_CODICE); - if (curcod > _lastcod) _lastcod = curcod; - return TGestioneSoggetti::scrivi(m, FALSE); -} - -int TGestioneSoggetti::rewrite(const TMask& m) -{ - return TGestioneSoggetti::scrivi(m, TRUE); -} - -int TGestioneSoggetti::scrivi(const TMask& m, bool ri) -{ - // questo trucco è autorizzato dal capo! - bool ok = TRUE; - int err = NOERR; - TMask& hmask = (TMask&) m; - if (ok) - { - TDate oggi(TODAY); - hmask.set(F_DATAULTAGG,oggi); - hmask.set(F_UTENULTAGG,user()); - const TDate dataprossi = hmask.get_date(F_DATAPROSSI); - const TDate dataconv = hmask.get_date(F_DATACONV); - const char stato = modstato_tcs(hmask.get(F_STATO)); - const TString16 statosi = hmask.get(F_STATOSI); - // cancellazione la data convocazione se sospeso - // o se è venuto a donare (la dataprossi diventa > della dataconvoc. - if ((stato == 'S') || (statosi == SOSPENSIONE) || (dataprossi > dataconv) || !dataprossi.ok()) - { - TLocalisamfile rconvoc(LF_RCONVOC); - rconvoc.setkey(3); - rconvoc.zero(); - rconvoc.put(RCV_CODICE, hmask.get(F_CODICE)); - rconvoc.put(RCV_DATACONV, dataconv); - if (rconvoc.read() == NOERR) - { - rconvoc.put(RCV_ANNULLATO, TRUE); - int err = rconvoc.rewrite(); - } - const TDate datanulla(NULLDATE); - hmask.set(F_DATACONV, datanulla); - hmask.set(F_DATAULTSOL, datanulla); - const int numzero = 0; - hmask.set(F_NUMCONV,numzero); - } - - TDate dataisc = hmask.get_date(F_DATAISC); - if (!dataisc.ok() && _dataisc) - { - // attenzione: questa operazione viene eseguita due volte - // togliere! - if (hmask.get_date(F_DATAPRISI).ok()) - hmask.set(F_DATAISC,hmask.get(F_DATAPRISI)); - else - { - TSheet_field& s = (TSheet_field&)m.field(F_DONAZIONI); - if (s.items()>0) - { - ordina_sheet_data(s); - TToken_string& row = s.row(0); - hmask.set(F_DATAISC,row.get(0)); - } - } - } - err = ri ? TRelation_application::rewrite(m) : TRelation_application::write(m); - if (err == NOERR) - { - _sdonazioni->destroy_rows(); - TSheet_field& s = (TSheet_field&)m.field(F_DONAZIONI); - TRectype* key = new TRectype(LF_DONAZ); - key->put(DON_CODICE, m.get(F_CODICE)); - _sdonazioni->set_key(key); - - ordina_sheet_data(s); - - for (int r=s.items(); r>0; r--) - { - TToken_string& row = s.row(r-1); - TRectype& rec = _sdonazioni->row(r,TRUE); - rec.put(DON_DATADON, row.get(0)); - rec.put(DON_TIPODON, row.get()); // 1 - rec.put(DON_LUOGODON, row.get()); // 2 - // descrizione luogo // 3 - rec.put(DON_ETICHETTA, row.get(4)); - rec.put(DON_PRIMADON, row.get()); // 5 - TString16 codsez = row.get(6); - TString16 codsot = row.get(7); - if (codsez.blank()) - { - codsez = hmask.get(F_CODSEZ); - codsot = hmask.get(F_CODSOT); - } - rec.put(DON_CODSEZ, codsez); // 6 - rec.put(DON_CODSOT, codsot); // 7 - // denominazione sezione // 8 - // denominazione sottogruppo // 9 - rec.put(DON_CC, row.get(10)); - rec.put(DON_PA, row.get()); // 11 - rec.put(DON_HB, row.get()); // 12 - rec.put(DON_SGPT, row.get()); // 13 - rec.put(DON_PROTIDEMIA, row.get()); // 14 - } - err = ri ? _sdonazioni->rewrite() : _sdonazioni->write(); - } - if (err == NOERR) - { - _scontrolli->destroy_rows(); - TSheet_field& s = (TSheet_field&)m.field(F_CONTROLLI); - TRectype* key = new TRectype(LF_CONTSAN); - key->put(CON_CODICE, m.get(F_CODICE)); - _scontrolli->set_key(key); - for (int r=s.items(); r>0; r--) - { - TToken_string& row = s.row(r-1); - if (row.empty_items()) - s.destroy(r-1); - } - ordina_sheet_data(s); - for (r=s.items(); r>0; r--) - { - TToken_string& row = s.row(r-1); - TRectype& rec = _scontrolli->row(r,TRUE); - rec.put(CON_DATACON, row.get(0)); - rec.put(CON_TIPOCON, row.get()); - rec.put(CON_IDON1, row.get()); - rec.put(CON_IDON2, row.get()); - rec.put(CON_IDON3, row.get()); - rec.put(CON_IDON4, row.get()); - rec.put(CON_INTSI, row.get()); - rec.put(CON_INTAF, row.get()); - rec.put(CON_PROSSTIPO, row.get()); - rec.put(CON_PROSSDATA, row.get()); - rec.put(CON_MOTIVO, row.get()); - rec.put(CON_RESPONSAB, row.get()); - } - err = ri ? _scontrolli->rewrite() : _scontrolli->write(); - } - if (err == NOERR) - { - _sidoneita->destroy_rows(); - TSheet_field& s = (TSheet_field&)m.field(F_IDONEITA); - TRectype* key = new TRectype(LF_IDONEITA); - key->put(IDO_CODICE, m.get(F_CODICE)); - _sidoneita->set_key(key); - for (int r=s.items(); r>0; r--) - { - TToken_string& row = s.row(r-1); - if (row.empty_items()) - s.destroy(r-1); - } - ordina_sheet_data(s); - for (r=s.items(); r>0; r--) - { - TToken_string& row = s.row(r-1); - TRectype& rec = _sidoneita->row(r,TRUE); - rec.put(IDO_DATAIDO, row.get(0)); - rec.put(IDO_TIPOIDO, row.get()); - rec.put(IDO_IDO_SOS, row.get()); - rec.put(IDO_INTERVALLO,row.get()); - rec.put(IDO_FINESOS, row.get()); - rec.put(IDO_MOTIVO, row.get()); - rec.put(IDO_RESPONSAB, row.get()); - } - err = ri ? _sidoneita->rewrite() : _sidoneita->write(); - } - if (err == NOERR) - { - _sbenemerenze->destroy_rows(); - TSheet_field& s = (TSheet_field&)m.field(F_BENEMERENZE); - for (int r=s.items(); r>0; r--) - { - TToken_string& row = s.row(r-1); - if (row.empty()) - s.destroy(r-1); - } - s.force_update(); - TRectype* key = new TRectype(LF_BENEM); - key->put(BEN_CODICE, m.get(F_CODICE)); - _sbenemerenze->set_key(key); - - ordina_sheet_data(s); - - for (r=s.items(); r>0; r--) - { - TToken_string& row = s.row(r-1); - TRectype& rec = _sbenemerenze->row(r,TRUE); - rec.put(BEN_TIPOBEN, row.get(0)); - rec.put(BEN_DATAMAT, row.get(2)); - rec.put(BEN_BONUS, row.get()); - rec.put(BEN_DATABEN, row.get()); - rec.put(BEN_DATACON, row.get()); - rec.put(BEN_RITIRATA, row.get()); - rec.put(BEN_CODSEZ, row.get()); - rec.put(BEN_CODSOT, row.get()); - rec.put(BEN_GRUPPOAZIE, row.get()); - } - err = ri ? _sbenemerenze->rewrite() : _sbenemerenze->write(); - } - if (err == NOERR) - { - _sstorico->destroy_rows(); - TSheet_field& s = (TSheet_field&)m.field(F_STORICO); - TRectype* key = new TRectype(LF_STORICO); - key->put(STO_CODICE, m.get(F_CODICE)); - _sstorico->set_key(key); - - // ordinamento dello sheet storico - ordina_sheet_data(s); - - for (int r=s.items(); r>0; r--) - { - TToken_string& row = s.row(r-1); - TRectype& rec = _sstorico->row(r,TRUE); - rec.put(STO_DATAISC, row.get(0)); - rec.put(STO_DATADIM, row.get()); - rec.put(STO_CODSEZ, row.get()); - rec.put(STO_CODSOT, row.get()); - rec.put(STO_CATISC, row.get()); - rec.put(STO_MOTDIM, row.get()); - } - err = ri ? _sstorico->rewrite() : _sstorico->write(); - } - if (err == NOERR) - { - if (_famatt == -1) - { - TRectype* key = new TRectype(LF_FAMIGLIE); - key->put(FAM_FAMIGLIA, _lastfam+1); - _sfamiglia->set_key(key); - _lastfam = _lastfam+1; - } - if (_famatt != _famprec) - err = ri ? _sfamiglia->rewrite() : _sfamiglia->write(); - } - if ((err == NOERR) && (_nuovaconv)) - { - TDate datac = m.get_date(F_DATACONV); - if (datac.ok()) - { - TLocalisamfile rconvoc(LF_RCONVOC); - - int progconv = 0; - TLocalisamfile convoc(LF_CONVOC); - convoc.setkey(2); - convoc.zero(); - convoc.put(COV_DATA, m.get(F_DATACONV)); - convoc.put(COV_PUNTO, m.get(F_PUNTOCONV)); - convoc.put(COV_TIPO, "SI"); - convoc.put(COV_CODSEZ, m.get(F_CODSEZ)); - convoc.put(COV_CODSOT, m.get(F_CODSOT)); - if (convoc.read() == NOERR) - { - rconvoc.setkey(1); - rconvoc.zero(); - rconvoc.put(COV_NUMERO, convoc.get(RCV_NUMERO)); - TRectype r(rconvoc.curr()); - int items = 0; - for(rconvoc.read(); !rconvoc.eof(); rconvoc.next()) - { - if (rconvoc.curr() != r) break; - progconv = rconvoc.get_int(RCV_PROGCONV); - } - progconv++; - } - else - { - progconv++; - convoc.setkey(1); - convoc.last(); - const long numero = convoc.get_long(COV_NUMERO)+1; - convoc.zero(); - convoc.put(COV_DATA, m.get(F_DATACONV)); - convoc.put(COV_PUNTO, m.get(F_PUNTOCONV)); - convoc.put(COV_TIPO, "SI"); - convoc.put(COV_CODSEZ, m.get(F_CODSEZ)); - convoc.put(COV_CODSOT, m.get(F_CODSOT)); - convoc.put(COV_NUMERO, numero); - convoc.put(COV_NOTE, "Convocazione automatica"); - convoc.write(); - } - rconvoc.setkey(3); - rconvoc.zero(); - rconvoc.put(RCV_CODICE, m.get(F_CODICE)); - rconvoc.put(RCV_DATACONV, m.get(F_DATACONV)); - if ((rconvoc.read() != NOERR) || (rconvoc.get_bool(RCV_ANNULLATO))) - { - rconvoc.zero(); - rconvoc.put(RCV_CODICE, m.get(F_CODICE)); - rconvoc.put(RCV_DATACONV, m.get(F_DATACONV)); - rconvoc.put(RCV_NUMERO, convoc.get_long(COV_NUMERO)); - rconvoc.put(RCV_PROGCONV, progconv); - rconvoc.put(RCV_CHIAMATA, 'C'); - rconvoc.put(RCV_STAMPATO, m.get(F_STAMPATACONV)); - err = rconvoc.write(); - } - } - } - } - return err; -} - -void TGestioneSoggetti::c_reord(TSheet_field& s, TSheet_field& si) -{ - const TDate datanulla(NULLDATE); - TDate data(NULLDATE); - TDate prossdata(NULLDATE); - TString16 tipo = " "; - TString16 prosstipo = " "; - char modstato = ' '; - 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=s.items()-1; r>=0; r--) - { - TToken_string& row = s.row(r); - tipo = row.get(1); - modstato = modstato_tcs(tipo); - if ((modstato != 'N') && (r_ultstato == -1)) - r_ultstato = r; - else if ((modstato != 'N') && (penultstato == ' ')) - penultstato = modstato; - if ((modstato == 'I') && (r_ultid == -1)) - r_ultid = r; - } - TString16 id1 = ' '; - TString16 id2 = ' '; - TString16 id3 = ' '; - TString16 id4 = ' '; - int intsi = 0; - int intaf = 0; - tipo = ' '; - prosstipo = ' '; - data = TDate(NULLDATE); - prossdata = TDate(NULLDATE); - - if (r_ultid != -1) - { - TToken_string& row = s.row(r_ultid); - data = TDate(row.get(0)); - tipo = row.get(); - id1 = row.get(); - id2 = row.get(); - id3 = row.get(); - id4 = row.get(); - intsi = row.get_int(); - intaf = row.get_int(); - } - TMask& mask = s.mask(); - mask.field(F_DATAULTID).set(data); - mask.field(F_DATAULTID).on_key(K_TAB); - mask.field(F_TIPOULTID).set(tipo); - mask.field(F_TIPOULTID).on_key(K_TAB); - mask.field(F_IDON1).set(id1); - mask.field(F_IDON1).on_key(K_TAB); - mask.field(F_IDON2).set(id2); - mask.field(F_IDON2).on_key(K_TAB); - mask.field(F_IDON3).set(id3); - mask.field(F_IDON3).on_key(K_TAB); - mask.field(F_IDON4).set(id4); - mask.field(F_IDON4).on_key(K_TAB); - mask.set(F_INTSI,intsi); - mask.field(F_INTSI).on_key(K_TAB); - mask.set(F_INTAF,intaf); - mask.field(F_INTAF).on_key(K_TAB); - - tipo = ' '; - if (r_ultstato != -1) - { - TToken_string& row = s.row(r_ultstato); - dataultstato = TDate(row.get(0)); - tipo = row.get(); - prosstipo = row.get(8); - prossdata = TDate(row.get()); - ultstato = modstato_tcs(tipo); - } - mask.set(F_STATO,tipo); - mask.field(F_STATO).on_key(K_TAB); - mask.set(F_DATASTATO,dataultstato); - mask.set(F_PROS_STATO,prosstipo); - mask.field(F_PROS_STATO).on_key(K_TAB); - mask.set(F_DATA_PROS,prossdata); - - if (intsi>0) - { - mask.set(F_STATOSI,tipo); - mask.set(F_DATASI,dataultstato); - //if (prosstipo == "FS") - if (modstato_tcs(prosstipo)=='F') - mask.set(F_FINESOSSI,prossdata); - else - mask.set(F_FINESOSSI,datanulla); - } - else - { - mask.set(F_STATOSI," "); - mask.set(F_DATASI,datanulla); - mask.set(F_FINESOSSI,datanulla); - } - if (intaf>0) - { - mask.set(F_STATOAF,tipo); - mask.set(F_DATAAF,dataultstato); - //if (prosstipo == "FS") - if (modstato_tcs(prosstipo)=='F') - mask.set(F_FINESOSAF,prossdata); - else - mask.set(F_FINESOSAF,datanulla); - } - else - { - mask.set(F_STATOAF," "); - mask.set(F_DATAAF,datanulla); - mask.set(F_FINESOSAF,datanulla); - } - - /* - mask.set(F_STATOSI," "); - mask.set(F_STATOAF," "); - mask.set(F_DATASI,datanulla); - mask.set(F_DATAAF,datanulla); - mask.set(F_FINESOSSI,datanulla); - mask.set(F_FINESOSAF,datanulla); - */ - // riordino le idoneita - for (int ri=0; ri= dataultstato) - { - if (tipoido == IDON_SI) - { - mask.field(F_DATASI).set(dataido); - mask.field(F_STATOSI).set(ido_sos); - mask.field(F_FINESOSSI).set(finesos); - if (intervallo != 0 && ido_sos == IDONEITA) - { - mask.set(F_INTSI,intervallo); - if (id1 != IDON_SI && id2 != IDON_SI && id3 != IDON_SI && id4 != IDON_SI) - if (id1.empty()) - mask.field(F_IDON1).set(IDON_SI); - else - if (id2.empty()) - mask.field(F_IDON2).set(IDON_SI); - else - if (id3.empty()) - mask.field(F_IDON3).set(IDON_SI); - else - if (id4.empty()) - mask.field(F_IDON4).set(IDON_SI); - } - } - if (tipoido == IDON_AF) - { - mask.field(F_DATAAF).set(dataido); - mask.field(F_STATOAF).set(ido_sos); - mask.field(F_FINESOSAF).set(finesos); - if (intervallo != 0 && ido_sos == IDONEITA) - { - mask.set(F_INTAF,intervallo); - if (id1 != IDON_PL && id2 != IDON_PL && id3 != IDON_PL && id4 != IDON_PL) - if (id1.empty()) - mask.field(F_IDON1).set(IDON_PL); - else - if (id2.empty()) - mask.field(F_IDON2).set(IDON_PL); - else - if (id3.empty()) - mask.field(F_IDON3).set(IDON_PL); - else - if (id4.empty()) - mask.field(F_IDON4).set(IDON_PL); - } - } - } - } - 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 = mask.get(F_STATOSI); - TString16 statoaf = mask.get(F_STATOAF); - TDate datastatosi = mask.get_date(F_DATASI); - TDate datastatoaf = mask.get_date(F_DATAAF); - if (statosi.not_empty() || statoaf.not_empty()) - { - TString16 stato = mask.get(F_STATO); - char modstato = modstato_tcs(stato); - // prima c'era un && - if ((statosi == IDONEITA) || (statoaf == IDONEITA)) - if ((modstato != 'I') && (modstato != 'F')) //corretto || con && da Marco in data 07/09/99 - stato = IDONEITA; - //if ((statosi == SOSPENSIONE || statosi.empty()) && (statoaf == SOSPENSIONE || statoaf.empty())) - if ((statosi == SOSPENSIONE) && (statoaf == SOSPENSIONE)) - if (modstato != 'S') - stato = SOSPENSIONE; - char statocalcolato = modstato_tcs(stato); - if (modstato != statocalcolato) - { - mask.set(F_STATO, stato); - mask.field(F_STATO).on_key(K_TAB); - mask.set(F_PROS_STATO," "); - mask.field(F_PROS_STATO).on_key(K_TAB); - mask.set(F_DATA_PROS,datanulla); - mask.field(F_DATA_PROS).on_key(K_TAB); - if (statocalcolato == 'I') - { - TDate datacalcolata = NULLDATE; - if (statosi == IDONEITA) - datacalcolata = datastatosi; - if ((statoaf == IDONEITA) && (datastatoaf > datacalcolata)) - datacalcolata = datastatoaf; - mask.set(F_DATASTATO,datacalcolata); - } - else - if (datastatoaf > datastatosi) - mask.set(F_DATASTATO,datastatoaf); - else - mask.set(F_DATASTATO,datastatosi); - } - } - d_datepross(s); - - if (((penultstato == 'S') || (penultstato == 'I')) && ((ultstato == 'I') || (ultstato == 'F'))) - { - data = mask.get_date(F_DATAPROSSI); - if (data < dataultstato && data.ok()) mask.set(F_DATAPROSSI,dataultstato); - data = mask.get_date(F_DATAPROSAF); - if (data < dataultstato && data.ok()) mask.set(F_DATAPROSAF,dataultstato); - } - // verifico la categoria e lo stato - TString16 catdon = mask.get(F_CATDON); - TTable ctd("CTD"); - ctd.put("CODTAB",catdon); - if (ctd.read() == NOERR) - { - const bool dimissione = ctd.get_bool("B0"); - const char statocalcolato = modstato_tcs(mask.get(F_STATO)); - // tolto l'if da Cristina il 18/06/99 - da qui - // rimesso da Marco il 06/07/99 modificando dimissione in !dimissione e suddividendolo in due if - if ((statocalcolato == 'I') || (statocalcolato == 'F')) - { - int totdon = mask.get_int(F_TOTDON); - if (!dimissione) - { - //Operazione sostituita da Marco il 26/07/99 al posto di quella commentata sotto - if ((catdon == app()._catini1 || app()._catini1.empty()) && (totdon>=app()._numdon1) && app()._catfin1.not_empty()) - { - mask.set(F_CATDON, app()._catfin1); - catdon = app()._catfin1; - } - const bool tstampata = mask.get_bool(F_T_STAMPATA); - if ((catdon == app()._catini2 || app()._catini2.empty()) && (totdon>=app()._numdon2) && app()._catfin2.not_empty() && ((!app()._sttess2)|| (tstampata))) - { - mask.set(F_CATDON, app()._catfin2); - catdon = app()._catfin2; - } - // Corretto da Marco il 26/07/99 sostituendolo con quello sopra - // Reinserito come else da Marco il 07/09/99 per gestire il cambio in caso di inserimento idoneità parziali invece di controllo - } - else - { - if ((totdon>=app()._numdon1) && (app()._catfin1.not_empty())) - { - mask.set(F_CATDON, app()._catfin1); - catdon = app()._catfin1; - } - const bool tstampata = mask.get_bool(F_T_STAMPATA); - if ((totdon>=app()._numdon2) && (app()._catfin2.not_empty()) && ((!app()._sttess2) || (tstampata))) - { - mask.set(F_CATDON, app()._catfin2); - catdon = app()._catfin2; - } - } - mask.field(F_CATDON).on_key(K_TAB); - TDate datanulla(NULLDATE); - mask.set(F_DATADIM,datanulla); - } - //fino a qui - } -} - -bool TGestioneSoggetti::famiglia_notify(TSheet_field& s, int r, KEY k) -{ - static long oldcodice; - switch (k) - { - case K_ENTER: // uscita da riga modificata - { - TToken_string& row = s.row(r); - const long codice = row.get_long(1); - if (codice != 0) - { - TLocalisamfile fam(LF_FAMIGLIE); - fam.setkey(2); - TRectype& recfam = fam.curr(); - recfam.zero(); - recfam.put(FAM_CODFAM, codice); - if (fam.read() == NOERR) - if (fam.get_long(FAM_FAMIGLIA) != app()._famatt) - return s.error_box("Soggetto gia' inserito in altra famiglia"); - app()._famprec = 0; - } - } - break; - case K_CTRL+K_DEL: // avvenuta cancellazione riga - { - if (s.items() == 1 || oldcodice == app()._codice) - { - s.destroy(); - app()._famatt = 0; - TMask& m = s.mask(); - m.show(-1); - m.hide(F_FAMIGLIARI); - } - else - app()._famprec = 0; - } - break; - case K_DEL: // richiesta di cancellazione riga - { - if (s.items() == 2) - return s.yesno_box("Attenzione: dopo la cancellazione la famiglia verra' eliminata"); - TToken_string& row = s.row(r); - const long codice = row.get_long(1); - oldcodice = codice; - if (app()._codice == codice) - return s.yesno_box("Attenzione: si sta eliminando il soggetto dalla famiglia"); - } - break; - } - return TRUE; -} - -bool TGestioneSoggetti::donazioni_notify(TSheet_field& s, int r, KEY k) -{ - static TToken_string oldrow; - bool modified = FALSE; - TMask& mask = s.mask(); - if (k == K_CTRL+K_DEL) // avvenuta cancellazione riga - { - int totdon = mask.get_int(F_TOTDON); - mask.set(F_TOTDON,totdon-1); - const TDate data = oldrow.get(0); - const TString16 tipo = oldrow.get(); - if (data == mask.get_date(F_DATAULTDON) - || data == mask.get_date(F_DATAULTSI) - || data == mask.get_date(F_DATAULTAF)) - modified = TRUE; - if (is_donaz(tipo,IDON_SI)) - { - totdon = mask.get_int(F_TOTDONSI); - mask.set(F_TOTDONSI,totdon-1); - } - else - if (is_donaz(tipo,IDON_AF)) - { - totdon = mask.get_int(F_TOTDONAF); - mask.set(F_TOTDONAF,totdon-1); - } - } - else - { - switch (k) - { - case K_DEL: // richiesta di cancellazione riga - oldrow = s.row(r); - break; - case K_SPACE: // inizio modifica riga - oldrow = s.row(r); - break; - case K_ENTER: // uscita da riga modificata - { - TToken_string& row = s.row(r); - const TDate actdata(row.get(0)); - const TString16 acttipo(row.get()); - const TDate olddata = oldrow.get(0); - const TString16 oldtipo = oldrow.get(); -//Righe aggiunte da Marco in data 05/08/99 per visualizzare un messaggio di avvertimento in caso di donazione in stato di sospensione - const char statocalcolato = modstato_tcs(mask.get(F_STATO)); - const char statosi = modstato_tcs(mask.get(F_STATOSI)); - const char statoaf = modstato_tcs(mask.get(F_STATOAF)); - if (actdata > mask.get_date(F_DATASTATO)) - if (((statocalcolato != 'I') && (statocalcolato != 'F')) || ((statosi != 'I') && (is_donaz(acttipo,IDON_SI))) - || ((statoaf != 'I') && (is_donaz(acttipo,IDON_AF)))) - { - TString messaggio = ""; - messaggio << "Stato soggetto non compatibile per una donazione.\n"; - messaggio << "In caso si prosegua, adeguare manualmente lo stato del soggetto!!!"; - s.warning_box(messaggio); - }; -//fino a qui - if (olddata != actdata) - { - ordina_sheet_data(s); - s.force_update(); - if (olddata == mask.get_date(F_DATAULTSI) - || olddata == mask.get_date(F_DATAULTAF) - || actdata > mask.get_date(F_DATAULTSI) - || actdata > mask.get_date(F_DATAULTAF)) - modified = TRUE; - } - if (oldtipo != acttipo) - modified = TRUE; - } - break; - case K_CTRL+K_INS: // avvenuto inserimento riga (ancora vuota) -// Aggiunte le righe seguenti da Marco il 05/08/99 per visualizzare un messaggio in caso di inserimento donazione su soggetto non idoneo - if ((modstato_tcs(mask.get(F_STATO)) != 'I') && (modstato_tcs(mask.get(F_STATO)) != 'F')) - { - TString messaggio = ""; - messaggio << "Stato soggetto non compatibile per una donazione.\n"; - messaggio << "In caso si prosegua, adeguare manualmente lo stato del soggetto!!!"; - s.warning_box(messaggio); - } -//Fino a qui - const int totdon = mask.get_int(F_TOTDON); - mask.set(F_TOTDON,totdon+1); - break; - } - } - if (modified) - app().calcola_donazioni(mask, s); - return TRUE; -} - -bool TGestioneSoggetti::controlli_notify(TSheet_field& s, int r, KEY k) -{ - static bool delete_l = FALSE; // flag per cancellazione ultima riga - static TToken_string oldrow; - bool modified = FALSE; - TMask& mask = s.mask(); - if (k == K_CTRL+K_DEL) // avvenuta cancellazione riga - { - if (delete_l) - modified = TRUE; - delete_l = FALSE; - } - else - { - switch (k) - { - case K_INS: // richiesta inserimento riga - return app()._permesso; - break; - case K_SPACE: // inizio modifica riga - oldrow = s.row(r); - break; - case K_ENTER: // uscita da riga modificata - { - TToken_string& row = s.row(r); - const TDate actdata(row.get(0)); - const TString16 acttipo(row.get()); - const TDate olddata(oldrow.get(0)); - const TString16 oldtipo(oldrow.get()); - if (olddata != actdata) - { - ordina_sheet_data(s); - app().tipocon_set_sheet(s); - s.force_update(); - } - if (modstato_tcs(oldtipo) != 'N' || modstato_tcs(acttipo) != 'N') - modified = TRUE; - } - break; - case K_DEL: // richiesta di cancellazione riga - { - oldrow = s.row(r); - const TString16 oldtipo(oldrow.get(1)); - if (r == (s.items()-1) && modstato_tcs(oldtipo) != 'N') - delete_l = TRUE; - return app()._permesso; - } - break; - } - } - if (modified) - { - TSheet_field& i = (TSheet_field&)mask.field(F_IDONEITA); - c_reord(s, i); - } - return TRUE; -} - -bool TGestioneSoggetti::idoneita_notify(TSheet_field& s, int r, KEY k) -{ - static TToken_string oldrow; - bool modified = FALSE; - TMask& mask = s.mask(); - - if (k == K_CTRL+K_DEL) // avvenuta cancellazione riga - modified = TRUE; - else - { - switch (k) - { - case K_INS: // richiesta inserimento riga - return app()._permesso; - break; - case K_SPACE: // inizio modifica riga - oldrow = s.row(r); - break; - case K_ENTER: // uscita da riga modificata - { - TToken_string& row = s.row(r); - const TDate actdata(row.get(0)); - const TString16 acttipo(row.get()); - const TString16 actidosos(row.get()); - const TDate olddata(oldrow.get(0)); - const TString16 oldtipo(oldrow.get()); - const TString16 oldidosos(oldrow.get()); - if (olddata != actdata) - { - ordina_sheet_data(s); - app().idosos_set_sheet(s); - s.force_update(); - } - if (olddata!=actdata || oldtipo!=acttipo || oldidosos!=actidosos) - modified = TRUE; - } - break; - case K_DEL: - return app()._permesso; - } - } - if (modified) - { - TSheet_field& c = (TSheet_field&)mask.field(F_CONTROLLI); - c_reord(c,s); - } - return TRUE; -} - - -bool TGestioneSoggetti::benemerenze_notify(TSheet_field& s, int r, KEY k) -{ - if (k == K_ENTER) - { - } - return TRUE; -} - -bool TGestioneSoggetti::storico_notify(TSheet_field& s, int r, KEY k) -{ - if (k == K_ENTER) - { - } - return TRUE; -} - -bool TGestioneSoggetti::richiesta_password() -{ - TMask& mask = *(app().get_mask()); - TMask msk("at0100e"); - if (msk.run() == K_ENTER) - { - if (msk.get(F_PASSWORD) == "BAMP") - { - mask.enable(F_CONTROLLI); - mask.enable(F_IDONEITA); - return TRUE; - } - else - { - error_box("Password errata! Non e' possibile modificare la situazione sanitaria"); - mask.disable(F_CONTROLLI); - mask.disable(F_IDONEITA); - } - } - return FALSE; -} - -int at0100(int argc, char* argv[]) -{ - TGestioneSoggetti a; - a.run(argc, argv, "Soggetti"); - return 0; +#include +#include +#include +#include +#include +#include +#include + +#include "at0.h" +#include "atlib.h" + +// nomi campi maschera +#include "at0100a.h" // maschera principale +#include "at0100b.h" // maschera genera donazioni +#include "at0100c.h" // maschera famigliari +#include "at0100d.h" // maschera ricerca parziale +#include "at0100e.h" // maschera richiesta password + +// nomi dei campi +#include "soggetti.h" +#include "donaz.h" +#include "contsan.h" +#include "benem.h" +#include "storico.h" +#include "famiglie.h" +#include "convoc.h" +#include "rconvoc.h" +#include "idoneita.h" + +class TGestioneSoggetti : public TRelation_application +{ + TMask* _msk; + TRelation* _rel; + TLocalisamfile* _donaz; + TLocalisamfile* _contsan; + TLocalisamfile* _benem; + TLocalisamfile* _storico; + TLocalisamfile* _famiglie; + TLocalisamfile* _convoc; + TLocalisamfile* _rconvoc; + TLocalisamfile* _idoneita; + TRecord_array* _sdonazioni; // sheet donazioni + TRecord_array* _scontrolli; // sheet controlli + TRecord_array* _sbenemerenze; // sheet benemerenze + TRecord_array* _sstorico; // sheet storico + TRecord_array* _sfamiglia; // sheet famiglia + TRecord_array* _sidoneita; // sheet idoneita + TArray* _aconvocazioni; // array delle convocazioni + long _lastcod; // ultimo codice soggetto assegnato + long _lastfam; // ultimo codice famiglia assegnato + long _famprec; // codice famiglia precedente + long _famatt; // codice famiglia attuale + long _codice; // codice soggetto attuale (per famiglie) + bool _nuovaconv; // nuova convocazione da registrare + TDate _oldconv; // data ultima convocazione registrata su soggetto + + // parametri di sezione + int _numdon1, _numdon2; + TString16 _catini1, _catfin1, _catini2, _catfin2, _oldgruppo, _oldrh, _oldkell, _oldfen, _olddu; + bool _sttess2, _dataisc, _ctrlpass, _permesso; + +protected: + virtual bool user_create(); + virtual bool user_destroy(); + virtual const char* get_next_key(); + virtual int scrivi(const TMask& m, bool ri); + virtual int write(const TMask& m); + virtual int rewrite(const TMask& m); + virtual int read(TMask& m); + virtual bool remove(); + 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 on_firm_change(); + + virtual void init_insert_mode(TMask& m); + virtual void init_modify_mode(TMask& m); + virtual void init_query_mode(TMask& m); + + // notify degli sheet + static bool donazioni_notify(TSheet_field& s, int r, KEY k); + static bool controlli_notify(TSheet_field& s, int r, KEY k); + static bool benemerenze_notify(TSheet_field& s, int r, KEY k); + static bool storico_notify(TSheet_field& s, int r, KEY k); + static bool famiglia_notify(TSheet_field& s, int r, KEY k); + static bool idoneita_notify(TSheet_field& s, int r, KEY k); + // handler dei campi o bottoni + static bool ricparz_handler(TMask_field& f, KEY k); + static bool convoc_handler(TMask_field& f, KEY k); + static bool datanasc_handler(TMask_field& f, KEY k); + static bool catdon_handler(TMask_field& f, KEY k); + static bool dataconv_handler(TMask_field& f, KEY k); + static bool genera_handler(TMask_field& f, KEY k); + static bool famiglia_handler(TMask_field& f, KEY k); + static bool collega_handler(TMask_field& f, KEY k); + static bool nome_handler(TMask_field& f, KEY k); + static bool nuova_handler(TMask_field& f, KEY k); + static bool eseguigen_handler(TMask_field& f, KEY k); + static bool tipocon_handler(TMask_field& f, KEY k); + static bool idosos_handler(TMask_field& f, KEY k); + static bool idoncon_handler(TMask_field& f, KEY k); + static bool datadon_handler(TMask_field& f, KEY k); + static bool datacon_handler(TMask_field& f, KEY k); + static bool donprecsi_handler(TMask_field& f, KEY k); + static bool donprecaf_handler(TMask_field& f, KEY k); + static bool donazioni_handler(TMask_field& f, KEY k); + static bool controlli_handler(TMask_field& f, KEY k); + static bool idoneita_handler(TMask_field& f, KEY k); + static bool storico_handler(TMask_field& f, KEY k); + static bool benem_handler(TMask_field& f, KEY k); + static bool gruppo_handler(TMask_field& f, KEY k); + static bool rhantid_handler(TMask_field& f, KEY k); + static bool kell_handler(TMask_field& f, KEY k); + static bool fenotiporh_handler(TMask_field& f, KEY k); + static bool du_handler(TMask_field& f, KEY k); + static void c_reord(TSheet_field& controlli, TSheet_field& idoneita); + + // setta le abilitazioni ai campi di una riga dei controlli + void tipocon_set_row(TMask& m); + // setta le abilitazioni ai campi di una riga delle idoneita + void idosos_set_row(TMask& m); + // setta le abilitazioni ai campi di tutto lo sheet dei controlli + void tipocon_set_sheet(TSheet_field& s); + // setta le abilitazioni ai campi di tutto lo sheet dei controlli + void idosos_set_sheet(TSheet_field& s); + +public: + void calcola_donazioni(TMask& mask, TSheet_field& s); + bool richiesta_password(); + TGestioneSoggetti() {} +}; + +HIDDEN inline TGestioneSoggetti& app() { return (TGestioneSoggetti&) main_app(); } + +static int compare_date(const TObject** o1, const TObject** o2) +{ + TToken_string* s1 = (TToken_string*)*o1; + TToken_string* s2 = (TToken_string*)*o2; + + const TDate d1(s1->get(0)); + const TDate d2(s2->get(0)); + + int d=0; + if (d1>d2) d=+1; + else + if (d1 datasi) + datasi = dataultsi; + } + if (id_af) + { + dataaf=dataultdon; + dataaf+=intaf; + } + } + } + else + { + if (id_si) + datasi= m.get_date(F_DATAULTID); + if (id_af) + dataaf= m.get_date(F_DATAULTID); + } + } + TString16 statoparziale; + TDate datastatoparziale; + statoparziale = m.get(F_STATOSI); + datastatoparziale = (TDate)m.get(F_DATASI); + if (statoparziale == SOSPENSIONE) + datasi = NULLDATE; + if (statoparziale == IDONEITA) + if (datastatoparziale > datasi) + datasi = datastatoparziale; + statoparziale = m.get(F_STATOAF); + datastatoparziale = (TDate)m.get(F_DATAAF); + if (statoparziale == SOSPENSIONE) + dataaf = NULLDATE; + if (statoparziale == IDONEITA) + if (datastatoparziale > dataaf) + dataaf = datastatoparziale; + m.set(F_DATAPROSSI,datasi); + m.set(F_DATAPROSAF,dataaf); +} + +void TGestioneSoggetti::calcola_donazioni(TMask& mask, TSheet_field& s) +{ + TDate ultdata(NULLDATE); + TString16 ulttipo = ' '; + TMask_field& f = mask.field(F_TIPOULTDON); + const int i = s.items()-1; + const int donprecsi = mask.get_int(F_DONPRECSI); + const int donprecaf = mask.get_int(F_DONPRECAF); + if (i < 0) // non ha donazioni + { + int zerodon = 0; + mask.set(F_DATAULTDON,ultdata); + mask.set(F_DATAULTSI,ultdata); + mask.set(F_DATAULTAF,ultdata); + mask.set(F_TOTDONSI,donprecsi); + mask.set(F_TOTDONAF,donprecaf); + f.set(ulttipo); + f.on_key(K_TAB); + } + else + { + TToken_string& row = s.row(i); + ultdata = TDate(row.get(0)); + ulttipo = row.get(); + mask.set(F_DATAULTDON,ultdata); + f.set(ulttipo); + f.on_key(K_TAB); + TDate dataultsi(NULLDATE); + TDate dataultaf(NULLDATE); + int totdonsi = 0; + int totdonaf = 0; + for (int r=0; r=_numdon1) && _catfin1.not_empty()) + { + mask.set(F_CATDON, _catfin1); + catdon = _catfin1; + } + if ((catdon == _catini2 || _catini2.empty()) && (totdon>=_numdon2) && _catfin2.not_empty() && !_sttess2) + { + mask.set(F_CATDON, _catfin2); + catdon = _catfin2; + } + mask.field(F_CATDON).on_key(K_TAB); + TDate dataisc = mask.get_date(F_DATAISC); + if (!dataisc.ok() && _dataisc) + { + if (!mask.get_date(F_DATAPRISI) == NULLDATE) + mask.set(F_DATAISC,mask.get(F_DATAPRISI)); + else + { + TToken_string& row = s.row(0); + TDate primadata = TDate(row.get(0)); + mask.set(F_DATAISC,primadata); + } + } + } + d_datepross(s); +} + +void TGestioneSoggetti::init_insert_mode(TMask& m) +{ + m.set(F_NOTIZIARIO,TRUE); + m.set(F_BENEM,TRUE); + m.hide(F_RICPARZ); +} + +void TGestioneSoggetti::init_modify_mode(TMask& m) +{ + m.hide(F_RICPARZ); + _oldgruppo = m.get(F_GRUPPOAB0); + _oldrh = m.get(F_RHANTID); + _oldfen = m.get(F_FENOTIPORH); + _oldkell = m.get(F_KELL); + _olddu = m.get(F_DU); +} + +void TGestioneSoggetti::init_query_mode(TMask& m) +{ + m.show(F_RICPARZ); +} + +bool TGestioneSoggetti::donazioni_handler(TMask_field& f, KEY k) +{ + if (!f.mask().is_running()) + { + TSheet_field& s = (TSheet_field&)f; + const int n = s.items()-1; + if (n >= 0) + s.select(n, TRUE); + } + return TRUE; +} + +bool TGestioneSoggetti::controlli_handler(TMask_field& f, KEY k) +{ + if (!f.mask().is_running()) + { + TSheet_field& s = (TSheet_field&)f; + const int n = s.items()-1; + if (n >= 0) + s.select(n, TRUE); + } + return TRUE; +} + +bool TGestioneSoggetti::idoneita_handler(TMask_field& f, KEY k) +{ + if (!f.mask().is_running()) + { + TSheet_field& s = (TSheet_field&)f; + const int n = s.items()-1; + if (n >= 0) + s.select(n, TRUE); + } + return TRUE; +} + +bool TGestioneSoggetti::storico_handler(TMask_field& f, KEY k) +{ + if (!f.mask().is_running()) + { + TSheet_field& s = (TSheet_field&)f; + const int n = s.items()-1; + if (n >= 0) + s.select(n, TRUE); + } + return TRUE; +} + +bool TGestioneSoggetti::benem_handler(TMask_field& f, KEY k) +{ + if (!f.mask().is_running()) + { + TSheet_field& s = (TSheet_field&)f; + const int n = s.items()-1; + if (n >= 0) + s.select(n, TRUE); + } + return TRUE; +} + +bool TGestioneSoggetti::datadon_handler(TMask_field& f, KEY k) +{ + if (f.to_check(k)) + { + TMask& m = f.mask(); + + TSheet_field& s = *m.get_sheet(); + const TString16 datadon = f.get(); + for (int r=s.items()-1; r>=0; r--) + { + if (r != s.selected()) + { + TToken_string& row = s.row(r); + if (datadon == row.get(0)) + return f.error_box("Data donazione %s gia' inserita",(const char*)datadon); + } + } + } + return TRUE; +} + +bool TGestioneSoggetti::datacon_handler(TMask_field& f, KEY k) +{ + if (f.to_check(k)) + { + TMask& m = f.mask(); + + TSheet_field& s = *m.get_sheet(); + const TDate datacon = f.get(); + for (int r=s.items()-1; r>=0; r--) + { + if (r != s.selected()) + { + TToken_string& row = s.row(r); + TDate datarow = TDate(row.get(0)); + if (datacon == datarow) + return f.error_box("Data controllo %s gia' inserita",(const char*)datacon.string()); + else + if (datacon < datarow) + return f.yesno_box("ATTENZIONE! Esiste un controllo sanitario %s con data successiva. Vuoi continuare?", row.get(1)); + } + } + TMask& mask = s.mask(); + TDate datastato = mask.get_date(F_DATASTATO); + if (datacon < datastato) + return f.yesno_box("ATTENZIONE! Data controllo inferiore alla data stato.;Vuoi continuare?"); + datastato = mask.get_date(F_DATASI); + if (datacon < datastato) + return f.yesno_box("ATTENZIONE! Data controllo inferiore alla data stato SI.;Vuoi continuare?"); + datastato = mask.get_date(F_DATAAF); + if (datacon < datastato) + return f.yesno_box("ATTENZIONE! Data controllo inferiore alla data stato AF.;Vuoi continuare?"); + } + return TRUE; +} + +bool TGestioneSoggetti::donprecsi_handler(TMask_field& f, KEY k) +{ + static int oldprecsi; + if (k==K_TAB) + { + TMask& m = f.mask(); + const int donprecsi = m.get_int(F_DONPRECSI); + if (f.focusdirty()) + { + const int totdonsi = m.get_int(F_TOTDONSI); + m.set(F_TOTDONSI,totdonsi-oldprecsi+donprecsi); + int totdon = m.get_int(F_TOTDON)-oldprecsi+donprecsi; + //Le righe seguenti sono state aggiunte da Marco in data 05/08/99 per gestire il cambio di categoria in caso di donazioni non dettagliate + //m.set(F_TOTDON,totdon-oldprecsi+donprecsi); unica riga usata da Cristina + m.set(F_TOTDON,totdon); + TString16 catdon = m.get(F_CATDON); + if ((catdon == app()._catini1 || app()._catini1.empty()) && (totdon>=app()._numdon1) && app()._catfin1.not_empty()) + { + m.set(F_CATDON, app()._catfin1); + catdon = app()._catfin1; + } + if ((catdon == app()._catini2 || app()._catini2.empty()) && (totdon>=app()._numdon2) && app()._catfin2.not_empty() && !app()._sttess2) + { + m.set(F_CATDON, app()._catfin2); + catdon = app()._catfin2; + } + m.field(F_CATDON).on_key(K_TAB); + // fino a qui + } + oldprecsi = donprecsi; + } + return TRUE; +} + +bool TGestioneSoggetti::donprecaf_handler(TMask_field& f, KEY k) +{ + static int oldprecaf; + if (k==K_TAB) + { + TMask& m = f.mask(); + const int donprecaf = m.get_int(F_DONPRECAF); + if (f.focusdirty()) + { + const int totdonaf = m.get_int(F_TOTDONAF); + m.set(F_TOTDONAF,totdonaf-oldprecaf+donprecaf); + const int totdon = m.get_int(F_TOTDON); + m.set(F_TOTDON,totdon-oldprecaf+donprecaf); + } + oldprecaf = donprecaf; + } + return TRUE; +} + +bool TGestioneSoggetti::datanasc_handler(TMask_field& f, KEY k) +{ + if (f.to_check(k) || k == K_ENTER) + { + TMask& m = f.mask(); + if (f.empty()) + { + if (m.insert_mode()) + return f.error_box("La data di nascita e' obbligatoria"); + if (m.edit_mode()) + f.warning_box("La data di nascita e' vuota."); + } + else + { + if (m.insert_mode()) + { + TLocalisamfile sog(LF_SOGGETTI); + sog.setkey(2); + sog.zero(); + sog.put(SOG_COGNOME,m.get(F_COGNOME)); + sog.put(SOG_NOME,m.get(F_NOME)); + sog.put(SOG_DATANASC,m.get_date(F_DATANASC)); + if (sog.read() == NOERR && (m.get_long(F_CODICE) != sog.get_long(SOG_CODICE))) + return f.error_box("Soggetto con cognome, nome e data di nascita uguali già esistente"); + } + } + } + return TRUE; +} + +bool TGestioneSoggetti::catdon_handler(TMask_field& f, KEY k) +{ + if (f.to_check(k)) + { + TMask& m = f.mask(); + if (m.get(F_CATNOND1).not_empty() || m.get(F_CATNOND2).not_empty()) + if (cache().get("CTD",m.get(F_CATDON)).get_bool("B0")) + f.warning_box("ATTENZIONE: il soggetto ha almeno una categoria non donatori. Verificare!"); + } + return TRUE; +} + +bool TGestioneSoggetti::dataconv_handler(TMask_field& f, KEY k) +{ + if ((k == K_TAB) && (f.focusdirty()) && (!f.empty())) + { + const char modstato = modstato_tcs(f.mask().get(F_STATO)); + const char modstatosi = modstato_tcs(f.mask().get(F_STATOSI)); + if (modstato == 'S' || modstatosi == 'S') + { + f.error_box("ATTENZIONE!\nSoggetto sospeso.\nNon e' possibile inserire una convocazione."); + f.mask().set(F_DATACONV, app()._oldconv); + } + else + if (yesno_box("ATTENZIONE!\nNuova convocazione per il soggetto.\nConfermare la convocazione?")) + { + TLocalisamfile rconvoc(LF_RCONVOC); + rconvoc.setkey(3); + rconvoc.zero(); + rconvoc.put(RCV_CODICE, f.mask().get(F_CODICE)); + rconvoc.put(RCV_DATACONV, f.mask().get(F_DATACONV)); + if (rconvoc.read() == NOERR) + { + if (!(rconvoc.get_bool(RCV_ANNULLATO))) + { + f.error_box("Convocazione gia' esistente per il soggetto"); + f.mask().set(F_DATACONV, app()._oldconv); + } + else + { + app()._nuovaconv = TRUE; + f.mask().field(F_STAMPATACONV).enable(); + } + } + else + { + app()._nuovaconv = TRUE; + f.mask().field(F_STAMPATACONV).enable(); + } + } + else + f.mask().set(F_DATACONV, app()._oldconv); + } + return TRUE; +} + +bool TGestioneSoggetti::eseguigen_handler(TMask_field& f, KEY k) +{ + if (k == K_SPACE) + { + TMask& m = f.mask(); + const int quante = m.get_int(F_QUANTEGEN); + if (quante > 0) + { + const bool automatica = (m.get(F_COMEGEN) == "A"); + TDate finoal = m.get_date(F_FINOALGEN); + TSheet_field& g = (TSheet_field&)m.field(F_DONGEN); + g.destroy(); + const TString16 tipo = m.get(F_TIPOGEN); + const TString16 luogo = m.get(F_LUOGOGEN); + for (int r=0;rput(FAM_FAMIGLIA, fam.get_long(FAM_FAMIGLIA)); + TRecord_array a_famiglia(LF_FAMIGLIE, FAM_PROGFAM); + a_famiglia.read(key); + TSheet_field& s = (TSheet_field&)m.field(F_FAMIGLIARI); + s.destroy(); + for (int r=1; r<=a_famiglia.rows(); r++) + { + TToken_string& row = s.row(r-1); + const TRectype& riga = a_famiglia.row(r); + row.add(riga.get(FAM_GRADOPAR)); + row.add(riga.get(FAM_CODFAM)); + s.check_row(r-1); + } + const int ar = s.items(); + TToken_string& row = s.row(ar); + row.add(" "); + row.add(app()._codice); + s.check_row(ar); + s.force_update(); + m.show(F_FAMIGLIARI); + m.hide(-1); + } + } + return TRUE; +} + +bool TGestioneSoggetti::nuova_handler(TMask_field& f, KEY k) +{ + if (k == K_SPACE) + { + app()._famatt = -1; // significa che devo attribuire alla famiglia un nuovo codice + TMask& m = f.mask(); + TSheet_field& s = (TSheet_field&)m.field(F_FAMIGLIARI); + TToken_string& row = s.row(0); + row.add("CA"); + row.add(app()._codice); + s.check_row(0); + s.force_update(0); + m.show(F_FAMIGLIARI); + m.hide(-1); + } + return TRUE; +} + +bool TGestioneSoggetti::famiglia_handler(TMask_field& f, KEY k) +{ + if (k == K_SPACE) + { + TMask& m = f.mask(); + app()._codice = m.get_long(F_CODICE); + TMask msk("at0100c"); + msk.set_handler(F_ES_CODICE, collega_handler); + msk.set_handler(F_ES_COGNOME, collega_handler); + msk.set_handler(F_ES_NOME, nome_handler); + msk.set_handler(F_NUOVA,nuova_handler); + TSheet_field& s = (TSheet_field&)msk.field(F_FAMIGLIARI); + s.set_notify(famiglia_notify); + s.destroy(); + for (int r=1; r<=app()._sfamiglia->rows(); r++) + { + TToken_string& row = s.row(r-1); + const TRectype& riga = app()._sfamiglia->row(r); + row.add(riga.get(FAM_GRADOPAR)); + row.add(riga.get(FAM_CODFAM)); + s.check_row(r-1); + } + if (app()._sfamiglia->rows() == 0) + { + msk.show(-1); + msk.hide(F_FAMIGLIARI); + } + else + { + s.force_update(); + msk.hide(-1); + msk.show(F_FAMIGLIARI); + } + + if (msk.run() == K_ENTER) + { + app()._sfamiglia->destroy_rows(); + for (int r=s.items(); r>0; r--) + { + TToken_string& row = s.row(r-1); + TRectype& rec = app()._sfamiglia->row(r,TRUE); + rec.put(FAM_GRADOPAR, row.get(0)); + rec.put(FAM_CODFAM, row.get()); + } + } + } + return TRUE; +} + +bool TGestioneSoggetti::genera_handler(TMask_field& f, KEY k) +{ + if (k == K_SPACE) + { + TMask msk("at0100b"); + msk.set_handler(F_ESEGUIGEN,eseguigen_handler); + + if (msk.run() == K_ENTER) + { + TSheet_field& g = (TSheet_field&)msk.field(F_DONGEN); + if (g.items() > 0) + { + TMask& m = f.mask(); + TSheet_field& s = (TSheet_field&)m.field(F_DONAZIONI); + for (int r=0;rPUNTO"); head.add("Punto"); + fields.add(RCV_CHIAMATA); head.add("Tipo"); + fields.add(RCV_STAMPATO); head.add("St."); + fields.add(RCV_ANNULLATO); head.add("Ann."); + fields.add("115->DATA"); head.add("Data conv."); + fields.add(RCV_NUMERO); head.add("Conv.num."); + TCursor_sheet sconv(&cur,fields,"Convocazioni del soggetto",head); + sconv.run(); + } + } + return TRUE; +} + +void TGestioneSoggetti::tipocon_set_row(TMask& m) +{ + const TString16 tipo = m.get(F_C_TIPOCON); + const char modstato = modstato_tcs(tipo); + if ( modstato == 'I' || modstato == 'M') + { + m.field(F_C_IDON1).enable(); + m.field(F_C_IDON2).enable(); + m.field(F_C_IDON3).enable(); + m.field(F_C_IDON4).enable(); + m.field(F_C_INTSI).disable(); + m.field(F_C_INTAF).disable(); + TString16 idon1 = m.get(F_C_IDON1); + TString16 idon2 = m.get(F_C_IDON2); + TString16 idon3 = m.get(F_C_IDON3); + TString16 idon4 = m.get(F_C_IDON4); + // propongo i dati precedenti per idoneita' + if (idon1.empty() && idon2.empty() && idon3.empty() && idon4.empty()) + { + const TMask& mask = *(app().get_mask()); + m.set(F_C_IDON1,mask.get(F_IDON1)); + m.set(F_C_IDON2,mask.get(F_IDON2)); + m.set(F_C_IDON3,mask.get(F_IDON3)); + m.set(F_C_IDON4,mask.get(F_IDON4)); + m.set(F_C_INTSI,mask.get(F_INTSI)); + m.set(F_C_INTAF,mask.get(F_INTAF)); + idon1 = m.get(F_C_IDON1); + idon2 = m.get(F_C_IDON2); + idon3 = m.get(F_C_IDON3); + idon4 = m.get(F_C_IDON4); + } + if (is_idon(idon1,idon2,idon3,idon4,IDON_SI)) + m.field(F_C_INTSI).enable(); + else + m.field(F_C_INTSI).reset(); + if (is_idon(idon1,idon2,idon3,idon4,IDON_AF)) + m.field(F_C_INTAF).enable(); + else + m.field(F_C_INTAF).reset(); + } + else + { + m.field(F_C_IDON1).reset(); + m.field(F_C_IDON1).disable(); + m.field(F_C_IDON2).reset(); + m.field(F_C_IDON2).disable(); + m.field(F_C_IDON3).reset(); + m.field(F_C_IDON3).disable(); + m.field(F_C_IDON4).reset(); + m.field(F_C_IDON4).disable(); + m.field(F_C_INTSI).reset(); + m.field(F_C_INTSI).disable(); + m.field(F_C_INTAF).reset(); + m.field(F_C_INTAF).disable(); + } +} + +void TGestioneSoggetti::idosos_set_row(TMask& m) +{ + const TString16 idosos = m.get(F_I_IDO_SOS); + if (idosos == IDONEITA) + { + m.field(F_I_INTERVALLO).enable(); + const int intervallo = m.get_int(F_I_INTERVALLO); + if (intervallo==0) + { + const TMask& mask = *(app().get_mask()); + const TString idon = m.get(F_I_TIPOIDO); + if (idon == IDON_SI) + m.set(F_I_INTERVALLO,mask.get(F_INTSI)); + else + m.set(F_I_INTERVALLO,mask.get(F_INTAF)); + } + m.field(F_I_FINESOS).reset(); + m.field(F_I_FINESOS).disable(); + } + else + { + m.field(F_I_INTERVALLO).reset(); + m.field(F_I_INTERVALLO).disable(); + m.field(F_I_FINESOS).enable(); + } +} + +void TGestioneSoggetti::tipocon_set_sheet(TSheet_field& s) +{ + for (int r=0;rlfile().last(); + _lastcod = _rel->lfile().get_long(SOG_CODICE); +} + +bool TGestioneSoggetti::user_create() +{ + _msk = new TMask("at0100a"); + _rel = new TRelation(LF_SOGGETTI); + + _donaz = new TLocalisamfile(LF_DONAZ); + _contsan = new TLocalisamfile(LF_CONTSAN); + _benem = new TLocalisamfile(LF_BENEM); + _storico = new TLocalisamfile(LF_STORICO); + _famiglie = new TLocalisamfile(LF_FAMIGLIE); + _convoc = new TLocalisamfile(LF_CONVOC); + _rconvoc = new TLocalisamfile(LF_RCONVOC); + _idoneita = new TLocalisamfile(LF_IDONEITA); + + _sdonazioni = new TRecord_array(LF_DONAZ,DON_PROGDON); + _scontrolli = new TRecord_array(LF_CONTSAN,CON_PROGCON); + _sbenemerenze = new TRecord_array(LF_BENEM,BEN_PROGBEN); + _sstorico = new TRecord_array(LF_STORICO,STO_PROGSTO); + _sfamiglia = new TRecord_array(LF_FAMIGLIE, FAM_PROGFAM); + _sidoneita = new TRecord_array(LF_IDONEITA, IDO_PROGIDO); + + _msk->set_handler(F_RICPARZ,ricparz_handler); + _msk->set_handler(F_CONVOCAZIONI,convoc_handler); + _msk->set_handler(F_DATANASC,datanasc_handler); + _msk->set_handler(F_CATDON,catdon_handler); + _msk->set_handler(F_DATACONV,dataconv_handler); + _msk->set_handler(F_GENERA,genera_handler); + _msk->set_handler(F_FAMIGLIA,famiglia_handler); + _msk->set_handler(F_DONPRECSI,donprecsi_handler); + _msk->set_handler(F_DONPRECAF,donprecaf_handler); + _msk->set_handler(F_GRUPPOAB0,gruppo_handler); + _msk->set_handler(F_RHANTID,rhantid_handler); + _msk->set_handler(F_KELL,kell_handler); + _msk->set_handler(F_FENOTIPORH,fenotiporh_handler); + _msk->set_handler(F_DU,du_handler); + TSheet_field& sd = (TSheet_field&)_msk->field(F_DONAZIONI); + sd.set_handler(donazioni_handler); + sd.set_notify(donazioni_notify); + TMask& sdmask = sd.sheet_mask(); + sdmask.set_handler(F_D_DATADON, datadon_handler); + + TSheet_field& sc = (TSheet_field&)_msk->field(F_CONTROLLI); + sc.set_handler(controlli_handler); + sc.set_notify(controlli_notify); + TMask& scmask = sc.sheet_mask(); + scmask.set_handler(F_C_DATACON, datacon_handler); + scmask.set_handler(F_C_TIPOCON, tipocon_handler); + scmask.set_handler(F_C_IDON1, idoncon_handler); + scmask.set_handler(F_C_IDON2, idoncon_handler); + scmask.set_handler(F_C_IDON3, idoncon_handler); + scmask.set_handler(F_C_IDON4, idoncon_handler); + + TSheet_field& si = (TSheet_field&)_msk->field(F_IDONEITA); + si.set_handler(idoneita_handler); + si.set_notify(idoneita_notify); + TMask& simask = si.sheet_mask(); + simask.set_handler(F_I_IDO_SOS, idosos_handler); + + TSheet_field& sb = (TSheet_field&)_msk->field(F_BENEMERENZE); + sb.set_handler(benem_handler); + sb.set_notify(benemerenze_notify); + TSheet_field& ss = (TSheet_field&)_msk->field(F_STORICO); + ss.set_handler(storico_handler); + ss.set_notify(storico_notify); + + _rel->lfile().last(); + _lastcod = _rel->lfile().get_long(SOG_CODICE); + + _famiglie->last(); + _lastfam = _famiglie->get_long(FAM_FAMIGLIA); + _famatt = _famprec = 0; + + set_search_field(F_COGNOME); + + 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"); + _ctrlpass = config.get_bool("CtrlPass"); + if (_ctrlpass) + _permesso = richiesta_password(); + return TRUE; +} + +bool TGestioneSoggetti::user_destroy() +{ + delete _sidoneita; + delete _sfamiglia; + delete _sstorico; + delete _sbenemerenze; + delete _scontrolli; + delete _sdonazioni; + delete _idoneita; + delete _rconvoc; + delete _convoc; + delete _famiglie; + delete _storico; + delete _benem; + delete _contsan; + delete _donaz; + delete _rel; + delete _msk; + return TRUE; +} + +const char* TGestioneSoggetti::get_next_key() +{ + // per gestione famiglie + _famatt = _famprec = 0; + // autonumerazione progressiva dei soggetti + return format("%d|%ld", F_CODICE, _lastcod+1 ); +} + +bool TGestioneSoggetti::remove() +{ + // cancella donazioni + // cancella controlli sanitari + // cancella storico + // sistema nucleo familiare ** da fare + // annulla convocazioni del soggetto + // alla fine: cancella il soggetto! + + bool ok = TRUE; + int err; + ok = yesno_box("ATTENZIONE!\nCon questa operazione si elimina definitivamente tutta la scheda del soggetto.\nConfermare l'eliminazione?"); + + if (ok) + { + // cancella donazioni + err = _sdonazioni->remove(); + if (err == _iseof || err == _isemptyfile) + err = NOERR; + + // cancella controlli sanitari + if (err = NOERR) err = _scontrolli->remove(); + if (err == _iseof || err == _isemptyfile) + err = NOERR; + + // cancella benemerenze + if (err = NOERR) err = _sbenemerenze->remove(); + if (err == _iseof || err == _isemptyfile) + err = NOERR; + + // cancella storico + if (err == NOERR) err = _sstorico->remove(); + if (err == _iseof || err == _isemptyfile) + err = NOERR; + + // cancellare le convocazioni del soggetto + + // cancella il soggetto + if (err == NOERR) ok = TRelation_application::remove(); + return (ok && err==NOERR); + } + else + return TRUE; +} + +int TGestioneSoggetti::read(TMask& m) +{ + _famatt = _famprec = 0; + _nuovaconv = FALSE; + _oldconv = NULLDATE; + int err = TRelation_application::read(m); + if (err == NOERR) + { + _oldconv = m.get_date(F_DATACONV); + m.field(F_STAMPATACONV).reset(); + m.field(F_STAMPATACONV).disable(); + TRectype* key = new TRectype(LF_DONAZ); + key->put(DON_CODICE, m.get(F_CODICE)); + err = _sdonazioni->read(key); + if (err == NOERR) + { + TSheet_field& s = (TSheet_field&)m.field(F_DONAZIONI); + s.destroy(); + for (int r=1; r<=_sdonazioni->rows(); r++) + { + TToken_string& row = s.row(r-1); + const TRectype& riga = _sdonazioni->row(r); + row.add(riga.get(DON_DATADON)); // 0 + row.add(riga.get(DON_TIPODON)); // 1 + row.add(riga.get(DON_LUOGODON)); // 2 + row.add(""); // descrizione luogo // 3 + row.add(riga.get(DON_ETICHETTA)); // 4 + row.add(riga.get(DON_PRIMADON)); // 5 + row.add(riga.get(DON_CODSEZ)); // 6 + row.add(riga.get(DON_CODSOT)); // 7 + row.add(""); // denominazione sezione // 8 + row.add(""); // denominazione sottogruppo// 9 + row.add(riga.get(DON_CC)); // 10 + row.add(riga.get(DON_PA)); // 11 + row.add(riga.get(DON_HB)); // 12 + row.add(riga.get(DON_SGPT)); // 13 + row.add(riga.get(DON_PROTIDEMIA)); // 14 + s.check_row(r-1); + } + } + else + if (err == _iseof || err == _isemptyfile) + err = NOERR; + } + if (err == NOERR) + { + TRectype* key = new TRectype(LF_CONTSAN); + key->put(CON_CODICE, m.get(F_CODICE)); + err = _scontrolli->read(key); + if (err == NOERR) + { + TSheet_field& s = (TSheet_field&)m.field(F_CONTROLLI); + s.destroy(); + for (int r=1; r<=_scontrolli->rows(); r++) + { + TToken_string& row = s.row(r-1); + const TRectype& riga = _scontrolli->row(r); + row.add(riga.get(CON_DATACON)); + row.add(riga.get(CON_TIPOCON)); + row.add(riga.get(CON_IDON1)); + row.add(riga.get(CON_IDON2)); + row.add(riga.get(CON_IDON3)); + row.add(riga.get(CON_IDON4)); + row.add(riga.get(CON_INTSI)); + row.add(riga.get(CON_INTAF)); + row.add(riga.get(CON_PROSSTIPO)); + row.add(riga.get(CON_PROSSDATA)); + row.add(riga.get(CON_MOTIVO)); + row.add(riga.get(CON_RESPONSAB)); + } + TGestioneSoggetti::tipocon_set_sheet(s); + } + else + if (err == _iseof || err == _isemptyfile) + err = NOERR; + } + if (err == NOERR) + { + TRectype* key = new TRectype(LF_IDONEITA); + key->put(IDO_CODICE, m.get(F_CODICE)); + err = _sidoneita->read(key); + if (err == NOERR) + { + TSheet_field& s = (TSheet_field&)m.field(F_IDONEITA); + s.destroy(); + for (int r=1; r<=_sidoneita->rows(); r++) + { + TToken_string& row = s.row(r-1); + const TRectype& riga = _sidoneita->row(r); + row.add(riga.get(IDO_DATAIDO)); + row.add(riga.get(IDO_TIPOIDO)); + row.add(riga.get(IDO_IDO_SOS)); + row.add(riga.get(IDO_INTERVALLO)); + row.add(riga.get(IDO_FINESOS)); + row.add(riga.get(IDO_MOTIVO)); + row.add(riga.get(IDO_RESPONSAB)); + } + TGestioneSoggetti::idosos_set_sheet(s); + } + else + if (err == _iseof || err == _isemptyfile) + err = NOERR; + } + + if (err == NOERR) + { + TRectype* key = new TRectype(LF_BENEM); + key->put(BEN_CODICE, m.get(F_CODICE)); + err = _sbenemerenze->read(key); + if (err == NOERR) + { + TSheet_field& s = (TSheet_field&)m.field(F_BENEMERENZE); + s.destroy(); + for (int r=1; r<=_sbenemerenze->rows(); r++) + { + TToken_string& row = s.row(r-1); + const TRectype& riga = _sbenemerenze->row(r); + row.add(riga.get(BEN_TIPOBEN)); + row.add(""); // descrizione benemerenze + row.add(riga.get(BEN_DATAMAT)); + row.add(riga.get(BEN_BONUS)); + row.add(riga.get(BEN_DATABEN)); + row.add(riga.get(BEN_DATACON)); + row.add(riga.get(BEN_RITIRATA)); + row.add(riga.get(BEN_CODSEZ)); + row.add(riga.get(BEN_CODSOT)); + row.add(riga.get(BEN_GRUPPOAZIE)); + row.add(""); // denominazione sezione + row.add(""); // denominazione sottogruppo + row.add(""); // denominazione gruppo aziendale + s.check_row(r-1); + } + } + else + if (err == _iseof || err == _isemptyfile) + err = NOERR; + } + if (err == NOERR) + { + TRectype* key = new TRectype(LF_STORICO); + key->put(STO_CODICE, m.get(F_CODICE)); + err = _sstorico->read(key); + if (err == NOERR) + { + TSheet_field& s = (TSheet_field&)m.field(F_STORICO); + s.destroy(); + for (int r=1; r<=_sstorico->rows(); r++) + { + TToken_string& row = s.row(r-1); + const TRectype& riga = _sstorico->row(r); + row.add(riga.get(STO_DATAISC)); + row.add(riga.get(STO_DATADIM)); + row.add(riga.get(STO_CODSEZ)); + row.add(riga.get(STO_CODSOT)); + row.add(riga.get(STO_CATISC)); + row.add(riga.get(STO_MOTDIM)); + } + } + else + if (err == _iseof || err == _isemptyfile) + err = NOERR; + } + if (err == NOERR) + { + TLocalisamfile fam(LF_FAMIGLIE); + fam.setkey(2); + TRectype& recfam = fam.curr(); + recfam.zero(); + recfam.put(FAM_CODFAM, m.get(F_CODICE)); + if (fam.read() == NOERR) + { + TRectype* key = new TRectype(LF_FAMIGLIE); + _famprec = _famatt = fam.get_long(FAM_FAMIGLIA); + key->put(FAM_FAMIGLIA, _famprec); + _sfamiglia->read(key); + } + else + { + _famprec = _famatt = 0; + _sfamiglia->destroy_rows(); + } + } + return err; +} + +int TGestioneSoggetti::write(const TMask& m) +{ + long curcod = m.get_long(F_CODICE); + if (curcod > _lastcod) _lastcod = curcod; + return TGestioneSoggetti::scrivi(m, FALSE); +} + +int TGestioneSoggetti::rewrite(const TMask& m) +{ + return TGestioneSoggetti::scrivi(m, TRUE); +} + +int TGestioneSoggetti::scrivi(const TMask& m, bool ri) +{ + // questo trucco è autorizzato dal capo! + bool ok = TRUE; + int err = NOERR; + TMask& hmask = (TMask&) m; + if (ok) + { + TDate oggi(TODAY); + hmask.set(F_DATAULTAGG,oggi); + hmask.set(F_UTENULTAGG,user()); + const TDate dataprossi = hmask.get_date(F_DATAPROSSI); + const TDate dataconv = hmask.get_date(F_DATACONV); + const char stato = modstato_tcs(hmask.get(F_STATO)); + const TString16 statosi = hmask.get(F_STATOSI); + // cancellazione la data convocazione se sospeso + // o se è venuto a donare (la dataprossi diventa > della dataconvoc. + if ((stato == 'S') || (statosi == SOSPENSIONE) || (dataprossi > dataconv) || !dataprossi.ok()) + { + TLocalisamfile rconvoc(LF_RCONVOC); + rconvoc.setkey(3); + rconvoc.zero(); + rconvoc.put(RCV_CODICE, hmask.get(F_CODICE)); + rconvoc.put(RCV_DATACONV, dataconv); + if (rconvoc.read() == NOERR) + { + rconvoc.put(RCV_ANNULLATO, TRUE); + int err = rconvoc.rewrite(); + } + const TDate datanulla(NULLDATE); + hmask.set(F_DATACONV, datanulla); + hmask.set(F_DATAULTSOL, datanulla); + const int numzero = 0; + hmask.set(F_NUMCONV,numzero); + } + + TDate dataisc = hmask.get_date(F_DATAISC); + if (!dataisc.ok() && _dataisc) + { + // attenzione: questa operazione viene eseguita due volte + // togliere! + if (hmask.get_date(F_DATAPRISI).ok()) + hmask.set(F_DATAISC,hmask.get(F_DATAPRISI)); + else + { + TSheet_field& s = (TSheet_field&)m.field(F_DONAZIONI); + if (s.items()>0) + { + ordina_sheet_data(s); + TToken_string& row = s.row(0); + hmask.set(F_DATAISC,row.get(0)); + } + } + } + err = ri ? TRelation_application::rewrite(m) : TRelation_application::write(m); + if (err == NOERR) + { + _sdonazioni->destroy_rows(); + TSheet_field& s = (TSheet_field&)m.field(F_DONAZIONI); + TRectype* key = new TRectype(LF_DONAZ); + key->put(DON_CODICE, m.get(F_CODICE)); + _sdonazioni->set_key(key); + + ordina_sheet_data(s); + + for (int r=s.items(); r>0; r--) + { + TToken_string& row = s.row(r-1); + TRectype& rec = _sdonazioni->row(r,TRUE); + rec.put(DON_DATADON, row.get(0)); + rec.put(DON_TIPODON, row.get()); // 1 + rec.put(DON_LUOGODON, row.get()); // 2 + // descrizione luogo // 3 + rec.put(DON_ETICHETTA, row.get(4)); + rec.put(DON_PRIMADON, row.get()); // 5 + TString16 codsez = row.get(6); + TString16 codsot = row.get(7); + if (codsez.blank()) + { + codsez = hmask.get(F_CODSEZ); + codsot = hmask.get(F_CODSOT); + } + rec.put(DON_CODSEZ, codsez); // 6 + rec.put(DON_CODSOT, codsot); // 7 + // denominazione sezione // 8 + // denominazione sottogruppo // 9 + rec.put(DON_CC, row.get(10)); + rec.put(DON_PA, row.get()); // 11 + rec.put(DON_HB, row.get()); // 12 + rec.put(DON_SGPT, row.get()); // 13 + rec.put(DON_PROTIDEMIA, row.get()); // 14 + } + err = ri ? _sdonazioni->rewrite() : _sdonazioni->write(); + } + if (err == NOERR) + { + _scontrolli->destroy_rows(); + TSheet_field& s = (TSheet_field&)m.field(F_CONTROLLI); + TRectype* key = new TRectype(LF_CONTSAN); + key->put(CON_CODICE, m.get(F_CODICE)); + _scontrolli->set_key(key); + for (int r=s.items(); r>0; r--) + { + TToken_string& row = s.row(r-1); + if (row.empty_items()) + s.destroy(r-1); + } + ordina_sheet_data(s); + for (r=s.items(); r>0; r--) + { + TToken_string& row = s.row(r-1); + TRectype& rec = _scontrolli->row(r,TRUE); + rec.put(CON_DATACON, row.get(0)); + rec.put(CON_TIPOCON, row.get()); + rec.put(CON_IDON1, row.get()); + rec.put(CON_IDON2, row.get()); + rec.put(CON_IDON3, row.get()); + rec.put(CON_IDON4, row.get()); + rec.put(CON_INTSI, row.get()); + rec.put(CON_INTAF, row.get()); + rec.put(CON_PROSSTIPO, row.get()); + rec.put(CON_PROSSDATA, row.get()); + rec.put(CON_MOTIVO, row.get()); + rec.put(CON_RESPONSAB, row.get()); + } + err = ri ? _scontrolli->rewrite() : _scontrolli->write(); + } + if (err == NOERR) + { + _sidoneita->destroy_rows(); + TSheet_field& s = (TSheet_field&)m.field(F_IDONEITA); + TRectype* key = new TRectype(LF_IDONEITA); + key->put(IDO_CODICE, m.get(F_CODICE)); + _sidoneita->set_key(key); + for (int r=s.items(); r>0; r--) + { + TToken_string& row = s.row(r-1); + if (row.empty_items()) + s.destroy(r-1); + } + ordina_sheet_data(s); + for (r=s.items(); r>0; r--) + { + TToken_string& row = s.row(r-1); + TRectype& rec = _sidoneita->row(r,TRUE); + rec.put(IDO_DATAIDO, row.get(0)); + rec.put(IDO_TIPOIDO, row.get()); + rec.put(IDO_IDO_SOS, row.get()); + rec.put(IDO_INTERVALLO,row.get()); + rec.put(IDO_FINESOS, row.get()); + rec.put(IDO_MOTIVO, row.get()); + rec.put(IDO_RESPONSAB, row.get()); + } + err = ri ? _sidoneita->rewrite() : _sidoneita->write(); + } + if (err == NOERR) + { + _sbenemerenze->destroy_rows(); + TSheet_field& s = (TSheet_field&)m.field(F_BENEMERENZE); + for (int r=s.items(); r>0; r--) + { + TToken_string& row = s.row(r-1); + if (row.empty()) + s.destroy(r-1); + } + s.force_update(); + TRectype* key = new TRectype(LF_BENEM); + key->put(BEN_CODICE, m.get(F_CODICE)); + _sbenemerenze->set_key(key); + + ordina_sheet_data(s); + + for (r=s.items(); r>0; r--) + { + TToken_string& row = s.row(r-1); + TRectype& rec = _sbenemerenze->row(r,TRUE); + rec.put(BEN_TIPOBEN, row.get(0)); + rec.put(BEN_DATAMAT, row.get(2)); + rec.put(BEN_BONUS, row.get()); + rec.put(BEN_DATABEN, row.get()); + rec.put(BEN_DATACON, row.get()); + rec.put(BEN_RITIRATA, row.get()); + rec.put(BEN_CODSEZ, row.get()); + rec.put(BEN_CODSOT, row.get()); + rec.put(BEN_GRUPPOAZIE, row.get()); + } + err = ri ? _sbenemerenze->rewrite() : _sbenemerenze->write(); + } + if (err == NOERR) + { + _sstorico->destroy_rows(); + TSheet_field& s = (TSheet_field&)m.field(F_STORICO); + TRectype* key = new TRectype(LF_STORICO); + key->put(STO_CODICE, m.get(F_CODICE)); + _sstorico->set_key(key); + + // ordinamento dello sheet storico + ordina_sheet_data(s); + + for (int r=s.items(); r>0; r--) + { + TToken_string& row = s.row(r-1); + TRectype& rec = _sstorico->row(r,TRUE); + rec.put(STO_DATAISC, row.get(0)); + rec.put(STO_DATADIM, row.get()); + rec.put(STO_CODSEZ, row.get()); + rec.put(STO_CODSOT, row.get()); + rec.put(STO_CATISC, row.get()); + rec.put(STO_MOTDIM, row.get()); + } + err = ri ? _sstorico->rewrite() : _sstorico->write(); + } + if (err == NOERR) + { + if (_famatt == -1) + { + TRectype* key = new TRectype(LF_FAMIGLIE); + key->put(FAM_FAMIGLIA, _lastfam+1); + _sfamiglia->set_key(key); + _lastfam = _lastfam+1; + } + if (_famatt != _famprec) + err = ri ? _sfamiglia->rewrite() : _sfamiglia->write(); + } + if ((err == NOERR) && (_nuovaconv)) + { + TDate datac = m.get_date(F_DATACONV); + if (datac.ok()) + { + TLocalisamfile rconvoc(LF_RCONVOC); + + int progconv = 0; + TLocalisamfile convoc(LF_CONVOC); + convoc.setkey(2); + convoc.zero(); + convoc.put(COV_DATA, m.get(F_DATACONV)); + convoc.put(COV_PUNTO, m.get(F_PUNTOCONV)); + convoc.put(COV_TIPO, "SI"); + convoc.put(COV_CODSEZ, m.get(F_CODSEZ)); + convoc.put(COV_CODSOT, m.get(F_CODSOT)); + if (convoc.read() == NOERR) + { + rconvoc.setkey(1); + rconvoc.zero(); + rconvoc.put(COV_NUMERO, convoc.get(RCV_NUMERO)); + TRectype r(rconvoc.curr()); + int items = 0; + for(rconvoc.read(); !rconvoc.eof(); rconvoc.next()) + { + if (rconvoc.curr() != r) break; + progconv = rconvoc.get_int(RCV_PROGCONV); + } + progconv++; + } + else + { + progconv++; + convoc.setkey(1); + convoc.last(); + const long numero = convoc.get_long(COV_NUMERO)+1; + convoc.zero(); + convoc.put(COV_DATA, m.get(F_DATACONV)); + convoc.put(COV_PUNTO, m.get(F_PUNTOCONV)); + convoc.put(COV_TIPO, "SI"); + convoc.put(COV_CODSEZ, m.get(F_CODSEZ)); + convoc.put(COV_CODSOT, m.get(F_CODSOT)); + convoc.put(COV_NUMERO, numero); + convoc.put(COV_NOTE, "Convocazione automatica"); + convoc.write(); + } + rconvoc.setkey(3); + rconvoc.zero(); + rconvoc.put(RCV_CODICE, m.get(F_CODICE)); + rconvoc.put(RCV_DATACONV, m.get(F_DATACONV)); + if ((rconvoc.read() != NOERR) || (rconvoc.get_bool(RCV_ANNULLATO))) + { + rconvoc.zero(); + rconvoc.put(RCV_CODICE, m.get(F_CODICE)); + rconvoc.put(RCV_DATACONV, m.get(F_DATACONV)); + rconvoc.put(RCV_NUMERO, convoc.get_long(COV_NUMERO)); + rconvoc.put(RCV_PROGCONV, progconv); + rconvoc.put(RCV_CHIAMATA, 'C'); + rconvoc.put(RCV_STAMPATO, m.get(F_STAMPATACONV)); + err = rconvoc.write(); + } + } + } + } + return err; +} + +void TGestioneSoggetti::c_reord(TSheet_field& s, TSheet_field& si) +{ + const TDate datanulla(NULLDATE); + TDate data(NULLDATE); + TDate prossdata(NULLDATE); + TString16 tipo = " "; + TString16 prosstipo = " "; + char modstato = ' '; + 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=s.items()-1; r>=0; r--) + { + TToken_string& row = s.row(r); + tipo = row.get(1); + modstato = modstato_tcs(tipo); + if ((modstato != 'N') && (r_ultstato == -1)) + r_ultstato = r; + else if ((modstato != 'N') && (penultstato == ' ')) + penultstato = modstato; + if ((modstato == 'I') && (r_ultid == -1)) + r_ultid = r; + } + TString16 id1 = ' '; + TString16 id2 = ' '; + TString16 id3 = ' '; + TString16 id4 = ' '; + int intsi = 0; + int intaf = 0; + tipo = ' '; + prosstipo = ' '; + data = TDate(NULLDATE); + prossdata = TDate(NULLDATE); + + if (r_ultid != -1) + { + TToken_string& row = s.row(r_ultid); + data = TDate(row.get(0)); + tipo = row.get(); + id1 = row.get(); + id2 = row.get(); + id3 = row.get(); + id4 = row.get(); + intsi = row.get_int(); + intaf = row.get_int(); + } + TMask& mask = s.mask(); + mask.field(F_DATAULTID).set(data); + mask.field(F_DATAULTID).on_key(K_TAB); + mask.field(F_TIPOULTID).set(tipo); + mask.field(F_TIPOULTID).on_key(K_TAB); + mask.field(F_IDON1).set(id1); + mask.field(F_IDON1).on_key(K_TAB); + mask.field(F_IDON2).set(id2); + mask.field(F_IDON2).on_key(K_TAB); + mask.field(F_IDON3).set(id3); + mask.field(F_IDON3).on_key(K_TAB); + mask.field(F_IDON4).set(id4); + mask.field(F_IDON4).on_key(K_TAB); + mask.set(F_INTSI,intsi); + mask.field(F_INTSI).on_key(K_TAB); + mask.set(F_INTAF,intaf); + mask.field(F_INTAF).on_key(K_TAB); + + tipo = ' '; + if (r_ultstato != -1) + { + TToken_string& row = s.row(r_ultstato); + dataultstato = TDate(row.get(0)); + tipo = row.get(); + prosstipo = row.get(8); + prossdata = TDate(row.get()); + ultstato = modstato_tcs(tipo); + } + mask.set(F_STATO,tipo); + mask.field(F_STATO).on_key(K_TAB); + mask.set(F_DATASTATO,dataultstato); + mask.set(F_PROS_STATO,prosstipo); + mask.field(F_PROS_STATO).on_key(K_TAB); + mask.set(F_DATA_PROS,prossdata); + + if (intsi>0) + { + mask.set(F_STATOSI,tipo); + mask.set(F_DATASI,dataultstato); + //if (prosstipo == "FS") + if (modstato_tcs(prosstipo)=='F') + mask.set(F_FINESOSSI,prossdata); + else + mask.set(F_FINESOSSI,datanulla); + } + else + { + mask.set(F_STATOSI," "); + mask.set(F_DATASI,datanulla); + mask.set(F_FINESOSSI,datanulla); + } + if (intaf>0) + { + mask.set(F_STATOAF,tipo); + mask.set(F_DATAAF,dataultstato); + //if (prosstipo == "FS") + if (modstato_tcs(prosstipo)=='F') + mask.set(F_FINESOSAF,prossdata); + else + mask.set(F_FINESOSAF,datanulla); + } + else + { + mask.set(F_STATOAF," "); + mask.set(F_DATAAF,datanulla); + mask.set(F_FINESOSAF,datanulla); + } + + /* + mask.set(F_STATOSI," "); + mask.set(F_STATOAF," "); + mask.set(F_DATASI,datanulla); + mask.set(F_DATAAF,datanulla); + mask.set(F_FINESOSSI,datanulla); + mask.set(F_FINESOSAF,datanulla); + */ + // riordino le idoneita + for (int ri=0; ri= dataultstato) + { + if (tipoido == IDON_SI) + { + mask.field(F_DATASI).set(dataido); + mask.field(F_STATOSI).set(ido_sos); + mask.field(F_FINESOSSI).set(finesos); + if (intervallo != 0 && ido_sos == IDONEITA) + { + mask.set(F_INTSI,intervallo); + if (id1 != IDON_SI && id2 != IDON_SI && id3 != IDON_SI && id4 != IDON_SI) + if (id1.empty()) + mask.field(F_IDON1).set(IDON_SI); + else + if (id2.empty()) + mask.field(F_IDON2).set(IDON_SI); + else + if (id3.empty()) + mask.field(F_IDON3).set(IDON_SI); + else + if (id4.empty()) + mask.field(F_IDON4).set(IDON_SI); + } + } + if (tipoido == IDON_AF) + { + mask.field(F_DATAAF).set(dataido); + mask.field(F_STATOAF).set(ido_sos); + mask.field(F_FINESOSAF).set(finesos); + if (intervallo != 0 && ido_sos == IDONEITA) + { + mask.set(F_INTAF,intervallo); + if (id1 != IDON_PL && id2 != IDON_PL && id3 != IDON_PL && id4 != IDON_PL) + if (id1.empty()) + mask.field(F_IDON1).set(IDON_PL); + else + if (id2.empty()) + mask.field(F_IDON2).set(IDON_PL); + else + if (id3.empty()) + mask.field(F_IDON3).set(IDON_PL); + else + if (id4.empty()) + mask.field(F_IDON4).set(IDON_PL); + } + } + } + } + const TString16 catcoll = cache().get("TCS",tipo).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 = mask.get(F_STATOSI); + TString16 statoaf = mask.get(F_STATOAF); + TDate datastatosi = mask.get_date(F_DATASI); + TDate datastatoaf = mask.get_date(F_DATAAF); + if (statosi.not_empty() || statoaf.not_empty()) + { + TString16 stato = mask.get(F_STATO); + char modstato = modstato_tcs(stato); + // prima c'era un && + if ((statosi == IDONEITA) || (statoaf == IDONEITA)) + if ((modstato != 'I') && (modstato != 'F')) //corretto || con && da Marco in data 07/09/99 + stato = IDONEITA; + //if ((statosi == SOSPENSIONE || statosi.empty()) && (statoaf == SOSPENSIONE || statoaf.empty())) + if ((statosi == SOSPENSIONE) && (statoaf == SOSPENSIONE)) + if (modstato != 'S') + stato = SOSPENSIONE; + char statocalcolato = modstato_tcs(stato); + if (modstato != statocalcolato) + { + mask.set(F_STATO, stato); + mask.field(F_STATO).on_key(K_TAB); + mask.set(F_PROS_STATO," "); + mask.field(F_PROS_STATO).on_key(K_TAB); + mask.set(F_DATA_PROS,datanulla); + mask.field(F_DATA_PROS).on_key(K_TAB); + if (statocalcolato == 'I') + { + TDate datacalcolata = NULLDATE; + if (statosi == IDONEITA) + datacalcolata = datastatosi; + if ((statoaf == IDONEITA) && (datastatoaf > datacalcolata)) + datacalcolata = datastatoaf; + mask.set(F_DATASTATO,datacalcolata); + } + else + if (datastatoaf > datastatosi) + mask.set(F_DATASTATO,datastatoaf); + else + mask.set(F_DATASTATO,datastatosi); + } + } + d_datepross(s); + + if (((penultstato == 'S') || (penultstato == 'I')) && ((ultstato == 'I') || (ultstato == 'F'))) + { + data = mask.get_date(F_DATAPROSSI); + if (data < dataultstato && data.ok()) mask.set(F_DATAPROSSI,dataultstato); + data = mask.get_date(F_DATAPROSAF); + if (data < dataultstato && data.ok()) mask.set(F_DATAPROSAF,dataultstato); + } + // verifico la categoria e lo stato + TString16 catdon = mask.get(F_CATDON); + const bool dimissione = cache().get("CTD", catdon).get_bool("B0"); + const char statocalcolato = modstato_tcs(mask.get(F_STATO)); + // tolto l'if da Cristina il 18/06/99 - da qui + // rimesso da Marco il 06/07/99 modificando dimissione in !dimissione e suddividendolo in due if + if ((statocalcolato == 'I') || (statocalcolato == 'F')) + { + int totdon = mask.get_int(F_TOTDON); + if (!dimissione) + { + //Operazione sostituita da Marco il 26/07/99 al posto di quella commentata sotto + if ((catdon == app()._catini1 || app()._catini1.empty()) && (totdon>=app()._numdon1) && app()._catfin1.not_empty()) + { + mask.set(F_CATDON, app()._catfin1); + catdon = app()._catfin1; + } + const bool tstampata = mask.get_bool(F_T_STAMPATA); + if ((catdon == app()._catini2 || app()._catini2.empty()) && (totdon>=app()._numdon2) && app()._catfin2.not_empty() && ((!app()._sttess2)|| (tstampata))) + { + mask.set(F_CATDON, app()._catfin2); + catdon = app()._catfin2; + } + // Corretto da Marco il 26/07/99 sostituendolo con quello sopra + // Reinserito come else da Marco il 07/09/99 per gestire il cambio in caso di inserimento idoneità parziali invece di controllo + } + else + { + if ((totdon>=app()._numdon1) && (app()._catfin1.not_empty())) + { + mask.set(F_CATDON, app()._catfin1); + catdon = app()._catfin1; + } + const bool tstampata = mask.get_bool(F_T_STAMPATA); + if ((totdon>=app()._numdon2) && (app()._catfin2.not_empty()) && ((!app()._sttess2) || (tstampata))) + { + mask.set(F_CATDON, app()._catfin2); + catdon = app()._catfin2; + } + } + mask.field(F_CATDON).on_key(K_TAB); + TDate datanulla(NULLDATE); + mask.set(F_DATADIM,datanulla); + //fino a qui + } +} + +bool TGestioneSoggetti::famiglia_notify(TSheet_field& s, int r, KEY k) +{ + static long oldcodice; + switch (k) + { + case K_ENTER: // uscita da riga modificata + { + TToken_string& row = s.row(r); + const long codice = row.get_long(1); + if (codice != 0) + { + TLocalisamfile fam(LF_FAMIGLIE); + fam.setkey(2); + TRectype& recfam = fam.curr(); + recfam.zero(); + recfam.put(FAM_CODFAM, codice); + if (fam.read() == NOERR) + if (fam.get_long(FAM_FAMIGLIA) != app()._famatt) + return s.error_box("Soggetto gia' inserito in altra famiglia"); + app()._famprec = 0; + } + } + break; + case K_CTRL+K_DEL: // avvenuta cancellazione riga + { + if (s.items() == 1 || oldcodice == app()._codice) + { + s.destroy(); + app()._famatt = 0; + TMask& m = s.mask(); + m.show(-1); + m.hide(F_FAMIGLIARI); + } + else + app()._famprec = 0; + } + break; + case K_DEL: // richiesta di cancellazione riga + { + if (s.items() == 2) + return s.yesno_box("Attenzione: dopo la cancellazione la famiglia verra' eliminata"); + TToken_string& row = s.row(r); + const long codice = row.get_long(1); + oldcodice = codice; + if (app()._codice == codice) + return s.yesno_box("Attenzione: si sta eliminando il soggetto dalla famiglia"); + } + break; + } + return TRUE; +} + +bool TGestioneSoggetti::donazioni_notify(TSheet_field& s, int r, KEY k) +{ + static TToken_string oldrow; + bool modified = FALSE; + TMask& mask = s.mask(); + if (k == K_CTRL+K_DEL) // avvenuta cancellazione riga + { + int totdon = mask.get_int(F_TOTDON); + mask.set(F_TOTDON,totdon-1); + const TDate data = oldrow.get(0); + const TString16 tipo = oldrow.get(); + if (data == mask.get_date(F_DATAULTDON) + || data == mask.get_date(F_DATAULTSI) + || data == mask.get_date(F_DATAULTAF)) + modified = TRUE; + if (is_donaz(tipo,IDON_SI)) + { + totdon = mask.get_int(F_TOTDONSI); + mask.set(F_TOTDONSI,totdon-1); + } + else + if (is_donaz(tipo,IDON_AF)) + { + totdon = mask.get_int(F_TOTDONAF); + mask.set(F_TOTDONAF,totdon-1); + } + } + else + { + switch (k) + { + case K_DEL: // richiesta di cancellazione riga + oldrow = s.row(r); + break; + case K_SPACE: // inizio modifica riga + oldrow = s.row(r); + break; + case K_ENTER: // uscita da riga modificata + { + TToken_string& row = s.row(r); + const TDate actdata(row.get(0)); + const TString16 acttipo(row.get()); + const TDate olddata = oldrow.get(0); + const TString16 oldtipo = oldrow.get(); +//Righe aggiunte da Marco in data 05/08/99 per visualizzare un messaggio di avvertimento in caso di donazione in stato di sospensione + const char statocalcolato = modstato_tcs(mask.get(F_STATO)); + const char statosi = modstato_tcs(mask.get(F_STATOSI)); + const char statoaf = modstato_tcs(mask.get(F_STATOAF)); + if (actdata > mask.get_date(F_DATASTATO)) + if (((statocalcolato != 'I') && (statocalcolato != 'F')) || ((statosi != 'I') && (is_donaz(acttipo,IDON_SI))) + || ((statoaf != 'I') && (is_donaz(acttipo,IDON_AF)))) + { + TString messaggio = ""; + messaggio << "Stato soggetto non compatibile per una donazione.\n"; + messaggio << "In caso si prosegua, adeguare manualmente lo stato del soggetto!!!"; + s.warning_box(messaggio); + }; +//fino a qui + if (olddata != actdata) + { + ordina_sheet_data(s); + s.force_update(); + if (olddata == mask.get_date(F_DATAULTSI) + || olddata == mask.get_date(F_DATAULTAF) + || actdata > mask.get_date(F_DATAULTSI) + || actdata > mask.get_date(F_DATAULTAF)) + modified = TRUE; + } + if (oldtipo != acttipo) + modified = TRUE; + } + break; + case K_CTRL+K_INS: // avvenuto inserimento riga (ancora vuota) +// Aggiunte le righe seguenti da Marco il 05/08/99 per visualizzare un messaggio in caso di inserimento donazione su soggetto non idoneo + if ((modstato_tcs(mask.get(F_STATO)) != 'I') && (modstato_tcs(mask.get(F_STATO)) != 'F')) + { + TString messaggio = ""; + messaggio << "Stato soggetto non compatibile per una donazione.\n"; + messaggio << "In caso si prosegua, adeguare manualmente lo stato del soggetto!!!"; + s.warning_box(messaggio); + } +//Fino a qui + const int totdon = mask.get_int(F_TOTDON); + mask.set(F_TOTDON,totdon+1); + break; + } + } + if (modified) + app().calcola_donazioni(mask, s); + return TRUE; +} + +bool TGestioneSoggetti::controlli_notify(TSheet_field& s, int r, KEY k) +{ + static bool delete_l = FALSE; // flag per cancellazione ultima riga + static TToken_string oldrow; + bool modified = FALSE; + TMask& mask = s.mask(); + if (k == K_CTRL+K_DEL) // avvenuta cancellazione riga + { + if (delete_l) + modified = TRUE; + delete_l = FALSE; + } + else + { + switch (k) + { + case K_INS: // richiesta inserimento riga + return app()._permesso; + break; + case K_SPACE: // inizio modifica riga + oldrow = s.row(r); + break; + case K_ENTER: // uscita da riga modificata + { + TToken_string& row = s.row(r); + const TDate actdata(row.get(0)); + const TString16 acttipo(row.get()); + const TDate olddata(oldrow.get(0)); + const TString16 oldtipo(oldrow.get()); + if (olddata != actdata) + { + ordina_sheet_data(s); + app().tipocon_set_sheet(s); + s.force_update(); + } + if (modstato_tcs(oldtipo) != 'N' || modstato_tcs(acttipo) != 'N') + modified = TRUE; + } + break; + case K_DEL: // richiesta di cancellazione riga + { + oldrow = s.row(r); + const TString16 oldtipo(oldrow.get(1)); + if (r == (s.items()-1) && modstato_tcs(oldtipo) != 'N') + delete_l = TRUE; + return app()._permesso; + } + break; + } + } + if (modified) + { + TSheet_field& i = (TSheet_field&)mask.field(F_IDONEITA); + c_reord(s, i); + } + return TRUE; +} + +bool TGestioneSoggetti::idoneita_notify(TSheet_field& s, int r, KEY k) +{ + static TToken_string oldrow; + bool modified = FALSE; + TMask& mask = s.mask(); + + if (k == K_CTRL+K_DEL) // avvenuta cancellazione riga + modified = TRUE; + else + { + switch (k) + { + case K_INS: // richiesta inserimento riga + return app()._permesso; + break; + case K_SPACE: // inizio modifica riga + oldrow = s.row(r); + break; + case K_ENTER: // uscita da riga modificata + { + TToken_string& row = s.row(r); + const TDate actdata(row.get(0)); + const TString16 acttipo(row.get()); + const TString16 actidosos(row.get()); + const TDate olddata(oldrow.get(0)); + const TString16 oldtipo(oldrow.get()); + const TString16 oldidosos(oldrow.get()); + if (olddata != actdata) + { + ordina_sheet_data(s); + app().idosos_set_sheet(s); + s.force_update(); + } + if (olddata!=actdata || oldtipo!=acttipo || oldidosos!=actidosos) + modified = TRUE; + } + break; + case K_DEL: + return app()._permesso; + } + } + if (modified) + { + TSheet_field& c = (TSheet_field&)mask.field(F_CONTROLLI); + c_reord(c,s); + } + return TRUE; +} + + +bool TGestioneSoggetti::benemerenze_notify(TSheet_field& s, int r, KEY k) +{ + if (k == K_ENTER) + { + } + return TRUE; +} + +bool TGestioneSoggetti::storico_notify(TSheet_field& s, int r, KEY k) +{ + if (k == K_ENTER) + { + } + return TRUE; +} + +bool TGestioneSoggetti::richiesta_password() +{ + TMask& mask = *(app().get_mask()); + TMask msk("at0100e"); + if (msk.run() == K_ENTER) + { + if (msk.get(F_PASSWORD) == "BAMP") + { + mask.enable(F_CONTROLLI); + mask.enable(F_IDONEITA); + return TRUE; + } + else + { + error_box("Password errata! Non e' possibile modificare la situazione sanitaria"); + mask.disable(F_CONTROLLI); + mask.disable(F_IDONEITA); + } + } + return FALSE; +} + +int at0100(int argc, char* argv[]) +{ + TGestioneSoggetti a; + a.run(argc, argv, "Soggetti"); + return 0; } \ No newline at end of file