Files correlati : ve6.exe Ricompilazione Demo : [ ] Commento : Riportata la versione 3.1 patch 979 git-svn-id: svn://10.65.10.50/trunk@15623 c028cbd2-c16b-5b4b-a496-9718f37d4682
		
			
				
	
	
		
			510 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			510 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
| #include <applicat.h>
 | ||
| #include <assoc.h>
 | ||
| #include <automask.h>
 | ||
| #include <currency.h>
 | ||
| #include <filetext.h>
 | ||
| #include <msksheet.h>
 | ||
| #include <printer.h>
 | ||
| #include <recarray.h>
 | ||
| #include <relation.h>
 | ||
| #include <sort.h>
 | ||
|    
 | ||
| #include "..\ve\velib.h"
 | ||
| 
 | ||
| #include "ps0544.h"
 | ||
| #include "ps0544200a.h"
 | ||
|  
 | ||
| class TServus_file: public TFile_text
 | ||
| {
 | ||
| protected:
 | ||
|   virtual void validate(TCursor& cur,TRecord_text& rec, TToken_string& val, TString& str);
 | ||
| 
 | ||
| public:
 | ||
|   TServus_file(const TString& file_name, const TString& config_name);
 | ||
|   virtual ~TServus_file() { }
 | ||
| };
 | ||
| 
 | ||
| TServus_file::TServus_file(const TString& file_name, const TString& config_name)
 | ||
|           : TFile_text(file_name, config_name)
 | ||
| {
 | ||
| }
 | ||
| 
 | ||
| class TServus_mask : public TAutomask
 | ||
| {
 | ||
| protected:
 | ||
|   bool on_field_event(TOperable_field& o, TField_event e, long jolly);
 | ||
| public:
 | ||
| 
 | ||
|   TServus_mask();
 | ||
|   
 | ||
|   virtual ~TServus_mask(){};
 | ||
| };
 | ||
|   
 | ||
| TServus_mask::TServus_mask() :TAutomask ("ps0544200a")
 | ||
| {
 | ||
| }  
 | ||
|   
 | ||
| bool TServus_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
 | ||
| { 
 | ||
|   return true;
 | ||
| }
 | ||
| 
 | ||
| class TServus : public TSkeleton_application
 | ||
| {                     
 | ||
| 	TCursor*				   _cur;
 | ||
|   TServus_mask*	 		 _msk;
 | ||
|   TDate							 _dataini, _datafin;
 | ||
|   TServus_file* 		 _trasfile;
 | ||
|   TConfig*					 _configfile;
 | ||
|   long							 _nrecords;
 | ||
| 	int								 _cont11, _cont12, _cont13;
 | ||
| 	TRiga_documento*	 _riga_doc_curr;
 | ||
| 	real							 _tot_mate, _tot_temp, _tot_mano, _tot_vari, _perc ;
 | ||
| 
 | ||
| virtual const char * extra_modules() const {return "ve";}
 | ||
|   
 | ||
| protected:
 | ||
|   virtual bool create(void);
 | ||
|   virtual bool destroy(void);
 | ||
|   virtual void main_loop() ;
 | ||
|   void azzera_totali() ;
 | ||
| 	void aggiorna_totali(const real& materiale, const real& tempi, const real& manodopera, const real& vari);
 | ||
|   void elabora_documenti();
 | ||
| 	
 | ||
|   static int calcola_tipo(const TRiga_documento& r);
 | ||
| 	static int righe_sort(const TObject** o1, const TObject** o2);
 | ||
| 
 | ||
| public:   
 | ||
| 	const long nrecords() { return _nrecords;};
 | ||
| 	const int nriga11() { return _cont11;};
 | ||
| 	const int nriga12() { return _cont12;};
 | ||
| 	const int nriga13() { return _cont13;};
 | ||
| 	const real& tot_temp() { return _tot_temp;};
 | ||
| 	const real& tot_mano() { return _tot_mano;};
 | ||
| 	const real& tot_vari() { return _tot_vari;};
 | ||
| 	const real& tot_mate() { return _tot_mate;};
 | ||
| 	const real& perc(const real& perc = -1);
 | ||
| 	const TRiga_documento& riga_doc_curr() { return *_riga_doc_curr;};
 | ||
| 	TConfig configfile() {return *_configfile;};
 | ||
|   TServus() {} ;
 | ||
|   virtual ~TServus() {} ;
 | ||
| };  
 | ||
