Files correlati : pd6342 pd6342a.msk Ricompilazione Demo : [ ] Commento : Crea movimenti di quadratura git-svn-id: svn://10.65.10.50/branches/R_10_00@20961 c028cbd2-c16b-5b4b-a496-9718f37d4682
		
			
				
	
	
		
			352 lines
		
	
	
		
			8.9 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			352 lines
		
	
	
		
			8.9 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
| #include <progind.h>
 | |
| #include <recset.h>
 | |
| #include <textset.h>
 | |
| #include <utility.h>
 | |
| 
 | |
| #include "pd6342.h"
 | |
| #include "pd6342200a.h"
 | |
| 
 | |
| #include "../ca/movana.h"
 | |
| #include "../ca/rmovana.h"
 | |
| #include "../ca/calib01.h"
 | |
| #include "../ca/calib02.h"
 | |
| 
 | |
| class TImporta_da_BCS_rec : public TAS400_recordset
 | |
| {
 | |
| public:
 | |
| 	TImporta_da_BCS_rec(const char* filename);
 | |
| };
 | |
| 
 | |
| TImporta_da_BCS_rec::TImporta_da_BCS_rec(const char* filename)
 | |
|                    : TAS400_recordset(TString("AS400(130)\n") << filename)
 | |
| {
 | |
| 	create_field("ANNO",      0, 4,  _intfld);                //anno di competenza
 | |
|   create_field("MESE",      5, 2,  _intfld);                //mese di competenza
 | |
|   create_field("GIORNO",    8, 2,  _intfld);                //giorno di competenza
 | |
| 	create_field("CODCOSTO", 11, 15, _alfafld);               //centro di costo
 | |
|   create_field("PCONTI",   27, 15, _alfafld);               //centro di ricavo (o piano dei conti)
 | |
| 	create_field("IMPORTO",  43, 12, _realfld);               //importo lordo della prestazione moltiplicato per quantità
 | |
| 	create_field("SEGNO",    56, 1,  _alfafld);               //segno importo (+ o -)
 | |
| 	create_field("PROV",     59, 3,  _alfafld, true, "FAT");  //provenienza (valore fisso FAT)
 | |
| 	create_field("IDPROC",   62, 15, _alfafld);               //ID della procedura inviante
 | |
| 	create_field("CODPRES",  78, 8,  _alfafld);               //codice della prestazione
 | |
|   create_field("DESPRES",  87, 40, _alfafld);               //descrizione della prestazione
 | |
| }
 | |
| 
 | |
| static int sort_by_date(const TObject** o1, const TObject** o2)
 | |
| {
 | |
|   const TString& r1 = *(TString*)*o1;
 | |
|   const TString& r2 = *(TString*)*o2;
 | |
| 
 | |
|   const long d1 = (atol(r1.left(4)) * 10000) + (atol(r1.mid(5, 2)) * 100) + (atol(r1.mid(8, 2)));
 | |
|   const long d2 = (atol(r2.left(4)) * 10000) + (atol(r2.mid(5, 2)) * 100) + (atol(r2.mid(8, 2)));;
 | |
| 
 | |
|   return d1 - d2;
 | |
| }
 | |
| 
 | |
| 
 | |
| ///////////////////////////////////////////////////////////
 | |
| //  MASCHERA
 | |
| ///////////////////////////////////////////////////////////
 | |
| class TImporta_da_BCS_msk : public TAutomask
 | |
| {
 | |
| protected:
 | |
| 
 | |
| 
 | |
|   virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); 
 | |
| 	
 | |
| public:
 | |
|   TImporta_da_BCS_msk();
 | |
|   virtual ~TImporta_da_BCS_msk() {}
 | |
| };
 | |
| 
 | |
| bool TImporta_da_BCS_msk::on_field_event(TOperable_field& o, TField_event e, long jolly)
 | |
| {
 | |
|   /*switch(o.dlg())
 | |
|   {
 | |
|   default:
 | |
|     break;
 | |
|   }*/
 | |
|   return true;
 | |
| }
 | |
