Aggiunto strumento per controllare e correggere IBAN su documenti

git-svn-id: svn://10.65.10.50/branches/R_10_00@22867 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
guy 2013-05-27 12:09:24 +00:00
parent 6de44e6502
commit f3d54d4fe9
11 changed files with 385 additions and 65 deletions

View File

@ -1,7 +1,5 @@
#include <xvt.h>
#include <checks.h>
#include "ve4.h"
int main(int argc, char** argv)
@ -10,6 +8,7 @@ int main(int argc, char** argv)
switch(k)
{
case 1: ve4200(argc, argv); break; // Aggiorna IVA
case 2: ve4300(argc, argv); break; // Correzione IBAN
default: ve4100(argc, argv); break; // Modifica Valori
}
return 0;

View File

@ -1,2 +1,3 @@
int ve4100(int argc, char* argv[]);
int ve4200(int argc, char* argv[]);
int ve4300(int argc, char* argv[]);

200
ve/ve4300.cpp Normal file
View File

@ -0,0 +1,200 @@
#include <applicat.h>
#include <automask.h>
#include <progind.h>
#include <recarray.h>
#include <recset.h>
#include <relation.h>
#include <reputils.h>
#include <validate.h>
#include "ve4.h"
#include "ve4300a.h"
#include "../cg/cfban.h"
#include <clifo.h>
#include <doc.h>
///////////////////////////////////////////////////////////
// TAggiornaIBAN_msk
///////////////////////////////////////////////////////////
class TAggiornaIBAN_msk : public TAutomask
{
TAssoc_array _iban;
protected:
virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
const TString& get_iban(const TRectype& doc, TLog_report& log);
public:
bool elabora();
TAggiornaIBAN_msk() : TAutomask("ve4300a") {}
};
const TString& TAggiornaIBAN_msk::get_iban(const TRectype& doc, TLog_report& log)
{
TToken_string key;
key = doc.get(DOC_TIPOCF);
key.add(doc.get(DOC_CODCF));
TString* iban = (TString*)_iban.objptr(key);
if (iban != NULL)
return *iban;
iban = new TString80;
_iban.add(key, iban);
const TRectype& clifo = cache().get(LF_CLIFO, key);
key.add("V");
key.add("1");
const TRectype& cfban = cache().get(LF_CFBAN, key);
*iban = cfban.get(CFBAN_IBAN);
if (iban->blank())
{
*iban = clifo.get(CLI_IBAN);
if (iban->blank())
{
TString msg;
msg << "Impossibile trovare un IBAN per " << clifo.get(CLI_RAGSOC);
log.log(2, msg);
}
}
return *iban;
}
bool TAggiornaIBAN_msk::elabora()
{
const bool definitiva = get_bool(F_DEFINITIVA);
TLog_report log;
TFast_isamfile docs(LF_DOC);
TString query;
query << "USE DOC SELECT BETWEEN(DATADOC,#DAL,#AL)&&BETWEEN(STATO,#STATO,#STATO)\n"
<< "FROM PROVV=D ANNO=#ANNO CODNUM=#CODNUM\n"
<< "TO PROVV=D ANNO=#ANNO CODNUM=#CODNUM";
const TDate dal = get(F_DAL);
const TDate al = get(F_AL);
TISAM_recordset recset(query);
recset.set_var("#DAL", dal);
recset.set_var("#AL", al);
recset.set_var("#STATO", get(F_STATO));
recset.set_var("#ANNO", long(dal.year()));
recset.set_var("#CODNUM", get(F_CODNUM));
const TRecnotype n = recset.items();
if (n > 0 && definitiva && !yesno_box("Confermare l'elaborazione di %ld documenti", n))
return false;
if (n > 0)
{
TProgind pi(n, main_app().title());
TRectype& doc = recset.cursor()->curr();
TString msg, ibaner;
TToken_string key;
for (bool ok = recset.move_first(); ok; ok = recset.move_next())
{
#ifdef DBG
const long ndoc = doc.get_long(DOC_NDOC);
if (ndoc == 82)
int cazzone = 1;
#endif
const TString8 abi = doc.get(DOC_CODABIA);
const TString8 cab = doc.get(DOC_CODCABA);
const TString80 iban = doc.get(DOC_IBAN);
if (abi.blank() && cab.blank() && iban.blank())
continue;
int err = iban_check(iban, ibaner);
if (err == 0 && iban.starts_with("IT") && iban.mid(5, 5) == abi && iban.mid(10, 5) == cab)
continue;
key = doc.get(DOC_TIPOCF);
key.add(doc.get(DOC_CODCF));
const TRectype& clifo = cache().get(LF_CLIFO, key);
msg.cut(0) << doc.get(DOC_ANNO) << '/' << doc.get(DOC_CODNUM) << '/' << doc.get(DOC_NDOC)
<< ' ' << clifo.get(CLI_RAGSOC);
log.log(1, msg);
if (err != NOERR && iban.full())
{
msg.cut(0) << '"' << iban << '"' << ' ' << ibaner;
log.log(2, msg);
}
const TString& newiban = get_iban(doc, log);
if (newiban == iban)
continue;
doc.put(DOC_IBAN, newiban);
if (iban.starts_with("IT"))
{
doc.put(DOC_CODABIA, newiban.mid( 5,5));
doc.put(DOC_CODCABA, newiban.mid(10,5));
}
msg.cut(0) << '"' << iban << '"' << " -> " << '"' << newiban << '"';
log.log(0, msg);
if (definitiva)
{
err = doc.rewrite(docs);
if (err != NOERR)
log.log(2, TR("Impossibile aggiornare il documento"));
}
}
}
log.preview();
return true;
}
bool TAggiornaIBAN_msk::on_field_event(TOperable_field& o, TField_event e, long jolly)
{
switch (o.dlg())
{
case F_AL:
if (e == fe_modify || e == fe_close)
{
const TDate dal = get(F_DAL);
const TDate al = get(F_AL);
if (!dal.ok() || !al.ok() || dal.year() != al.year() || dal > al)
return error_box("Le date devono essere valide ed appartenere allo stesso anno");
}
break;
default: break;
}
return true;
}
///////////////////////////////////////////////////////////
// TAggiornaIBAN_app
///////////////////////////////////////////////////////////
class TAggiornaIBAN_app : public TSkeleton_application
{
protected:
virtual void main_loop();
};
void TAggiornaIBAN_app::main_loop()
{
TAggiornaIBAN_msk m;
while (m.run() == K_ENTER)
m.elabora();
}
int ve4300(int argc, char* argv[])
{
TAggiornaIBAN_app r;
r.run(argc, argv, TR("Aggiornamento IBAN"));
return 0;
}

