campo-sirio/ibm36/ibm36100.cpp
guy 4b6b88e9dd Patch level :
Files correlati     :
Ricompilazione Demo : [ ]
Commento            :
Importazione movimeti di magazzino da 36


git-svn-id: svn://10.65.10.50/trunk@6961 c028cbd2-c16b-5b4b-a496-9718f37d4682
1998-08-14 12:48:06 +00:00

883 lines
22 KiB
C++
Executable File

#include <applicat.h>
#include <automask.h>
#include <browfile.h>
#include <filetext.h>
#include <prefix.h>
#include <progind.h>
#include <tabutil.h>
#include <utility.h>
#include <viswin.h>
#include "ibm36.h"
#include <comuni.h>
#include <cfven.h>
#include <clifo.h>
#define CENTO 100.0
#define CMILA 100000.0
///////////////////////////////////////////////////////////
// TMask36 Maschera principale di selezione
///////////////////////////////////////////////////////////
class TMask36 : public TAutomask
{
protected:
virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
public:
TMask36() : TAutomask("ibm36100") { }
virtual ~TMask36() { }
};
bool TMask36::on_field_event(TOperable_field& o, TField_event e, long jolly)
{
switch(o.dlg())
{
case 100:
if (e == fe_modify || e == fe_close)
{
if (!fexist(o.get()))
return error_box("Directory non valida");
}
break;
case 101:
case 102:
case 103:
case 104:
case 105:
if (e == fe_modify || e == fe_close)
{
TFilename name = get(100);
name.add(o.get());
if (!name.exist())
return error_box("File non valido");
}
break;
default : break;
}
return TRUE;
}
///////////////////////////////////////////////////////////
// TBankitalia
///////////////////////////////////////////////////////////
class TBankitalia : public TObject
{
TAssoc_array _bank;
public:
const TString* codban2abicab(const char* codban);
void update();
TBankitalia() { }
virtual ~TBankitalia() { }
};
void TBankitalia::update()
{
TTable ban("%BAN");
const TRectype& curban = ban.curr();
_bank.destroy();
for (int err = ban.first(); err == NOERR; err = ban.next())
{
TString16 codban = curban.get("S9");
if (codban.not_empty())
{
const TString& abicab = curban.get("CODTAB");
_bank.add(codban, abicab);
}
}
}
const TString* TBankitalia::codban2abicab(const char* cod)
{
if (_bank.items() == 0)
update();
const TString* abicab = (const TString*)_bank.objptr(cod);
return abicab;
}
///////////////////////////////////////////////////////////
// TTrasfer36 Applicazione di importazione dati da 36
///////////////////////////////////////////////////////////
class TTrasfer36 : public TSkeleton_application
{
TBankitalia _bankitalia;
protected:
virtual void main_loop();
virtual const char* extra_modules() const { return "*"; } // Non e' un modulo normale
public:
void mask2ini(TMask& m, bool load = FALSE);
void ini2mask(TMask& m) { mask2ini(m, TRUE); }
const TString& cap2com(const TString& cap, const TString& name) const;
void split_indir(const TString& indir, TString& via, TString& civ) const;
void mettilavirgola(TFile_text& file, TRecord_text& curr, const char* field, int len, int comma);
void permille(TFile_text& file, TRecord_text& curr, const char* field);
void machedata(TFile_text& file, TRecord_text& curr, const char* field);
void import_tables(const TFilename& name, TBrowsefile_field& bf);
void import_clifor(const TFilename& name, TBrowsefile_field& bf);
void import_anaart(const TFilename& name, TBrowsefile_field& bf);
void import_movmag(const TFilename& name, TBrowsefile_field& bf);
void import_rigmag(const TFilename& name, TBrowsefile_field& bf);
};
const TString& TTrasfer36::cap2com(const TString& cap, const TString& name) const
{
if (cap.not_empty())
{
TString16 str(cap); str.right_just(5, '0');
if (str[2] == '1')
str.overwrite("00", 3);
TRelation rel(LF_COMUNI);
TRectype filter(LF_COMUNI); filter.put(COM_CAPCOM, cap);
TCursor comuni(&rel, "", 3, &filter, &filter);
const TRecnotype total = comuni.items();
if (total > 0)
{
comuni = 0;
if (total > 1)
{
TRecnotype bestpos = 0L;
int bestlen = 0;
comuni.freeze(TRUE);
for (; comuni.pos() < total; ++comuni)
{
const TString& dencom = comuni.curr().get(COM_DENCOM);
for (int l = 0; toupper(dencom[l]) == toupper(name[l]); l++);
if (l > bestlen)
{
bestlen = l;
bestpos = comuni.pos();
}
}
comuni = bestpos;
}
return comuni.curr().get(COM_COM);
}
}
return EMPTY_STRING;
}
void TTrasfer36::split_indir(const TString& indir, TString& via, TString& civ) const
{
const int comma = indir.rfind(',');
if (comma > 0)
{
via = indir.left(comma);
civ = indir.mid(comma+1);
}
else
{
bool has_digit = FALSE;
for (int i = indir.len()-1; i > 0; i--)
{
if (has_digit)
{
if (indir[i] == ' ')
break;
}
else
{
if (isdigit(indir[i]))
has_digit = TRUE;
}
}
if (i > 0 && has_digit)
{
via = indir.left(i);
civ = indir.mid(i+1);
}
}
if (via.empty())
{
via = indir;
civ.cut(0);
}
via.cut(35);
civ.cut(10);
}
void TTrasfer36::import_tables(const TFilename& name, TBrowsefile_field& bf)
{
TString msg;
msg = "Importazione tabelle vendite";
TProgind pi(::fsize(name), msg, TRUE, TRUE);
long valid = 0;
msg.insert("@b", 0);
msg << " dal file " << name;
bf.add_line(msg);
bf.add_line("");
TFile_text file(name, "ibm36tab.ini");
TTable ban("%BAN");
TRecord_text curr;
while (file.read(curr) == NOERR)
{
pi.setstatus(file.read_file()->tellg());
if (pi.iscancelled())
break;
const TString& type = curr.type();
if (type == "A26")
{
const TString& ann = file.get_field(curr, "ANNULLATO");
if (ann != "A")
{
msg = "Importazione tabelle vendite - Record validi: ";
msg << ++valid;
pi.set_text(msg);
TString16 cod = file.get_field(curr, "CODICE");
TString16 abi = file.get_field(curr, "ABI");
TString16 cab = file.get_field(curr, "CAB");
if (abi.empty() || cab.empty())
{
if (abi.empty())
abi = "99999";
if (cab.empty())
{
const TString* abicab = _bankitalia.codban2abicab(cod);
if (abicab != NULL)
{
abi = abicab->left(5);
cab = abicab->mid(5);
}
else
{
ban.last();
const TString16 abicab = ban.get("CODTAB");
if (abicab.left(5) == "99999")
{
long numcab = atol(abicab.mid(5)) + 1;
cab.format("%05ld", numcab);
}
else
cab = "00001";
}
}
}
abi.right_just(5, '0');
cab.right_just(5, '0');
TString16 codtab = abi;
ban.put("CODTAB", codtab);
if (ban.read() != NOERR)
{
msg = "- Creazione dell'istituto fittizio ";
msg << abi;
bf.add_line(msg);
ban.put("CODTAB", codtab);
ban.put("S0", "Banca per trasferimenti IBM36");
ban.write();
}
codtab << cab;
ban.put("CODTAB", codtab);
if (ban.read() == NOERR)
{
ban.put("S9", cod);
ban.rewrite();
}
else
{
msg = "! La banca ";
msg << cod << " non dispone di un codice ABI/CAB valido";
bf.add_line(msg);
msg = "- Verra' creata la banca fittizia ";
msg << abi << ' ' << cab;
bf.add_line(msg);
ban.put("CODTAB", codtab);
ban.put("S0", file.get_field(curr, "RAGSOC"));
ban.put("S9", cod);
const TString& cap = file.get_field(curr, "CAP");
ban.put("S3", cap);
const TString& loc = file.get_field(curr, "LOCALITA");
ban.put("S1", loc);
const TString& com = cap2com(cap, loc);
ban.put("S5", com);
const TString& ind = file.get_field(curr, "INDIRIZZO");
TString via, civ;
split_indir(ind, via, civ);
ban.put("S2", via);
ban.put("S7", civ);
ban.write();
}
}
}
}
_bankitalia.update();
msg = "Record importati: ";
msg << valid;
bf.add_line(msg);
bf.add_line("");
}
void TTrasfer36::mettilavirgola(TFile_text& file, TRecord_text& curr, const char* field, int len, int comma)
{
TString80 num = file.get_field(curr, field);
if (!real::is_null(num))
{
num.right_just(len, '0');
num.insert(".", len - comma);
file.add_field(curr, field, num);
}
}
void TTrasfer36::permille(TFile_text& file, TRecord_text& curr, const char* field)
{
TString80 num = file.get_field(curr, field);
if (!real::is_null(num))
{
num << "000";
file.add_field(curr, field, num);
}
}
void TTrasfer36::machedata(TFile_text& file, TRecord_text& curr, const char* field)
{
TString80 num = file.get_field(curr, field);
if (!real::is_null(num))
{
switch (num.len())
{
case 6:
{
num.insert("19", 0);
const TDate data(atol(num));
file.add_field(curr, field, data.string());
}
break;
case 7:
{
const int secolo = num[0] - '0';
long ansidata = atol(num.mid(1));
ansidata += (19 + secolo) * 1000000L;
const TDate data(ansidata);
file.add_field(curr, field, data.string());
}
break;
case 8:
num.insert("-", 4);
num.insert("-", 2);
file.add_field(curr, field, num);
break;
default:
break;
}
}
}
void TTrasfer36::import_clifor(const TFilename& name, TBrowsefile_field& bf)
{
TAssoc_array missing_firm;
TString msg;
long valid = 0;
msg = "Importazione Clienti/Fornitori";
TProgind pi(::fsize(name), msg, TRUE, TRUE);
TFile_text file(name, "ibm36cf.ini");
msg.insert("@b", 0);
bf.add_line(msg);
bf.add_line("");
TRelation rel(LF_CLIFO); rel.add(LF_CFVEN, "TIPOCF=TIPOCF|CODCF=CODCF");
TRecord_text curr;
while (file.read(curr) == NOERR)
{
pi.setstatus(file.read_file()->tellg());
if (pi.iscancelled())
break;
const int tipo_record = curr.type()[0] - '0';
if (tipo_record >= 1 && tipo_record <= 6)
{
const char stato_record = file.get_field(curr, "ANNULLATO")[0];
if (stato_record == 'A')
continue;
const long ditta = atol(file.get_field(curr, "DITTA"));
if (prefix().get_codditta() != ditta)
{
if (prefix().exist(ditta))
prefix().set_codditta(ditta);
else
{
msg.format("%ld", ditta);
if (missing_firm.objptr(msg) == NULL)
{
missing_firm.add(msg, msg);
msg.insert("Non esiste la ditta ", 0);
msg << ": Effettuare il trasferimento della contabilita'";
bf.add_line(msg);
}
continue;
}
}
const char* tipocf = (tipo_record & 0x1) ? "C" : "F";
const long codcf = atol(file.get_field(curr, "CODCF"));
TString16 extcf;
extcf << (*tipocf == 'C' ? "cliente" : "fornitore") << ' ' << codcf;
TLocalisamfile& clifo = rel.lfile();
clifo.put(CLI_TIPOCF, tipocf);
clifo.put(CLI_CODCF, codcf);
int err = clifo.read();
if (err == NOERR)
{
file.add_field(curr, "TIPOCF", tipocf);
}
switch(tipo_record)
{
case 1:
case 2:
if (err != NOERR)
{
msg = "! Non esiste il ";
msg << extcf;
bf.add_line(msg);
msg = "- Inserimento di ";
msg << file.get_field(curr, "COGNOME") << file.get_field(curr, "NOME");
bf.add_line(msg);
rel.write_enable(LF_CFVEN, FALSE);
const int err = file.autosave(rel, curr);
if (err != NOERR)
{
msg = "! Errore di scrittura sul file LF_CLIFO: ";
msg << err;
bf.add_line(msg);
}
}
break;
case 3:
if (err == NOERR)
{
TString cod = file.get_field(curr, "CODICE BANCA D'APPOGGIO");
if (!cod.blank())
{
const TString* abicab = _bankitalia.codban2abicab(cod);
if (abicab)
{
rel.curr().put(CLI_CODABI, abicab->left(5));
rel.curr().put(CLI_CODCAB, abicab->mid(5));
}
else
{
msg = "Ipossibile determinare l'ABI/CAB della banca d'appoggio ";
msg << cod << " del " << extcf;
bf.add_line(msg);
}
}
cod = file.get_field(curr, "CODICE BANCA PRESENTAZIONE EFFETTI");
if (!cod.blank())
{
const TString* abicab = _bankitalia.codban2abicab(cod);
if (abicab)
{
rel.curr(LF_CFVEN).put(CFV_CODABIPR, abicab->left(5));
rel.curr(LF_CFVEN).put(CFV_CODCABPR, abicab->mid(5));
}
else
{
msg = "Ipossibile determinare l'ABI/CAB della banca di presentazione ";
msg << cod << " del " << extcf;
bf.add_line(msg);
}
}
mettilavirgola(file, curr, "PROVVIGIONE AGENTE", 5, 2);
permille(file, curr, "IMPORTO MINIMO EFFETTI");
machedata(file, curr, "DATA INIZIO RID");
machedata(file, curr, "DATA REVOCA RID");
rel.write_enable(LF_CFVEN);
const int err = file.autosave(rel, curr);
if (err != NOERR)
{
msg = "! Errore di scrittura sul file LF_CFVEN: ";
msg << err;
bf.add_line(msg);
}
else
valid++;
}
break;
case 5:
if (err != NOERR)
{
machedata(file, curr, "DATA INVIO ULTIMO ESTRATTO CONTO");
machedata(file, curr, "DATA INVIO ULTIMO SOLLECITO");
permille(file, curr, "FIDO");
rel.write_enable(LF_CFVEN);
const int err = file.autosave(rel, curr);
if (err != NOERR)
{
msg = "! Errore di scrittura sul file LF_CFVEN: ";
msg << err;
bf.add_line(msg);
}
else
valid++;
}
break;
default: break;// Ignored
}
}
}
msg = "Record importati: ";
msg << valid;
bf.add_line(msg);
bf.add_line("");
}
void TTrasfer36::import_anaart(const TFilename& name, TBrowsefile_field& bf)
{
TString msg, des, codart, um;
real r;
msg = "Importazione Anagrafica articoli";
TProgind pi(::fsize(name), msg, TRUE, TRUE);
TFile_text file(name, "ibm36art.ini");
long valid = 0;
msg.insert("@b", 0);
bf.add_line(msg);
bf.add_line("");
TRelation rel(LF_ANAMAG);
rel.add(LF_UMART,"CODART=CODART");
TRecord_text curr;
while (file.read(curr) == NOERR)
{
pi.setstatus(file.read_file()->tellg());
if (pi.iscancelled())
break;
const int tipo_record = curr.type()[0] - '0';
if (tipo_record == 0)
{
const char stato_record = file.get_field(curr, "ANNULLATO")[0];
if (stato_record == 'A')
continue;
des = file.get_field(curr, "DESCRIZIONE ARTICOLO");
des << " ";
des << file.get_field(curr, "ESTENSIONE DESCRIZIONE");
des.strip_d_spaces();
file.add_field(curr, "DESCRIZIONE ARTICOLO", des);
r = real(file.get_field(curr, "COSTO STANDARD")) / CENTO;
file.add_field(curr, "COSTO STANDARD", r.string());
r = real(file.get_field(curr, "TARA")) / CENTO;
file.add_field(curr, "TARA", r.string());
r = real(file.get_field(curr, "PESO")) / CENTO;
file.add_field(curr, "PESO", r.string());
r = real(file.get_field(curr, "PERCENTUALE PROVVIGIONE")) / CENTO;
file.add_field(curr, "PERCENTUALE PROVVIGIONE", r.string());
r = real(file.get_field(curr, "PERCENTUALE SCONTO")) / CENTO;
file.add_field(curr, "PERCENTUALE SCONTO", r.string());
int err = file.autosave(rel, curr);
if (err != NOERR)
{
msg = "! Errore di scrittura sul file LF_ANAMAG: ";
msg << err;
bf.add_line(msg);
}
else
valid++;
codart = file.get_field(curr, "CODICE PRIMARIO");
TLocalisamfile& umart = rel.lfile(LF_UMART);
for (int nriga = 1; nriga <=3; nriga++)
{
umart.put("CODART",codart);
umart.put("NRIGA",nriga);
if (nriga == 1)
{
umart.put("FC", "1.00");
um = file.get_field(curr,"UNITA DI MISURA");
r = real(file.get_field(curr,"PREZZO VENDITA")) / CENTO;
umart.put("PREZZO", r);
}
else
if (nriga == 2)
{
r = real(file.get_field(curr, "COEFFICIENTE CONVERSIONE 2")) / CMILA;
umart.put("FC", r);
um = file.get_field(curr,"SECONDA UNITA DI MISURA");
}
else
{
r = real(file.get_field(curr, "COEFFICIENTE CONVERSIONE 3")) / CMILA;
umart.put("FC", r);
um = file.get_field(curr,"TERZA UNITA DI MISURA");
}
umart.put("UM", um);
if (umart.write() != NOERR)
err = umart.rewrite();
if (err != NOERR)
{
msg.format("! Errore di scrittura sul file LF_UMART, articolo %s, UM %s: %d", (const char*) codart, (const char*) um, err);
bf.add_line(msg);
}
}
}
}
// Messaggio finale di elaborazione
msg = "Record importati: ";
msg << valid;
bf.add_line(msg);
bf.add_line("");
}
void TTrasfer36::import_movmag(const TFilename& name, TBrowsefile_field& bf)
{
TString msg, str;
msg = "Importazione Movimenti magazzino";
TProgind pi(::fsize(name), msg, TRUE, TRUE);
TFile_text file(name, "ibm36mag.ini");
long valid = 0;
msg.insert("@b", 0);
bf.add_line(msg);
bf.add_line("");
TRelation movmag(LF_MOVMAG);
TRectype& tesmag = movmag.curr();
TRecord_text curr;
while (file.read(curr) == NOERR)
{
pi.setstatus(file.read_file()->tellg());
if (pi.iscancelled())
break;
const char stato_record = file.get_field(curr, "STATO RECORD")[0];
if (stato_record == 'A')
continue;
tesmag.zero();
str = file.get_field(curr, "CODICE ESERCIZIO").right(1);
str[0] -= 5;
TString16 numreg = file.get_field(curr, "NUMERO REGISTRAZIONE");
numreg.right_just(6, '0');
numreg.insert(str, 0);
tesmag.put("NUMREG", numreg);
str = file.get_field(curr, "TIPO CODICE");
const char* tipocf = (str == "2") ? "F" : "C";
file.add_field(curr, "TIPO CODICE", tipocf);
machedata(file, curr, "DATA REGISTRAZIONE");
const TString& datacomp = file.get_field(curr, "DATA REGISTRAZIONE");
movmag.curr().put("DATACOMP", datacomp);
const int err = file.autosave(movmag, curr);
if (err != NOERR)
{
msg = "! Errore di scrittura sul file LF_MOVMAG: ";
msg << err;
bf.add_line(msg);
}
else
valid++;
}
// Messaggio finale di elaborazione
msg = "Record importati: ";
msg << valid;
bf.add_line(msg);
bf.add_line("");
}
void TTrasfer36::import_rigmag(const TFilename& name, TBrowsefile_field& bf)
{
TString msg, str;
msg = "Importazione righe magazzino";
TProgind pi(::fsize(name), msg, TRUE, TRUE);
TFile_text file(name, "ibm36rig.ini");
long valid = 0;
msg.insert("@b", 0);
bf.add_line(msg);
bf.add_line("");
TRelation rmovmag(LF_RMOVMAG);
TRectype& rigamag = rmovmag.curr();
TString last_numreg;
int num_rig = 0;
TRecord_text curr;
while (file.read(curr) == NOERR)
{
pi.setstatus(file.read_file()->tellg());
if (pi.iscancelled())
break;
const int tipo_record = curr.type()[0] - '0';
if (tipo_record == 1 || tipo_record == 2)
{
const char stato_record = file.get_field(curr, "STATO RECORD")[0];
if (stato_record == 'A')
continue;
TString16 numreg = file.get_field(curr, "NUMERO REGISTRAZIONE");
if (numreg != last_numreg)
{
last_numreg = numreg;
num_rig = 1;
}
else
num_rig++;
rigamag.zero();
str = file.get_field(curr, "CODICE ESERCIZIO").right(1);
str[0] -= 5;
numreg.right_just(6, '0');
numreg.insert(str, 0);
rigamag.put("NUMREG", numreg);
rigamag.put("NRIG", num_rig);
if (num_rig == 1)
{
TLocalisamfile movmag(LF_MOVMAG);
movmag.put("NUMREG", numreg);
if (movmag.read() != NOERR)
{
msg = "!Le righe del movimento ";
msg << numreg << " non hanno una testata";
bf.add_line(msg);
}
}
mettilavirgola(file, curr, "QUANT", 11, 3);
mettilavirgola(file, curr, "PREZZO", 11, 2);
if (tipo_record == 2)
rigamag.put("AUTOMATICA", "A");
const int err = file.autosave(rmovmag, curr);
if (err != NOERR)
{
msg = "! Errore di scrittura sul file LF_RMOVMAG: ";
msg << err;
bf.add_line(msg);
}
else
valid++;
}
}
// Messaggio finale di elaborazione
msg = "Record importati: ";
msg << valid;
bf.add_line(msg);
bf.add_line("");
}
void TTrasfer36::mask2ini(TMask& m, bool load)
{
TConfig cfg(CONFIG_DITTA, "ibm36");
TString16 id;
for (int f = m.fields()-1; f >= 0; f--)
{
TMask_field& fld = m.fld(f);
if (fld.is_edit())
{
id.format("%d", fld.dlg());
if (load)
fld.set(cfg.get(id));
else
cfg.set(id, fld.get());
}
}
}
void TTrasfer36::main_loop()
{
TMask36 m;
ini2mask(m);
TBrowsefile_field& bf = (TBrowsefile_field&)m.field(300);
TViswin& vw = bf.vis_win();
vw.show_rulers(FALSE);
while (m.run() == K_ENTER)
{
vw.destroy_lines();
const TFilename dir = m.get(100);
for (short id = 101; id <= 105; id++)
{
const TMask_field& fld = m.field(id);
if (fld.enabled() && !fld.empty())
{
TFilename name = dir;
name.add(fld.get());
switch(fld.dlg())
{
case 101: import_tables(name, bf); break;
case 102: import_clifor(name, bf); break;
case 103: import_anaart(name, bf); break;
case 104: import_movmag(name, bf); break;
case 105: import_rigmag(name, bf); break;
default : break;
}
}
}
vw.goto_top();
mask2ini(m);
}
}
int ibm36100(int argc, char* argv[])
{
TTrasfer36 a;
a.run(argc, argv, "Trasferimento IBM36");
return 0;
}