#include #include "../ve/velib04.h" #include "ci1.h" /////////////////////////////////////////////////////////// // Applicazione /////////////////////////////////////////////////////////// class TMovimenti_interni_app : public TSkeleton_application { TFilename _trans; protected: TDoc_key find_correlated(const TDocumento& din) const; void delete_doc(TDocumento& doc) const; public: virtual bool create(); virtual void main_loop(); }; TDoc_key TMovimenti_interni_app::find_correlated(const TDocumento& din) const { TDoc_key dk; TString query, filter; filter << ' ' << RDOC_DAPROVV << '=' << din.get(DOC_PROVV) << ' ' << RDOC_DAANNO << '=' << din.get(DOC_ANNO) << ' ' << RDOC_DACODNUM << '=' << din.get(DOC_CODNUM) << ' ' << RDOC_DANDOC << '=' << din.get(DOC_NDOC); query << "USE 34 KEY 4" << "\nFROM " << filter << "\nTO " << filter; TISAM_recordset rset(query); if (rset.move_first()) { const char provv = rset.get(RDOC_PROVV).as_string()[0]; const int anno = rset.get(RDOC_ANNO).as_int(); const TString4 codnum = rset.get(RDOC_CODNUM).as_string(); const long ndoc = rset.get(RDOC_NDOC).as_int(); dk = TDoc_key(anno, codnum, ndoc, provv); } return dk; } void TMovimenti_interni_app::delete_doc(TDocumento& doc) const { doc.remove(); } bool TMovimenti_interni_app::create() { const TFixed_string a2 = argc() >= 2 ? argv(2) : ""; if (a2.starts_with("-i", true) || a2.starts_with("/i", true)) _trans = a2.mid(2); #ifdef DBG if (_trans.blank()) { const TDate oggi(TODAY); _trans.tempdir(); _trans.add(name()); _trans.ext("ini"); TConfig ini(_trans, "Transaction"); ini.set("DataElab", oggi.string()); ini.set("ProvvOut", "D"); ini.set("AnnoOut", 2014); ini.set("CodNumOut", "TRAS"); ini.set("NDocOut", ""); ini.set_paragraph("33"); ini.set(DOC_PROVV, "D"); ini.set(DOC_ANNO, 2014); ini.set(DOC_CODNUM, "TRAS"); ini.set(DOC_NDOC, 1); } #endif if (!_trans.exist()) return cantread_box(_trans); open_files(LF_TABCOM, LF_DOC, LF_RIGHEDOC, LF_ANAMAG, LF_CODCORR, 0); return TSkeleton_application::create(); } void TMovimenti_interni_app::main_loop() { TConfig ini(_trans, "Transaction"); const TString8 codelab = ini.get("Action"); const TDate oggi = ini.get("DataElab"); ini.set_paragraph("33"); const char provv = ini.get_char(DOC_PROVV); const int anno = ini.get_int(DOC_ANNO); const TString& codnum = ini.get(DOC_CODNUM); const long ndoc = ini.get_long(DOC_NDOC); TElaborazione_esterna mi(codelab); const TString4 tipo_correlato = mi.tipo_finale(); TDocumento din(provv, anno, codnum, ndoc); TDoc_key kout = find_correlated(din); const bool is_new = kout.empty_items(); if (is_new) kout = TDoc_key(anno, codnum, 0, provv); TDocumento dout(kout.provv(), kout.anno(), kout.codnum(), kout.ndoc()); if (ini.get(DOC_NOTE) == "DELETING") { delete_doc(dout); ini.set("Result", "SUCCESS"); return; } dout.copy_contents(din, true); dout.put(DOC_TIPODOC, tipo_correlato); dout.put(DOC_CODCMS, din.get(DOC_COMMPREL)); dout.put(DOC_FASCMS, din.get(DOC_FASEPREL)); dout.put(DOC_COMMPREL, din.get(DOC_CODCMS)); dout.put(DOC_FASEPREL, din.get(DOC_FASCMS)); const TString16 qtafld = din.tipo().field_qta(); FOR_EACH_PHYSICAL_RDOC(dout, r, rdoc) { const real qta = rdoc->get_real(qtafld); if (!qta.is_zero()) rdoc->put(qtafld, -qta); rdoc->put(RDOC_CODCMS, dout.get(DOC_CODCMS)); rdoc->put(RDOC_FASCMS, dout.get(DOC_FASCMS)); } ini.set_paragraph("Transaction"); if (dout.write(!is_new) == NOERR) { ini.set("Result", "OUTDOC"); ini.set("NDocOut", dout.get(DOC_NDOC)); ini.set(DOC_STATO, mi.stato_finale_doc_iniziale(), "33"); } else { ini.set("Result", "ERROR"); } if (ca_config().get_int("Authorizations") > 0) { TString8 codelab; TString query; query << "USE %ELD SELECT I0=7"; TISAM_recordset eld(query); for (bool ok = eld.move_first(); ok; ok = eld.move_next()) { const TString8 cod = eld.get("CODTAB").as_string(); if (codelab.blank()) codelab = cod; TContabilizzazione_analitica ca(cod); if (ca.is_document_ok(dout)) { codelab = cod; break; } } TContabilizzazione_analitica ca(codelab); TLista_documenti lista_in, lista_out; lista_in.add(din); lista_in.add(dout); if (ca.elabora(lista_in, lista_out, oggi, false)) { // Forza stato corretto a documento principale din.put(DOC_STATO, mi.stato_finale_doc_iniziale()); din.rewrite(); // Forza stato bloccato a documento correlato dout.put(DOC_STATO, mi.stato_finale()); dout.rewrite(); } } } int ci1500(int argc, char* argv[]) { TMovimenti_interni_app mi; mi.run(argc, argv, TR("Movimenti interni")); return 0; }