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
This commit is contained in:
guy 2011-03-02 16:30:31 +00:00
parent ec08db1f9b
commit 0400c86fa1
3 changed files with 155 additions and 86 deletions

View File

@ -10,6 +10,7 @@
#include <recarray.h> #include <recarray.h>
#include <relapp.h> #include <relapp.h>
#include <utility.h> #include <utility.h>
#include <validate.h>
#include <anagr.h> #include <anagr.h>
#include <anafis.h> #include <anafis.h>
@ -53,6 +54,8 @@ protected:
void set_pnae(TMask& m, TToken_string& nonacc, TToken_string& nonscd); void set_pnae(TMask& m, TToken_string& nonacc, TToken_string& nonscd);
void get_pnae(const TMask& m, TToken_string& nonacceff, TToken_string& nonscadeff); 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 write(const TMask& m);
virtual int rewrite(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(); 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) int TClifo_application::read(TMask& m)
{ {
TRelation_application::read(m); TRelation_application::read(m);
@ -709,48 +818,23 @@ int TClifo_application::read(TMask& m)
field_sheet(F_CODINDEFF).add(riga); field_sheet(F_CODINDEFF).add(riga);
} }
} }
TToken_string key;
TToken_string key;
key.add(m.get(F_TIPOCF)); key.add(m.get(F_TIPOCF));
key.add(m.get(F_CODCF)); key.add(m.get(F_CODCF));
key.add("V"); key.add("V");
TRecord_array ns_ban(key, LF_CFBAN); TRecord_array ns_ban(key, LF_CFBAN);
const TRectype& clifo = get_relation()->curr(LF_CLIFO); const TRectype& clifo = get_relation()->curr(LF_CLIFO);
TSheet_field & ns_sh = m.sfield(F_BANA); TSheet_field & ns_sh = m.sfield(F_BANA);
ns_sh.destroy(-1, false); ns_sh.destroy(-1, false);
for (i = 1; i <= ns_ban.rows(); i++) for (i = 1; i <= ns_ban.rows(); i++)
{ add_bank(ns_sh, ns_ban.row(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);
}
if (ns_ban.rows() == 0 && clifo.get_int(CLI_CODABI) != 0) if (ns_ban.rows() == 0 && clifo.get_int(CLI_CODABI) != 0)
{ add_bank(ns_sh, clifo);
TToken_string & row = ns_sh.row(0);
row.add(clifo.get(CLI_CODABI), ns_sh.cid2index(F_BBAN_ABI)); key.cut(0);
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.add(m.get(F_TIPOCF)); key.add(m.get(F_TIPOCF));
key.add(m.get(F_CODCF)); key.add(m.get(F_CODCF));
key.add("N"); key.add("N");
@ -760,25 +844,10 @@ int TClifo_application::read(TMask& m)
vs_sh.destroy(-1, false); vs_sh.destroy(-1, false);
for (i = 1; i <= vs_ban.rows(); i++) for (i = 1; i <= vs_ban.rows(); i++)
{ add_bank(vs_sh, vs_ban.row(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);
}
if (vs_ban.rows() == 0 && cfven.get_int(CFV_CODABIPR) != 0) if (vs_ban.rows() == 0 && cfven.get_int(CFV_CODABIPR) != 0)
{ add_bank(vs_sh, cfven);
TToken_string & row = vs_sh.row(0);
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(); return _rel->status();
} }

View File

@ -668,14 +668,14 @@ BEGIN
PROMPT 0 4 "@bBanche di appoggio" PROMPT 0 4 "@bBanche di appoggio"
END END
SPREADSHEET F_BANA 80 7 SPREADSHEET F_BANA 0 8
BEGIN BEGIN
PROMPT 0 5 "" PROMPT 0 5 ""
ITEM "IBAN\nStato" ITEM "IBAN\nNaz.@4"
ITEM "IBAN\nCheck" ITEM "IBAN\nChk.@4"
ITEM "IBAN\nCIN" ITEM "IBAN\nCIN@4"
ITEM "IBAN\nABI" ITEM "IBAN\nABI@5"
ITEM "IBAN\nCAB" ITEM "IBAN\nCAB@5"
ITEM "IBAN\nConto@12" ITEM "IBAN\nConto@12"
ITEM "@1" ITEM "@1"
ITEM "Descrizione@50" ITEM "Descrizione@50"
@ -687,14 +687,14 @@ BEGIN
PROMPT 0 14 "@bBanche di presentazione" PROMPT 0 14 "@bBanche di presentazione"
END END
SPREADSHEET F_BANP 80 7 SPREADSHEET F_BANP 0 0
BEGIN BEGIN
PROMPT 0 15 "" PROMPT 0 15 ""
ITEM "IBAN\nStato" ITEM "IBAN\nNaz.@4"
ITEM "IBAN\nCheck" ITEM "IBAN\nChk@4"
ITEM "IBAN\nCIN" ITEM "IBAN\nCIN@4"
ITEM "IBAN\nABI" ITEM "IBAN\nABI@5"
ITEM "IBAN\nCAB" ITEM "IBAN\nCAB@5"
ITEM "IBAN\nConto@12" ITEM "IBAN\nConto@12"
ITEM "Progressivo" ITEM "Progressivo"
ITEM "Descrizione@50" ITEM "Descrizione@50"
@ -2059,32 +2059,32 @@ ENDPAGE
ENDMASK ENDMASK
PAGE "Banche di appoggio" -1 -1 80 8 PAGE "Banche di appoggio" -1 -1 52 5
STRING F_IBAN_STATO 2 STRING F_IBAN_STATO 2
BEGIN BEGIN
PROMPT 2 2 "Codice IBAN " PROMPT 1 1 ""
FLAGS "U" 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 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 END
NUMBER F_IBAN_CHECK 2 NUMBER F_IBAN_CHECK 2
BEGIN BEGIN
PROMPT 24 2 "" PROMPT 5 1 ""
FLAGS "UZ" 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 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 END
STRINGA F_BBAN_CIN 1 STRINGA F_BBAN_CIN 1
BEGIN BEGIN
PROMPT 33 2 "BBAN " PROMPT 9 1 ""
FLAGS "U" FLAGS "U"
VALIDATE CHECK_BBAN_FUNC F_BBAN F_BBAN_CIN F_BBAN_ABI F_BBAN_CAB F_BBAN_CONTO VALIDATE CHECK_BBAN_FUNC F_BBAN F_BBAN_CIN F_BBAN_ABI F_BBAN_CAB F_BBAN_CONTO
END END
NUMBER F_BBAN_ABI 5 NUMBER F_BBAN_ABI 5
BEGIN BEGIN
PROMPT 41 2 "" PROMPT 12 1 ""
USE %BAN SELECT CODTAB ?= "?????" USE %BAN SELECT CODTAB ?= "?????"
INPUT CODTAB F_BBAN_ABI INPUT CODTAB F_BBAN_ABI
DISPLAY "Codice ABI" CODTAB[1,5] DISPLAY "Codice ABI" CODTAB[1,5]
@ -2097,7 +2097,7 @@ END
NUMBER F_BBAN_CAB 5 NUMBER F_BBAN_CAB 5
BEGIN BEGIN
PROMPT 50 2 "" PROMPT 21 1 ""
USE %BAN SELECT CODTAB ?= "??????????" USE %BAN SELECT CODTAB ?= "??????????"
INPUT CODTAB[1,5] F_BBAN_ABI INPUT CODTAB[1,5] F_BBAN_ABI
INPUT CODTAB[6,10] F_BBAN_CAB INPUT CODTAB[6,10] F_BBAN_CAB
@ -2114,20 +2114,20 @@ END
STRING F_BBAN_CONTO 12 STRING F_BBAN_CONTO 12
BEGIN BEGIN
PROMPT 59 2 "" PROMPT 30 1 ""
FLAGS "UZ" FLAGS "UZ"
VALIDATE CHECK_BBAN_FUNC F_BBAN F_BBAN_CIN F_BBAN_ABI F_BBAN_CAB F_BBAN_CONTO VALIDATE CHECK_BBAN_FUNC F_BBAN F_BBAN_CIN F_BBAN_ABI F_BBAN_CAB F_BBAN_CONTO
END END
NUMBER F_PROGPR 2 NUMBER F_PROGPR 2
BEGIN BEGIN
PROMPT 2 60 "" PROMPT 1 60 "Progressivo IGNORATO"
FLAGS "D" FLAGS "D"
END END
STRING F_DESBAN 50 40 STRING F_DESBAN 50 40
BEGIN BEGIN
PROMPT 20 4 "Descrizione " PROMPT 1 2 ""
USE %BAN KEY 2 SELECT CODTAB ?= "??????????" USE %BAN KEY 2 SELECT CODTAB ?= "??????????"
INPUT S0 F_DESBAN INPUT S0 F_DESBAN
DISPLAY "Denominazione@50" S0 DISPLAY "Denominazione@50" S0
@ -2138,13 +2138,13 @@ END
STRING F_IBAN 27 STRING F_IBAN 27
BEGIN BEGIN
PROMPT 2 6 "IBAN " PROMPT 1 3 "IBAN "
FLAGS "D" FLAGS "D"
END END
STRING F_BBAN 23 STRING F_BBAN 23
BEGIN BEGIN
PROMPT 2 60 "BBAN " PROMPT 41 3 "BBAN "
FLAGS "HD" FLAGS "HD"
END END
@ -2242,7 +2242,7 @@ END
STRING F_DESBAN 50 40 STRING F_DESBAN 50 40
BEGIN BEGIN
PROMPT 20 4 "Descrizione " PROMPT 20 3 "Descrizione "
USE %BAN KEY 2 SELECT (CODTAB ?= "??????????"&&100@->CODTAB!="") USE %BAN KEY 2 SELECT (CODTAB ?= "??????????"&&100@->CODTAB!="")
JOIN BNP ALIAS 100 INTO CODTAB==CODTAB JOIN BNP ALIAS 100 INTO CODTAB==CODTAB
INPUT S0 F_DESBAN INPUT S0 F_DESBAN

View File

@ -180,15 +180,7 @@ void TValuta::put(TRectype& rec) const
void TValuta::set(TMask& m, short v, short d, short c, short e) const void TValuta::set(TMask& m, short v, short d, short c, short e) const
{ {
if (in_lire()) if (in_valuta())
{
m.reset(v);
m.reset(d);
m.reset(c);
if (e && m.id2pos(e) >= 0)
m.reset(e);
}
else
{ {
m.set(v, _cod); m.set(v, _cod);
m.set(d, _dat.string()); 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) if (e && m.id2pos(e) >= 0)
m.set(e, _et == _exchange_contro ? "X" : ""); 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) 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); old_diffcam = calcola_differenza_cambio(nrigp, false);
if (in_val && !valuta.in_lire()) if (in_val && valuta.in_valuta())
valuta.put(sum); valuta.put(sum);
row(nrigp) = new_pag; row(nrigp) = new_pag;
@ -894,8 +894,8 @@ bool TRiga_partite::in_valuta() const
TImporto TRiga_partite::importo(bool valuta, int mode) const TImporto TRiga_partite::importo(bool valuta, int mode) const
{ {
CHECKD(mode > 0x0 && mode <= 0xF, "Bad importo mode ", mode); CHECKD(mode > 0x0 && mode <= 0xF, "Bad importo mode ", mode);
const bool in_lire = !in_valuta(); // Partita in lire const bool in_euro = !in_valuta(); // Partita in Euro
if (valuta && in_lire) if (valuta && in_euro)
valuta = false; valuta = false;
TImporto i; TImporto i;
@ -918,7 +918,7 @@ TImporto TRiga_partite::importo(bool valuta, int mode) const
} }
else // Desidero gli abbuoni in lire else // Desidero gli abbuoni in lire
{ {
if (in_lire && (mode & 0x8)) if (in_euro && (mode & 0x8))
{ {
i.valore() += get_real(PART_RITENUTE); i.valore() += get_real(PART_RITENUTE);
if (sezione() == sezione_ritsoc()) if (sezione() == sezione_ritsoc())
@ -930,7 +930,7 @@ TImporto TRiga_partite::importo(bool valuta, int mode) const
if (mode & 0x2) if (mode & 0x2)
{ {
TImporto abbuoni(get_char(PART_SEZABB), get_real(PART_ABBUONI)); 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)); const real cambio(get(PART_CAMBIO));
TCurrency cur(abbuoni.valore(), codice_valuta(), cambio); TCurrency cur(abbuoni.valore(), codice_valuta(), cambio);
@ -940,7 +940,7 @@ TImporto TRiga_partite::importo(bool valuta, int mode) const
i += abbuoni; 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)); const TImporto diffcam(get_char(PART_SEZDIFCAM), get_real(PART_DIFFCAM));
i += diffcam; i += diffcam;