5
ve/ve4300a.h Normal file
View File

@ -0,0 +1,5 @@
#define F_DAL 101
#define F_AL 102
#define F_CODNUM 103
#define F_STATO 104
#define F_DEFINITIVA 105

55
ve/ve4300a.uml Normal file
View File

@ -0,0 +1,55 @@
#include "ve4300a.h"
PAGE "Aggiornamento IBAN" -1 -1 35 6
STRING F_CODNUM 4
BEGIN
PROMPT 1 1 "Numerazione "
FLAGS "U"
USE %NUM
INPUT CODTAB F_CODNUM
DISPLAY "Codice" CODTAB
DISPLAY "Descrizione@60" S0
OUTPUT F_CODNUM CODTAB
CHECKTYPE REQUIRED
END
DATE F_DAL
BEGIN
PROMPT 1 2 "Intervallo dal "
CHECKTYPE REQUIRED
END
DATE F_AL
BEGIN
PROMPT 13 3 "al "
FLAGS "A"
CHECKTYPE REQUIRED
END
STRING F_STATO 1
BEGIN
PROMPT 1 4 "Stato "
FLAGS "U"
USE %STD
INPUT CODTAB F_STATO
DISPLAY "Codice" CODTAB
DISPLAY "Descrizione@60" S0
OUTPUT F_STATO CODTAB
CHECKTYPE NORMAL
END
BOOLEAN F_DEFINITIVA
BEGIN
PROMPT 1 5 "Elaborazioe definitiva"
END
ENDPAGE
TOOLBAR "" 0 0 0 2
#include <elabar.h>
ENDPAGE
ENDMASK

