9365854f44
Files correlati : Ricompilazione Demo : [ ] Commento : git-svn-id: svn://10.65.10.50/trunk@17519 c028cbd2-c16b-5b4b-a496-9718f37d4682
391 lines
9.7 KiB
C++
Executable File
391 lines
9.7 KiB
C++
Executable File
#define XVT_INCL_NATIVE
|
|
|
|
#include <applicat.h>
|
|
#include <execp.h>
|
|
|
|
#include "../cg/cg2103.h"
|
|
#include "../mg/anamag.h"
|
|
|
|
#include <mov.h>
|
|
#include <doc.h>
|
|
#include <rdoc.h>
|
|
|
|
#include "velib.h"
|
|
|
|
class TIndustriosa_app : public TSkeleton_application
|
|
{
|
|
int _len_commessa;
|
|
int _len_fase;
|
|
|
|
protected:
|
|
const TString& conto_industriale(const TRiga_documento& row, TString& conto) const;
|
|
void trim_and_cut(TString& val, int len) const;
|
|
void get_field(const TDocumento& doc, const TRectype& mov, TCausale& causale,
|
|
const TRectype& rec, const char* field, TString& val) const;
|
|
bool filerr(const char* name) const;
|
|
bool get_mci_path(TFilename& shell) const;
|
|
bool call_mci(TDocumento& doc, const TRectype& movimento);
|
|
|
|
public:
|
|
virtual void main_loop();
|
|
};
|
|
|
|
const TString& TIndustriosa_app::conto_industriale(const TRiga_documento& row, TString& conto) const
|
|
{
|
|
const TDocumento& doc = row.doc();
|
|
const bool acquisti = doc.get_char(DOC_TIPOCF) == 'F';
|
|
conto.cut(0);
|
|
if (row.is_merce())
|
|
{
|
|
const TRectype& rec = cache().get(LF_ANAMAG, row.get(RDOC_CODARTMAG));
|
|
conto = rec.get(acquisti ? ANAMAG_CONTOINDA : ANAMAG_CONTOINDV);
|
|
} else
|
|
if (row.is_prestazione())
|
|
{
|
|
const TRectype& rec = cache().get("PRS", row.get(RDOC_CODART));
|
|
conto = rec.get("S2");
|
|
if (acquisti)
|
|
conto = conto.mid(20,12);
|
|
else
|
|
conto = conto.left(12);
|
|
conto.trim();
|
|
}
|
|
if (!conto.empty())
|
|
{
|
|
TString16 cnt;
|
|
cnt << conto.mid(1,2);
|
|
cnt << conto.mid(4,2);
|
|
cnt << conto.mid(6);
|
|
conto = cnt;
|
|
}
|
|
return conto;
|
|
}
|
|
|
|
void TIndustriosa_app::trim_and_cut(TString& val, int len) const
|
|
{
|
|
if (len > 0)
|
|
{
|
|
int zeroes = 0;
|
|
for (zeroes = 0; val[zeroes] == '0'; zeroes++);
|
|
if (zeroes > 0)
|
|
val.ltrim(zeroes);
|
|
val.cut(len);
|
|
}
|
|
else
|
|
val.cut(0);
|
|
}
|
|
|
|
void TIndustriosa_app::get_field(const TDocumento& doc, const TRectype& mov, TCausale& causale,
|
|
const TRectype& rec, const char* field, TString& val) const
|
|
{
|
|
if (field[0] == '"' || field[0] == '\'')
|
|
{
|
|
val = field;
|
|
val.rtrim(1);
|
|
val.ltrim(1);
|
|
} else
|
|
if (field[0] == '_')
|
|
{
|
|
val.cut(0);
|
|
if (xvt_str_compare_ignoring_case(field, "_CANTIERE") == 0)
|
|
{
|
|
TString cms, fas;
|
|
cms = rec.get(RDOC_CODCMS);
|
|
if (cms.blank())
|
|
{
|
|
cms = doc.get(DOC_CODCMS);
|
|
fas = doc.get(DOC_FASCMS);
|
|
}
|
|
else
|
|
fas = rec.get(RDOC_FASCMS);
|
|
trim_and_cut(cms, _len_commessa);
|
|
trim_and_cut(fas, _len_fase);
|
|
val << cms << fas;
|
|
} else
|
|
if (xvt_str_compare_ignoring_case(field, "_CODCAUS") == 0)
|
|
{
|
|
val = causale.codice();
|
|
} else
|
|
if (xvt_str_compare_ignoring_case(field, "_CONINDU") == 0)
|
|
{
|
|
conto_industriale((TRiga_documento&)rec, val);
|
|
} else
|
|
if (xvt_str_compare_ignoring_case(field, "_IMPORTO") == 0)
|
|
{
|
|
TCurrency_documento imp(((TRiga_documento&)rec).importo(TRUE, FALSE), doc);
|
|
imp.change_to_firm_val();
|
|
val = imp.get_num().stringa();
|
|
} else
|
|
if (xvt_str_compare_ignoring_case(field, "_IMPORTOVAL") == 0)
|
|
{
|
|
if (doc.in_valuta())
|
|
{
|
|
const TCurrency_documento imp(((TRiga_documento&)rec).importo(TRUE, FALSE), doc);
|
|
val = imp.get_num().stringa();
|
|
}
|
|
} else
|
|
if (xvt_str_compare_ignoring_case(field, "_IMPOSTADOC") == 0)
|
|
{
|
|
TString16 conto;
|
|
real impval;
|
|
for (int i = 1; i <= doc.physical_rows(); i++)
|
|
{
|
|
const TRiga_documento& rdoc = doc[i];
|
|
conto_industriale(rdoc, conto);
|
|
if (conto.not_empty())
|
|
impval += rdoc.imposta();
|
|
}
|
|
TCurrency_documento imposta(impval, doc);
|
|
imposta.change_to_firm_val();
|
|
val = imposta.get_num().stringa();
|
|
} else
|
|
if (xvt_str_compare_ignoring_case(field, "_SEZIONE") == 0)
|
|
{
|
|
const char str[2] = { causale.sezione(2), '\0' };
|
|
val = str;
|
|
} else
|
|
if (xvt_str_compare_ignoring_case(field, "_TOTDOC") == 0)
|
|
{
|
|
TString16 conto;
|
|
real totval;
|
|
for (int i = 1; i <= doc.physical_rows(); i++)
|
|
{
|
|
const TRiga_documento& rdoc = doc[i];
|
|
conto_industriale(rdoc, conto);
|
|
if (conto.not_empty())
|
|
totval += rdoc.importo(TRUE, FALSE);
|
|
}
|
|
TCurrency_documento tot(totval, doc);
|
|
tot.change_to_firm_val();
|
|
val = tot.get_num().stringa();
|
|
if (val[0] == '-')
|
|
val.ltrim(1);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
const TRectype* r = &rec;
|
|
if (strncmp(field, "33->", 4) == 0)
|
|
{
|
|
r = &doc;
|
|
field += 4;
|
|
} else
|
|
if (strncmp(field, "23->", 4) == 0)
|
|
{
|
|
r = &mov;
|
|
field += 4;
|
|
}
|
|
|
|
const TFieldtypes ft = r->type(field);
|
|
switch (ft)
|
|
{
|
|
case _alfafld:
|
|
val = r->get(field);
|
|
if (r->num() == LF_DOC && val.not_empty() && real::is_real(val)) // Campo virtuale numerico
|
|
{
|
|
const real n(val);
|
|
val = n.stringa();
|
|
}
|
|
break;
|
|
case _nullfld:
|
|
val.cut(0);
|
|
break;
|
|
case _realfld:
|
|
{
|
|
const real n(r->get(field));
|
|
if (!n.is_zero())
|
|
{
|
|
val = n.stringa();
|
|
if (val[0] == '-' && r->num() == LF_MOV && xvt_str_compare_ignoring_case(field, MOV_TOTDOC) == 0)
|
|
val.ltrim(1);
|
|
}
|
|
else
|
|
val.cut(0);
|
|
}
|
|
break;
|
|
default:
|
|
val = r->get(field);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
bool TIndustriosa_app::filerr(const char* name) const
|
|
{
|
|
return error_box("Impossibile accedere al file '%s'", name);
|
|
}
|
|
|
|
bool TIndustriosa_app::get_mci_path(TFilename& shell) const
|
|
{
|
|
char winpath[_MAX_PATH];
|
|
::GetWindowsDirectory(winpath, sizeof(winpath));
|
|
|
|
shell = winpath;
|
|
shell.add("mci4.ini");
|
|
|
|
bool ok = FALSE;
|
|
|
|
if (shell.exist())
|
|
{
|
|
TConfig mci4(shell, "Paths");
|
|
TString8 lcl = mci4.get("lcldrive");
|
|
|
|
shell = mci4.get("inilocation");
|
|
|
|
if (!lcl.empty())
|
|
{
|
|
lcl.cut(1);
|
|
lcl << ":";
|
|
shell.insert(lcl);
|
|
}
|
|
shell.add("appl.ini");
|
|
if (shell.exist())
|
|
{
|
|
TConfig appl(shell, "Paths");
|
|
shell = appl.get("exelocation");
|
|
shell.insert(lcl);
|
|
|
|
shell.add("mci.exe");
|
|
ok = shell.exist();
|
|
if (!ok)
|
|
filerr(shell);
|
|
}
|
|
else
|
|
filerr(shell);
|
|
}
|
|
else
|
|
filerr(shell);
|
|
|
|
return ok;
|
|
}
|
|
|
|
bool TIndustriosa_app::call_mci(TDocumento& doc, const TRectype& movimento)
|
|
{
|
|
TConfig mci("ve6600.ini");
|
|
TString_array para;
|
|
mci.list_paragraphs(para);
|
|
|
|
_len_commessa = mci.get_int("LCommessa", "General", -1, 20);
|
|
_len_fase = mci.get_int("LFase", "General", -1, 0);
|
|
|
|
int pos =para.find("General");
|
|
if (pos >= 0)
|
|
para.destroy(pos, TRUE);
|
|
bool ok = FALSE;
|
|
|
|
TFilename ininame; ininame.temp();
|
|
if (para.items() >= 2)
|
|
{
|
|
TConfig ini(ininame);
|
|
|
|
TString val;
|
|
|
|
TAssoc_array& hvar = mci.list_variables(para.row(0));
|
|
ini.set_paragraph(para.row(0));
|
|
|
|
const TTipo_documento& td = doc.tipo();
|
|
const TString16 codcaus = td.causale();
|
|
TCausale causale(codcaus);
|
|
|
|
FOR_EACH_ASSOC_STRING(hvar, obj, key, field)
|
|
{
|
|
get_field(doc, movimento, causale, movimento, field, val);
|
|
ini.set(key, val);
|
|
}
|
|
|
|
TAssoc_array& rvar = mci.list_variables(para.row(1));
|
|
int i = 1;
|
|
|
|
for (int r = 1; r <= doc.physical_rows(); r++)
|
|
{
|
|
const TRiga_documento& rdoc = doc[r];
|
|
TString16 conto;
|
|
conto_industriale(rdoc, conto);
|
|
if (conto.not_empty())
|
|
{
|
|
TString16 pr; pr.format("%s_%d", (const char*)para.row(1), i++); // Paragrafo riga contabile
|
|
|
|
ini.set_paragraph(pr);
|
|
FOR_EACH_ASSOC_STRING(rvar, obj, key, field)
|
|
{
|
|
get_field(doc, movimento, causale, doc[r], field, val);
|
|
ini.set(key, val);
|
|
}
|
|
}
|
|
}
|
|
mci.set_paragraph(para.row(0)); // Forza scrittura ultima riga
|
|
}
|
|
else
|
|
error_box("Il file ve6600.ini non e' valido");
|
|
|
|
if (ininame.exist())
|
|
{
|
|
TFilename shell;
|
|
if (get_mci_path(shell))
|
|
{
|
|
shell << " -c " << ininame << ',';
|
|
TExternal_app app(shell);
|
|
ok = app.run() == 0;
|
|
if (ok)
|
|
{
|
|
TConfig ini(ininame, para.row(0));
|
|
const TString16 oldnumreg = doc.get("NUMREGIND");
|
|
const TString16 newnumreg = ini.get("NumReg");
|
|
if (oldnumreg != newnumreg)
|
|
{
|
|
doc.put("NUMREGIND", newnumreg);
|
|
doc.rewrite();
|
|
}
|
|
}
|
|
else
|
|
error_box("Impossibile eseguire %s", (const char*)shell);
|
|
}
|
|
::remove(ininame);
|
|
}
|
|
|
|
return ok;
|
|
}
|
|
|
|
void TIndustriosa_app::main_loop()
|
|
{
|
|
if (argc() > 2)
|
|
{
|
|
TFilename ininame;
|
|
ininame = argv(2);
|
|
ininame.ltrim(2); // toglie /i
|
|
|
|
if (ininame.exist())
|
|
{
|
|
open_files(LF_TAB, LF_TABCOM, LF_CAUSALI, LF_RCAUSALI, LF_DOC, LF_RIGHEDOC, LF_CLIFO, LF_CFVEN, LF_MOV, LF_ANAMAG, 0);
|
|
|
|
TString8 para; para.format("%d", LF_DOC);
|
|
TConfig ini(ininame, para);
|
|
const char provv = ini.get(DOC_PROVV)[0];
|
|
const int anno = ini.get_int(DOC_ANNO);
|
|
const TString8 codnum = ini.get(DOC_CODNUM);
|
|
const long ndoc = ini.get_long(DOC_NDOC);
|
|
TDocumento doc(provv, anno, codnum, ndoc);
|
|
|
|
para.format("%d", LF_MOV);
|
|
ini.set_paragraph(para);
|
|
const long numreg = ini.get_long(MOV_NUMREG);
|
|
const TRectype& mov = cache().get(LF_MOV, numreg);
|
|
|
|
call_mci(doc, mov);
|
|
}
|
|
else
|
|
filerr(ininame);
|
|
}
|
|
else
|
|
error_box("Specificare il file con la transazione");
|
|
}
|
|
|
|
////// Esecuzione del programma ///////////
|
|
|
|
int ve6600(int argc, char** argv)
|
|
{
|
|
TIndustriosa_app app;
|
|
app.run(argc,argv, "Contabilizzazione industriale");
|
|
return 0;
|
|
}
|