#include #include #include "lvlib.h" #include "lv2500a.h" #include "lvcondv.h" #include "lvrcondv.h" #include "../ve/ve6200.h" #include "../ve/ve6200a.h" /////////////////////////////////////////////////////////// // TFatturazione_lavanderie /////////////////////////////////////////////////////////// class TFatturazione_lavanderie:public TFatturazione_bolle { TDate _data_elab; protected: virtual void add_rows(TRiga_documento & rout, TRiga_documento & rin); virtual void create_row(TDocumento& doc_out, const TRiga_documento & rin); virtual void pre_process_input(TLista_documenti& doc_in) {} virtual void post_process_input(TLista_documenti& doc_out) {} virtual void post_process_output(TLista_documenti& doc_out); virtual bool da_raggruppare(const TRiga_documento & rin); virtual bool doc_raggruppabile(const TDocumento & doc) const { return true; } virtual bool gestione_riferimenti() const { return true; } virtual bool riferimenti_in_testa() const { return true; } public: virtual bool elabora(TLista_documenti& doc_in, TLista_documenti& doc_out, const TDate& data_elab, bool interattivo = false); TFatturazione_lavanderie(const char* cod); ~TFatturazione_lavanderie() {} }; TFatturazione_lavanderie::TFatturazione_lavanderie(const char* cod) : TFatturazione_bolle(cod) { } bool TFatturazione_lavanderie::da_raggruppare(const TRiga_documento & rin) { const long clifo = rin.doc().get_long(DOC_CODCF); const int indsped = rin.doc().get_int(DOC_CODINDSP); TLaundry_contract contr(clifo, indsped, _data_elab); const TString80 codart = rin.get(RDOC_CODART); const TRectype & rcont = contr.row(codart); const int tipoforf = rcont.get_int(LVRCONDV_TIPOFORF); // return tipoforf > 1; // Test originale if (tipoforf > 1) return true; // Da qui in poi e' sottinteso tipoforf == 1 if (ini_get_int(CONFIG_DITTA, "lv", "TipoPr") == 1) return false; // Test GUY const TString8 causale = rin.get(RDOC_CODAGG1); const TRectype& cau = cache().get("&CAU", causale); if (cau.get_bool("B1")) { const TCausale_magazzino& con = cached_causale_magazzino(cau.get("S2")); if (con.sgn(s_dottm)) // Causale di incremento sotazione temporanea return true; } if (cau.get_bool("B4")) // Causale di rotto return true; return false; } void TFatturazione_lavanderie::post_process_output(TLista_documenti& doc_out) { for (int id = 0; id < doc_out.items(); id++) { TDocumento& doc = doc_out[id]; const int rows = doc.physical_rows(); const long clifo = doc.get_long(DOC_CODCF); const int indsped = doc.get_int(DOC_CODINDSP); TLaundry_contract contr(clifo,indsped,_data_elab); for (int i = 1; i <= rows; i++) { TRiga_documento& rout = doc[i]; const TString80 codart=rout.get(RDOC_CODART); const TRectype & rcont=contr.row(codart); const TString4 tipodot = rcont.get(LVRCONDV_NOLCIC); const TString4 artcli = rcont.get(LVRCONDV_VCARTCLI); real dot; TArticolo_lavanderie artlav(codart, 'C', clifo, indsped); if (tipodot=="I") dot=artlav.get_real("DOTIN"); else dot=artlav.get_real("DOTOD"); const int tipoforf = rcont.get_int(LVRCONDV_TIPOFORF); switch (tipoforf) { case 0: break; case 1: rout.put(RDOC_PREZZO, rcont.get_real(LVRCONDV_PREZZO)); break; case 2: { rout.put(RDOC_QTA, UNO); rout.put(RDOC_PREZZO, rcont.get_real(LVRCONDV_IMPFISART)); // gestione in base codice per valore fisso ??? tolta la scelta dell'articolo o del cliente } break; case 3: { int tipolist=contr.get_int(LVCONDV_TIPOLIS); if (tipolist==0) rout.put(RDOC_PREZZO, rcont.get_real(LVRCONDV_PREZZO)); else { TString query; query << "USE UMART KEY 2 \n" << "FROM " << "CODART=#CODART UM=#UM \n" << "TO " << "TCODART=#CODART UM=#UM \n"; TISAM_recordset recset(query); recset.set_var("#CODART",clifo); recset.set_var("#UM",rcont.get(LVRCONDV_UM)); rout.put(RDOC_PREZZO,recset.get(UMART_PREZZO).as_real()); } rout.put(RDOC_QTA, dot); } break; case 4: { rout.put(RDOC_PREZZO, rcont.get_real(LVRCONDV_PREZZO)); const real cicl=rcont.get_real(LVRCONDV_MINCIC)*dot; const real qta=rout.get(RDOC_QTA); rout.put(RDOC_QTA, cicl > qta ? cicl : qta); } break; case 5: { rout.put(RDOC_PREZZO, rcont.get_real(LVRCONDV_VALCONV)); rout.put(RDOC_QTA, dot*rcont.get_real(LVRCONDV_FORFPERCL)); } break; case 6: { rout.put(RDOC_PREZZO, rcont.get_real(LVRCONDV_PREZZO)); rout.put(RDOC_QTA, dot); } break; default: break; } } } } void TFatturazione_lavanderie::add_rows(TRiga_documento & rout, TRiga_documento & rin) { const TString8 causale = rin.get(RDOC_CODAGG1); const TRectype& cau = cache().get("&CAU", causale); const TCausale_magazzino& rit = cached_causale_magazzino(cau.get("S1")); const TCausale_magazzino& con = cached_causale_magazzino(cau.get("S2")); //movimento o meno la dotazione temporanea/odierna a seconda di cosa prevede la causale const long clifo = rin.doc().get_long(DOC_CODCF); const int indsped = rin.doc().get_int(DOC_CODINDSP); TLaundry_contract contr(clifo, indsped, _data_elab); if (cau.get_bool("B4") && contr.get_int(LVCONDV_ADDCAPROT)) // Guardo se è una causale di rotto e se è abilitato nella testata del contratto la fatturazione dei rotti { const real qta = rit.sgn(s_consmese) * rin.get_real(RDOC_QTA); rout.put(RDOC_PREZZO,contr.get_int(LVCONDV_PREZROT)); rout.add(RDOC_QTA, qta); } else { if (cau.get_bool("B0")) { const real qta = rit.sgn(s_consmese) * rin.get_real(RDOC_QTA); rout.add(RDOC_QTA, qta); } if (cau.get_bool("B1")) { const real qta = con.sgn(s_consmese) * rin.get_real(RDOC_QTA); rout.add(RDOC_QTA, qta); } } } void TFatturazione_lavanderie::create_row(TDocumento& doc_out, const TRiga_documento & rin) { real qta; const TString8 causale = rin.get(RDOC_CODAGG1); const TRectype& cau = cache().get("&CAU", causale); //movimento o meno la dotazione temporanea/odierna a seconda di cosa prevede la causale if (cau.get_bool("B0")) { const TCausale_magazzino& rit = cached_causale_magazzino(cau.get("S1")); qta += rit.sgn(s_consmese) * rin.get_real(RDOC_QTA); } if (cau.get_bool("B1")) { const TCausale_magazzino& con = cached_causale_magazzino(cau.get("S2")); qta += con.sgn(s_consmese) * rin.get_real(RDOC_QTA); } if (qta != ZERO) TFatturazione_bolle::create_row(doc_out, rin); } bool TFatturazione_lavanderie::elabora(TLista_documenti& doc_in, TLista_documenti& doc_out, const TDate& data_elab, bool interattivo) { _data_elab = data_elab; return TFatturazione_bolle::elabora(doc_in, doc_out, data_elab, interattivo); } /////////////////////////////////////////////////////////// // TFatturazione_msk /////////////////////////////////////////////////////////// class TFatturazione_msk: public TAutomask { protected: virtual bool on_field_event(TOperable_field& o,TField_event e,long jolly){return true;} public: TFatturazione_msk(); }; TFatturazione_msk::TFatturazione_msk():TAutomask("lv2500a") { } /////////////////////////////////////////////////////////// // TFatturazione_lav_app /////////////////////////////////////////////////////////// class TFatturazione_lav_app: public TSkeleton_application { protected: virtual void main_loop(); }; void TFatturazione_lav_app::main_loop() { TFatturazione_msk msk; TLocalisamfile doc(LF_DOC); TLocalisamfile rdoc(LF_RIGHEDOC); while (msk.run()!=K_QUIT) { TString query; query << "USE DOC KEY 3 SELECT (TIPOCF==\"C\")&&(BETWEEN(DATADOC,#DADATA,#ADATA))&&(STATO=2)&&(TIPODOC==\"B01\")\n" << "BY TIPOCF CODCF DATADOC\n" << "FROM " << "DATADOC=#DADATA PROVV=D ANNO=#ANNO\n" << "TO " << " DATADOC=#ADATA PROVV=D ANNO=#ANNO\n"; // query << "USE DOC KEY 2 SELECT BETWEEN(DATADOC,#DADATA,#ADATA)\n" // << "FROM " << "TIPOCF=C PROVV=D ANNO=#ANNO DATADOC=#DADATA \n" // << "TO " << "TIPOCF=C PROVV=D ANNO=#ANNO DATADOC=#ADATA \n"; TISAM_recordset recset(query); recset.set_var("#DADATA",msk.get_date(F_DADATA)); recset.set_var("#ADATA",msk.get_date(F_ADATA)); recset.set_var("#ANNO",long(msk.get_date(F_ADATA).year())); TFatturazione_lavanderie elab(msk.get(F_COD_ELAB)); TLista_documenti docsin; TLista_documenti docsout; long lastcli=0; const int period=msk.get_int(F_PERFAT); const TDate datafat=msk.get_date(F_DATAFAT); long indsped; for (bool ok = recset.move_first(); ok; ok = recset.move_next()) { const long clifo = recset.get(DOC_CODCF).as_int(); if (clifo != lastcli) { if (docsin.items()!=0) { elab.elabora(docsin, docsout, datafat); docsout.write(); docsout.destroy(-1) ; docsin.rewrite(); docsin.destroy(-1); } lastcli = clifo; } if (elab.is_document_ok(recset.cursor()->curr())) { indsped = recset.get(DOC_CODINDSP).as_int(); TLaundry_contract contr(clifo, indsped, datafat); const int contrper = contr.get_int(LVCONDV_PERFAT); if (contrper <= period) docsin.add(new TDocumento(recset.cursor()->curr())); } } if (docsin.items()!=0) { elab.elabora(docsin, docsout, datafat); docsout.write(); docsout.destroy(-1); docsin.rewrite(); docsin.destroy(-1); } } } int lv2500(int argc, char *argv[]) { TFatturazione_lav_app a; a.run (argc, argv, "Fatturazione lavanderie"); return TRUE; }