View File

@ -13,7 +13,7 @@
#include <nditte.h>
////////////////////////////////////////////////////////
// MASCHERA
// MASCHERA
////////////////////////////////////////////////////////
class TListaRitFisc_mask : public TAutomask
{
@ -67,7 +67,10 @@ bool TListaRitFisc::crea_righe(const TListaRitFisc_mask& m) const
int err=NOERR;
TLocalisamfile righe(LF_RIGHEF24);
TDocument_recordset rdoc("USE RDOC\nSELECT (TIPORIGA=='04')&&(110@->S10!='')&&(33.NDOC>=#DANUM)&&(33.NDOC<=#ANUM)\nJOIN SPP ALIAS 110 INTO CODTAB=CODART\nJOIN DOC INTO PROVV=PROVV ANNO=ANNO CODNUM=CODNUM NDOC=NDOC\nFROM CODNUM=#NUM\nTO CODNUM=#NUM");
TDocument_recordset rdoc("USE RDOC\nSELECT (TIPORIGA=='04')&&(110@->S10!='')&&(33.NDOC>=#DANUM)&&(33.NDOC<=#ANUM)\n"
"JOIN SPP ALIAS 110 INTO CODTAB=CODART\n"
"JOIN DOC INTO PROVV=PROVV ANNO=ANNO CODNUM=CODNUM NDOC=NDOC\n"
"FROM CODNUM=#NUM\nTO CODNUM=#NUM");
TVariant var;
var = m.get(F_NUMINI);
rdoc.set_var("#DANUM", var);
@ -81,7 +84,8 @@ bool TListaRitFisc::crea_righe(const TListaRitFisc_mask& m) const
for (bool ok = rdoc.move_first(); ok; ok = rdoc.move_next())
totale += curr.get("RDOC.RITENUTA").as_real();
err = NOERR;
if (yesno_box("Verranno generate %d righe per un importo di %s euro. Si desidera creare le righe?", rdoc.items(), totale.string()))
if (yesno_box("Verranno generate %d righe per un importo di %s euro.\n"
"Si desidera proseguire?", rdoc.items(), totale.string()))
{
long cont = get_next_progr_f24();
long numf24 = get_next_f24();
@ -119,27 +123,28 @@ void TListaRitFisc::main_loop()
key = m.run();
switch (key)
{
case K_SAVE:
crea_righe(m);
break;
case K_QUIT:
break;
case K_ENTER:
{
TDocument_report rep;
rep.load("ve8100a");
TRecordset * r = rep.recordset();
if (r != NULL)
{
TVariant var = m.get(F_NUMINI);
r->set_var("#DANUM", var);
var = m.get(F_NUMFIN);
r->set_var("#ANUM", var);
var = m.get(F_CODNUM);
r->set_var("#NUM", var);
}
rep.print_or_preview(); //stampa il book dei report
}
case K_SAVE:
crea_righe(m);
break;
case K_QUIT:
break;
case K_ENTER:
{
TDocument_report rep;
rep.load("ve8100a");
TRecordset * r = rep.recordset();
if (r != NULL)
{
TVariant var = m.get(F_NUMINI);
r->set_var("#DANUM", var);
var = m.get(F_NUMFIN);
r->set_var("#ANUM", var);
var = m.get(F_CODNUM);
r->set_var("#NUM", var);
}
rep.print_or_preview(); //stampa il book dei report
}
break;
}
}
}

View File

@ -650,5 +650,5 @@ bool TCopia_documento::elabora(TLista_documenti& doc_in, TLista_documenti& doc_o
post_process_input(doc_in);
post_process(doc_out, doc_in);
return TRUE;
return true;
}

View File