| 
 | ||
| // restituisce un riferimento all' applicazione
 | ||
| inline TServus& app() { return (TServus&) main_app();}
 | ||
| 
 | ||
| // gestione dei messaggi estesi nei campi
 | ||
| void TServus_file::validate(TCursor& cur,TRecord_text &rec, TToken_string &s, TString& str)
 | ||
| {
 | ||
|   const TString code(s.get(0));
 | ||
|   TString valore;
 | ||
|   if (code == "_FISSO")
 | ||
|   {
 | ||
|     // gestione dei campi fissi per i record delle riba
 | ||
|     // sintassi: _FISSO,!<valore>
 | ||
|     // dove: <valore> <20> la stringa fissa da emettere
 | ||
|     TString in(s.get());
 | ||
|     CHECK(in[0]=='!',"Macro _FISSO senza carattere '!'");
 | ||
|     in.ltrim(1);
 | ||
|     in.trim();
 | ||
|     valore = in;
 | ||
|   }
 | ||
|   else if (code == "_TELEFONO")
 | ||
|   {
 | ||
|  		valore = cur.curr(LF_CLIFO).get("PTEL");
 | ||
|  		valore << " ";
 | ||
|  		valore << cur.curr(LF_CLIFO).get("TEL");
 | ||
|   }
 | ||
|   else if (code == "_VIRTUALE")
 | ||
|   {
 | ||
|  		TString in(s.get()); 	
 | ||
|  		valore = cur.curr().get(in);
 | ||
|   }
 | ||
|   else if (code == "_IMPORTO")
 | ||
|   {
 | ||
|  		valore = str;
 | ||
| 		valore.strip(".");
 | ||
|   }
 | ||
|   else if (code == "_DARIGA")
 | ||
|   {
 | ||
| 		valore = "";
 | ||
|  		TString in(s.get());
 | ||
| 		if (in == "IMPORTO")
 | ||
| 		{
 | ||
| 			real importo = app().riga_doc_curr().importo(true, false);
 | ||
| 			real perc = app().perc();
 | ||
| 			if (perc > 0)
 | ||
| 				importo = importo*perc/100;
 | ||
| 			valore = importo.string(0,2,'0');
 | ||
| 			valore.strip(".");
 | ||
| 		}
 | ||
| 		else if (in == "PREZZO")
 | ||
| 		{
 | ||
| 			real importo = app().riga_doc_curr().prezzo(false, false);
 | ||
| 			valore = importo.string(0,2,'0');
 | ||
| 			valore.strip(".");
 | ||
| 		}
 | ||
| 		else if (in == "SCONTO")
 | ||
| 		{
 | ||
| 			TString80 sconto = app().riga_doc_curr().get(RDOC_SCONTO);
 | ||
| 			real rs(sconto);
 | ||
| 			valore = rs.string(0,1,'0');
 | ||
| 			valore.strip(".");
 | ||
| 		}
 | ||
| 		else if (in == "QTA")
 | ||
| 		{
 | ||
| 			real qta = app().riga_doc_curr().quantita();
 | ||
| 			valore = qta.string(4,1,'0');
 | ||
| 			valore.strip(".");
 | ||
| 		}
 | ||
| 		else
 | ||
| 		{
 | ||
| 			real qta = app().riga_doc_curr().get_real(RDOC_QTAGG1);
 | ||
| 			valore = qta.string(0,2);
 | ||
| 			valore.strip(".");
 | ||
| 		}
 | ||
|   }
 | ||
|   else if (code == "_ANNO")
 | ||
|   {
 | ||
|  		TString in(s.get()); 	
 | ||
|  		TDate data = cur.curr().get(in);
 | ||
|  		in = data.string();
 | ||
|  		valore = in.mid(8,2);
 | ||
|   }
 | ||
|   else if (code == "_MESE")
 | ||
|   {
 | ||
|  		TString in(s.get()); 	
 | ||
|  		TDate data = cur.curr().get(in);
 | ||
|  		in = data.string();
 | ||
|  		valore = in.mid(3,2);
 | ||
|   }
 | ||
|   else if (code == "_GIORNO")
 | ||
|   {
 | ||
|  		TString in(s.get()); 	
 | ||
|  		TDate data = cur.curr().get(in);
 | ||
|  		in = data.string();
 | ||
|  		valore = in.mid(0,2);
 | ||
|   }
 | ||
|   else if (code == "_PARAMETRI")
 | ||
|   {
 | ||
|  		TString in(s.get()); 	
 | ||
|  		valore = app().configfile().get(in);
 | ||
|   }
 | ||
|   else if (code == "_OGGI")
 | ||
|   {
 | ||
|     TDate data(TODAY);
 | ||
|   	valore = data.string(brief, '-', full, full, amg_date);
 | ||
|   	valore.strip("-");
 | ||
|   }
 | ||
|   else if (code == "_ADESSO")
 | ||
|   {        
 | ||
|   	char time[128];
 | ||
|   	_strtime(time);
 | ||
|   	valore.format("%s", time);
 | ||
|   	valore.strip(":");
 | ||
|   }
 | ||
|   else if (code == "_NUMEROLAVORO")
 | ||
|   {
 | ||
| 		valore = str;
 | ||
|   	valore.strip("-");
 | ||
|   }
 | ||
|   else if (code == "_DATA")
 | ||
|   {
 | ||
| 		valore = str;
 | ||
|   	valore.strip("-");
 | ||
|   }
 | ||
|   else if (code == "_NRECORDS")
 | ||
|   {
 | ||
|   	valore.format("%ld", app().nrecords());
 | ||
|   }
 | ||
|   else if (code == "_RIGA")
 | ||
|   {
 | ||
|  		TString in(s.get()); 	
 | ||
| 		if (in == "11")
 | ||
| 	  	valore.format("%ld", app().nriga11());
 | ||
| 		else if (in == "12")
 | ||
| 	  	valore.format("%ld", app().nriga12());
 | ||
| 		else if (in == "13")
 | ||
| 	  	valore.format("%ld", app().nriga13());
 | ||
|   }
 | ||
|   else if (code == "_TOTALE")
 | ||
|   {
 | ||
| 		real totale;
 | ||
|  		TString in(s.get());
 | ||
| 		if (in == "TEMP")
 | ||
| 	  	totale = app().tot_temp();
 | ||
| 		else if (in == "MATE")
 | ||
| 	  	totale = app().tot_mate();
 | ||
| 		else if (in == "MANO")
 | ||
| 	  	totale = app().tot_mano();
 | ||
| 		else if (in == "VARI")
 | ||
| 	  	totale = app().tot_vari();
 | ||
| 		else if (in == "SOMM")
 | ||
| 			totale = app().tot_mano()+app().tot_mate();
 | ||
| 		valore = totale.string(0,2);
 | ||
| 		valore.strip(".");
 | ||
|   }
 | ||
|   else if (code == "_UPPERCASE")
 | ||
| 	{
 | ||
| 		valore = str;
 | ||
| 		valore.upper();
 | ||
| 	}
 | ||
|   else if (code == "_PERCENTUALE")
 | ||
| 	{
 | ||
| 		real perc(str);
 | ||
| 		valore = perc.string(0,0);
 | ||
| 		app().perc(perc);
 | ||
| 	}
 | ||
|   else NFCHECK("Macro non definita: %s", (const char *)code);
 | ||
|   
 | ||
|   str = valore;
 | ||
| }
 | ||
