#include "../ve/velib04.h" #include "../ca/calib01.h" #include "pe1500.h" #include "../ca/fasi.h" class TOrdinazione : public TElaborazione_esterna { public: virtual bool elabora(TLista_documenti& doc_in, TLista_documenti& doc_out, const TDate& data_elab, bool interattivo = false); TOrdinazione(const TString& cod) : TElaborazione_esterna(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->put(DOC_STATO, stato_finale()); doc_out.add(doc); } TDocumento& din = doc_in[i]; TDocumento& don = doc_out[i]; 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)); TLocalisamfile fasi(LF_FASI); const TMultilevel_code_info cfg_fasi(LF_FASI); TString16 fase; FOR_EACH_PHYSICAL_RDOC(din, r, rdoc) { if (rdoc->is_descrizione()) { TRiga_documento& rout = don.new_row(rdoc->get(RDOC_TIPORIGA)); 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 (rdoc->is_merce()) { TRiga_documento& rout = don.new_row(rdoc->get(RDOC_TIPORIGA)); TDocumento::copy_data(rout, *rdoc); rout.set_original_rdoc_key(*rdoc); rout.put(RDOC_FASCMS, fase); rout.put(RDOC_CODARTMAG, codart); } } } return true; } const TString& pe_trova_elaborazione(const TRectype& doc) { TString16 cod; const TString4 codnum = doc.get(DOC_CODNUM); const TString4 tipodoc = doc.get(DOC_TIPODOC); const TString4 stato = doc.get(DOC_STATO); TString str; str << "USE %ELD SELECT (STR(I0=\"0\"))&&(S3=\"pe1 -4\")&&(S5=\"" << codnum << "\")"; TRecordset* eld = create_recordset(str); if (eld != NULL) { for (bool ok = eld->move_first(); ok; ok = eld->move_next()) { const TString16 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) { 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); } bool pe_genera_ordine(TRectype& doc, const TString& cod) { TString16 codelab = cod; if (codelab.blank()) codelab = pe_trova_elaborazione(doc); TOrdinazione prev(codelab); if (prev.empty()) return false; const TDate oggi(TODAY); TLista_documenti doc_in, doc_out; doc_in.add(new TDocumento(doc)); bool ok = prev.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); } } 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_ordine(doc, codelab)) { 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); } } }