| 
 | |
| TImporta_da_BCS_msk::TImporta_da_BCS_msk() : TAutomask("pd6342200a")
 | |
| {
 | |
| }
 | |
| 
 | |
| ///////////////////////////////////////////////////////////
 | |
| // APPLICAZIONE
 | |
| ///////////////////////////////////////////////////////////
 | |
| 
 | |
| class TImporta_da_BCS_app : public TSkeleton_application
 | |
| {
 | |
|   TImporta_da_BCS_msk* _mask;
 | |
|   TConfig*					   _configfile;
 | |
|   bool _has_ca;
 | |
| 
 | |
| protected:
 | |
|   virtual bool check_autorization() const {return false;}
 | |
|   virtual const char * extra_modules() const {return "ca";}
 | |
| 
 | |
|   virtual bool create(void);
 | |
|   virtual bool destroy(void);
 | |
| 
 | |
|   void sposta_file(const TString& file);
 | |
|   void genera_movana(const TFilename& file);
 | |
| 
 | |
|   void ini2mask();
 | |
|   void mask2ini();
 | |
| 
 | |
|   bool elabora();
 | |
| 
 | |
| public:
 | |
|   virtual void main_loop();
 | |
| 
 | |
| };
 | |
| 
 | |
| void TImporta_da_BCS_app::mask2ini()
 | |
| {
 | |
| 	//carica i parametri del file di configurazione
 | |
| 	_configfile->set_paragraph("MAIN");
 | |
|   for (int i = 0; i < _mask->fields() ; i++)
 | |
| 	{
 | |
| 		TMask_field& f = _mask->fld(i);
 | |
| 		const TFieldref* fr = f.field();
 | |
| 		if (fr != NULL)
 | |
| 			_configfile->set(fr->name(), f.get());
 | |
| 	}
 | |
| }
 | |
| 
 | |
| void TImporta_da_BCS_app::ini2mask()
 | |
| {
 | |
| 	//carica i parametri del file di configurazione
 | |
| 	_configfile->set_paragraph("MAIN");
 | |
|   for (int i = 0; i < _mask->fields() ; i++)
 | |
| 	{
 | |
| 		TMask_field& f = _mask->fld(i);
 | |
| 		const TFieldref* fr = f.field();
 | |
| 		if (fr != NULL)
 | |
| 		{
 | |
| 			const TString& val = _configfile->get(fr->name());
 | |
| 			f.set(val);
 | |
| 		}
 | |
| 	}
 | |
| }
 | |
| 
 | |
| void TImporta_da_BCS_app::sposta_file(const TString& file)
 | |
| {
 | |
|   TFilename fileori = file;
 | |
|   TFilename path = fileori.path();
 | |
|   path.add("elaborati");
 | |
|   make_dir(path);
 | |
| 
 | |
|   TString strname;
 | |
|   strname.format("%06d_%06d_%s", TDate(TODAY).date2ansi(), daytime(), (const char*)fileori.name());  
 | |
|   TFilename filedest = path;
 | |
|   filedest.add(strname);
 | |
|   fcopy(fileori, filedest);
 | |
|   fileori.fremove();
 | |
|   
 | |
| }
 | |
| 
 | |
| void TImporta_da_BCS_app::genera_movana(const TFilename& file)
 | |
