Patch level : 12.0 1044

Files correlati     : ef0.exe ef0100a.msk eftbman.msk f98.trr ef0a00a.msk
Commento            :

Supporto per gli IBAN esteri negli effetti
This commit is contained in:
Alessandro Bonazzi 2021-03-27 00:44:17 +01:00
parent c351af1642
commit 13190787a0
2 changed files with 97 additions and 88 deletions

View File

@ -543,13 +543,15 @@ bool TPE_mask::fill_distinta(bool clear_all)
bool partially_unassigned; bool partially_unassigned;
TSheet_field& sheet = sfield(F_SHEET); TSheet_field& sheet = sfield(F_SHEET);
TToken_string& row = sheet.row(rows++); TToken_string& row = sheet.row(rows++);
if (fill_row(rs, row, partially_unassigned, dist_cont, clear_all)) if (fill_row(rs, row, partially_unassigned, dist_cont, clear_all))
{ {
row.add(eff.get(EFF_CUP), sheet.cid2index(F_CUP)); row.add(eff.get(EFF_CUP), cid2index(F_CUP));
row.add(eff.get(EFF_CIG), sheet.cid2index(F_CIG)); row.add(eff.get(EFF_CIG), cid2index(F_CIG));
row.add(eff.get(EFF_CODABI), sheet.cid2index(F_ABIAPP)); row.add(eff.get(EFF_CODABI), cid2index(F_ABIAPP));
row.add(eff.get(EFF_CODCAB), sheet.cid2index(F_CABAPP)); row.add(eff.get(EFF_CODCAB), cid2index(F_CABAPP));
row.add(eff.get(EFF_IBAN), sheet.cid2index(F_IBANAPP)); row.add(eff.get(EFF_IBAN), cid2index(F_IBANAPP));
sheet.enable_cell(r - 1, cid2index(F_IBANAPP), row.get_int(cid2index(F_RIGAEFF)) < 2);
sheet.check_row(r - 1); sheet.check_row(r - 1);
if (partially_unassigned) if (partially_unassigned)
sheet.disable_cell(r - 1, 1); // Non e' possibile mettere saldo sheet.disable_cell(r - 1, 1); // Non e' possibile mettere saldo
@ -659,46 +661,44 @@ bool TPE_mask::check_bank(TEffetto& effetto, TLog_report& log) const
TString8 cab = effetto.get(EFF_CODCAB); TString8 cab = effetto.get(EFF_CODCAB);
TString80 iban = effetto.get(EFF_IBAN); TString80 iban = effetto.get(EFF_IBAN);
TToken_string key(8);
key = effetto.get(EFF_TIPOCF);
key.add(effetto.get(EFF_CODCF));
const TRectype& clifo = cache().get(LF_CLIFO, key);
if (real::is_null(abi) || real::is_null(cab))
{
abi = clifo.get(CLI_CODABI);
cab = clifo.get(CLI_CODCAB);
}
if (iban.blank()) if (iban.blank())
iban = clifo.get(CLI_IBAN);
if (iban.starts_with("IT") && iban.len() > 15)
{ {
abi = iban.mid( 5, 5); TToken_string key(8);
cab = iban.mid(10, 5);
}
effetto.put(EFF_CODABI, abi); key = effetto.get(EFF_TIPOCF);
effetto.put(EFF_CODCAB, cab); key.add(effetto.get(EFF_CODCF));
effetto.put(EFF_IBAN, iban); key.add("V");
key.add(1);
const TRectype& clifo = cache().get(LF_CFBAN, key);
if (tipocf == 'C' && tipopag == 3) iban = clifo.get(CLI_IBAN);
if (real::is_null(abi) || real::is_null(cab)) if (iban.starts_with("IT") && iban.len() > 15)
{
abi = iban.mid(5, 5);
cab = iban.mid(10, 5);
}
effetto.put(EFF_CODABI, abi);
effetto.put(EFF_CODCAB, cab);
effetto.put(EFF_IBAN, iban);
if (tipocf == 'C' && tipopag == 3)
if (real::is_null(abi) || real::is_null(cab))
{
TString msg;
msg.format(FR("Impossibile determinare ABI/CAB del %s sull'effetto %ld"),
(const char*)key, effetto.get_long(EFF_NPROGTR));
log.log(2, msg);
return false;
}
if ((tipocf == 'F' && tipopag == 9) && iban.blank())
{ {
TString msg; TString msg;
msg.format(FR("Impossibile determinare ABI/CAB del %s sull'effetto %ld"), msg.format(FR("Impossibile determinare IBAN del %s sull'effetto %ld"),
(const char*)key, effetto.get_long(EFF_NPROGTR)); (const char*)key, effetto.get_long(EFF_NPROGTR));
log.log(2, msg); log.log(2, msg);
return false; return false;
} }
if ((tipocf == 'F' && tipopag == 9) && iban.blank())
{
TString msg;
msg.format(FR("Impossibile determinare IBAN del %s sull'effetto %ld"),
(const char*)key, effetto.get_long(EFF_NPROGTR));
log.log(2, msg);
return false;
} }
return true; return true;
} }
@ -709,6 +709,7 @@ void TPE_mask::save_rate()
const char tipodist = get(F_TIPODIST)[0]; const char tipodist = get(F_TIPODIST)[0];
long numdist = get_long(F_DIST); long numdist = get_long(F_DIST);
if (_is_new) if (_is_new)
{ {
TLocalisamfile f(LF_EFFETTI); f.setkey(4); TLocalisamfile f(LF_EFFETTI); f.setkey(4);
@ -719,7 +720,9 @@ void TPE_mask::save_rate()
f.put(EFF_NRIGADIST, 1); f.put(EFF_NRIGADIST, 1);
if (f.read(_isgteq) != NOERR || f.get_char(EFF_TIPODIST) != tipodist || f.get_long(EFF_NDIST) != numdist) if (f.read(_isgteq) != NOERR || f.get_char(EFF_TIPODIST) != tipodist || f.get_long(EFF_NDIST) != numdist)
break; break;
const long nd = get_free_num(); const long nd = get_free_num();
TString msg; msg.format(FR("La distinta %ld è già presente: verrà rinumerata in %ld"), numdist, nd); TString msg; msg.format(FR("La distinta %ld è già presente: verrà rinumerata in %ld"), numdist, nd);
log.log(1, msg); log.log(1, msg);
numdist = nd; numdist = nd;
@ -728,19 +731,18 @@ void TPE_mask::save_rate()
} }
TDistinta distinta(tipodist, numdist, _lock); TDistinta distinta(tipodist, numdist, _lock);
const TString& codval = get(F_CODVAL); const TString& codval = get(F_CODVAL);
const real cambio = get(F_CAMBIO); const real cambio = get(F_CAMBIO);
const int tipopag = get_int(F_TIPOPAG); const int tipopag = get_int(F_TIPOPAG);
bool zeroes = false; // Esistono righe effetto da cancellare bool zeroes = false; // Esistono righe effetto da cancellare
const bool attivo = get(F_TIPOCF) == "C"; const bool attivo = get(F_TIPOCF) == "C";
TSheet_field& sheet = sfield(F_SHEET); TSheet_field& sheet = sfield(F_SHEET);
FOR_EACH_SHEET_ROW(sheet, r, row) FOR_EACH_SHEET_ROW(sheet, r, row)
{ {
real imp = row->get(sheet.cid2index(F_IMPORTO)); real imp = row->get(cid2index(F_IMPORTO));
real impval; real impval;
if (codval.full() && !imp.is_zero()) if (codval.full() && !imp.is_zero())
{ {
impval = imp; impval = imp;
@ -748,68 +750,74 @@ void TPE_mask::save_rate()
c.change_to_firm_val(); c.change_to_firm_val();
imp = c.get_num(); imp = c.get_num();
} }
char accsal = row->get_char(sheet.cid2index(F_ACCSAL));
int rigadist = row->get_int(sheet.cid2index(F_RIGADIST)); char accsal = row->get_char(cid2index(F_ACCSAL));
int rigaeff = row->get_int(sheet.cid2index(F_RIGAEFF)); int rigadist = row->get_int(cid2index(F_RIGADIST));
int rigaeff = row->get_int(cid2index(F_RIGAEFF));
if (rigaeff > 0 || accsal == 'S' || imp > ZERO) if (rigaeff > 0 || accsal == 'S' || imp > ZERO)
{ {
TToken_string key; TToken_string key;
key.add(get(F_TIPOCF)); key.add(get(F_TIPOCF));
key.add("0|0"); key.add("0|0");
key.add(row->get(sheet.cid2index(F_CODCF))); key.add(row->get(cid2index(F_CODCF)));
key.add(row->get(sheet.cid2index(F_ANNO))); key.add(row->get(cid2index(F_ANNO)));
key.add(row->get(sheet.cid2index(F_PARTITA))); key.add(row->get(cid2index(F_PARTITA)));
key.add(row->get(sheet.cid2index(F_RIGA))); key.add(row->get(cid2index(F_RIGA)));
// Trova partita // Trova partita
const TRectype& part = cache().get(LF_PARTITE, key); const TRectype& part = cache().get(LF_PARTITE, key);
// Trova rata // Trova rata
key.add(row->get(sheet.cid2index(F_RATA))); key.add(row->get(cid2index(F_RATA)));
const TRectype& scad = cache().get(LF_SCADENZE, key); const TRectype& scad = cache().get(LF_SCADENZE, key);
// eff.put(EFF_DATASCAD, scad.get(SCAD_DATASCAD)); TDate datapag(row->get(cid2index(F_DATAPAG)));
TDate datapag(row->get(sheet.cid2index(F_DATAPAG)));
if (!datapag.ok()) if (!datapag.ok())
datapag = attivo ? scad.get(SCAD_DATASCAD) : get(F_DATADIST); datapag = attivo ? scad.get(SCAD_DATASCAD) : get(F_DATADIST);
const TString cup = row->get(sheet.cid2index(F_CUP));
const TString cup = row->get(cid2index(F_CUP));
const TRectype& mov = cache().get(LF_MOV, part.get(PART_NREG)); const TRectype& mov = cache().get(LF_MOV, part.get(PART_NREG));
const TString cig = row->get(sheet.cid2index(F_CIG)); const TString cig = row->get(cid2index(F_CIG));
const TString16 contsep = mov.get(MOV_CONTSEP); const TString16 contsep = mov.get(MOV_CONTSEP);
TEffetto& eff = distinta[rigadist - 1];
if (rigaeff <= 0) if (rigaeff <= 0)
{ {
const char tipocf = get(F_TIPOCF)[0]; const char tipocf = get(F_TIPOCF)[0];
const long codcf = row->get_long(sheet.cid2index(F_CODCF)); const long codcf = row->get_long(cid2index(F_CODCF));
TRectype& reff = new_row_effetto(distinta, tipocf, codcf, cup, cig, contsep, datapag, rigadist, rigaeff); TRectype& reff = new_row_effetto(distinta, tipocf, codcf, cup, cig, contsep, datapag, rigadist, rigaeff);
reff.put(REFF_ANNO, row->get(sheet.cid2index(F_ANNO))); reff.put(REFF_ANNO, row->get(cid2index(F_ANNO)));
reff.put(REFF_NUMPART, row->get(sheet.cid2index(F_PARTITA))); reff.put(REFF_NUMPART, row->get(cid2index(F_PARTITA)));
reff.put(REFF_NRIGA, row->get(sheet.cid2index(F_RIGA))); reff.put(REFF_NRIGA, row->get(cid2index(F_RIGA)));
reff.put(REFF_NRATA, row->get(sheet.cid2index(F_RATA))); reff.put(REFF_NRATA, row->get(cid2index(F_RATA)));
reff.put(REFF_NFATT, part.get(PART_NUMDOC)); reff.put(REFF_NFATT, part.get(PART_NUMDOC));
reff.put(REFF_DATAFATT, part.get(PART_DATADOC)); reff.put(REFF_DATAFATT, part.get(PART_DATADOC));
reff.put(REFF_IMPFATT, part.get(PART_IMPORTO)); reff.put(REFF_IMPFATT, part.get(PART_IMPORTO));
TEffetto& eff = distinta[rigadist-1];
eff.put(EFF_DSCVAL, row->get(sheet.cid2index(F_VALBEN))); eff.put(EFF_DSCVAL, row->get(sheet.cid2index(F_VALBEN)));
eff.put(EFF_TIPOPAG, tipopag); eff.put(EFF_TIPOPAG, tipopag);
eff.put(EFF_CODABI, row->get(sheet.cid2index(F_ABIAPP)));
eff.put(EFF_CODCAB, row->get(sheet.cid2index(F_ABIAPP)));
eff.put(EFF_IBAN, row->get(sheet.cid2index(F_IBANAPP)));
} }
if (sheet.cell_enabled(r, cid2index(F_IBANAPP)))
TEffetto& eff = distinta[rigadist-1]; {
eff.put(EFF_CODABI, row->get(cid2index(F_ABIAPP)));
eff.put(EFF_DATASCAD, datapag); eff.put(EFF_CODCAB, row->get(cid2index(F_ABIAPP)));
eff.put(EFF_IBAN, row->get(cid2index(F_IBANAPP)));
}
eff.put(EFF_DATASCAD, datapag);
eff.put(EFF_CUP, cup); eff.put(EFF_CUP, cup);
eff.put(EFF_CIG, cig); eff.put(EFF_CIG, cig);
eff.put(EFF_CONTSEP, contsep); eff.put(EFF_CONTSEP, contsep);
check_bank(eff, log); // Cerca di sistemare ABI/CAB/IBAN check_bank(eff, log); // Cerca di sistemare ABI/CAB/IBAN
TRectype& reff = eff.row_r(rigaeff); TRectype& reff = eff.row_r(rigaeff);
const real oldimp = reff.get(REFF_IMPORTO); const real oldimp = reff.get(REFF_IMPORTO);
const real oldimpval = reff.get(REFF_IMPORTOVAL); const real oldimpval = reff.get(REFF_IMPORTOVAL);
reff.put(REFF_IMPORTO, imp); reff.put(REFF_IMPORTO, imp);
reff.put(REFF_IMPORTOVAL, impval); reff.put(REFF_IMPORTOVAL, impval);
reff.put(REFF_ACCSAL, accsal); reff.put(REFF_ACCSAL, accsal);
@ -823,10 +831,12 @@ void TPE_mask::save_rate()
// Ricalcola totali righe ed elimina le righe NULLE // Ricalcola totali righe ed elimina le righe NULLE
TLocalisamfile f(LF_EFFETTI); f.setkey(1); TLocalisamfile f(LF_EFFETTI); f.setkey(1);
for (int rd = distinta.items()-1; rd >= 0; rd--) for (int rd = distinta.items()-1; rd >= 0; rd--)
{ {
TEffetto& eff = distinta[rd]; TEffetto& eff = distinta[rd];
real totimp, totimpval; real totimp, totimpval;
for (int i = eff.rows_r(); i > 0; i--) for (int i = eff.rows_r(); i > 0; i--)
{ {
const TRectype& reff = eff.row_r(i); const TRectype& reff = eff.row_r(i);
@ -842,7 +852,8 @@ void TPE_mask::save_rate()
} }
if (eff.rows_r() == 0) if (eff.rows_r() == 0)
{ {
int err = eff.read(f, eff, _lock); int err = eff.read(f, eff, _lock);
if (err == NOERR) if (err == NOERR)
err = eff.remove(f); err = eff.remove(f);
if (err == NOERR) if (err == NOERR)
@ -867,6 +878,7 @@ void TPE_mask::save_rate()
} }
TToken_string dati_dist; TToken_string dati_dist;
dati_dist.add(tipodist); dati_dist.add(tipodist);
dati_dist.add(numdist); dati_dist.add(numdist);
dati_dist.add(get(F_DATADIST)); dati_dist.add(get(F_DATADIST));
@ -1157,6 +1169,7 @@ bool TPE_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
if (e == fe_button) if (e == fe_button)
{ {
TEdit_field& cab = efield(F_CAB); TEdit_field& cab = efield(F_CAB);
if (!cab.empty()) if (!cab.empty())
{ {
if (check_fields()) if (check_fields())

View File

@ -377,13 +377,13 @@ END
NUMBER F_CODCF 6 NUMBER F_CODCF 6
BEGIN BEGIN
PROMPT 1 1 "" PROMPT 1 2 ""
FLAGS "D" FLAGS "D"
END END
STRING F_RAGSOC 50 STRING F_RAGSOC 50
BEGIN BEGIN
PROMPT 9 1 "" PROMPT 9 2 ""
FLAGS "D" FLAGS "D"
END END
@ -504,13 +504,24 @@ END
STRING F_ABIAPP 5 STRING F_ABIAPP 5
BEGIN BEGIN
PROMPT 1 10 "Banca di appoggio" PROMPT 1 10 "Banca di appoggio"
USE LF_CFBAN KEY 2 FLAGS "DZ"
ENDPAGE
STRING F_CABAPP 5
BEGIN
PROMPT 18 11 ""
FLAGS "DZ"
END
STRING F_IBANAPP 27
BEGIN
PROMPT 13 12 "IBAN "
USE LF_CFBAN KEY 3
JOIN %BAN INTO CODTAB[1,5]==ABI CODTAB[6,10]==CAB JOIN %BAN INTO CODTAB[1,5]==ABI CODTAB[6,10]==CAB
INPUT TIPOCF -F_TIPOCF SE INPUT TIPOCF -F_TIPOCF SE
INPUT CODCF F_CODCF SE INPUT CODCF F_CODCF SE
INPUT TIPOBAN "V" INPUT TIPOBAN "V"
INPUT ABI F_ABIAPP INPUT IBAN F_IBANAPP
INPUT CAB F_CABAPP
DISPLAY "Cod. Istit." ABI DISPLAY "Cod. Istit." ABI
DISPLAY "Cod. Fil." CAB DISPLAY "Cod. Fil." CAB
DISPLAY "IBAN@27" IBAN DISPLAY "IBAN@27" IBAN
@ -519,21 +530,6 @@ BEGIN
OUTPUT F_CABAPP CAB OUTPUT F_CABAPP CAB
OUTPUT F_IBANAPP IBAN OUTPUT F_IBANAPP IBAN
CHECTYPE NORMAL CHECTYPE NORMAL
FLAGS "Z"
ENDPAGE
STRING F_CABAPP 5
BEGIN
PROMPT 18 11 ""
COPY ALL F_ABIAPP
CHECTYPE NORMAL
FLAGS "Z"
END
STRING F_IBANAPP 27
BEGIN
PROMPT 13 12 "IBAN "
FLAGS "D"
END END
ENDPAGE ENDPAGE