campo-sirio/cg/cg2400.cpp

586 lines
14 KiB
C++
Raw Normal View History

// Ricezione dati da sistema
#include <config.h>
#include <mask.h>
#include <prefix.h>
#include <printapp.h>
#include <tabutil.h>
#include <urldefid.h>
#include <utility.h>
#include <nditte.h>
#include "cglib04.h"
//#include "ba7.h"
#include "cg2400.h"
class TRic_sistema : public TApplication
{
TTable* _tab_tra;
TTransfer_file* _tras_file;
TString80 TEMP;
int _numtotdisk,_progdisk,_numdisk,_numinv,_numinvp,_nultras;
int _stato_ripartenza,_nultras_tab;
bool _sequenza,_disketto;
bool _prima_volta,_baipassa;
TString _nomeid,_nomeidp,_marker,_trasf,_trasfer,_pathname,_ragsoc_dittar;
long _dittainv,_dittainvp,_dittaric,_totrectras,_totrectrasp;
TDate _datatras,_datatrasp,_dataultras_tab,_dataultras;
TString _sigle_file,_nrec_file;
char _agg_cau,_agg_pcon,_agg_cls,_agg_clifo;
bool _agg_fatatt,_agg_fatpas;
public:
virtual bool create();
virtual bool destroy();
virtual bool menu(MENU_TAG m);
bool main_loop();
bool leggi_marker();
void leggi_trasfer();
void ripristina_trasfer();
long leggi_tabella_tras();
void componi_path(TMask&);
bool video_ripartenza();
void ditta_ricevente();
bool ripartenza();
bool set_flag();
void aggiorna_tabella();
const char* converti (const TString& data_AS400);
static bool baipassa(TMask& m,KEY k);
TRic_sistema() {};
};
HIDDEN TRic_sistema& app() { return (TRic_sistema &) main_app(); }
bool TRic_sistema::create()
{
TApplication::create();
_tab_tra = new TTable ("%TRA");
_tras_file = new TTransfer_file();
_numdisk = 1;
_prima_volta = TRUE;
_nultras = 0;
_nultras_tab = 0;
_baipassa = FALSE;
dispatch_e_menu (BAR_ITEM(1));
return TRUE;
}
bool TRic_sistema::destroy()
{
delete _tab_tra;
delete _tras_file;
return TApplication::destroy();
}
void TRic_sistema::componi_path(TMask& msk)
{
TString path,drive;
int pos;
path = msk.get(F_PATHNAME);
drive = msk.get(F_DRIVE);
pos = path.find(':');
if (drive == "A:" || drive == "B:" || drive == "D:" || drive == "E:")
_disketto = TRUE;
else
_disketto = FALSE;
if (pos)
path = path.mid(pos+1);
if (path != "")
{
_marker << drive << "\\" << path << "\\marker";
_trasfer << drive << "\\" << path << "\\trasfer";
if (!_disketto)
_pathname << drive << "\\" << path;
}
else
{
_marker << drive << "\\marker";
_trasfer << drive << "\\trasfer";
if (!_disketto)
_pathname << drive << "\\";
}
}
const char* TRic_sistema::converti (const TString& data_AS400)
{
TEMP = data_AS400.mid(4,2);
TEMP << "-" << data_AS400.mid(2,2);
TEMP << "-" << data_AS400.mid(0,2);
return TEMP;
}
bool TRic_sistema::leggi_marker()
{
TString16 tmp;
if (!fexist(_marker))
{
if (_disketto)
return error_box("File marker non presente sul dischetto %d: impossibile proseguire", _numdisk);
else
return error_box("File marker non presente in %s: impossibile proseguire", (const char*)_pathname);
}
FILE* i;
const word size = 64;
TString buffer(size);
if ( (i = fopen(_marker,"r+t")) != NULL)
{
const word letti = fread((char*)(const char*)buffer,sizeof(char),size,i);
_progdisk = atoi(buffer.sub(31,33));
_numtotdisk = atoi(buffer.sub(29,31));
if (_progdisk != _numdisk)
{
message_box("Il dischetto inserito non rispecchia la giusta sequenza");
_sequenza = FALSE;
fclose(i);
return TRUE;
}
else
_sequenza = TRUE;
if (letti == 0)
return error_box("Rilevati ERRORI nel file MARKER: impossibile proseguire");
_nomeid = buffer.sub(0,10);
_dittainv = atol(buffer.sub(10,14));
_totrectras = atol(buffer.sub(23,29));
_numinv = atoi(buffer.sub(14,17));
tmp = buffer.sub(17,23);
_datatras = converti(tmp);
if (_numdisk > 1) //Va fatto solo dal disco 2 in poi
if (_nomeid != _nomeidp || _dittainv != _dittainvp || _totrectras != _totrectrasp
|| _numinv != _numinvp || _datatras != _datatrasp)
return error_box("I dati del marker del disco %d, non corrispondono ai dati del marker del disco 1", _numdisk);
_nomeidp = _nomeid;
_dittainvp = _dittainv;
_totrectrasp = _totrectras;
_numinvp = _numinv;
_datatrasp = _datatras;
fclose(i);
if (_numdisk == 1) // Va fatto solo per il primo disco
{
_dittaric = leggi_tabella_tras();
if (_dittaric != 0)
{
if (!prefix().exist(_dittaric))
return error_box("Libreria archivi ditta non presente su disco");
}
else
return error_box("Codici NON PRESENTI in tabella ricezione: caricarli e riprovare");
}
return TRUE;
}
return FALSE;
}
bool TRic_sistema::main_loop()
{
TMask msk ("cg2400b");
KEY tasto;
tasto = msk.run();
if (tasto == K_ENTER)
{
componi_path(msk);
do
{
if (_disketto)
{
char drive = msk.get(F_DRIVE)[0];
if (yesno_box("Inserire il dischetto %d nell' unita' %c", _numdisk,drive))
{
if (!leggi_marker())
return FALSE;
if (_sequenza)
{
if (video_ripartenza())
ripristina_trasfer();
else
return FALSE;
set_flag();
aggiorna_tabella();
_tras_file->close(); // Chiude il trasfer letto dalla directory della ditta
_numdisk++;
}
}
else
return FALSE;
}
else
{
if (!leggi_marker())
return FALSE;
if (_sequenza)
{
if (video_ripartenza())
ripristina_trasfer();
else
return FALSE;
_tras_file->close(); // Chiude il trasfer letto da disco
set_flag();
aggiorna_tabella();
_tras_file->close(); // Chiude il trasfer letto dalla directory della ditta
_numdisk++;
}
else
return FALSE;
}
}
while (_numdisk <= _numtotdisk);
}
return FALSE;
}
void TRic_sistema::leggi_trasfer()
{
_nultras = 0;
_trasf = _tras_file->path(_dittaric);
_trasf << "\\trasfer";
_tras_file->open(_trasf);
if (_tras_file->exist())
{
if (_tras_file->read_control_rec())
{
_nultras = _tras_file->nultras();
_dataultras = _tras_file->dataultras();
//_sigle_file = _tras_file->sigle_file();
//_nrec_file = _tras_file->nrec_file();
}
}
}
bool TRic_sistema::ripartenza()
{
if (_stato_ripartenza == 1)
return error_box("Rilevato stato di RIPARTENZA CON DATI CONTRADDITORI: procedura interrotta");
if (_stato_ripartenza == 2)
return error_box("Trasferimento precedente NON COMPLETATO: completarlo prima di questo");
return TRUE;
}
bool TRic_sistema::video_ripartenza()
{
TDate dataultras;
if (_prima_volta)
{
leggi_trasfer();
_prima_volta = FALSE;
TMask msk ("cg2400a");
KEY tasto;
ditta_ricevente();
_stato_ripartenza = _tras_file->controllo_ripartenza();
msk.set(F_NOMEID, _nomeid);
msk.set(F_CODDITTAINV, _dittainv);
msk.set(F_CODDITTARIC, _dittaric);
msk.set(F_RAGSOC, _ragsoc_dittar);
msk.set(F_NULTRASDSK, _numinv);
TString data1 = _datatras.string();
msk.set(F_DATAULTRASDSK, data1);
if (_nultras != 0)
{
msk.set(F_NULTRASTAB, _nultras);
TString data2 = _dataultras.string();
msk.set(F_DATAULTRASTAB, data2);
}
else
{
msk.set(F_NULTRASTAB, _nultras_tab);
TString data2 = _dataultras_tab.string();
msk.set(F_DATAULTRASTAB, data2);
}
if (_stato_ripartenza == 1 || _stato_ripartenza == 2 )
msk.set(F_STATO, "NON COMPLETA");
else
if (_stato_ripartenza == 0)
msk.set(F_STATO, "COMPLETA");
if (_numdisk == 1) // Va fatto solo per il primo disco
{
do
{
msk.set_handler(baipassa);
tasto = msk.run();
if (tasto != K_ENTER)
return FALSE;
if (_baipassa)
return TRUE;
if (!ripartenza())
return FALSE;
if (_numinv > (_nultras_tab + 1))
warning_box("Trasferimento FUORI SEQUENZA: manca un trasferimento intermedio");
else
if (_numinv < (_nultras_tab +1))
warning_box("I dischetti risultano GIA' TRASFERITI");
else
return TRUE;
}
while (tasto == K_ENTER);
}
}
return TRUE;
}
bool TRic_sistema::baipassa(TMask& m,KEY k)
{
if (k == K_SHIFT+K_F7)
app()._baipassa = TRUE;
else
app()._baipassa = FALSE;
return FALSE;
}
void TRic_sistema::ripristina_trasfer()
{
TString ditta,app;
if (_numdisk == 1)
set_firm(_dittaric);
// app.format("%05da", _dittaric);
// ditta << "C:\\prassi\\" << app << "\\trasfer";
// fcopy(_trasfer,/*ditta*/_trasf,TRUE);
_tras_file->fcopytemp(_trasfer, _trasf, TRUE);
}
void TRic_sistema::ditta_ricevente()
{
TLocalisamfile nditte (LF_NDITTE);
nditte.setkey(1);
nditte.zero();
nditte.put(NDT_CODDITTA, _dittaric);
if (nditte.read() == NOERR)
_ragsoc_dittar = nditte.get(NDT_RAGSOC);
}
long TRic_sistema::leggi_tabella_tras()
{
TString dep;
long ditta = 0;
_tab_tra->zero();
dep = format("%10s%05d", (const char*) _nomeid, _dittainv);
_tab_tra->put("CODTAB", (const char*) dep);
if (_tab_tra->read() == NOERR)
{
ditta = _tab_tra->get_long("I0");
_nultras_tab = _tab_tra->get_int ("I1");
_dataultras_tab = _tab_tra->get_date("D0");
_agg_cau = _tab_tra->get_char("S0");
_agg_clifo = _tab_tra->get_char("S1");
_agg_pcon = _tab_tra->get_char("S2");
_agg_cls = _tab_tra->get_char("S3");
_agg_fatatt = _tab_tra->get_bool("B0");
_agg_fatpas = _tab_tra->get_bool("B1");
}
return ditta;
}
bool TRic_sistema::set_flag()
{
TString sigla;
long nrec;
int j;
int k = 0;
TString flag;
TString record;
TString ana_com,pcon_cau;
TString uselab;
bool fatto = TRUE;
TConfig conf(CONFIG_DITTA);
ana_com = conf.get("AnCfCm","cg");
pcon_cau = conf.get("PcTcCm","cg");
_tras_file->open(_trasf);
if (_tras_file->exist())
{
if (_tras_file->read_control_rec())
{
_nultras = _tras_file->nultras();
_dataultras = _tras_file->dataultras();
_sigle_file = _tras_file->sigle_file();
_nrec_file = _tras_file->nrec_file();
record = _tras_file->record();
// La fill_index e' richiamata dentro a read_control_rec
// _tras_file->fill_index(_sigle_file,_nrec_file);
}
for (j = 0; j < _sigle_file.len(); j++)
{
sigla = _sigle_file.mid(j,1);
nrec = atol(_nrec_file.mid(k,6));
if (fatto)
{
if (sigla == "W" || sigla == "P")
{
if (nrec > 0 && pcon_cau == "")
{
flag = "T";
fatto = FALSE;
}
}
else
if (sigla == "A")
{
if (nrec > 0 && ana_com == "")
{
flag = "T";
fatto = FALSE;
}
}
else
if (sigla == "Z" || sigla == "U" || sigla == "A")
{
if (nrec > 0)
{
flag = "C";
fatto = FALSE;
}
}
else
{
flag = "*";
fatto = FALSE;
}
uselab = sigla;
}
if (sigla == "W" || sigla == "P")
{
if (pcon_cau == "X")
{
_sigle_file.overwrite(" ",j);
_nrec_file.overwrite("000000",k);
}
}
if (sigla == "A")
{
if (ana_com == "X")
{
_sigle_file.overwrite(" ",j);
_nrec_file.overwrite("000000",k);
}
}
k += 6;
}
record.overwrite(_sigle_file,38);
record.overwrite(_nrec_file,47);
TString agg(7);
agg[0] = _agg_cls;
agg[1] = _agg_cau;
agg[2] = _agg_clifo;
agg[3] = _agg_pcon;
agg[4] = _agg_fatatt;
agg[5] = _agg_fatpas;
agg[6] = '\0';
record.overwrite(agg,234);
record.overwrite(uselab,240);
record.overwrite(" ",241);
const int size = 256;
if (!_tras_file->write_control_rec(record, size))
return FALSE;
}
conf.set("FlStTra", flag);
return TRUE;
}
void TRic_sistema::aggiorna_tabella()
{
TString dep;
_tab_tra->zero();
dep = format("%10s%05d", (const char*) _nomeid, _dittainv);
_tab_tra->put("CODTAB", (const char*) dep);
if (_tab_tra->read() == NOERR)
{
_tab_tra->put("I1", (long)_nultras);
_tab_tra->put("D0", _dataultras);
_tab_tra->rewrite();
}
}
bool TRic_sistema::menu(MENU_TAG m)
{
if (m == BAR_ITEM(1))
return main_loop();
return FALSE;
}
int cg2400 (int argc, char* argv[])
{
TRic_sistema a;
a.run(argc, argv,"Ricezione archivi");
return TRUE;
}