| {
 | |
|   TLocalisamfile fmov(LF_MOVANA);  
 | |
|   
 | |
|   TDate dataold(NULLDATE);
 | |
|   
 | |
|   const TDate oggi(TODAY);
 | |
|   const TString4 codcau = _mask->get(F_CODCAU);
 | |
| 
 | |
|   TAnal_mov ana(0);
 | |
| 
 | |
|   TImporta_da_BCS_rec recset(file);
 | |
|   recset.sort(sort_by_date);
 | |
| 
 | |
|   TImporto totale;
 | |
| 
 | |
|   TProgind pi(recset.items(), "Importazione in corso...", true, true);
 | |
| 
 | |
|   for(bool ok = recset.move_first(); ok; ok = recset.move_next())
 | |
|   {
 | |
|     if (!pi.addstatus(1)) 
 | |
| 		  break;
 | |
|     
 | |
|     const int anno   = recset.get("ANNO").as_int();
 | |
| 
 | |
|     if(anno <= 0)
 | |
|       continue;
 | |
| 
 | |
|     const int mese   = recset.get("MESE").as_int();
 | |
|     const int giorno = recset.get("GIORNO").as_int();
 | |
|     const TDate data(recset.get("GIORNO").as_int(), recset.get("MESE").as_int(), anno);
 | |
| 
 | |
|     if(data != dataold)
 | |
|     {
 | |
|       if (!ana.empty())
 | |
|       {
 | |
|         ana.put(MOVANA_SEZIONE, totale.sezione());
 | |
|         ana.put(MOVANA_TOTDOC,  totale.valore());
 | |
|         ana.rewrite_write(fmov);
 | |
| 
 | |
|         totale.reset();
 | |
|       }
 | |
|       
 | |
|       ana.zero();
 | |
|       ana.put(MOVANA_ANNOES,    anno);
 | |
|       ana.put(MOVANA_DATAREG,   oggi);
 | |
|       ana.put(MOVANA_DATACOMP,  data);
 | |
|       ana.put(MOVANA_CODCAUS,   codcau);
 | |
|       ana.put(MOVANA_DESCR,     "Movimento Importato");
 | |
|       ana.put(MOVANA_TRASFERITO, true);
 | |
| 
 | |
|       dataold = data;
 | |
|     }
 | |
| 
 | |
|     TRectype& riga = ana.new_row();
 | |
| 
 | |
|     TString16 impstr;
 | |
|     impstr << recset.get("SEGNO").as_string()[0] << recset.get("IMPORTO").as_string();
 | |
|     const real imp(impstr);
 | |
| 
 | |
|     TImporto importo('A', imp);
 | |
|     importo.normalize();
 | |
| 
 | |
|     TString16 cod = recset.get("CODPRES").as_string();  cod.trim();
 | |
|     TString80 descrizione;
 | |
|     descrizione << cod << '-' << recset.get("DESPRES").as_string();
 | |
| 
 | |
|     TString80 codcosto = recset.get("CODCOSTO").as_string();
 | |
| 
 | |
|     //il codcosto va formattato in base alla configurazione dell'analitica
 | |
|     const TMultilevel_code_info& cdcinfo = ca_multilevel_code_info(LF_CDC);
 | |
|     const TMultilevel_code_info& cominfo = ca_multilevel_code_info(LF_COMMESSE);
 | |
|     const TMultilevel_code_info& fasinfo = ca_multilevel_code_info(LF_FASI);
 | |
|     
 | |
|     int par_level;
 | |
|     int from = 0;
 | |
|     int len = 0;
 | |
| 
 | |
|     //centro di costo
 | |
|     switch(cdcinfo.parent())
 | |
|     {
 | |
|     case LF_COMMESSE: par_level = cominfo.levels(); break;
 | |
|     case LF_FASI    : par_level = fasinfo.levels(); break;
 | |
|     default         : par_level = 0;                break;
 | |
|     }
 | |
|     const int livcdc = cdcinfo.levels() - par_level;
 | |
| 
 | |
|     if(livcdc > 0)
 | |
|     {
 | |
|       for(int i = 0; i < livcdc; i++)
 | |
|         len += cdcinfo.len(i);
 | |
|       riga.put(RMOVANA_CODCCOSTO, codcosto.mid(from, len));
 | |
|     }
 | |
|     from += len;
 | |
|     len = 0;
 | |
| 
 | |
|     //commesse
 | |
|     switch(cominfo.parent())
 | |
|     {
 | |
|     case LF_CDC  : par_level = cdcinfo.levels(); break;
 | |
|     case LF_FASI : par_level = fasinfo.levels(); break;
 | |
|     default      : par_level = 0;                break;
 | |
|     }
 | |
|     const int livcom = cominfo.levels() - par_level;
 | |
|     
 | |
|     if(livcom > 0)
 | |
|     {
 | |
|       for(int i = 0; i < livcom; i++)
 | |
|         len += cominfo.len(i);
 | |
|       riga.put(RMOVANA_CODCMS, codcosto.mid(from, len));
 | |
|     }
 | |
|     from += len;
 | |
|     len = 0;
 | |
| 
 | |
|     //fasi
 | |
|     switch(fasinfo.parent())
 | |
|     {
 | |
|     case LF_CDC      : par_level = cdcinfo.levels(); break;
 | |
|     case LF_COMMESSE : par_level = cominfo.levels(); break;
 | |
|     default          : par_level = 0;                break;
 | |
|     }
 | |
|     const int livfas = fasinfo.levels() - par_level;
 | |
| 
 | |
|     if(livfas > 0)
 | |
|     {
 | |
|       for(int i = 0; i < livfas; i++)
 | |
|         len += fasinfo.len(i);
 | |
|       riga.put(RMOVANA_CODFASE, codcosto.mid(from, len));
 | |
|     }
 | |
|     from += len;
 | |
| 
 | |
|     riga.put(RMOVANA_ANNOES, anno);
 | |
|     riga.put(RMOVANA_SEZIONE, importo.sezione());
 | |
|     riga.put(RMOVANA_DATACOMP, data);
 | |
|     riga.put(RMOVANA_CODCONTO, recset.get("PCONTI").as_string());
 | |
|     riga.put(RMOVANA_DESCR, descrizione);
 | |
|     riga.put(RMOVANA_IMPORTO, importo.valore());
 | |
| 
 | |
|     totale += importo;
 | |
|   }
 | |
| 
 | |
|   if (!ana.empty())
 | |
|   {
 | |
|     ana.put(MOVANA_SEZIONE, totale.sezione());
 | |
|     ana.put(MOVANA_TOTDOC,  totale.valore());
 | |
|     ana.rewrite_write(fmov);
 | |
|   }  
 | |
| }
 | |
