campo-sirio/pe/pe1500.cpp
guy 99d53e8ffc Nuova preventivazione avanzata
git-svn-id: svn://10.65.10.50/branches/R_10_00@22908 c028cbd2-c16b-5b4b-a496-9718f37d4682
2013-12-13 09:42:36 +00:00

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);
}
}
}