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