From 9241f8a5faa40dcec79ed23f138f62a9d2f7e30a Mon Sep 17 00:00:00 2001 From: nik Date: Wed, 31 May 1995 16:00:32 +0000 Subject: [PATCH] Correzioni agli invii e ricezioni git-svn-id: svn://10.65.10.50/trunk@1421 c028cbd2-c16b-5b4b-a496-9718f37d4682 --- cg/cg2400.cpp | 1193 +++++++------- cg/cg2600.cpp | 369 +++-- cg/cg2700.cpp | 2299 +++++++++++++------------- cg/cg2800.cpp | 2974 ++++++++++++++++----------------- cg/cg2800b.uml | 7 +- cg/cg2801.cpp | 31 +- cg/cg2801.h | 2 +- cg/cg2802.cpp | 2 + cg/cg2802.h | 2 +- cg/cg2803.cpp | 9 +- cg/cg2900.cpp | 4278 ++++++++++++++++++++++++------------------------ cg/cglib04.cpp | 12 +- cg/cglib04.h | 1 + 13 files changed, 5772 insertions(+), 5407 deletions(-) diff --git a/cg/cg2400.cpp b/cg/cg2400.cpp index 375b37b1d..4687896b2 100755 --- a/cg/cg2400.cpp +++ b/cg/cg2400.cpp @@ -1,585 +1,608 @@ -// Ricezione dati da sistema - -#include -#include -#include -#include -#include -#include -#include - -#include - -#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; -} +// Ricezione dati da sistema + +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "cglib04.h" + +//#include "ba7.h" +#include "cg2400.h" + +class TRic_sistema : public TApplication +{ + TTable* _tab_tra; + TTransfer_file* _tras_file; + TLocalisamfile* _mov; + TLocalisamfile* _rmov; + TLocalisamfile* _rmoviva; + + 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,_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(); + + _mov = new TLocalisamfile (LF_MOV); + _rmov = new TLocalisamfile (LF_RMOV); + _rmoviva = new TLocalisamfile (LF_RMOVIVA); + + _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; + + delete _mov; + delete _rmov; + delete _rmoviva; + + 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()._stato_ripartenza == 0) ) + 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; + bool agg_fatatt,agg_fatpas; + + _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"); + if (agg_fatatt) + _agg_fatatt = 'X'; + else + _agg_fatatt = ' '; + + agg_fatpas = _tab_tra->get_bool("B1"); + if (agg_fatpas) + _agg_fatpas = 'X'; + else + _agg_fatpas = ' '; + } + + 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 == "B") + { + if (nrec > 0) + { + flag = "C"; + fatto = FALSE; + } + } + else + { + flag = "*"; + fatto = FALSE; + } + + if (flag == "T") + uselab = sigla; + else + uselab = ""; + } + + 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; +} diff --git a/cg/cg2600.cpp b/cg/cg2600.cpp index dcac46f64..fdfffe8ca 100755 --- a/cg/cg2600.cpp +++ b/cg/cg2600.cpp @@ -19,6 +19,7 @@ #include #include #include +#include #include "cglib04.h" #include "cglib.h" @@ -35,6 +36,7 @@ class TRic_tab : public TApplication { TTable* _tab_tra; + TLocalisamfile* _mov, *_rmov, *_rmoviva; TTransfer_file _tras_file; TArray _aggiorna; char _scelta; @@ -67,24 +69,29 @@ public: void setta_parametri_record(const TString& sigla,const TString& flag); + const char* numero_civico(TString& field); + const char* cerca_comune_cap(TString& field); + const char* cerca_comune_den(TString& field); + void trasferimento(); void scrivi_record_tab(TString& record,long rec); int trasfer_data_tab(TLocalisamfile& file, TRectype& dep, const TString& sigla); int trasfer_data_conto(TLocalisamfile& file, TRectype& dep); int trasfer_data_sottoc(TLocalisamfile& file, TRectype& dep); + void decimali(TString& campo, int dec); void scrivi_record_mov(TString& record,long rec); int trasfer_data_mov(TLocalisamfile& file, TRectype& dep); long esiste_numreg(long nreg); void num_protocollo(TString& record); - void controlli_prima_nota(TString& record); - long ulnumprot_reg(int anno,char codreg); + void controlli_prima_nota(TString& record,TString& codreg); + long ulnumprot_reg(int anno,TString& codreg); long ultima_registrazione(); - void aggiorna_reg(int anno,char codreg,long ulnum); + void aggiorna_reg(int anno,TString& codreg,long ulnum); int annoes_datacomp(const TString& record,TDate& datacomp); void datafine_esprec(const int annop,TDate& datacomp); - char ricerca_causale(const TString& field); + char ricerca_causale(TString& field); void prepara_saldi(const TString& fname,const TString& field); void scrivi_record_moviva(TString& record,long rec); @@ -121,6 +128,9 @@ bool TRic_tab::create() TApplication::create(); _tab_tra = new TTable ("%TRA"); + _mov = new TLocalisamfile (LF_MOV); + _rmov = new TLocalisamfile (LF_RMOV); + _rmoviva = new TLocalisamfile (LF_RMOVIVA); _numrec = 1; _prima_volta = TRUE; @@ -137,7 +147,10 @@ bool TRic_tab::create() bool TRic_tab::destroy() { - delete _tab_tra; + delete _tab_tra; + delete _mov; + delete _rmov; + delete _rmoviva; return TApplication::destroy(); } @@ -180,6 +193,60 @@ const char* TRic_tab::riconverti (TString& data_PC) return TEMP; } +const char* TRic_tab::numero_civico(TString& indirizzo) +{ + int i; + + for (i = indirizzo.len(); (indirizzo[i] != ' ' && indirizzo[i] != ',' && i > 0); i--); + + if (i > 0) + { + TEMP = indirizzo.mid(i+1); + indirizzo = indirizzo.sub(0,i); + } + else + TEMP = ""; + + return TEMP; +} + +const char* TRic_tab::cerca_comune_cap(TString& field) +{ + TLocalisamfile comuni (LF_COMUNI); + TString cap = field; + + if (cap.sub(2,3) == "1") + { + cap = cap.sub(0,3); + cap << "00"; + } + + comuni.setkey(3); + comuni.zero(); + comuni.put(COM_CAPCOM, cap); + if (comuni.read() == NOERR) + TEMP = comuni.get(COM_COM); + else + TEMP = ""; + + return TEMP; +} + +const char* TRic_tab::cerca_comune_den(TString& field) +{ + TLocalisamfile comuni (LF_COMUNI); + + comuni.setkey(2); + comuni.zero(); + comuni.put(COM_DENCOM, field); + if (comuni.read() == NOERR) + TEMP = comuni.get(COM_COM); + else + TEMP = ""; + + return TEMP; +} + bool TRic_tab::main_loop() { int posiz; @@ -187,7 +254,7 @@ bool TRic_tab::main_loop() _dittaric = get_firm(); if (_scelta == 'T') - { + { if (video()) { if (_std == "") @@ -307,7 +374,7 @@ void TRic_tab::trasferimento() void TRic_tab::scrivi_record_tab(TString& record,long rec) { - TString sigla,key,str; + TString sigla,key,str,numero,comune; int numfield = 2; //Per le tabelle il primo campo della mappa non e' significativo //ai fini del trasferimento (flag di record gia trasferito). TMappa_trc& trc = _tras_file.mappa(); @@ -318,6 +385,7 @@ void TRic_tab::scrivi_record_tab(TString& record,long rec) int campi_righe = 0; int num_riga = 1; TToken_string data; + TString cap = ""; sigla = record.mid(0,2); gia_trasf = record.mid(255,1)[0]; @@ -342,8 +410,11 @@ void TRic_tab::scrivi_record_tab(TString& record,long rec) trasfer_data_tab(*file, *dep, sigla); delete file; delete dep; - } - + } + + if ( (logicnum == LF_RCAUSALI) && (_tras_file.flg_agg() == 'D') ) + break; + file = new TLocalisamfile(logicnum); dep = new TRectype (logicnum); dep->zero(); @@ -368,7 +439,10 @@ void TRic_tab::scrivi_record_tab(TString& record,long rec) dep->put("NRIGA", num_riga++); trasfer_data_tab(*file, *dep, sigla); - } + } + else + num_riga++; + campi_righe = 1; } } @@ -381,13 +455,33 @@ void TRic_tab::scrivi_record_tab(TString& record,long rec) //Il nostro codice registro IVA e' lungo 3: se il loro registro (lungo 1) e' alfanumerico //devo allinearlo a sinistra, mentre se e' numerico devo allinearlo a destra riempendolo con degli zero. - if (logicnum == LF_CAUSALI && fname == "REG") - { - char f = field[0]; - if (isdigit(f)) - field.format("%03c", f); - else - field.format("%-3c", f); + if (logicnum == LF_CAUSALI) + { + if (fname == "REG") + { + char f = field[0]; + if (isdigit(f)) + field.format("%03c", f); + else + field.format("%-3c", f); + } + + if (fname == "M770") + if (field == "0") + field = " "; + + if (fname == "NUMDOC" || fname == "DATADOC") + { + if (field == "0") + field = " "; + else + if (field == "1") + field = "X"; + } + + if (fname == "CODCAUSIM") + if (field == "000") + field = " "; } //Il tipo cliente/fornitore presente su AS400 puo' assumere come valori 1 o 2 @@ -424,22 +518,90 @@ void TRic_tab::scrivi_record_tab(TString& record,long rec) else field.format("%-4s", (const char*) f); } + + if (fname == "INDCF") + { + field = field.rtrim(); + if (field != "") + { + numero = numero_civico(field); + dep->put(CLI_CIVCF, (const char*)numero); + } + } + + if (fname == "CAPCF") + { + if (field == "00000") + field = " "; + else + cap = field; + } + + if (fname == "LOCALITACF") + { + comune = ""; + + if (cap.not_empty()) + comune = cerca_comune_cap(cap); + if (comune.empty()) + comune = cerca_comune_den(field); + if (comune.not_empty()) + { + dep->put(CLI_COMCF, comune); + field = ""; + } + } + + if (fname == "ALLEG") + if (field == "0") + field = " "; + + if (fname == "PAIV") + if (field == "00000000000") + field = " "; } - if (flag) + if (flag && (_tras_file.flg_agg() == 'D') ) { data = ""; data.add(fname); data.add(field); _aggiorna.add(data); + + if (sigla == "A1" && fname == "INDCF") + { + data = ""; + data.add("CIVCF"); + data.add(numero); + + _aggiorna.add(data); + } + + if (sigla == "A1" && fname == "LOCALITACF") + { + data = ""; + data.add("COMCF"); + data.add(comune); + + _aggiorna.add(data); + } } //Quando ricevo la IV direttiva del piano dei conti per evitare che nell'archivio, //in caso di numero romano vuoto, venga memorizzato la stringa letta sul trasfer ("000"), //vuoto la stringa prima di fare la put. if (sigla == "P2" || sigla == "P3") - { + { + if (fname == "STSOTTBIL") + { + if (field == "0") + field = "X"; + else + if (field == "1") + field = " "; + } + if (fname == "NUMRIVD" || fname == "NUMRIVDOPP") { if (field == "000") @@ -450,7 +612,8 @@ void TRic_tab::scrivi_record_tab(TString& record,long rec) if (field == " ") field = "0"; } - } + } + dep->put(fname, (const char*)field); numfield++; @@ -459,23 +622,29 @@ void TRic_tab::scrivi_record_tab(TString& record,long rec) while (trc.is_key((const char*) key)); if (logicnum == LF_RCAUSALI) - { - campi_righe++; - - if (campi_righe == CAMPI_RCAUS) + { + if (_tras_file.flg_agg() != 'D') { - TString16 gruppo(dep->get("GRUPPO")); - // - // scarta le righe non significative - // -------------------- NB ----------------------- - // supponiamo il GRUPPO INDISPENSABILE !!!!!!!!!!!!! - // - if (gruppo.not_empty()) + campi_righe++; + + if (campi_righe == CAMPI_RCAUS) { - dep->put("NRIGA", num_riga++); - trasfer_data_tab(*file, *dep, sigla); - } - campi_righe = 1; + TString16 gruppo(dep->get("GRUPPO")); + // + // scarta le righe non significative + // -------------------- NB ----------------------- + // supponiamo il GRUPPO INDISPENSABILE !!!!!!!!!!!!! + // + if (gruppo.not_empty()) + { + dep->put("NRIGA", num_riga++); + trasfer_data_tab(*file, *dep, sigla); + } + else + num_riga++; + + campi_righe = 1; + } } } else @@ -528,15 +697,19 @@ int TRic_tab::trasfer_data_tab(TLocalisamfile& file, TRectype& dep, const TStrin file.rewrite(); } if (flag == 'D') - { - for (int i = 0; i < _aggiorna.items(); i++) + { + if (file.num() != LF_RCAUSALI) { - TToken_string& data = (TToken_string&)_aggiorna[i]; - TString fname = data.get(0); - TString field = data.get(1); - file.put(fname,field); + for (int i = 0; i < _aggiorna.items(); i++) + { + TToken_string& data = (TToken_string&)_aggiorna[i]; + TString fname = data.get(0); + TString field = data.get(1); + file.put(fname,field); + } + file.rewrite(); + _aggiorna.destroy(); } - file.rewrite(); } } else @@ -755,35 +928,23 @@ void TRic_tab::num_protocollo(TString& record) _nuprotiva = _uprotiva; } -long TRic_tab::ulnumprot_reg(int anno,char codreg) +long TRic_tab::ulnumprot_reg(int anno,TString& cr) { - /* - TTable reg ("REG"); - TString16 dep; - long num = 0; - - dep.format("%04d%s", anno,(const char*) codreg); - - reg.zero(); - reg.put("CODTAB", (const char*) dep); - if (reg.read() == NOERR) - num = reg.get_long("I5"); - */ - TString cr = format("%c", codreg); + //TString cr = format("%c", codreg); TRegistro rg (cr, anno); return rg.protocol(); } -void TRic_tab::aggiorna_reg(int anno,char codreg,long ulnum) +void TRic_tab::aggiorna_reg(int anno,TString& codreg,long ulnum) { TTable reg ("REG"); TString16 dep; - if (isdigit(codreg)) - dep.format("%04d%03c", anno,codreg); + if (real::is_natural(codreg)) + dep.format("%04d%03s", anno,(const char*) codreg); else - dep.format("%04d%-3c", anno,codreg); + dep.format("%04d%-3s", anno,(const char*) codreg); reg.zero(); reg.put("CODTAB", (const char*) dep); @@ -799,20 +960,16 @@ void TRic_tab::aggiorna_reg(int anno,char codreg,long ulnum) } } -void TRic_tab::controlli_prima_nota(TString& record) +void TRic_tab::controlli_prima_nota(TString& record,TString& codreg) { TTable tpd ("%TPD"); bool corrisp; TDate datareg; int anno; - long ulnum; + long ulnum = 0; TString16 tmp; - char codreg; TString tipodoc; - // char codreg = record.sub(35,36)[0]; - // TString tipodoc = record.sub(220,222); - int tiporeg = atoi(record.sub(222,223)); TString80 tmpmov = "%"; @@ -825,8 +982,8 @@ void TRic_tab::controlli_prima_nota(TString& record) tmp_mov.put(MOV_NUMREG, _numreg); if (tmp_mov.read() == NOERR) { - codreg = tmp_mov.get_char(MOV_REG); - tipodoc = tmp_mov.get (MOV_TIPODOC); + codreg = tmp_mov.get(MOV_REG); + tipodoc = tmp_mov.get(MOV_TIPODOC); } tmp = record.sub(15,21); @@ -842,7 +999,7 @@ void TRic_tab::controlli_prima_nota(TString& record) if (tpd.read() == NOERR) corrisp = tpd.get_bool("B0"); - if (codreg != ' ' && !corrisp) + if (codreg != "" && !corrisp) { if ( ( (tiporeg == 1 && (numprot_att || _protiva == 0) ) ) || ( (tiporeg == 2 && (numprot_pas || _protiva == 0) ) ) ) @@ -904,18 +1061,19 @@ long TRic_tab::ultima_registrazione() return _nreg; } -char TRic_tab::ricerca_causale(const TString& causale) +char TRic_tab::ricerca_causale(TString& causale) { TLocalisamfile cau (LF_CAUSALI); - TString codcau; char movap = ' '; - long caus = atol(causale); - codcau.format("%03d", caus); + if (real::is_natural(causale)) + causale.format("%03s", (const char*) causale); + else + causale.format("%-3s", (const char*) causale); cau.setkey(1); cau.zero(); - cau.put("CODCAUS", codcau); + cau.put("CODCAUS", causale); if (cau.read() == NOERR) movap = cau.get_char("MOVAP"); @@ -946,7 +1104,7 @@ void TRic_tab::prepara_saldi(const TString& fname,const TString& field) void TRic_tab::scrivi_record_mov(TString& record,long rec) { - TString sigla,key,str; + TString sigla,key,str,codreg; int numfield = 3; //Per i movimenti i primi due campi della mappa non sono significativi //ai fini del trasferimento (flag record gia trasferito e nuovo ultimo numero di registrazione). TMappa_trc& trc = _tras_file.mappa(); @@ -987,7 +1145,7 @@ void TRic_tab::scrivi_record_mov(TString& record,long rec) numulreg = ultima_registrazione(); //reperisco il numero ultima registrazione _nreg = esiste_numreg(numulreg); num_protocollo(record); - controlli_prima_nota(record); + controlli_prima_nota(record,codreg); } else { @@ -1043,18 +1201,25 @@ void TRic_tab::scrivi_record_mov(TString& record,long rec) TString fname = trc.field_name(key); TString field = record.sub(from-1,to); int flag = trc.flag(key); - - //Il nostro codice registro IVA e' lungo 3: se il loro registro (lungo 1) e' alfanumerico - //devo allinearlo a sinistra, mentre se e' numerico devo allinearlo a destra riempendolo con degli zero. + int dec = trc.flag_bis(key); + + if (flag == 3) + { + if (dec > 0) + decimali(field,dec); + + real appoggio (field); + field = appoggio.string(); + } + if (logicnum == LF_MOV) { if (fname == "REG") { - char f = field[0]; - if (isdigit(f)) - field.format("%03c", f); + if (real::is_natural(codreg)) + field.format("%03s", (const char*) codreg); else - field.format("%-3c", f); + field.format("%-3s", (const char*) codreg); } //Il codice pagamento su AS400 e' un alfanumerico di due, mentre su PC e' un @@ -1098,7 +1263,7 @@ void TRic_tab::scrivi_record_mov(TString& record,long rec) _sld.set_movap(TRUE); } - if (logicnum == LF_MOV && (fname == "NUMREG" || flag == 1) ) + if (logicnum == LF_MOV && (fname == "NUMREG" || flag == 2) ) { if (fname == "NUMREG") { @@ -1107,7 +1272,7 @@ void TRic_tab::scrivi_record_mov(TString& record,long rec) dep->put(MOV_DATAREG, _datareg); dep->put(MOV_DATACOMP, datacomp); } - if (flag == 1) + if (flag == 2) { TString f = converti(field); dep->put(fname,f); @@ -1129,7 +1294,7 @@ void TRic_tab::scrivi_record_mov(TString& record,long rec) } } else - dep->put(fname, (const char*)field); + dep->put(fname, field); numfield++; key.format("%2s%d", (const char*) sigla,numfield); @@ -1393,6 +1558,13 @@ void TRic_tab::salva_dati_testata() _tras_file.write(numrec); } +void TRic_tab::decimali(TString& campo, int dec) +{ + int l = campo.len(); + int p = l - dec; + campo.insert(".",p); +} + void TRic_tab::scrivi_record_moviva(TString& record,long rec) { TString sigla,key,str; @@ -1476,20 +1648,23 @@ void TRic_tab::scrivi_record_moviva(TString& record,long rec) TString fname = trc.field_name(key); TString field = record.sub(from-1,to); int flag = trc.flag(key); + int dec = trc.flag_bis(key); - if (logicnum == LF_MOV && fname == "CAMBIOI" && flag == 5) + if (logicnum == LF_MOV && fname == "TOTDOC") { - int l = field.len(); - int p = l - flag; - field.insert(".",p); + numfield++; + key.format("%2s%d", (const char*) sigla,numfield); + continue; } - if (logicnum == LF_MOV && fname == "CORRVALUTA" && flag == 5) + if (flag == 3) { - int l = field.len(); - int p = l -flag; - field.insert(".",p); - } + if (dec > 0) + decimali(field,dec); + + real appoggio (field); + field = appoggio.string(); + } if (logicnum == LF_MOV && ( fname == "NUMREG" || flag == 1 ) ) { @@ -1510,7 +1685,7 @@ void TRic_tab::scrivi_record_moviva(TString& record,long rec) dep->put("NUMREG", _nreg); } else - dep->put(fname, (const char*)field); + dep->put(fname, field); numfield++; key.format("%2s%d", (const char*) sigla,numfield); @@ -1551,7 +1726,6 @@ int TRic_tab::trasfer_data_moviva(TLocalisamfile& file, TRectype& dep, int ln) TDate data74ter (dep.get_date(MOV_DATA74TER)); TString codval (dep.get (MOV_CODVAL)); long codcf = dep.get_long(MOV_CODCF); - real totdoc (dep.get_real(MOV_TOTDOC)); real cambioi (dep.get_real(MOV_CAMBIOI)); real corrlire (dep.get_real(MOV_CORRLIRE)); real corrvaluta(dep.get_real(MOV_CORRVALUTA)); @@ -1559,7 +1733,6 @@ int TRic_tab::trasfer_data_moviva(TLocalisamfile& file, TRectype& dep, int ln) file.put(MOV_DATA74TER, data74ter); file.put(MOV_CODVAL, codval); file.put(MOV_CODCF, codcf); - file.put(MOV_TOTDOC, totdoc); file.put(MOV_CAMBIOI, cambioi); file.put(MOV_CORRLIRE, corrlire); file.put(MOV_CORRVALUTA,corrvaluta); diff --git a/cg/cg2700.cpp b/cg/cg2700.cpp index 86d860007..6e98ff151 100755 --- a/cg/cg2700.cpp +++ b/cg/cg2700.cpp @@ -1,1122 +1,1177 @@ -// -// Ricezione dati: lista controllo movimenti -// -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -#include "cg2103.h" -#include "cglib04.h" -#include "cg2700.h" - -HIDDEN const char* err_msg[] = {"*** Data operazione non valida", - "--- Data operazione non compresa in alcun esercizio", - "*** Data competenza non valida", - "--- Data competenza non compresa in alcun esercizio", - "--- Data competenza incompatibile con data operazione", - "*** Data operazione antecedente ad ultima stampa giornale", - "--- Data documento non valida", - "*** Codice causale non valido o non presente in archivio", - "--- Codice pagamento non valido o non presente in tabella", - "*** Codice registro IVA non valido o non presente in tabella", - "*** Codice cliente/fornitore non valido o non presente in anagrafica", - "--- Data 74 ter non valida", - "*** Data operazione antecedente ad ultima stampa registro IVA"}; - -HIDDEN int date2esc(const TDate& d, int* prevesc = NULL); - -class TRic_ListaMov : public TPrintapp -{ - TTable* _tab_tra,* _tab_pag,* _tab_tpd,* _tab_iva; - TIsamtempfile* _tmov,* _trmov,* _tiva; - TLocalisamfile* _caus,* _ditte,* _clifo,* _pcon; - TRelation* _rel; - TCursor* _cur; - TTransfer_file* _trasfer; - TLibro_giornale* _giornale; - TString80 _pathfile, _descr_causale, _descr_conto; - TString16 _causale, _registro, _numdoc, _tipodoc, _codval; - TString16 _codpag, _codiva, _tipo_conto; - TString _record; - bool _mov_sez, _errore_grave, _esiste_conto, _esiste_causale; - char _sdt, _sezione; - int _ae, _anno, _gruppo, _conto, _tipocr, _tipod, _tiporeg; - int _gruppoc, _contoc, _n_rec, _gruppocr, _contocr; - TDate _datacomp, _datadoc, _datareg, _data74tr; - real _importo, _impo, _impos, _tot_dare, _tot_avere, _tot_doc; - long _codcf, _numero, _protiva, _sottoconto; - long _inizioZ, _inizioU, _num_rec, _sottocontoc, _sottocontocr; - TBit_array _err; - byte _controllo; - -public: - virtual bool set_print(int m); - virtual bool user_create() ; - virtual bool user_destroy(); - virtual bool preprocess_page(int,int); - virtual print_action postprocess_page(int,int); - virtual void postclose_print(); - const char* look_sdt(); - const char* get_codiva_des(const char*); - bool DescrConto(int,int,long); - bool check_archivi(TProgind*); - bool look_pag(); - bool errori_partita(int,int,long); - bool controlla_mov(); - bool controlla_rmov(); - bool controlla_riva(); - void stampa_errori_mov(int); - void stampa_errori_rmov(int); - void stampa_errori_riva(int); - void aggiorna_trasfer_Z(); - void aggiorna_trasfer_U(); - void setta_parametri(const TString&, const TString&); - void setta_intestazione(); - TLibro_giornale& giornale() { return *_giornale; } - TTransfer_file& trasfer() { return *_trasfer; } - - TRic_ListaMov(): _err(80) {} - virtual ~TRic_ListaMov() {} -}; - -HIDDEN inline TRic_ListaMov& app() { return (TRic_ListaMov&)main_app();} - -HIDDEN int date2esc(const TDate& d, int* prevesc) -{ - if (prevesc) *prevesc = 0; - TTable esc("ESC"); - for (int err = esc.first(); err == NOERR; err = esc.next()) - { - const TDate ia(esc.get("D0")); // Data inizio esercizio - const TDate fa(esc.get("D1")); // Data fine esercizio - const anno = esc.get_int("CODTAB"); - if (d >= ia && d <= fa) - return anno; - if (prevesc) *prevesc = anno; - } - return 0; -} - -const char* TRic_ListaMov::look_sdt() -{ - TConfig conf(CONFIG_DITTA); - return conf.get("FlStTra"); -} - -bool TRic_ListaMov::look_pag() -{ - TTable t ("%CPG"); - t.zero(); - t.put("CODTAB",_codpag); - if (t.read() != NOERR) return FALSE; - return TRUE; -} - -const char* TRic_ListaMov::get_codiva_des(const char* codiva) -{ - TTable iva ("%IVA"); - - iva.zero(); - iva.put("CODTAB", codiva); - if (iva.read() == NOERR) - return iva.get("S0"); - else - return NULL; -} - -bool TRic_ListaMov::DescrConto(int g, int c, long s) -{ - TString80 ragsoc; - const char* descr = NULL; - TLocalisamfile pconti (LF_PCON); - pconti.setkey(1); - pconti.zero(); - pconti.put(PCN_GRUPPO, g); - pconti.put(PCN_CONTO, c); - pconti.put(PCN_SOTTOCONTO, 0L); - if (pconti.read() == NOERR) - { - _tipo_conto = pconti.get(PCN_TMCF); - if (_tipo_conto == "C" || _tipo_conto == "F") - { - TLocalisamfile clifo (LF_CLIFO); - clifo.setkey(1); - clifo.zero(); - clifo.put(CLI_TIPOCF, _tipo_conto); - clifo.put(CLI_CODCF, s); - if (clifo.read() != NOERR) - { - _descr_conto = ""; - return FALSE; - } - else - { - char tipoa = clifo.get_char("TIPOAPER"); - if (tipoa == 'F') //persona fisica - { - TString80 cognome, nome; - ragsoc = clifo.get("RAGSOC"); - cognome = ragsoc.mid(0,30); - nome = ragsoc.mid(30,20); - cognome.trim(); nome.trim(); - ragsoc = cognome; - ragsoc << " " << nome; - _descr_conto = ragsoc; - } - else _descr_conto = clifo.get("RAGSOC"); - } - } - else - { - pconti.zero(); - pconti.put(PCN_GRUPPO, g); - pconti.put(PCN_CONTO, c); - pconti.put(PCN_SOTTOCONTO, s); - if (pconti.read() != NOERR) - { - _descr_conto = ""; - return FALSE; - } - else _descr_conto = pconti.get(PCN_DESCR); - } - } - else - { - _descr_conto = ""; - return FALSE; - } - return TRUE; -} - -bool TRic_ListaMov::user_create() -{ - _trasfer = new TTransfer_file(); - - TProgind* pnd = NULL; - pnd = new TProgind (3,"Controllo archivi\nPrego attendere", - FALSE, TRUE, 30); - _tab_tra = new TTable ("%TRA"); - _tab_tpd = new TTable ("%TPD"); - _tab_pag = new TTable ("%CPG"); - _tab_iva = new TTable ("%IVA"); - _caus = new TLocalisamfile (LF_CAUSALI); - _ditte = new TLocalisamfile (LF_NDITTE); - _clifo = new TLocalisamfile (LF_CLIFO); - _pcon = new TLocalisamfile (LF_PCON); - - if (pnd) pnd->addstatus(1); - - if (!check_archivi(pnd)) - { - delete pnd; - return FALSE; - } - - if (pnd) pnd->addstatus(1); - - TString80 tmpmov = "%"; - tmpmov << get_firm_dir(); - tmpmov << "\\" << TEMP_MOV; - TString80 tmprmov = "%"; - tmprmov << get_firm_dir(); - tmprmov << "\\" << TEMP_RMOV; - TString80 tmprmoviva = "%"; - tmprmoviva << get_firm_dir(); - tmprmoviva << "\\" << TEMP_RMOVIVA; - - _tmov = new TIsamtempfile(LF_MOV, tmpmov, 0); - _trmov = new TIsamtempfile(LF_RMOV, tmprmov, 0); - _tiva = new TIsamtempfile(LF_RMOVIVA, tmprmoviva, 0); - - _rel = new TRelation(_tmov); - _rel->add(_trmov,"NUMREG=NUMREG",1,0,0,FALSE); - _rel->add(_tiva, "NUMREG=NUMREG",1,0,0,FALSE); - _cur = new TCursor (_rel, "", 1); - - _giornale = new TLibro_giornale(); - - add_cursor(_cur); - - add_file (LF_MOV); - add_file (LF_RMOV, LF_MOV); - add_file (LF_RMOVIVA, LF_MOV); - - printer().footerlen(5); - - delete pnd; - - return TRUE; -} - -bool TRic_ListaMov::check_archivi(TProgind* pnd) -{ - TString80 nome; - long ditta_ric = get_firm(); - - if (!prefix().exist(ditta_ric)) - return error_box("Rilevati errori gravi negli archivi: procedura interrotta"); - - TTransfer_file& tr = trasfer(); - - _pathfile = tr.path(); - - _pathfile = _pathfile << "\\trasfer"; - - if (!tr.open(_pathfile)) - return error_box("Al momento non presenti trasferimenti attivi sulla ditta selezionata"); - - if (!tr.read_control_rec()) - return error_box("Rilevati errori gravi negli archivi: procedura interrotta"); - else _record = tr.record(); - - TString16 sd = look_sdt(); - - if (sd.not_empty()) - _sdt = sd[0]; - else return error_box("Ricezione tabelle non effettuata: richiamare il programma relativo"); - - if (_sdt == 'T') - return error_box("Ricezione tabelle non effettuata: richiamare il programma relativo"); - - if (_sdt == 'M') - return yesno_box("Controllo gia' effettuato: si desidera ripeterlo ?"); - - if (_sdt != '*' && _sdt != 'C') - return error_box("Rilevati errori gravi negli archivi: procedura interrotta"); - - TString16 ult = tr.ult_file(); - TString16 key = tr.key(); - - ult.strip_spaces(); - key.strip_spaces(); - - if (_sdt == 'C') - if ( ult.not_empty() || key.not_empty() ) - return error_box("Rilevati errori gravi negli archivi: procedura interrotta"); - - if (_sdt == '*') - return warning_box("Trasferimento interamente completato: proseguire per cancellare i file"); - - if (pnd) pnd->addstatus(1); - - return TRUE; -} - -void TRic_ListaMov::stampa_errori_mov(int riga) -{ - long i = _err.first_one(); - if (i != -1) - { - for (; i <= _err.last_one(); i++) - if (_err[i]) - set_row(++riga, "@8g%s", (const char*) err_msg[i]); - } -} - -bool TRic_ListaMov::controlla_mov() -{ - bool check_reg = TRUE; - TString16 causreg; - TDate udata; - char tipocf; - - _tiporeg = 0; - - if (!_datareg.ok()) - { - _errore_grave = TRUE; - _err.set(0L); - } - - if (_datareg.ok()) - { - int pr; - const int ar = date2esc(_datareg, &pr); // Esercizio in corso - if (ar == 0) - _err.set(1); - if (_datacomp.ok()) - { - const int ae = date2esc(_datacomp); - if (ae == 0) - _err.set(3); - else if (ae != ar && ae != pr && ar) - _err.set(4); - } - } - - if (!_datacomp.ok()) - { - _errore_grave = TRUE; - _err.set(2); - } - - TLibro_giornale& gio = giornale(); - bool ok = gio.read(_ae); //se _ae e' zero la read considera come anno quello corrente - if (_datareg < gio.last_print()) - { - _errore_grave = TRUE; - _err.set(5); - } - - TString16 dd = _datadoc.string(); - if (dd.not_empty()) - if (!_datadoc.ok()) - _err.set(6); - - //if (_causale.not_empty()) - //{ - TLocalisamfile caus(LF_CAUSALI); - caus.setkey(1); - caus.zero(); - caus.put(CAU_CODCAUS,_causale); - if (caus.read() == NOERR) - { - _esiste_causale = TRUE; - _tipodoc = caus.get(CAU_TIPODOC); - } - else - { - caus.zero(); - _esiste_causale = FALSE; - if (look_causale(_causale)) //se la causale e' significativa - { - _errore_grave = TRUE; - _err.set(7); - } - } - //_tipodoc = caus.get(CAU_TIPODOC); ho sempre quello letto sul movimento! - causreg = caus.get(CAU_REG); - _descr_causale = caus.get(CAU_DESCR); - _mov_sez = caus.get_bool(CAU_MOVSEZ); - //} - - if (!_codpag.blank()) - { - bool ok = look_pag(); - if (!ok) - _err.set(8); - } - - if (!_registro.blank()) //movimento iva (fattura) - { - if (!look_causale(_causale)) //se la causale non e' significativa - { - _errore_grave = TRUE; - check_reg = FALSE; - _err.set(9); - } - if (check_reg && _ae) - { - TRegistro rg (_registro, _ae); - if (rg.name().empty()) - { - _errore_grave = TRUE; - check_reg = FALSE; - _err.set(9); - } - else - { - _tiporeg = rg.tipo(); - udata = rg.last_print(); - } - } - } - else if (!causreg.blank() && _ae) - { - TRegistro rg (causreg, _ae); - if (rg.name().empty()) - { - _errore_grave = TRUE; - check_reg = FALSE; - _err.set(9); - } - else - { - _tiporeg = rg.tipo(); - udata = rg.last_print(); - } - _registro = causreg; - } - - if (check_reg && !_registro.blank()) - { - if (_tiporeg == 1) tipocf = 'C'; - else if (_tiporeg == 2) tipocf = 'F'; - if (_tiporeg != 0 && !_tipodoc.blank()) //se esiste, uso quello della causale!!! - { - TTable tabtpd("%TPD"); - tabtpd.put("CODTAB", _tipodoc); - if (tabtpd.read() == NOERR) - { - bool cor = tabtpd.get_bool("B0"); - if (!cor) - if (_codcf != 0l) - { - TLocalisamfile clifo(LF_CLIFO); - clifo.zero(); - clifo.put(CLI_CODCF, _codcf); - clifo.put(CLI_TIPOCF,tipocf); - if (clifo.read() != NOERR) - { - _errore_grave = TRUE; - _err.set(10); - } - } - else - { - _errore_grave = TRUE; - _err.set(10); - } - } - } - } - - TString16 d74 = _data74tr.string(); - if (d74.not_empty()) - if (!_data74tr.ok()) - _err.set(11); - - if (!_registro.blank() && check_reg) - if (_datareg < udata) - { - _errore_grave = TRUE; - _err.set(12); - } - - if (_err.ones()) - return TRUE; - - return FALSE; -} - -bool TRic_ListaMov::errori_partita(int g, int c, long s) -{ - TLocalisamfile pconti (LF_PCON); - pconti.setkey(1); - pconti.zero(); - pconti.put(PCN_GRUPPO, g); - pconti.put(PCN_CONTO, c); - pconti.put(PCN_SOTTOCONTO, 0L); - if (pconti.read() == NOERR) - { - char tipo = pconti.get(PCN_TMCF)[0]; - if (tipo == 'C' || tipo == 'F') - { - TLocalisamfile clifo (LF_CLIFO); - clifo.setkey(1); - clifo.zero(); - clifo.put(CLI_TIPOCF, tipo); - clifo.put(CLI_CODCF, s); - if (clifo.read() != NOERR) - return FALSE; - } - else - { - pconti.zero(); - pconti.put(PCN_GRUPPO, g); - pconti.put(PCN_CONTO, c); - pconti.put(PCN_SOTTOCONTO, s); - if (pconti.read() != NOERR) - return FALSE; - } - } - else return FALSE; - - return TRUE; -} - -bool TRic_ListaMov::controlla_rmov() -{ - TLocalisamfile& rmov = current_cursor()->file(LF_RMOV); - int gruppo, conto, gruppoc, contoc; - long sottoconto, sottocontoc; - char sezione; - real importo, dare, avere; - - if (current_cursor()->is_first_match(LF_RMOV)) - { - dare = avere = ZERO; - TRecnotype nrec = rmov.recno(); - rmov.zero(); - rmov.setkey(1); - rmov.put(RMV_NUMREG, _numero); - TRectype recc (rmov.curr()); - for (rmov.read(_isgteq); !rmov.eof() ;rmov.next()) - { - TRectype rec (rmov.curr()); - if (rec > recc) break; - gruppo = rec.get_int(RMV_GRUPPO); - conto = rec.get_int(RMV_CONTO); - sottoconto = rec.get_long(RMV_SOTTOCONTO); - gruppoc = rec.get_int(RMV_GRUPPOC); - contoc = rec.get_int(RMV_CONTOC); - sottocontoc = rec.get_long(RMV_SOTTOCONTOC); - sezione = rec.get_char(RMV_SEZIONE); - importo = rec.get_real(RMV_IMPORTO); - - if (sezione == 'D') - dare += importo; - if (sezione == 'A') - avere += importo; - - if (gruppo == 0 || conto == 0 || sottoconto == 0l) - { - rmov.readat(nrec); - return TRUE; - } - else - { - bool ok = errori_partita(gruppo,conto,sottoconto); - if (!ok) - { - rmov.readat(nrec); - return TRUE; - } - } - - if ( (importo == ZERO && sezione != ' ') || - (sezione != 'D' && sezione != 'A') ) - { - rmov.readat(nrec); - return TRUE; - } - - /* - if (gruppoc == 0 || contoc == 0 || sottocontoc == 0l) - { - rmov.readat(nrec); - return TRUE; - } - else - */ - if (gruppoc != 0 || contoc != 0 || sottocontoc != 0l) - { - bool ok = errori_partita(gruppoc,contoc,sottocontoc); - if (!ok) - { - rmov.readat(nrec); - return TRUE; - } - } - - if (_esiste_causale) - if (!_mov_sez && importo == ZERO) - { - rmov.readat(nrec); - return TRUE; - } - } - if (dare != avere) - { - rmov.readat(nrec); - return TRUE; - } - rmov.readat(nrec); - } - return FALSE; -} - -void TRic_ListaMov::stampa_errori_rmov(int riga) -{ - if (_gruppo == 0 || _conto == 0 || _sottoconto == 0l) - { - _errore_grave = TRUE; - set_row(++riga, "@8g*** Sottoconto partita non valido o non presente in archivio"); - } - else - { - if (!_esiste_conto) - { - _errore_grave = TRUE; - set_row(++riga, "@8g*** Sottoconto partita non valido o non presente in archivio"); - } - } - - if ( (_importo == ZERO && _sezione != ' ') || - (_sezione != 'D' && _sezione != 'A') ) - { - _errore_grave = TRUE; - set_row(++riga, "@8g*** Segnale dare/avere non valido"); - } - - if (_sezione == 'D') - _tot_dare += _importo; - if (_sezione == 'A') - _tot_avere += _importo; - - if (_gruppoc != 0 || _contoc != 0 || _sottocontoc != 0l) - // set_row(++riga, "@8g*** Sottoconto contropartita non valido o non presente in archivio"); - // else - { - bool ok = errori_partita(_gruppoc,_contoc,_sottocontoc); - if (!ok) - { - _errore_grave = TRUE; - set_row(++riga, "@8g*** Sottoconto contropartita non valido o non presente in archivio"); - } - } - - if (_esiste_causale) - if (!_mov_sez && _importo == ZERO) - set_row(++riga, "@8g--- Importo riga uguale a zero"); -} - -bool TRic_ListaMov::controlla_riva() -{ - TLocalisamfile& rmoviva = current_cursor()->file(LF_RMOVIVA); - TTable tab_iva("%IVA"); - TString16 codiva; - int tipodet, tipocr, gruppocr, contocr; - long sottocontocr; - - if (current_cursor()->is_first_match(LF_RMOVIVA)) - { - TRecnotype nrec = rmoviva.recno(); - rmoviva.setkey(1); - rmoviva.zero(); - rmoviva.put(RMI_NUMREG, _numero); - TRectype recc (rmoviva.curr()); - for (rmoviva.read(_isgteq); !rmoviva.eof() ;rmoviva.next()) - { - TRectype rec (rmoviva.curr()); - if (rec > recc) break; - codiva = rec.get(RMI_CODIVA); - tipodet = rec.get_int(RMI_TIPODET); - tipocr = rec.get_int(RMI_TIPOCR); - gruppocr = rec.get_int(RMI_GRUPPO); - contocr = rec.get_int(RMI_CONTO); - sottocontocr = rec.get_long(RMI_SOTTOCONTO); - - TTable iva ("%IVA"); - iva.zero(); - iva.put("CODTAB", codiva); - if (iva.read() != NOERR) - { - rmoviva.readat(nrec); - return TRUE; - } - if (!(tipocr >= 0 && tipocr <= 9)) - { - rmoviva.readat(nrec); - return TRUE; - } - /* - if (gruppocr != 0 || contocr != 0 || sottocontocr != 0l) - { - bool ok = errori_partita(gruppocr,contocr,sottocontocr); - if (!ok) - { - rmoviva.readat(nrec); - return TRUE; - } - } - */ - if (gruppocr == 0 || contocr == 0 || sottocontocr == 0l) - { - rmoviva.readat(nrec); - return TRUE; - } - else if (gruppocr != 0 && contocr != 0 && sottocontocr != 0l) - { - bool ok = errori_partita(gruppocr,contocr,sottocontocr); - if (!ok) - { - rmoviva.readat(nrec); - return TRUE; - } - } - if (tipodet != 0 && tipodet != 1 && tipodet != 3 && tipodet != 9) - { - rmoviva.readat(nrec); - return TRUE; - } - } - rmoviva.readat(nrec); - } - return FALSE; -} - -void TRic_ListaMov::stampa_errori_riva(int riga) -{ - TTable iva ("%IVA"); - - iva.zero(); - iva.put("CODTAB", _codiva); - if (iva.read() != NOERR) - set_row(++riga, "@8g--- Codice IVA non valido o non presente in tabella"); - - if (!(_tipocr >= 0 && _tipocr <= 9)) - set_row(++riga, "@8g--- Tipo costo/ricavo non valido"); - - if (_gruppocr == 0 || _contocr == 0 || _sottocontocr == 0l) - { - _errore_grave = TRUE; - set_row(++riga, "@8g*** Sottoconto costo/ricavo non valido o non presente in archivio"); - } - else if (_gruppocr != 0 && _contocr != 0 && _sottocontocr != 0l) - { - bool ok = errori_partita(_gruppocr,_contocr,_sottocontocr); - if (!ok) - { - _errore_grave = TRUE; - set_row(++riga, "@8g*** Sottoconto costo/ricavo non valido o non presente in archivio"); - } - } - - if (_tipod != 0 && _tipod != 1 && _tipod != 3 && _tipod != 9) - set_row(++riga, "@8g--- Tipo indetraibilita' non valido"); -} - -bool TRic_ListaMov::preprocess_page(int file,int counter) -{ - TCursor* cur = current_cursor(); - - if (counter) return TRUE; - - reset_print(); - - if (file == LF_MOV) - { - _anno = cur->curr(LF_MOV).get_int(MOV_ANNOES); - _datacomp = cur->curr(LF_MOV).get_date(MOV_DATACOMP); - _datadoc = cur->curr(LF_MOV).get_date(MOV_DATADOC); - _data74tr = cur->curr(LF_MOV).get_date(MOV_DATA74TER); - _causale = cur->curr(LF_MOV).get(MOV_CODCAUS); - _registro = cur->curr(LF_MOV).get(MOV_REG); - format_if_zero(_registro, 3); - _tipodoc = cur->curr(LF_MOV).get(MOV_TIPODOC); - _numdoc = cur->curr(LF_MOV).get(MOV_NUMDOC); - _datareg = cur->curr(LF_MOV).get_date(MOV_DATAREG); - _codcf = cur->curr(LF_MOV).get_long(MOV_CODCF); - _numero = cur->curr(LF_MOV).get_long(MOV_NUMREG); - _protiva = cur->curr(LF_MOV).get_long(MOV_PROTIVA); - _codval = cur->curr(LF_MOV).get(MOV_CODVALI); - _codpag = cur->curr(LF_MOV).get(MOV_CODPAG); - - _tot_dare = _tot_avere = ZERO; - _tot_doc = ZERO; - - _ae = date2esc(_datareg); - - _num_rec = cur->curr(LF_MOV).get_long(MOV_NUMGIO); - - bool controlla = controlla_mov(); //se TRUE => ci sono errori nella testata - bool verifica = (controlla_rmov() || controlla_riva()); - - if ( (_controllo == 1 && controlla) || _controllo == 2 || - (_controllo == 1 && verifica) ) - { - TString16 datareg_str = _datareg.string(); - // "Fai vedere lo stesso ..-..-.... anche se non c'e' la data..." - if (datareg_str.empty()) - datareg_str = " - - "; - TString16 datadoc_str = _datadoc.string(); - if (datadoc_str.empty()) - datadoc_str = " - - "; - int r = 1; - set_row(r++, ""); - set_row(r,"Operazione n. %-7ld", _numero); - set_row(r," del %s", (const char*)datareg_str); - set_row(r," doc. n. %-7s", (const char*)_numdoc); - set_row(r," del %s", (const char*)datadoc_str); - if (!_registro.blank()) //e' una fattura - { - set_row(r," registro IVA %-3s", (const char*)_registro); - set_row(r," protocollo n. %-5ld", _protiva); - } - set_row(r, " comp. %d", _anno); - - stampa_errori_mov(r); - - return TRUE; - } - return FALSE; - } - else if (file == LF_RMOV) - { - _gruppo = cur->curr(LF_RMOV).get_int(RMV_GRUPPO); - _conto = cur->curr(LF_RMOV).get_int(RMV_CONTO); - _sottoconto = cur->curr(LF_RMOV).get_long(RMV_SOTTOCONTO); - _gruppoc = cur->curr(LF_RMOV).get_int(RMV_GRUPPOC); - _contoc = cur->curr(LF_RMOV).get_int(RMV_CONTOC); - _sottocontoc = cur->curr(LF_RMOV).get_long(RMV_SOTTOCONTOC); - _importo = cur->curr(LF_RMOV).get_real(RMV_IMPORTO); - _sezione = cur->curr(LF_RMOV).get(RMV_SEZIONE)[0]; - TString80 descr = cur->curr(LF_RMOV).get(RMV_DESCR); - int numrig = cur->curr(LF_RMOV).get_int(RMV_NUMRIG); - - _tipo_conto = ""; - - if (_gruppo != 0 && _conto != 0 && _sottoconto != 0l) - _esiste_conto = DescrConto(_gruppo,_conto,_sottoconto); - else - { - _esiste_conto = FALSE; - _descr_conto = ""; - } - int r = 1; - set_row(r, "P%d", numrig); - set_row(r, "@5g%3s %-.20s @30g%-.24s @56g%03d %03d %06ld @71g%-.28s", (const char*) _causale, - (const char*) _descr_causale, (const char*) descr, _gruppo, _conto, _sottoconto, - (const char*) _descr_conto); - if (_sezione == 'D') - set_row(r, "@99g%r", &_importo); - else if (_sezione == 'A') - set_row(r, "@116g%r", &_importo); - else set_row(r, "@107g%r", &_importo); - - stampa_errori_rmov(r); - } - else if (file == LF_RMOVIVA) - { - real impo = cur->curr(LF_RMOVIVA).get_real(RMI_IMPONIBILE); - real impos = cur->curr(LF_RMOVIVA).get_real(RMI_IMPOSTA); - int numrig = cur->curr(LF_RMOVIVA).get_int(RMI_NUMRIG); - _tipocr = cur->curr(LF_RMOVIVA).get_int(RMI_TIPOCR); - _tipod = cur->curr(LF_RMOVIVA).get_int(RMI_TIPODET); - _codiva = cur->curr(LF_RMOVIVA).get(RMI_CODIVA); - _n_rec = cur->curr(LF_RMOVIVA).get_int(RMI_ANNOES); - _gruppocr = cur->curr(LF_RMOVIVA).get_int(RMI_GRUPPO); - _contocr = cur->curr(LF_RMOVIVA).get_int(RMI_CONTO); - _sottocontocr = cur->curr(LF_RMOVIVA).get_long(RMI_SOTTOCONTO); - - TString80 codiva_des(get_codiva_des(_codiva)); - - _tot_doc += impo + impos; - _impo = impo; - _impos = impos; - - if (!_tipodoc.blank()) - { - TTable tabtpd("%TPD"); - tabtpd.put("CODTAB", _tipodoc); - if (tabtpd.read() == NOERR) - { - bool cor = tabtpd.get_bool("B0"); - if (cor) - { - _impo = impo + impos; - _impos = ZERO; - } - } - } - - int r = 1; - set_row(r, "I%d", numrig); - set_row(r, "@5gImponibile %r Imposta %r Codice %4s %-50s %d", - &_impo, &_impos, (const char*) _codiva, (const char*) codiva_des, _tipod); - - stampa_errori_riva(r); - } - return TRUE; -} - -print_action TRic_ListaMov::postprocess_page(int file,int count) -{ - if (count) return NEXT_PAGE; - if (file == LF_MOV) - { - aggiorna_trasfer_Z(); - reset_print(); - _err.reset(); - int n = 1; - if (_tot_dare != _tot_avere) - { - _errore_grave = TRUE; - set_row(n++, "@8g*** Il movimento risulta sbilanciato. Totali rilevati:@99g%r@116g%r", - &_tot_dare, &_tot_avere); - return REPEAT_PAGE; - } - } - if (file == LF_RMOVIVA) - aggiorna_trasfer_U(); - - return NEXT_PAGE; -} - -void TRic_ListaMov::postclose_print() -{ - if (_errore_grave) - message_box("Rilevati errori gravi durante il controllo movimenti: \n trasferimento interrotto"); - else - { - TConfig conf (CONFIG_DITTA); - conf.set("FlStTra", "M"); - - TTransfer_file& tr = trasfer(); - _record.overwrite("Z",240); //_record e' letto nella read_control_rec() - const int size = 256; - tr.write_control_rec(_record, size); - } -} - -void TRic_ListaMov::aggiorna_trasfer_Z() -{ - TLocalisamfile& mov = current_cursor()->file(LF_MOV); - - int i=0; - while (_registro[i]=='0' || _registro[i]==' ') i++; - - _registro = ""; - _registro << _registro[i]; - _registro.left_just(3, ' '); - - mov.put(MOV_REG, _registro); - mov.put(MOV_TIPODOC, _tipodoc); - mov.rewrite(); - - TString16 str; - TTransfer_file& tr = trasfer(); - long num = _inizioZ + _num_rec; - if (tr.read_rec_trasfer(num) > 0) - { - //tr.put(_registro, "Z1", 6); - //tr.put(_tipodoc, "Z1", 12); - if (_tiporeg != 0) - { - str = format("%d", _tiporeg); - tr.put(str, "Z1", 26); - } - str = _tot_doc.string(); - tr.put(str, "Z1", 13); - tr.put(_tipo_conto, "Z1", 11); - tr.write(num); - } -} - -void TRic_ListaMov::aggiorna_trasfer_U() -{ - TTransfer_file& tr = trasfer(); - long num = _inizioU + _n_rec; - if (tr.read_rec_trasfer(num) > 0) - { - TString16 str = _impo.string(); - tr.put(str, "U1", 14); - str = _impos.string(); - tr.put(str, "U1", 15); - tr.write(num); - } -} - -bool TRic_ListaMov::user_destroy() -{ - delete _giornale; - delete _trasfer; - delete _rel; - delete _cur; - delete _tmov; - delete _trmov; - delete _tiva; - delete _caus; - delete _ditte; - delete _clifo; - delete _pcon; - delete _tab_tra; - delete _tab_pag; - delete _tab_tpd; - delete _tab_iva; - - return TRUE; -} - -bool TRic_ListaMov::set_print(int m) -{ - TMask msk ("cg2700a"); - - TTransfer_file& tr = trasfer(); - - msk.set(F_NUMERO, tr.nultras()); - msk.set(F_DATALIMITE, tr.dataultras()); - msk.set(F_SDT, look_sdt()); - msk.set(F_SIGLA, tr.ult_file()); - msk.set(F_CHIAVE, tr.key()); - - if (msk.run() != K_ENTER) return FALSE; - - _controllo = msk.get_int(F_LISTA); - - if (_sdt == '*') - fremove(_pathfile); - - setta_parametri(" ", "C"); - - set_real_picture("###.###.###.###"); - - printer().footerlen(5); - - setta_intestazione(); - - _errore_grave = FALSE; - _err.reset(); - _inizioZ = tr.start('Z'); - _inizioU = tr.start('U'); - - return TRUE; -} - -void TRic_ListaMov::setta_intestazione() -{ - int soh = 1; - TString sep(132); - TString ragsoc(50); - - TLocalisamfile nditte(LF_NDITTE); - nditte.zero(); - nditte.put(NDT_CODDITTA, get_firm()); - if (nditte.read() == NOERR) - ragsoc = nditte.get(NDT_RAGSOC); - - reset_header(); - - sep << "Ditta " << get_firm(); - sep << " " << ragsoc; - sep.left_just(132); - - set_header (soh++, (const char*) sep); - - sep = ""; - sep << "Data @< Pag. @#"; - - sep.right_just(127); - - sep.overwrite ("LISTA DI CONTROLLO MOVIMENTI IN TRASFERIMENTO"); - set_header (soh++, (const char*)sep); - sep.fill('-'); - set_header (soh++, (const char *) sep); - set_header (soh++, "Rig Cod.causale @30gDescriz.aggiuntiva @56gCod.conto @71gDescriz.conto @99gDare @116gAvere"); - set_header (soh, (const char *) sep); -} - -void TRic_ListaMov::setta_parametri(const TString& sigla, const TString& flag) -{ - TTransfer_file& tr = trasfer(); - - TConfig conf (CONFIG_DITTA); - conf.set("FlStTra", flag); - - TString rec = tr.record(); - rec.overwrite(sigla,240); - - const int size = 256; - tr.write_control_rec(rec, size); -} - -int cg2700 (int argc, char* argv[]) -{ - TRic_ListaMov a; - a.run(argc, argv,"Lista controllo movimenti"); - return TRUE; -} +// +// Ricezione dati: lista controllo movimenti +// + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "cg2103.h" +#include "cglib04.h" +#include "cg2700.h" + +HIDDEN const char* err_msg[] = {"*** Data operazione non valida", + "*** Data operazione non compresa in alcun esercizio", + "*** Data competenza non valida", + "*** Data competenza non compresa in alcun esercizio", + "--- Data competenza incompatibile con data operazione", + "*** Data operazione antecedente ad ultima stampa giornale", + "--- Data documento non valida", + "*** Codice causale non valido o non presente in archivio", + "--- Codice pagamento non valido o non presente in tabella", + "*** Codice registro IVA non valido o non presente in tabella", + "*** Codice cliente/fornitore non valido o non presente in anagrafica", + "--- Data 74 ter non valida", + "*** Data operazione antecedente ad ultima stampa registro IVA"}; + +HIDDEN int date2esc(const TDate& d, int* prevesc = NULL); + +class TRic_ListaMov : public TPrintapp +{ + TTable* _tab_tra,* _tab_pag,* _tab_tpd,* _tab_iva, *_tab_ese; + TIsamtempfile* _tmov,* _trmov,* _tiva; + TLocalisamfile* _caus,* _ditte,* _clifo,* _pcon, *_mov, *_rmov, *_rmoviva; + TRelation* _rel; + TCursor* _cur; + TTransfer_file* _trasfer; + TLibro_giornale* _giornale; + TString80 _pathfile, _descr_causale, _descr_conto; + TString16 _causale, _registro, _numdoc, _tipodoc, _codval; + TString16 _codpag, _codiva, _tipo_conto; + TString _record; + bool _mov_sez, _errore_grave, _esiste_conto; + char _sdt, _sezione; + int _ae, _anno, _gruppo, _conto, _tipocr, _tipod, _tiporeg; + int _gruppoc, _contoc, _n_rec, _gruppocr, _contocr; + TDate _datacomp, _datadoc, _datareg, _data74tr; + real _importo, _impo, _impos, _tot_dare, _tot_avere, _tot_doc; + long _codcf, _numero, _protiva, _sottoconto; + long _inizioZ, _inizioU, _num_rec, _sottocontoc, _sottocontocr; + TBit_array _err; + byte _controllo; + +public: + virtual bool set_print(int m); + virtual bool user_create() ; + virtual bool user_destroy(); + virtual bool preprocess_page(int,int); + virtual print_action postprocess_page(int,int); + virtual void postclose_print(); + const char* look_sdt(); + const char* get_codiva_des(const char*); + bool DescrConto(int,int,long); + bool check_archivi(TProgind*); + bool look_pag(); + bool errori_partita(int,int,long); + bool controlla_mov(); + bool controlla_rmov(); + bool controlla_riva(); + void stampa_errori_mov(int); + void stampa_errori_rmov(int); + void stampa_errori_riva(int); + void aggiorna_trasfer_Z(); + void aggiorna_trasfer_U(); + void setta_parametri(const TString&, const TString&); + void setta_intestazione(); + TLibro_giornale& giornale() { return *_giornale; } + TTransfer_file& trasfer() { return *_trasfer; } + + TRic_ListaMov(): _err(80) {} + virtual ~TRic_ListaMov() {} +}; + +HIDDEN inline TRic_ListaMov& app() { return (TRic_ListaMov&)main_app();} + +HIDDEN int date2esc(const TDate& d, int* prevesc) +{ + if (prevesc) *prevesc = 0; + TTable esc("ESC"); + for (int err = esc.first(); err == NOERR; err = esc.next()) + { + const TDate ia(esc.get("D0")); // Data inizio esercizio + const TDate fa(esc.get("D1")); // Data fine esercizio + const anno = esc.get_int("CODTAB"); + if (d >= ia && d <= fa) + return anno; + if (prevesc) *prevesc = anno; + } + return 0; +} + +const char* TRic_ListaMov::look_sdt() +{ + TConfig conf(CONFIG_DITTA); + return conf.get("FlStTra"); +} + +bool TRic_ListaMov::look_pag() +{ + TTable t ("%CPG"); + t.zero(); + t.put("CODTAB",_codpag); + if (t.read() != NOERR) return FALSE; + return TRUE; +} + +const char* TRic_ListaMov::get_codiva_des(const char* codiva) +{ + TTable iva ("%IVA"); + + iva.zero(); + iva.put("CODTAB", codiva); + if (iva.read() == NOERR) + return iva.get("S0"); + else + return NULL; +} + +bool TRic_ListaMov::DescrConto(int g, int c, long s) +{ + TString80 ragsoc; + const char* descr = NULL; + TLocalisamfile pconti (LF_PCON); + pconti.setkey(1); + pconti.zero(); + pconti.put(PCN_GRUPPO, g); + pconti.put(PCN_CONTO, c); + pconti.put(PCN_SOTTOCONTO, 0L); + if (pconti.read() == NOERR) + { + _tipo_conto = pconti.get(PCN_TMCF); + if (_tipo_conto == "C" || _tipo_conto == "F") + { + TLocalisamfile clifo (LF_CLIFO); + clifo.setkey(1); + clifo.zero(); + clifo.put(CLI_TIPOCF, _tipo_conto); + clifo.put(CLI_CODCF, s); + if (clifo.read() != NOERR) + { + _descr_conto = ""; + return FALSE; + } + else + { + char tipoa = clifo.get_char("TIPOAPER"); + if (tipoa == 'F') //persona fisica + { + TString80 cognome, nome; + ragsoc = clifo.get("RAGSOC"); + cognome = ragsoc.mid(0,30); + nome = ragsoc.mid(30,20); + cognome.trim(); nome.trim(); + ragsoc = cognome; + ragsoc << " " << nome; + _descr_conto = ragsoc; + } + else _descr_conto = clifo.get("RAGSOC"); + } + } + else + { + pconti.zero(); + pconti.put(PCN_GRUPPO, g); + pconti.put(PCN_CONTO, c); + pconti.put(PCN_SOTTOCONTO, s); + if (pconti.read() != NOERR) + { + _descr_conto = ""; + return FALSE; + } + else _descr_conto = pconti.get(PCN_DESCR); + } + } + else + { + _descr_conto = ""; + return FALSE; + } + return TRUE; +} + +bool TRic_ListaMov::user_create() +{ + _trasfer = new TTransfer_file(); + + TProgind* pnd = NULL; + pnd = new TProgind (3,"Controllo archivi\nPrego attendere", + FALSE, TRUE, 30); + _tab_tra = new TTable ("%TRA"); + _tab_tpd = new TTable ("%TPD"); + _tab_pag = new TTable ("%CPG"); + _tab_iva = new TTable ("%IVA"); + _tab_ese = new TTable ("ESC"); + _caus = new TLocalisamfile (LF_CAUSALI); + _ditte = new TLocalisamfile (LF_NDITTE); + _clifo = new TLocalisamfile (LF_CLIFO); + _pcon = new TLocalisamfile (LF_PCON); + _mov = new TLocalisamfile (LF_MOV); + _rmov = new TLocalisamfile (LF_RMOV); + _rmoviva = new TLocalisamfile (LF_RMOVIVA); + + if (pnd) pnd->addstatus(1); + + if (!check_archivi(pnd)) + { + delete pnd; + return FALSE; + } + + if (pnd) pnd->addstatus(1); + + TString80 tmpmov = "%"; + tmpmov << get_firm_dir(); + tmpmov << "\\" << TEMP_MOV; + TString80 tmprmov = "%"; + tmprmov << get_firm_dir(); + tmprmov << "\\" << TEMP_RMOV; + TString80 tmprmoviva = "%"; + tmprmoviva << get_firm_dir(); + tmprmoviva << "\\" << TEMP_RMOVIVA; + + _tmov = new TIsamtempfile(LF_MOV, tmpmov, 0); + _trmov = new TIsamtempfile(LF_RMOV, tmprmov, 0); + _tiva = new TIsamtempfile(LF_RMOVIVA, tmprmoviva, 0); + + _rel = new TRelation(_tmov); + _rel->add(_trmov,"NUMREG=NUMREG",1,0,0,FALSE); + _rel->add(_tiva, "NUMREG=NUMREG",1,0,0,FALSE); + _cur = new TCursor (_rel, "", 1); + + _giornale = new TLibro_giornale(); + + add_cursor(_cur); + + add_file (LF_MOV); + add_file (LF_RMOV, LF_MOV); + add_file (LF_RMOVIVA, LF_MOV); + + printer().footerlen(5); + + delete pnd; + + return TRUE; +} + +bool TRic_ListaMov::check_archivi(TProgind* pnd) +{ + TString80 nome; + long ditta_ric = get_firm(); + + if (!prefix().exist(ditta_ric)) + return error_box("Rilevati errori gravi negli archivi: procedura interrotta"); + + TTransfer_file& tr = trasfer(); + + _pathfile = tr.path(); + + _pathfile = _pathfile << "\\trasfer"; + + if (!tr.open(_pathfile)) + return error_box("Al momento non presenti trasferimenti attivi sulla ditta selezionata"); + + if (!tr.read_control_rec()) + return error_box("Rilevati errori gravi negli archivi: procedura interrotta"); + else _record = tr.record(); + + TString16 sd = look_sdt(); + + if (sd.not_empty()) + _sdt = sd[0]; + else return error_box("Ricezione tabelle non effettuata: richiamare il programma relativo"); + + if (_sdt == 'T') + return error_box("Ricezione tabelle non effettuata: richiamare il programma relativo"); + + if (_sdt == 'M') + return yesno_box("Controllo gia' effettuato: si desidera ripeterlo ?"); + + if (_sdt != '*' && _sdt != 'C') + return error_box("Rilevati errori gravi negli archivi: procedura interrotta"); + + TString16 ult = tr.ult_file(); + TString16 key = tr.key(); + + ult.strip_spaces(); + key.strip_spaces(); + + if (_sdt == 'C') + if ( ult.not_empty() || key.not_empty() ) + return error_box("Rilevati errori gravi negli archivi: procedura interrotta"); + + if (_sdt == '*') + return warning_box("Trasferimento interamente completato: proseguire per cancellare i file"); + + if (pnd) pnd->addstatus(1); + + return TRUE; +} + +void TRic_ListaMov::stampa_errori_mov(int riga) +{ + long i = _err.first_one(); + if (i != -1) + { + for (; i <= _err.last_one(); i++) + if (_err[i]) + set_row(++riga, "@8g%s", (const char*) err_msg[i]); + } +} + +bool TRic_ListaMov::controlla_mov() +{ + bool check_reg = TRUE; + TString16 causreg; + TDate udata; + char tipocf = ' '; + + _tiporeg = 0; + + if (!_datareg.ok()) + { + _errore_grave = TRUE; + _err.set(0L); + } + + if (_datareg.ok()) + { + int pr; + const int ar = date2esc(_datareg, &pr); // Esercizio in corso + if (ar == 0) + { + _err.set(1); + _errore_grave = TRUE; + } + if (_datacomp.ok()) + { + const int ae = date2esc(_datacomp); + if (ae == 0) + { + _err.set(3); + _errore_grave = TRUE; + } + else if (ae != ar && ae != pr && ar) + _err.set(4); + } + } + + if (!_datacomp.ok()) + { + _errore_grave = TRUE; + _err.set(2); + } + + TLibro_giornale& gio = giornale(); + bool ok = gio.read(_ae); //se _ae e' zero la read considera come anno quello corrente + if (_datareg < gio.last_print()) + { + _errore_grave = TRUE; + _err.set(5); + } + + TString16 dd = _datadoc.string(); + if (dd.not_empty()) + if (!_datadoc.ok()) + _err.set(6); + + //if (_causale.not_empty()) + //{ + TLocalisamfile caus(LF_CAUSALI); + caus.setkey(1); + caus.zero(); + caus.put(CAU_CODCAUS,_causale); + if (caus.read() == NOERR) + _tipodoc = caus.get(CAU_TIPODOC); + else + { + caus.zero(); + if (look_causale(_causale)) //se la causale e' significativa + { + _errore_grave = TRUE; + _err.set(7); + } + } + //_tipodoc = caus.get(CAU_TIPODOC); ho sempre quello letto sul movimento! + causreg = caus.get(CAU_REG); + _descr_causale = caus.get(CAU_DESCR); + _mov_sez = caus.get_bool(CAU_MOVSEZ); + //} + + if (!_codpag.blank()) + { + bool ok = look_pag(); + if (!ok) + _err.set(8); + } + + if (!_registro.blank()) //movimento iva (fattura) + { + if (!look_causale(_causale)) //se la causale non e' significativa + { + _errore_grave = TRUE; + check_reg = FALSE; + _err.set(9); + } + if (check_reg && _ae) + { + TRegistro rg (_registro, _ae); + if (rg.name().empty()) + { + _errore_grave = TRUE; + check_reg = FALSE; + _err.set(9); + } + else + { + _tiporeg = rg.tipo(); + udata = rg.last_print(); + } + } + } + else if (!causreg.blank() && _ae) + { + TRegistro rg (causreg, _ae); + if (rg.name().empty()) + { + _errore_grave = TRUE; + check_reg = FALSE; + _err.set(9); + } + else + { + _tiporeg = rg.tipo(); + udata = rg.last_print(); + } + _registro = causreg; + } + + if (!_registro.blank()) + { + if (_tiporeg == 1) tipocf = 'C'; + else if (_tiporeg == 2) tipocf = 'F'; +// if (_tiporeg != 0) //se esiste, uso quello della causale!!! +// { + TTable tabtpd("%TPD"); + tabtpd.put("CODTAB", _tipodoc); + if (tabtpd.read() == NOERR) + { + bool cor = tabtpd.get_bool("B0"); + if (!cor) + if (_codcf != 0l) + { + TLocalisamfile clifo(LF_CLIFO); + clifo.zero(); + clifo.put(CLI_CODCF, _codcf); + clifo.put(CLI_TIPOCF,tipocf); + if (clifo.read() != NOERR) + { + _errore_grave = TRUE; + _err.set(10); + } + } + else + { + _errore_grave = TRUE; + _err.set(10); + } + } + else + { + if (_codcf != 0l) + { + TLocalisamfile clifo(LF_CLIFO); + clifo.zero(); + clifo.put(CLI_CODCF, _codcf); + clifo.put(CLI_TIPOCF,tipocf); + if (clifo.read() != NOERR) + { + _errore_grave = TRUE; + _err.set(10); + } + } + else + { + _errore_grave = TRUE; + _err.set(10); + } + } +// } + } + + TString16 d74 = _data74tr.string(); + if (d74.not_empty()) + if (!_data74tr.ok()) + _err.set(11); + + if (!_registro.blank() && check_reg) + if (_datareg < udata) + { + _errore_grave = TRUE; + _err.set(12); + } + + if (_err.ones()) + return TRUE; + + return FALSE; +} + +bool TRic_ListaMov::errori_partita(int g, int c, long s) +{ + TLocalisamfile pconti (LF_PCON); + pconti.setkey(1); + pconti.zero(); + pconti.put(PCN_GRUPPO, g); + pconti.put(PCN_CONTO, c); + pconti.put(PCN_SOTTOCONTO, 0L); + if (pconti.read() == NOERR) + { + char tipo = pconti.get(PCN_TMCF)[0]; + if (tipo == 'C' || tipo == 'F') + { + TLocalisamfile clifo (LF_CLIFO); + clifo.setkey(1); + clifo.zero(); + clifo.put(CLI_TIPOCF, tipo); + clifo.put(CLI_CODCF, s); + if (clifo.read() != NOERR) + return FALSE; + } + else + { + pconti.zero(); + pconti.put(PCN_GRUPPO, g); + pconti.put(PCN_CONTO, c); + pconti.put(PCN_SOTTOCONTO, s); + if (pconti.read() != NOERR) + return FALSE; + } + } + else return FALSE; + + return TRUE; +} + +bool TRic_ListaMov::controlla_rmov() +{ + TLocalisamfile& rmov = current_cursor()->file(LF_RMOV); + int gruppo, conto, gruppoc, contoc; + long sottoconto, sottocontoc; + char sezione; + real importo, dare, avere; + + if (current_cursor()->is_first_match(LF_RMOV)) + { + dare = avere = ZERO; + TRecnotype nrec = rmov.recno(); + rmov.zero(); + rmov.setkey(1); + rmov.put(RMV_NUMREG, _numero); + TRectype recc (rmov.curr()); + for (rmov.read(_isgteq); !rmov.eof() ;rmov.next()) + { + TRectype rec (rmov.curr()); + if (rec > recc) break; + gruppo = rec.get_int(RMV_GRUPPO); + conto = rec.get_int(RMV_CONTO); + sottoconto = rec.get_long(RMV_SOTTOCONTO); + gruppoc = rec.get_int(RMV_GRUPPOC); + contoc = rec.get_int(RMV_CONTOC); + sottocontoc = rec.get_long(RMV_SOTTOCONTOC); + sezione = rec.get_char(RMV_SEZIONE); + importo = rec.get_real(RMV_IMPORTO); + + _tipo_conto = ""; + + if (gruppo != 0 && conto != 0 && sottoconto != 0l) + _esiste_conto = DescrConto(gruppo,conto,sottoconto); + else + { + _esiste_conto = FALSE; + _descr_conto = ""; + } + + _num_rec = rec.get_long(RMV_ANNOES); + aggiorna_trasfer_Z(); + + if (sezione == 'D') + dare += importo; + if (sezione == 'A') + avere += importo; + + if (gruppo == 0 || conto == 0 || sottoconto == 0l) + { + rmov.readat(nrec); + return TRUE; + } + else + { + bool ok = errori_partita(gruppo,conto,sottoconto); + if (!ok) + { + rmov.readat(nrec); + return TRUE; + } + } + + if ( (importo != ZERO && sezione == '\0') || + (sezione != 'D' && sezione != 'A' && sezione != '\0') ) + { + rmov.readat(nrec); + return TRUE; + } + + if (gruppoc != 0 || contoc != 0 || sottocontoc != 0l) + { + bool ok = errori_partita(gruppoc,contoc,sottocontoc); + if (!ok) + { + rmov.readat(nrec); + return TRUE; + } + } + + if (!_mov_sez && importo == ZERO) + { + rmov.readat(nrec); + return TRUE; + } + } + if (dare != avere) + { + rmov.readat(nrec); + return TRUE; + } + rmov.readat(nrec); + } + return FALSE; +} + +void TRic_ListaMov::stampa_errori_rmov(int riga) +{ + if (_gruppo == 0 || _conto == 0 || _sottoconto == 0l) + { + _errore_grave = TRUE; + set_row(++riga, "@8g*** Sottoconto partita non valido o non presente in archivio"); + } + else + { + if (!_esiste_conto) + { + _errore_grave = TRUE; + set_row(++riga, "@8g*** Sottoconto partita non valido o non presente in archivio"); + } + } + + if ( (_importo != ZERO && _sezione == '\0') || + (_sezione != 'D' && _sezione != 'A' && _sezione != '\0') ) + { + _errore_grave = TRUE; + set_row(++riga, "@8g*** Segnale dare/avere non valido"); + } + + if (_sezione == 'D') + _tot_dare += _importo; + if (_sezione == 'A') + _tot_avere += _importo; + + if (_gruppoc != 0 || _contoc != 0 || _sottocontoc != 0l) + // set_row(++riga, "@8g*** Sottoconto contropartita non valido o non presente in archivio"); + // else + { + bool ok = errori_partita(_gruppoc,_contoc,_sottocontoc); + if (!ok) + set_row(++riga, "@8g--- Sottoconto contropartita non valido o non presente in archivio"); + } + + if (!_mov_sez && _importo == ZERO) + set_row(++riga, "@8g--- Importo riga uguale a zero"); +} + +bool TRic_ListaMov::controlla_riva() +{ + TLocalisamfile& rmoviva = current_cursor()->file(LF_RMOVIVA); + TTable tab_iva("%IVA"); + TString16 codiva; + int tipodet, tipocr, gruppocr, contocr; + long sottocontocr; + real impo, impos; + + if (current_cursor()->is_first_match(LF_RMOVIVA)) + { + TRecnotype nrec = rmoviva.recno(); + rmoviva.setkey(1); + rmoviva.zero(); + rmoviva.put(RMI_NUMREG, _numero); + TRectype recc (rmoviva.curr()); + for (rmoviva.read(_isgteq); !rmoviva.eof() ;rmoviva.next()) + { + TRectype rec (rmoviva.curr()); + if (rec > recc) break; + _n_rec = rec.get_int(RMI_ANNOES); + codiva = rec.get(RMI_CODIVA); + tipodet = rec.get_int(RMI_TIPODET); + tipocr = rec.get_int(RMI_TIPOCR); + gruppocr = rec.get_int(RMI_GRUPPO); + contocr = rec.get_int(RMI_CONTO); + sottocontocr = rec.get_long(RMI_SOTTOCONTO); + impo = rec.get_real(RMI_IMPONIBILE); + impos = rec.get_real(RMI_IMPOSTA); + + TString impostr = impo.string(); + TString impostastr = impos.string(); + + _tot_doc += impo + impos; + + TString totdocstr = _tot_doc.string(); + + _impo = impo; + _impos = impos; + + if (!_tipodoc.blank()) + { + TTable tabtpd("%TPD"); + tabtpd.put("CODTAB", _tipodoc); + if (tabtpd.read() == NOERR) + { + bool cor = tabtpd.get_bool("B0"); + if (cor) + { + _impo = impo + impos; + _impos = ZERO; + } + } + } + + aggiorna_trasfer_U(); + + TTable iva ("%IVA"); + iva.zero(); + iva.put("CODTAB", codiva); + if (iva.read() != NOERR) + { + rmoviva.readat(nrec); + return TRUE; + } + if (!(tipocr >= 0 && tipocr <= 9)) + { + rmoviva.readat(nrec); + return TRUE; + } + if (gruppocr == 0 || contocr == 0 || sottocontocr == 0l) + { + rmoviva.readat(nrec); + return TRUE; + } + else if (gruppocr != 0 && contocr != 0 && sottocontocr != 0l) + { + bool ok = errori_partita(gruppocr,contocr,sottocontocr); + if (!ok) + { + rmoviva.readat(nrec); + return TRUE; + } + } + if (tipodet != 0 && tipodet != 1 && tipodet != 3 && tipodet != 9) + { + rmoviva.readat(nrec); + return TRUE; + } + } + rmoviva.readat(nrec); + } + return FALSE; +} + +void TRic_ListaMov::stampa_errori_riva(int riga) +{ + TTable iva ("%IVA"); + + iva.zero(); + iva.put("CODTAB", _codiva); + if (iva.read() != NOERR) + set_row(++riga, "@8g--- Codice IVA non valido o non presente in tabella"); + + if (!(_tipocr >= 0 && _tipocr <= 9)) + set_row(++riga, "@8g--- Tipo costo/ricavo non valido"); + + if (_gruppocr == 0 || _contocr == 0 || _sottocontocr == 0l) + set_row(++riga, "@8g--- Sottoconto costo/ricavo non valido o non presente in archivio"); + else if (_gruppocr != 0 && _contocr != 0 && _sottocontocr != 0l) + { + bool ok = errori_partita(_gruppocr,_contocr,_sottocontocr); + if (!ok) + set_row(++riga, "@8g--- Sottoconto costo/ricavo non valido o non presente in archivio"); + } + + if (_tipod != 0 && _tipod != 1 && _tipod != 3 && _tipod != 9) + set_row(++riga, "@8g--- Tipo indetraibilita' non valido"); +} + +bool TRic_ListaMov::preprocess_page(int file,int counter) +{ + TCursor* cur = current_cursor(); + + if (counter) return TRUE; + + reset_print(); + + if (file == LF_MOV) + { + _anno = cur->curr(LF_MOV).get_int(MOV_ANNOES); + _datacomp = cur->curr(LF_MOV).get_date(MOV_DATACOMP); + _datadoc = cur->curr(LF_MOV).get_date(MOV_DATADOC); + _data74tr = cur->curr(LF_MOV).get_date(MOV_DATA74TER); + _causale = cur->curr(LF_MOV).get(MOV_CODCAUS); + _registro = cur->curr(LF_MOV).get(MOV_REG); + format_if_zero(_registro, 3); + _tipodoc = cur->curr(LF_MOV).get(MOV_TIPODOC); + _numdoc = cur->curr(LF_MOV).get(MOV_NUMDOC); + _datareg = cur->curr(LF_MOV).get_date(MOV_DATAREG); + _codcf = cur->curr(LF_MOV).get_long(MOV_CODCF); + _numero = cur->curr(LF_MOV).get_long(MOV_NUMREG); + _protiva = cur->curr(LF_MOV).get_long(MOV_PROTIVA); + _codval = cur->curr(LF_MOV).get(MOV_CODVALI); + _codpag = cur->curr(LF_MOV).get(MOV_CODPAG); + + _tot_dare = _tot_avere = ZERO; + _tot_doc = ZERO; + + _ae = date2esc(_datareg); + + //_num_rec = cur->curr(LF_MOV).get_long(MOV_NUMGIO); + + bool controlla = controlla_mov(); //se TRUE => ci sono errori nella testata + bool veriva = controlla_riva(); + bool verrmov = controlla_rmov(); + bool verifica = (veriva || verrmov); + + if ( (_controllo == 1 && controlla) || _controllo == 2 || + (_controllo == 1 && verifica) ) + { + TString16 datareg_str = _datareg.string(); + // "Fai vedere lo stesso ..-..-.... anche se non c'e' la data..." + if (datareg_str.empty()) + datareg_str = " - - "; + TString16 datadoc_str = _datadoc.string(); + if (datadoc_str.empty()) + datadoc_str = " - - "; + int r = 1; + set_row(r++, ""); + set_row(r,"Operazione n. %-7ld", _numero); + set_row(r," del %s", (const char*)datareg_str); + set_row(r," doc. n. %-7s", (const char*)_numdoc); + set_row(r," del %s", (const char*)datadoc_str); + if (!_registro.blank()) //e' una fattura + { + set_row(r," registro IVA %-3s", (const char*)_registro); + set_row(r," protocollo n. %-5ld", _protiva); + } + set_row(r, " comp. %d", _anno); + + stampa_errori_mov(r); + + return TRUE; + } + return FALSE; + } + else if (file == LF_RMOV) + { + _gruppo = cur->curr(LF_RMOV).get_int(RMV_GRUPPO); + _conto = cur->curr(LF_RMOV).get_int(RMV_CONTO); + _sottoconto = cur->curr(LF_RMOV).get_long(RMV_SOTTOCONTO); + _gruppoc = cur->curr(LF_RMOV).get_int(RMV_GRUPPOC); + _contoc = cur->curr(LF_RMOV).get_int(RMV_CONTOC); + _sottocontoc = cur->curr(LF_RMOV).get_long(RMV_SOTTOCONTOC); + _importo = cur->curr(LF_RMOV).get_real(RMV_IMPORTO); + _sezione = cur->curr(LF_RMOV).get(RMV_SEZIONE)[0]; + TString80 descr = cur->curr(LF_RMOV).get(RMV_DESCR); + int numrig = cur->curr(LF_RMOV).get_int(RMV_NUMRIG); + + _tipo_conto = ""; + + if (_gruppo != 0 && _conto != 0 && _sottoconto != 0l) + _esiste_conto = DescrConto(_gruppo,_conto,_sottoconto); + else + { + _esiste_conto = FALSE; + _descr_conto = ""; + } + + int r = 1; + set_row(r, "P%d", numrig); + set_row(r, "@5g%3s %-.20s @30g%-.24s @56g%03d %03d %06ld @71g%-.28s", (const char*) _causale, + (const char*) _descr_causale, (const char*) descr, _gruppo, _conto, _sottoconto, + (const char*) _descr_conto); + if (_sezione == 'D') + set_row(r, "@99g%r", &_importo); + else if (_sezione == 'A') + set_row(r, "@116g%r", &_importo); + else set_row(r, "@107g%r", &_importo); + + stampa_errori_rmov(r); + } + else if (file == LF_RMOVIVA) + { + real impo = cur->curr(LF_RMOVIVA).get_real(RMI_IMPONIBILE); + real impos = cur->curr(LF_RMOVIVA).get_real(RMI_IMPOSTA); + int numrig = cur->curr(LF_RMOVIVA).get_int(RMI_NUMRIG); + _tipocr = cur->curr(LF_RMOVIVA).get_int(RMI_TIPOCR); + _tipod = cur->curr(LF_RMOVIVA).get_int(RMI_TIPODET); + _codiva = cur->curr(LF_RMOVIVA).get(RMI_CODIVA); + //_n_rec = cur->curr(LF_RMOVIVA).get_int(RMI_ANNOES); + _gruppocr = cur->curr(LF_RMOVIVA).get_int(RMI_GRUPPO); + _contocr = cur->curr(LF_RMOVIVA).get_int(RMI_CONTO); + _sottocontocr = cur->curr(LF_RMOVIVA).get_long(RMI_SOTTOCONTO); + + TString80 codiva_des(get_codiva_des(_codiva)); + + //_tot_doc += impo + impos; + + _impo = impo; + _impos = impos; + + if (!_tipodoc.blank()) + { + TTable tabtpd("%TPD"); + tabtpd.put("CODTAB", _tipodoc); + if (tabtpd.read() == NOERR) + { + bool cor = tabtpd.get_bool("B0"); + if (cor) + { + _impo = impo + impos; + _impos = ZERO; + } + } + } + + int r = 1; + set_row(r, "I%d", numrig); + set_row(r, "@5gImponibile@16g%r",&_impo); + set_row(r, "@32gImposta@40g%r", &_impos); + set_row(r, "@56gCodice@63g%4s", (const char*) _codiva); + set_row(r, "@68g%s", (const char*) codiva_des); + + if (_tipod != 0) + set_row(r," %d", _tipod); + + stampa_errori_riva(r); + } + return TRUE; +} + +print_action TRic_ListaMov::postprocess_page(int file,int count) +{ + if (count) return NEXT_PAGE; + if (file == LF_MOV) + { + // aggiorna_trasfer_Z(); + reset_print(); + _err.reset(); + int n = 1; + if (_tot_dare != _tot_avere) + { + _errore_grave = TRUE; + set_row(n++, "@8g*** Il movimento risulta sbilanciato. Totali rilevati:@99g%r@116g%r", + &_tot_dare, &_tot_avere); + return REPEAT_PAGE; + } + } + /* + if (file == LF_RMOVIVA) + aggiorna_trasfer_U(); + */ + return NEXT_PAGE; +} + +void TRic_ListaMov::postclose_print() +{ + if (_errore_grave) + message_box("Rilevati errori gravi durante il controllo movimenti: \n trasferimento interrotto"); + else + { + TConfig conf (CONFIG_DITTA); + conf.set("FlStTra", "M"); + + TTransfer_file& tr = trasfer(); + _record.overwrite("Z",240); //_record e' letto nella read_control_rec() + const int size = 256; + tr.write_control_rec(_record, size); + } +} + +void TRic_ListaMov::aggiorna_trasfer_Z() +{ + TLocalisamfile& mov = current_cursor()->file(LF_MOV); + + int i=0; + while (_registro[i]=='0' || _registro[i]==' ') i++; + + TString16 registro = ""; + registro << _registro[i]; + registro.left_just(3, ' '); + + mov.put(MOV_REG, registro); + mov.put(MOV_TIPODOC, _tipodoc); + mov.rewrite(); + + TString16 str; + TTransfer_file& tr = trasfer(); + long num = _inizioZ + _num_rec; + if (tr.read_rec_trasfer(num) > 0) + { + tr.put(_tipodoc, "Z1", 12); + if (_tiporeg != 0) + { + str = format("%d", _tiporeg); + tr.put(str, "Z1", 26); + } + TString totdocstr = _tot_doc.string(); + str = format("%011s", (const char*) _tot_doc.string()); + tr.put(str, "Z1", 13); + tr.put(_tipo_conto, "Z1", 11); + tr.write(num); + } +} + +void TRic_ListaMov::aggiorna_trasfer_U() +{ + TTransfer_file& tr = trasfer(); + long num = _inizioU + _n_rec; + if (tr.read_rec_trasfer(num) > 0) + { + TString str = format("%011s", (const char*)_impo.string()); + tr.put(str, "U1", 14); + str = format("%09s", (const char*)_impos.string()); + tr.put(str, "U1", 15); + tr.write(num); + } +} + +bool TRic_ListaMov::user_destroy() +{ + delete _giornale; + delete _trasfer; + delete _rel; + delete _cur; + delete _tmov; + delete _trmov; + delete _tiva; + delete _caus; + delete _ditte; + delete _clifo; + delete _pcon; + delete _mov; + delete _rmov; + delete _rmoviva; + delete _tab_tra; + delete _tab_pag; + delete _tab_tpd; + delete _tab_iva; + delete _tab_ese; + + return TRUE; +} + +bool TRic_ListaMov::set_print(int m) +{ + TMask msk ("cg2700a"); + + TTransfer_file& tr = trasfer(); + + msk.set(F_NUMERO, tr.nultras()); + msk.set(F_DATALIMITE, tr.dataultras()); + msk.set(F_SDT, look_sdt()); + msk.set(F_SIGLA, tr.ult_file()); + msk.set(F_CHIAVE, tr.key()); + + if (msk.run() != K_ENTER) return FALSE; + + _controllo = msk.get_int(F_LISTA); + + if (_sdt == '*') + fremove(_pathfile); + + setta_parametri(" ", "C"); + + set_real_picture("###.###.###.###"); + + printer().footerlen(5); + + setta_intestazione(); + + _errore_grave = FALSE; + _err.reset(); + _inizioZ = tr.start('Z'); + _inizioU = tr.start('U'); + + return TRUE; +} + +void TRic_ListaMov::setta_intestazione() +{ + int soh = 1; + TString sep(132); + TString ragsoc(50); + + TLocalisamfile nditte(LF_NDITTE); + nditte.zero(); + nditte.put(NDT_CODDITTA, get_firm()); + if (nditte.read() == NOERR) + ragsoc = nditte.get(NDT_RAGSOC); + + reset_header(); + + sep << "Ditta " << get_firm(); + sep << " " << ragsoc; + sep.left_just(132); + + set_header (soh++, (const char*) sep); + + sep = ""; + sep << "Data @< Pag. @#"; + + sep.right_just(127); + + sep.overwrite ("LISTA DI CONTROLLO MOVIMENTI IN TRASFERIMENTO"); + set_header (soh++, (const char*)sep); + sep.fill('-'); + set_header (soh++, (const char *) sep); + set_header (soh++, "Rig Cod.causale @30gDescriz.aggiuntiva @56gCod.conto @71gDescriz.conto @99gDare @116gAvere"); + set_header (soh, (const char *) sep); +} + +void TRic_ListaMov::setta_parametri(const TString& sigla, const TString& flag) +{ + TTransfer_file& tr = trasfer(); + + TConfig conf (CONFIG_DITTA); + conf.set("FlStTra", flag); + + TString rec = tr.record(); + rec.overwrite(sigla,240); + + const int size = 256; + tr.write_control_rec(rec, size); +} + +int cg2700 (int argc, char* argv[]) +{ + TRic_ListaMov a; + a.run(argc, argv,"Lista controllo movimenti"); + return TRUE; +} diff --git a/cg/cg2800.cpp b/cg/cg2800.cpp index 2476db415..758a15a5f 100755 --- a/cg/cg2800.cpp +++ b/cg/cg2800.cpp @@ -1,1481 +1,1493 @@ -// Variazione movimenti di prima nota e movimenti iva - -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#include "cglib04.h" -#include "cglib.h" -#include "cg2103.h" -#include "conto.h" - -#include "cg2800.h" -#include "cg2801.h" -#include "cg2802.h" -#include "cg2803.h" - -HIDDEN TString80 TEMP; - -//HIDDEN int date2esc(const TDate& d, int* prevesc = NULL); - -class TVar_mov : public TApplication -{ - TIsamtempfile* _tmov,* _trmov,* _tiva; - TLocalisamfile* _pcon,* _clifo; - TRectype* _rec_mov,* _rec_rmov,* _rec_riva; - TTransfer_file _tras_file; - char _scelta; - - TString _trasf,_std,_descr_civa; - long _dittaric,_numreg; - TString _control_rec,_record; - bool _righe,_corrisp; - int _numrig,_tiporeg; - -public: - TString _titolo; - - virtual bool create(); - virtual bool destroy(); - virtual bool menu(MENU_TAG m); - bool main_loop(); - bool esegui_controlli(); - bool leggi_trasfer(); - bool controlli(); - void leggi_record_controllo(); - bool video_PN(); - bool video_IVA(); - void registra_PN(TMask& m); - void registra_IVA(TMask& m); - bool esiste_testata_mov(TMask& m); - bool ricerca_movimento(TMask& m); - - bool esiste_riga_mov(TMask& m); - bool esiste_riga_iva(TMask& m); - - void ricerca_codcaus(const TString& codcaus); - void setta_campi_maschera(TMask& m); - bool setta_campi_maschera_iva(TMask& m); - - void registra_file_temp_mov(long,const TDate&,const TDate&,const TString&,TString&,long,long,const TString&,TString&); - void registra_file_trasfer_t(long,int,const TDate&,const TDate&,const TString&,TString&,long,long,const TString&,const TString&); - void registra_file_temp_rmov(long,int,int,int,long,char,const TString&,int,int,long,const real&); - void registra_file_trasfer_r(long,int,int,int,long,char,const TString&,int,int,long,const real&); - void registra_file_trasfer_t_iva(long,const TDate&,long,const TString&,const TString&,const TString&,const TString&,const TString&); - void registra_file_temp_riva(long,int,const real&,const TString&,const real&,int,int,int,int,long); - void registra_file_trasfer_r_iva(long,int,const real&,const TString&,const real&,int,int,int,int,long); - - void setta_parametri_record(const TString& sigla,const TString& flag); - - const char* converti (TString& data_AS400); - const char* riconverti(TString& data_PC); - - static bool codice_registro_hnd (TMask_field& f, KEY k); - static bool codice_causale_hnd (TMask_field& f, KEY k); - static bool numero_protocollo_hnd (TMask_field& f, KEY k); - static bool ultimo_protocollo_hnd (TMask_field& f, KEY k); - static bool codice_pagamento_hnd (TMask_field& f, KEY k); - static bool data_stampa (TMask_field& f, KEY k); - - static bool controllo_partita (TMask_field& f, KEY k); - static bool controllo_contropartita (TMask_field& f, KEY k); - static bool controllo_importo (TMask_field& f, KEY k); - - static bool codice_clifo_hnd (TMask_field& f, KEY k); - static bool codice_iva_hnd (TMask_field& f, KEY k); - static bool imposta_hnd (TMask_field& f, KEY k); - static bool detraibilita_hnd (TMask_field& f, KEY k); - static bool tipocr_hnd (TMask_field& f, KEY k); - - bool decodifica_codiva(const TString& codiva); - - TVar_mov(char mov); -}; - -HIDDEN TVar_mov& app() { return (TVar_mov &) main_app(); } - -HIDDEN int date2esc(const TDate& d, int* prevesc) -{ - if (prevesc) *prevesc = 0; - TTable esc("ESC"); - for (int err = esc.first(); err == NOERR; err = esc.next()) - { - const TDate ia(esc.get("D0")); // Data inizio esercizio - const TDate fa(esc.get("D1")); // Data fine esercizio - const anno = esc.get_int("CODTAB"); - if (d >= ia && d <= fa) - return anno; - if (prevesc) *prevesc = anno; - } - return 0; -} - -TVar_mov::TVar_mov(char mov) : _scelta(toupper(mov)) -{ - switch (_scelta) - { - case 'P': - _titolo = "Variazione movimenti prima nota"; - break; - - case 'I': - _titolo = "Variazione movimenti iva"; - break; - - default: - break; - } -} - -bool TVar_mov::create() -{ - TApplication::create(); - - _pcon = new TLocalisamfile (LF_PCON); - _clifo = new TLocalisamfile (LF_CLIFO); - _rec_mov = new TRectype (LF_MOV); - - if (_scelta == 'P') - { - TString80 tmpmov = "%"; - tmpmov << get_firm_dir(); - tmpmov << "\\" << TEMP_MOV; - TString80 tmprmov = "%"; - tmprmov << get_firm_dir(); - tmprmov << "\\" << TEMP_RMOV; - - _tmov = new TIsamtempfile(LF_MOV, tmpmov, 0); - _trmov = new TIsamtempfile(LF_RMOV, tmprmov, 0); - _rec_rmov = new TRectype (LF_RMOV); - } - else - if (_scelta == 'I') - { - TString80 tmpmov = "%"; - tmpmov << get_firm_dir(); - tmpmov << "\\" << TEMP_MOV; - TString80 tmprmoviva = "%"; - tmprmoviva << get_firm_dir(); - tmprmoviva << "\\" << TEMP_RMOVIVA; - - _tmov = new TIsamtempfile(LF_MOV, tmpmov, 0); - _tiva = new TIsamtempfile(LF_RMOVIVA, tmprmoviva, 0); - _rec_riva = new TRectype (LF_RMOVIVA); - } - - dispatch_e_menu (BAR_ITEM(1)); - - return TRUE; -} - -bool TVar_mov::destroy() -{ - delete _rec_mov; - delete _pcon; - delete _clifo; - - if (_scelta == 'P') - { - delete _trmov; - delete _rec_rmov; - } - else - if (_scelta == 'I') - { - delete _tiva; - delete _rec_riva; - } - - delete _tmov; - - return TApplication::destroy(); -} - -void TVar_mov::leggi_record_controllo() -{ - _tras_file.read_control_rec(); - _control_rec = _tras_file.record(); -} - -const char* TVar_mov::converti (TString& data_AS400) -{ - TEMP = data_AS400.mid(4,2); - TEMP << "-" <get (MOV_REG); - - if (!setta_campi_maschera_iva(mask)) - return FALSE; - - mask.set_handler(F_CODCF, codice_clifo_hnd); - - if (_righe) - { - mask.set_handler(F_SOTTOCONTO, controllo_partita); - mask.set_handler(F_CODIVA, codice_iva_hnd); - mask.set_handler(F_IMPOSTA, imposta_hnd); - mask.set_handler(F_TIPODET, detraibilita_hnd); - mask.set_handler(F_TIPOCR, tipocr_hnd); - } - - tasto = mask.run(); - - switch (tasto) - { - case K_ESC : - break; - - case K_QUIT : - break; - - case K_SAVE : - { - registra_IVA(mask); - } - break; - - default: - break; - } - } - } - while (tasto != K_QUIT); //K_ENTER - - return TRUE; -} - -bool TVar_mov::ricerca_movimento(TMask& m) -{ - _numrig = atoi(m.get(F_NUMRIG)); - - if (_numrig == 0) - { - _righe = FALSE; - return esiste_testata_mov(m); - } - else - { - _righe = TRUE; - esiste_testata_mov(m); - if (_scelta == 'P') - return esiste_riga_mov(m); - else - return esiste_riga_iva(m); - } - - return TRUE; -} - -bool TVar_mov::esiste_testata_mov(TMask& m) -{ - long nprog; - - _numreg = m.get_long(F_NUMREG); - - _tmov->setkey(1); - _tmov->zero(); - _tmov->put(MOV_NUMREG, _numreg); - - if (_tmov->read() == NOERR) - { - if (_scelta == 'P') - { - nprog = _tmov->get_long(MOV_NUMGIO); - nprog += _tras_file.start('Z'); - } - else - if (_scelta == 'I') - { - _tiva->setkey(1); - _tiva->zero(); - _tiva->put(RMI_NUMREG, _numreg); - _tiva->read(); - long nr = _tiva->get_long(RMI_NUMREG); - if (_numreg != nr) - return error_box("Registrazione richiesta NON PRESENTE tra i movimenti in trasferimento"); - - nprog = _tmov->get_long(MOV_ANNOIVA); - nprog += _tras_file.start('U'); - } - - _tras_file.read_rec_trasfer(nprog); - _record = _tras_file.read_rec(); - - char annullato = _record.sub(248,249)[0]; - - if (annullato == 'A') - return error_box("Registrazione presente ma ANNULLATA: impossibile variarla"); - - *_rec_mov = _tmov->curr(); - } - else - return error_box("Registrazione richiesta NON PRESENTE tra i movimenti in trasferimento"); - - return TRUE; -} - -bool TVar_mov::esiste_riga_mov(TMask& m) -{ - _numreg = m.get_long(F_NUMREG); - _numrig = m.get_int (F_NUMRIG); - - _trmov->setkey(1); - _trmov->zero(); - _trmov->put(RMV_NUMREG, _numreg); - _trmov->put(RMV_NUMRIG, _numrig); - - if (_trmov->read() == NOERR) - { - long nprog = _trmov->get_long(RMV_ANNOES); - nprog += _tras_file.start('Z'); - - _tras_file.read_rec_trasfer(nprog); - _record = _tras_file.read_rec(); - - char annullato = _record.sub(248,249)[0]; - - if (annullato == 'A') - return error_box("Registrazione presente ma ANNULLATA: impossibile variarla"); - - *_rec_rmov = _trmov->curr(); - } - else - return error_box("Registrazione richiesta NON PRESENTE tra i movimenti in trasferimento"); - - return TRUE; -} - -bool TVar_mov::esiste_riga_iva(TMask& m) -{ - _numreg = m.get_long(F_NUMREG); - _numrig = m.get_int (F_NUMRIG); - - _tiva->setkey(1); - _tiva->zero(); - _tiva->put(RMI_NUMREG, _numreg); - _tiva->put(RMI_NUMRIG, _numrig); - - if (_tiva->read() == NOERR) - { - long nprog = _tiva->get_long(RMI_ANNOES); - nprog += _tras_file.start('U'); - - _tras_file.read_rec_trasfer(nprog); - _record = _tras_file.read_rec(); - - char annullato = _record.sub(248,249)[0]; - - if (annullato == 'A') - return error_box("Registrazione presente ma ANNULLATA: impossibile variarla"); - - *_rec_riva = _tiva->curr(); - } - else - return error_box("Registrazione richiesta NON PRESENTE tra i movimenti in trasferimento"); - - return TRUE; -} - -void TVar_mov::setta_campi_maschera(TMask& m) -{ - int annorif = atoi(_record.sub(21,22)); - TDate datareg (_rec_mov->get_date(MOV_DATAREG)); - TDate datadoc (_rec_mov->get_date(MOV_DATADOC)); - TString numdoc = _rec_mov->get (MOV_NUMDOC); - TString regiva = _rec_mov->get (MOV_REG); - regiva.trim(); - long protiva = _rec_mov->get_long(MOV_PROTIVA); - long nuprotiva = _rec_mov->get_long(MOV_UPROTIVA); - TString codcaus = _rec_mov->get (MOV_CODCAUS); - TString codpag = _rec_mov->get (MOV_CODPAG); - codpag.trim(); - - m.set(F_NUMREG, _numreg); - m.set(F_NUMRIG, _numrig); - m.set(F_DATAREG, datareg.string()); - m.set(F_ANNO, annorif); - m.set(F_DATADOC, datadoc.string()); - m.set(F_NUMDOC, numdoc); - m.set(F_REGIVA, regiva); - m.set(F_PROTIVA, protiva); - m.set(F_NUPROTIVA, nuprotiva); - m.set(F_CODCAUS, codcaus); - m.set(F_CODPAG, codpag); - - m.disable(F_NUMREG); - m.disable(F_NUMRIG); - - if (!_righe) - { - m.enable(F_DATAREG); - m.enable(F_ANNO); - m.enable(F_DATADOC); - m.enable(F_NUMDOC); - m.enable(F_REGIVA); - m.enable(F_PROTIVA); - m.enable(F_NUPROTIVA); - m.enable(F_CODCAUS); - m.enable(F_CODPAG); - m.disable(F_GRUPPO); - m.disable(F_CONTO); - m.disable(F_SOTTOCONTO); - m.disable(F_SEZIONE); - m.disable(F_IMPORTO); - m.disable(F_DESCR); - m.disable(F_GRUPPOC); - m.disable(F_CONTOC); - m.disable(F_SOTTOC); - } - else - if (_righe) - { - int gruppo = _trmov->get_int (RMV_GRUPPO); - int conto = _trmov->get_int (RMV_CONTO); - long sottocon = _trmov->get_long(RMV_SOTTOCONTO); - char sezione = _trmov->get_char(RMV_SEZIONE); - TString descr = _trmov->get (RMV_DESCR); - int gruppoc = _trmov->get_int (RMV_GRUPPOC); - int contoc = _trmov->get_int (RMV_CONTOC); - long sottoc = _trmov->get_long(RMV_SOTTOCONTOC); - real importo = _trmov->get_real(RMV_IMPORTO); - - m.set(F_GRUPPO, gruppo); - m.set(F_CONTO, conto); - m.set(F_SOTTOCONTO, sottocon); - m.set(F_SEZIONE, sezione); - m.set(F_DESCR, descr); - m.set(F_GRUPPOC, gruppoc); - m.set(F_CONTOC, contoc); - m.set(F_SOTTOC, sottoc); - m.set(F_IMPORTO, importo.string()); - - m.disable(F_DATAREG); - m.disable(F_ANNO); - m.disable(F_DATADOC); - m.disable(F_NUMDOC); - m.disable(F_REGIVA); - m.disable(F_PROTIVA); - m.disable(F_NUPROTIVA); - m.disable(F_CODCAUS); - m.disable(F_CODPAG); - - m.enable(F_GRUPPO); - m.enable(F_CONTO); - m.enable(F_SOTTOCONTO); - m.enable(F_SEZIONE); - m.enable(F_IMPORTO); - m.enable(F_DESCR); - m.enable(F_GRUPPOC); - m.enable(F_CONTOC); - m.enable(F_SOTTOC); - } -} - -bool TVar_mov::setta_campi_maschera_iva(TMask& m) -{ - TDate datareg (_rec_mov->get_date(MOV_DATAREG)); - TDate data74ter (_rec_mov->get_date(MOV_DATA74TER)); - TString regiva = _rec_mov->get (MOV_REG); - regiva.trim(); - TString codcaus = _rec_mov->get (MOV_CODCAUS); - long codcf = _rec_mov->get_long(MOV_CODCF); - - TString ragsoc = _record.sub(61,86); - TString ind = _record.sub(86,108); - TString localita = _record.sub(108,126); - TString cap = _record.sub(126,131); - TString prov = _record.sub(131,133); - - if (codcaus.not_empty()) - ricerca_codcaus(codcaus); - - int anno = date2esc(datareg); - - char cr = regiva[0]; - TString codreg; - - if (isdigit(cr)) - codreg.format("%03c", cr); - else - codreg.format("%-3c", cr); - - TRegistro rg (codreg, anno); - _tiporeg = rg.tipo(); - - if (regiva.not_empty()) - { - if (!rg.ok()) - return error_box("Registrazione presente ma con PRIMANOTA ERRATA: correggerla prima"); - } - else - return error_box("Campo NON VALIDO o codice NON PRESENTE in archivio"); - - m.set(F_NUMREG, _numreg); - m.set(F_NUMRIG, _numrig); - m.set(F_DATA74TER, data74ter.string()); - m.set(F_CODCF, codcf); - m.set(F_RAGSOCOCC, ragsoc); - m.set(F_INDOCC, ind); - m.set(F_LOCALITA, localita); - m.set(F_CAPOCC, cap); - m.set(F_PROVOCC, prov); - - m.disable(F_NUMREG); - m.disable(F_NUMRIG); - - if (!_righe) - { - m.enable(F_DATA74TER); - m.enable(F_CODCF); - m.enable(F_RAGSOCOCC); - m.enable(F_INDOCC); - m.enable(F_LOCALITA); - m.enable(F_CAPOCC); - m.enable(F_PROVOCC); - m.disable(F_IMPONIBILE); - m.disable(F_CODIVA); - m.disable(F_IMPOSTA); - m.disable(F_TIPODET); - m.disable(F_TIPOCR); - m.disable(F_GRUPPO); - m.disable(F_CONTO); - m.disable(F_SOTTOCONTO); - } - else - if (_righe) - { - real imponibile (_tiva->get_real(RMI_IMPONIBILE)); - TString codiva (_tiva->get (RMI_CODIVA)); - real imposta (_tiva->get_real(RMI_IMPOSTA)); - int tipodet = _tiva->get_int (RMI_TIPODET); - int tipocr = _tiva->get_int (RMI_TIPOCR); - int gruppo = _tiva->get_int (RMI_GRUPPO); - int conto = _tiva->get_int (RMI_CONTO); - long sottoc = _tiva->get_long(RMI_SOTTOCONTO); - - m.set(F_IMPONIBILE, imponibile.string()); - m.set(F_CODIVA, codiva); - m.set(F_IMPOSTA, imposta.string()); - m.set(F_TIPODET, tipodet); - m.set(F_TIPOCR, tipocr); - m.set(F_GRUPPO, gruppo); - m.set(F_CONTO, conto); - m.set(F_SOTTOCONTO, sottoc); - - m.disable(F_DATA74TER); - m.disable(F_CODCF); - m.disable(F_RAGSOCOCC); - m.disable(F_INDOCC); - m.disable(F_LOCALITA); - m.disable(F_CAPOCC); - m.disable(F_PROVOCC); - - m.enable(F_IMPONIBILE); - m.enable(F_CODIVA); - m.enable(F_IMPOSTA); - m.enable(F_TIPODET); - m.enable(F_TIPOCR); - m.enable(F_GRUPPO); - m.enable(F_CONTO); - m.enable(F_SOTTOCONTO); - } - - return TRUE; -} - -bool TVar_mov::codice_registro_hnd(TMask_field& f, KEY k) -{ - TTable reg ("REG"); - TString descr,dep; - - if (k == K_TAB || k == K_ENTER) - { - TString codreg = f.get(); - char cr = codreg[0]; - TDate datareg (f.mask().get(F_DATAREG)); - int anno = date2esc(datareg); - - if (isdigit(cr)) - dep.format("%04d%03c", anno, cr); - else - dep.format("%04d%-3c", anno, cr); - - reg.zero(); - reg.put("CODTAB", dep); - if (reg.read() == NOERR) - { - descr = reg.get("S0"); - f.mask().set(F_DESCRREG, descr); - } - else - if (codreg.not_empty() && f.mask().is_running()) - return warning_box("Codice registro IVA non presente in tabella"); - } - - return TRUE; -} - -bool TVar_mov::codice_causale_hnd(TMask_field& f, KEY k) -{ - TLocalisamfile cau (LF_CAUSALI); - TString descr; - - if (k == K_TAB || k == K_ENTER) - { - TString codcau = f.get(); - - if (f.mask().is_running()) - { - TString codreg = f.mask().get(F_REGIVA); - - if (codreg.not_empty()) - if (codcau.empty()) - return warning_box("Il codice registro IVA e' significativo: deve essere significativo anche il codice causale"); - } - - cau.setkey(1); - cau.zero(); - cau.put("CODCAUS", codcau); - if (cau.read() == NOERR) - { - descr = cau.get("DESCR"); - f.mask().set(F_DESCRCAU, descr); - } - else - if (f.mask().is_running()) - return warning_box("Codice causale non presente in tabella"); - } - return TRUE; -} - -bool TVar_mov::numero_protocollo_hnd(TMask_field& f, KEY k) -{ - if (k != K_ENTER) return FALSE; - - TString codreg = f.mask().get(F_REGIVA); - long protiva = atol(f.mask().get(F_PROTIVA)); - long uprotiva = atol(f.mask().get(F_NUPROTIVA)); - - if (codreg.empty()) - if (protiva != 0) - return warning_box("Il codice registro IVA non e' significativo: non e' possibile compilare il numero protocollo IVA"); - - return TRUE; -} - -bool TVar_mov::ultimo_protocollo_hnd(TMask_field& f, KEY k) -{ - if (k != K_ENTER) return FALSE; - - TString codreg = f.mask().get(F_REGIVA); - long protiva = atol(f.mask().get(F_PROTIVA)); - long uprotiva = atol(f.mask().get(F_NUPROTIVA)); - - if (codreg.empty()) - if (uprotiva != 0) - return warning_box("Il codice registro IVA non e' significativo: non e' possibile compilare l' ultimo numero protocollo IVA"); - - if (protiva == 0) - if (uprotiva != 0) - return warning_box("Numero protocollo IVA non significativo: non e' possibile compilare il numero protocollo IVA riepilogato"); - - return TRUE; -} - -bool TVar_mov::codice_pagamento_hnd(TMask_field& f, KEY k) -{ - TTable pag ("%CPG"); - TString descr,codpag,dep; - - if (k == K_TAB || k == K_ENTER) - { - codpag = f.get(); - dep.format("%04s", (const char*)codpag); - - pag.zero(); - pag.put("CODTAB", dep); - if (pag.read() == NOERR) - { - descr = pag.get("S0"); - f.mask().set(F_DESCRPAG, descr); - } - else - if (codpag.not_empty() && k == K_ENTER) - return warning_box("Codice pagamento non presente in tabella"); - } - - return TRUE; -} - -bool TVar_mov::data_stampa(TMask_field& f, KEY k) -{ - if (k != K_ENTER) return FALSE; - - TDate datareg (f.mask().get(F_DATAREG)); - const int ae = date2esc(datareg); - - TLibro_giornale gio; - gio.read(ae); //se _ae e' zero la read considera come anno quello corrente - - if (datareg < gio.last_print()) - return warning_box("La data di registrazione e' minore della data di stampa del Libro Giornale"); - - TString codreg = f.mask().get(F_REGIVA); - - if (!codreg.blank()) //movimento iva (fattura) - { - TRegistro rg (codreg, ae); - - if (datareg < rg.last_print()) - return error_box("La data di registrazione e' minore della data stampa del registro IVA"); - } - - return TRUE; -} - -bool TVar_mov::controllo_partita(TMask_field& f, KEY k) -{ - if (k == K_TAB || k == K_ENTER) - { - int gruppo = f.mask().get_int (F_GRUPPO); - int conto = f.mask().get_int (F_CONTO); - long sottoc = f.mask().get_long(F_SOTTOCONTO); - - TConto tc (gruppo,conto,sottoc); - - TString descr = tc.descrizione(); - f.mask().set(F_DESCRPARTITA, descr); - - if (k == K_ENTER) - if (!tc.find()) - return warning_box("Sottoconto partita non presente in anagrafica Piano dei Conti oppure anagrafica Clienti / Fornitori"); - } - - return TRUE; -} - -bool TVar_mov::controllo_contropartita(TMask_field& f, KEY k) -{ - if (k == K_TAB || k == K_ENTER) - { - int gruppo = f.mask().get_int (F_GRUPPOC); - int conto = f.mask().get_int (F_CONTOC); - long sottoc = f.mask().get_long(F_SOTTOC); - - TConto tc (gruppo,conto,sottoc); - - TString descr = tc.descrizione(); - f.mask().set(F_DESCRCPARTITA, descr); - - if (k == K_ENTER) - if (gruppo != 0 && conto != 0 && sottoc != 0) - if (!tc.find()) - return warning_box("Sottoconto contropartita non presente in anagrafica Piano dei Conti oppure anagrafica Clienti / Fornitori"); - } - - return TRUE; -} - -bool TVar_mov::controllo_importo(TMask_field& f, KEY k) -{ - if (k == K_ENTER) - { - real importo (f.mask().get(F_IMPORTO)); - - if (importo == ZERO) - return warning_box("L' importo deve essere significativo"); - } - - return TRUE; -} - -bool TVar_mov::codice_clifo_hnd(TMask_field& f, KEY k) -{ - char tipo; - - if (k == K_TAB || k == K_ENTER) - { - long codcf = atol(f.get()); - if (app()._tiporeg == 1) - tipo = 'C'; - else - if (app()._tiporeg == 2) - tipo = 'F'; - - TConto tc (0,0,codcf,tipo); - - if (tc.find()) - { - TString descr = tc.descrizione(); - f.mask().set(F_RAGSOCCF, descr); - } - else - if (k == K_ENTER) - return warning_box("Campo NON VALIDO o codice non presente in archivio"); - } - - return TRUE; -} - -bool TVar_mov::codice_iva_hnd(TMask_field& f, KEY k) -{ - if (k == K_TAB || k == K_ENTER) - { - TString codiva = f.get(); - - bool ok = app().decodifica_codiva(codiva); - - f.mask().set(F_DESCRCODIVA, app()._descr_civa); - - if (k == K_ENTER) - { - real imponibile (f.mask().get(F_IMPONIBILE)); - real imposta (f.mask().get(F_IMPOSTA)); - - if ( (imponibile != ZERO || imposta != ZERO) && codiva.empty() ) - return warning_box("Il codice IVA deve essere indicato obbligatoriamente"); - - if (codiva.not_empty()) - if (!ok) - return warning_box("Codice non presente in tabella"); - } - } - - return TRUE; -} - -bool TVar_mov::decodifica_codiva(const TString& codiva) -{ - TTable iva ("%IVA"); - TString dep; - - dep.format("%-4s", (const char*)codiva); - - iva.zero(); - iva.put("CODTAB", dep); - if (iva.read() == NOERR) - { - _descr_civa = iva.get("S0"); - return TRUE; - } - else - { - _descr_civa = ""; - return FALSE; - } - - return TRUE; -} - -bool TVar_mov::imposta_hnd(TMask_field& f, KEY k) -{ - if (k == K_ENTER) - { - real imposta (f.mask().get(F_IMPOSTA)); - - if (app()._corrisp && imposta != ZERO) - return warning_box("Il movimento e' relativo ad un corrispettivo: l'imposta deve essere uguale a 0"); - } - - return TRUE; -} - -bool TVar_mov::detraibilita_hnd(TMask_field& f, KEY k) -{ - if (k == K_ENTER) - { - int det = atoi(f.get()); - - if (det != 0 && det != 1 && det != 3 && det != 9) - return warning_box("Valore non ammesso per il tipo detraibilita'"); - } - - return TRUE; -} - -bool TVar_mov::tipocr_hnd(TMask_field& f, KEY k) -{ - if (k == K_ENTER) - { - int tcr = atoi(f.get()); - - if (tcr != 0 && tcr != 1 && tcr != 2 && tcr != 3 - && tcr != 4 && tcr != 5 && tcr != 8 && tcr != 9) - return warning_box("Valore non ammesso per il tipo costo/ricavo"); - } - - return TRUE; -} - -void TVar_mov::registra_PN(TMask& m) -{ - if (!_righe) - { - long numreg = m.get_long(F_NUMREG); - int annorif = m.get_int (F_ANNO); - TDate datareg (m.get(F_DATAREG)); - TDate datadoc (m.get(F_DATADOC)); - TString numdoc = m.get (F_NUMDOC); - TString regiva = m.get (F_REGIVA); - long protiva = m.get_long(F_PROTIVA); - long nuprotiva = m.get_long(F_NUPROTIVA); - TString codcaus = m.get (F_CODCAUS); - TString codpag = m.get (F_CODPAG); - - registra_file_temp_mov(numreg,datareg,datadoc,numdoc,regiva,protiva,nuprotiva,codcaus,codpag); - registra_file_trasfer_t(numreg,annorif,datareg,datadoc,numdoc,regiva,protiva,nuprotiva,codcaus,codpag); - } - else - if (_righe) - { - long numreg = m.get_long(F_NUMREG); - int numrig = m.get_int (F_NUMRIG); - int gruppo = m.get_int (F_GRUPPO); - int conto = m.get_int (F_CONTO); - long sottoc = m.get_long(F_SOTTOCONTO); - char sezione = m.get (F_SEZIONE)[0]; - TString descr = m.get (F_DESCR); - int gruppoc = m.get_int (F_GRUPPOC); - int contoc = m.get_int (F_CONTOC); - long sottocc = m.get_long(F_SOTTOC); - real importo (m.get(F_IMPORTO)); - - registra_file_temp_rmov(numreg,numrig,gruppo,conto,sottoc,sezione,descr,gruppoc,contoc,sottocc,importo); - registra_file_trasfer_r(numreg,numrig,gruppo,conto,sottoc,sezione,descr,gruppoc,contoc,sottocc,importo); - } -} - -void TVar_mov::registra_file_temp_mov(long nr,const TDate& dr,const TDate& dd,const TString& nd,TString& ri, - long pi,long upi,const TString& cc,TString& cp) -{ - _tmov->setkey(1); - _tmov->zero(); - _tmov->put(MOV_NUMREG, nr); - if (_tmov->read() == NOERR) - { - _tmov->put(MOV_DATAREG, dr); - _tmov->put(MOV_DATADOC, dd); - _tmov->put(MOV_NUMDOC, nd); - _tmov->put(MOV_REG, ri); - _tmov->put(MOV_PROTIVA, pi); - _tmov->put(MOV_UPROTIVA, upi); - _tmov->put(MOV_CODCAUS, cc); - _tmov->put(MOV_CODPAG, cp); - - _tmov->rewrite(); - } -} - -void TVar_mov::registra_file_trasfer_t(long nr,int ar,const TDate& dr,const TDate& dd,const TString& nd,TString& ri, - long pi,long upi,const TString& cc,const TString& cp) -{ - TString app,str; - TRectype* rec; - rec = new TRectype (LF_RMOV); - - _trmov->setkey(1); - _trmov->zero(); - _trmov->put(RMV_NUMREG, nr); - *rec = _trmov->curr(); - - for (_trmov->read(); !_trmov->eof(); _trmov->next()) - { - if (_trmov->curr() > *rec) break; - - long numrec = _trmov->get_int(RMV_ANNOES); - numrec += _tras_file.start('Z'); - - _tras_file.read_rec_trasfer(numrec); //Leggo il record della prima nota - - app = dr.string(); - str = riconverti(app); - _tras_file.put(str,"Z1",0,numrec); - app = dd.string(); - str = riconverti(app); - _tras_file.put(str,"Z1",4,numrec); - str = format("%d", ar); - _tras_file.put(str,"Z1",50,numrec); - str = format("%-7s", (const char*) nd); - _tras_file.put(str,"Z1",5,numrec); - if (ri == "") - ri = " "; - _tras_file.put(ri,"Z1",6,numrec); - _tras_file.put(cc,"Z1",8,numrec); - str = format("%05ld", pi); - _tras_file.put(str,"Z1",7,numrec); - str = format("%05ld", upi); - _tras_file.put(str,"Z1",10,numrec); - str = format("%2s", (const char*) cp); - _tras_file.put(str,"Z1",9,numrec); - - _tras_file.write(numrec); - } - - delete rec; -} - -void TVar_mov::registra_file_temp_rmov(long nr,int nri,int g,int c,long s,char sez,const TString& desc, - int gc,int cc,long sc,const real& imp) -{ - _trmov->setkey(1); - _trmov->zero(); - _trmov->put(RMV_NUMREG, nr); - _trmov->put(RMV_NUMRIG, nri); - if (_trmov->read() == NOERR) - { - _trmov->put(RMV_GRUPPO, g); - _trmov->put(RMV_CONTO, c); - _trmov->put(RMV_SOTTOCONTO, s); - _trmov->put(RMV_SEZIONE, sez); - _trmov->put(RMV_DESCR, desc); - _trmov->put(RMV_GRUPPOC, gc); - _trmov->put(RMV_CONTOC, cc); - _trmov->put(RMV_SOTTOCONTOC, sc); - _trmov->put(RMV_IMPORTO, imp); - - _trmov->rewrite(); - } -} - -void TVar_mov::registra_file_trasfer_r(long nr,int nri,int g,int c,long s,char sez,const TString& desc, - int gc,int cc,long sc,const real& imp) -{ - TString app,str; - - _trmov->setkey(1); - _trmov->zero(); - _trmov->put(RMV_NUMREG, nr); - _trmov->put(RMV_NUMRIG, nri); - - if (_trmov->read() == NOERR) - { - long numrec = _trmov->get_int(RMV_ANNOES); - numrec += _tras_file.start('Z'); - - _tras_file.read_rec_trasfer(numrec); //Leggo il record della prima nota - - str = format("%02d", g); - _tras_file.put(str,"Z1",17,numrec); - str = format("%02d", c); - _tras_file.put(str,"Z1",18,numrec); - str = format("%06ld", s); - _tras_file.put(str,"Z1",19,numrec); - str = format("%c", sez); - _tras_file.put(str,"Z1",20,numrec); - str = format("%-30s", (const char*)desc); - _tras_file.put(str,"Z1",16,numrec); - str = format("%02d", gc); - _tras_file.put(str,"Z1",21,numrec); - str = format("%02d", cc); - _tras_file.put(str,"Z1",22,numrec); - str = format("%06ld", sc); - _tras_file.put(str,"Z1",23,numrec); - str = format("%011s", (const char*) imp.string()); - _tras_file.put(str,"Z1",24,numrec); - - _tras_file.write(numrec); - } -} - -void TVar_mov::registra_IVA(TMask& m) -{ - if (!_righe) - { - long numreg = m.get_long(F_NUMREG); - TDate data74ter (m.get(F_DATA74TER)); - long codcf = m.get_long(F_CODCF); - TString ragsococc = m.get (F_RAGSOCOCC); - TString indocc = m.get (F_INDOCC); - TString localita = m.get (F_LOCALITA); - TString capocc = m.get (F_CAPOCC); - TString provocc = m.get (F_PROVOCC); - - _tmov->setkey(1); - _tmov->zero(); - _tmov->put(MOV_NUMREG, numreg); - if (_tmov->read() == NOERR) - { - _tmov->put(MOV_DATA74TER, data74ter); - _tmov->put(MOV_CODCF, codcf); - - _tmov->rewrite(); - } - - registra_file_trasfer_t_iva(numreg,data74ter,codcf,ragsococc,indocc,localita,capocc,provocc); - } - else - if (_righe) - { - long numreg = m.get_long(F_NUMREG); - int numrig = m.get_int (F_NUMRIG); - real imponibile (m.get (F_IMPONIBILE)); - TString codiva = m.get (F_CODIVA); - real imposta (m.get (F_IMPOSTA)); - int tipodet = m.get_int (F_TIPODET); - int tipocr = m.get_int (F_TIPOCR); - int gruppo = m.get_int (F_GRUPPO); - int conto = m.get_int (F_CONTO); - long sottoc = m.get_long(F_SOTTOCONTO); - - registra_file_temp_riva(numreg,numrig,imponibile,codiva,imposta,tipodet,tipocr,gruppo,conto,sottoc); - registra_file_trasfer_r_iva(numreg,numrig,imponibile,codiva,imposta,tipodet,tipocr,gruppo,conto,sottoc); - } -} - -void TVar_mov::registra_file_trasfer_t_iva(long nr,const TDate& d74,long cf,const TString& rgo,const TString& io, - const TString& lo,const TString& co,const TString& po) -{ - TString app,str; - TRectype* rec; - rec = new TRectype (LF_RMOVIVA); - - _tiva->setkey(1); - _tiva->zero(); - _tiva->put(RMI_NUMREG, nr); - *rec = _tiva->curr(); - - for (_tiva->read(); !_tiva->eof(); _tiva->next()) - { - if (_tiva->curr() > *rec) break; - - long numrec = _tiva->get_int(RMI_ANNOES); - numrec += _tras_file.start('U'); - - _tras_file.read_rec_trasfer(numrec); //Leggo il record della prima nota - - app = d74.string(); - str = riconverti(app); - _tras_file.put(str,"U1",4,numrec); - str = format("%06d", cf); - _tras_file.put(str,"U1",6,numrec); - str = format("%-25s", (const char*)rgo ); - _tras_file.put(str,"U1",50,numrec); - str = format("%-22s", (const char*)io); - _tras_file.put(str,"U1",51,numrec); - str = format("%-18s", (const char*)lo); - _tras_file.put(str,"U1",52,numrec); - str = format("%05s", (const char*)co ); - _tras_file.put(str,"U1",53,numrec); - str = format("%-2s", (const char*)po); - _tras_file.put(str,"U1",54,numrec); - - _tras_file.write(numrec); - } - - delete rec; -} - -void TVar_mov::registra_file_temp_riva(long nr,int nri,const real& imp,const TString& civa,const real& imposta, - int tdet,int tcr,int g,int c,long s) -{ - _tiva->setkey(1); - _tiva->zero(); - _tiva->put(RMI_NUMREG, nr); - _tiva->put(RMI_NUMRIG, nri); - if (_tiva->read() == NOERR) - { - _tiva->put(RMI_IMPONIBILE, imp); - _tiva->put(RMI_CODIVA, civa); - _tiva->put(RMI_IMPOSTA, imposta); - _tiva->put(RMI_TIPODET, tdet); - _tiva->put(RMI_TIPOCR, tcr); - _tiva->put(RMI_GRUPPO, g); - _tiva->put(RMI_CONTO, c); - _tiva->put(RMI_SOTTOCONTO, s); - - _tiva->rewrite(); - } -} - -void TVar_mov::registra_file_trasfer_r_iva(long nr,int nri,const real& imp,const TString& civa,const real& imposta, - int tdet,int tcr,int g,int c,long s) -{ - TString app,str; - - _tiva->setkey(1); - _tiva->zero(); - _tiva->put(RMI_NUMREG, nr); - _tiva->put(RMI_NUMRIG, nri); - - if (_tiva->read() == NOERR) - { - long numrec = _tiva->get_int(RMI_ANNOES); - numrec += _tras_file.start('U'); - - _tras_file.read_rec_trasfer(numrec); //Leggo il record dell' iva - - str = format("%011s", (const char*) imp.string()); - _tras_file.put(str,"U1",14,numrec); - str = format("%02s", (const char*) civa); - _tras_file.put(str,"U1",13,numrec); - str = format("%09s", (const char*) imposta.string()); - _tras_file.put(str,"U1",15,numrec); - str = format("%d", tdet); - _tras_file.put(str,"U1",16,numrec); - str = format("%d", tcr); - _tras_file.put(str,"U1",17,numrec); - str = format("%02d", g); - _tras_file.put(str,"U1",19,numrec); - str = format("%02d", c); - _tras_file.put(str,"U1",20,numrec); - str = format("%06ld", s); - _tras_file.put(str,"U1",21,numrec); - - _tras_file.write(numrec); - } -} - -bool TVar_mov::leggi_trasfer() -{ - _trasf = _tras_file.path(_dittaric); - _trasf << "\\trasfer"; - - _tras_file.open(_trasf); - - if (_tras_file.exist()) - { - if (_tras_file.read_control_rec()) - _control_rec = _tras_file.record(); - else - return error_box("Rilevati gravi errori negli archivi:procedura interrotta"); - } - else - return error_box("Al momento non presenti trasferimenti attivi sulla ditta selezionata"); - - return TRUE; -} - -bool TVar_mov::esegui_controlli() -{ - TConfig conf(CONFIG_DITTA); - - _std = conf.get("FlStTra"); - - if (!prefix().exist(_dittaric)) - return error_box("Rilevati gravi errori negli archivi: procedura interrotta"); - - if (!leggi_trasfer()) - return FALSE; - - if (!controlli()) - return FALSE; - - return TRUE; -} - -void TVar_mov::setta_parametri_record(const TString& sigla,const TString& flag) -{ - TConfig conf (CONFIG_DITTA); - - conf.set("FlStTra", flag); - - leggi_record_controllo(); - _control_rec.overwrite(sigla,240); - - const int size = 256; - - _tras_file.write_control_rec(_control_rec, size); -} - -bool TVar_mov::controlli() -{ - if (_std == "T") - return error_box("Variazione NON POSSIBILE: eseguire prima la ricezione delle tabelle"); - - if (_std == "M") - return error_box("Variazione NON POSSIBILE: trasferimento movimenti gia' iniziato"); - - if (_std == "*") - { - warning_box("Trasferimento interamente completato: proseguire per cancellare il file"); - fremove(_trasf); - return FALSE; - } - - return TRUE; -} - -bool TVar_mov::menu(MENU_TAG m) -{ - if (m == BAR_ITEM(1)) - return main_loop(); - return FALSE; -} - -int cg2800 (int argc, char* argv[]) -{ - switch (*argv[2]) - { - case 'P': - { - TVar_mov main_app(*argv[2]); - main_app.run(argc, argv,main_app._titolo); - } - break; - case 'I': -{ - TVar_mov main_app(*argv[2]); - main_app.run(argc, argv,main_app._titolo); -} -break; - case 'S': -{ - TDitta_ric a; - a.run(argc, argv,"Scelta ditta per ricezione"); -} -break; - case 'A': -{ - TAnn_mov a; - a.run(argc, argv,"Annullamento movimenti da ricevere"); -} -break; - case 'V': -{ - TVis_ric a; - a.run(argc, argv,"Visualizzazione stato ricezione"); -} -break; -default: -break; -} -//main_app.run(argc, argv,main_app._titolo); -return TRUE; -} +// Variazione movimenti di prima nota e movimenti iva + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include "cglib04.h" +#include "cglib.h" +#include "cg2103.h" +#include "conto.h" + +#include "cg2800.h" +#include "cg2801.h" +#include "cg2802.h" +#include "cg2803.h" + +HIDDEN TString80 TEMP; + +//HIDDEN int date2esc(const TDate& d, int* prevesc = NULL); + +class TVar_mov : public TApplication +{ + TIsamtempfile* _tmov,* _trmov,* _tiva; + TLocalisamfile* _pcon,* _clifo, *_mov, *_rmov, *_rmoviva; + TTable* _tab_reg; + TRectype* _rec_mov,* _rec_rmov,* _rec_riva; + TTransfer_file _tras_file; + char _scelta; + + TString _trasf,_std,_descr_civa; + long _dittaric,_numreg; + TString _control_rec,_record; + bool _righe,_corrisp; + int _numrig,_tiporeg; + +public: + TString _titolo; + + virtual bool create(); + virtual bool destroy(); + virtual bool menu(MENU_TAG m); + bool main_loop(); + bool esegui_controlli(); + bool leggi_trasfer(); + bool controlli(); + void leggi_record_controllo(); + bool video_PN(); + bool video_IVA(); + void registra_PN(TMask& m); + void registra_IVA(TMask& m); + bool esiste_testata_mov(TMask& m); + bool ricerca_movimento(TMask& m); + + bool esiste_riga_mov(TMask& m); + bool esiste_riga_iva(TMask& m); + + void ricerca_codcaus(const TString& codcaus); + void setta_campi_maschera(TMask& m); + bool setta_campi_maschera_iva(TMask& m); + + void registra_file_temp_mov(long,const TDate&,const TDate&,const TString&,TString&,long,long,const TString&,TString&); + void registra_file_trasfer_t(long,int,const TDate&,const TDate&,const TString&,TString&,long,long,const TString&,const TString&); + void registra_file_temp_rmov(long,int,int,int,long,char,const TString&,int,int,long,const real&); + void registra_file_trasfer_r(long,int,int,int,long,char,const TString&,int,int,long,const real&); + void registra_file_trasfer_t_iva(long,const TDate&,long,const TString&,const TString&,const TString&,const TString&,const TString&); + void registra_file_temp_riva(long,int,const real&,const TString&,const real&,int,int,int,int,long); + void registra_file_trasfer_r_iva(long,int,const real&,const TString&,const real&,int,int,int,int,long); + + void setta_parametri_record(const TString& sigla,const TString& flag); + + const char* converti (TString& data_AS400); + const char* riconverti(TString& data_PC); + + static bool codice_registro_hnd (TMask_field& f, KEY k); + static bool codice_causale_hnd (TMask_field& f, KEY k); + static bool numero_protocollo_hnd (TMask_field& f, KEY k); + static bool ultimo_protocollo_hnd (TMask_field& f, KEY k); + static bool codice_pagamento_hnd (TMask_field& f, KEY k); + static bool data_stampa (TMask_field& f, KEY k); + + static bool controllo_partita (TMask_field& f, KEY k); + static bool controllo_contropartita (TMask_field& f, KEY k); + static bool controllo_importo (TMask_field& f, KEY k); + + static bool codice_clifo_hnd (TMask_field& f, KEY k); + static bool codice_iva_hnd (TMask_field& f, KEY k); + static bool imposta_hnd (TMask_field& f, KEY k); + static bool detraibilita_hnd (TMask_field& f, KEY k); + static bool tipocr_hnd (TMask_field& f, KEY k); + + bool decodifica_codiva(const TString& codiva); + + TVar_mov(char mov); +}; + +HIDDEN TVar_mov& app() { return (TVar_mov &) main_app(); } + +HIDDEN int date2esc(const TDate& d, int* prevesc) +{ + if (prevesc) *prevesc = 0; + TTable esc("ESC"); + for (int err = esc.first(); err == NOERR; err = esc.next()) + { + const TDate ia(esc.get("D0")); // Data inizio esercizio + const TDate fa(esc.get("D1")); // Data fine esercizio + const anno = esc.get_int("CODTAB"); + if (d >= ia && d <= fa) + return anno; + if (prevesc) *prevesc = anno; + } + return 0; +} + +TVar_mov::TVar_mov(char mov) : _scelta(toupper(mov)) +{ + switch (_scelta) + { + case 'P': + _titolo = "Variazione movimenti prima nota"; + break; + + case 'I': + _titolo = "Variazione movimenti iva"; + break; + + default: + break; + } +} + +bool TVar_mov::create() +{ + TApplication::create(); + + _pcon = new TLocalisamfile (LF_PCON); + _clifo = new TLocalisamfile (LF_CLIFO); + _rec_mov = new TRectype (LF_MOV); + _mov = new TLocalisamfile (LF_MOV); + _rmov = new TLocalisamfile (LF_RMOV); + _rmoviva = new TLocalisamfile (LF_RMOVIVA); + _tab_reg = new TTable ("REG"); + + if (_scelta == 'P') + { + TString80 tmpmov = "%"; + tmpmov << get_firm_dir(); + tmpmov << "\\" << TEMP_MOV; + TString80 tmprmov = "%"; + tmprmov << get_firm_dir(); + tmprmov << "\\" << TEMP_RMOV; + + _tmov = new TIsamtempfile(LF_MOV, tmpmov, 0); + _trmov = new TIsamtempfile(LF_RMOV, tmprmov, 0); + _rec_rmov = new TRectype (LF_RMOV); + } + else + if (_scelta == 'I') + { + TString80 tmpmov = "%"; + tmpmov << get_firm_dir(); + tmpmov << "\\" << TEMP_MOV; + TString80 tmprmoviva = "%"; + tmprmoviva << get_firm_dir(); + tmprmoviva << "\\" << TEMP_RMOVIVA; + + _tmov = new TIsamtempfile(LF_MOV, tmpmov, 0); + _tiva = new TIsamtempfile(LF_RMOVIVA, tmprmoviva, 0); + _rec_riva = new TRectype (LF_RMOVIVA); + } + + dispatch_e_menu (BAR_ITEM(1)); + + return TRUE; +} + +bool TVar_mov::destroy() +{ + delete _rec_mov; + delete _pcon; + delete _clifo; + delete _mov; + delete _rmov; + delete _rmoviva; + delete _tab_reg; + + if (_scelta == 'P') + { + delete _trmov; + delete _rec_rmov; + } + else + if (_scelta == 'I') + { + delete _tiva; + delete _rec_riva; + } + + delete _tmov; + + return TApplication::destroy(); +} + +void TVar_mov::leggi_record_controllo() +{ + _tras_file.read_control_rec(); + _control_rec = _tras_file.record(); +} + +const char* TVar_mov::converti (TString& data_AS400) +{ + TEMP = data_AS400.mid(4,2); + TEMP << "-" <get (MOV_REG); + + if (!setta_campi_maschera_iva(mask)) + return FALSE; + + mask.set_handler(F_CODCF, codice_clifo_hnd); + + if (_righe) + { + mask.set_handler(F_SOTTOCONTO, controllo_partita); + mask.set_handler(F_CODIVA, codice_iva_hnd); + mask.set_handler(F_IMPOSTA, imposta_hnd); + mask.set_handler(F_TIPODET, detraibilita_hnd); + mask.set_handler(F_TIPOCR, tipocr_hnd); + } + + tasto = mask.run(); + + switch (tasto) + { + case K_ESC : + break; + + case K_QUIT : + break; + + case K_SAVE : + { + registra_IVA(mask); + } + break; + + default: + break; + } + } + } + while (tasto != K_QUIT); //K_ENTER + + return TRUE; +} + +bool TVar_mov::ricerca_movimento(TMask& m) +{ + _numrig = atoi(m.get(F_NUMRIG)); + + if (_numrig == 0) + { + _righe = FALSE; + return esiste_testata_mov(m); + } + else + { + _righe = TRUE; + esiste_testata_mov(m); + if (_scelta == 'P') + return esiste_riga_mov(m); + else + return esiste_riga_iva(m); + } + + return TRUE; +} + +bool TVar_mov::esiste_testata_mov(TMask& m) +{ + long nprog; + + _numreg = m.get_long(F_NUMREG); + + _tmov->setkey(1); + _tmov->zero(); + _tmov->put(MOV_NUMREG, _numreg); + + if (_tmov->read() == NOERR) + { + if (_scelta == 'P') + { + nprog = _tmov->get_long(MOV_NUMGIO); + nprog += _tras_file.start('Z'); + } + else + if (_scelta == 'I') + { + _tiva->setkey(1); + _tiva->zero(); + _tiva->put(RMI_NUMREG, _numreg); + _tiva->read(); + long nr = _tiva->get_long(RMI_NUMREG); + if (_numreg != nr) + return error_box("Registrazione richiesta NON PRESENTE tra i movimenti in trasferimento"); + + nprog = _tmov->get_long(MOV_ANNOIVA); + nprog += _tras_file.start('U'); + } + + _tras_file.read_rec_trasfer(nprog); + _record = _tras_file.read_rec(); + + char annullato = _record.sub(248,249)[0]; + + if (annullato == 'A') + return error_box("Registrazione presente ma ANNULLATA: impossibile variarla"); + + *_rec_mov = _tmov->curr(); + } + else + return error_box("Registrazione richiesta NON PRESENTE tra i movimenti in trasferimento"); + + return TRUE; +} + +bool TVar_mov::esiste_riga_mov(TMask& m) +{ + _numreg = m.get_long(F_NUMREG); + _numrig = m.get_int (F_NUMRIG); + + _trmov->setkey(1); + _trmov->zero(); + _trmov->put(RMV_NUMREG, _numreg); + _trmov->put(RMV_NUMRIG, _numrig); + + if (_trmov->read() == NOERR) + { + long nprog = _trmov->get_long(RMV_ANNOES); + nprog += _tras_file.start('Z'); + + _tras_file.read_rec_trasfer(nprog); + _record = _tras_file.read_rec(); + + char annullato = _record.sub(248,249)[0]; + + if (annullato == 'A') + return error_box("Registrazione presente ma ANNULLATA: impossibile variarla"); + + *_rec_rmov = _trmov->curr(); + } + else + return error_box("Registrazione richiesta NON PRESENTE tra i movimenti in trasferimento"); + + return TRUE; +} + +bool TVar_mov::esiste_riga_iva(TMask& m) +{ + _numreg = m.get_long(F_NUMREG); + _numrig = m.get_int (F_NUMRIG); + + _tiva->setkey(1); + _tiva->zero(); + _tiva->put(RMI_NUMREG, _numreg); + _tiva->put(RMI_NUMRIG, _numrig); + + if (_tiva->read() == NOERR) + { + long nprog = _tiva->get_long(RMI_ANNOES); + nprog += _tras_file.start('U'); + + _tras_file.read_rec_trasfer(nprog); + _record = _tras_file.read_rec(); + + char annullato = _record.sub(248,249)[0]; + + if (annullato == 'A') + return error_box("Registrazione presente ma ANNULLATA: impossibile variarla"); + + *_rec_riva = _tiva->curr(); + } + else + return error_box("Registrazione richiesta NON PRESENTE tra i movimenti in trasferimento"); + + return TRUE; +} + +void TVar_mov::setta_campi_maschera(TMask& m) +{ + int annorif = atoi(_record.sub(21,22)); + TDate datareg (_rec_mov->get_date(MOV_DATAREG)); + TDate datadoc (_rec_mov->get_date(MOV_DATADOC)); + TString numdoc = _rec_mov->get (MOV_NUMDOC); + TString regiva = _rec_mov->get (MOV_REG); + regiva.trim(); + long protiva = _rec_mov->get_long(MOV_PROTIVA); + long nuprotiva = _rec_mov->get_long(MOV_UPROTIVA); + TString codcaus = _rec_mov->get (MOV_CODCAUS); + TString codpag = _rec_mov->get (MOV_CODPAG); + codpag.trim(); + + m.set(F_NUMREG, _numreg); + m.set(F_NUMRIG, _numrig); + m.set(F_DATAREG, datareg.string()); + m.set(F_ANNO, annorif); + m.set(F_DATADOC, datadoc.string()); + m.set(F_NUMDOC, numdoc); + m.set(F_REGIVA, regiva); + m.set(F_PROTIVA, protiva); + m.set(F_NUPROTIVA, nuprotiva); + m.set(F_CODCAUS, codcaus); + m.set(F_CODPAG, codpag); + + m.disable(F_NUMREG); + m.disable(F_NUMRIG); + + if (!_righe) + { + m.enable(F_DATAREG); + m.enable(F_ANNO); + m.enable(F_DATADOC); + m.enable(F_NUMDOC); + m.enable(F_REGIVA); + m.enable(F_PROTIVA); + m.enable(F_NUPROTIVA); + m.enable(F_CODCAUS); + m.enable(F_CODPAG); + m.disable(F_GRUPPO); + m.disable(F_CONTO); + m.disable(F_SOTTOCONTO); + m.disable(F_SEZIONE); + m.disable(F_IMPORTO); + m.disable(F_DESCR); + m.disable(F_GRUPPOC); + m.disable(F_CONTOC); + m.disable(F_SOTTOC); + } + else + if (_righe) + { + int gruppo = _trmov->get_int (RMV_GRUPPO); + int conto = _trmov->get_int (RMV_CONTO); + long sottocon = _trmov->get_long(RMV_SOTTOCONTO); + TString sezione = _trmov->get (RMV_SEZIONE); + TString descr = _trmov->get (RMV_DESCR); + int gruppoc = _trmov->get_int (RMV_GRUPPOC); + int contoc = _trmov->get_int (RMV_CONTOC); + long sottoc = _trmov->get_long(RMV_SOTTOCONTOC); + real importo = _trmov->get_real(RMV_IMPORTO); + + m.set(F_GRUPPO, gruppo); + m.set(F_CONTO, conto); + m.set(F_SOTTOCONTO, sottocon); + m.set(F_SEZIONE, sezione); + m.set(F_DESCR, descr); + m.set(F_GRUPPOC, gruppoc); + m.set(F_CONTOC, contoc); + m.set(F_SOTTOC, sottoc); + m.set(F_IMPORTO, importo.string()); + + m.disable(F_DATAREG); + m.disable(F_ANNO); + m.disable(F_DATADOC); + m.disable(F_NUMDOC); + m.disable(F_REGIVA); + m.disable(F_PROTIVA); + m.disable(F_NUPROTIVA); + m.disable(F_CODCAUS); + m.disable(F_CODPAG); + + m.enable(F_GRUPPO); + m.enable(F_CONTO); + m.enable(F_SOTTOCONTO); + m.enable(F_SEZIONE); + m.enable(F_IMPORTO); + m.enable(F_DESCR); + m.enable(F_GRUPPOC); + m.enable(F_CONTOC); + m.enable(F_SOTTOC); + } +} + +bool TVar_mov::setta_campi_maschera_iva(TMask& m) +{ + TDate datareg (_rec_mov->get_date(MOV_DATAREG)); + TDate data74ter (_rec_mov->get_date(MOV_DATA74TER)); + TString regiva = _rec_mov->get (MOV_REG); + regiva.trim(); + TString codcaus = _rec_mov->get (MOV_CODCAUS); + long codcf = _rec_mov->get_long(MOV_CODCF); + + TString ragsoc = _record.sub(61,86); + TString ind = _record.sub(86,108); + TString localita = _record.sub(108,126); + TString cap = _record.sub(126,131); + TString prov = _record.sub(131,133); + + if (codcaus.not_empty()) + ricerca_codcaus(codcaus); + + int anno = date2esc(datareg); + + char cr = regiva[0]; + TString codreg; + + if (isdigit(cr)) + codreg.format("%03c", cr); + else + codreg.format("%-3c", cr); + + TRegistro rg (codreg, anno); + _tiporeg = rg.tipo(); + + if (regiva.not_empty()) + { + if (!rg.ok()) + return error_box("Registrazione presente ma con PRIMANOTA ERRATA: correggerla prima"); + } + else + return error_box("Campo NON VALIDO o codice NON PRESENTE in archivio"); + + m.set(F_NUMREG, _numreg); + m.set(F_NUMRIG, _numrig); + m.set(F_DATA74TER, data74ter.string()); + m.set(F_CODCF, codcf); + m.set(F_RAGSOCOCC, ragsoc); + m.set(F_INDOCC, ind); + m.set(F_LOCALITA, localita); + m.set(F_CAPOCC, cap); + m.set(F_PROVOCC, prov); + + m.disable(F_NUMREG); + m.disable(F_NUMRIG); + + if (!_righe) + { + m.enable(F_DATA74TER); + m.enable(F_CODCF); + m.enable(F_RAGSOCOCC); + m.enable(F_INDOCC); + m.enable(F_LOCALITA); + m.enable(F_CAPOCC); + m.enable(F_PROVOCC); + m.disable(F_IMPONIBILE); + m.disable(F_CODIVA); + m.disable(F_IMPOSTA); + m.disable(F_TIPODET); + m.disable(F_TIPOCR); + m.disable(F_GRUPPO); + m.disable(F_CONTO); + m.disable(F_SOTTOCONTO); + } + else + if (_righe) + { + real imponibile (_tiva->get_real(RMI_IMPONIBILE)); + TString codiva (_tiva->get (RMI_CODIVA)); + real imposta (_tiva->get_real(RMI_IMPOSTA)); + int tipodet = _tiva->get_int (RMI_TIPODET); + int tipocr = _tiva->get_int (RMI_TIPOCR); + int gruppo = _tiva->get_int (RMI_GRUPPO); + int conto = _tiva->get_int (RMI_CONTO); + long sottoc = _tiva->get_long(RMI_SOTTOCONTO); + + m.set(F_IMPONIBILE, imponibile.string()); + m.set(F_CODIVA, codiva); + m.set(F_IMPOSTA, imposta.string()); + m.set(F_TIPODET, tipodet); + m.set(F_TIPOCR, tipocr); + m.set(F_GRUPPO, gruppo); + m.set(F_CONTO, conto); + m.set(F_SOTTOCONTO, sottoc); + + m.disable(F_DATA74TER); + m.disable(F_CODCF); + m.disable(F_RAGSOCOCC); + m.disable(F_INDOCC); + m.disable(F_LOCALITA); + m.disable(F_CAPOCC); + m.disable(F_PROVOCC); + + m.enable(F_IMPONIBILE); + m.enable(F_CODIVA); + m.enable(F_IMPOSTA); + m.enable(F_TIPODET); + m.enable(F_TIPOCR); + m.enable(F_GRUPPO); + m.enable(F_CONTO); + m.enable(F_SOTTOCONTO); + } + + return TRUE; +} + +bool TVar_mov::codice_registro_hnd(TMask_field& f, KEY k) +{ + TTable reg ("REG"); + TString descr,dep; + + if (k == K_TAB || k == K_ENTER) + { + TString codreg = f.get(); + char cr = codreg[0]; + TDate datareg (f.mask().get(F_DATAREG)); + int anno = date2esc(datareg); + + if (isdigit(cr)) + dep.format("%04d%03c", anno, cr); + else + dep.format("%04d%-3c", anno, cr); + + reg.zero(); + reg.put("CODTAB", dep); + if (reg.read() == NOERR) + { + descr = reg.get("S0"); + f.mask().set(F_DESCRREG, descr); + } + else + if (codreg.not_empty() && f.mask().is_running()) + return warning_box("Codice registro IVA non presente in tabella"); + } + + return TRUE; +} + +bool TVar_mov::codice_causale_hnd(TMask_field& f, KEY k) +{ + TLocalisamfile cau (LF_CAUSALI); + TString descr; + + if (k == K_TAB || k == K_ENTER) + { + TString codcau = f.get(); + + if (f.mask().is_running()) + { + TString codreg = f.mask().get(F_REGIVA); + + if (codreg.not_empty()) + if (codcau.empty()) + return warning_box("Il codice registro IVA e' significativo: deve essere significativo anche il codice causale"); + } + + cau.setkey(1); + cau.zero(); + cau.put("CODCAUS", codcau); + if (cau.read() == NOERR) + { + descr = cau.get("DESCR"); + f.mask().set(F_DESCRCAU, descr); + } + else + if (f.mask().is_running()) + return warning_box("Codice causale non presente in tabella"); + } + return TRUE; +} + +bool TVar_mov::numero_protocollo_hnd(TMask_field& f, KEY k) +{ + if (k != K_ENTER) return FALSE; + + TString codreg = f.mask().get(F_REGIVA); + long protiva = atol(f.mask().get(F_PROTIVA)); + long uprotiva = atol(f.mask().get(F_NUPROTIVA)); + + if (codreg.empty()) + if (protiva != 0) + return warning_box("Il codice registro IVA non e' significativo: non e' possibile compilare il numero protocollo IVA"); + + return TRUE; +} + +bool TVar_mov::ultimo_protocollo_hnd(TMask_field& f, KEY k) +{ + if (k != K_ENTER) return FALSE; + + TString codreg = f.mask().get(F_REGIVA); + long protiva = atol(f.mask().get(F_PROTIVA)); + long uprotiva = atol(f.mask().get(F_NUPROTIVA)); + + if (codreg.empty()) + if (uprotiva != 0) + return warning_box("Il codice registro IVA non e' significativo: non e' possibile compilare l' ultimo numero protocollo IVA"); + + if (protiva == 0) + if (uprotiva != 0) + return warning_box("Numero protocollo IVA non significativo: non e' possibile compilare il numero protocollo IVA riepilogato"); + + return TRUE; +} + +bool TVar_mov::codice_pagamento_hnd(TMask_field& f, KEY k) +{ + TTable pag ("%CPG"); + TString descr,codpag,dep; + + if (k == K_TAB || k == K_ENTER) + { + codpag = f.get(); + dep.format("%04s", (const char*)codpag); + + pag.zero(); + pag.put("CODTAB", dep); + if (pag.read() == NOERR) + { + descr = pag.get("S0"); + f.mask().set(F_DESCRPAG, descr); + } + else + if (codpag.not_empty() && k == K_ENTER) + return warning_box("Codice pagamento non presente in tabella"); + } + + return TRUE; +} + +bool TVar_mov::data_stampa(TMask_field& f, KEY k) +{ + if (k != K_ENTER) return FALSE; + + TDate datareg (f.mask().get(F_DATAREG)); + const int ae = date2esc(datareg); + + TLibro_giornale gio; + gio.read(ae); //se _ae e' zero la read considera come anno quello corrente + + if (datareg < gio.last_print()) + return warning_box("La data di registrazione e' minore della data di stampa del Libro Giornale"); + + TString codreg = f.mask().get(F_REGIVA); + + if (!codreg.blank()) //movimento iva (fattura) + { + TRegistro rg (codreg, ae); + + if (datareg < rg.last_print()) + return error_box("La data di registrazione e' minore della data stampa del registro IVA"); + } + + return TRUE; +} + +bool TVar_mov::controllo_partita(TMask_field& f, KEY k) +{ + if (k == K_TAB || k == K_ENTER) + { + int gruppo = f.mask().get_int (F_GRUPPO); + int conto = f.mask().get_int (F_CONTO); + long sottoc = f.mask().get_long(F_SOTTOCONTO); + + TConto tc (gruppo,conto,sottoc); + + TString descr = tc.descrizione(); + f.mask().set(F_DESCRPARTITA, descr); + + if (k == K_ENTER) + if (!tc.find()) + return warning_box("Sottoconto partita non presente in anagrafica Piano dei Conti oppure anagrafica Clienti / Fornitori"); + } + + return TRUE; +} + +bool TVar_mov::controllo_contropartita(TMask_field& f, KEY k) +{ + if (k == K_TAB || k == K_ENTER) + { + int gruppo = f.mask().get_int (F_GRUPPOC); + int conto = f.mask().get_int (F_CONTOC); + long sottoc = f.mask().get_long(F_SOTTOC); + + TConto tc (gruppo,conto,sottoc); + + TString descr = tc.descrizione(); + f.mask().set(F_DESCRCPARTITA, descr); + + if (k == K_ENTER) + if (gruppo != 0 && conto != 0 && sottoc != 0) + if (!tc.find()) + return warning_box("Sottoconto contropartita non presente in anagrafica Piano dei Conti oppure anagrafica Clienti / Fornitori"); + } + + return TRUE; +} + +bool TVar_mov::controllo_importo(TMask_field& f, KEY k) +{ + if (k == K_ENTER) + { + real importo (f.mask().get(F_IMPORTO)); + char sezione = f.mask().get(F_SEZIONE)[0]; + + if (importo == ZERO && (sezione == 'A' || sezione == 'D') ) + return warning_box("L' importo deve essere significativo"); + if (sezione == '\0' && importo != ZERO) + return warning_box("La sezione e' nulla: l'importo non puo' essere significativo"); + } + + return TRUE; +} + +bool TVar_mov::codice_clifo_hnd(TMask_field& f, KEY k) +{ + char tipo; + + if (k == K_TAB || k == K_ENTER) + { + long codcf = atol(f.get()); + if (app()._tiporeg == 1) + tipo = 'C'; + else + if (app()._tiporeg == 2) + tipo = 'F'; + + TConto tc (0,0,codcf,tipo); + + if (tc.find()) + { + TString descr = tc.descrizione(); + f.mask().set(F_RAGSOCCF, descr); + } + else + if (k == K_ENTER) + return warning_box("Campo NON VALIDO o codice non presente in archivio"); + } + + return TRUE; +} + +bool TVar_mov::codice_iva_hnd(TMask_field& f, KEY k) +{ + if (k == K_TAB || k == K_ENTER) + { + TString codiva = f.get(); + + bool ok = app().decodifica_codiva(codiva); + + f.mask().set(F_DESCRCODIVA, app()._descr_civa); + + if (k == K_ENTER) + { + real imponibile (f.mask().get(F_IMPONIBILE)); + real imposta (f.mask().get(F_IMPOSTA)); + + if ( (imponibile != ZERO || imposta != ZERO) && codiva.empty() ) + return warning_box("Il codice IVA deve essere indicato obbligatoriamente"); + + if (codiva.not_empty()) + if (!ok) + return warning_box("Codice non presente in tabella"); + } + } + + return TRUE; +} + +bool TVar_mov::decodifica_codiva(const TString& codiva) +{ + TTable iva ("%IVA"); + TString dep; + + dep.format("%-4s", (const char*)codiva); + + iva.zero(); + iva.put("CODTAB", dep); + if (iva.read() == NOERR) + { + _descr_civa = iva.get("S0"); + return TRUE; + } + else + { + _descr_civa = ""; + return FALSE; + } + + return TRUE; +} + +bool TVar_mov::imposta_hnd(TMask_field& f, KEY k) +{ + if (k == K_ENTER) + { + real imposta (f.mask().get(F_IMPOSTA)); + + if (app()._corrisp && imposta != ZERO) + return warning_box("Il movimento e' relativo ad un corrispettivo: l'imposta deve essere uguale a 0"); + } + + return TRUE; +} + +bool TVar_mov::detraibilita_hnd(TMask_field& f, KEY k) +{ + if (k == K_ENTER) + { + int det = atoi(f.get()); + + if (det != 0 && det != 1 && det != 3 && det != 9) + return warning_box("Valore non ammesso per il tipo detraibilita'"); + } + + return TRUE; +} + +bool TVar_mov::tipocr_hnd(TMask_field& f, KEY k) +{ + if (k == K_ENTER) + { + int tcr = atoi(f.get()); + + if (tcr != 0 && tcr != 1 && tcr != 2 && tcr != 3 + && tcr != 4 && tcr != 5 && tcr != 8 && tcr != 9) + return warning_box("Valore non ammesso per il tipo costo/ricavo"); + } + + return TRUE; +} + +void TVar_mov::registra_PN(TMask& m) +{ + if (!_righe) + { + long numreg = m.get_long(F_NUMREG); + int annorif = m.get_int (F_ANNO); + TDate datareg (m.get(F_DATAREG)); + TDate datadoc (m.get(F_DATADOC)); + TString numdoc = m.get (F_NUMDOC); + TString regiva = m.get (F_REGIVA); + long protiva = m.get_long(F_PROTIVA); + long nuprotiva = m.get_long(F_NUPROTIVA); + TString codcaus = m.get (F_CODCAUS); + TString codpag = m.get (F_CODPAG); + + registra_file_temp_mov(numreg,datareg,datadoc,numdoc,regiva,protiva,nuprotiva,codcaus,codpag); + registra_file_trasfer_t(numreg,annorif,datareg,datadoc,numdoc,regiva,protiva,nuprotiva,codcaus,codpag); + } + else + if (_righe) + { + long numreg = m.get_long(F_NUMREG); + int numrig = m.get_int (F_NUMRIG); + int gruppo = m.get_int (F_GRUPPO); + int conto = m.get_int (F_CONTO); + long sottoc = m.get_long(F_SOTTOCONTO); + char sezione = m.get (F_SEZIONE)[0]; + TString descr = m.get (F_DESCR); + int gruppoc = m.get_int (F_GRUPPOC); + int contoc = m.get_int (F_CONTOC); + long sottocc = m.get_long(F_SOTTOC); + real importo (m.get(F_IMPORTO)); + + registra_file_temp_rmov(numreg,numrig,gruppo,conto,sottoc,sezione,descr,gruppoc,contoc,sottocc,importo); + registra_file_trasfer_r(numreg,numrig,gruppo,conto,sottoc,sezione,descr,gruppoc,contoc,sottocc,importo); + } +} + +void TVar_mov::registra_file_temp_mov(long nr,const TDate& dr,const TDate& dd,const TString& nd,TString& ri, + long pi,long upi,const TString& cc,TString& cp) +{ + _tmov->setkey(1); + _tmov->zero(); + _tmov->put(MOV_NUMREG, nr); + if (_tmov->read() == NOERR) + { + _tmov->put(MOV_DATAREG, dr); + _tmov->put(MOV_DATADOC, dd); + _tmov->put(MOV_NUMDOC, nd); + _tmov->put(MOV_REG, ri); + _tmov->put(MOV_PROTIVA, pi); + _tmov->put(MOV_UPROTIVA, upi); + _tmov->put(MOV_CODCAUS, cc); + _tmov->put(MOV_CODPAG, cp); + + _tmov->rewrite(); + } +} + +void TVar_mov::registra_file_trasfer_t(long nr,int ar,const TDate& dr,const TDate& dd,const TString& nd,TString& ri, + long pi,long upi,const TString& cc,const TString& cp) +{ + TString app,str; + TRectype* rec; + rec = new TRectype (LF_RMOV); + + _trmov->setkey(1); + _trmov->zero(); + _trmov->put(RMV_NUMREG, nr); + *rec = _trmov->curr(); + + for (_trmov->read(); !_trmov->eof(); _trmov->next()) + { + if (_trmov->curr() > *rec) break; + + long numrec = _trmov->get_int(RMV_ANNOES); + numrec += _tras_file.start('Z'); + + _tras_file.read_rec_trasfer(numrec); //Leggo il record della prima nota + + app = dr.string(); + str = riconverti(app); + _tras_file.put(str,"Z1",0,numrec); + app = dd.string(); + str = riconverti(app); + _tras_file.put(str,"Z1",4,numrec); + str = format("%d", ar); + _tras_file.put(str,"Z1",50,numrec); + str = format("%-7s", (const char*) nd); + _tras_file.put(str,"Z1",5,numrec); + if (ri == "") + ri = " "; + _tras_file.put(ri,"Z1",6,numrec); + _tras_file.put(cc,"Z1",8,numrec); + str = format("%05ld", pi); + _tras_file.put(str,"Z1",7,numrec); + str = format("%05ld", upi); + _tras_file.put(str,"Z1",10,numrec); + str = format("%2s", (const char*) cp); + _tras_file.put(str,"Z1",9,numrec); + + _tras_file.write(numrec); + } + + delete rec; +} + +void TVar_mov::registra_file_temp_rmov(long nr,int nri,int g,int c,long s,char sez,const TString& desc, + int gc,int cc,long sc,const real& imp) +{ + _trmov->setkey(1); + _trmov->zero(); + _trmov->put(RMV_NUMREG, nr); + _trmov->put(RMV_NUMRIG, nri); + if (_trmov->read() == NOERR) + { + _trmov->put(RMV_GRUPPO, g); + _trmov->put(RMV_CONTO, c); + _trmov->put(RMV_SOTTOCONTO, s); + _trmov->put(RMV_SEZIONE, sez); + _trmov->put(RMV_DESCR, desc); + _trmov->put(RMV_GRUPPOC, gc); + _trmov->put(RMV_CONTOC, cc); + _trmov->put(RMV_SOTTOCONTOC, sc); + _trmov->put(RMV_IMPORTO, imp); + + _trmov->rewrite(); + } +} + +void TVar_mov::registra_file_trasfer_r(long nr,int nri,int g,int c,long s,char sez,const TString& desc, + int gc,int cc,long sc,const real& imp) +{ + TString app,str; + + _trmov->setkey(1); + _trmov->zero(); + _trmov->put(RMV_NUMREG, nr); + _trmov->put(RMV_NUMRIG, nri); + + if (_trmov->read() == NOERR) + { + long numrec = _trmov->get_int(RMV_ANNOES); + numrec += _tras_file.start('Z'); + + _tras_file.read_rec_trasfer(numrec); //Leggo il record della prima nota + + str = format("%02d", g); + _tras_file.put(str,"Z1",17,numrec); + str = format("%02d", c); + _tras_file.put(str,"Z1",18,numrec); + str = format("%06ld", s); + _tras_file.put(str,"Z1",19,numrec); + str = format("%c", sez); + _tras_file.put(str,"Z1",20,numrec); + str = format("%-30s", (const char*)desc); + _tras_file.put(str,"Z1",16,numrec); + str = format("%02d", gc); + _tras_file.put(str,"Z1",21,numrec); + str = format("%02d", cc); + _tras_file.put(str,"Z1",22,numrec); + str = format("%06ld", sc); + _tras_file.put(str,"Z1",23,numrec); + str = format("%011s", (const char*) imp.string()); + _tras_file.put(str,"Z1",24,numrec); + + _tras_file.write(numrec); + } +} + +void TVar_mov::registra_IVA(TMask& m) +{ + if (!_righe) + { + long numreg = m.get_long(F_NUMREG); + TDate data74ter (m.get(F_DATA74TER)); + long codcf = m.get_long(F_CODCF); + TString ragsococc = m.get (F_RAGSOCOCC); + TString indocc = m.get (F_INDOCC); + TString localita = m.get (F_LOCALITA); + TString capocc = m.get (F_CAPOCC); + TString provocc = m.get (F_PROVOCC); + + _tmov->setkey(1); + _tmov->zero(); + _tmov->put(MOV_NUMREG, numreg); + if (_tmov->read() == NOERR) + { + _tmov->put(MOV_DATA74TER, data74ter); + _tmov->put(MOV_CODCF, codcf); + + _tmov->rewrite(); + } + + registra_file_trasfer_t_iva(numreg,data74ter,codcf,ragsococc,indocc,localita,capocc,provocc); + } + else + if (_righe) + { + long numreg = m.get_long(F_NUMREG); + int numrig = m.get_int (F_NUMRIG); + real imponibile (m.get (F_IMPONIBILE)); + TString codiva = m.get (F_CODIVA); + real imposta (m.get (F_IMPOSTA)); + int tipodet = m.get_int (F_TIPODET); + int tipocr = m.get_int (F_TIPOCR); + int gruppo = m.get_int (F_GRUPPO); + int conto = m.get_int (F_CONTO); + long sottoc = m.get_long(F_SOTTOCONTO); + + registra_file_temp_riva(numreg,numrig,imponibile,codiva,imposta,tipodet,tipocr,gruppo,conto,sottoc); + registra_file_trasfer_r_iva(numreg,numrig,imponibile,codiva,imposta,tipodet,tipocr,gruppo,conto,sottoc); + } +} + +void TVar_mov::registra_file_trasfer_t_iva(long nr,const TDate& d74,long cf,const TString& rgo,const TString& io, + const TString& lo,const TString& co,const TString& po) +{ + TString app,str; + TRectype* rec; + rec = new TRectype (LF_RMOVIVA); + + _tiva->setkey(1); + _tiva->zero(); + _tiva->put(RMI_NUMREG, nr); + *rec = _tiva->curr(); + + for (_tiva->read(); !_tiva->eof(); _tiva->next()) + { + if (_tiva->curr() > *rec) break; + + long numrec = _tiva->get_int(RMI_ANNOES); + numrec += _tras_file.start('U'); + + _tras_file.read_rec_trasfer(numrec); //Leggo il record della prima nota + + app = d74.string(); + str = riconverti(app); + _tras_file.put(str,"U1",4,numrec); + str = format("%06d", cf); + _tras_file.put(str,"U1",6,numrec); + str = format("%-25s", (const char*)rgo ); + _tras_file.put(str,"U1",50,numrec); + str = format("%-22s", (const char*)io); + _tras_file.put(str,"U1",51,numrec); + str = format("%-18s", (const char*)lo); + _tras_file.put(str,"U1",52,numrec); + str = format("%05s", (const char*)co ); + _tras_file.put(str,"U1",53,numrec); + str = format("%-2s", (const char*)po); + _tras_file.put(str,"U1",54,numrec); + + _tras_file.write(numrec); + } + + delete rec; +} + +void TVar_mov::registra_file_temp_riva(long nr,int nri,const real& imp,const TString& civa,const real& imposta, + int tdet,int tcr,int g,int c,long s) +{ + _tiva->setkey(1); + _tiva->zero(); + _tiva->put(RMI_NUMREG, nr); + _tiva->put(RMI_NUMRIG, nri); + if (_tiva->read() == NOERR) + { + _tiva->put(RMI_IMPONIBILE, imp); + _tiva->put(RMI_CODIVA, civa); + _tiva->put(RMI_IMPOSTA, imposta); + _tiva->put(RMI_TIPODET, tdet); + _tiva->put(RMI_TIPOCR, tcr); + _tiva->put(RMI_GRUPPO, g); + _tiva->put(RMI_CONTO, c); + _tiva->put(RMI_SOTTOCONTO, s); + + _tiva->rewrite(); + } +} + +void TVar_mov::registra_file_trasfer_r_iva(long nr,int nri,const real& imp,const TString& civa,const real& imposta, + int tdet,int tcr,int g,int c,long s) +{ + TString app,str; + + _tiva->setkey(1); + _tiva->zero(); + _tiva->put(RMI_NUMREG, nr); + _tiva->put(RMI_NUMRIG, nri); + + if (_tiva->read() == NOERR) + { + long numrec = _tiva->get_int(RMI_ANNOES); + numrec += _tras_file.start('U'); + + _tras_file.read_rec_trasfer(numrec); //Leggo il record dell' iva + + str = format("%011s", (const char*) imp.string()); + _tras_file.put(str,"U1",14,numrec); + str = format("%02s", (const char*) civa); + _tras_file.put(str,"U1",13,numrec); + str = format("%09s", (const char*) imposta.string()); + _tras_file.put(str,"U1",15,numrec); + str = format("%d", tdet); + _tras_file.put(str,"U1",16,numrec); + str = format("%d", tcr); + _tras_file.put(str,"U1",17,numrec); + str = format("%02d", g); + _tras_file.put(str,"U1",19,numrec); + str = format("%02d", c); + _tras_file.put(str,"U1",20,numrec); + str = format("%06ld", s); + _tras_file.put(str,"U1",21,numrec); + + _tras_file.write(numrec); + } +} + +bool TVar_mov::leggi_trasfer() +{ + _trasf = _tras_file.path(_dittaric); + _trasf << "\\trasfer"; + + _tras_file.open(_trasf); + + if (_tras_file.exist()) + { + if (_tras_file.read_control_rec()) + _control_rec = _tras_file.record(); + else + return error_box("Rilevati gravi errori negli archivi:procedura interrotta"); + } + else + return error_box("Al momento non presenti trasferimenti attivi sulla ditta selezionata"); + + return TRUE; +} + +bool TVar_mov::esegui_controlli() +{ + TConfig conf(CONFIG_DITTA); + + _std = conf.get("FlStTra"); + + if (!prefix().exist(_dittaric)) + return error_box("Rilevati gravi errori negli archivi: procedura interrotta"); + + if (!leggi_trasfer()) + return FALSE; + + if (!controlli()) + return FALSE; + + return TRUE; +} + +void TVar_mov::setta_parametri_record(const TString& sigla,const TString& flag) +{ + TConfig conf (CONFIG_DITTA); + + conf.set("FlStTra", flag); + + leggi_record_controllo(); + _control_rec.overwrite(sigla,240); + + const int size = 256; + + _tras_file.write_control_rec(_control_rec, size); +} + +bool TVar_mov::controlli() +{ + if (_std == "T") + return error_box("Variazione NON POSSIBILE: eseguire prima la ricezione delle tabelle"); + + if (_std == "M") + return error_box("Variazione NON POSSIBILE: trasferimento movimenti gia' iniziato"); + + if (_std == "*") + { + warning_box("Trasferimento interamente completato: proseguire per cancellare il file"); + fremove(_trasf); + return FALSE; + } + + return TRUE; +} + +bool TVar_mov::menu(MENU_TAG m) +{ + if (m == BAR_ITEM(1)) + return main_loop(); + return FALSE; +} + +int cg2800 (int argc, char* argv[]) +{ + switch (*argv[2]) + { + case 'P': + { + TVar_mov main_app(*argv[2]); + main_app.run(argc, argv,main_app._titolo); + } + break; + case 'I': +{ + TVar_mov main_app(*argv[2]); + main_app.run(argc, argv,main_app._titolo); +} +break; + case 'S': +{ + TDitta_ric a; + a.run(argc, argv,"Scelta ditta per ricezione"); +} +break; + case 'A': +{ + TAnn_mov a; + a.run(argc, argv,"Annullamento movimenti da ricevere"); +} +break; + case 'V': +{ + TVis_ric a; + a.run(argc, argv,"Visualizzazione stato ricezione"); +} +break; +default: +break; +} +//main_app.run(argc, argv,main_app._titolo); +return TRUE; +} diff --git a/cg/cg2800b.uml b/cg/cg2800b.uml index d807258ac..4a91c6df3 100755 --- a/cg/cg2800b.uml +++ b/cg/cg2800b.uml @@ -131,11 +131,14 @@ BEGIN FLAGS "D" END -LIST F_SEZIONE 7 +LIST F_SEZIONE 9 BEGIN PROMPT 1 13 "Sezione " + ITEM " |Nessuna" ITEM "D|Dare" - ITEM "A|Avere" + ITEM "A|Avere" + CHECKTYPE REQUIRED + WARNING "Valore non valido per sezione" END STRING F_DESCR 30 diff --git a/cg/cg2801.cpp b/cg/cg2801.cpp index 99eebf3ac..27d01ea42 100755 --- a/cg/cg2801.cpp +++ b/cg/cg2801.cpp @@ -24,16 +24,23 @@ bool TDitta_ric::set() TMask msk ("cg2801a"); KEY tasto; + _old_ditta = get_firm(); + tasto = msk.run(); if (tasto != K_ENTER) return FALSE; _dittaric = msk.get_int(F_CODDITTA); - - if (!esegui_controlli()) return FALSE; - set_firm(_dittaric); + if (!esegui_controlli()) + { + set_firm(_old_ditta); + return FALSE; + } + + //set_firm(_dittaric); + return FALSE; } @@ -79,12 +86,16 @@ bool TDitta_ric::esegui_controlli() if (_uselab != " ") return error_box("Ultimo trasferimento NON COMPLETATO: completarlo"); + + if (!controlli()) + return FALSE; } - else - return error_box("Ultimo trasferimento NON COMPLETATO: completarlo"); + + TConfig cfd (CONFIG_DITTA); - if (!controlli()) - return FALSE; + TString std = cfd.get("FlStTra"); + if (std == "") + return error_box ("Non risultano TRASFERIMENTI ATTIVI sulla ditta richiesta"); return TRUE; } @@ -200,12 +211,6 @@ bool TDitta_ric::controlli() if (!_tras_file.write_control_rec(_control_rec, size)) return FALSE; - - TConfig cfd (CONFIG_DITTA); - - TString std = cfd.get("FlStTra"); - if (std == "") - return error_box ("Non risultano TRASFERIMENTI ATTIVI sulla ditta richiesta"); return TRUE; } diff --git a/cg/cg2801.h b/cg/cg2801.h index 4d71a40ce..4180a4e9f 100755 --- a/cg/cg2801.h +++ b/cg/cg2801.h @@ -21,7 +21,7 @@ class TDitta_ric : public TApplication TTransfer_file _tras_file; TString _trasf,_std,_uselab,_record,_nrec_file,_sigle_file,_key; - long _dittaric; + long _dittaric, _old_ditta; TString _control_rec; public: diff --git a/cg/cg2802.cpp b/cg/cg2802.cpp index 8999f3a8c..f3fcf9b31 100755 --- a/cg/cg2802.cpp +++ b/cg/cg2802.cpp @@ -23,6 +23,7 @@ bool TAnn_mov::create() _pcon = new TLocalisamfile (LF_PCON); _clifo = new TLocalisamfile (LF_CLIFO); + _mov = new TLocalisamfile (LF_MOV); TString80 tmpmov = "%"; tmpmov << get_firm_dir(); @@ -49,6 +50,7 @@ bool TAnn_mov::destroy() { delete _pcon; delete _clifo; + delete _mov; delete _tmov; delete _trmov; diff --git a/cg/cg2802.h b/cg/cg2802.h index 51927ea2a..689bba783 100755 --- a/cg/cg2802.h +++ b/cg/cg2802.h @@ -19,7 +19,7 @@ HIDDEN int date2esc(const TDate& d, int* prevesc = NULL); class TAnn_mov : public TApplication { TIsamtempfile* _tmov,* _trmov,* _tiva; - TLocalisamfile* _pcon,* _clifo; + TLocalisamfile* _pcon,* _clifo, *_mov; TRectype* _rec_mov; TTransfer_file _tras_file; diff --git a/cg/cg2803.cpp b/cg/cg2803.cpp index ac57852f0..7724135d6 100755 --- a/cg/cg2803.cpp +++ b/cg/cg2803.cpp @@ -62,9 +62,9 @@ bool TVis_ric::stato_hnd (TMask_field& f, KEY k) TString uselab = f.mask().get(F_USELAB); TString chiave = f.mask().get(F_STATO); - if (!app()._ftrasfer) + if (!app()._ftrasfer) //_ftrasfer dice se esiste il file trasfer o il suo record di controllo { - if (std != "") + if (std != "" && std != "*") return warning_box("Valore non valido per stato ultima ricezione"); } else @@ -108,7 +108,7 @@ bool TVis_ric::chiave_hnd (TMask_field& f, KEY k) return warning_box("Lo stato ultima ricezione non e' significativo: la chiave ultimo file elaborato non puo' essere significativa"); if (uselab == "" && chiave != "") - return warning_box("La sigla ultimo file elaborato non e' significativo: la chiave ultimo file elaborato non puo' essere significativa"); + return warning_box("La sigla ultimo file elaborato non e' significativa: la chiave ultimo file elaborato non puo' essere significativa"); } return TRUE; } @@ -209,6 +209,9 @@ void TVis_ric::registra(TMask& m) flags[6] = '\0'; TString uselab = m.get(F_USELAB); + if (uselab == "") + uselab = " "; + str = m.get(F_STATO); TString chiave = format("%-15s", (const char*) str); diff --git a/cg/cg2900.cpp b/cg/cg2900.cpp index 079fd52c6..eb3f2f353 100755 --- a/cg/cg2900.cpp +++ b/cg/cg2900.cpp @@ -1,2099 +1,2179 @@ -// Invio contabilita' - -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "cg2900.h" -#include "cglib04.h" - -HIDDEN TString80 TEMP; - -HIDDEN int date2esc(const TDate& d, int* prevesc = NULL); - -class TInv_cont : public TApplication -{ - enum { BUFSIZE = 4096 }; - - TTransfer_file _tras_file; - TProgind* _prog; - - TString _control_rec, _trasf, _std, _stato, _marker, _nome_simbolico; - TString _files, _codcaus, _numdoc, _reg, _codpag, _tipodoc, _codcausm; - TString _ocfpi, _ragsococc, _indocc, _capocc, _localocc, _provocc, _codvali; - bool _esiste_ditta, _esiste_record; - long _ditta, _protiva, _uprotiva, _codcf, _numrec, _tot_rec; - long _dim_tot, _dim_disk; - int _num; - TDate _data, _datadoc, _data74ter; - real _corrlire, _cambioi, _corrval; - -public: - virtual bool create(); - virtual bool destroy(); - virtual bool menu(MENU_TAG m); - - bool main_loop(); - - bool esiste_tabella_studio(); - bool record_controllo(); - bool esegui_controlli(); - bool leggi_trasfer(); - bool controlli(); - bool sub_controlli(); - bool tabella_ditta(); - bool controlla_stato_invio(); - bool numero_data(); - void leggi_record_controllo(); - void codifica_ditta (TMask& m); - bool testata_mov_PN (long numreg); - bool testata_mov_IVA(long numreg); - void cerca_occasionale(); - void cerca_comune_occas(const TString& com); - - void crea_marker(TMask& m); - void setta_parametri_record(TMask& m,const TString& flag); - void setta_tabella_studio(TMask& m, bool flag_ditta = TRUE); - void setta_tabella_ditta(TMask& m, const char* flag, bool comp = TRUE); - void crea_record_controllo(TMask& m); - - bool invio_contabilita(TMask& m); - bool invio_tab_cau(TString& key,TMask& m); - bool invio_clifo (TString& key,TMask& m); - bool invio_pcon (TString& key,TMask& m); - bool invio_mov_PN (TString& key,TMask& m); - bool invio_mov_IVA(TString& key,TMask& m); - - void aggiorna_marker(TString& token, int pos); - void calcola_totale_record(); - - const char* converti (TString& data_AS400); - const char* riconverti (TString& data_PC); - const char* cerca_provincia(const TString& comcf); - - static bool setta_maschera_hnd(TMask_field& f, KEY k); - - int calcola_numero_dischi(TMask& m); - FILE* chiedi_disco(const char* name, int disk, char floppy, bool lettura); - long determina_dimensione(FILE* f); - bool scrivi_disco(char floppy, int disk, const char* work, FILE* i, TProgind& w); - - TInv_cont() {}; -}; - -HIDDEN TInv_cont& app() { return (TInv_cont &) main_app(); } - -FILE* TInv_cont::chiedi_disco(const char* name, int disk, char floppy, bool lettura) -{ - message_box("Inserire il disco %d nel drive %c:", disk, floppy); - - // name.ext(format("%03d", disk)); - - FILE* f = NULL; - bool retry = TRUE; - while (retry) - { - f = fopen(name, lettura ? "rb" : "wb"); - if (f == NULL) - retry = yesno_box("Il file %s non e' accessibile: riprovare?", (const char*)name); - else - { - retry = FALSE; - fclose(f); - } - } - - return f; -} - -long TInv_cont::determina_dimensione(FILE* f) -{ - CHECK(f, "Can't measure NULL file"); - fseek(f, 0, SEEK_END); - const long s = ftell(f); - fseek(f, 0, SEEK_SET); - return s; -} - -bool TInv_cont::scrivi_disco(char floppy, int disk, const char* work, - FILE* i, TProgind& w) -{ - // const TFilename from(filename); // File da splittare - - // TFilename work; - // work << floppy << ":/" << from.name(); // File su dischetto - - chiedi_disco(work, disk, floppy, FALSE); - - TString str; - str.format("%02d", disk); - aggiorna_marker(str,31); // Aggiorna il num. progr. disco su marker - - TString path_m; - path_m << floppy << ":\\marker"; - - TString path_t; - path_t << floppy << ":\\trasfer"; - - fcopy(_marker,path_m); // Copia il marker su disco - - //FILE* i = fopen(from, "rb"); - FILE* o = fopen(path_t, "wb"); - - //if (i == NULL) return error_box("Impossibile aprire il file '%s'", from); - - //TProgind w(_dim_disk, "Trasferimento su dischetti in corso... Prego attendere", TRUE, TRUE, 40); - - TString buffer(BUFSIZE); - - long tot_scritti = BUFSIZE; - - while (tot_scritti <= _dim_disk) - { - const word letti = fread((char*)(const char*)buffer, 1, BUFSIZE, i); - - long scritti = fwrite((char*)(const char*)buffer, letti, 1, o); - - tot_scritti += letti; - - if (letti < BUFSIZE) break; - - w.addstatus(letti); - } - - //fclose(i); - fclose(o); - - return TRUE; -} - -bool TInv_cont::main_loop() -{ - TString str; - bool ripartenza = FALSE; - - if (!esiste_tabella_studio()) return FALSE; - - if (!esegui_controlli()) return FALSE; - - TMask msk ("cg2900a"); - KEY tasto; - - if (_ditta != 0) - { - msk.set(F_DITTAINV, _ditta); - msk.disable(F_DITTAINV); - codifica_ditta(msk); - msk.set(F_NUMULINV, _num); - msk.set(F_DATAULIN, _data.string()); - msk.set(F_STATO, _stato); - - TString uselab = _tras_file.ult_file(); - TString chiave = _tras_file.key(); - msk.set(F_USELAB, uselab); - msk.set(F_CHIAVE, chiave); - msk.set(F_DATALIM, _data.string()); - msk.disable(F_DATALIM); - - ripartenza = TRUE; - } - - msk.disable(F_NUMULINV); - msk.disable(F_DATAULIN); - msk.disable(F_STATO); - msk.disable(F_USELAB); - msk.disable(F_CHIAVE); - - if (!ripartenza) - msk.set_handler(F_DITTAINV, setta_maschera_hnd); - - tasto = msk.run(); - - if (tasto != K_ENTER) return FALSE; - - if (!ripartenza) - { - crea_marker(msk); //Crea il record con le informazioni sul marker - setta_parametri_record(msk,"F"); //Aggiorna parametri contabili ditta - setta_tabella_studio(msk); //Aggiorna la tabella studio per invio - setta_tabella_ditta(msk,"F"); //Aggiorna la tabella ditta per invio - crea_record_controllo(msk); //Crea il record di controllo sul file trasfer - } - - if (!invio_contabilita(msk)) - return FALSE; - - calcola_totale_record(); - str.format("%06ld", _tot_rec); - aggiorna_marker(str,23); - - TMask mask ("cg2900b"); - KEY k; - - k = mask.run(); - - if (k == K_ENTER) - { - int num_disk = calcola_numero_dischi(mask); - char floppy = mask.get(F_FLOPPY)[0]; - - str.format("%02d", num_disk); - aggiorna_marker(str,29); - - const TFilename from(_trasf); // File da splittare - - TFilename work; - work << floppy << ":/" << from.name(); // File su dischetto - - FILE* i = fopen(from, "rb"); - - if (i == NULL) return error_box("Impossibile aprire il file '%s'", from); - - TProgind w(_dim_tot, "Trasferimento su dischetti in corso... Prego attendere", TRUE, TRUE, 60); - - for (int j = 0; j < num_disk; j++) - { - scrivi_disco(floppy,j+1,work,i,w); - } - fclose(i); - - setta_tabella_studio(msk,FALSE); //Aggiorna la tabella studio per invio - setta_tabella_ditta(msk," ",FALSE); //Aggiorna la tabella ditta per invio - setta_parametri_record(msk," "); //Aggiorna parametri contabili ditta - - _tras_file.open(_trasf); - leggi_record_controllo(); - TString record(256); - record.format("%-256s",(const char*) record); - _control_rec.overwrite(record,0); - _tras_file.write_control_rec(_control_rec,256); - - fremove(_marker); - fremove(_trasf); - } - - return FALSE; -} - -int TInv_cont::calcola_numero_dischi(TMask& msk) -{ - int numdisc = 0; - - FILE* t = fopen(_trasf, "rb"); - if (t == NULL) return error_box("Impossibile aprire il file '%s'", _trasf); - - long dim_t = determina_dimensione(t); //Determina la dimensione del trasfer - fclose(t); - - FILE* m = fopen(_marker, "rb"); - if (m == NULL) return error_box("Impossibile aprire il file '%s'", _marker); - - long dim_m = determina_dimensione(m); // Determina la dimensione del marker - fclose(m); - - _dim_tot = dim_t + dim_m; // Determina la dimensione totale - - int item = msk.get_int(F_DIM); - - switch (item) - { - case 1 : - _dim_disk = 1400000L; - break; - case 2 : - _dim_disk = 1200000L; - break; - case 3 : - _dim_disk = 720000L; - break; - case 4 : - _dim_disk = 360000L; - break; - default : - break; - }; - - if (_dim_tot < _dim_disk) - numdisc = 1; - else - { - //double dischi = _dim_tot / _dim_disk; - //numdisc = (int)ceil(dischi); - numdisc = int(_dim_tot / _dim_disk); - if ( (_dim_tot % _dim_disk) != 0) - numdisc += 1; - } - - return numdisc; -} - -HIDDEN int date2esc(const TDate& d, int* prevesc) -{ - if (prevesc) *prevesc = 0; - TTable esc("ESC"); - for (int err = esc.first(); err == NOERR; err = esc.next()) - { - const TDate ia(esc.get("D0")); // Data inizio esercizio - const TDate fa(esc.get("D1")); // Data fine esercizio - const anno = esc.get_int("CODTAB"); - if (d >= ia && d <= fa) - return anno; - if (prevesc) *prevesc = anno; - } - return 0; -} - -bool TInv_cont::create() -{ - TApplication::create(); - - dispatch_e_menu (BAR_ITEM(1)); - - return TRUE; -} - -bool TInv_cont::destroy() -{ - return TApplication::destroy(); -} - -void TInv_cont::leggi_record_controllo() -{ - _tras_file.read_control_rec(); - _control_rec = _tras_file.record(); -} - -const char* TInv_cont::converti (TString& data_AS400) -{ - TEMP = data_AS400.mid(4,2); - TEMP << "-" <addstatus(1); - _tras_file.open(_trasf); - - record.spaces(); - - // Se trovo un codice causale alfanumerico l'invio deve essere interrotto - const char* codcau = cau.get(CAU_CODCAUS); - if (!real::is_natural(codcau)) - return error_box("Rilevato un codice causale alfanumerico nella causale %03s: impossibile proseguire",codcau); - str.format("%03s", codcau); - record.overwrite("W1",0); //Tipo record - record.overwrite(str,2); //Codice causale - - - //Salvataggio della sigla e della chiave sul record di controllo del file trasfer - leggi_record_controllo(); - TString chiave,app; - chiave.format("%2s%03s", (const char*) "W1", codcau); - app.format("%-15s", (const char*) chiave); - _control_rec.overwrite("W",240); - _control_rec.overwrite(app,241); - //_tras_file.write_control_rec(_control_rec,size); - //_tras_file.close(); - - TString descr = cau.get(CAU_DESCR); - descr.format("%-.20s", (const char*) descr); - record.overwrite(descr,15); //Descrizione - - TString tipodoc = cau.get(CAU_TIPODOC); - record.overwrite(tipodoc,35); //Tipo documento - - //Se trovo un registro IVA con lunghezza maggiore di 1 l'invio deve essere interrotto - TString reg = cau.get(CAU_REG); - if (reg.len() > 1) - return error_box("Rilevato un registro IVA con lunghezza superiore a 1 nella causale %03s: impossibile proseguire", codcau); - record.overwrite(reg,37); //Registro IVA - - bool alleg = cau.get_bool(CAU_ALLEG); - if (alleg) - record.overwrite("X",38); - else //Flag esclusione tipo documento da allegato - record.overwrite(" ",38); - - int m770 = atoi(cau.get(CAU_M770)); - str = format("%1d", m770); - record.overwrite(str,39); //Collegamento modello 770 - - TString cespiti = cau.get(CAU_COLLCESP); - record.overwrite(cespiti,40); //Collegamento cespiti - - bool numdoc = cau.get_bool(CAU_NUMDOC); - if (numdoc) - record.overwrite("1",206); - else //Flag immissione numero documento - record.overwrite("0",206); - - bool datadoc = cau.get_bool(CAU_DATADOC); - if (datadoc) - record.overwrite("1",207); - else //Flag immissione data documento - record.overwrite("0",207); - - const char* codcausim = cau.get(CAU_CODCAUSIM); - if (!real::is_natural(codcausim)) - return error_box("Rilevato un codice causale per incasso immediato alfanumerico nella causale %03s: impossibile proseguire",codcau); - str.format("%03s", codcausim); - record.overwrite(str,209); //Codice causale per incasso immediato - - bool intracom = cau.get_bool(CAU_INTRACOM); - if (intracom) - record.overwrite("X",246); - else //Flag per operazioni intracomunitarie - record.overwrite(" ",246); - - bool valintra = cau.get_bool(CAU_VALINTRA); - if (valintra) - record.overwrite("X",247); - else //Gestione valuta per oper. intracomunitarie - record.overwrite(" ",247); - - bool ritfatt = cau.get_bool(CAU_RITFATT); - if (ritfatt) - record.overwrite("X",248); - else //Flag causale per fattura ricevuta in ritardo - record.overwrite(" ",248); - - bool autofatt = cau.get_bool(CAU_AUTOFATT); - if (autofatt) - record.overwrite("X",249); - else //Autofattura art.34 - record.overwrite(" ",249); - - int num = 0; - int pos_gcs = 41; - int pos_sez = 191; - _codcaus = cau.get(CAU_CODCAUS); - - TLocalisamfile rcau (LF_RCAUSALI); - - do - { - num++; - - rcau.setkey(1); - rcau.zero(); - rcau.put(RCA_CODCAUS, _codcaus); - rcau.put(RCA_NRIGA, num); - - if (rcau.read() == NOERR) - { - int g = rcau.get_int (RCA_GRUPPO); - int c = rcau.get_int (RCA_CONTO); - - if (g > 99) - return error_box("Rilevato un gruppo composto da 3 cifre nella causale %03s riga %d: impossibile proseguire",codcau,num); - - if (c > 99) - return error_box("Rilevato un conto composto da 3 cifre nella causale %03s riga %d: impossibile proseguire",codcau,num); - - long s = rcau.get_long(RCA_SOTTOCONTO); - TString sez = rcau.get (RCA_SEZIONE); - - str = format("%02d", g); - record.overwrite(str,pos_gcs); //Gruppo - pos_gcs += 2; - str = format("%02d", c); - record.overwrite(str,pos_gcs); //Conto - pos_gcs += 2; - str = format("%06ld", s); - record.overwrite(str,pos_gcs); //Sottoconto - pos_gcs += 6; - - record.overwrite(sez,pos_sez); //Sezione - pos_sez++; - } - else - { - int g = 0; - int c = 0; - long s = 0; - TString sez = " "; - - str = format("%02d", g); - record.overwrite(str,pos_gcs); //Gruppo - pos_gcs += 2; - str = format("%02d", c); - record.overwrite(str,pos_gcs); //Conto - pos_gcs += 2; - str = format("%06ld", s); - record.overwrite(str,pos_gcs); //Sottoconto - pos_gcs += 6; - - record.overwrite(sez,pos_sez); //Sezione - pos_sez++; - } - - if (num == 15) - { - TString cau_app; - - rcau.next(); - if (!rcau.eof()) - cau_app = rcau.get(RCA_CODCAUS); - else - cau_app = ""; - - if (_codcaus == cau_app) - return error_box("Rilevata una causale con piu' di 15 righe: impossibile proseguire"); - } - } - while (num < 15); - - _numrec++; - TString stringa; - stringa.format("%06ld", _numrec); - int posiz = _files.find("W"); - _control_rec.overwrite(stringa,((posiz * 6) + 47)); - _tras_file.write_control_rec(_control_rec,size); - _tras_file.close(); - - _tras_file.open(_trasf,TRUE); - _tras_file.write_control_rec(record,size); - _tras_file.close(); - } - delete _prog; - - //Inizializzo l'ultima sigla file elaborato su trasfer con la sigla del file successivo da inviare - //e inizializzo la chiave, altrimenti se si blocca l'invio subito dopo aver finito un file si rischia di - //ritrasferire l'ultimo record quando si riparte; inoltre non si riesce a inviare il file successivo perche' - //la chiave e' compilata con i dati del file precedente. - _tras_file.open(_trasf); - leggi_record_controllo(); - TString chiave,app,sigla; - app.format("%-15s", (const char*) chiave); - char sigla_p = _tras_file.ult_file()[0]; - int posiz = _files.find(sigla_p); - TString nuova_sigla = " "; - if (posiz < _files.len()) - nuova_sigla = _files.mid(posiz+1,1); - - _control_rec.overwrite(nuova_sigla,240); - _control_rec.overwrite(app,241); - _tras_file.write_control_rec(_control_rec,size); - _tras_file.close(); - - setta_tabella_ditta(m,"D",FALSE); - setta_parametri_record(m,"D"); - - return TRUE; -} - -bool TInv_cont::invio_clifo(TString& key,TMask& m) -{ - int size = 256; - TString record(size); - char tipocf; - long codcf; - TLocalisamfile clifo (LF_CLIFO); - - long cicli = clifo.items(); - cicli -= _numrec; - _prog = new TProgind(cicli,"Invio anagrafica Clienti / Fornitori in corso... Prego attendere.",FALSE); - - if (key == "") - clifo.first(); - else - { - tipocf = (key.mid(2,1))[0]; - codcf = atol(key.mid(3,6)); - clifo.setkey(1); - clifo.zero(); - clifo.put(CLI_TIPOCF, tipocf); - clifo.put(CLI_CODCF, codcf); - clifo.read(); - } - - for (; !clifo.eof(); clifo.next()) - { - TString str; - - _prog->addstatus(1); - _tras_file.open(_trasf); - - record.spaces(); - - // Il tipocf su PC e' C = cliente F = fornitore. - // Il tipocf su AS400 e' 1 = cliente 2 = fornitore. - TString tipo_cod; - - char tipo = clifo.get_char(CLI_TIPOCF); - if (tipo == 'C') - tipo_cod = "1"; - else - if (tipo == 'F') - tipo_cod = "2"; - - record.overwrite("A1",0); //Tipo record - record.overwrite(tipo_cod,2); //Tipo cliente/fornitore - - long codice = clifo.get_long(CLI_CODCF); - str.format("%06ld", codice); - record.overwrite(str,3); //Codice cliente/fornitore - - //Salvataggio della chiave sul record di controllo del file trasfer - leggi_record_controllo(); - TString chiave,app; - chiave.format("%2s%s%06ld", (const char*) "A1", (const char*) tipo_cod, codice); - app.format("%-15s", (const char*) chiave); - _control_rec.overwrite("A",240); - _control_rec.overwrite(app,241); - // _tras_file.write_control_rec(_control_rec,size); - // _tras_file.close(); - - //Il tipo persona su PC e' F = fisica G = giuridica - //Il tipo persona su AS400 e' 0 = giuridica 1 = fisica - char tipop = clifo.get_char(CLI_TIPOPERS); - TString tipopers; - - if (tipop == 'F') - tipopers = "1"; - else - if (tipop == 'G') - tipopers = "0"; - - record.overwrite(tipopers,15); //Tipo persona - - TString ragsoc = clifo.get(CLI_RAGSOC); - TString cognome = ragsoc.mid(0,30); - TString nome = ragsoc.mid(30,20); - str.format("%-30s", (const char*) cognome); //Cognome o I ragione sociale - record.overwrite(str,16); - str.format("%-20s", (const char*) nome); - record.overwrite(str,46); //Nome o II ragione sociale - - //Se la partita IVA e' maggiore di 11 il programma di invio viene fermato - TString paiv = clifo.get(CLI_PAIV); - if (paiv.len() > 11) - return error_box("Rilevata partita IVA con piu' di 11 caratteri in codice %c%d: impossibile proseguire",tipo,codice); - str.format("%-11s", (const char*) paiv); - record.overwrite(str,66); //Partita IVA - - TString cofi = clifo.get(CLI_COFI); - str.format("%-16s", (const char*) cofi); - record.overwrite(str,77); //Codice fiscale - - TString indcf = clifo.get(CLI_INDCF); - str.format("%-35s", (const char*) indcf); - record.overwrite(str,93); //Indirizzo - - TString capcf = clifo.get(CLI_CAPCF); - record.overwrite(capcf,128); //Codice di avviamento postale - - TString localita = clifo.get(CLI_LOCCF); - str.format("%-.20s", (const char*) localita); - record.overwrite(str,133); //Localita' - - TString comcf = clifo.get(CLI_COMCF); - TString provincia = cerca_provincia(comcf); - str.format("%-2s", (const char*) provincia); - record.overwrite(str,153); //Provincia - - TString ptel = clifo.get(CLI_PTEL); - TString tel = clifo.get(CLI_TEL); - TString appoggio; - appoggio << ptel << " " << tel; - if (appoggio.len() > 12) - warning_box("Rilevato numero telefonico troppo lungo in codice %c%d: impossibile inviare",tipo,codice); - else //Numero telefono - record.overwrite(appoggio,155); - - TString alleg = clifo.get(CLI_ALLEG); - record.overwrite(alleg,167); //Flag gestione allegato - - int gruppo = clifo.get_int(CLI_GRUPPORIC); - int conto = clifo.get_int(CLI_CONTORIC); - - if (gruppo > 99) - return error_box("Rilevato gruppo costo/ricavo composto da 3 cifre in codice %c%d: impossibile proseguire",tipo,codice); - - if (conto > 99) - return error_box("Rilevato conto costo/ricavo composto da 3 cifre in codice %c%d: impossibile proseguire",tipo,codice); - - long sottoc = clifo.get_long(CLI_SOTTOCRIC); - str.format("%02d", gruppo); - record.overwrite(str,168); //Gruppo di costo/ricavo - str.format("%02d", conto); - record.overwrite(str,170); //Conto di costo/ricavo - str.format("%06ld", sottoc); - record.overwrite(str,172); //sottoconto di costo/ricavo - - long codalleg = clifo.get_long(CLI_CODALLEG); - str.format("%06ld", codalleg); - record.overwrite(str,179); - - //Se il codice di pagamento e' superiore alle 2 cifre l'invio deve essere interrotto - TString codpag = clifo.get(CLI_CODPAG); - if (codpag.len() > 2) - return error_box("Rilevato un codice di pagamento composto da 3 o piu' cifre in codice %c%d: impossibile proseguire",tipo,codice); - - str.format("%-2s", (const char*) codpag); - - _numrec++; - TString stringa; - stringa.format("%06ld", _numrec); - int posiz = _files.find("A"); - _control_rec.overwrite(stringa,((posiz * 6) + 47)); - _tras_file.write_control_rec(_control_rec,size); - _tras_file.close(); - - _tras_file.open(_trasf,TRUE); - _tras_file.write_control_rec(record,size); - _tras_file.close(); - } - delete _prog; - - //Inizializzo l'ultima sigla file elaborato su trasfer con la sigla del file successivo da inviare - //e inizializzo la chiave, altrimenti se si blocca l'invio subito dopo aver finito un file si rischia di - //ritrasferire l'ultimo record quando si riparte; inoltre non si riesce a inviare il file successivo perche' - //la chiave e' compilata con i dati del file precedente. - _tras_file.open(_trasf); - leggi_record_controllo(); - TString chiave,app,sigla; - app.format("%-15s", (const char*) chiave); - char sigla_p = _tras_file.ult_file()[0]; - int posiz = _files.find(sigla_p); - TString nuova_sigla = " "; - if (posiz < _files.len()) - nuova_sigla = _files.mid(posiz+1,1); - - _control_rec.overwrite(nuova_sigla,240); - _control_rec.overwrite(app,241); - _tras_file.write_control_rec(_control_rec,size); - _tras_file.close(); - - setta_tabella_ditta(m,"D",FALSE); - setta_parametri_record(m,"D"); - - return TRUE; -} - -bool TInv_cont::invio_pcon(TString& key,TMask& m) -{ - int size = 256; - TString record(size); - int gruppo,conto; - long sottoc; - TLocalisamfile pcon (LF_PCON); - - long cicli = pcon.items(); - cicli -= _numrec; - _prog = new TProgind(cicli,"Invio anagrafica Piano dei Conti in corso... Prego attendere.",FALSE); - - if (key == "") - pcon.first(); - else - { - gruppo = atoi(key.mid(2,2)); - conto = atoi(key.mid(4,2)); - sottoc = atol(key.mid(6,6)); - pcon.setkey(1); - pcon.zero(); - pcon.put(PCN_GRUPPO, gruppo); - pcon.put(PCN_CONTO, conto); - pcon.put(PCN_SOTTOCONTO, sottoc); - pcon.read(); - } - - for (; !pcon.eof(); pcon.next()) - { - TString str; - - _prog->addstatus(1); - _tras_file.open(_trasf); - - record.spaces(); - - int g = pcon.get_int (PCN_GRUPPO); - - if (g > 99) - return error_box("Rilevato un gruppo composto da 3 cifre in %03d: impossibile proseguire",g); - - int c = pcon.get_int (PCN_CONTO); - - if (c > 99) - return error_box("Rilevato un conto composto da 3 cifre in %03d: impossibile proseguire",c); - - long s = pcon.get_long(PCN_SOTTOCONTO); - - // Se si tratta di un GRUPPO - - if (g != 0 && c == 0 && s == 0) - { - //Salvataggio della sigla e della chiave sul record di controllo del file trasfer - leggi_record_controllo(); - TString chiave,app; - chiave.format("%2s%02d%02d%06ld", (const char*) "P1", g, c, s); - app.format("%-15s", (const char*) chiave); - _control_rec.overwrite("P",240); - _control_rec.overwrite(app,241); - // _tras_file.write_control_rec(_control_rec,size); - // _tras_file.close(); - - record.overwrite("P1",0); //Tipo record - str.format("%02d", g); - record.overwrite(str,2); //Gruppo - - TString descr (pcon.get(PCN_DESCR)); - str.format("%-.30s", (const char*) descr); - record.overwrite(str,15); //Descrizione gruppo - } - - // Se si tratta di un CONTO - - if (g != 0 && c != 0 && s == 0) - { - //Salvataggio della sigla e della chiave sul record di controllo del file trasfer - leggi_record_controllo(); - TString chiave,app; - chiave.format("%2s%02d%02d%06ld", (const char*) "P2", g, c, s); - app.format("%-15s", (const char*) chiave); - _control_rec.overwrite("P",240); - _control_rec.overwrite(app,241); - // _tras_file.write_control_rec(_control_rec,size); - // _tras_file.close(); - - record.overwrite("P2",0); //Tipo record - str.format("%02d", g); - record.overwrite(str,2); //Gruppo - - str.format("%02d", c); - record.overwrite(str,4); //Conto - - TString descr (pcon.get(PCN_DESCR)); - str.format("%-.30s", (const char*) descr); - record.overwrite(str,15); //Descrizione conto - - int indbil = pcon.get_int(PCN_INDBIL); - str.format("%d", indbil); - record.overwrite(str,45); //Indicatore di bilancio - - TString tmcf = pcon.get(PCN_TMCF); - record.overwrite(tmcf,46); //Flag conto cliente/fornitore - - bool stsottbil = pcon.get_bool(PCN_STSOTTBIL); - if (stsottbil) - str = "0"; - else - str = "1"; - record.overwrite(str,47); //Flag stampa dettaglio sottoconti su bilancio - - // Classe IV direttiva CEE - - TString sez = pcon.get(PCN_SEZIVD); - if (sez == "0") - sez = " "; - record.overwrite(sez,48); //Sezione IV dir - - TString let = pcon.get(PCN_LETTIVD); - record.overwrite(let,49); //Lettera IV dir - - int numrom = atoi(pcon.get(PCN_NUMRIVD)); - str.format("%03d", numrom); - record.overwrite(str,60); //Numero arabo corrispondente al numero romano - TString numr = itor(numrom); - str.format("%-8s", (const char*) numr); - record.overwrite(str,50); //Numero romano IV dir - - int num = pcon.get_int(PCN_NUMIVD); - str.format("%02d", num); - record.overwrite(str,58); //Numero arabo IV dir - - // Classe IV direttiva CEE di segno opposto - - TString sezop = pcon.get(PCN_SEZIVDOPP); - if (sezop == "0") - sezop = " "; - record.overwrite(sezop,63); //Sezione IV dir - - TString letop = pcon.get(PCN_LETTIVDOPP); - record.overwrite(letop,64); //Lettera IV dir - - int numromop = atoi(pcon.get(PCN_NUMRIVDOPP)); - str.format("%03d", numromop); - record.overwrite(str,75); //Numero arabo corrispondente al numero romano - TString numrop = itor(numromop); - str.format("%-8s", (const char*) numrop); - record.overwrite(str,65); //Numero romano IV dir - - int numop = pcon.get_int(PCN_NUMIVDOPP); - str.format("%02d", numop); - record.overwrite(str,73); //Numero arabo IV dir - } - - // Se si tratta di un SOTTOCONTO - - if (g != 0 && c != 0 && s != 0) - { - //Salvataggio della sigla e della chiave sul record di controllo del file trasfer - leggi_record_controllo(); - TString chiave,app; - chiave.format("%2s%02d%02d%06ld", (const char*) "P3", g, c, s); - app.format("%-15s", (const char*) chiave); - _control_rec.overwrite("P",240); - _control_rec.overwrite(app,241); - // _tras_file.write_control_rec(_control_rec,size); - // _tras_file.close(); - - record.overwrite("P3",0); //Tipo record - str.format("%02d", g); - record.overwrite(str,2); //Gruppo - - str.format("%02d", c); - record.overwrite(str,4); //Conto - - str.format("%06ld", s); - record.overwrite(str,6); - - TString descr (pcon.get(PCN_DESCR)); - str.format("%-.30s", (const char*) descr); - record.overwrite(str,15); //Descrizione sottoconto - - int tipospric = pcon.get_int(PCN_TIPOSPRIC); - str.format("%d", tipospric); - record.overwrite(str,45); //Tipo costo/ricavo - - int ricser = pcon.get_int(PCN_RICSER); - if (ricser == 0) - str = " "; - else - str.format("%d", ricser); - record.overwrite(str,46); //Tipo attivita' - - // Classe IV direttiva CEE - - TString sez = pcon.get(PCN_SEZIVD); - if (sez == "0") - sez = " "; - record.overwrite(sez,47); //Sezione IV dir - - TString let = pcon.get(PCN_LETTIVD); - record.overwrite(let,48); //Lettera IV dir - - int numrom = atoi(pcon.get(PCN_NUMRIVD)); - str.format("%03d", numrom); - record.overwrite(str,59); //Numero arabo corrispondente al numero romano - TString numr = itor(numrom); - str.format("%-8s", (const char*) numr); - record.overwrite(str,49); //Numero romano IV dir - - int num = pcon.get_int(PCN_NUMIVD); - str.format("%02d", num); - record.overwrite(str,57); //Numero arabo IV dir - - // Classe IV direttiva CEE di segno opposto - - TString sezop = pcon.get(PCN_SEZIVDOPP); - if (sezop == "0") - sezop = " "; - record.overwrite(sezop,62); //Sezione IV dir - - TString letop = pcon.get(PCN_LETTIVDOPP); - record.overwrite(letop,63); //Lettera IV dir - - int numromop = atoi(pcon.get(PCN_NUMRIVDOPP)); - str.format("%03d", numromop); - record.overwrite(str,74); //Numero arabo corrispondente al numero romano - TString numrop = itor(numromop); - str.format("%-8s", (const char*) numrop); - record.overwrite(str,64); //Numero romano IV dir - - int numop = pcon.get_int(PCN_NUMIVDOPP); - str.format("%02d", numop); - record.overwrite(str,72); //Numero arabo IV dir - } - - _numrec++; - TString stringa; - stringa.format("%06ld", _numrec); - int posiz = _files.find("P"); - _control_rec.overwrite(stringa,((posiz * 6) + 47)); - _tras_file.write_control_rec(_control_rec,size); - _tras_file.close(); - - _tras_file.open(_trasf,TRUE); - _tras_file.write_control_rec(record,size); - _tras_file.close(); - } - delete _prog; - - //Inizializzo l'ultima sigla file elaborato su trasfer con la sigla del file successivo da inviare - //e inizializzo la chiave, altrimenti se si blocca l'invio subito dopo aver finito un file si rischia di - //ritrasferire l'ultimo record quando si riparte; inoltre non si riesce a inviare il file successivo perche' - //la chiave e' compilata con i dati del file precedente. - _tras_file.open(_trasf); - leggi_record_controllo(); - TString chiave,app,sigla; - app.format("%-15s", (const char*) chiave); - char sigla_p = _tras_file.ult_file()[0]; - int posiz = _files.find(sigla_p); - TString nuova_sigla = " "; - if (posiz < _files.len()) - nuova_sigla = _files.mid(posiz+1,1); - - _control_rec.overwrite(nuova_sigla,240); - _control_rec.overwrite(app,241); - _tras_file.write_control_rec(_control_rec,size); - _tras_file.close(); - - setta_tabella_ditta(m,"D",FALSE); - setta_parametri_record(m,"D"); - - return TRUE; -} - -bool TInv_cont::testata_mov_PN(long numreg) -{ - TLocalisamfile mov (LF_MOV); - - mov.setkey(1); - mov.zero(); - mov.put(MOV_NUMREG, numreg); - if (mov.read() == NOERR) - { - _datadoc = mov.get_date(MOV_DATADOC); - _numdoc = mov.get (MOV_NUMDOC); - _reg = mov.get (MOV_REG); - _codcausm = mov.get (MOV_CODCAUS); - _codpag = mov.get (MOV_CODPAG); - _tipodoc = mov.get (MOV_TIPODOC); - _protiva = mov.get_long(MOV_PROTIVA); - _uprotiva = mov.get_long(MOV_UPROTIVA); - } - else - return FALSE; - - return TRUE; -} - -bool TInv_cont::invio_mov_PN(TString& key,TMask& m) -{ - int size = 256; - TString record(size); - long numreg,nreg_p; - int numrig; - TLocalisamfile rmov (LF_RMOV); - - nreg_p = -1; - - long cicli = rmov.items(); - cicli -= _numrec; - _prog = new TProgind(cicli,"Invio Movimenti di primanota in corso... Prego attendere.",FALSE); - - if (key == "") - rmov.first(); - else - { - numreg = atol(key.mid(2,6)); - numrig = atoi(key.mid(8,2)); - rmov.setkey(1); - rmov.zero(); - rmov.put(RMV_NUMREG, numreg); - rmov.put(RMV_NUMRIG, numrig); - rmov.read(); - } - - for (; !rmov.eof(); rmov.next()) - { - TString str; - - _prog->addstatus(1); - _tras_file.open(_trasf); - - record.spaces(); - - long nreg = rmov.get_long(RMV_NUMREG); - int nrig = rmov.get_int (RMV_NUMRIG); - - //Salvataggio della chiave sul record di controllo del file trasfer - leggi_record_controllo(); - TString chiave,app; - chiave.format("%2s%06ld%02d", (const char*) "Z1", nreg, nrig); - app.format("%-15s", (const char*) chiave); - _control_rec.overwrite("Z",240); - _control_rec.overwrite(app,241); - // _tras_file.write_control_rec(_control_rec,size); - // _tras_file.close(); - - if (nreg > 999999) - return error_box("Rilevato un numero di registrazione composto da 7 cifre in %07ld riga %03d: impossibile proseguire",nreg,nrig); - - if (nrig > 99) - return error_box("Rilevato un numero di riga composto da 3 cifre in %07ld riga %03d: impossibile proseguire",nreg,nrig); - - record.overwrite("Z1",0); //Tipo record - - str.format("%06ld", nreg); - record.overwrite(str,2); //Numero di registrazione - - str.format("%02d", nrig); - record.overwrite(str,8); //Numero di riga - - if (nreg != nreg_p) - if (!testata_mov_PN(nreg)) - return error_box("Rilevata riga mancante di testata: impossibile proseguire"); - - nreg_p = nreg; - - TDate datareg (rmov.get(RMV_DATAREG)); - TString dataregstr = datareg.string(); - str = riconverti(dataregstr); - record.overwrite(str,15); //Data di registrazione - - //Determino il segnalino della competenza - int segnalino; - - int annoes = rmov.get_int(RMV_ANNOES); - int anno = date2esc(datareg); - if (annoes == anno) - segnalino = 0; - else - segnalino = 1; - str.format("%d", segnalino); - record.overwrite(str,21); //Segnalino della competenza - - TString datadocstr = _datadoc.string(); - str = riconverti(datadocstr); - record.overwrite(str,22); //Data documento - - str.format("%-7s", (const char*) _numdoc); - record.overwrite(str,28); - - if (_reg.len() > 1) - return error_box("Rilevato un codice registro IVA composto da 2 o piu' cifre in %07ld riga %03d: impossibile proseguire",nreg,nrig); - record.overwrite(_reg,35); //Codice registro IVA - - str.format("%05d", _protiva); - record.overwrite(str,36); //Numero protocollo IVA - - // Se trovo un codice causale alfanumerico l'invio deve essere interrotto - const char* cod_causm = (const char*)_codcausm; - if (_codcausm != "") - if (!real::is_natural(cod_causm)) - return error_box("Rilevato un codice causale alfanumerico in %07ld riga %03d: impossibile proseguire",nreg,nrig); - str.format("%03s", (const char*)_codcausm); - record.overwrite(str,41); //Codice causale - - TString descr = rmov.get(RMV_DESCR); - str.format("%-.30s", (const char*) descr); - record.overwrite(str,44); //Descrizione riga di movimento - - int gruppo = rmov.get_int(RMV_GRUPPO); - if (gruppo > 99) - return error_box("Rilevato un gruppo di partita composto da 3 cifre in %07ld riga %03d: impossibile proseguire",nreg,nrig); - str.format("%02d", gruppo); - record.overwrite(str,74); //Gruppo di partita - - int conto = rmov.get_int(RMV_CONTO); - if (conto > 99) - return error_box("Rilevato un conto di partita composto da 3 cifre in %07ld riga %03d: impossibile proseguire",nreg,nrig); - str.format("%02d", conto); - record.overwrite(str,76); //Conto di partita - - long sottoc = rmov.get_long(RMV_SOTTOCONTO); - str.format("%06ld", sottoc); - record.overwrite(str,78); //Sottoconto di partita - - TString sez = rmov.get(RMV_SEZIONE); - str.format("%s", (const char*) sez); - record.overwrite(str,84); //Sezione importo - - int gruppoc = rmov.get_int(RMV_GRUPPOC); - if (gruppoc > 99) - return error_box("Rilevato un gruppo di contropartita composto da 3 cifre in %07ld riga %03d: impossibile proseguire",nreg,nrig); - str.format("%02d", gruppoc); - record.overwrite(str,85); //Gruppo di contropartita - - int contoc = rmov.get_int(RMV_CONTOC); - if (contoc > 99) - return error_box("Rilevato un conto di contropartita composto da 3 cifre in %07ld riga %03d: impossibile proseguire",nreg,nrig); - str.format("%02d", contoc); - record.overwrite(str,87); //Conto di contropartita - - long sottocc = rmov.get_long(RMV_SOTTOCONTOC); - str.format("%06ld", sottocc); - record.overwrite(str,89); //Sottoconto di contropartita - - if (_codpag.len() > 2) - return error_box("Rilevato un codice di pagamento composto da 3 o piu' cifre in %07ld riga %03d: impossibile proseguire",nreg,nrig); - str.format("%-2s", (const char*) _codpag); - record.overwrite(str,95); //Codice di pagamento - - real importo (rmov.get_real(RMV_IMPORTO)); - str.format("%011s", (const char*) importo.string()); - record.overwrite(str,97); //Importo riga di movimento - - str.format("%05d", _uprotiva); - record.overwrite(str,108); //Ultimo numero di protocollo IVA - - TString tipoc = rmov.get(RMV_TIPOC); - record.overwrite(tipoc,219); //Flag cliente/fornitore - - record.overwrite(_tipodoc,220); //Tipo documento - - _numrec++; - TString stringa; - stringa.format("%06ld", _numrec); - int posiz = _files.find("Z"); - _control_rec.overwrite(stringa,((posiz * 6) + 47)); - _tras_file.write_control_rec(_control_rec,size); - _tras_file.close(); - - _tras_file.open(_trasf,TRUE); - _tras_file.write_control_rec(record,size); - _tras_file.close(); - } - delete _prog; - - //Inizializzo l'ultima sigla file elaborato su trasfer con la sigla del file successivo da inviare - //e inizializzo la chiave, altrimenti se si blocca l'invio subito dopo aver finito un file si rischia di - //ritrasferire l'ultimo record quando si riparte; inoltre non si riesce a inviare il file successivo perche' - //la chiave e' compilata con i dati del file precedente. - _tras_file.open(_trasf); - leggi_record_controllo(); - TString chiave,app,sigla; - app.format("%-15s", (const char*) chiave); - char sigla_p = _tras_file.ult_file()[0]; - int posiz = _files.find(sigla_p); - TString nuova_sigla = " "; - if (posiz < _files.len()) - nuova_sigla = _files.mid(posiz+1,1); - - _control_rec.overwrite(nuova_sigla,240); - _control_rec.overwrite(app,241); - _tras_file.write_control_rec(_control_rec,size); - _tras_file.close(); - - setta_tabella_ditta(m,"D",FALSE); - setta_parametri_record(m,"D"); - - return TRUE; -} - -bool TInv_cont::testata_mov_IVA(long numreg) -{ - TLocalisamfile mov (LF_MOV); - - mov.setkey(1); - mov.zero(); - mov.put(MOV_NUMREG, numreg); - if (mov.read() == NOERR) - { - _codcf = mov.get_long(MOV_CODCF); - _data74ter = mov.get_date(MOV_DATA74TER); - _corrlire = mov.get_real(MOV_CORRLIRE); - _codvali = mov.get (MOV_CODVALI); - _cambioi = mov.get_real(MOV_CAMBIOI); - _corrval = mov.get_real(MOV_CORRVALUTA); - _ocfpi = mov.get (MOV_OCFPI); - if (_ocfpi.not_empty()) - cerca_occasionale(); - } - else - return FALSE; - - return TRUE; -} - -void TInv_cont::cerca_occasionale() -{ - TLocalisamfile occas (LF_OCCAS); - - occas.setkey(1); - occas.zero(); - occas.put(OCC_CFPI, _ocfpi); - if (occas.read() == NOERR) - { - _ragsococc = occas.get(OCC_RAGSOC); - _indocc = occas.get(OCC_INDIR); - _capocc = occas.get(OCC_CAP); - TString com = occas.get(OCC_COM); - cerca_comune_occas(com); - } - else - { - _ragsococc = ""; - _indocc = ""; - _capocc = ""; - _localocc = ""; - _provocc = ""; - } -} - -void TInv_cont::cerca_comune_occas(const TString& com) -{ - TLocalisamfile comuni (LF_COMUNI); - - comuni.setkey(1); - comuni.zero(); - comuni.put(COM_COM, com); - if (comuni.read() == NOERR) - { - _localocc = comuni.get(COM_DENCOM); - _provocc = comuni.get(COM_PROVCOM); - } -} - -bool TInv_cont::invio_mov_IVA(TString& key,TMask& m) -{ - int size = 256; - TString record(size); - long numreg,nreg_p; - int numrig; - int numero_righe = 0; - TLocalisamfile rmoviva (LF_RMOVIVA); - - nreg_p = -1; - - long cicli = rmoviva.items(); - cicli -= _numrec; - _prog = new TProgind(cicli,"Invio Movimenti iva in corso... Prego attendere.",FALSE); - - if (key == "") - rmoviva.first(); - else - { - numreg = atol(key.mid(2,6)); - numrig = atoi(key.mid(8,2)); - rmoviva.setkey(1); - rmoviva.zero(); - rmoviva.put(RMI_NUMREG, numreg); - rmoviva.put(RMI_NUMRIG, numrig); - rmoviva.read(); - } - - for (; !rmoviva.eof(); rmoviva.next()) - { - TString str; - - _prog->addstatus(1); - _tras_file.open(_trasf); - - record.spaces(); - - long nreg = rmoviva.get_long(RMI_NUMREG); - int nrig = rmoviva.get_int (RMI_NUMRIG); - - //Salvataggio della chiave sul record di controllo del file trasfer - leggi_record_controllo(); - TString chiave,app; - chiave.format("%2s%06ld%02d", (const char*) "U1", nreg, nrig); - app.format("%-15s", (const char*) chiave); - _control_rec.overwrite("U",240); - _control_rec.overwrite(app,241); - // _tras_file.write_control_rec(_control_rec,size); - // _tras_file.close(); - - if (nreg > 999999) - return error_box("Rilevato un numero di registrazione composto da 7 cifre in %07ld riga %03d: impossibile proseguire",nreg,nrig); - - if (nrig > 99) - return error_box("Rilevato un numero di riga composto da 3 cifre in %07ld riga %03d: impossibile proseguire",nreg,nrig); - - record.overwrite("U1",0); //Tipo record - - str.format("%06ld", nreg); - record.overwrite(str,2); //Numero di registrazione - - str.format("%02d", nrig); - record.overwrite(str,8); //Numero di riga - - if (nreg != nreg_p) - { - numero_righe = 0; - if (!testata_mov_IVA(nreg)) - return error_box("Rilevata riga mancante di testata: impossibile proseguire"); - } - - numero_righe++; - if (numero_righe > 9) - return error_box("Rilevata una registrazione IVA con piu' di 9 righe: impossibile proseguire"); - - nreg_p = nreg; - - str.format("%06ld", _codcf); - record.overwrite(str,15); //Codice cliente/fornitore - - real imponibile (rmoviva.get_real(RMI_IMPONIBILE)); - str.format("%011s", (const char*) imponibile.string()); - record.overwrite(str,21); //Imponibile - - //Se trovo un codice iva composto da piu' di 2 cifre l'invio viene interrotto - TString codiva (rmoviva.get(RMI_CODIVA)); - if (codiva.len() > 2) - return error_box("Rilevato un codice IVA composto da 3 o piu' cifre in %07ld riga %03d: impossibile proseguire",nreg,nrig); - str.format("%02s", (const char*) codiva); - record.overwrite(str,32); //Codice iva - - real imposta (rmoviva.get_real(RMI_IMPOSTA)); - str.format("%09s", (const char*) imposta.string()); - record.overwrite(str,34); //Imposta - - int tipocr = rmoviva.get_int(RMI_TIPOCR); - str.format("%01d", tipocr); - record.overwrite(str,43); //Tipo costo/ricavo - - int tipodet = rmoviva.get_int(RMI_TIPODET); - str.format("%01d", tipodet); - record.overwrite(str,44); //Tipo detraibilita' - - int gruppo = rmoviva.get_int(RMI_GRUPPO); - if (gruppo > 99) - return error_box("Rilevato un gruppo composto da 3 cifre in %07ld riga %03d: impossibile proseguire",nreg,nrig); - str.format("%02d", gruppo); - record.overwrite(str,45); //Gruppo - - int conto = rmoviva.get_int(RMI_CONTO); - if (conto > 99) - return error_box("Rilevato un conto composto da 3 cifre in %07ld riga %03d: impossibile proseguire",nreg,nrig); - str.format("%02d", conto); - record.overwrite(str,47); //Conto - - long sottoc = rmoviva.get_long(RMI_SOTTOCONTO); - str.format("%06ld", sottoc); - record.overwrite(str,49); //Sottoconto - - TString data74terstr = _data74ter.string(); - str = riconverti(data74terstr); - record.overwrite(str,55); //Data per registri 74 TER - - if (_ocfpi.not_empty()) - { - str.format("%-.25s", (const char*) _ragsococc); - record.overwrite(str,61); //Ragione sociale cliente occasionale - - str.format("%-.22s", (const char*) _indocc); - record.overwrite(str,86); //indirizzo cliente occasionale - - str.format("%-.18s", (const char*) _localocc); - record.overwrite(str,108); //Localita cliente occasionale - - str.format("%-5s", (const char*) _capocc); - record.overwrite(str,126); //Codice avviamento postale cliente occasionale - - str.format("%-.2s", (const char*) _provocc); - record.overwrite(str,131); //Provincia cliente occasionale - } - - int tipoatt = rmoviva.get_int(RMI_TIPOATT); - str.format("%01d", tipoatt); - record.overwrite(str,133); //Tipo attivita' - - str.format("%011s", (const char*) _corrlire.string()); - record.overwrite(str,135); //Corrispettivo in lire - - record.overwrite(_codvali,146); //Codice valuta - - str.format("%011s", (const char*) _cambioi.string()); - record.overwrite(str,149); //Cambio - - str.format("%014s", (const char*) _corrval.string()); - record.overwrite(str,160); //Corrispettivo in valuta - - _numrec++; - TString stringa; - stringa.format("%06ld", _numrec); - int posiz = _files.find("U"); - _control_rec.overwrite(stringa,((posiz * 6) + 47)); - _tras_file.write_control_rec(_control_rec,size); - _tras_file.close(); - - _tras_file.open(_trasf,TRUE); - _tras_file.write_control_rec(record,size); - _tras_file.close(); - } - delete _prog; - - //Inizializzo l'ultima sigla file elaborato su trasfer con la sigla del file successivo da inviare - //e inizializzo la chiave, altrimenti se si blocca l'invio subito dopo aver finito un file si rischia di - //ritrasferire l'ultimo record quando si riparte; inoltre non si riesce a inviare il file successivo perche' - //la chiave e' compilata con i dati del file precedente. - _tras_file.open(_trasf); - leggi_record_controllo(); - TString chiave,app,sigla; - app.format("%-15s", (const char*) chiave); - char sigla_p = _tras_file.ult_file()[0]; - int posiz = _files.find(sigla_p); - TString nuova_sigla = " "; - if (posiz < _files.len()) - nuova_sigla = _files.mid(posiz+1,1); - - _control_rec.overwrite(nuova_sigla,240); - _control_rec.overwrite(app,241); - _tras_file.write_control_rec(_control_rec,size); - _tras_file.close(); - - setta_tabella_ditta(m,"D",FALSE); - setta_parametri_record(m,"D"); - - return TRUE; -} - -bool TInv_cont::menu(MENU_TAG m) -{ - if (m == BAR_ITEM(1)) - return main_loop(); - return FALSE; -} - -int cg2900 (int argc, char* argv[]) -{ - TInv_cont a; - - a.run(argc,argv, "Invio contabilita'"); - - return TRUE; -} +// Invio contabilita' + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "cg2900.h" +#include "cglib04.h" + +HIDDEN TString80 TEMP; + +HIDDEN int date2esc(const TDate& d, int* prevesc = NULL); + +class TInv_cont : public TApplication +{ + enum { BUFSIZE = 4096 }; + + TTransfer_file _tras_file; + TProgind* _prog; + + TString _control_rec, _trasf, _std, _stato, _marker, _nome_simbolico; + TString _files, _codcaus, _numdoc, _reg, _codpag, _tipodoc, _codcausm; + TString _ocfpi, _ragsococc, _indocc, _capocc, _localocc, _provocc, _codvali; + bool _esiste_ditta, _esiste_record, _inviato; + long _ditta, _protiva, _uprotiva, _codcf, _numrec, _tot_rec; + long _dim_tot, _dim_disk; + int _num; + TDate _data, _datadoc, _data74ter,_datalimsk,_dataregiva; + real _corrlire, _cambioi, _corrval; + +public: + virtual bool create(); + virtual bool destroy(); + virtual bool menu(MENU_TAG m); + + bool main_loop(); + + bool esiste_tabella_studio(); + bool record_controllo(); + bool esegui_controlli(); + bool leggi_trasfer(); + bool controlli(); + bool sub_controlli(); + bool tabella_ditta(); + bool controlla_stato_invio(); + bool numero_data(); + void leggi_record_controllo(); + void codifica_ditta (TMask& m); + bool testata_mov_PN (long numreg); + bool testata_mov_IVA(long numreg); + void cerca_occasionale(); + void cerca_comune_occas(const TString& com); + + void crea_marker(TMask& m); + void setta_parametri_record(TMask& m,const TString& flag); + void setta_tabella_studio(TMask& m, bool flag_ditta = TRUE); + void setta_tabella_ditta(TMask& m, const char* flag, bool comp = TRUE); + void crea_record_controllo(TMask& m); + + bool invio_contabilita(TMask& m); + bool invio_tab_cau(TString& key,TMask& m); + bool invio_clifo (TString& key,TMask& m); + bool invio_pcon (TString& key,TMask& m); + bool invio_mov_PN (TString& key,TMask& m); + bool invio_mov_IVA(TString& key,TMask& m); + + void aggiorna_marker(TString& token, int pos); + void calcola_totale_record(); + bool controlla_valore(const TString& val, int lim); + void primanota_inviata(long numreg); + void iva_inviata(long numreg); + + const char* converti (TString& data_AS400); + const char* riconverti (TString& data_PC); + const char* cerca_provincia(const TString& comcf); + + static bool setta_maschera_hnd(TMask_field& f, KEY k); + + int calcola_numero_dischi(TMask& m); + FILE* chiedi_disco(const char* name, int disk, char floppy, bool lettura); + long determina_dimensione(FILE* f); + bool scrivi_disco(char floppy, int disk, const char* work, FILE* i, TProgind& w); + + TInv_cont() {}; +}; + +HIDDEN TInv_cont& app() { return (TInv_cont &) main_app(); } + +FILE* TInv_cont::chiedi_disco(const char* name, int disk, char floppy, bool lettura) +{ + message_box("Inserire il disco %d nel drive %c:", disk, floppy); + + // name.ext(format("%03d", disk)); + + FILE* f = NULL; + bool retry = TRUE; + while (retry) + { + f = fopen(name, lettura ? "rb" : "wb"); + if (f == NULL) + retry = yesno_box("Il file %s non e' accessibile: riprovare?", (const char*)name); + else + { + retry = FALSE; + fclose(f); + } + } + + return f; +} + +long TInv_cont::determina_dimensione(FILE* f) +{ + CHECK(f, "Can't measure NULL file"); + fseek(f, 0, SEEK_END); + const long s = ftell(f); + fseek(f, 0, SEEK_SET); + return s; +} + +bool TInv_cont::scrivi_disco(char floppy, int disk, const char* work, + FILE* i, TProgind& w) +{ + // const TFilename from(filename); // File da splittare + + // TFilename work; + // work << floppy << ":/" << from.name(); // File su dischetto + + chiedi_disco(work, disk, floppy, FALSE); + + TString str; + str.format("%02d", disk); + aggiorna_marker(str,31); // Aggiorna il num. progr. disco su marker + + TString path_m; + path_m << floppy << ":\\marker"; + + TString path_t; + path_t << floppy << ":\\trasfer"; + + fcopy(_marker,path_m); // Copia il marker su disco + + //FILE* i = fopen(from, "rb"); + FILE* o = fopen(path_t, "wb"); + + //if (i == NULL) return error_box("Impossibile aprire il file '%s'", from); + + //TProgind w(_dim_disk, "Trasferimento su dischetti in corso... Prego attendere", TRUE, TRUE, 40); + + TString buffer(BUFSIZE); + + long tot_scritti = BUFSIZE; + + while (tot_scritti <= _dim_disk) + { + const word letti = fread((char*)(const char*)buffer, 1, BUFSIZE, i); + + long scritti = fwrite((char*)(const char*)buffer, letti, 1, o); + + tot_scritti += letti; + + if (letti < BUFSIZE) break; + + w.addstatus(letti); + } + + //fclose(i); + fclose(o); + + return TRUE; +} + +bool TInv_cont::main_loop() +{ + TString str; + bool ripartenza = FALSE; + + if (!esiste_tabella_studio()) return FALSE; + + if (!esegui_controlli()) return FALSE; + + TMask msk ("cg2900a"); + KEY tasto; + + if (_ditta != 0) + { + msk.set(F_DITTAINV, _ditta); + msk.disable(F_DITTAINV); + codifica_ditta(msk); + msk.set(F_NUMULINV, _num); + msk.set(F_DATAULIN, _data.string()); + msk.set(F_STATO, _stato); + + TString uselab = _tras_file.ult_file(); + TString chiave = _tras_file.key(); + msk.set(F_USELAB, uselab); + msk.set(F_CHIAVE, chiave); + msk.set(F_DATALIM, _data.string()); + msk.disable(F_DATALIM); + + ripartenza = TRUE; + } + + msk.disable(F_NUMULINV); + msk.disable(F_DATAULIN); + msk.disable(F_STATO); + msk.disable(F_USELAB); + msk.disable(F_CHIAVE); + + if (!ripartenza) + msk.set_handler(F_DITTAINV, setta_maschera_hnd); + + tasto = msk.run(); + + if (tasto != K_ENTER) return FALSE; + + _datalimsk = msk.get(F_DATALIM); + + if (!ripartenza) + { + crea_marker(msk); //Crea il record con le informazioni sul marker + setta_parametri_record(msk,"F"); //Aggiorna parametri contabili ditta + setta_tabella_studio(msk); //Aggiorna la tabella studio per invio + setta_tabella_ditta(msk,"F"); //Aggiorna la tabella ditta per invio + crea_record_controllo(msk); //Crea il record di controllo sul file trasfer + } + + if (!invio_contabilita(msk)) + return FALSE; + + calcola_totale_record(); + str.format("%06ld", _tot_rec); + aggiorna_marker(str,23); + + TMask mask ("cg2900b"); + KEY k; + + k = mask.run(); + + if (k == K_ENTER) + { + int num_disk = calcola_numero_dischi(mask); + char floppy = mask.get(F_FLOPPY)[0]; + + str.format("%02d", num_disk); + aggiorna_marker(str,29); + + const TFilename from(_trasf); // File da splittare + + TFilename work; + work << floppy << ":/" << from.name(); // File su dischetto + + FILE* i = fopen(from, "rb"); + + if (i == NULL) return error_box("Impossibile aprire il file '%s'", from); + + TProgind w(_dim_tot, "Trasferimento su dischetti in corso... Prego attendere", TRUE, TRUE, 60); + + for (int j = 0; j < num_disk; j++) + { + scrivi_disco(floppy,j+1,work,i,w); + } + fclose(i); + + setta_tabella_studio(msk,FALSE); //Aggiorna la tabella studio per invio + setta_tabella_ditta(msk," ",FALSE); //Aggiorna la tabella ditta per invio + setta_parametri_record(msk," "); //Aggiorna parametri contabili ditta + + _tras_file.open(_trasf); + leggi_record_controllo(); + TString record(256); + record.format("%-256s",(const char*) record); + _control_rec.overwrite(record,0); + _tras_file.write_control_rec(_control_rec,256); + + fremove(_marker); + fremove(_trasf); + } + + return FALSE; +} + +int TInv_cont::calcola_numero_dischi(TMask& msk) +{ + int numdisc = 0; + + FILE* t = fopen(_trasf, "rb"); + if (t == NULL) return error_box("Impossibile aprire il file '%s'", _trasf); + + long dim_t = determina_dimensione(t); //Determina la dimensione del trasfer + fclose(t); + + FILE* m = fopen(_marker, "rb"); + if (m == NULL) return error_box("Impossibile aprire il file '%s'", _marker); + + long dim_m = determina_dimensione(m); // Determina la dimensione del marker + fclose(m); + + _dim_tot = dim_t + dim_m; // Determina la dimensione totale + + int item = msk.get_int(F_DIM); + + switch (item) + { + case 1 : + _dim_disk = 1400000L; + break; + case 2 : + _dim_disk = 1200000L; + break; + case 3 : + _dim_disk = 720000L; + break; + case 4 : + _dim_disk = 360000L; + break; + default : + break; + }; + + if (_dim_tot < _dim_disk) + numdisc = 1; + else + { + //double dischi = _dim_tot / _dim_disk; + //numdisc = (int)ceil(dischi); + numdisc = int(_dim_tot / _dim_disk); + if ( (_dim_tot % _dim_disk) != 0) + numdisc += 1; + } + + return numdisc; +} + +HIDDEN int date2esc(const TDate& d, int* prevesc) +{ + if (prevesc) *prevesc = 0; + TTable esc("ESC"); + for (int err = esc.first(); err == NOERR; err = esc.next()) + { + const TDate ia(esc.get("D0")); // Data inizio esercizio + const TDate fa(esc.get("D1")); // Data fine esercizio + const anno = esc.get_int("CODTAB"); + if (d >= ia && d <= fa) + return anno; + if (prevesc) *prevesc = anno; + } + return 0; +} + +bool TInv_cont::create() +{ + TApplication::create(); + + dispatch_e_menu (BAR_ITEM(1)); + + return TRUE; +} + +bool TInv_cont::destroy() +{ + return TApplication::destroy(); +} + +void TInv_cont::leggi_record_controllo() +{ + _tras_file.read_control_rec(); + _control_rec = _tras_file.record(); +} + +const char* TInv_cont::converti (TString& data_AS400) +{ + TEMP = data_AS400.mid(4,2); + TEMP << "-" < lim) + return FALSE; + } + else + if (val.len() > 1) + return FALSE; + + return TRUE; +} + +bool TInv_cont::invio_tab_cau(TString& key,TMask& m) +{ + int size = 256; + TString record(size); + TString cod; + TLocalisamfile cau (LF_CAUSALI); + + long cicli = cau.items(); + cicli -= _numrec; + _prog = new TProgind(cicli,"Invio tabella causali in corso... Prego attendere.",FALSE); + + if (key == "") + cau.first(); + else + { + cod = key.mid(2,3); + cau.setkey(1); + cau.zero(); + cau.put(CAU_CODCAUS, cod); + cau.read(); + } + + for (; !cau.eof(); cau.next()) + { + TString str; + + _prog->addstatus(1); + _tras_file.open(_trasf); + + record.spaces(); + + // Se trovo un codice causale alfanumerico l'invio deve essere interrotto + const char* codcau = cau.get(CAU_CODCAUS); + if (codcau && *codcau && !real::is_natural(codcau) ) + return error_box("Rilevato un codice causale alfanumerico nella causale %-3s: impossibile proseguire",codcau); + str.format("%03s", codcau); + record.overwrite("W1",0); //Tipo record + record.overwrite(str,2); //Codice causale + + + //Salvataggio della sigla e della chiave sul record di controllo del file trasfer + leggi_record_controllo(); + TString chiave,app; + chiave.format("%2s%03s", (const char*) "W1", codcau); + app.format("%-15s", (const char*) chiave); + _control_rec.overwrite("W",240); + _control_rec.overwrite(app,241); + //_tras_file.write_control_rec(_control_rec,size); + //_tras_file.close(); + + TString descr = cau.get(CAU_DESCR); + descr.format("%-.20s", (const char*) descr); + record.overwrite(descr,15); //Descrizione + + TString tipodoc = cau.get(CAU_TIPODOC); + record.overwrite(tipodoc,35); //Tipo documento + + //Se trovo un registro IVA con lunghezza maggiore di 1 l'invio deve essere interrotto + TString reg = cau.get(CAU_REG); + if (!controlla_valore(reg,9)) + return error_box("Rilevato un registro IVA con lunghezza superiore a 1 nella causale %03s: impossibile proseguire", codcau); + record.overwrite(reg,37); //Registro IVA + + bool alleg = cau.get_bool(CAU_ALLEG); + if (alleg) + record.overwrite("X",38); + else //Flag esclusione tipo documento da allegato + record.overwrite(" ",38); + + int m770 = atoi(cau.get(CAU_M770)); + str = format("%1d", m770); + record.overwrite(str,39); //Collegamento modello 770 + + TString cespiti = cau.get(CAU_COLLCESP); + record.overwrite(cespiti,40); //Collegamento cespiti + + bool numdoc = cau.get_bool(CAU_NUMDOC); + if (numdoc) + record.overwrite("1",206); + else //Flag immissione numero documento + record.overwrite("0",206); + + bool datadoc = cau.get_bool(CAU_DATADOC); + if (datadoc) + record.overwrite("1",207); + else //Flag immissione data documento + record.overwrite("0",207); + + const char* codcausim = cau.get(CAU_CODCAUSIM); + if (codcausim && *codcausim && !real::is_natural(codcausim) ) + return error_box("Rilevato un codice causale per incasso immediato alfanumerico nella causale %03s: impossibile proseguire",codcau); + str.format("%03s", codcausim); + record.overwrite(str,209); //Codice causale per incasso immediato + + bool intracom = cau.get_bool(CAU_INTRACOM); + if (intracom) + record.overwrite("X",246); + else //Flag per operazioni intracomunitarie + record.overwrite(" ",246); + + bool valintra = cau.get_bool(CAU_VALINTRA); + if (valintra) + record.overwrite("X",247); + else //Gestione valuta per oper. intracomunitarie + record.overwrite(" ",247); + + bool ritfatt = cau.get_bool(CAU_RITFATT); + if (ritfatt) + record.overwrite("X",248); + else //Flag causale per fattura ricevuta in ritardo + record.overwrite(" ",248); + + bool autofatt = cau.get_bool(CAU_AUTOFATT); + if (autofatt) + record.overwrite("X",249); + else //Autofattura art.34 + record.overwrite(" ",249); + + int num = 0; + int pos_gcs = 41; + int pos_sez = 191; + _codcaus = cau.get(CAU_CODCAUS); + + TLocalisamfile rcau (LF_RCAUSALI); + + do + { + num++; + + rcau.setkey(1); + rcau.zero(); + rcau.put(RCA_CODCAUS, _codcaus); + rcau.put(RCA_NRIGA, num); + + if (rcau.read() == NOERR) + { + int g = rcau.get_int (RCA_GRUPPO); + int c = rcau.get_int (RCA_CONTO); + + if (g > 99) + return error_box("Rilevato un gruppo composto da 3 cifre nella causale %03s riga %d: impossibile proseguire",codcau,num); + + if (c > 99) + return error_box("Rilevato un conto composto da 3 cifre nella causale %03s riga %d: impossibile proseguire",codcau,num); + + long s = rcau.get_long(RCA_SOTTOCONTO); + TString sez = rcau.get (RCA_SEZIONE); + + str = format("%02d", g); + record.overwrite(str,pos_gcs); //Gruppo + pos_gcs += 2; + str = format("%02d", c); + record.overwrite(str,pos_gcs); //Conto + pos_gcs += 2; + str = format("%06ld", s); + record.overwrite(str,pos_gcs); //Sottoconto + pos_gcs += 6; + + record.overwrite(sez,pos_sez); //Sezione + pos_sez++; + } + else + { + int g = 0; + int c = 0; + long s = 0; + TString sez = " "; + + str = format("%02d", g); + record.overwrite(str,pos_gcs); //Gruppo + pos_gcs += 2; + str = format("%02d", c); + record.overwrite(str,pos_gcs); //Conto + pos_gcs += 2; + str = format("%06ld", s); + record.overwrite(str,pos_gcs); //Sottoconto + pos_gcs += 6; + + record.overwrite(sez,pos_sez); //Sezione + pos_sez++; + } + + if (num == 15) + { + TString cau_app; + + rcau.next(); + if (!rcau.eof()) + cau_app = rcau.get(RCA_CODCAUS); + else + cau_app = ""; + + if (_codcaus == cau_app) + return error_box("Rilevata una causale con piu' di 15 righe: impossibile proseguire"); + } + } + while (num < 15); + + _numrec++; + TString stringa; + stringa.format("%06ld", _numrec); + int posiz = _files.find("W"); + _control_rec.overwrite(stringa,((posiz * 6) + 47)); + _tras_file.write_control_rec(_control_rec,size); + _tras_file.close(); + + _tras_file.open(_trasf,TRUE); + _tras_file.write_control_rec(record,size); + _tras_file.close(); + } + delete _prog; + + //Inizializzo l'ultima sigla file elaborato su trasfer con la sigla del file successivo da inviare + //e inizializzo la chiave, altrimenti se si blocca l'invio subito dopo aver finito un file si rischia di + //ritrasferire l'ultimo record quando si riparte; inoltre non si riesce a inviare il file successivo perche' + //la chiave e' compilata con i dati del file precedente. + _tras_file.open(_trasf); + leggi_record_controllo(); + TString chiave,app,sigla; + app.format("%-15s", (const char*) chiave); + char sigla_p = _tras_file.ult_file()[0]; + int posiz = _files.find(sigla_p); + TString nuova_sigla = " "; + if (posiz < _files.len()) + nuova_sigla = _files.mid(posiz+1,1); + + _control_rec.overwrite(nuova_sigla,240); + _control_rec.overwrite(app,241); + _tras_file.write_control_rec(_control_rec,size); + _tras_file.close(); + + setta_tabella_ditta(m,"D",FALSE); + setta_parametri_record(m,"D"); + + return TRUE; +} + +bool TInv_cont::invio_clifo(TString& key,TMask& m) +{ + int size = 256; + TString record(size); + char tipocf; + long codcf; + TLocalisamfile clifo (LF_CLIFO); + + long cicli = clifo.items(); + cicli -= _numrec; + _prog = new TProgind(cicli,"Invio anagrafica Clienti / Fornitori in corso... Prego attendere.",FALSE); + + if (key == "") + clifo.first(); + else + { + tipocf = (key.mid(2,1))[0]; + codcf = atol(key.mid(3,6)); + clifo.setkey(1); + clifo.zero(); + clifo.put(CLI_TIPOCF, tipocf); + clifo.put(CLI_CODCF, codcf); + clifo.read(); + } + + for (; !clifo.eof(); clifo.next()) + { + TString str; + + _prog->addstatus(1); + _tras_file.open(_trasf); + + record.spaces(); + + // Il tipocf su PC e' C = cliente F = fornitore. + // Il tipocf su AS400 e' 1 = cliente 2 = fornitore. + TString tipo_cod; + + char tipo = clifo.get_char(CLI_TIPOCF); + if (tipo == 'C') + tipo_cod = "1"; + else + if (tipo == 'F') + tipo_cod = "2"; + + record.overwrite("A1",0); //Tipo record + record.overwrite(tipo_cod,2); //Tipo cliente/fornitore + + long codice = clifo.get_long(CLI_CODCF); + str.format("%06ld", codice); + record.overwrite(str,3); //Codice cliente/fornitore + + //Salvataggio della chiave sul record di controllo del file trasfer + leggi_record_controllo(); + TString chiave,app; + chiave.format("%2s%s%06ld", (const char*) "A1", (const char*) tipo_cod, codice); + app.format("%-15s", (const char*) chiave); + _control_rec.overwrite("A",240); + _control_rec.overwrite(app,241); + // _tras_file.write_control_rec(_control_rec,size); + // _tras_file.close(); + + //Il tipo persona su PC e' F = fisica G = giuridica + //Il tipo persona su AS400 e' 0 = giuridica 1 = fisica + char tipop = clifo.get_char(CLI_TIPOPERS); + TString tipopers; + + if (tipop == 'F') + tipopers = "1"; + else + if (tipop == 'G') + tipopers = "0"; + + record.overwrite(tipopers,15); //Tipo persona + + TString ragsoc = clifo.get(CLI_RAGSOC); + TString cognome = ragsoc.mid(0,30); + TString nome = ragsoc.mid(30,20); + str.format("%-30s", (const char*) cognome); //Cognome o I ragione sociale + record.overwrite(str,16); + str.format("%-20s", (const char*) nome); + record.overwrite(str,46); //Nome o II ragione sociale + + //Se la partita IVA e' maggiore di 11 il programma di invio viene fermato + TString paiv = clifo.get(CLI_PAIV); + if (paiv.len() > 11) + return error_box("Rilevata partita IVA con piu' di 11 caratteri in codice %c%d: impossibile proseguire",tipo,codice); + str.format("%-11s", (const char*) paiv); + record.overwrite(str,66); //Partita IVA + + TString cofi = clifo.get(CLI_COFI); + str.format("%-16s", (const char*) cofi); + record.overwrite(str,77); //Codice fiscale + + TString indcf = clifo.get(CLI_INDCF); + TString civcf = clifo.get(CLI_CIVCF); + int lind = indcf.len(); + int lciv = civcf.len(); + int totlen = lind + lciv + 1; + if (totlen < 36) + indcf << " " << civcf; + + str.format("%-35s", (const char*) indcf); + record.overwrite(str,93); //Indirizzo + + TString capcf = clifo.get(CLI_CAPCF); + record.overwrite(capcf,128); //Codice di avviamento postale + + TString localita = clifo.get(CLI_LOCCF); + str.format("%-.20s", (const char*) localita); + record.overwrite(str,133); //Localita' + + TString comcf = clifo.get(CLI_COMCF); + TString provincia = cerca_provincia(comcf); + str.format("%-2s", (const char*) provincia); + record.overwrite(str,153); //Provincia + + TString ptel = clifo.get(CLI_PTEL); + TString tel = clifo.get(CLI_TEL); + TString appoggio; + appoggio << ptel << " " << tel; + if (appoggio.len() > 12) + warning_box("Rilevato numero telefonico troppo lungo in codice %c%ld: impossibile inviare",tipo,codice); + else //Numero telefono + record.overwrite(appoggio,155); + + TString alleg = clifo.get(CLI_ALLEG); + record.overwrite(alleg,167); //Flag gestione allegato + + int gruppo = clifo.get_int(CLI_GRUPPORIC); + int conto = clifo.get_int(CLI_CONTORIC); + + if (gruppo > 99) + return error_box("Rilevato gruppo costo/ricavo composto da 3 cifre in codice %c%d: impossibile proseguire",tipo,codice); + + if (conto > 99) + return error_box("Rilevato conto costo/ricavo composto da 3 cifre in codice %c%d: impossibile proseguire",tipo,codice); + + long sottoc = clifo.get_long(CLI_SOTTOCRIC); + str.format("%02d", gruppo); + record.overwrite(str,168); //Gruppo di costo/ricavo + str.format("%02d", conto); + record.overwrite(str,170); //Conto di costo/ricavo + str.format("%06ld", sottoc); + record.overwrite(str,172); //sottoconto di costo/ricavo + + long codalleg = clifo.get_long(CLI_CODALLEG); + str.format("%06ld", codalleg); + record.overwrite(str,179); + + //Se il codice di pagamento e' superiore alle 2 cifre l'invio deve essere interrotto + TString codpag = clifo.get(CLI_CODPAG); + if (!controlla_valore(codpag,99)) + return error_box("Rilevato un codice di pagamento composto da 3 o piu' cifre in codice %c%d: impossibile proseguire",tipo,codice); + + str.format("%-2s", (const char*) codpag); + + _numrec++; + TString stringa; + stringa.format("%06ld", _numrec); + int posiz = _files.find("A"); + _control_rec.overwrite(stringa,((posiz * 6) + 47)); + _tras_file.write_control_rec(_control_rec,size); + _tras_file.close(); + + _tras_file.open(_trasf,TRUE); + _tras_file.write_control_rec(record,size); + _tras_file.close(); + } + delete _prog; + + //Inizializzo l'ultima sigla file elaborato su trasfer con la sigla del file successivo da inviare + //e inizializzo la chiave, altrimenti se si blocca l'invio subito dopo aver finito un file si rischia di + //ritrasferire l'ultimo record quando si riparte; inoltre non si riesce a inviare il file successivo perche' + //la chiave e' compilata con i dati del file precedente. + _tras_file.open(_trasf); + leggi_record_controllo(); + TString chiave,app,sigla; + app.format("%-15s", (const char*) chiave); + char sigla_p = _tras_file.ult_file()[0]; + int posiz = _files.find(sigla_p); + TString nuova_sigla = " "; + if (posiz < _files.len()) + nuova_sigla = _files.mid(posiz+1,1); + + _control_rec.overwrite(nuova_sigla,240); + _control_rec.overwrite(app,241); + _tras_file.write_control_rec(_control_rec,size); + _tras_file.close(); + + setta_tabella_ditta(m,"D",FALSE); + setta_parametri_record(m,"D"); + + return TRUE; +} + +bool TInv_cont::invio_pcon(TString& key,TMask& m) +{ + int size = 256; + TString record(size); + int gruppo,conto; + long sottoc; + TLocalisamfile pcon (LF_PCON); + + long cicli = pcon.items(); + cicli -= _numrec; + _prog = new TProgind(cicli,"Invio anagrafica Piano dei Conti in corso... Prego attendere.",FALSE); + + if (key == "") + pcon.first(); + else + { + gruppo = atoi(key.mid(2,2)); + conto = atoi(key.mid(4,2)); + sottoc = atol(key.mid(6,6)); + pcon.setkey(1); + pcon.zero(); + pcon.put(PCN_GRUPPO, gruppo); + pcon.put(PCN_CONTO, conto); + pcon.put(PCN_SOTTOCONTO, sottoc); + pcon.read(); + } + + for (; !pcon.eof(); pcon.next()) + { + TString str; + + _prog->addstatus(1); + _tras_file.open(_trasf); + + record.spaces(); + + int g = pcon.get_int (PCN_GRUPPO); + + if (g > 99) + return error_box("Rilevato un gruppo composto da 3 cifre in %03d: impossibile proseguire",g); + + int c = pcon.get_int (PCN_CONTO); + + if (c > 99) + return error_box("Rilevato un conto composto da 3 cifre in %03d: impossibile proseguire",c); + + long s = pcon.get_long(PCN_SOTTOCONTO); + + // Se si tratta di un GRUPPO + + if (g != 0 && c == 0 && s == 0) + { + //Salvataggio della sigla e della chiave sul record di controllo del file trasfer + leggi_record_controllo(); + TString chiave,app; + chiave.format("%2s%02d%02d%06ld", (const char*) "P1", g, c, s); + app.format("%-15s", (const char*) chiave); + _control_rec.overwrite("P",240); + _control_rec.overwrite(app,241); + // _tras_file.write_control_rec(_control_rec,size); + // _tras_file.close(); + + record.overwrite("P1",0); //Tipo record + str.format("%02d", g); + record.overwrite(str,2); //Gruppo + + TString descr (pcon.get(PCN_DESCR)); + str.format("%-.30s", (const char*) descr); + record.overwrite(str,15); //Descrizione gruppo + } + + // Se si tratta di un CONTO + + if (g != 0 && c != 0 && s == 0) + { + //Salvataggio della sigla e della chiave sul record di controllo del file trasfer + leggi_record_controllo(); + TString chiave,app; + chiave.format("%2s%02d%02d%06ld", (const char*) "P2", g, c, s); + app.format("%-15s", (const char*) chiave); + _control_rec.overwrite("P",240); + _control_rec.overwrite(app,241); + // _tras_file.write_control_rec(_control_rec,size); + // _tras_file.close(); + + record.overwrite("P2",0); //Tipo record + str.format("%02d", g); + record.overwrite(str,2); //Gruppo + + str.format("%02d", c); + record.overwrite(str,4); //Conto + + TString descr (pcon.get(PCN_DESCR)); + str.format("%-.30s", (const char*) descr); + record.overwrite(str,15); //Descrizione conto + + int indbil = pcon.get_int(PCN_INDBIL); + str.format("%d", indbil); + record.overwrite(str,45); //Indicatore di bilancio + + TString tmcf = pcon.get(PCN_TMCF); + record.overwrite(tmcf,46); //Flag conto cliente/fornitore + + bool stsottbil = pcon.get_bool(PCN_STSOTTBIL); + if (stsottbil) + str = "0"; + else + str = "1"; + record.overwrite(str,47); //Flag stampa dettaglio sottoconti su bilancio + + // Classe IV direttiva CEE + + TString sez = pcon.get(PCN_SEZIVD); + if (sez == "0") + sez = " "; + record.overwrite(sez,48); //Sezione IV dir + + TString let = pcon.get(PCN_LETTIVD); + record.overwrite(let,49); //Lettera IV dir + + int numrom = atoi(pcon.get(PCN_NUMRIVD)); + str.format("%03d", numrom); + record.overwrite(str,60); //Numero arabo corrispondente al numero romano + TString numr = itor(numrom); + str.format("%-8s", (const char*) numr); + record.overwrite(str,50); //Numero romano IV dir + + int num = pcon.get_int(PCN_NUMIVD); + str.format("%02d", num); + record.overwrite(str,58); //Numero arabo IV dir + + // Classe IV direttiva CEE di segno opposto + + TString sezop = pcon.get(PCN_SEZIVDOPP); + if (sezop == "0") + sezop = " "; + record.overwrite(sezop,63); //Sezione IV dir + + TString letop = pcon.get(PCN_LETTIVDOPP); + record.overwrite(letop,64); //Lettera IV dir + + int numromop = atoi(pcon.get(PCN_NUMRIVDOPP)); + str.format("%03d", numromop); + record.overwrite(str,75); //Numero arabo corrispondente al numero romano + TString numrop = itor(numromop); + str.format("%-8s", (const char*) numrop); + record.overwrite(str,65); //Numero romano IV dir + + int numop = pcon.get_int(PCN_NUMIVDOPP); + str.format("%02d", numop); + record.overwrite(str,73); //Numero arabo IV dir + } + + // Se si tratta di un SOTTOCONTO + + if (g != 0 && c != 0 && s != 0) + { + //Salvataggio della sigla e della chiave sul record di controllo del file trasfer + leggi_record_controllo(); + TString chiave,app; + chiave.format("%2s%02d%02d%06ld", (const char*) "P3", g, c, s); + app.format("%-15s", (const char*) chiave); + _control_rec.overwrite("P",240); + _control_rec.overwrite(app,241); + // _tras_file.write_control_rec(_control_rec,size); + // _tras_file.close(); + + record.overwrite("P3",0); //Tipo record + str.format("%02d", g); + record.overwrite(str,2); //Gruppo + + str.format("%02d", c); + record.overwrite(str,4); //Conto + + str.format("%06ld", s); + record.overwrite(str,6); //Sottoconto + + TString descr (pcon.get(PCN_DESCR)); + str.format("%-.30s", (const char*) descr); + record.overwrite(str,15); //Descrizione sottoconto + + int tipospric = pcon.get_int(PCN_TIPOSPRIC); + str.format("%d", tipospric); + record.overwrite(str,45); //Tipo costo/ricavo + + int ricser = pcon.get_int(PCN_RICSER); + if (ricser == 0) + str = " "; + else + str.format("%d", ricser); + record.overwrite(str,46); //Tipo attivita' + + // Classe IV direttiva CEE + + TString sez = pcon.get(PCN_SEZIVD); + if (sez == "0") + sez = " "; + record.overwrite(sez,47); //Sezione IV dir + + TString let = pcon.get(PCN_LETTIVD); + record.overwrite(let,48); //Lettera IV dir + + int numrom = atoi(pcon.get(PCN_NUMRIVD)); + str.format("%03d", numrom); + record.overwrite(str,59); //Numero arabo corrispondente al numero romano + TString numr = itor(numrom); + str.format("%-8s", (const char*) numr); + record.overwrite(str,49); //Numero romano IV dir + + int num = pcon.get_int(PCN_NUMIVD); + str.format("%02d", num); + record.overwrite(str,57); //Numero arabo IV dir + + // Classe IV direttiva CEE di segno opposto + + TString sezop = pcon.get(PCN_SEZIVDOPP); + if (sezop == "0") + sezop = " "; + record.overwrite(sezop,62); //Sezione IV dir + + TString letop = pcon.get(PCN_LETTIVDOPP); + record.overwrite(letop,63); //Lettera IV dir + + int numromop = atoi(pcon.get(PCN_NUMRIVDOPP)); + str.format("%03d", numromop); + record.overwrite(str,74); //Numero arabo corrispondente al numero romano + TString numrop = itor(numromop); + str.format("%-8s", (const char*) numrop); + record.overwrite(str,64); //Numero romano IV dir + + int numop = pcon.get_int(PCN_NUMIVDOPP); + str.format("%02d", numop); + record.overwrite(str,72); //Numero arabo IV dir + } + + _numrec++; + TString stringa; + stringa.format("%06ld", _numrec); + int posiz = _files.find("P"); + _control_rec.overwrite(stringa,((posiz * 6) + 47)); + _tras_file.write_control_rec(_control_rec,size); + _tras_file.close(); + + _tras_file.open(_trasf,TRUE); + _tras_file.write_control_rec(record,size); + _tras_file.close(); + } + delete _prog; + + //Inizializzo l'ultima sigla file elaborato su trasfer con la sigla del file successivo da inviare + //e inizializzo la chiave, altrimenti se si blocca l'invio subito dopo aver finito un file si rischia di + //ritrasferire l'ultimo record quando si riparte; inoltre non si riesce a inviare il file successivo perche' + //la chiave e' compilata con i dati del file precedente. + _tras_file.open(_trasf); + leggi_record_controllo(); + TString chiave,app,sigla; + app.format("%-15s", (const char*) chiave); + char sigla_p = _tras_file.ult_file()[0]; + int posiz = _files.find(sigla_p); + TString nuova_sigla = " "; + if (posiz < _files.len()) + nuova_sigla = _files.mid(posiz+1,1); + + _control_rec.overwrite(nuova_sigla,240); + _control_rec.overwrite(app,241); + _tras_file.write_control_rec(_control_rec,size); + _tras_file.close(); + + setta_tabella_ditta(m,"D",FALSE); + setta_parametri_record(m,"D"); + + return TRUE; +} + +bool TInv_cont::testata_mov_PN(long numreg) +{ + TLocalisamfile mov (LF_MOV); + + mov.setkey(1); + mov.zero(); + mov.put(MOV_NUMREG, numreg); + if (mov.read() == NOERR) + { + _datadoc = mov.get_date(MOV_DATADOC); + _numdoc = mov.get (MOV_NUMDOC); + _reg = mov.get (MOV_REG); + _codcausm = mov.get (MOV_CODCAUS); + _codpag = mov.get (MOV_CODPAG); + _tipodoc = mov.get (MOV_TIPODOC); + _protiva = mov.get_long(MOV_PROTIVA); + _uprotiva = mov.get_long(MOV_UPROTIVA); + _inviato = mov.get_bool(MOV_INVIATO); + } + else + return FALSE; + + return TRUE; +} + +void TInv_cont::primanota_inviata(long numreg) +{ + TLocalisamfile mov (LF_MOV); + + mov.setkey(1); + mov.zero(); + mov.put(MOV_NUMREG, numreg); + if (mov.read() == NOERR) + { + mov.put(MOV_INVIATO, "X"); + mov.rewrite(); + } +} + +bool TInv_cont::invio_mov_PN(TString& key,TMask& m) +{ + int size = 256; + TString record(size); + long numreg,nreg_p; + int numrig; + TLocalisamfile rmov (LF_RMOV); + + nreg_p = -1; + + long cicli = rmov.items(); + cicli -= _numrec; + _prog = new TProgind(cicli,"Invio Movimenti di primanota in corso... Prego attendere.",FALSE); + + if (key == "") + rmov.first(); + else + { + numreg = atol(key.mid(2,6)); + numrig = atoi(key.mid(8,2)); + rmov.setkey(1); + rmov.zero(); + rmov.put(RMV_NUMREG, numreg); + rmov.put(RMV_NUMRIG, numrig); + rmov.read(); + } + + for (; !rmov.eof(); rmov.next()) + { + TString str; + + _prog->addstatus(1); + + _tras_file.open(_trasf); + + record.spaces(); + + long nreg = rmov.get_long(RMV_NUMREG); + int nrig = rmov.get_int (RMV_NUMRIG); + + if (nreg != nreg_p) + if (!testata_mov_PN(nreg)) + return error_box("Rilevata riga mancante di testata: impossibile proseguire"); + + if (_inviato) continue; //Se il movimento e' gia' stato inviato non lo posso piu' inviare + //cosi' come le sue righe di primanota e iva + + //Salvataggio della chiave sul record di controllo del file trasfer + leggi_record_controllo(); + TString chiave,app; + chiave.format("%2s%06ld%02d", (const char*) "Z1", nreg, nrig); + app.format("%-15s", (const char*) chiave); + _control_rec.overwrite("Z",240); + _control_rec.overwrite(app,241); + // _tras_file.write_control_rec(_control_rec,size); + // _tras_file.close(); + + TDate datareg (rmov.get(RMV_DATAREG)); + + TString dataregstr = datareg.string(); + TString datalimstr = _datalimsk.string(); + + if (datareg > _datalimsk) continue; //Se la data di operazione e' maggiore di quella + //indicata nella maschera iniziale, il + //movimento deve essere scartato. + if (nreg > 999999) + return error_box("Rilevato un numero di registrazione composto da 7 cifre in %07ld riga %03d: impossibile proseguire",nreg,nrig); + + if (nrig > 99) + return error_box("Rilevato un numero di riga composto da 3 cifre in %07ld riga %03d: impossibile proseguire",nreg,nrig); + + record.overwrite("Z1",0); //Tipo record + + str.format("%06ld", nreg); + record.overwrite(str,2); //Numero di registrazione + + str.format("%02d", nrig); + record.overwrite(str,8); //Numero di riga + + nreg_p = nreg; + + TString datastr = datareg.string(); + str = riconverti(dataregstr); + record.overwrite(str,15); //Data di registrazione + + //Determino il segnalino della competenza + int segnalino; + + int annoes = rmov.get_int(RMV_ANNOES); + int anno = date2esc(datareg); + if (annoes == anno) + segnalino = 0; + else + segnalino = 1; + str.format("%d", segnalino); + record.overwrite(str,21); //Segnalino della competenza + + TString datadocstr = _datadoc.string(); + str = riconverti(datadocstr); + record.overwrite(str,22); //Data documento + + str.format("%-7s", (const char*) _numdoc); + record.overwrite(str,28); + + if (!controlla_valore(_reg,9)) + return error_box("Rilevato un codice registro IVA composto da 2 o piu' cifre in %07ld riga %03d: impossibile proseguire",nreg,nrig); + record.overwrite(_reg,35); //Codice registro IVA + + str.format("%05d", _protiva); + record.overwrite(str,36); //Numero protocollo IVA + + // Se trovo un codice causale alfanumerico l'invio deve essere interrotto + const char* cod_causm = (const char*)_codcausm; + if (_codcausm != "") + if (!real::is_natural(cod_causm)) + return error_box("Rilevato un codice causale alfanumerico in %07ld riga %03d: impossibile proseguire",nreg,nrig); + str.format("%03s", (const char*)_codcausm); + record.overwrite(str,41); //Codice causale + + TString descr = rmov.get(RMV_DESCR); + str.format("%-.30s", (const char*) descr); + record.overwrite(str,44); //Descrizione riga di movimento + + int gruppo = rmov.get_int(RMV_GRUPPO); + if (gruppo > 99) + return error_box("Rilevato un gruppo di partita composto da 3 cifre in %07ld riga %03d: impossibile proseguire",nreg,nrig); + str.format("%02d", gruppo); + record.overwrite(str,74); //Gruppo di partita + + int conto = rmov.get_int(RMV_CONTO); + if (conto > 99) + return error_box("Rilevato un conto di partita composto da 3 cifre in %07ld riga %03d: impossibile proseguire",nreg,nrig); + str.format("%02d", conto); + record.overwrite(str,76); //Conto di partita + + long sottoc = rmov.get_long(RMV_SOTTOCONTO); + str.format("%06ld", sottoc); + record.overwrite(str,78); //Sottoconto di partita + + TString sez = rmov.get(RMV_SEZIONE); + str.format("%s", (const char*) sez); + record.overwrite(str,84); //Sezione importo + + int gruppoc = rmov.get_int(RMV_GRUPPOC); + if (gruppoc > 99) + return error_box("Rilevato un gruppo di contropartita composto da 3 cifre in %07ld riga %03d: impossibile proseguire",nreg,nrig); + str.format("%02d", gruppoc); + record.overwrite(str,85); //Gruppo di contropartita + + int contoc = rmov.get_int(RMV_CONTOC); + if (contoc > 99) + return error_box("Rilevato un conto di contropartita composto da 3 cifre in %07ld riga %03d: impossibile proseguire",nreg,nrig); + str.format("%02d", contoc); + record.overwrite(str,87); //Conto di contropartita + + long sottocc = rmov.get_long(RMV_SOTTOCONTOC); + str.format("%06ld", sottocc); + record.overwrite(str,89); //Sottoconto di contropartita + + if (!controlla_valore(_codpag,99)) + return error_box("Rilevato un codice di pagamento composto da 3 o piu' cifre in %07ld riga %03d: impossibile proseguire",nreg,nrig); + str.format("%-2s", (const char*) _codpag); + record.overwrite(str,95); //Codice di pagamento + + real importo (rmov.get_real(RMV_IMPORTO)); + str.format("%011s", (const char*) importo.string()); + record.overwrite(str,97); //Importo riga di movimento + + str.format("%05d", _uprotiva); + record.overwrite(str,108); //Ultimo numero di protocollo IVA + + TString tipoc = rmov.get(RMV_TIPOC); + record.overwrite(tipoc,219); //Flag cliente/fornitore + + record.overwrite(_tipodoc,220); //Tipo documento + + _numrec++; + TString stringa; + stringa.format("%06ld", _numrec); + int posiz = _files.find("Z"); + _control_rec.overwrite(stringa,((posiz * 6) + 47)); + _tras_file.write_control_rec(_control_rec,size); + _tras_file.close(); + + _tras_file.open(_trasf,TRUE); + _tras_file.write_control_rec(record,size); + _tras_file.close(); + + primanota_inviata(nreg); + } + delete _prog; + + //Inizializzo l'ultima sigla file elaborato su trasfer con la sigla del file successivo da inviare + //e inizializzo la chiave, altrimenti se si blocca l'invio subito dopo aver finito un file si rischia di + //ritrasferire l'ultimo record quando si riparte; inoltre non si riesce a inviare il file successivo perche' + //la chiave e' compilata con i dati del file precedente. + _tras_file.open(_trasf); + leggi_record_controllo(); + TString chiave,app,sigla; + app.format("%-15s", (const char*) chiave); + char sigla_p = _tras_file.ult_file()[0]; + int posiz = _files.find(sigla_p); + TString nuova_sigla = " "; + if (posiz < _files.len()) + nuova_sigla = _files.mid(posiz+1,1); + + _control_rec.overwrite(nuova_sigla,240); + _control_rec.overwrite(app,241); + _tras_file.write_control_rec(_control_rec,size); + _tras_file.close(); + + setta_tabella_ditta(m,"D",FALSE); + setta_parametri_record(m,"D"); + + return TRUE; +} + +bool TInv_cont::testata_mov_IVA(long numreg) +{ + TLocalisamfile mov (LF_MOV); + + mov.setkey(1); + mov.zero(); + mov.put(MOV_NUMREG, numreg); + if (mov.read() == NOERR) + { + _codcf = mov.get_long(MOV_CODCF); + _data74ter = mov.get_date(MOV_DATA74TER); + _corrlire = mov.get_real(MOV_CORRLIRE); + _codvali = mov.get (MOV_CODVALI); + _cambioi = mov.get_real(MOV_CAMBIOI); + _corrval = mov.get_real(MOV_CORRVALUTA); + _ocfpi = mov.get (MOV_OCFPI); + _dataregiva = mov.get_date(MOV_DATAREG); + _inviato = mov.get_bool(MOV_INVIVA); + if (_ocfpi.not_empty()) + cerca_occasionale(); + } + else + return FALSE; + + return TRUE; +} + +void TInv_cont::iva_inviata(long numreg) +{ + TLocalisamfile mov (LF_MOV); + + mov.setkey(1); + mov.zero(); + mov.put(MOV_NUMREG, numreg); + if (mov.read() == NOERR) + { + mov.put(MOV_INVIVA, "X"); + mov.rewrite(); + } +} + +void TInv_cont::cerca_occasionale() +{ + TLocalisamfile occas (LF_OCCAS); + + occas.setkey(1); + occas.zero(); + occas.put(OCC_CFPI, _ocfpi); + if (occas.read() == NOERR) + { + _ragsococc = occas.get(OCC_RAGSOC); + _indocc = occas.get(OCC_INDIR); + _capocc = occas.get(OCC_CAP); + TString com = occas.get(OCC_COM); + cerca_comune_occas(com); + } + else + { + _ragsococc = ""; + _indocc = ""; + _capocc = ""; + _localocc = ""; + _provocc = ""; + } +} + +void TInv_cont::cerca_comune_occas(const TString& com) +{ + TLocalisamfile comuni (LF_COMUNI); + + comuni.setkey(1); + comuni.zero(); + comuni.put(COM_COM, com); + if (comuni.read() == NOERR) + { + _localocc = comuni.get(COM_DENCOM); + _provocc = comuni.get(COM_PROVCOM); + } +} + +bool TInv_cont::invio_mov_IVA(TString& key,TMask& m) +{ + int size = 256; + TString record(size); + long numreg,nreg_p; + int numrig; + int numero_righe = 0; + TLocalisamfile rmoviva (LF_RMOVIVA); + + nreg_p = -1; + + long cicli = rmoviva.items(); + cicli -= _numrec; + _prog = new TProgind(cicli,"Invio Movimenti iva in corso... Prego attendere.",FALSE); + + if (key == "") + rmoviva.first(); + else + { + numreg = atol(key.mid(2,6)); + numrig = atoi(key.mid(8,2)); + rmoviva.setkey(1); + rmoviva.zero(); + rmoviva.put(RMI_NUMREG, numreg); + rmoviva.put(RMI_NUMRIG, numrig); + rmoviva.read(); + } + + for (; !rmoviva.eof(); rmoviva.next()) + { + TString str; + + _prog->addstatus(1); + + _tras_file.open(_trasf); + + record.spaces(); + + long nreg = rmoviva.get_long(RMI_NUMREG); + int nrig = rmoviva.get_int (RMI_NUMRIG); + + if (nreg != nreg_p) + { + numero_righe = 0; + if (!testata_mov_IVA(nreg)) + return error_box("Rilevata riga mancante di testata: impossibile proseguire"); + } + + if (_inviato) continue; + + if (_dataregiva > _datalimsk) continue; + + //Salvataggio della chiave sul record di controllo del file trasfer + leggi_record_controllo(); + TString chiave,app; + chiave.format("%2s%06ld%02d", (const char*) "U1", nreg, nrig); + app.format("%-15s", (const char*) chiave); + _control_rec.overwrite("U",240); + _control_rec.overwrite(app,241); + // _tras_file.write_control_rec(_control_rec,size); + // _tras_file.close(); + + if (nreg > 999999) + return error_box("Rilevato un numero di registrazione composto da 7 cifre in %07ld riga %03d: impossibile proseguire",nreg,nrig); + + if (nrig > 99) + return error_box("Rilevato un numero di riga composto da 3 cifre in %07ld riga %03d: impossibile proseguire",nreg,nrig); + + record.overwrite("U1",0); //Tipo record + + str.format("%06ld", nreg); + record.overwrite(str,2); //Numero di registrazione + + str.format("%02d", nrig); + record.overwrite(str,8); //Numero di riga + + numero_righe++; + if (numero_righe > 9) + return error_box("Rilevata una registrazione IVA con piu' di 9 righe: impossibile proseguire"); + + nreg_p = nreg; + + str.format("%06ld", _codcf); + record.overwrite(str,15); //Codice cliente/fornitore + + real imponibile (rmoviva.get_real(RMI_IMPONIBILE)); + str.format("%011s", (const char*) imponibile.string()); + record.overwrite(str,21); //Imponibile + + //Se trovo un codice iva composto da piu' di 2 cifre l'invio viene interrotto + TString codiva (rmoviva.get(RMI_CODIVA)); + if ( codiva && *codiva && !real::is_natural(codiva) ) + return error_box("Rilevato un codice IVA alfanumerico in %07ld riga %03d: impossibile proseguire",nreg,nrig); + if (!controlla_valore(codiva,99)) + return error_box("Rilevato un codice IVA composto da 3 o piu' cifre in %07ld riga %03d: impossibile proseguire",nreg,nrig); + str.format("%02s", (const char*) codiva); + record.overwrite(str,32); //Codice iva + + real imposta (rmoviva.get_real(RMI_IMPOSTA)); + str.format("%09s", (const char*) imposta.string()); + record.overwrite(str,34); //Imposta + + int tipocr = rmoviva.get_int(RMI_TIPOCR); + str.format("%01d", tipocr); + record.overwrite(str,43); //Tipo costo/ricavo + + int tipodet = rmoviva.get_int(RMI_TIPODET); + str.format("%01d", tipodet); + record.overwrite(str,44); //Tipo detraibilita' + + int gruppo = rmoviva.get_int(RMI_GRUPPO); + if (gruppo > 99) + return error_box("Rilevato un gruppo composto da 3 cifre in %07ld riga %03d: impossibile proseguire",nreg,nrig); + str.format("%02d", gruppo); + record.overwrite(str,45); //Gruppo + + int conto = rmoviva.get_int(RMI_CONTO); + if (conto > 99) + return error_box("Rilevato un conto composto da 3 cifre in %07ld riga %03d: impossibile proseguire",nreg,nrig); + str.format("%02d", conto); + record.overwrite(str,47); //Conto + + long sottoc = rmoviva.get_long(RMI_SOTTOCONTO); + str.format("%06ld", sottoc); + record.overwrite(str,49); //Sottoconto + + TString data74terstr = _data74ter.string(); + str = riconverti(data74terstr); + record.overwrite(str,55); //Data per registri 74 TER + + if (_ocfpi.not_empty()) + { + str.format("%-.25s", (const char*) _ragsococc); + record.overwrite(str,61); //Ragione sociale cliente occasionale + + str.format("%-.22s", (const char*) _indocc); + record.overwrite(str,86); //indirizzo cliente occasionale + + str.format("%-.18s", (const char*) _localocc); + record.overwrite(str,108); //Localita cliente occasionale + + str.format("%-5s", (const char*) _capocc); + record.overwrite(str,126); //Codice avviamento postale cliente occasionale + + str.format("%-.2s", (const char*) _provocc); + record.overwrite(str,131); //Provincia cliente occasionale + } + + int tipoatt = rmoviva.get_int(RMI_TIPOATT); + str.format("%01d", tipoatt); + record.overwrite(str,133); //Tipo attivita' + + str.format("%011s", (const char*) _corrlire.string()); + record.overwrite(str,135); //Corrispettivo in lire + + record.overwrite(_codvali,146); //Codice valuta + + str.format("%011s", (const char*) _cambioi.string()); + record.overwrite(str,149); //Cambio + + str.format("%014s", (const char*) _corrval.string()); + record.overwrite(str,160); //Corrispettivo in valuta + + _numrec++; + TString stringa; + stringa.format("%06ld", _numrec); + int posiz = _files.find("U"); + _control_rec.overwrite(stringa,((posiz * 6) + 47)); + _tras_file.write_control_rec(_control_rec,size); + _tras_file.close(); + + _tras_file.open(_trasf,TRUE); + _tras_file.write_control_rec(record,size); + _tras_file.close(); + + iva_inviata(nreg); + } + delete _prog; + + //Inizializzo l'ultima sigla file elaborato su trasfer con la sigla del file successivo da inviare + //e inizializzo la chiave, altrimenti se si blocca l'invio subito dopo aver finito un file si rischia di + //ritrasferire l'ultimo record quando si riparte; inoltre non si riesce a inviare il file successivo perche' + //la chiave e' compilata con i dati del file precedente. + _tras_file.open(_trasf); + leggi_record_controllo(); + TString chiave,app,sigla; + app.format("%-15s", (const char*) chiave); + char sigla_p = _tras_file.ult_file()[0]; + int posiz = _files.find(sigla_p); + TString nuova_sigla = " "; + if (posiz < _files.len()) + nuova_sigla = _files.mid(posiz+1,1); + + _control_rec.overwrite(nuova_sigla,240); + _control_rec.overwrite(app,241); + _tras_file.write_control_rec(_control_rec,size); + _tras_file.close(); + + setta_tabella_ditta(m,"D",FALSE); + setta_parametri_record(m,"D"); + + return TRUE; +} + +bool TInv_cont::menu(MENU_TAG m) +{ + if (m == BAR_ITEM(1)) + return main_loop(); + return FALSE; +} + +int cg2900 (int argc, char* argv[]) +{ + TInv_cont a; + + a.run(argc,argv, "Invio contabilita'"); + + return TRUE; +} diff --git a/cg/cglib04.cpp b/cg/cglib04.cpp index 9e625fdbf..3ff6390cf 100755 --- a/cg/cglib04.cpp +++ b/cg/cglib04.cpp @@ -184,7 +184,7 @@ long TTransfer_file::start(char sigla) long TTransfer_file::start(int i) { if (i == 0) - return 0; + return 1; else { TToken_string data = (TToken_string&)_index[i-1]; @@ -780,7 +780,9 @@ void TMappa_trc::leggi_modulo() while (s.ok()) { - record = s.line(); + record = s.line(); + + if (record.mid(0,1) == "#") continue; //Perche' e' un commento TString sigla = record.get(0); long numrec = record.get_long(1); @@ -820,3 +822,9 @@ int TMappa_trc::flag(const char* key) TToken_string * data = (TToken_string *) objptr(key); return data->get_int(6); } + +int TMappa_trc::flag_bis(const char* key) +{ + TToken_string * data = (TToken_string *) objptr(key); + return data->get_int(7); +} diff --git a/cg/cglib04.h b/cg/cglib04.h index 9583cbe09..d60185460 100755 --- a/cg/cglib04.h +++ b/cg/cglib04.h @@ -38,6 +38,7 @@ class TMappa_trc : public TAssoc_array int logicnum (const char* key); const char* field_name (const char* key); int flag (const char* key); + int flag_bis (const char* key); TMappa_trc() {}; };