From 0400c86fa18a79b15587221085ac98db124dd431 Mon Sep 17 00:00:00 2001 From: guy Date: Wed, 2 Mar 2011 16:30:31 +0000 Subject: [PATCH] Patch level : 10.0 Files correlati : cg0200a.msk cg0.exe Ricompilazione Demo : [ ] Commento : Migliorata e corretta gestione IBAN nelle liste ns. e vs. banche git-svn-id: svn://10.65.10.50/branches/R_10_00@21731 c028cbd2-c16b-5b4b-a496-9718f37d4682 --- cg/cg0200.cpp | 163 ++++++++++++++++++++++++++++++++++-------------- cg/cg0200a.uml | 48 +++++++------- cg/cgsaldac.cpp | 30 ++++----- 3 files changed, 155 insertions(+), 86 deletions(-) diff --git a/cg/cg0200.cpp b/cg/cg0200.cpp index 4a8a64a45..800ac3307 100755 --- a/cg/cg0200.cpp +++ b/cg/cg0200.cpp @@ -10,6 +10,7 @@ #include #include #include +#include #include #include @@ -53,6 +54,8 @@ protected: void set_pnae(TMask& m, TToken_string& nonacc, TToken_string& nonscd); void get_pnae(const TMask& m, TToken_string& nonacceff, TToken_string& nonscadeff); + void add_bank(TSheet_field& ns_sh, const TRectype& rec); + virtual int write(const TMask& m); virtual int rewrite(const TMask& m); @@ -656,6 +659,112 @@ void TClifo_application::set_pnae(TMask& m, TToken_string& nonacc, TToken_string pnae.force_update(); } +void TClifo_application::add_bank(TSheet_field& ns_sh, const TRectype& rec) +{ + TToken_string & row = ns_sh.row(-1); + + TString8 abi, cab; + TString80 numcc, iban; + + switch (rec.num()) + { + case LF_CLIFO: + abi = rec.get(CLI_CODABI); + cab = rec.get(CLI_CODCAB); + numcc = rec.get(CLI_NUMCC); + iban = rec.get(CLI_IBAN); + break; + case LF_CFVEN: + abi = rec.get(CFV_CODABIPR); + cab = rec.get(CFV_CODCABPR); + break; + case LF_CFBAN: + abi = rec.get(CFBAN_ABI); + cab = rec.get(CFBAN_CAB); + numcc = rec.get(CFBAN_NUMCC); + iban = rec.get(CFBAN_IBAN); + // Copia il progressivo solo nello sheet delle banche di presentazione + if (ns_sh.sheet_mask().efield(F_PROGPR).active()) + { + const TString& progr = rec.get(CFBAN_PROGPR); + row.add(progr, ns_sh.cid2index(F_PROGPR)); + if (abi.len()+cab.len() == 10) + { + TString16 codtab; codtab << abi << cab << progr; + const TString& ib = cache().get("BNP", codtab, "S3"); + TString msg; + if (iban_check(ib, msg) == 0) + iban = ib; + } + } + break; + default: + break; + } + + if (iban.full()) + { + TString msg; + if (iban_check(iban, msg) == 0) + { + if (iban.starts_with("IT")) + { + abi = iban.mid(5, 5); + cab = iban.mid(10, 5); + numcc = iban.right(12); + } + } + else + { + if (bban_check(iban, msg) == 0) + { + abi = iban.mid(1, 5); + cab = iban.mid(6, 5); + numcc = iban.mid(11); + row.add("IT", ns_sh.cid2index(F_IBAN_STATO)); + row.add(iban.left(1), ns_sh.cid2index(F_BBAN_CIN)); + } + else + iban.cut(0); + } + } + + row.add(abi, ns_sh.cid2index(F_BBAN_ABI)); + row.add(cab, ns_sh.cid2index(F_BBAN_CAB)); + row.add(numcc, ns_sh.cid2index(F_BBAN_CONTO)); + + if (abi.len()+cab.len() == 10) + { + TString16 key; key << abi << cab; + row.add(cache().get("%BAN", key, "S0"), ns_sh.cid2index(F_DESBAN)); + } + + if (row.starts_with("IT") && row.get_int(ns_sh.cid2index(F_IBAN_CHECK)) == 0) + { + const int i = ns_sh.items()-1; + TMask& msk = ns_sh.sheet_row_mask(i); + ns_sh.update_mask(i); // Copia dalla riga alla maschera + msk.efield(F_IBAN_CHECK).validate(K_TAB); // Calcola checksum + const TString& chk = msk.get(F_IBAN_CHECK); + if (!real::is_null(chk) && iban.len() == 23) // BBAN da completare + { + iban.insert(chk); + iban.insert("IT"); + } + } + + if (iban.full()) + { + row.add(iban.left(2), ns_sh.cid2index(F_IBAN_STATO)); + row.add(iban.mid(2,2), ns_sh.cid2index(F_IBAN_CHECK)); + if (row.starts_with("IT")) + row.add(iban.mid(4,1), ns_sh.cid2index(F_BBAN_CIN)); + else + row.add(iban.mid(4), ns_sh.cid2index(F_BBAN)); + row.add(iban, ns_sh.cid2index(F_IBAN)); + } +} + int TClifo_application::read(TMask& m) { TRelation_application::read(m); @@ -709,48 +818,23 @@ int TClifo_application::read(TMask& m) field_sheet(F_CODINDEFF).add(riga); } } - TToken_string key; + TToken_string key; key.add(m.get(F_TIPOCF)); key.add(m.get(F_CODCF)); key.add("V"); - TRecord_array ns_ban(key, LF_CFBAN); + const TRectype& clifo = get_relation()->curr(LF_CLIFO); TSheet_field & ns_sh = m.sfield(F_BANA); ns_sh.destroy(-1, false); for (i = 1; i <= ns_ban.rows(); i++) - { - TToken_string & row = ns_sh.row(i -1); - const TRectype & ban = ns_ban.row(i); - - row.add(ban.get(CFBAN_ABI), ns_sh.cid2index(F_BBAN_ABI)); - row.add(ban.get(CFBAN_CAB), ns_sh.cid2index(F_BBAN_CAB)); - row.add(ban.get(CFBAN_NUMCC), ns_sh.cid2index(F_BBAN_CONTO)); - - const TString & iban = ban.get(CFBAN_IBAN); - - row.add(iban, ns_sh.cid2index(F_IBAN)); - ns_sh.update_mask(i - 1); - if (iban.full()) - ns_sh.sheet_row_mask(i - 1).efield(F_IBAN_STATO).validate(K_TAB); // Decodifica IBAN - ns_sh.update_row(i - 1); - } + add_bank(ns_sh, ns_ban.row(i)); if (ns_ban.rows() == 0 && clifo.get_int(CLI_CODABI) != 0) - { - TToken_string & row = ns_sh.row(0); + add_bank(ns_sh, clifo); - row.add(clifo.get(CLI_CODABI), ns_sh.cid2index(F_BBAN_ABI)); - row.add(clifo.get(CLI_CODCAB), ns_sh.cid2index(F_BBAN_CAB)); - row.add(clifo.get(CLI_NUMCC), ns_sh.cid2index(F_BBAN_CONTO)); - - const TString & iban = clifo.get(CLI_IBAN); - - row.add(iban, ns_sh.cid2index(F_IBAN)); - ns_sh.update_mask(0); - } - key.cut(0); + key.cut(0); key.add(m.get(F_TIPOCF)); key.add(m.get(F_CODCF)); key.add("N"); @@ -760,25 +844,10 @@ int TClifo_application::read(TMask& m) vs_sh.destroy(-1, false); for (i = 1; i <= vs_ban.rows(); i++) - { - TToken_string & row = vs_sh.row(i -1); - const TRectype & ban = vs_ban.row(i); - - row.add(ban.get(CFBAN_ABI), vs_sh.cid2index(F_BBAN_ABI)); - row.add(ban.get(CFBAN_CAB), vs_sh.cid2index(F_BBAN_CAB)); - row.add(ban.get(CFBAN_PROGPR), vs_sh.cid2index(F_PROGPR)); - vs_sh.update_mask(i - 1); - vs_sh.sheet_row_mask(i - 1).efield(F_IBAN_STATO).validate(K_TAB); // Decodifica IBAN - vs_sh.update_row(i - 1); - } + add_bank(vs_sh, vs_ban.row(i)); if (vs_ban.rows() == 0 && cfven.get_int(CFV_CODABIPR) != 0) - { - TToken_string & row = vs_sh.row(0); + add_bank(vs_sh, cfven); - row.add(cfven.get(CFV_CODABIPR), vs_sh.cid2index(F_BBAN_ABI)); - row.add(cfven.get(CFV_CODCABPR), vs_sh.cid2index(F_BBAN_CAB)); - vs_sh.update_mask(0); - } return _rel->status(); } diff --git a/cg/cg0200a.uml b/cg/cg0200a.uml index 9b08072eb..c1bfcc2ef 100755 --- a/cg/cg0200a.uml +++ b/cg/cg0200a.uml @@ -668,14 +668,14 @@ BEGIN PROMPT 0 4 "@bBanche di appoggio" END -SPREADSHEET F_BANA 80 7 +SPREADSHEET F_BANA 0 8 BEGIN PROMPT 0 5 "" - ITEM "IBAN\nStato" - ITEM "IBAN\nCheck" - ITEM "IBAN\nCIN" - ITEM "IBAN\nABI" - ITEM "IBAN\nCAB" + ITEM "IBAN\nNaz.@4" + ITEM "IBAN\nChk.@4" + ITEM "IBAN\nCIN@4" + ITEM "IBAN\nABI@5" + ITEM "IBAN\nCAB@5" ITEM "IBAN\nConto@12" ITEM "@1" ITEM "Descrizione@50" @@ -687,14 +687,14 @@ BEGIN PROMPT 0 14 "@bBanche di presentazione" END -SPREADSHEET F_BANP 80 7 +SPREADSHEET F_BANP 0 0 BEGIN PROMPT 0 15 "" - ITEM "IBAN\nStato" - ITEM "IBAN\nCheck" - ITEM "IBAN\nCIN" - ITEM "IBAN\nABI" - ITEM "IBAN\nCAB" + ITEM "IBAN\nNaz.@4" + ITEM "IBAN\nChk@4" + ITEM "IBAN\nCIN@4" + ITEM "IBAN\nABI@5" + ITEM "IBAN\nCAB@5" ITEM "IBAN\nConto@12" ITEM "Progressivo" ITEM "Descrizione@50" @@ -2059,32 +2059,32 @@ ENDPAGE ENDMASK -PAGE "Banche di appoggio" -1 -1 80 8 +PAGE "Banche di appoggio" -1 -1 52 5 STRING F_IBAN_STATO 2 BEGIN - PROMPT 2 2 "Codice IBAN " + PROMPT 1 1 "" FLAGS "U" VALIDATE CHECK_IBAN_FUNC F_IBAN F_IBAN_STATO F_IBAN_CHECK F_BBAN F_BBAN_CIN F_BBAN_ABI F_BBAN_CAB F_BBAN_CONTO END NUMBER F_IBAN_CHECK 2 BEGIN - PROMPT 24 2 "" + PROMPT 5 1 "" FLAGS "UZ" VALIDATE CHECK_IBAN_FUNC F_IBAN F_IBAN_STATO F_IBAN_CHECK F_BBAN F_BBAN_CIN F_BBAN_ABI F_BBAN_CAB F_BBAN_CONTO END STRINGA F_BBAN_CIN 1 BEGIN - PROMPT 33 2 "BBAN " + PROMPT 9 1 "" FLAGS "U" VALIDATE CHECK_BBAN_FUNC F_BBAN F_BBAN_CIN F_BBAN_ABI F_BBAN_CAB F_BBAN_CONTO END NUMBER F_BBAN_ABI 5 BEGIN - PROMPT 41 2 "" + PROMPT 12 1 "" USE %BAN SELECT CODTAB ?= "?????" INPUT CODTAB F_BBAN_ABI DISPLAY "Codice ABI" CODTAB[1,5] @@ -2097,7 +2097,7 @@ END NUMBER F_BBAN_CAB 5 BEGIN - PROMPT 50 2 "" + PROMPT 21 1 "" USE %BAN SELECT CODTAB ?= "??????????" INPUT CODTAB[1,5] F_BBAN_ABI INPUT CODTAB[6,10] F_BBAN_CAB @@ -2114,20 +2114,20 @@ END STRING F_BBAN_CONTO 12 BEGIN - PROMPT 59 2 "" + PROMPT 30 1 "" FLAGS "UZ" VALIDATE CHECK_BBAN_FUNC F_BBAN F_BBAN_CIN F_BBAN_ABI F_BBAN_CAB F_BBAN_CONTO END NUMBER F_PROGPR 2 BEGIN - PROMPT 2 60 "" + PROMPT 1 60 "Progressivo IGNORATO" FLAGS "D" END STRING F_DESBAN 50 40 BEGIN - PROMPT 20 4 "Descrizione " + PROMPT 1 2 "" USE %BAN KEY 2 SELECT CODTAB ?= "??????????" INPUT S0 F_DESBAN DISPLAY "Denominazione@50" S0 @@ -2138,13 +2138,13 @@ END STRING F_IBAN 27 BEGIN - PROMPT 2 6 "IBAN " + PROMPT 1 3 "IBAN " FLAGS "D" END STRING F_BBAN 23 BEGIN - PROMPT 2 60 "BBAN " + PROMPT 41 3 "BBAN " FLAGS "HD" END @@ -2242,7 +2242,7 @@ END STRING F_DESBAN 50 40 BEGIN - PROMPT 20 4 "Descrizione " + PROMPT 20 3 "Descrizione " USE %BAN KEY 2 SELECT (CODTAB ?= "??????????"&&100@->CODTAB!="") JOIN BNP ALIAS 100 INTO CODTAB==CODTAB INPUT S0 F_DESBAN diff --git a/cg/cgsaldac.cpp b/cg/cgsaldac.cpp index 5ca32383c..1a170493e 100755 --- a/cg/cgsaldac.cpp +++ b/cg/cgsaldac.cpp @@ -180,15 +180,7 @@ void TValuta::put(TRectype& rec) const void TValuta::set(TMask& m, short v, short d, short c, short e) const { - if (in_lire()) - { - m.reset(v); - m.reset(d); - m.reset(c); - if (e && m.id2pos(e) >= 0) - m.reset(e); - } - else + if (in_valuta()) { m.set(v, _cod); m.set(d, _dat.string()); @@ -196,6 +188,14 @@ void TValuta::set(TMask& m, short v, short d, short c, short e) const if (e && m.id2pos(e) >= 0) m.set(e, _et == _exchange_contro ? "X" : ""); } + else + { + m.reset(v); + m.reset(d); + m.reset(c); + if (e && m.id2pos(e) >= 0) + m.reset(e); + } } void TValuta::get(const TMask& m, short v, short d, short c, short e) @@ -620,7 +620,7 @@ bool TRiga_scadenze::modifica_pagamento(const TRectype& new_pag, const TValuta& old_diffcam = calcola_differenza_cambio(nrigp, false); - if (in_val && !valuta.in_lire()) + if (in_val && valuta.in_valuta()) valuta.put(sum); row(nrigp) = new_pag; @@ -894,8 +894,8 @@ bool TRiga_partite::in_valuta() const TImporto TRiga_partite::importo(bool valuta, int mode) const { CHECKD(mode > 0x0 && mode <= 0xF, "Bad importo mode ", mode); - const bool in_lire = !in_valuta(); // Partita in lire - if (valuta && in_lire) + const bool in_euro = !in_valuta(); // Partita in Euro + if (valuta && in_euro) valuta = false; TImporto i; @@ -918,7 +918,7 @@ TImporto TRiga_partite::importo(bool valuta, int mode) const } else // Desidero gli abbuoni in lire { - if (in_lire && (mode & 0x8)) + if (in_euro && (mode & 0x8)) { i.valore() += get_real(PART_RITENUTE); if (sezione() == sezione_ritsoc()) @@ -930,7 +930,7 @@ TImporto TRiga_partite::importo(bool valuta, int mode) const if (mode & 0x2) { TImporto abbuoni(get_char(PART_SEZABB), get_real(PART_ABBUONI)); - if (!in_lire) // Converto in lire gli abbuoni che sono memorizzati in valuta + if (!in_euro) // Converto in lire gli abbuoni che sono memorizzati in valuta { const real cambio(get(PART_CAMBIO)); TCurrency cur(abbuoni.valore(), codice_valuta(), cambio); @@ -940,7 +940,7 @@ TImporto TRiga_partite::importo(bool valuta, int mode) const i += abbuoni; } - if (!in_lire && (mode & 0x4)) // Se ci sono e desidero le differenze cambio + if (!in_euro && (mode & 0x4)) // Se ci sono e desidero le differenze cambio { const TImporto diffcam(get_char(PART_SEZDIFCAM), get_real(PART_DIFFCAM)); i += diffcam;