git-svn-id: svn://10.65.10.50/branches/R_10_00@22942 c028cbd2-c16b-5b4b-a496-9718f37d4682

This commit is contained in:
guy 2014-05-14 08:30:22 +00:00
parent ef278b7fb8
commit 4eda961b8b
2 changed files with 212 additions and 122 deletions

View File

@ -82,7 +82,7 @@ bool TImporta_fatacq_app::get_doc(const TFilename& file, const TMask & m)
TDocumento doc('D', datadoc.year(), m.get(F_CODNUM), 0L); TDocumento doc('D', datadoc.year(), m.get(F_CODNUM), 0L);
TVB_recset s(file, ','); TVB_recset s(file, ',');
TProgind pi(s.items(),"Importazione fatture in corso ...",true,true); TProgress_monitor pi(s.items(),"Importazione fatture in corso ...");
doc.put(DOC_TIPODOC, m.get(F_TIPODOC)); doc.put(DOC_TIPODOC, m.get(F_TIPODOC));
doc.put(DOC_TIPOCF, "F"); doc.put(DOC_TIPOCF, "F");
@ -95,7 +95,7 @@ bool TImporta_fatacq_app::get_doc(const TFilename& file, const TMask & m)
for (bool ok = s.move_first(); ok; ok = s.move_next()) for (bool ok = s.move_first(); ok; ok = s.move_next())
{ {
if (!pi.addstatus(1)) if (!pi.add_status())
break; break;
TString16 tmp = s.get(1).as_string(); TString16 tmp = s.get(1).as_string();

View File

@ -1,12 +1,14 @@
#include <applicat.h> #include <applicat.h>
#include <automask.h> #include <automask.h>
#include <progind.h> #include <progind.h>
#include <reputils.h>
#include "../ve/velib.h" #include "../ve/velib.h"
#include "ps0713400a.h" #include "ps0713400a.h"
#include "ps0713lib.h" #include "ps0713lib.h"
#include <../cg/cfban.h>
/////////////////////////////////// ///////////////////////////////////
//// TIMPORTA_FATVEN_MSK //// //// TIMPORTA_FATVEN_MSK ////
@ -40,90 +42,173 @@ bool TImporta_fatven_msk::on_field_event(TOperable_field& f, TField_event e, lon
//Classe TImporta_fatven_app //Classe TImporta_fatven_app
class TImporta_fatven_app : public TSkeleton_application class TImporta_fatven_app : public TSkeleton_application
{ {
TImporta_fatven_msk* _msk;
protected: protected:
virtual bool check_autorization() const {return false;} virtual bool check_autorization() const { return false; }
virtual const char * extra_modules() const {return "ve";} virtual const char * extra_modules() const { return "ve"; }
long togli_apici_numero(TVB_recset& s, int i); const TString& togli_apici(const TVB_recset& s, int i) const;
const TString& togli_apici(TVB_recset& s, int i); long togli_apici_numero(const TVB_recset& s, int i) const;
bool find_clifo(long& codcf, TString& paiv, long& abi, long& cab, TString& codpag); const TString& togli_apici_descr(const TVB_recset& s, int i) const;
long find_cliente(TLocalisamfile& clifo, const TString& cofi, const TString& paiv) const;
void put_rdoc_descr(TRiga_documento& rdoc, const TString& descr) const;
bool update_cfban(long codcf, const TVB_recset& s, int idx_abi) const;
public: public:
virtual bool create();
virtual bool destroy();
virtual void main_loop();
bool transfer(const TFilename& file); bool transfer(const TFilename& file);
virtual void main_loop();
TImporta_fatven_app() {}
}; };
//TOGLI_APICI: metodo che restituisce un campo del recordset come stringa
//preoccupandosi prima di eliminare eventuali doppi apici
const TString& TImporta_fatven_app::togli_apici(const TVB_recset& s, int i) const
{
const TString& str = s.get(i).as_string();
if (str.starts_with("\""))
{
TString& tmp = get_tmp_string();
tmp = str;
tmp.strip("\"");
tmp.trim();
return tmp;
}
return str;
}
//TOGLI_APICI_NUMERO: metodo che restituisce un campo del recordset come numero //TOGLI_APICI_NUMERO: metodo che restituisce un campo del recordset come numero
//preoccupandosi prima di eliminare eventuali doppi apici //preoccupandosi prima di eliminare eventuali doppi apici
long TImporta_fatven_app::togli_apici_numero(TVB_recset& s, int i) long TImporta_fatven_app::togli_apici_numero(const TVB_recset& s, int i) const
{ {
TString80 tmp = s.get(i).as_string(); const TString& tmp = togli_apici(s, i);
tmp.strip("\"");
return atol(tmp); return atol(tmp);
} }
//TOGLI_APICI: metodo che restituisce un campo del recordset come stringa //TOGLI_APICI: metodo che restituisce un campo del recordset come stringa
//preoccupandosi prima di eliminare eventuali doppi apici //preoccupandosi prima di eliminare eventuali doppi apici
const TString& TImporta_fatven_app::togli_apici(TVB_recset & s, int i) const TString& TImporta_fatven_app::togli_apici_descr(const TVB_recset& s, int i) const
{ {
TString& tmp = get_tmp_string(); TString& tmp = get_tmp_string();
tmp = s.get(i).as_string(); tmp = togli_apici(s, i);
tmp.strip("\""); if (tmp.full())
tmp.trim(); {
tmp.replace(11, '\n');
tmp.trim();
}
return tmp; return tmp;
} }
//FIND_CLIFO: metodo che cerca un cliente dati codcf e paiv: se lo trova setta tutti i campi di interesse
//legati al cliente e restituisce true; in caso contrario restituisce false //FIND_CLIFO: metodo che cerca un cliente dati paiv e cofi
bool TImporta_fatven_app::find_clifo(long& codcf, TString& paiv, long& abi, long& cab, TString& codpag) long TImporta_fatven_app::find_cliente(TLocalisamfile& clifo, const TString& paiv, const TString& ragsoc) const
{ {
if (!paiv.blank()) if (paiv.full())
{ {
TISAM_recordset clienti("USE CLIFO KEY 5\nFROM TIPOCF='C' STATOPAIV="" PAIV=#PAIV\nTO TIPOCF='C' STATOPAIV="" PAIV=#PAIV"); clifo.setkey(5);
clienti.set_var("#PAIV", TVariant(paiv)); clifo.zero();
if (clienti.move_first()) clifo.put(CLI_TIPOCF, 'C');
clifo.put(CLI_PAIV, paiv);
if (clifo.read() == NOERR)
return clifo.get_long(CLI_CODCF);
if (paiv.len() == 16)
{ {
codcf = clienti.get(CLI_CODCF).as_int(); clifo.setkey(4);
paiv = clienti.get(CLI_PAIV).as_string(); clifo.zero();
abi = clienti.get(CLI_CODABI).as_int(); clifo.put(CLI_TIPOCF, 'C');
cab = clienti.get(CLI_CODCAB).as_int(); clifo.put(CLI_COFI, paiv);
codpag = clienti.get(CLI_CODPAG).as_string(); if (clifo.read() == NOERR)
return true; return clifo.get_long(CLI_CODCF);
} }
} }
return false; if (ragsoc.full())
{
clifo.setkey(2);
clifo.zero();
clifo.put(CLI_TIPOCF, 'C');
clifo.put(CLI_RAGSOC, ragsoc);
if (clifo.read() == NOERR)
return clifo.get_long(CLI_CODCF);
TToken_string rs(ragsoc, ' ');
if (rs.items() == 2)
{
TString cognom;
cognom = rs.get(0); cognom.left_just(30);
cognom << rs.get();
clifo.zero();
clifo.put(CLI_TIPOCF, 'C');
clifo.put(CLI_RAGSOC, cognom);
if (clifo.read() == NOERR)
return clifo.get_long(CLI_CODCF);
}
}
return 0;
} }
void TImporta_fatven_app::put_rdoc_descr(TRiga_documento& rdoc, const TString& descr) const
{
TParagraph_string para(descr, 50);
rdoc.put(RDOC_DESCR, para.get(0));
if (para.items() > 1)
{
TString s(256);
for (const char* line = para.get(); line != NULL; line = para.get())
s << '\n' << line;
rdoc.put(RDOC_DESCLUNGA, true);
rdoc.put(RDOC_DESCEST, s);
}
}
bool TImporta_fatven_app::update_cfban(long codcf, const TVB_recset& s, int idx_abi) const
{
const TString8 abi = togli_apici(s, idx_abi);
const TString8 cab = togli_apici(s, idx_abi+1);
if (codcf <= 0 || abi.blank() || cab.blank())
return false;
TLocalisamfile cfban(LF_CFBAN);
cfban.put(CFBAN_TIPOCF, 'C');
cfban.put(CFBAN_CODCF, codcf);
cfban.put(CFBAN_TIPOBAN, idx_abi == 20 ? 'V' : 'N');
cfban.put(CFBAN_NRIGA, 1);
cfban.put(CFBAN_ABI, abi);
cfban.put(CFBAN_CAB, cab);
return cfban.rewrite_write() == NOERR;
}
//TRANSFER: metodo che effettivamente fa l'elaborazione del file di input, generando i vari documenti //TRANSFER: metodo che effettivamente fa l'elaborazione del file di input, generando i vari documenti
//pronti per essere contabilizzati //pronti per essere contabilizzati
bool TImporta_fatven_app::transfer(const TFilename& file) bool TImporta_fatven_app::transfer(const TFilename& file)
{ {
TLocalisamfile clifo(LF_CLIFO);
const TString4 codnum = "F01"; //Da analisi const TString4 codnum = "F01"; //Da analisi
const TString4 tpdoc = "F01"; //Da analisi const TString4 tpdoc = "F01"; //Da analisi
TVB_recset s(file, ','); TVB_recset s(file, ',');
TLog_report log;
TString msg;
TProgind pi(s.items(),"Importazione fatture in corso ...",true,true); TProgress_monitor pi(s.items(), TR("Importazione fatture in corso ..."));
long ndoc_old; long ndoc_old;
s.move_first(); s.move_first();
//campi documento //campi documento
const long ndoc = ndoc_old = togli_apici_numero(s,0); //ndoc const long ndoc = ndoc_old = togli_apici_numero(s, 0); //ndoc
const TDate datadoc = togli_apici(s,1); //datadoc const TDate datadoc = togli_apici(s,1); //datadoc
const int anno = datadoc.year(); //anno documento const int anno = datadoc.year(); //anno documento
TDocumento doctmp('D', anno, codnum, ndoc_old); TDocumento doctmp('D', anno, codnum, ndoc_old);
if (doctmp.rows() > 0) if (doctmp.physical_rows() > 0)
{ {
warning_box(TR("I documenti che si sta cercando di importare esistono già")); #ifdef DBG
return true; if (!yesno_box(TR("I documenti che si sta cercando di importare esistono già.\nSi desidera proseguire ugualmente?")))
return false;
#else
return warning_box(TR("I documenti che si sta cercando di importare esistono già."));
#endif
} }
for (bool ok = s.move_first(); ok; ok = s.move_next()) for (bool ok = s.move_first(); ok; ok = s.move_next())
@ -131,12 +216,13 @@ bool TImporta_fatven_app::transfer(const TFilename& file)
if (!pi.addstatus(1)) if (!pi.addstatus(1))
break; break;
if (s.get(0).as_string().blank())
break;
//leggo il contenuto del tracciato record //leggo il contenuto del tracciato record
//campi documento //campi documento
const long ndoc = togli_apici_numero(s,0); //ndoc const long ndoc = togli_apici_numero(s,0); //ndoc
if (ndoc <= 0)
break;
const TDate datadoc = togli_apici(s,1); //datadoc const TDate datadoc = togli_apici(s,1); //datadoc
const int anno = datadoc.year(); //anno documento const int anno = datadoc.year(); //anno documento
@ -171,51 +257,42 @@ bool TImporta_fatven_app::transfer(const TFilename& file)
} }
//campi articolo 1 //campi articolo 1
TString descr1 = togli_apici(s,2); //descrizione aritcolo 1 const TString descr1 = togli_apici_descr(s,2); //descrizione articolo 1
const TString80 art1 = togli_apici(s,3); //articolo 1 const TString80 art1 = togli_apici(s,3); //articolo 1
const real imp1 = togli_apici(s,4); //imponibile articolo 1 const real imp1 = togli_apici(s,4); //imponibile articolo 1
//campi articolo 2 //campi articolo 2
const TString descr2 = togli_apici(s,5); //descrizione articolo 2 const TString descr2 = togli_apici_descr(s,5); //descrizione articolo 2
const real imp2 = togli_apici(s,6); //imponibile articolo 2 const real imp2 = togli_apici(s,6); //imponibile articolo 2
//campi articolo 3 //campi articolo 3
const TString16 descr3 = togli_apici(s,7); //articolo 3 const TString descr3 = togli_apici_descr(s,7); //articolo 3
const real impives = togli_apici(s,8); //imponibile iva esente const real impives = togli_apici(s,8); //imponibile iva esente
//partita iva, mi serve per sapere se un cliente esiste già in clifo
TString16 paiv = togli_apici(s,9); //partita iva
//prendo codiva da anamag //prendo codiva da anamag
const TRectype& anamag = cache().get(LF_ANAMAG,art1); const TRectype& anamag = cache().get(LF_ANAMAG,art1);
const TString16 codiva = anamag.get(ANAMAG_CODIVA); const TString16 codiva = anamag.get(ANAMAG_CODIVA);
//codice commessa //partita iva, mi serve per sapere se un cliente esiste già in clifo
const TString16 codcms = togli_apici(s,17); const TString16 paiv = togli_apici(s,9); //partita iva
const TString80 ragsoc = togli_apici(s,10); //ragione sociale
//cerco gli altri dati di interesse //cerco gli altri dati di interesse
long codcf; long codcf = find_cliente(clifo, paiv, ragsoc);
long abi; if (codcf <= 0)
long cab;
TString4 codpag;
if (!find_clifo(codcf, paiv, abi, cab, codpag))
{ {
//campi cliente (da utilizzare se non esiste già) //campi cliente (da utilizzare se non esiste già)
const TString80 ragsoc = togli_apici(s,10); //ragione sociale const TString80 ind = togli_apici(s,11); //indirizzo
const TString80 ind = togli_apici(s,11); //indirizzo const TString4 nciv = togli_apici_numero(s,12); //numero civico
const TString4 nciv = togli_apici_numero(s,12); //numero civico const TString8 cap = togli_apici(s,13); //CAP
const long cap = togli_apici_numero(s,13); //CAP const TString80 comune = togli_apici(s,14); //comune
const TString80 comune = togli_apici(s,14); //comune const TString80 loc = togli_apici(s,15); //località
const TString80 loc = togli_apici(s,15); //località // const TString4 prov = togli_apici(s,16); //provincia
const TString4 prov = togli_apici(s,16); //provincia const TString& codcom = cap2comune(cap, comune); //codice comune
const TString& codcom = cap2comune(cap, comune); //codice comune
TLocalisamfile clifo(LF_CLIFO);
//calcolo il prossimo codice cliente libero //calcolo il prossimo codice cliente libero
codcf = 1L ; codcf = 1L ;
clifo.setkey(1);
if (!clifo.empty()) if (!clifo.empty())
{ {
clifo.zero();
clifo.put(CLI_TIPOCF, 'F'); clifo.put(CLI_TIPOCF, 'F');
if (clifo.read(_isgteq) == NOERR) if (clifo.read(_isgteq) == NOERR)
clifo.prev(); clifo.prev();
@ -226,48 +303,53 @@ bool TImporta_fatven_app::transfer(const TFilename& file)
codcf += clifo.get_long(CLI_CODCF); codcf += clifo.get_long(CLI_CODCF);
} }
msg.cut(0) << TR("Inserimento cliente ") << codcf << ' ' << ragsoc;
log.log(0, msg);
if (paiv.blank())
log.log(2, TR("Cliente privo di Partita IVA e Codice Fiscale"));
//inserisco i dati di interesse //inserisco i dati di interesse
clifo.put(CLI_TIPOCF, "C"); clifo.zero();
clifo.put(CLI_TIPOCF, 'C');
clifo.put(CLI_CODCF, codcf); clifo.put(CLI_CODCF, codcf);
clifo.put(CLI_RAGSOC, ragsoc); clifo.put(CLI_RAGSOC, ragsoc);
clifo.put(CLI_PAIV, paiv); if (paiv.len() == 16)
clifo.put(CLI_COFI, paiv);
else
clifo.put(CLI_PAIV, paiv);
clifo.put(CLI_INDCF, ind); clifo.put(CLI_INDCF, ind);
clifo.put(CLI_CIVCF, nciv); clifo.put(CLI_CIVCF, nciv);
clifo.put(CLI_CAPCF, cap); clifo.put(CLI_CAPCF, cap);
clifo.put(CLI_COMCF, codcom); clifo.put(CLI_COMCF, codcom);
clifo.put(CLI_LOCCF, loc); clifo.put(CLI_LOCCF, loc);
clifo.put(CLI_CODABI, togli_apici(s, 20));
clifo.put(CLI_CODCAB, togli_apici(s, 21));
clifo.write(); const int err = clifo.write();
if (err != NOERR)
abi = 0; {
cab = 0; msg.cut(0) << "Impossibile inserire il cliente " << codcf << " : errore" << err;
codpag = ""; log.log(2, msg);
}
} }
TDocumento doc('D', anno, codnum, ndoc); TDocumento doc('D', anno, codnum, ndoc);
const bool is_new = doc.physical_rows() == 0;
doc.put(DOC_TIPODOC, tpdoc); doc.put(DOC_TIPODOC, tpdoc);
doc.put(DOC_DATADOC, datadoc); doc.put(DOC_DATADOC, datadoc);
doc.put(DOC_TIPOCF, 'C'); doc.put(DOC_TIPOCF, 'C');
doc.put(DOC_CODCF, codcf); doc.put(DOC_CODCF, codcf);
doc.put(DOC_CODABIA, abi);
doc.put(DOC_CODCABA, cab);
doc.put(DOC_CODPAG, codpag);
doc.put(DOC_CODCMS, codcms);
if (imp1 != 0) doc.put(DOC_CODCMS, togli_apici(s, 17));
doc.put(DOC_CODABIA, togli_apici(s, 20));
doc.put(DOC_CODCABA, togli_apici(s, 21));
doc.put(DOC_CODABIP, togli_apici(s, 22));
doc.put(DOC_CODCABP, togli_apici(s, 23));
doc.put(DOC_CODPAG, togli_apici(s, 24));
if (!imp1.is_zero())
{ {
TRiga_documento& rdoc = doc.new_row("01"); TRiga_documento& rdoc = doc.new_row("01");
put_rdoc_descr(rdoc, descr1);
if (descr1.len() <= 50)
rdoc.put(RDOC_DESCR, descr1);
else
{
rdoc.put(RDOC_DESCR, descr1.sub(0,49));
rdoc.put(RDOC_DESCLUNGA, true);
rdoc.put(RDOC_DESCEST, descr1.sub(50));
}
rdoc.put(RDOC_PREZZO, imp1); rdoc.put(RDOC_PREZZO, imp1);
rdoc.put(RDOC_QTA, 1); rdoc.put(RDOC_QTA, 1);
rdoc.put(RDOC_CODART, art1); rdoc.put(RDOC_CODART, art1);
@ -276,11 +358,11 @@ bool TImporta_fatven_app::transfer(const TFilename& file)
rdoc.put(RDOC_CODIVA, codiva); rdoc.put(RDOC_CODIVA, codiva);
} }
if (imp2 != 0) if (!imp2.is_zero())
{ {
TRiga_documento& rdoc = doc.new_row("01"); TRiga_documento& rdoc = doc.new_row("01");
rdoc.put(RDOC_DESCR, descr2); put_rdoc_descr(rdoc, descr2);
rdoc.put(RDOC_PREZZO, imp2); rdoc.put(RDOC_PREZZO, imp2);
rdoc.put(RDOC_QTA, 1); rdoc.put(RDOC_QTA, 1);
rdoc.put(RDOC_CODART, art1); rdoc.put(RDOC_CODART, art1);
@ -289,52 +371,60 @@ bool TImporta_fatven_app::transfer(const TFilename& file)
rdoc.put(RDOC_CODIVA, codiva); rdoc.put(RDOC_CODIVA, codiva);
} }
if (impives != 0) if (!impives.is_zero())
{ {
TRiga_documento& rdoc = doc.new_row("01"); TRiga_documento& rdoc = doc.new_row("01");
put_rdoc_descr(rdoc, descr3);
rdoc.put(RDOC_PREZZO, impives); rdoc.put(RDOC_PREZZO, impives);
rdoc.put(RDOC_QTA, 1); rdoc.put(RDOC_QTA, 1);
rdoc.put(RDOC_CHECKED, "X"); rdoc.put(RDOC_CHECKED, "X");
rdoc.put(RDOC_CODIVA, codiva); //?????????????????????????????????? rdoc.put(RDOC_CODIVA, codiva); //??????????????????????????????????
} }
doc.write();
int err = doc.write();
if (err == NOERR)
{
if (is_new)
{
msg.cut(0) << "Inserito documento " << ndoc;
log.log(0, msg);
}
update_cfban(codcf, s, 20);
update_cfban(codcf, s, 22);
}
else
{
msg.cut(0);
if (is_new)
msg << "Impossibile creare";
else
msg << "Impossibile aggiornare";
msg << " il documento " << ndoc << " : errore" << err;
log.log(2, msg);
}
} }
log.preview();
return true; return true;
} }
//CREATE: metodo che instanzia maschera e appicazione
bool TImporta_fatven_app::create()
{
_msk = new TImporta_fatven_msk();
return TSkeleton_application::create();
}
//DESTROY: metodo che rilascia maschera e applicazione
bool TImporta_fatven_app::destroy()
{
delete _msk;
return TApplication::destroy();
}
void TImporta_fatven_app::main_loop() void TImporta_fatven_app::main_loop()
{ {
KEY tasto; TImporta_fatven_msk msk;
tasto = _msk->run(); if (msk.run() == K_ENTER)
if (tasto == K_ENTER)
{ {
//genero il nome del file da caricare //genero il nome del file da caricare
TFilename name = _msk->get(F_PATH); TFilename name = msk.get(F_PATH);
name.add(_msk->get(F_NAME)); name.add(msk.get(F_NAME));
transfer(name); if (name.exist())
transfer(name);
else
cantread_box(name);
} }
} }
TImporta_fatven_app& app() { return (TImporta_fatven_app&) main_app(); }
int ps0713400 (int argc, char* argv[]) int ps0713400 (int argc, char* argv[])
{ {
TImporta_fatven_app main_app; TImporta_fatven_app main_app;