git-svn-id: svn://10.65.10.50/branches/R_10_00@22908 c028cbd2-c16b-5b4b-a496-9718f37d4682
302 lines
8.6 KiB
C++
302 lines
8.6 KiB
C++
#include "../ve/velib04.h"
|
|
#include "../ca/calib01.h"
|
|
#include "pe1500.h"
|
|
|
|
#include "../ca/fasi.h"
|
|
|
|
class TOrdinazione : public TElaborazione_esterna
|
|
{
|
|
TString4 _strFasi, _strDist;
|
|
|
|
public:
|
|
virtual bool elabora(TLista_documenti& doc_in, TLista_documenti& doc_out,
|
|
const TDate& data_elab, bool interattivo = false);
|
|
TOrdinazione(const TString& cod);
|
|
};
|
|
|
|
bool TOrdinazione::elabora(TLista_documenti& doc_in, TLista_documenti& doc_out,
|
|
const TDate& data_elab, bool interattivo)
|
|
{
|
|
const TString80 codart = ini_get_string(CONFIG_DITTA, "ci", "CODARTPR");
|
|
|
|
for (int i = 0; i < doc_in.items(); i++)
|
|
{
|
|
if (i >= doc_out.items())
|
|
{
|
|
TDocumento* doc = new TDocumento('D', data_elab.year(), codice_numerazione_finale(), 0L);
|
|
doc->put(DOC_TIPODOC, tipo_finale());
|
|
doc_out.add(doc);
|
|
}
|
|
|
|
TDocumento& din = doc_in[i];
|
|
TDocumento& don = doc_out[i];
|
|
|
|
din.put(DOC_STATO, stato_finale_doc_iniziale());
|
|
|
|
don.put(DOC_TIPOCF, din.get(DOC_TIPOCF));
|
|
don.put(DOC_CODCF, din.get(DOC_CODCF));
|
|
don.put(DOC_DATADOC, data_elab);
|
|
don.put(DOC_NOTE, din.get(DOC_NOTE));
|
|
don.put(DOC_CODCMS, din.get(DOC_CODCMS));
|
|
don.put(DOC_STATO, stato_finale());
|
|
don.put(DOC_NUMDOCRIF, din.get(DOC_NDOC));
|
|
don.put(DOC_DATADOCRIF, din.get(DOC_DATADOC));
|
|
|
|
TLocalisamfile fasi(LF_FASI);
|
|
|
|
const TMultilevel_code_info cfg_fasi(LF_FASI);
|
|
TString16 fase;
|
|
|
|
const int nrows = din.rows();
|
|
FOR_EACH_PHYSICAL_RDOC(din, r, rdoc)
|
|
{
|
|
const TString& tr = rdoc->get(RDOC_TIPORIGA);
|
|
if (tr == _strFasi)
|
|
{
|
|
if (r >= nrows || din[r+1].is_descrizione())
|
|
continue; // Salta fasi vuote
|
|
|
|
TRiga_documento& rout = don.new_row(_strFasi);
|
|
TDocumento::copy_data(rout, *rdoc);
|
|
|
|
const int last_lev = cfg_fasi.levels()-1;
|
|
if (last_lev >= 0)
|
|
{
|
|
const int last_len = cfg_fasi.len(last_lev);
|
|
const long last_val = atol(fase)+1;
|
|
fase.format("%0*ld", last_len, last_val);
|
|
fasi.put(FASI_CODCMSFAS, din.get(DOC_CODCMS));
|
|
fasi.put(FASI_CODFASE, fase);
|
|
fasi.put(FASI_DESCRIZ, rdoc->get(RDOC_DESCR));
|
|
fasi.write_rewrite();
|
|
}
|
|
} else
|
|
if (tr == _strDist)
|
|
{
|
|
TRiga_documento& rout = don.new_row(_strDist);
|
|
TDocumento::copy_data(rout, *rdoc);
|
|
rout.set_original_rdoc_key(*rdoc);
|
|
rout.put(RDOC_FASCMS, fase);
|
|
rout.put(RDOC_CODARTMAG, codart);
|
|
}
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
TOrdinazione::TOrdinazione(const TString& cod) : TElaborazione_esterna(cod)
|
|
{
|
|
_strFasi = ini_get_string(CONFIG_DITTA, "pe", "TipoRigaFase", "05");
|
|
_strDist = ini_get_string(CONFIG_DITTA, "pe", "TipoRigaDist", "P1");
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////
|
|
// Generazione fabbisogno
|
|
///////////////////////////////////////////////////////////
|
|
|
|
class TFabbisognazione : public TElaborazione_esterna
|
|
{
|
|
TString4 _strDett, _strDist;
|
|
|
|
public:
|
|
virtual bool elabora(TLista_documenti& doc_in, TLista_documenti& doc_out,
|
|
const TDate& data_elab, bool interattivo = false);
|
|
TFabbisognazione(const TString& cod);
|
|
};
|
|
|
|
bool TFabbisognazione::elabora(TLista_documenti& doc_in, TLista_documenti& doc_out,
|
|
const TDate& data_elab, bool interattivo)
|
|
{
|
|
for (int i = 0; i < doc_in.items(); i++)
|
|
{
|
|
if (i >= doc_out.items())
|
|
{
|
|
TDocumento* doc = new TDocumento('D', data_elab.year(), codice_numerazione_finale(), 0L);
|
|
doc->put(DOC_TIPODOC, tipo_finale());
|
|
doc_out.add(doc);
|
|
}
|
|
|
|
TDocumento& din = doc_in[i];
|
|
TDocumento& don = doc_out[i];
|
|
|
|
din.put(DOC_STATO, stato_finale_doc_iniziale());
|
|
|
|
don.zero(DOC_TIPOCF);
|
|
don.zero(DOC_CODCF); // NO clifo
|
|
don.put(DOC_DATADOC, data_elab);
|
|
don.put(DOC_NOTE, din.get(DOC_NOTE));
|
|
don.put(DOC_CODCMS, din.get(DOC_CODCMS));
|
|
don.put(DOC_STATO, stato_finale());
|
|
don.put(DOC_NUMDOCRIF, din.get(DOC_NDOC));
|
|
don.put(DOC_DATADOCRIF, din.get(DOC_DATADOC));
|
|
|
|
TLocalisamfile fasi(LF_FASI);
|
|
|
|
const TMultilevel_code_info cfg_fasi(LF_FASI);
|
|
TString16 fase;
|
|
real qta = UNO;
|
|
const int nrows = din.rows();
|
|
FOR_EACH_PHYSICAL_RDOC(din, r, rdoc)
|
|
{
|
|
const TString& tr = rdoc->get(RDOC_TIPORIGA);
|
|
if (tr == _strDist)
|
|
{
|
|
qta = rdoc->get_real(RDOC_QTA);
|
|
if (qta <= ZERO)
|
|
qta = UNO;
|
|
} else
|
|
if (tr == _strDett)
|
|
{
|
|
TRiga_documento& rout = don.new_row(_strDett);
|
|
TDocumento::copy_data(rout, *rdoc);
|
|
rout.put(RDOC_QTA, real(qta * rdoc->get_real(RDOC_QTA)));
|
|
rout.put(RDOC_PREZZO, rdoc->get(RDOC_QTAGG5));
|
|
rout.set_original_rdoc_key(*rdoc);
|
|
rout.put(RDOC_FASCMS, fase);
|
|
}
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
TFabbisognazione::TFabbisognazione(const TString& cod) : TElaborazione_esterna(cod)
|
|
{
|
|
_strDist = ini_get_string(CONFIG_DITTA, "pe", "TipoRigaDist", "P1");
|
|
_strDett = ini_get_string(CONFIG_DITTA, "pe", "TipoRigaDett", "01");
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////
|
|
// Utility pubbliche
|
|
///////////////////////////////////////////////////////////
|
|
|
|
const TString& pe_trova_elaborazione(const TRectype& doc, char tipo)
|
|
{
|
|
TString16 cod;
|
|
|
|
const TString& codnum = doc.get(DOC_CODNUM);
|
|
TString str;
|
|
if (tipo == 'F')
|
|
str << "USE %ELD SELECT (STR(I0=\"0\"))&&(S3=\"pe1 -5\")&&(S5=\"" << codnum << "\")"; // Fabbisogni
|
|
else
|
|
str << "USE %ELD SELECT (STR(I0=\"0\"))&&(S3=\"pe1 -4\")&&(S5=\"" << codnum << "\")"; // Ordini
|
|
|
|
TRecordset* eld = create_recordset(str);
|
|
if (eld != NULL)
|
|
{
|
|
for (bool ok = eld->move_first(); ok; ok = eld->move_next())
|
|
{
|
|
const TString& c = eld->get("CODTAB").as_string();
|
|
const TElaborazione e(c);
|
|
if (e.is_document_ok(doc))
|
|
{
|
|
cod = c;
|
|
break;
|
|
}
|
|
}
|
|
delete eld;
|
|
}
|
|
return get_tmp_string() = cod;
|
|
}
|
|
|
|
const TString& pe_trova_elaborazione(const TMask& m, char tipo)
|
|
{
|
|
TRectype doc(LF_DOC);
|
|
doc.put(DOC_PROVV, 'D');
|
|
doc.put(DOC_ANNO, m.get(DOC_ANNO));
|
|
doc.put(DOC_CODNUM, m.get(DOC_CODNUM));
|
|
doc.put(DOC_NDOC, m.get(DOC_NDOC));
|
|
doc.put(DOC_TIPODOC, m.get(DOC_TIPODOC));
|
|
doc.put(DOC_STATO, m.get(DOC_STATO));
|
|
return pe_trova_elaborazione(doc, tipo);
|
|
}
|
|
|
|
bool pe_genera_documento(TRectype& doc, const TString& cod, char tipo)
|
|
{
|
|
TString16 codelab = cod;
|
|
if (codelab.blank())
|
|
codelab = pe_trova_elaborazione(doc, tipo);
|
|
|
|
const TString& app = cache().get("%ELD", codelab, "S3");
|
|
tipo = app.find("-5") > 0 ? 'F' : 'O';
|
|
|
|
|
|
TElaborazione* e = NULL;
|
|
if (tipo == 'F')
|
|
e = new TFabbisognazione(codelab);
|
|
else
|
|
e = new TOrdinazione(codelab);
|
|
if (e->empty())
|
|
{
|
|
delete e;
|
|
return error_box("Impossibile trovare l'elaborazione %s", (const char*)cod);
|
|
}
|
|
|
|
const TDate oggi(TODAY);
|
|
TLista_documenti doc_in, doc_out;
|
|
doc_in.add(new TDocumento(doc));
|
|
|
|
bool ok = e->elabora(doc_in, doc_out, oggi);
|
|
if (ok)
|
|
{
|
|
doc_in.rewrite();
|
|
doc_out.write();
|
|
|
|
const TRectype& idoc = doc_in[0];
|
|
for (int i = 0; i < idoc.items(); i++)
|
|
{
|
|
const char* fld = idoc.fieldname(i);
|
|
const TString& val = idoc.get(fld);
|
|
if (val.full())
|
|
doc.put(fld, val);
|
|
}
|
|
}
|
|
delete e;
|
|
|
|
return ok;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////
|
|
// TOrdinazione_app
|
|
///////////////////////////////////////////////////////////
|
|
|
|
class TOrdinazione_app : public TSkeleton_application
|
|
{
|
|
protected:
|
|
virtual void main_loop();
|
|
};
|
|
|
|
void TOrdinazione_app::main_loop()
|
|
{
|
|
TFilename ininame;
|
|
if (argc() >= 2)
|
|
{
|
|
const TFixed_string arg = argv(2);
|
|
ininame = arg.starts_with("-i", true) ? arg.mid(2) : arg;
|
|
}
|
|
|
|
TConfig ini(ininame, "Transaction");
|
|
const TString8 codelab = ini.get("Action");
|
|
|
|
ini.set_paragraph("33");
|
|
TRectype doc(LF_DOC);
|
|
doc.put(DOC_PROVV, ini.get(DOC_PROVV));
|
|
doc.put(DOC_ANNO, ini.get(DOC_ANNO));
|
|
doc.put(DOC_CODNUM, ini.get(DOC_CODNUM));
|
|
doc.put(DOC_NDOC, ini.get(DOC_NDOC));
|
|
|
|
if (pe_genera_documento(doc, codelab, 'O'))
|
|
{
|
|
ini.set_paragraph("Transaction");
|
|
ini.set("Result", "OK");
|
|
ini.set("Error", "0");
|
|
|
|
ini.set_paragraph("33");
|
|
for (int i = 0; i < doc.items(); i++)
|
|
{
|
|
const char* fld = doc.fieldname(i);
|
|
const TString& val = doc.get(fld);
|
|
if (val.full())
|
|
ini.set(fld, val);
|
|
}
|
|
}
|
|
} |