diff --git a/ibm36/ibm36100.cpp b/ibm36/ibm36100.cpp index 621d9d009..c011cabe2 100755 --- a/ibm36/ibm36100.cpp +++ b/ibm36/ibm36100.cpp @@ -11,8 +11,13 @@ #include "ibm36.h" #include +#include #include +/////////////////////////////////////////////////////////// +// TMask36 Maschera principale di selezione +/////////////////////////////////////////////////////////// + class TMask36 : public TAutomask { protected: @@ -28,8 +33,55 @@ bool TMask36::on_field_event(TOperable_field& o, TField_event e, long jolly) return TRUE; } +/////////////////////////////////////////////////////////// +// TBankitalia +/////////////////////////////////////////////////////////// + +class TBankitalia : public TObject +{ + TAssoc_array _bank; + +public: + const TString* codban2abicab(const char* codban); + void update(); + + TBankitalia() { } + virtual ~TBankitalia() { } +}; + +void TBankitalia::update() +{ + TTable ban("%BAN"); + const TRectype& curban = ban.curr(); + + _bank.destroy(); + for (int err = ban.first(); err == NOERR; err = ban.next()) + { + TString16 codban = curban.get("S9"); + if (codban.not_empty()) + { + const TString& abicab = curban.get("CODTAB"); + _bank.add(codban, abicab); + } + } +} + +const TString* TBankitalia::codban2abicab(const char* cod) +{ + if (_bank.items() == 0) + update(); + const TString* abicab = (const TString*)_bank.objptr(cod); + return abicab; +} + +/////////////////////////////////////////////////////////// +// TTrasfer36 Applicazione di importazione dati da 36 +/////////////////////////////////////////////////////////// + class TTrasfer36 : public TSkeleton_application { + TBankitalia _bankitalia; + protected: virtual void main_loop(); virtual const char* extra_modules() const { return "*"; } // Non e' un modulo normale @@ -37,6 +89,9 @@ protected: public: const TString& cap2com(const TString& cap, const TString& name) const; void split_indir(const TString& indir, TString& via, TString& civ) const; + void mettilavirgola(TFile_text& file, TRecord_text& curr, const char* field, int len, int comma); + void permille(TFile_text& file, TRecord_text& curr, const char* field); + void machedata(TFile_text& file, TRecord_text& curr, const char* field); void import_tables(const TFilename& name, TBrowsefile_field& bf); void import_clifo(const TFilename& name, TBrowsefile_field& bf); }; @@ -159,15 +214,29 @@ void TTrasfer36::import_tables(const TFilename& name, TBrowsefile_field& bf) TString16 cab = file.get_field(curr, "CAB"); if (abi.empty() || cab.empty()) { - if (abi.empty()) abi = "99999"; - if (cab.empty()) { cab = cod; cab.right_just(5, '0'); } - - msg = "! La banca "; - msg << cod << " non dispone di un codice ABI/CAB valido"; - bf.add_line(msg); - msg = "- Verra' creata la banca fittizia "; - msg << abi << ' ' << cab; - bf.add_line(msg); + if (abi.empty()) + abi = "99999"; + if (cab.empty()) + { + const TString* abicab = _bankitalia.codban2abicab(cod); + if (abicab != NULL) + { + abi = abicab->left(5); + cab = abicab->mid(5); + } + else + { + ban.last(); + const TString16 abicab = ban.get("CODTAB"); + if (abicab.left(5) == "99999") + { + long numcab = atol(abicab.mid(5)) + 1; + cab.format("%05ld", numcab); + } + else + cab = "00001"; + } + } } abi.right_just(5, '0'); cab.right_just(5, '0'); @@ -189,14 +258,21 @@ void TTrasfer36::import_tables(const TFilename& name, TBrowsefile_field& bf) ban.put("CODTAB", codtab); if (ban.read() == NOERR) { - ban.put("I14", cod); + ban.put("S9", cod); ban.rewrite(); } else { + msg = "! La banca "; + msg << cod << " non dispone di un codice ABI/CAB valido"; + bf.add_line(msg); + msg = "- Verra' creata la banca fittizia "; + msg << abi << ' ' << cab; + bf.add_line(msg); + ban.put("CODTAB", codtab); ban.put("S0", file.get_field(curr, "RAGSOC")); - ban.put("I14", cod); + ban.put("S9", cod); const TString& cap = file.get_field(curr, "CAP"); ban.put("S3", cap); @@ -219,12 +295,69 @@ void TTrasfer36::import_tables(const TFilename& name, TBrowsefile_field& bf) } } + _bankitalia.update(); + msg = "Record importati: "; msg << valid; bf.add_line(msg); bf.add_line(""); } +void TTrasfer36::mettilavirgola(TFile_text& file, TRecord_text& curr, const char* field, int len, int comma) +{ + TString80 num = file.get_field(curr, field); + if (!real::is_null(num)) + { + num.right_just(len, '0'); + num.insert(".", len - comma); + file.add_field(curr, field, num); + } +} + +void TTrasfer36::permille(TFile_text& file, TRecord_text& curr, const char* field) +{ + TString80 num = file.get_field(curr, field); + if (!real::is_null(num)) + { + num << "000"; + file.add_field(curr, field, num); + } +} + +void TTrasfer36::machedata(TFile_text& file, TRecord_text& curr, const char* field) +{ + TString80 num = file.get_field(curr, field); + if (!real::is_null(num)) + { + switch (num.len()) + { + case 6: + { + num.insert("19", 0); + const TDate data(atol(num)); + file.add_field(curr, field, data.string()); + } + break; + case 7: + { + const int secolo = num[0] - '0'; + long ansidata = atol(num.mid(1)); + ansidata += (19 + secolo) * 1000000L; + const TDate data(ansidata); + file.add_field(curr, field, data.string()); + } + break; + case 8: + num.insert("-", 4); + num.insert("-", 2); + file.add_field(curr, field, num); + break; + default: + break; + } + } +} + void TTrasfer36::import_clifo(const TFilename& name, TBrowsefile_field& bf) { TAssoc_array missing_firm; @@ -276,6 +409,9 @@ void TTrasfer36::import_clifo(const TFilename& name, TBrowsefile_field& bf) const char* tipocf = (tipo_record & 0x1) ? "C" : "F"; const long codcf = atol(file.get_field(curr, "CODCF")); + TString16 extcf; + extcf << (*tipocf == 'C' ? "cliente" : "fornitore") << ' ' << codcf; + TLocalisamfile& clifo = rel.lfile(); clifo.put(CLI_TIPOCF, tipocf); clifo.put(CLI_CODCF, codcf); @@ -292,7 +428,7 @@ void TTrasfer36::import_clifo(const TFilename& name, TBrowsefile_field& bf) if (err != NOERR) { msg = "! Non esiste il "; - msg << (*tipocf == 'C' ? "cliente" : "fornitore") << ' ' << codcf; + msg << extcf; bf.add_line(msg); msg = "- Inserimento di "; msg << file.get_field(curr, "COGNOME") << file.get_field(curr, "NOME"); @@ -311,6 +447,45 @@ void TTrasfer36::import_clifo(const TFilename& name, TBrowsefile_field& bf) case 3: if (err == NOERR) { + TString cod = file.get_field(curr, "CODICE BANCA D'APPOGGIO"); + if (!cod.blank()) + { + const TString* abicab = _bankitalia.codban2abicab(cod); + if (abicab) + { + rel.curr().put(CLI_CODABI, abicab->left(5)); + rel.curr().put(CLI_CODCAB, abicab->mid(5)); + } + else + { + msg = "Ipossibile determinare l'ABI/CAB della banca d'appoggio "; + msg << cod << " del " << extcf; + bf.add_line(msg); + } + } + + cod = file.get_field(curr, "CODICE BANCA PRESENTAZIONE EFFETTI"); + if (!cod.blank()) + { + const TString* abicab = _bankitalia.codban2abicab(cod); + if (abicab) + { + rel.curr(LF_CFVEN).put(CFV_CODABIPR, abicab->left(5)); + rel.curr(LF_CFVEN).put(CFV_CODCABPR, abicab->mid(5)); + } + else + { + msg = "Ipossibile determinare l'ABI/CAB della banca di presentazione "; + msg << cod << " del " << extcf; + bf.add_line(msg); + } + } + + mettilavirgola(file, curr, "PROVVIGIONE AGENTE", 5, 2); + permille(file, curr, "IMPORTO MINIMO EFFETTI"); + machedata(file, curr, "DATA INIZIO RID"); + machedata(file, curr, "DATA REVOCA RID"); + rel.write_enable(LF_CFVEN); const int err = file.autosave(rel, curr); if (err != NOERR) @@ -323,10 +498,27 @@ void TTrasfer36::import_clifo(const TFilename& name, TBrowsefile_field& bf) valid++; } break; - case 4: - // Ignored + case 5: + if (err != NOERR) + { + machedata(file, curr, "DATA INVIO ULTIMO ESTRATTO CONTO"); + machedata(file, curr, "DATA INVIO ULTIMO SOLLECITO"); + permille(file, curr, "FIDO"); + + rel.write_enable(LF_CFVEN); + const int err = file.autosave(rel, curr); + if (err != NOERR) + { + msg = "! Errore di scrittura sul file LF_CFVEN: "; + msg << err; + bf.add_line(msg); + } + else + valid++; + } break; - default: break; + default: break;// Ignored + } } } diff --git a/ibm36/ibm36cf.ini b/ibm36/ibm36cf.ini index f38d7ac9f..198335973 100755 --- a/ibm36/ibm36cf.ini +++ b/ibm36/ibm36cf.ini @@ -95,15 +95,15 @@ LENGTH(40) = 1 LENGTH(41) = 7 LENGTH(42) = 7 LENGTH(43) = 1 -LENGTH(44) = 1 -LENGTH(45) = 5 +LENGTH(44) = 5 +LENGTH(45) = 4 LENGTH(46) = 4 LENGTH(47) = 4 -LENGTH(48) = 4 +LENGTH(48) = 1 LENGTH(49) = 1 LENGTH(50) = 1 LENGTH(51) = 1 -LENGTH(52) = 1 +LENGTH(52) = 12 LENGTH(53) = 12 NAME(0) = ANNULLATO @@ -151,7 +151,7 @@ NAME(41) = DATA INIZIO RID NAME(42) = DATA REVOCA RID NAME(43) = FILLER NAME(44) = EMISSIONE EFFETTI A RICHIESTA -NAME(45) = IMPORTO MINIMO EFFETTI/1000 +NAME(45) = IMPORTO MINIMO EFFETTI NAME(46) = GGMM INIZIO NON ACCETTAZIONE EFFETtI NAME(47) = GGMM FINE NON ACCETTAZIONE EFFETtI NAME(48) = GGMM SCADENZA EFFETTI DEI PERIODI NON ACCETTATI @@ -177,44 +177,44 @@ POSITION(12) = 33 POSITION(13) = 35 POSITION(14) = 45 POSITION(15) = 47 -POSITION(16) = 50 -POSITION(17) = 51 -POSITION(18) = 52 -POSITION(19) = 55 -POSITION(20) = 57 -POSITION(21) = 59 -POSITION(22) = 61 -POSITION(23) = 63 -POSITION(24) = 66 -POSITION(25) = 69 -POSITION(26) = 72 -POSITION(27) = 73 -POSITION(28) = 74 -POSITION(29) = 80 -POSITION(30) = 82 -POSITION(31) = 83 -POSITION(32) = 89 -POSITION(33) = 95 -POSITION(34) = 101 -POSITION(35) = 107 -POSITION(36) = 108 -POSITION(37) = 110 -POSITION(38) = 113 -POSITION(39) = 116 -POSITION(40) = 119 -POSITION(41) = 120 -POSITION(42) = 124 -POSITION(43) = 128 -POSITION(44) = 129 -POSITION(45) = 130 -POSITION(46) = 133 -POSITION(47) = 141 -POSITION(48) = 149 -POSITION(49) = 157 -POSITION(50) = 158 -POSITION(51) = 159 -POSITION(52) = 160 -POSITION(53) = 161 +POSITION(16) = 52 +POSITION(17) = 53 +POSITION(18) = 54 +POSITION(19) = 57 +POSITION(20) = 59 +POSITION(21) = 61 +POSITION(22) = 63 +POSITION(23) = 65 +POSITION(24) = 68 +POSITION(25) = 71 +POSITION(26) = 74 +POSITION(27) = 75 +POSITION(28) = 76 +POSITION(29) = 82 +POSITION(30) = 84 +POSITION(31) = 85 +POSITION(32) = 91 +POSITION(33) = 97 +POSITION(34) = 103 +POSITION(35) = 109 +POSITION(36) = 110 +POSITION(37) = 112 +POSITION(38) = 115 +POSITION(39) = 118 +POSITION(40) = 121 +POSITION(41) = 122 +POSITION(42) = 129 +POSITION(43) = 136 +POSITION(44) = 137 +POSITION(45) = 142 +POSITION(46) = 150 +POSITION(47) = 158 +POSITION(48) = 166 +POSITION(49) = 167 +POSITION(50) = 168 +POSITION(51) = 169 +POSITION(52) = 170 +POSITION(53) = 182 FIELD(1) = TIPOCF FIELD(3) = CODCF @@ -276,16 +276,91 @@ LENGTH(0) = 1 LENGTH(1) = 1 LENGTH(2) = 4 LENGTH(3) = 6 +LENGTH(4) = 2 +LENGTH(5) = 1 +LENGTH(6) = 2 +LENGTH(7) = 2 +LENGTH(8) = 5 +LENGTH(9) = 3 +LENGTH(10) = 1 +LENGTH(11) = 3 +LENGTH(12) = 2 +LENGTH(13) = 1 +LENGTH(14) = 6 +LENGTH(15) = 6 +LENGTH(16) = 9 +LENGTH(17) = 5 +LENGTH(18) = 51 +LENGTH(19) = 2 +LENGTH(20) = 30 +LENGTH(21) = 8 +LENGTH(22) = 20 +LENGTH(23) = 2 +LENGTH(24) = 3 + NAME(0) = ANNULLATO NAME(1) = TIPOCF NAME(2) = DITTA NAME(3) = CODCF +NAME(4) = CODICE CATEGORIA VENDITE +NAME(5) = FLAG GESTIONE CONTRATTO +NAME(6) = CODICE LISTINO +NAME(7) = CODICE TABELLA SCONTO INCONDIZIONATO +NAME(8) = PERCENTUALE SCONTO CLIENTE +NAME(9) = CODICE MAGAZZINO +NAME(10) = CODICE DEPOSITO +NAME(11) = CODICI SPESE DA ADDEBITARE +NAME(12) = CODICE PROFILO SOLLECITO +NAME(13) = NUMERO MASSIMO SOLLECITO +NAME(14) = DATA INVIO ESTRATTO CONTO +NAME(15) = DATA INVIO ULTIMO SOLLECITO +NAME(16) = FIDO +NAME(17) = PERCENTUALE SCONTO RIGA +NAME(19) = TITOLO ONORIFICO +NAME(21) = DATA DI NASCITA +NAME(22) = LUOGO DI NASCITA +NAME(23) = PROVINCIA DI NASCITA +NAME(24) = NAZIONE DI NASCITA + POSITION(0) = 0 POSITION(1) = 1 POSITION(2) = 2 POSITION(3) = 6 +POSITION(4) = 0 +POSITION(5) = 14 +POSITION(6) = 15 +POSITION(7) = 17 +POSITION(8) = 19 +POSITION(9) = 22 +POSITION(10) = 25 +POSITION(11) = 26 +POSITION(12) = 38 +POSITION(13) = 40 +POSITION(14) = 41 +POSITION(15) = 47 +POSITION(16) = 53 +POSITION(17) = 58 +POSITION(18) = 61 +POSITION(19) = 112 +POSITION(20) = 114 +POSITION(21) = 144 +POSITION(22) = 152 +POSITION(23) = 172 +POSITION(24) = 174 + FIELD(1) = TIPOCF FIELD(3) = CODCF +FIELD(5) = 17->GESCONTR +FIELD(6) = 17->CODLIS +FIELD(7) = 17->CODSCC +FIELD(8) = 17->SCONTO +FIELD(9) = 17->CODMAG +FIELD(10) = 17->CODDEP +FIELD(12) = 17->PROFSOLL +FIELD(13) = 17->MAXSOLL +FIELD(14) = 17->DATAESC +FIELD(15) = 17->DATASOLL +FIELD(16) = 17->FIDO [RECORD 6] LENGTH(0) = 1