#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_raggruppabili(const TDocumento& doc_in, const TDocumento& doc_out, TToken_string& campi) const ; 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; } virtual TRiga_documento& find_or_create_row(TDocumento& doc_out, const TRiga_documento & rin,const char lavtype); 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::doc_raggruppabili(const TDocumento& doc_in, const TDocumento& doc_out, TToken_string& campi) const { if (doc_in.ha_riga_esenzione() != doc_out.ha_riga_esenzione()) return false; bool ok = true; TString campo; for (const char* c = campi.get(0); c && ok; c = campi.get()) { if (strncmp(c, "CODABI", 6) == 0 || strncmp(c, "CODCAB", 6) == 0) { long cod = doc_in.get_long(c); ok &= (cod == doc_out.get_long(c)); } else { campo = doc_in.get(c); ok &= campo == doc_out.get(c); } } return ok; } 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); } } */ } TRiga_documento& TFatturazione_lavanderie::find_or_create_row(TDocumento& doc_out, const TRiga_documento & rin,const char lavtype) { const TString80 codart=rin.get(RDOC_CODARTMAG); int r; for (r=doc_out.physical_rows();r>0;r--) { const char tipo=doc_out[r].get_char("LVTYPE"); const TString& cod=doc_out[r].get(RDOC_CODARTMAG); if (cod==codart && tipo==lavtype) break; } if (r<=0) { TRiga_documento& row=doc_out.new_row("01"); doc_out.copy_data(row,rin); row.zero(RDOC_CODAGG1); row.zero(RDOC_QTA); row.zero(RDOC_QTAGG1); row.put("LVTYPE",lavtype); r=row.get_int(RDOC_NRIGA); } return doc_out[r]; } void TFatturazione_lavanderie::create_row(TDocumento& doc_out, const TRiga_documento & rin) { const TString8 causale = rin.get(RDOC_CODAGG1); const TRectype& cau = cache().get("&CAU", 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); const TString80 codart=rin.get(RDOC_CODARTMAG); const real qta=rin.get_real(RDOC_QTA); const real qta1=rin.get_real(RDOC_QTAGG1); // Guardo se è una causale di rotto e se è abilitato nella testata del contratto la fatturazione dei rotti if (cau.get_bool("B3") && contr.get_int(LVCONDV_ADDCAPROT) && !qta1.is_zero()) { TRiga_documento& rd=find_or_create_row(doc_out,rin,'D'); rd.add(RDOC_QTA, qta1); rd.put(RDOC_PREZZO,contr.row(codart).get_real(LVRCONDV_PREZDAN)); } if (cau.get_bool("B0")) // movimenta ritirato { const TCausale_magazzino& rit = cached_causale_magazzino(cau.get("S1")); TRiga_documento& rr=find_or_create_row(doc_out,rin,'R'); rr.add(RDOC_QTA,rit.sgn(s_consmese) * qta1); } if (cau.get_bool("B1") && !qta.is_zero()) // movimenta consegnato { const TCausale_magazzino& con = cached_causale_magazzino(cau.get("S2")); const real sgntmp=con.sgn(s_dottm); if (!sgntmp.is_zero() && contr.get_bool(LVCONDV_DOTTMPPRZD)) { TRiga_documento& rt=find_or_create_row(doc_out,rin,'T'); rt.add(RDOC_QTA,sgntmp * qta); rt.put(RDOC_PREZZO,contr.row(codart).get_real(LVRCONDV_PRZDTTMP)); } const real sgndotin=con.sgn(s_dotin); if (!sgndotin.is_zero()) { TRiga_documento& rc=find_or_create_row(doc_out,rin,'I'); rc.add(RDOC_QTA,sgndotin * qta); } const real sgncons=con.sgn(s_consmese); if (!sgncons.is_zero()) { TRiga_documento& rc=find_or_create_row(doc_out,rin,'C'); rc.add(RDOC_QTA,sgncons * qta); } } } 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)&&STATO==\"2\")&&(TIPODOC==\"B01\")\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); TDate al = msk.get_date(F_ADATA); if (!al.ok()) al = msk.get_date(F_DATAFAT); TDate dal = msk.get_date(F_DADATA); const long year = al.year(); if (!dal.ok()) { dal.set_day(1); dal.set_month(1); dal.set_year(year); } recset.set_var("#DADATA", dal); recset.set_var("#ADATA", al); recset.set_var("#ANNO", 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; }