Files correlati :lv2.exe,lv2500.msk Ricompilazione Demo : [ ] Commento : Modifiche sulla fatturazione git-svn-id: svn://10.65.10.50/trunk@18579 c028cbd2-c16b-5b4b-a496-9718f37d4682
		
			
				
	
	
		
			340 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			340 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
#include <progind.h>
 | 
						||
#include <config.h>
 | 
						||
 | 
						||
#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 <20> una causale di rotto e se <20> 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;
 | 
						||
}
 |