| 
 | ||
| bool TServus::create()
 | ||
| {      
 | ||
| 	open_files(LF_DOC, LF_CLIFO, LF_COMUNI, LF_CFVEN, 0);
 | ||
|   _msk = new TServus_mask();
 | ||
|   _trasfile = NULL;
 | ||
| 	_configfile = new TConfig("ps0544200a.ini", "TRASFERIMENTO");
 | ||
|   return TSkeleton_application::create();
 | ||
| }
 | ||
| 
 | ||
| bool TServus::destroy()
 | ||
| {             
 | ||
| 	if (_trasfile)  
 | ||
|   	delete _trasfile;
 | ||
| 	if (_configfile)  
 | ||
|   	delete _configfile;
 | ||
|   delete _msk;
 | ||
| 
 | ||
|   return TSkeleton_application::destroy();
 | ||
| }
 | ||
| 
 | ||
| const real& TServus::perc(const real& perc)
 | ||
| {
 | ||
| 	if (perc != -1)
 | ||
| 		_perc = perc;
 | ||
| 	return _perc;
 | ||
| 	
 | ||
| }
 | ||
| 
 | ||
| void TServus::azzera_totali()
 | ||
| {
 | ||
| 	_tot_mate	= ZERO;
 | ||
| 	_tot_temp	= ZERO;
 | ||
| 	_tot_mano	= ZERO;
 | ||
| 	_tot_vari	= ZERO;
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| void TServus::aggiorna_totali(const real& materiale, const real& tempi, const real& manodopera, const real& vari)
 | ||
| {
 | ||
| 	_tot_mate = _tot_mate+materiale;
 | ||
| 	_tot_temp = _tot_temp+tempi;
 | ||
| 	_tot_mano = _tot_mano+manodopera;
 | ||
| 	_tot_vari = _tot_vari+vari;
 | ||
| }
 | ||
| 
 | ||
| void TServus::main_loop()
 | ||
| {
 | ||
| 	TFilename filename = _configfile->get("NOMEFILE");
 | ||
| 	if (filename.exist())
 | ||
| 		remove(filename);
 | ||
|   while (_msk->run()!=K_QUIT)
 | ||
|   {                     
 | ||
|   	_trasfile = new TServus_file(filename, "ps0544200.ini");
 | ||
|   	_trasfile->open(filename,'w');
 | ||
|     _trasfile->force_record_separator(TRUE);
 | ||
|   	
 | ||
|     _dataini = _msk->get_date(F_DATAINI);
 | ||
|     _datafin = _msk->get_date(F_DATAFIN);
 | ||
| 		elabora_documenti(); 		
 | ||
| 		_trasfile->close();
 | ||
| 		delete _trasfile;
 | ||
| 		_trasfile = NULL;
 | ||
| 	}	
 | ||
| }
 | ||
| 
 | ||
| int TServus::calcola_tipo(const TRiga_documento& r)
 | ||
| {
 | ||
| 	const int tipo_riga = r.get_int(RDOC_TIPORIGA);
 | ||
| 	const bool art5 = r.get(RDOC_CODART) != "005";
 | ||
| 
 | ||
| 	if (tipo_riga == 6 && art5)
 | ||
| 		return 11;
 | ||
| 	if (tipo_riga == 1)
 | ||
| 		return 12;
 | ||
| 	if (tipo_riga == 6 && !art5)
 | ||
| 		return 13;
 | ||
| 
 | ||
| 	return 99;
 | ||
| }
 | ||
| 
 | ||
| int TServus::righe_sort(const TObject** o1, const TObject** o2)
 | ||
| {
 | ||
|   const TRiga_documento& r1 = *(const TRiga_documento*)*o1;
 | ||
|   const TRiga_documento& r2 = *(const TRiga_documento*)*o2;
 | ||
| 	const int t1 = calcola_tipo(r1);
 | ||
| 	const int t2 = calcola_tipo(r2);
 | ||
| 	return t1 - t2;
 | ||
| }	
 | ||
| 
 | ||
| 
 | ||
| void TServus::elabora_documenti()
 | ||
| {                
 | ||
|   TSheet_field& sheet = _msk->sfield(F_SHEETDOC);
 | ||
| 
 | ||
|   TRelation doc_rel(LF_DOC);
 | ||
|   doc_rel.add(LF_RIGHEDOC, "CODNUM==CODNUM|ANNO==ANNO|PROVV==PROVV|NDOC==NDOC");
 | ||
|   doc_rel.add(LF_CLIFO, "TIPOCF==TIPOCF|CODCF==CODCF");
 | ||
|   doc_rel.add(LF_COMUNI, "COM==COMCF", 1, LF_CLIFO);
 | ||
|   TRectype da(LF_DOC);
 | ||
|   TRectype a(LF_DOC);
 | ||
|   const long items = sheet.items();
 | ||
|   TString filt_expr;
 | ||
| 	//filt_expr = "(CONTRS != "") && ";
 | ||
| 	
 | ||
| 	_nrecords = 0;
 | ||
|   if (items > 0)
 | ||
|   {
 | ||
| 	  bool ok = TRUE;
 | ||
| 	  TString16 codnum;
 | ||
| 
 | ||
| 	  da.put("DATADOC", _dataini);
 | ||
| 	  a.put("DATADOC", _datafin);
 | ||
| 	  
 | ||
| 	  filt_expr << "(";
 | ||
| 	  FOR_EACH_SHEET_ROW(sheet, r, row)
 | ||
| 	  {
 | ||
| 	    codnum = row->get(0);
 | ||
| 	    if (codnum.not_empty())
 | ||
| 	    {
 | ||
| 	    	filt_expr << "(CODNUM==\"";
 | ||
| 	    	filt_expr << codnum << "\")||";
 | ||
| 	    }
 | ||
| 	  }
 | ||
| 	  filt_expr.rtrim(2);  
 | ||
| 	  filt_expr << ")";
 | ||
| 
 | ||
| 	  doc_rel.lfile().set_curr(new TDocumento);
 | ||
| 	  _cur = new TCursor(&doc_rel,filt_expr,3,&da,&a);
 | ||
| 	  const long cur_items = _cur ->items(); // Scorre tutti i documenti che rientrano nell'intervallo selezionato
 | ||
| 	  if (cur_items != 0) 
 | ||
| 	  {
 | ||
| 			TRecord_text rech;
 | ||
| 			rech.set_type("OP");
 | ||
| 			_trasfile->autoload(rech, *_cur); 
 | ||
| 			_trasfile->write(rech);
 | ||
| 			for (*_cur = 0; _cur->pos() < cur_items; ++(*_cur))
 | ||
| 			{
 | ||
| 				TString16 contrs = _cur->curr().get("CONTRS");
 | ||
| 				if (contrs.not_empty())
 | ||
| 				{
 | ||
| 					azzera_totali();				
 | ||
| 					TRecord_text rec;
 | ||
|   				rec.set_type("01");
 | ||
|   				_trasfile->autoload(rec, *_cur); 
 | ||
|   				_trasfile->write(rec);
 | ||
| 					_nrecords++;
 | ||
|   				rec.set_type("02");
 | ||
|   				_trasfile->autoload(rec, *_cur); 
 | ||
| 					_trasfile->write(rec);
 | ||
|   				_nrecords++;
 | ||
| 					TDocumento documento = doc_rel.curr();
 | ||
| 					documento.body(LF_RIGHEDOC).sort(righe_sort);
 | ||
| 					_cont11 = _cont12 = _cont13 = 0;
 | ||
| 					for (int i=1;i<=documento.rows();i++)
 | ||
| 					{             
 | ||
| 						const TRiga_documento& rec_rdoc = documento[i];
 | ||
| 						_riga_doc_curr = new TRiga_documento(rec_rdoc);
 | ||
| 						const int tipo_record = calcola_tipo(rec_rdoc);
 | ||
| 						if (tipo_record >= 11 && tipo_record <= 13)
 | ||
| 						{
 | ||
| 							doc_rel.curr(LF_RIGHEDOC) = rec_rdoc;
 | ||
| 
 | ||
| 							switch (tipo_record)
 | ||
| 							{
 | ||
| 							case 11:
 | ||
| 								{
 | ||
| 									rec.set_type("11");
 | ||
|   								_cont11++;
 | ||
| 									//real ore = rec_rdoc.get_real(RDOC_QTA);
 | ||
| 								}
 | ||
| 								break;
 | ||
| 							case 12:
 | ||
| 								{
 | ||
| 									rec.set_type("12");
 | ||
|   								_cont12++;
 | ||
| 									//real importo = rec_rdoc.get_real(RDOC_PREZZO);
 | ||
| 								}
 | ||
| 								break;
 | ||
| 							case 13:
 | ||
| 								{
 | ||
| 									rec.set_type("13");
 | ||
|   								_cont13++;
 | ||
| 									//real importo = rec_rdoc.get_real(RDOC_PREZZO);
 | ||
| 								}
 | ||
| 								break;
 | ||
| 							default:
 | ||
| 								break;
 | ||
| 							}
 | ||
|   						_trasfile->autoload(rec, *_cur); 
 | ||
|   						_trasfile->write(rec);
 | ||
| 							_nrecords++;
 | ||
| 							switch (tipo_record)
 | ||
| 							{
 | ||
| 							case 11:
 | ||
| 								{
 | ||
| 									real importo = rec_rdoc.importo(true, false);
 | ||
| 									real perc = app().perc();
 | ||
| 									if (perc > 0)
 | ||
| 										importo = importo*perc/100;
 | ||
| 									real ore = rec_rdoc.quantita();
 | ||
| 									aggiorna_totali(ZERO, ore, importo, ZERO);
 | ||
| 								}
 | ||
| 								break;
 | ||
| 							case 12:
 | ||
| 								{
 | ||
| 									real importo = rec_rdoc.importo(true, false);
 | ||
| 									real perc = app().perc();
 | ||
| 									if (perc > 0)
 | ||
| 										importo = importo*perc/100;
 | ||
| 									aggiorna_totali(importo, ZERO, ZERO, ZERO);
 | ||
| 								}
 | ||
| 								break;
 | ||
| 							case 13:
 | ||
| 								{
 | ||
| 									real importo = rec_rdoc.importo(true, false);
 | ||
| 									aggiorna_totali(ZERO, ZERO, ZERO, importo);
 | ||
| 								}
 | ||
| 								break;
 | ||
| 							default:
 | ||
| 								break;
 | ||
| 							}
 | ||
| 						}
 | ||
| 						delete _riga_doc_curr;
 | ||
| 					}  
 | ||
|   				rec.set_type("09");
 | ||
|   				_trasfile->autoload(rec, *_cur); 
 | ||
|   				_trasfile->write(rec);
 | ||
| 					_nrecords++;
 | ||
| 				}
 | ||
| 			}
 | ||
| 			TRecord_text recf;
 | ||
| 			recf.set_type("CL");
 | ||
| 			_trasfile->autoload(recf, *_cur); 
 | ||
| 			_trasfile->write(recf);
 | ||
| 		}                  
 | ||
| 	  delete _cur;
 | ||
| 	}  
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| int ps0544200(int argc, char **argv) 
 | ||
| {
 | ||
|   TServus a;
 | ||
|   a.run(argc, argv, "Trasferimento a SERVUS");
 | ||
|   return 0;
 | ||
| }
 | ||
| 
 |