5b35dc21d2
Files correlati : Ricompilazione Demo : [ ] Commento : git-svn-id: svn://10.65.10.50/trunk@20268 c028cbd2-c16b-5b4b-a496-9718f37d4682
842 lines
29 KiB
C++
Executable File
842 lines
29 KiB
C++
Executable File
#include <applicat.h>
|
|
#include <automask.h>
|
|
#include <progind.h>
|
|
#include <recarray.h>
|
|
#include <reprint.h>
|
|
#include <reputils.h>
|
|
#include <tabmod.h>
|
|
#include <textset.h>
|
|
#include <utility.h>
|
|
|
|
#include "contsan.h"
|
|
#include "donaz.h"
|
|
#include "idoneita.h"
|
|
#include "rconvoc.h"
|
|
#include "soggetti.h"
|
|
|
|
#include "atlib.h"
|
|
#include "at9800a.h"
|
|
////////////////////////////
|
|
// Maschera
|
|
////////////////////////////
|
|
class TImporta_ct_rn_mask : public TAutomask
|
|
{
|
|
protected:
|
|
virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
|
|
public:
|
|
TImporta_ct_rn_mask();
|
|
};
|
|
|
|
TImporta_ct_rn_mask::TImporta_ct_rn_mask() : TAutomask("at9800a")
|
|
{
|
|
}
|
|
|
|
bool TImporta_ct_rn_mask::on_field_event(TOperable_field& f, TField_event e, long jolly)
|
|
{
|
|
switch (f.dlg())
|
|
{
|
|
case F_NAME:
|
|
if (e == fe_button)
|
|
{
|
|
TArray_sheet as(-1, -1, 72, 20, TR("Selezione file"), "File@32");
|
|
TFilename path = get(F_PATH);
|
|
path.add("*.txt");
|
|
list_files(path, as.rows_array());
|
|
TFilename name;
|
|
FOR_EACH_ARRAY_ROW(as.rows_array(), i, row)
|
|
{
|
|
name = *row;
|
|
*row = name.name();
|
|
}
|
|
if (as.run() == K_ENTER)
|
|
{
|
|
f.set(as.row(as.selected()));
|
|
}
|
|
}
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
////////////////////////////
|
|
// Recordset
|
|
////////////////////////////
|
|
class TImporta_ct_rn_recordset : public TAS400_recordset
|
|
{
|
|
protected:
|
|
long trova_riga(const TString& key);
|
|
|
|
public:
|
|
TDate get_date(const char* field_name) const;
|
|
TImporta_ct_rn_recordset(const TFilename& name);
|
|
};
|
|
|
|
//in base al campo decide come ricavare la data; questo perchè quei geni dell'avis producono..
|
|
//..un file con le date scritte in formato fritto misto!
|
|
TDate TImporta_ct_rn_recordset::get_date(const char* field_name) const
|
|
{
|
|
/*l'unica data scritta in modo civile è la datadon: come non detto! hanno porcato anche questa!
|
|
if (xvt_str_compare_ignoring_case(field_name, "DATADON") == 0)
|
|
return get(field_name).as_date();*/
|
|
|
|
//le altre sono scritte in modo incivile e vanno girate
|
|
const TString& str_date = get(field_name).as_string();
|
|
TDate output_date(atoi(str_date.left(2)), atoi(str_date.mid(2,2)), atoi(str_date.mid(4,4)));
|
|
return output_date;
|
|
}
|
|
|
|
TImporta_ct_rn_recordset::TImporta_ct_rn_recordset(const TFilename& name)
|
|
: TAS400_recordset(TString("AS400(180)\nSELECT * FROM ") << name)
|
|
{
|
|
create_field("COGNOME", -1, 20, _alfafld, true);
|
|
create_field("NOME", -1, 20, _alfafld, true);
|
|
create_field("DATANASC", -1, 8, _alfafld, true);
|
|
create_field("SESSO", -1, 1, _alfafld, true);
|
|
create_field("STATO", -1, 8, _alfafld, true);
|
|
create_field("DATAULTEC", -1, 8, _alfafld, false);
|
|
create_field("DATADON", -1, 8, _alfafld, true); //unica data scritta a rovescio (cioè corretta!)
|
|
create_field("TIPOPRE", -1, 8, _alfafld, true);
|
|
create_field("ANNOUNITA", -1, 4, _intfld, true);
|
|
create_field("NROUNITA", -1, 6, _intfld, true);
|
|
create_field("MOTIVOSOSP", -1, 8, _alfafld, false);
|
|
create_field("SOSPESODAL", -1, 8, _alfafld, false);
|
|
create_field("SOSPESOAL", -1, 8, _alfafld, false);
|
|
create_field("LUOGO1", -1, 8, _alfafld, false);
|
|
create_field("LUOGO2", -1, 8, _alfafld, false);
|
|
create_field("LUOGO3", -1, 8, _alfafld, true);
|
|
create_field("LUOGO4", -1, 8, _alfafld, true);
|
|
create_field("IDONEO_SI", -1, 1, _alfafld, true);
|
|
create_field("IDONEO_PL", -1, 1, _alfafld, true);
|
|
create_field("IDONEO_PI", -1, 1, _alfafld, true);
|
|
create_field("TIPO_ESAME", -1, 8, _alfafld, false);
|
|
create_field("RISULTATO", -1, 20, _alfafld, false);
|
|
}
|
|
|
|
///////////////////////////////////////
|
|
// Decodificatore
|
|
///////////////////////////////////////
|
|
//classe per la trascodifica lampo dei codici CT in quelli AT..
|
|
//..(secondo la tabella &C2A)
|
|
class TDecode_c2a : public TCache
|
|
{
|
|
protected:
|
|
virtual TObject* key2obj(const char* key);
|
|
|
|
public:
|
|
const TString& decode(const char* code, const char* prefix);
|
|
};
|
|
|
|
TObject* TDecode_c2a::key2obj(const char* key)
|
|
{
|
|
TString* str = new TString;
|
|
|
|
TModule_table tabmod("AT548C2A");
|
|
tabmod.put("CODTAB", key);
|
|
if (tabmod.read() == NOERR)
|
|
*str = tabmod.get("S6");
|
|
|
|
return str;
|
|
}
|
|
|
|
const TString& TDecode_c2a::decode(const char* code, const char* prefix)
|
|
{
|
|
TString16 key;
|
|
key << prefix << code;
|
|
key.trim();
|
|
return *(const TString*)objptr(key);
|
|
}
|
|
|
|
|
|
////////////////////////////
|
|
// Applicazione
|
|
////////////////////////////
|
|
class TImporta_ct_rn : public TSkeleton_application
|
|
{
|
|
TImporta_ct_rn_mask* _mask;
|
|
TLog_report* _log;
|
|
TDecode_c2a _c2a;
|
|
TAssoc_array _nocontrol_sezioni;
|
|
|
|
private:
|
|
virtual bool create();
|
|
virtual void main_loop();
|
|
|
|
protected:
|
|
void msg_no_sog_error(const TImporta_ct_rn_recordset& recset) const;
|
|
void msg_esame_error(const TImporta_ct_rn_recordset& recset, const TString& tipo, const bool manca) const;
|
|
void msg_stato_error(const TImporta_ct_rn_recordset& recset, const int tipo,
|
|
const TString& stato_avis = "", const TString& stato_ct = "") const;
|
|
void msg_aggiunge_qualcosa(const TRectype& curr_rec) const;
|
|
const TString& decode(const char* code, const char* prefix);
|
|
long trova_prossimo(TLocalisamfile& file, const long sog_codice) const;
|
|
|
|
public:
|
|
const TString& decode_stato(const char* code) { return decode(code, "14"); }
|
|
const TString& decode_prelievo(const char* code) { return decode(code, "19"); }
|
|
const TString& decode_esame(const char* code) { return decode(code, "32"); }
|
|
const TString& decode_luogo(const char* code) { return decode(code, "PU"); }
|
|
void aggiunge_contsan(const TImporta_ct_rn_recordset& recset, const long sog_codice);
|
|
void aggiunge_donazione(const TImporta_ct_rn_recordset& recset, const long sog_codice);
|
|
|
|
bool importa_dati(const TFilename& name);
|
|
bool controlla_stato_ct_avis(const TImporta_ct_rn_recordset& recset, const long codsog);
|
|
bool aggiorna_soggetto(const long codsog);
|
|
};
|
|
|
|
|
|
void TImporta_ct_rn::msg_no_sog_error(const TImporta_ct_rn_recordset& recset) const
|
|
{
|
|
TString error_msg;
|
|
_log->log(2, "DONATORE NON PRESENTE NEGLI ARCHIVI !");
|
|
error_msg << "Cognome: " << recset.get("COGNOME").as_string() << "\n";
|
|
error_msg << "Nome: " << recset.get("NOME").as_string() << "\n";
|
|
_log->log(0, error_msg);
|
|
error_msg.cut(0);
|
|
|
|
error_msg << "Data nascita: " << recset.get_date("DATANASC") << "\n";
|
|
error_msg << "Sesso: " << recset.get("SESSO").as_string() << "\n";
|
|
error_msg << "Stato donatore: " << recset.get("STATO").as_string() << "\n";
|
|
error_msg << "Data donazione: " << recset.get_date("DATADON") << "\n";
|
|
_log->log(0, error_msg);
|
|
error_msg.cut(0);
|
|
|
|
error_msg << "Tipo prelievo: " << recset.get("TIPOPRE").as_string() << "\n";
|
|
error_msg << "Data ultimi esami controllo: " << recset.get_date("DATAULTEC") << "\n";
|
|
_log->log(0, error_msg);
|
|
error_msg.cut(0);
|
|
|
|
error_msg << "Sospeso dal: " << recset.get_date("SOSPESODAL") << " al: " << recset.get_date("SOSPESOAL") << "\n";
|
|
error_msg << "Motivo sospensione: " << recset.get("MOTIVOSOSP").as_string() << "\n";
|
|
_log->log(0, error_msg);
|
|
error_msg.cut(0);
|
|
|
|
error_msg << " \n";
|
|
_log->log(0, error_msg);
|
|
error_msg.cut(0);
|
|
}
|
|
|
|
|
|
void TImporta_ct_rn::msg_esame_error(const TImporta_ct_rn_recordset& recset, const TString& tipo, bool manca) const
|
|
{
|
|
TString error_msg;
|
|
error_msg << tipo << " NON INSERIBILE !";
|
|
_log->log(2, error_msg);
|
|
error_msg.cut(0);
|
|
|
|
error_msg << "Data: " << recset.get_date("DATADON") << "\n";
|
|
error_msg << "Tipo: " << recset.get("TIPO_ESAME").as_string() << "\n";
|
|
if (manca)
|
|
error_msg << "Manca il codice " << tipo << " corrispondente" << "\n";
|
|
else
|
|
error_msg << tipo << " già presente !" << "\n";
|
|
_log->log(0, error_msg);
|
|
error_msg.cut(0);
|
|
|
|
error_msg << "Cognome: " << recset.get("COGNOME").as_string() << "\n";
|
|
error_msg << "Nome: " << recset.get("NOME").as_string() << "\n";
|
|
error_msg << "Data nascita: " << recset.get_date("DATANASC") << "\n";
|
|
_log->log(0, error_msg);
|
|
error_msg.cut(0);
|
|
|
|
error_msg << " \n";
|
|
_log->log(0, error_msg);
|
|
}
|
|
|
|
void TImporta_ct_rn::msg_stato_error(const TImporta_ct_rn_recordset& recset, const int tipo,
|
|
const TString& stato_avis, const TString& stato_ct) const
|
|
{
|
|
TString error_msg;
|
|
switch (tipo)
|
|
{
|
|
case 0:
|
|
error_msg << "STATO DONATORE NON PRESENTE IN TABELLA" << "\n";
|
|
error_msg << "Stato: " << recset.get("STATO").as_string() << "\n";
|
|
break;
|
|
case 1:
|
|
error_msg << "STATO DONATORE AVIS DIVERSO DA CT - VERIFICARE" << "\n";
|
|
error_msg << "- AVIS: " << stato_avis << "\n";
|
|
error_msg << "- CT: " << stato_ct << "\n";
|
|
break;
|
|
case 2:
|
|
error_msg << "SOGGETTO DICHIARATO IDONEO DAL CT SENZA TIPI DI DONAZIONE" << "\n";
|
|
break;
|
|
case 3:
|
|
error_msg << "SOGGETTO DICHIARATO DECEDUTO DA CT - VERIFICARE" << "\n";
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
_log->log(2, error_msg);
|
|
error_msg.cut(0);
|
|
|
|
error_msg << "Cognome: " << recset.get("COGNOME").as_string() << "\n";
|
|
error_msg << "Nome: " << recset.get("NOME").as_string() << "\n";
|
|
error_msg << "Data nascita: " << recset.get_date("DATANASC") << "\n";
|
|
_log->log(0, error_msg);
|
|
error_msg.cut(0);
|
|
|
|
error_msg << " \n";
|
|
_log->log(0, error_msg);
|
|
}
|
|
|
|
//metodo per scrivere sul log le avvenute registrazioni di donazioni e controlli
|
|
void TImporta_ct_rn::msg_aggiunge_qualcosa(const TRectype& curr_rec) const
|
|
{
|
|
const bool is_donaz = curr_rec.num() == LF_DONAZ;
|
|
const char* tipo = is_donaz ? "DONAZIONE" : "ESAME";
|
|
TString msg;
|
|
msg << "INSERIMENTO " << tipo << "\n";
|
|
_log->log(2, msg);
|
|
msg.cut(0);
|
|
//data
|
|
const TDate data = is_donaz ? curr_rec.get_date(DON_DATADON) : curr_rec.get_date(CON_DATACON);
|
|
msg << "Data: " << data.string() << "\n";
|
|
//tipo
|
|
const TString& tipodon = is_donaz ? curr_rec.get(DON_TIPODON) : curr_rec.get(CON_TIPOCON);
|
|
msg << "Tipo: " << tipodon << "\n";
|
|
//luogo
|
|
if (is_donaz)
|
|
{
|
|
const TString& cod_luogo = curr_rec.get(DON_LUOGODON);
|
|
const TString& descr_luogo = cache().get("LDN", cod_luogo, "S0");
|
|
msg << "Luogo: " << cod_luogo << " - " << descr_luogo << "\n";
|
|
}
|
|
_log->log(0, msg);
|
|
msg.cut(0);
|
|
//progressivo
|
|
const int progressivo = is_donaz ? curr_rec.get_int(DON_PROGDON) : curr_rec.get_int(CON_PROGCON);
|
|
msg << "Prog. don.: " << progressivo << "\n";
|
|
//soggetto
|
|
const long codsog = is_donaz ? curr_rec.get_long(DON_CODICE) : curr_rec.get_long(CON_CODICE);
|
|
const TRectype& recsog = cache().get(LF_SOGGETTI, codsog);
|
|
msg << "Cognome: " << recsog.get(SOG_COGNOME) << "\n";
|
|
msg << "Nome: " << recsog.get(SOG_NOME) << "\n";
|
|
msg << "Data nascita: " << recsog.get_date(SOG_DATANASC) << "\n";
|
|
_log->log(0, msg);
|
|
msg.cut(0);
|
|
msg << " \n";
|
|
_log->log(0, msg);
|
|
}
|
|
|
|
//decodifica sulla tabella C2A (utilizza la classe apposita creata in precedenza)
|
|
const TString& TImporta_ct_rn::decode(const char* code, const char* prefix)
|
|
{
|
|
return _c2a.decode(code, prefix);
|
|
}
|
|
|
|
|
|
static int compare_date(const TObject** o1, const TObject** o2)
|
|
{
|
|
const TRectype& s1 = *((TRectype*)*o1);
|
|
const TRectype& s2 = *((TRectype*)*o2);
|
|
|
|
const TDate d1(s1.get(IDO_DATAIDO));
|
|
const TDate d2(s2.get(IDO_DATAIDO));
|
|
|
|
int d = d1 - d2;
|
|
return d;
|
|
}
|
|
|
|
//metodo per cercare l'ultimo record di un soggetto in un file tipo donaz e contsan
|
|
long TImporta_ct_rn::trova_prossimo(TLocalisamfile& file, const long sog_codice) const
|
|
{
|
|
long next = 1;
|
|
|
|
file.put("CODICE", sog_codice + 1); //Guy mi perdoni se non uso la macro!
|
|
int err = file.read(_isgteq);
|
|
if (err == NOERR)
|
|
err = file.read(_isprev);
|
|
else
|
|
{
|
|
if (err == _iseof)
|
|
err = file.read(_islast);
|
|
}
|
|
if (err == NOERR && file.get_long("CODICE") == sog_codice) //Mi riperdoni!
|
|
{
|
|
const int filenum = file.num(); //Qui si rischia il linciaggio...
|
|
if (filenum == LF_CONTSAN)
|
|
next += file.get_long(CON_PROGCON);
|
|
if (filenum == LF_DONAZ)
|
|
next += file.get_long(DON_PROGDON);
|
|
}
|
|
|
|
return next;
|
|
}
|
|
|
|
//confronto stato donatore avis con quello ct
|
|
bool TImporta_ct_rn::controlla_stato_ct_avis(const TImporta_ct_rn_recordset& recset, const long codsog)
|
|
{
|
|
//stato_ct = stato preso da file da importare
|
|
//stato_at = stato_ct decodificato per avis in base alla tabella di trascodifica
|
|
//stato_attuale = stato sul record del soggetto nel file dei soggetti
|
|
const TString& stato_ct = recset.get("STATO").as_string();
|
|
if (stato_ct.full())
|
|
{
|
|
const TString& stato_at = decode_stato(stato_ct);
|
|
//se non riesce a decodificare lo stato avverte ed esce
|
|
if (stato_at.blank())
|
|
msg_stato_error(recset, 0);
|
|
else
|
|
{
|
|
TLocalisamfile soggetti(LF_SOGGETTI);
|
|
soggetti.put(SOG_CODICE, codsog);
|
|
int err = soggetti.read();
|
|
if (err == NOERR) //e non possiamo aspettarci altro che NOERR, visto che il controllo lo ha già fatto prima
|
|
{
|
|
const TString& stato_attuale = soggetti.get(SOG_STATO);
|
|
//se lo stato sul record del soggetto risulta != dallo stato sul file adesso decodificato..
|
|
//..procede al casino infernale dell'allineamento stati
|
|
//Questo casino può però farlo solo nel caso la sezione ammetta controlli;in caso contrario..
|
|
//..deve semplicemente abbandonare la questione dando segnalazione dell'incongruenza tra gli..
|
|
//..stati avis e ct (incongruenza che non può essere corretta causa la proprietà della sezione).
|
|
if (stato_at != stato_attuale)
|
|
{
|
|
const TString& sog_sez = soggetti.get(SOG_CODSEZ);
|
|
const bool sez_no_controlli = _nocontrol_sezioni.is_key(sog_sez);
|
|
//controlla se la sezione ammette i controlli
|
|
if (!sez_no_controlli)
|
|
{
|
|
//verifica se deve veramente elaborare il tutto o no
|
|
//Per prima cosa verifica se lo stato comporta una idoneità/sospensione/donazionabilità
|
|
//Deve controllare sulla tabella di trascodifica il campo S7
|
|
TModule_table tabmod("AT548C2A");
|
|
TString key;
|
|
key << "14" << stato_ct;
|
|
key.trim();
|
|
tabmod.put("CODTAB", key);
|
|
TString4 i_s_d; //non è una droga, ma idoneità_sospensione_donatoreabile
|
|
if (tabmod.read() == NOERR)
|
|
i_s_d = tabmod.get("S7");
|
|
|
|
//controlla se sono state passate via file da importare una o più idoneità
|
|
const TString& ido_si = recset.get("IDONEO_SI").as_string();
|
|
const TString& ido_pl = recset.get("IDONEO_PL").as_string();
|
|
const TString& ido_pi = recset.get("IDONEO_PI").as_string();
|
|
|
|
//nessuno stato con idoneità -> salta
|
|
if (i_s_d[0] == 'I' && ido_si[0] != 'S' && ido_pl[0] != 'S' && ido_pi[0] != 'S')
|
|
msg_stato_error(recset, 2);
|
|
else
|
|
{
|
|
//giro sui contsan del soggetto
|
|
//per prima cosa cerca se già esiste un contsan in data letta dal recset
|
|
TDate datacon = recset.get_date("DATADON");
|
|
TLocalisamfile contsan(LF_CONTSAN);
|
|
contsan.setkey(2);
|
|
contsan.put(CON_DATACON, datacon);
|
|
contsan.put(CON_CODICE, codsog);
|
|
int err = contsan.read();
|
|
//se esiste deve spostare di un giorno in avanti la data del controllo da inserire
|
|
if (err == NOERR)
|
|
++datacon;
|
|
const long next_contsan = trova_prossimo(contsan, codsog);
|
|
|
|
//dopo essersi posizionato correttamente, agiunge il contsan
|
|
contsan.zero();
|
|
contsan.put(CON_CODICE, codsog);
|
|
contsan.put(CON_PROGCON, next_contsan);
|
|
contsan.put(CON_DATACON, datacon);
|
|
contsan.put(CON_TIPOCON, stato_at);
|
|
contsan.put(CON_RESPONSAB, "AGGIORNAMENTO DA CENTRO TRASF.");
|
|
|
|
//campi speciali in base a parametri allucinanti
|
|
//se il soggetto è dichiarato idoneo...
|
|
if (i_s_d[0] == 'I')
|
|
{
|
|
int ido_num = 0; //questa è da seguire perchè esempio di mentalità contorta!
|
|
TString8 nome_campo_ido;
|
|
|
|
//idoneità SI
|
|
if (ido_si[0] == 'S')
|
|
{
|
|
ido_num++;
|
|
nome_campo_ido.format("IDON%d", ido_num);
|
|
contsan.put(nome_campo_ido, "SI");
|
|
if (soggetti.get_int(SOG_INTSI) == 0)
|
|
{
|
|
if (soggetti.get_int(SOG_SESSO) == 1)
|
|
contsan.put(CON_INTSI, 94);
|
|
else
|
|
contsan.put(CON_INTSI, 180);
|
|
}
|
|
}
|
|
//idoneità PL-AF
|
|
if (ido_pl[0] == 'S')
|
|
{
|
|
ido_num++;
|
|
nome_campo_ido.format("IDON%d", ido_num);
|
|
contsan.put(nome_campo_ido, "PL");
|
|
const int intaf = soggetti.get_int(SOG_INTAF);
|
|
if (intaf == 0)
|
|
contsan.put(CON_INTAF, 30);
|
|
else
|
|
contsan.put(CON_INTAF, intaf);
|
|
}
|
|
|
|
//idoneità PI
|
|
if (ido_pi[0] == 'S')
|
|
{
|
|
ido_num++;
|
|
nome_campo_ido.format("IDON%d", ido_num);
|
|
contsan.put(nome_campo_ido, "PI");
|
|
if (contsan.get_int(CON_INTAF) == 0)
|
|
{
|
|
const int intaf = soggetti.get_int(SOG_INTAF);
|
|
if (intaf == 0)
|
|
contsan.put(CON_INTAF, 30);
|
|
else
|
|
contsan.put(CON_INTAF, intaf);
|
|
}
|
|
}
|
|
} //if (i_s_d[0] == 'I' &&...
|
|
//e alla fine della storia scrive il record!
|
|
err = contsan.write();
|
|
|
|
//comunque sia, effettua il controllo della morte del soggetto
|
|
//Ebbene si, anche se lo ha aggiornato, non si sa mai che risorga...
|
|
const bool sog_kaputt = tabmod.get_bool("B1");
|
|
if (sog_kaputt)
|
|
msg_stato_error(recset, 3);
|
|
}
|
|
}
|
|
else //if (!sez_no_controlli)...
|
|
{
|
|
msg_stato_error(recset, 1, stato_at, stato_attuale);
|
|
} ////if (!sez_no_controlli)...
|
|
} //if (stato_at != stato_attuale)...
|
|
} //if (err == NOERR)...
|
|
} //if (stato_at.blank())..
|
|
} //if (stato_ct.full())...
|
|
return true;
|
|
}
|
|
|
|
//aggiorna i files di atwin (donazioni,idoneità,controlli,soggetti) del..
|
|
//..soggetto di cui ha importato donazione o contsan
|
|
bool TImporta_ct_rn::aggiorna_soggetto(const long codsog)
|
|
{
|
|
TLocalisamfile soggetti(LF_SOGGETTI);
|
|
TRectype& recsog = soggetti.curr();
|
|
recsog.put(SOG_CODICE, codsog);
|
|
int err = soggetti.read();
|
|
//se non trova il soggetto c'è qualcosa che non quadra ed esce (impossibile)
|
|
if (err != NOERR)
|
|
return false;
|
|
|
|
//codice del soggetto in formato alfanumerico per i TRecord_array
|
|
const TString8 sog_codice = recsog.get(SOG_CODICE);
|
|
|
|
//riordino delle donazioni
|
|
TRecord_array sdonazioni(sog_codice, LF_DONAZ);
|
|
calcola_donazioni_lib(recsog, &sdonazioni);
|
|
sdonazioni.rewrite();
|
|
|
|
//riordino delle idoneità
|
|
TRecord_array sidoneita(sog_codice, LF_IDONEITA);
|
|
sidoneita.sort(compare_date);
|
|
sidoneita.rewrite();
|
|
|
|
//riordino dei controlli
|
|
TRecord_array scontrolli(sog_codice, LF_CONTSAN);
|
|
if (scontrolli.rows() > 0 || sidoneita.rows() > 0)
|
|
con_reord(recsog, &scontrolli, &sidoneita);
|
|
|
|
//riordino del soggetto
|
|
TConfig config(CONFIG_STUDIO);
|
|
const bool dataisc = config.get_bool("DataIsc");
|
|
|
|
TDate dataiscsog = recsog.get_date(SOG_DATAISC);
|
|
if (!dataiscsog.ok() && dataisc)
|
|
{
|
|
if (!recsog.get_date(SOG_DATAPRISI) == NULLDATE)
|
|
recsog.put(SOG_DATAISC, recsog.get(SOG_DATAPRISI));
|
|
else
|
|
{
|
|
const TRectype& riga = sdonazioni.row(1);
|
|
recsog.put(SOG_DATAISC, riga.get(DON_DATADON));
|
|
}
|
|
} //if (!dataiscsog.ok()...
|
|
|
|
//riordino convocazioni
|
|
const TDate dataprossi = recsog.get_date(SOG_DATAPROSSI);
|
|
const TDate dataconv = recsog.get_date(SOG_DATACONV);
|
|
const char stato = modstato_tcs(recsog.get(SOG_STATO));
|
|
const TString& statosi = recsog.get(SOG_STATOSI);
|
|
if ((stato == 'S') || (statosi == SOSPENSIONE) || (dataprossi > dataconv) || !dataprossi.ok())
|
|
{
|
|
TLocalisamfile rconvoc(LF_RCONVOC);
|
|
rconvoc.setkey(3);
|
|
rconvoc.zero();
|
|
rconvoc.put(RCV_CODICE, recsog.get(SOG_CODICE));
|
|
rconvoc.put(RCV_DATACONV, recsog.get(SOG_DATACONV));
|
|
if (rconvoc.read() == NOERR)
|
|
{
|
|
rconvoc.put(RCV_ANNULLATO, TRUE);
|
|
rconvoc.write();
|
|
}
|
|
|
|
recsog.zero(SOG_DATACONV);
|
|
recsog.zero(SOG_DATAULTSOL);
|
|
recsog.zero(SOG_NUMCONV);
|
|
|
|
} //if(stato=='S'...
|
|
recsog.put(SOG_DATAULTAGG, TDate(TODAY));
|
|
recsog.put(SOG_UTENULTAGG, "CONVE");
|
|
|
|
//e alla fine riscrive il file dei soggetti
|
|
soggetti.rewrite();
|
|
|
|
return true;
|
|
}
|
|
|
|
|
|
void TImporta_ct_rn::aggiunge_contsan(const TImporta_ct_rn_recordset& recset, const long sog_codice)
|
|
{
|
|
//cerca, per il soggetto in questione, quale è l'ultimo controllo sanitario e aggiunge quello nuovo
|
|
TLocalisamfile contsan(LF_CONTSAN);
|
|
const long next_contsan = trova_prossimo(contsan, sog_codice);
|
|
|
|
//dopo essersi posizionato correttamente, agiunge il contsan
|
|
contsan.zero();
|
|
contsan.put(CON_CODICE, sog_codice);
|
|
contsan.put(CON_PROGCON, next_contsan);
|
|
const TDate& dataesame = recset.get_date("DATADON");
|
|
contsan.put(CON_DATACON, dataesame);
|
|
const TString& tipopre = decode_prelievo(recset.get("TIPOPRE").as_string());
|
|
contsan.put(CON_TIPOCON, tipopre);
|
|
contsan.put(CON_RESPONSAB, "AGGIORNAMENTO DA CENTRO TRASF.");
|
|
|
|
int err = contsan.write();
|
|
//se riesce a scrivere il nuovo contsan, aggiorna il log ed il soggetto
|
|
if (err == NOERR)
|
|
msg_aggiunge_qualcosa(contsan.curr());
|
|
}
|
|
|
|
|
|
void TImporta_ct_rn::aggiunge_donazione(const TImporta_ct_rn_recordset& recset, const long sog_codice)
|
|
{
|
|
//cerca, per il soggetto in questione, quale è l'ultima donazione e aggiunge quella nuova
|
|
TLocalisamfile donaz(LF_DONAZ);
|
|
const long next_donaz = trova_prossimo(donaz, sog_codice);
|
|
|
|
//dopo essersi posizionato correttamente, agiunge la donazione
|
|
donaz.zero();
|
|
donaz.put(DON_CODICE, sog_codice);
|
|
donaz.put(DON_PROGDON, next_donaz);
|
|
const TDate& dataesame = recset.get_date("DATADON");
|
|
donaz.put(DON_DATADON, dataesame);
|
|
const TString& tipopre = decode_prelievo(recset.get("TIPOPRE").as_string());
|
|
donaz.put(DON_TIPODON, tipopre);
|
|
const int unita = recset.get("NROUNITA").as_int();
|
|
donaz.put(DON_ETICHETTA, unita);
|
|
//controllo soggetto-sezione-sottosezione
|
|
TLocalisamfile soggetti(LF_SOGGETTI);
|
|
soggetti.put(SOG_CODICE, sog_codice);
|
|
int err = soggetti.read();
|
|
if (err == NOERR) //dovrebbe esserlo sempre, perchè il controllo è stato fatto all'inizio di elabora
|
|
{
|
|
const TString& codsez = soggetti.get(SOG_CODSEZ);
|
|
donaz.put(DON_CODSEZ, codsez);
|
|
const TString& codsot = soggetti.get(SOG_CODSOT);
|
|
donaz.put(DON_CODSOT, codsot);
|
|
}
|
|
//caso della prima donazione (donatore vergine e martire)
|
|
if (next_donaz == 1 && soggetti.get_int(SOG_DONPRECSI) == 0 && soggetti.get_int(SOG_DONPRECAF) == 0)
|
|
donaz.put(DON_PRIMADON, 'X');
|
|
|
|
//controllo del luogo donazione
|
|
const TString& luogodon2 = decode_luogo(recset.get("LUOGO2").as_string());
|
|
if (luogodon2.full())
|
|
donaz.put(DON_LUOGODON, luogodon2);
|
|
else
|
|
{
|
|
const TString& luogodon4 = decode_luogo(recset.get("LUOGO4").as_string());
|
|
if (luogodon4.full())
|
|
donaz.put(DON_LUOGODON, luogodon4);
|
|
else
|
|
donaz.put(DON_LUOGODON, "1A");
|
|
}
|
|
|
|
err = donaz.write();
|
|
//se riesce a scrivere la nuova donazione, aggiorna il log ed il soggetto
|
|
if (err == NOERR)
|
|
msg_aggiunge_qualcosa(donaz.curr());
|
|
}
|
|
|
|
|
|
bool TImporta_ct_rn::importa_dati(const TFilename& name)
|
|
{
|
|
//lista sezioni senza controlli (viene riempita una volta per tutte all'inizio)
|
|
//è qui e non nella create perchè dopo una esecuzione del programma si potrebbe modificare..
|
|
//..la lista delle sezioni (non capita da 15 anni, però non si sa mai...)
|
|
TSheet_field& sf_nocontrol_sez = _mask->sfield(F_SEZIONI);
|
|
const int righe_sheet = sf_nocontrol_sez.items();
|
|
|
|
FOR_EACH_SHEET_ROW(sf_nocontrol_sez, i, row)
|
|
{
|
|
TString4 sh_sezione = row->get(0);
|
|
_nocontrol_sezioni.add(sh_sezione, sh_sezione);
|
|
}
|
|
|
|
//recordset di importazione
|
|
TImporta_ct_rn_recordset recset(name);
|
|
TLocalisamfile soggetti(LF_SOGGETTI);
|
|
soggetti.setkey(2);
|
|
|
|
TProgind pi(recset.items(), TR("Importazione dati da file..."), true, true);
|
|
|
|
for (bool ok = recset.move_first(); ok; ok = recset.move_next())
|
|
{
|
|
if (!pi.addstatus(1))
|
|
break;
|
|
|
|
//ciclo di importazione e controllo dati
|
|
//va ricavato dalla procedura foxprow dacentro.prg
|
|
|
|
//CONTROLLO ESISTENZA DEL SOGGETTO
|
|
//--------------------------------
|
|
TString80 sog_cognome = recset.get("COGNOME").as_string();
|
|
sog_cognome.trim();
|
|
TString80 sog_nome = recset.get("NOME").as_string();
|
|
sog_nome.trim();
|
|
TDate sog_datanasc = recset.get_date("DATANASC");
|
|
|
|
//cerca il soggetto nel file dei soggetti
|
|
soggetti.put(SOG_COGNOME, sog_cognome);
|
|
soggetti.put(SOG_NOME, sog_nome);
|
|
soggetti.put(SOG_DATANASC, sog_datanasc);
|
|
|
|
int err = soggetti.read();
|
|
//se trova il soggetto in anagrafica parte con l'elaborazione...
|
|
if (err == NOERR)
|
|
{
|
|
const long sog_codice = soggetti.get_long(SOG_CODICE);
|
|
|
|
//controllo il tipo di prelievo nella tabella di modulo avis C2A
|
|
//il tipoprelievo è nella subtabella 19
|
|
const TString& at_tipopre = decode_prelievo(recset.get("TIPOPRE").as_string());
|
|
|
|
//ESAMI E CONTROLLI SANITARI
|
|
//--------------------------
|
|
//se il tipoprelievo è in realtà un esame..
|
|
if (at_tipopre == "****")
|
|
{
|
|
//controlla se la sez del soggetto rifiuta i controlli (lista sezioni sullo sheet)
|
|
const TString& sog_sez = soggetti.get(SOG_CODSEZ);
|
|
const bool sez_no_controlli = _nocontrol_sezioni.is_key(sog_sez);
|
|
//se la sezione ammette i controlli
|
|
if (!sez_no_controlli)
|
|
{
|
|
const TString& at_tipoesame = decode_esame(recset.get("TIPO_ESAME").as_string());
|
|
//se non c'è una decodifica dell'esame avverte sul log
|
|
if (at_tipoesame.blank())
|
|
msg_esame_error(recset, "CONTROLLO", true);
|
|
else
|
|
//controlla se l'esame (detto controllo sanitario in gergo vampiresco) è già stato..
|
|
//..inserito oppure lo aggiunge al file dei controlli sanitari
|
|
{
|
|
const TDate& datadon = recset.get_date("DATADON");
|
|
|
|
TLocalisamfile contsan(LF_CONTSAN);
|
|
contsan.setkey(2);
|
|
contsan.put(CON_DATACON, datadon);
|
|
contsan.put(CON_CODICE, sog_codice);
|
|
err = contsan.read();
|
|
//se trova il controllo nella lista segnala che esiste già..
|
|
if (err == NOERR)
|
|
msg_esame_error(recset, "CONTROLLO", false);
|
|
else //sennò aggiunge il controllo sanitario..olè!
|
|
{
|
|
aggiunge_contsan(recset, sog_codice);
|
|
}
|
|
}
|
|
} //if(!sez_no_controlli...
|
|
} //if(at_tipopre=="**..
|
|
|
|
//DONAZIONI
|
|
//---------
|
|
else
|
|
{
|
|
//se non c'è una decodifica della donazione avverte sul log
|
|
if (at_tipopre.blank())
|
|
msg_esame_error(recset, "DONAZIONE", true);
|
|
else
|
|
{
|
|
const TDate& datadon = recset.get_date("DATADON");
|
|
const long sog_codice = soggetti.get_long(SOG_CODICE);
|
|
|
|
TLocalisamfile donaz(LF_DONAZ);
|
|
donaz.setkey(2);
|
|
donaz.put(DON_DATADON, datadon);
|
|
donaz.put(DON_CODICE, sog_codice);
|
|
err = donaz.read();
|
|
|
|
//se trova la donazione nella lista segnala che esiste già..
|
|
if (err == NOERR)
|
|
msg_esame_error(recset, "DONAZIONE", false);
|
|
else //sennò aggiunge la donazione..olè!
|
|
{
|
|
aggiunge_donazione(recset, sog_codice);
|
|
}
|
|
} //else di if (at_tipopre.blank())
|
|
} //else di if(at_tipopre=="**
|
|
|
|
//indipendentemente da ogni cosa controlla contsan avis/ct per lo stato donatore
|
|
controlla_stato_ct_avis(recset, sog_codice);
|
|
//aggiorna tutti i files legati al soggetto
|
|
aggiorna_soggetto(sog_codice);
|
|
|
|
}
|
|
else //if(err==NOERR)...se non trova il soggetto lo deve aggiungere? Per adesso si incazza e avverte l'operatore
|
|
msg_no_sog_error(recset);
|
|
|
|
} //for (bool ok = recset.move_first...
|
|
|
|
return true;
|
|
}
|
|
|
|
|
|
|
|
void TImporta_ct_rn::main_loop()
|
|
{
|
|
_mask = new TImporta_ct_rn_mask;
|
|
|
|
if (_mask->run() == K_ENTER)
|
|
{
|
|
//ricava il nome del file da importare
|
|
TFilename name = _mask->get(F_PATH);
|
|
name.add(_mask->get(F_NAME));
|
|
//crea il log di importazione
|
|
_log = new TLog_report("SEGNALAZIONI IMPORTAZIONE");
|
|
|
|
//importazione dati ed elaborazione soggetti
|
|
if (importa_dati(name))
|
|
{
|
|
const int items = _log->recordset()->items();
|
|
if (items > 0)
|
|
_log->preview();
|
|
message_box(TR("Importazione file completata"));
|
|
}
|
|
|
|
delete _log;
|
|
_log = NULL;
|
|
}
|
|
|
|
delete _mask;
|
|
_mask = NULL;
|
|
}
|
|
|
|
bool TImporta_ct_rn::create()
|
|
{
|
|
return TSkeleton_application::create();
|
|
}
|
|
|
|
|
|
int at9800(int argc, char* argv[])
|
|
{
|
|
TImporta_ct_rn app;
|
|
app.run(argc, argv, "Importazione da CT Rimini");
|
|
return 0;
|
|
} |