campo-sirio/ps/pt0002100.cpp
alex ee80b6a6c0 Patch level : 4.0 911
Files correlati     :
Ricompilazione Demo : [ ]
Commento           :

Riportata la versione 3.2 1010


git-svn-id: svn://10.65.10.50/trunk@16333 c028cbd2-c16b-5b4b-a496-9718f37d4682
2008-03-17 22:05:14 +00:00

485 lines
11 KiB
C++
Executable File
Raw Blame History

#include <applicat.h>
#include <automask.h>
#include <execp.h>
#include <progind.h>
#include <reputils.h>
#include <utility.h>
#include <config.h>
#include <recarray.h>
#include <relation.h>
#include <sheet.h>
#include <tabutil.h>
#include <textset.h>
#include <reprint.h>
#include "pt0002.h"
#include "pt0002100a.h"
#include "../cg/cglib01.h"
#include "clifo.h"
#include "comuni.h"
///////////////////////////////////////////////////////////
// TClient_textset
///////////////////////////////////////////////////////////
class TClifo_recset : public TCSV_recordset
{
TAssoc_array _index;
protected:
virtual TRecnotype new_rec(const char* buf = NULL);
public:
const TString& rag_sociale() const;
TClifo_recset(const char * query);
};
TRecnotype TClifo_recset::new_rec(const char* buf)
{
TToken_string str(256,'\t'); //nuovo record tab separator
if(buf && *buf)
{
bool apici=false;
for (const char* c = buf; *c ; c++)
{
if (*c == '"')
{
apici = !apici;
}
else
{
if (*c == ',')
{
if (!apici)
str << str.separator();
else
str << *c;
}
else
str << *c;
}
}
}
const TRecnotype n = TText_recordset::new_rec(str);
if (n >= 0)
row(n).separator(str.separator());
return n;
}
//funzione che crea il campo ragione sociale dai primi 2 campi del file csv
const TString& TClifo_recset::rag_sociale() const
{
const TString& nome = get(1).as_string();
TString ragsoc = get(0).as_string();
if (nome.full())
{
ragsoc.cut(30);
ragsoc.left_just(30);
ragsoc << nome;
}
ragsoc.cut(50);
return get_tmp_string() = ragsoc;
}
TClifo_recset::TClifo_recset(const char * fileName)
: TCSV_recordset("CSV(,)\n")
{
load_file(fileName);
}
///////////////////////////////////////////////////////////
// TAutomask
///////////////////////////////////////////////////////////
class TImportaClifo_mask : public TAutomask
{
protected:
virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
public:
TImportaClifo_mask();
};
TImportaClifo_mask::TImportaClifo_mask() :TAutomask ("pt0002100a")
{
}
bool TImportaClifo_mask::on_field_event(TOperable_field& f, TField_event e, long jolly)
{
switch (f.dlg())
{
//giochetto per avere la lista dei files validi nella directory di trasferimento!
case F_NAME:
if (e == fe_button)
{
TArray_sheet as(-1, -1, 72, 20, TR("Selezione file"),
"File@32");
TFilename path = get(F_PATH);
path.add("*.csv"); //files delle testate
list_files(path, as.rows_array());
TFilename name;
FOR_EACH_ARRAY_ROW(as.rows_array(), i, row)
{
name = *row;
*row = name.name();
}
if (as.run() == K_ENTER)
{
f.set(as.row(as.selected()));
}
}
break;
default:
break;
}
return true;
}
///////////////////////////////////////
// TSkeleton_application
///////////////////////////////////////
class TClifoCSV : public TSkeleton_application
{
virtual bool check_autorization() const {return false;}
virtual const char * extra_modules() const {return "ve";}
TImportaClifo_mask* _msk;
TConfig* _configfile;
protected:
long find_clifo(const char tipo, const TString& cofi, const TString& paiv, const TString& ragsoc) const;
bool safe_put(TLocalisamfile& clienti, const char* field, const char* val) const;
long find_last_clifo(const char tipo) const;
void pulisci_cap(TString& cap) const;
public:
virtual bool create();
virtual bool destroy();
virtual void main_loop();
virtual void ini2mask();
virtual void mask2ini();
bool transfer(const TFilename& file);
TClifoCSV() {};
};
TClifoCSV& app() { return (TClifoCSV&) main_app(); }
/////////////////////////////////
// ricerca clifo
/////////////////////////////////
//funzione che ricerca un cliente o un fornitore nel file clifo di campo
//restituisce 0 (zero) se non lo trova, se no cerca il pi<70> simile possibile
long TClifoCSV::find_clifo(const char tipo, const TString& cofi, const TString& paiv, const TString& ragsoc) const
{
long found=0;
TRelation clifo(LF_CLIFO);
TRectype& rec = clifo.curr();
TString up_ragsoc = ragsoc;
up_ragsoc.upper();
for (int key = 2; key<=5 && !found; key++)
{
bool good_key = false; // Assumiamo che la chiave sia icompleta
rec.zero();
rec.put(CLI_TIPOCF,tipo);
switch (key)
{
case 2: rec.put(CLI_RAGSOC,ragsoc); good_key = ragsoc.full(); break;
case 4: rec.put(CLI_COFI,cofi); good_key = cofi.full(); break;
case 5: rec.put(CLI_PAIV,paiv); good_key = paiv.full(); break;
default: break;
}
if (good_key) // Se la chiave e' completa ... cerco bene
{
TCursor cur(&clifo,"", key, &rec, &rec);
const TRecnotype items = cur.items();
if (items > 0)
{
double best = -1;
TString80 cur_ragsoc;
cur.freeze();
for (cur=0; cur.pos() < items; ++cur)
{
cur_ragsoc = rec.get(CLI_RAGSOC);
cur_ragsoc.upper();
// funzione che mi dice quanto due stringhe si assomiglino
const double var = xvt_str_fuzzy_compare(up_ragsoc, cur_ragsoc);
if (var > best)
{
best = var;
found = rec.get_long(CLI_CODCF);
}
}
}
}
}
return found;
}
/////////////////////////////////
// aggiornamento clifo
/////////////////////////////////
//funzione che effettua la put solo se non cerco di inserire un campo vuoto
bool TClifoCSV::safe_put(TLocalisamfile& file, const char* field, const char* val) const
{
const bool ok = val && *val;
if (ok)
file.put(field, val);
return ok;
}
//funzione che trova il primo codice libero di un cliento o di un fornitore
long TClifoCSV::find_last_clifo(const char tipo) const
{
TLocalisamfile clifo(LF_CLIFO);
long codcf = 1L ;
if (tipo == 'C')
{
clifo.put(CLI_TIPOCF, 'F');
if (clifo.read(_isgteq) == NOERR)
clifo.prev();
else
clifo.last();
if (clifo.get_char(CLI_TIPOCF) == 'C')
codcf += clifo.get_long(CLI_CODCF);
}
else
{
clifo.last();
if (clifo.get_char(CLI_TIPOCF) == 'F')
codcf+=clifo.get_long(CLI_CODCF);
}
return codcf;
}
void TClifoCSV::pulisci_cap(TString& cap) const
{
TString8 str;
for (int i = 0; cap[i] && str.len() < 5; i++)
if (isdigit(cap[i]))
str << cap[i];
cap = str;
}
bool TClifoCSV::transfer(const TFilename& file)
{
const char tipo = _msk->get(F_TIPO)[0];
const char* head = tipo == 'C' ? TR("Trasferimento clienti") : TR("Trasferimento fornitori");
TLog_report log(head);
TClifo_recset s(file);
TLocalisamfile clifo(LF_CLIFO);
TProgind pi(s.items(),head,true,true);
for (bool ok=s.move_first();ok;ok=s.move_next())
{
if (!pi.addstatus(1))
break;
const TString ragsoc = s.rag_sociale();
if (ragsoc.full())
{
const TString16 cofi = s.get(2).as_string(); //get da file del cod. fisc.
const TString16 paiv = s.get(3).as_string(); //get da file della p. iva
const long var = find_clifo(tipo,cofi,paiv,ragsoc); //controllo se il clifo esiste gi<67>
clifo.zero();
clifo.put(CLI_TIPOCF, tipo);
if (var)
{
//se esiste leggo il record corrispondente
clifo.put(CLI_CODCF,var);
clifo.read();
}
else
{
//se no ne creo uno nuovo
long codcf = find_last_clifo(tipo);
clifo.put(CLI_CODCF, codcf);
}
safe_put(clifo, CLI_RAGSOC, ragsoc); //ragsoc
if (!var)
safe_put(clifo, CLI_TIPOAPER, s.get(1).is_empty() ? "G" : "F");
safe_put(clifo, CLI_PAIV, paiv); //p.iva
safe_put(clifo, CLI_COFI, cofi); //cod. fisc.
safe_put(clifo, CLI_INDCF, s.get(4).as_string()); //indirizzo
safe_put(clifo, CLI_CIVCF, s.get(5).as_string()); //num. civico
if (s.get(6).as_string().empty()) //italiano
{
TString cap = s.get(9).as_string();
pulisci_cap(cap);
TString80 comune = s.get(11).as_string(); //comune o localita'
comune.trim();
safe_put(clifo, CLI_CAPCF, cap); //cap
const TString& codcom = cap2comune(cap, comune);
if (codcom.blank())
{
if (s.get(10).as_string().full())
comune << " (" << s.get(10).as_string() << ')'; //inserisce la localit<69> se non trova un comune
safe_put(clifo, CLI_LOCCF, comune);
}
else
safe_put(clifo, CLI_COMCF, codcom);
}
else
{
TString comune = s.get(7).as_string();
comune << ", " << s.get(8).as_string() << '(' << s.get(6).as_string() <<')'; //inserisce la localit<69> estera
safe_put(clifo, CLI_LOCCF, comune);
if (!var)
safe_put(clifo, CLI_ALLEG, "5"); // Cliente/Fornitore Estero
}
const char* tp = tipo == 'C' ? TR("Cliente") : TR("Fornitore");
TString str;
str << "Il "<< tp << " codice (" << clifo.get(CLI_CODCF) <<") " << ragsoc << " ";
if (var)
{
const int err = clifo.rewrite();
if (err == NOERR)
{
str << "<EFBFBD> stato aggiornato";
log.log(0, str);
}
else
{
str << "NON <20> stato aggiornato. Errore " << err;
log.log(2, str);
}
}
else
{
const int err = clifo.write();
if (err == NOERR)
{
str << "<EFBFBD> stato inserito";
log.log(0, str);
}
else
{
str << "NON <20> stato inserito. Errore " << err;
log.log(2, str);
}
}
if (cofi.empty() && paiv.empty())
{
TString str;
str << "Il " << tp << ' ' << ragsoc << " non ha n<> CODICE FISCALE n<> PARTITA IVA";
log.log(1, str);
}
}
}
TReport_book buc;
buc.add(log);
buc.preview();
return true;
}
void TClifoCSV::mask2ini()
{
//carica i parametri del file di configurazione
_configfile->set_paragraph("MAIN");
for (int i = 0; i < _msk->fields() ; i++)
{
TMask_field& f = _msk->fld(i);
const TFieldref* fr = f.field();
if (fr != NULL)
_configfile->set(fr->name(), f.get());
}
}
void TClifoCSV::ini2mask()
{
//carica i parametri del file di configurazione
_configfile->set_paragraph("MAIN");
for (int i = 0; i < _msk->fields() ; i++)
{
TMask_field& f = _msk->fld(i);
const TFieldref* fr = f.field();
if (fr != NULL)
f.set(_configfile->get(fr->name()));
}
}
bool TClifoCSV::create()
{
_configfile = new TConfig("pt0002conf.ini");
_msk = new TImportaClifo_mask();
return TSkeleton_application::create();
}
bool TClifoCSV::destroy()
{
delete _msk;
delete _configfile;
return TApplication::destroy();
}
void TClifoCSV::main_loop()
{
KEY tasto;
ini2mask();
tasto = _msk->run();
if (tasto == K_ENTER)
{
mask2ini();
//genero il nome del file da caricare
TFilename name = _msk->get(F_PATH);
name.add(_msk->get(F_NAME));
if (transfer(name))
{
message_box(TR("Importazione documenti completata"));
}
}
}
int pt0002100 (int argc, char* argv[])
{
TClifoCSV main_app;
main_app.run(argc, argv, TR("Importazione Clienti/Fornitori"));
return true;
}