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 <relapp.h>
#include <utility.h>
#include <validate.h>
#include <anagr.h>
#include <anafis.h>
@ -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();
}

View File

@ -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

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
{
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;