| 
 | |
| 
 | |
| bool TImporta_da_BCS_app::elabora()
 | |
| {
 | |
|   TFilename file = _mask->get(F_FILE);
 | |
| 
 | |
|   if(file.exist())
 | |
|   {
 | |
|     genera_movana(file);
 | |
|     sposta_file(file);
 | |
|   }
 | |
|   else
 | |
|   {
 | |
|     error_box(TR("Il file selezionato non esiste; si prega di controllare"));
 | |
|     return false;
 | |
|   }
 | |
| 
 | |
|   return true;
 | |
| }
 | |
| 
 | |
| bool TImporta_da_BCS_app::create()
 | |
| {      
 | |
| 	_configfile = new TConfig("pd6342conf.ini", "MAIN");
 | |
|   return TSkeleton_application::create();
 | |
| }
 | |
| 
 | |
| bool TImporta_da_BCS_app::destroy()
 | |
| {             
 | |
|  	delete _configfile;
 | |
|   return TSkeleton_application::destroy();
 | |
| }
 | |
| 
 | |
| void TImporta_da_BCS_app::main_loop()
 | |
| {
 | |
| 
 | |
|   _mask = new TImporta_da_BCS_msk;
 | |
| 
 | |
|   ini2mask();
 | |
| 	
 | |
|   if (_mask->run() == K_ENTER)
 | |
|   {		
 | |
| 		mask2ini();
 | |
|     if (elabora())
 | |
| 		  message_box(TR("Importazione righe terminata"));
 | |
|   }
 | |
| }
 | |
| 
 | |
| int pd6342200(int argc, char* argv[])
 | |
| {
 | |
|   TImporta_da_BCS_app imp_anal;
 | |
|   imp_anal.run(argc, argv, TR("Importa Movimenti Analitici"));
 | |
|   return 0;
 | |
| } |