@ -374,7 +374,9 @@ bool TContabilizzazione_analitica::find_conti_iva_indetraibile(const TRiga_docum
return !conti.empty();
}
bool TContabilizzazione_analitica::find_conti(const TRiga_documento& riga, TString_array& conti, int annoes, bool riclassifica_fdr_fde, const char tipomov, real & amount_to_split, real & no_ca_amount, const real & valore, bool & pareggio)
bool TContabilizzazione_analitica::find_conti(const TRiga_documento& riga, TString_array& conti, int annoes,
bool riclassifica_fdr_fde, const char tipomov,
real& amount_to_split, real& no_ca_amount, const real& valore, bool& pareggio)
{
bool bArcticleFound = false;
@ -417,8 +419,8 @@ bool TContabilizzazione_analitica::find_conti(const TRiga_documento& riga, TStri
}
else
{
if (riga.is_spese() || riga.is_prestazione() ||
riga.is_risorsa() || riga.is_attrezzatura())
if (riga.is_spese() || riga.is_prestazione() ||
riga.is_risorsa() || riga.is_attrezzatura())
{
const char tipo = riga.tipo().tipo();
const TSpesa_prest spp(riga.get(RDOC_CODART), tipo);
@ -458,7 +460,7 @@ bool TContabilizzazione_analitica::find_conti(const TRiga_documento& riga, TStri
if (bill.ok())
{
const TAnal_ripartizioni_batch & rip = _rip.righe(bill, annoes, tipomov);
const TAnal_ripartizioni_batch& rip = _rip.righe(bill, annoes, tipomov);
pareggio = rip.rows() > 0;
for (int i = 1; i <= rip.rows(); i++)
@ -663,7 +665,7 @@ bool TContabilizzazione_analitica::elabora(TDocumento& doc, long numreg_cg, TVis
if (tiva != iva_vendite && !riga.is_sconto())
{
const TString4 tipodet = riga.get(RDOC_TIPODET);
int td;
int td = 0;
const real pind = indetraibile_al(tipodet, caus, datareg.year(), td);
if (pind > ZERO)
@ -815,7 +817,7 @@ bool TContabilizzazione_analitica::elabora(TDocumento& doc, long numreg_cg, TVis
}
}
if (amount_to_split != ZERO)
if (!amount_to_split.is_zero())
split_sp_amount(mov, has_pareggio, totdoc, spese, amount_to_split, no_ca_amount, doc.decimals());
if (can_write && mov.rows() > 0)

View File

@ -998,7 +998,7 @@ void TDocumento_mask::cli2mask(bool force_load)
key.add("V");
key.add("1");
const TRectype & cfban = cache().get(LF_CFBAN, key);
const TRectype& cfban = cache().get(LF_CFBAN, key);
TString80 iban;
if (cfban.empty() || id2pos(F_CODABIA1) < 0)
@ -1029,9 +1029,9 @@ void TDocumento_mask::cli2mask(bool force_load)
if (id2pos(F_IBAN_STATO) > 0)
{
set(F_IBAN, iban);
efield(F_IBAN_STATO).validate(K_TAB);
if (iban.not_empty())
if (iban.full())
{
efield(F_IBAN_STATO).validate(K_TAB);
set(F_IBAN_STATO, iban.left(2));
set(F_IBAN_CHECK, iban.mid(2,2));
set(F_BBAN , iban.mid(4));
@ -1040,6 +1040,16 @@ void TDocumento_mask::cli2mask(bool force_load)
set(F_BBAN_CAB , iban.mid(10,5));
set(F_BBAN_CONTO, iban.mid(15,12));
}
else
{
reset(F_IBAN_STATO);
reset(F_IBAN_CHECK);
reset(F_BBAN );
reset(F_BBAN_CIN );
reset(F_BBAN_ABI );
reset(F_BBAN_CAB );
reset(F_BBAN_CONTO);
}
}
key.cut(0);
@ -1374,6 +1384,7 @@ void TDocumento_mask::doc2mask(bool reload_clifo, bool force_load, bool update)
check_field(F_CODCF);
check_field(F_CODINDSP);
}
/*
if (id2pos(F_IBAN_STATO) > 0)
{
const TString80 iban = doc().get(DOC_IBAN);
@ -1390,8 +1401,37 @@ void TDocumento_mask::doc2mask(bool reload_clifo, bool force_load, bool update)
set(F_BBAN_CONTO, iban.mid(15,12));
}
}
*/
}
if (id2pos(F_IBAN_STATO) > 0)
{
const TString80 iban = doc().get(DOC_IBAN);
set(F_IBAN, iban);
if (iban.full())
{
set(F_IBAN_STATO, iban.left(2));
set(F_IBAN_CHECK, iban.mid(2,2));
set(F_BBAN , iban.mid(4));
set(F_BBAN_CIN , iban.mid(4,1));
set(F_BBAN_ABI , iban.mid(5,5));
set(F_BBAN_CAB , iban.mid(10,5));
set(F_BBAN_CONTO, iban.mid(15,12));
efield(F_IBAN_STATO).validate(K_TAB);
}
else
{
reset(F_IBAN_STATO);
reset(F_IBAN_CHECK);
reset(F_BBAN );
reset(F_BBAN_CIN );
reset(F_BBAN_ABI );
reset(F_BBAN_CAB );
reset(F_BBAN_CONTO);
}
}
TSheet_field& s = sfield(F_SHEET);
s.destroy();
const int righe = doc().physical_rows();
@ -1419,7 +1459,7 @@ void TDocumento_mask::mask2doc()
{
for (int p = fields()-1; p >= 0; p--)
{
TMask_field& f = fld(p);
const TMask_field& f = fld(p);
const TFieldref* fr = f.field();
if (fr)
fr->write(f.get(), doc());
@ -3143,7 +3183,7 @@ int TElabora_mask::update_list()
bool TElabora_mask::elabora()
{
bool update_mask = FALSE;
bool update_mask = false;
TLista_documenti in;
TLista_documenti out;
@ -3151,10 +3191,10 @@ bool TElabora_mask::elabora()
const long numdoc = field(F_NDOC_ELAB).active() ? get_long(F_NDOC_ELAB) : app_doc.get_long(DOC_NDOC);
const bool update_header = get_bool(F_UPDATE_HEADER);
const bool from_elab = !get_bool(F_TYPE);
TElaborazione * e = curr_elab();
TElaborazione* e = curr_elab();
if (e == NULL)
return FALSE;
return false;
if (e->tipo() == _consegna_ordini)
{
@ -3221,7 +3261,7 @@ bool TElabora_mask::elabora()
return false ;
char provv = get(F_PROVV_ELAB)[0];
int anno = get_int(F_ANNO_ELAB);
TString16 codnum(get(F_CODNUM_ELAB));
const TString4 codnum = get(F_CODNUM_ELAB);
long ndoc = get_long(F_NDOC_ELAB);
if (ndoc > 0L && !in.find(provv, anno, codnum, ndoc))
@ -3231,23 +3271,25 @@ bool TElabora_mask::elabora()
}
if (update_header)
{
const TString4 tipo_doc(app_doc.get(DOC_TIPODOC));
const TString8 caus_mag(app_doc.get(DOC_CAUSMAG));
const long movmag = app_doc.get_long(DOC_MOVMAG);
const TDate datadoc = app_doc.get_date(DOC_DATADOC);
const TDate datainsc = app_doc.get_date(DOC_DATAINSC);
const TDate datapart = app_doc.get_date(DOC_DATAPART);
const TString8 orapart(app_doc.get(DOC_ORAPART));
const char stato = app_doc.stato();
const TString4 tipo_doc=app_doc.get(DOC_TIPODOC);
const TString8 caus_mag=app_doc.get(DOC_CAUSMAG);
const long movmag = app_doc.get_long(DOC_MOVMAG);
const TDate datadoc = app_doc.get_date(DOC_DATADOC);
const TDate datainsc = app_doc.get_date(DOC_DATAINSC);
const TDate datapart = app_doc.get_date(DOC_DATAPART);
const TString8 orapart = app_doc.get(DOC_ORAPART);
const char stato = app_doc.stato();
TDocumento::copy_data(app_doc.head(), in[0].head());
app_doc.put(DOC_TIPODOC, tipo_doc);
app_doc.put(DOC_CAUSMAG, caus_mag);
app_doc.put(DOC_MOVMAG, movmag);
app_doc.put(DOC_DATADOC, datadoc);
app_doc.put(DOC_TIPODOC, tipo_doc);
app_doc.put(DOC_CAUSMAG, caus_mag);
app_doc.put(DOC_MOVMAG, movmag);
app_doc.put(DOC_DATADOC, datadoc);
app_doc.put(DOC_DATAINSC, datainsc);
app_doc.put(DOC_STATO, stato);
app_doc.put(DOC_DATAPART, datapart);
app_doc.put(DOC_ORAPART, orapart);
app_doc.put(DOC_STATO, stato);
}
out.add(app_doc);
if (e->elabora(in, out, TDate(TODAY), true))
@ -3289,9 +3331,9 @@ bool TElabora_mask::elabora()
return update_mask;
}
TElaborazione * TElabora_mask::curr_elab()
TElaborazione* TElabora_mask::curr_elab()
{
const TString16 cod_elab(get(F_ELAB));
const TString8 cod_elab(get(F_ELAB));
return cod_elab.not_empty() ? &_elab[cod_elab] : NULL;
}
@ -3569,7 +3611,7 @@ bool TDocumento_mask::elabora_handler( TMask_field& f, KEY key )
if (!m.check_fields()) // Check values
return false;
TElabora_mask* selection = new TElabora_mask(m); // No woman no stack
TElabora_mask* selection = new TElabora_mask(m);
bool do_checks = false;
const char stato_iniziale = m.doc().stato();
m.update_father_rows();

View File

@ -180,17 +180,25 @@ bool fido_hndl(TMask_field& field, KEY key)
}
bool ora_hndl( TMask_field& field, KEY key )
{
if (field.to_check(key,true))
{
TString16 ora;
TString8 ora;
if (field.automagic() && field.get().empty())
if (field.automagic() && field.empty())
{
struct tm* t = xvt_time_now();
ora.format("%02d%02d", t->tm_hour, t->tm_min);
field.set((ora));
TMask& m = field.mask();
const int pos_data = m.id2pos(field.dlg()) - 1;
TMask_field& dt = m.fld(pos_data);
if (dt.is_kind_of(CLASS_DATE_FIELD) && dt.automagic())
{
const TDate oggi(TODAY);
dt.set(oggi.string());
}
}
else
{
@ -199,11 +207,13 @@ bool ora_hndl( TMask_field& field, KEY key )
{
if (!isdigit(ora[0]) || !isdigit(ora[1]) || !isdigit(ora[2]) ||
!isdigit(ora[3]) || atoi(ora.left(2)) > 23 || atoi(ora.mid(2)) > 59)
return error_box(TR("Ora errata"));
return field.error_box(TR("Ora errata"));
}
else
if (field.required())
return error_box(TR("Ora obbligatoria"));
{
if (field.required())
return field.error_box(TR("Ora obbligatoria"));
}
}
}
@ -2838,7 +2848,7 @@ bool codcms_handler(TMask_field& f, KEY key)
mask.set(mask.field(F_CODCABA).active() ? F_CODCABA : F_CODCABA1, cfban.get(CFBAN_CAB), 3);
mask.set(F_IBAN, cfban.get(CFBAN_IBAN));
}
} //if (main_app().has_module(CUAUT) && (...
} //if (main_app().has_module(CTAUT) && (...
//aggiornamento automatico del campo codice contabilita' separata nel caso di commessa che ce lo abbia
if (main_app().has_module(NPAUT) && (key == K_TAB && f.focusdirty()))

View File

@ -32,6 +32,7 @@ Item_04 = "Copia documenti", "ve5 -2", "F"
Item_05 = "Compattamento documenti", "ve5 -4", "F"
Item_06 = "Invio e ricezione documenti", "ve5 -3", "F"
Item_07 = "Lista ritenute per F24", "ve8 -0", "F"
Item_08 = "Controllo IBAN su documenti", "ve4 -2", "F"
[VEMENU_052]
Caption = "Configurazione"