From ba7cfa90794cb8dabc20df303fa0c3e3482b6d35 Mon Sep 17 00:00:00 2001
From: luca <luca@c028cbd2-c16b-5b4b-a496-9718f37d4682>
Date: Thu, 3 Nov 2005 18:38:07 +0000
Subject: [PATCH] Patch level         :2.1 nopatch per ora Files correlati    
 : Ricompilazione Demo : [ ] Commento            :programma proforma in corso
 d'opera

git-svn-id: svn://10.65.10.50/trunk@13469 c028cbd2-c16b-5b4b-a496-9718f37d4682
---
 cg/cg7200.cpp   | 586 ++++++++++++++++++++++++++----------------------
 cg/cg7200a.uml  |  33 +--
 cg/proforma.ini |  16 +-
 3 files changed, 338 insertions(+), 297 deletions(-)

diff --git a/cg/cg7200.cpp b/cg/cg7200.cpp
index 08aaf4c2b..0b73fba8f 100755
--- a/cg/cg7200.cpp
+++ b/cg/cg7200.cpp
@@ -12,6 +12,7 @@
 
 #include "cg7.h"
 #include "cg7200a.h"
+#include "cglib01.h"
 
 #include <mov.h>
 #include <rmov.h>
@@ -19,6 +20,10 @@
 #include <pagsca.h>
 #include <partite.h>
 
+#include "../ca/calib01.h"
+#include "../ca/movana.h"
+#include "../ca/rmovana.h"
+
 #define ALIAS_PCON1		100
 #define ALIAS_PCON2		200
 #define ALIAS_ABPCON1	300
@@ -30,12 +35,12 @@ protected:
   virtual void validate(TCursor& cur,TRecord_text &rec, TToken_string &val, TString& str);
 
 public:
-  TInvioP_file(const TString& file_name, const TString& config_name);
+  TInvioP_file(const TString& file_name);
   virtual ~TInvioP_file() { }
 };
 
-TInvioP_file::TInvioP_file(const TString& file_name, const TString& config_name)
-          : TFile_text(file_name, config_name)
+TInvioP_file::TInvioP_file(const TString& file_name)
+          : TFile_text(file_name, "proforma.ini")
 {
 }
 
@@ -74,28 +79,31 @@ bool TInvioP_mask::on_field_event(TOperable_field& o, TField_event e, long jolly
 
 class TInvioP : public TSkeleton_application
 {                     
-	TCursor*				   _cur;
-  TInvioP_mask* 		 _msk;
-  TInvioP_file*			 _trasfile;
-	TInvioP_file*			 _trasfilepag;
-  TDate							 _dataini, _datafin;
-	long							 _nregcosto, _nregpag;
-	real							 _importo;
-  
+	TCursor*				  _cur;
+  TInvioP_mask* 		_msk;
+  TDate							_dataini, _datafin;
+	long							_nregcosto, _nregpag;
+	real							_importo;
+  TConfig*					_configfile;
+
 protected:
   virtual bool create(void);
   virtual bool destroy(void);
   virtual void main_loop() ;
   void invio_proforma();
-  bool i_proforma_movimenti(const bool pagamenti);
-  bool i_proforma_righe();
-  bool i_proforma_pagamenti(const TCursor& cur);
+  bool i_proforma_movimenti();
+  bool i_proforma_righe(TCursor& cur, TInvioP_file* trasfile);
+  bool i_proforma_pagamenti();
   bool i_proforma_clifor(char tipocf = 'C');
   bool i_proforma_conti();
+
 public:
 	const real get_importo() {return _importo;};
 	const char* get_nregcosto() {return format("%d", _nregcosto);};
 	const char* get_nregpag() {return format("%d", _nregpag);};
+	TInvioP_file* apri_file(const char* nome);
+	void chiudi_file(TInvioP_file* trasfile);
+
   TInvioP() {};
   virtual ~TInvioP() {};
 };  
@@ -161,71 +169,30 @@ void TInvioP_file::validate(TCursor& cur,TRecord_text &rec, TToken_string &s, TS
   str = valore;
 }
 
-bool TInvioP::create()
-{               
-	open_files(LF_CAUSALI, LF_CLIFO, LF_PCON, LF_MOV, LF_RMOV, LF_RMOVIVA, LF_ABPCON, LF_PARTITE, 0);
-  _msk = new TInvioP_mask();
-  _trasfile = NULL;
-  _trasfilepag = NULL;
-  return TSkeleton_application::create();
-}
-
-bool TInvioP::destroy()
-{             
-	if (_trasfile)  
-  	delete _trasfile;
-	if (_trasfilepag)  
-  	delete _trasfilepag;
-  delete _msk;
-
-  return TSkeleton_application::destroy();
-}
-
-void TInvioP::main_loop()
+TInvioP_file* TInvioP::apri_file(const char* nome)
 {
-	TFilename configname = "cg7200a.ini";
-	TConfig configfile(configname);
-	_msk->set(F_DATAINI, configfile.get("DATA","OPZIONI"));
-	_msk->set(F_DESTINAZIONE, configfile.get("PERCORSO","OPZIONI"));
+	TFilename filename = _msk->get(F_DESTINAZIONE);
+	filename.add(nome);
+	filename.ext("txt");
+	if (filename.exist())
+		remove(filename);
 
-  while (_msk->run()!=K_QUIT)
-  {                                  
-  	configfile.set("DATA", _msk->get_date(F_DATAFIN),"OPZIONI");
-  	configfile.set("PERCORSO", _msk->get(F_DESTINAZIONE),"OPZIONI");
-  	_dataini = _msk->get_date(F_DATAINI);
-  	_datafin = _msk->get_date(F_DATAFIN);
-		const char tipoinvio = _msk->get(F_TIPOINVIO)[0];
-		if (tipoinvio == 'P')
-			invio_proforma();
-	}	
+	TInvioP_file* trasfile = new TInvioP_file(filename);
+	trasfile->open(filename,'w');
+	trasfile->force_record_separator();
+	return trasfile;
 }
 
-void TInvioP::invio_proforma()
+void TInvioP::chiudi_file(TInvioP_file* trasfile)
 {
-	if (_msk->get_bool(F_MOVIMENTI))
-	{
-		i_proforma_movimenti(_msk->get_bool(F_PAGAMENTI));
-		i_proforma_righe();
-  }
-	if (_msk->get_bool(F_CLIENTI))
-		i_proforma_clifor();
-	if (_msk->get_bool(F_FORNITORI))
-		i_proforma_clifor('F');
-	if (_msk->get_bool(F_CONTI))
-		i_proforma_conti();
+	trasfile->close();
+	delete trasfile;
 }
 
 bool TInvioP::i_proforma_conti()
 {
-	TFilename configname = "proforma.ini";
-	TConfig configfile(configname);
-	TFilename filename = _msk->get(F_DESTINAZIONE);
-	filename.add("pianocon.txt");
-	if (fexist(filename))
-		remove(filename);	
-	_trasfile = new TInvioP_file(filename, configname);
-	_trasfile->open(filename,'w');
-	_trasfile->force_record_separator();
+	TInvioP_file* trasfile = apri_file("pianocon");
+
   TRelation rel(LF_PCON);
   TCursor cur(&rel);
   const long cur_items = cur.items();
@@ -237,226 +204,244 @@ bool TInvioP::i_proforma_conti()
     {
 			TRecord_text rec;
 			rec.set_type("P");
-			_trasfile->autoload(rec, cur); 
-			_trasfile->write(rec);
+			trasfile->autoload(rec, cur); 
+			trasfile->write(rec);
     }	
   }                  
-	_trasfile->close();
-	delete _trasfile;
-	_trasfile = NULL;
-  return TRUE;
+	chiudi_file(trasfile);
+  return true;
 }
 
-bool TInvioP::i_proforma_movimenti(const bool pagamenti)
+bool TInvioP::i_proforma_movimenti()
 {
-	TFilename configname = "proforma.ini";
-	TConfig configfile(configname);
-	TFilename filename = _msk->get(F_DESTINAZIONE);
-	filename.add("registra.txt");
-	if (fexist(filename))
-		remove(filename);	
-	_trasfile = new TInvioP_file(filename, configname);
-	_trasfile->open(filename,'w');
-	_trasfile->force_record_separator();
-	if (pagamenti)
-	{
-		TFilename filenamepag = _msk->get(F_DESTINAZIONE);
-		filenamepag.add("pagament.txt");
-		if (fexist(filenamepag))
-			remove(filenamepag);	
-		_trasfilepag = new TInvioP_file(filenamepag, configname);
-		_trasfilepag->open(filenamepag,'w');
-		_trasfilepag->force_record_separator();
-	}
-	TRectype da(LF_MOV);
-  TRectype a(LF_MOV);
-  da.put(MOV_DATAREG, _dataini);
-  a.put(MOV_DATAREG, _datafin);
-  TRelation rel(LF_MOV);
-  rel.add(LF_CAUSALI, "CODCAUS==CODCAUS", 1);
-  TCursor cur(&rel, "", 2, &da, &a);
+	TInvioP_file* trasfile = apri_file("registra");	//file testate 
+	TInvioP_file* trasfilerighe = apri_file("righe");  //file righe movimenti
+
+	//trasferimento testate movimenti (cerca direttamente sui movimenti analitici in chiave 2..
+	//..,cio� per DATACOMP e con NUMREGCG!=0
+	TRectype da(LF_MOVANA);
+  TRectype a(LF_MOVANA);
+  da.put(MOVANA_DATACOMP, _dataini);
+  a.put(MOV_DATACOMP, _datafin);
+  TRelation rel(LF_MOVANA);
+	rel.add(LF_MOV, "NUMREG==NUMREGCG");
+	rel.add(LF_CAUSALI, "CODCAUS==CODCAUS");
+  TCursor cur(&rel, "NUMREGCG!=0", 2, &da, &a);
 
   const long cur_items = cur.items();
   if (cur_items != 0) 
-  {               
+  { 
+		//prepara i record di tipo testata da scrivere
+		TRecord_text rec;
+		rec.set_type("T");
+
 	  cur.freeze();
-    TRectype& cur_rec = cur.curr();
+    const TRectype& cur_rec = cur.curr();
     for (cur = 0; cur.pos() < cur_items; ++(cur))
-		{                                                    
-			TRecord_text rec;
-			rec.set_type("T");
-			_trasfile->autoload(rec, cur); 
-			_trasfile->write(rec);
-			if (pagamenti)
-				i_proforma_pagamenti(cur);
+		{
+			//carica e scrive il record di testata in base alle informazioni contenute nel proforma.ini
+			trasfile->autoload(rec, cur); 
+			trasfile->write(rec);
+			//trasferisce le righe del movimento analitico corrente solo
+			i_proforma_righe(cur, trasfilerighe);
     }	
-  } 
-	_trasfile->close();
-	delete _trasfile;
-	_trasfile = NULL;
-	if (pagamenti)
+  }
+	chiudi_file(trasfilerighe);
+	chiudi_file(trasfile);
+	return true;                 
+}
+
+bool TInvioP::i_proforma_righe(TCursor& cur, TInvioP_file* trasfilerighe)
+{
+	//---- righe movimenti analitica ----
+	//necessita del numreg del corrente movimento analitico per poterlo istanziare e prenderne le righe
+	const long numreg = cur.curr().get_long(MOVANA_NUMREG);
+	TAnal_mov analmov(numreg);	//..istanzia il movimento analitico cercato..
+	int i;
+	for (i = 1; i <= analmov.body().rows(); i++)
 	{
-		_trasfilepag->close();
-		delete _trasfilepag;
-		_trasfilepag = NULL;
+		//..e scandisce le righe alla ricerca di quelle con conto = gruppo/conto/sottoconto del movimento contabile
+		const TRectype& riga = analmov.body().row(i);	
+		//inganno il cursore passandogli la riga analitica in esame
+		cur.curr(LF_RMOVANA) = riga;
+
+		TRecord_text recrighe;
+		recrighe.set_type("R");
+		trasfilerighe->autoload(recrighe, cur); 
+		trasfilerighe->write(recrighe);
 	}
-	return TRUE;                 
-}
 
-bool TInvioP::i_proforma_righe()
-{
-	TFilename configname = "proforma.ini";
-	TConfig configfile(configname);
-	TFilename filename = _msk->get(F_DESTINAZIONE);
-	filename.add("righe.txt");
-	if (fexist(filename))
-		remove(filename);	
-	_trasfile = new TInvioP_file(filename, configname);
-	_trasfile->open(filename,'w');
-	_trasfile->force_record_separator();
-  TRectype da(LF_MOV);
-  TRectype a(LF_MOV);
-  da.put(MOV_DATAREG, _dataini);
-  a.put(MOV_DATAREG, _datafin);
-  TRelation rel(LF_MOV);
-  rel.add(LF_RMOVIVA, "NUMREG==NUMREG", 1);
-  rel.add(LF_RMOV, "NUMREG==NUMREG", 1);
-  rel.add(LF_PCON, "GRUPPO==GRUPPO|CONTO==CONTO|SOTTOCONTO==SOTTOCONTO", 1, LF_RMOV, ALIAS_PCON1);
-  rel.add(LF_PCON, "GRUPPO==GRUPPO|CONTO==CONTO|SOTTOCONTO==SOTTOCONTO", 1, LF_RMOVIVA, ALIAS_PCON2);
-  rel.add(LF_ABPCON, "CODCBL==CODCBL", 1, -ALIAS_PCON1, ALIAS_ABPCON1);
-  rel.add(LF_ABPCON, "CODCBL==CODCBL", 1, -ALIAS_PCON2, ALIAS_ABPCON2);
-  TCursor cur(&rel, "", 2, &da, &a);
-  const long cur_items = cur.items();
-  if (cur_items != 0) 
-  {               
-	  cur.freeze();
-    TRectype& cur_rec = cur.curr();
-    for (cur = 0; cur.pos() < cur_items; ++(cur))
-    {                                                    
-			const long numreg = cur.curr().get_long(MOV_NUMREG);
- 			bool continua = TRUE;
- 			while (continua)
- 			{                                                   
- 				const long numregrig = cur.curr(LF_RMOVIVA).get_long(RMI_NUMREG);
- 				if (numreg == numregrig)
- 				{      
-			    TRectype& cur_rec_righe = cur.curr(LF_RMOVIVA);
-					TRecord_text recrighe;
-					recrighe.set_type("I");
-					_trasfile->autoload(recrighe, cur); 
-					_trasfile->write(recrighe);
- 				}
-		  	continua = cur.next_match(LF_RMOVIVA, "NUMREG");
- 			}	
- 			continua = TRUE;
- 			while (continua)
- 			{                                                   
- 				const long numregrig = cur.curr(LF_RMOV).get_long(RMV_NUMREG);
- 				if (numreg == numregrig)
- 				{      
-			    TRectype& cur_rec_righe = cur.curr(LF_RMOV);
-					TRecord_text recrighe;
-					recrighe.set_type("R");
-					_trasfile->autoload(recrighe, cur); 
-					_trasfile->write(recrighe);
- 				}
-		  	continua = cur.next_match(LF_RMOV, "NUMREG");
- 			}	
-    }	
-  }                  
-	_trasfile->close();
-	delete _trasfile;
-	_trasfile = NULL;
-	return TRUE;
-}
+	//---- righe iva ----
+	//adesso tocca alle righe iva...e sara' un casino indicibile!
+	const char* numregcg = analmov.get(MOVANA_NUMREGCG);
+	//record_array con le righe iva aventi il numreg = numregcg analitico
+  TRecord_array righeiva(numregcg, LF_RMOVIVA);
+	//assoc array contenente tutti i diversi conti che incontrera' nello scanning delle righe iva
+	TAssoc_array conti;
 
-bool TInvioP::i_proforma_pagamenti(const TCursor& cur)
-{
-	const char tipomov = cur.curr().get(MOV_TIPOMOV)[0];
-	if (tipomov == '3' || tipomov == '2' || tipomov == '6')
+	//scanning delle righe iva alla ricerca dei conti che compaiono
+	for (int j = 1; j <= righeiva.rows(); j++)
 	{
-		TRelation relpart(LF_PARTITE);
-		TRectype da(LF_PARTITE);
-		da.put(PART_NREG, cur.curr().get(MOV_NUMREG));
-		TCursor curpart(&relpart,	"", 2, &da, &da);
-	  const long curpart_items = curpart.items();
-		if (curpart_items != 0) 
-		{               
-			curpart.freeze();
-			TRectype& curpart_rec = curpart.curr();
-			for (curpart = 0; curpart.pos() < curpart_items; ++(curpart))
-			{
-				TRelation relpag(LF_PAGSCA);
-				TRectype da(LF_PAGSCA);
-				da.put(PAGSCA_TIPOC, curpart_rec.get(PART_TIPOCF));
-				da.put(PAGSCA_GRUPPO, curpart_rec.get(PART_GRUPPO));
-				da.put(PAGSCA_CONTO, curpart_rec.get(PART_CONTO));
-				da.put(PAGSCA_SOTTOCONTO, curpart_rec.get(PART_SOTTOCONTO));
-				da.put(PAGSCA_ANNO, curpart_rec.get(PART_ANNO));
-				da.put(PAGSCA_NUMPART, curpart_rec.get(PART_NUMPART));
-				const int nrigapart = curpart_rec.get_int(PART_NRIGA);
-				TString80 filtro;
-				filtro.format("NRIGP == %d", nrigapart);
-				TCursor curpag(&relpag, filtro, 1, &da, &da);
-				const long curpag_items = curpag.items();
-				if (curpag_items != 0) 
-				{  
-					TAssoc_array pagame;
-					pagame.destroy();
-					curpag.freeze();
-					TRectype& curpag_rec = curpag.curr();
-					for (curpag = 0; curpag.pos() < curpag_items; ++(curpag))
-					{
-						TString80 indice = curpag_rec.get(PAGSCA_ANNO);
-						indice << '|' << curpag_rec.get(PAGSCA_NUMPART);
-						indice << '|' << curpag_rec.get(PAGSCA_NRIGA);
-						real importo = ZERO;
-				    bool is_key = pagame.is_key(indice);
-						real& somma = is_key ? (real&) pagame[indice] : importo;
-						somma += curpag_rec.get_real(PAGSCA_IMPORTO);
-					  if (!is_key)
-							pagame.add(indice, somma);
-					}
-					// scrivo i record risultanti
-					real* cp;
-				  for (cp = (real*) pagame.first_item(); cp != NULL; cp = (real*) pagame.succ_item())
-					{
-						TToken_string keypart;
-						keypart.add(curpart_rec.get(PART_TIPOCF));
-						keypart.add(curpart_rec.get(PART_GRUPPO));
-						keypart.add(curpart_rec.get(PART_CONTO));
-						keypart.add(curpart_rec.get(PART_SOTTOCONTO));
-						keypart.add(pagame.get_hashobj()->key());
-						const TRectype& partita = cache().get(LF_PARTITE, keypart);
-						_nregpag = cur.curr().get_long(MOV_NUMREG);
-						_nregcosto = partita.get_long(PART_NREG);
-						_importo = *cp;
-						TRecord_text recpag;
-						recpag.set_type("G");
-						_trasfilepag->autoload(recpag, curpag); 
-						_trasfilepag->write(recpag);
-					}
-				}
-			}
+		//prende il conto e lo mette nell'assoc_array dei conti (notare che, essendo un assoc_array,..
+		//..non vengono inseriti doppioni! mitico!!)
+		TBill conto;
+		conto.get(righeiva[j]);
+		const char* codconto = conto.string(8);
+
+		//ad ogni conto lega un assoc_array (codivae) che conterra' tutti i codici iva legati a quel..
+		//..conto nelle righe iva con i relativi importi
+		TAssoc_array* codivae = (TAssoc_array*) conti.objptr(codconto);
+		if (codivae == NULL)	//se non esiste l'assoc_array legato al conto lo crea
+		{
+			codivae = new TAssoc_array;
+			//aggiunge all'assoc_array conti il suo elemento assoc_array codivae..ho un assoc_array..
+			//..di assoc_array!
+			conti.add(codconto, codivae);
+		}
+
+		TString16 codiva = righeiva[j].get(RMI_CODIVA);	//prende il codice iva dalla riga iva
+		//aggiungere qui eventuale numero di indetraibile
+
+		//ad ogni codiva presente in codivae lega un importo che risultera' la somma di tutti gli..
+		//..importi con lo stesso conto e codice iva
+		real* tot_imp = (real*) codivae->objptr(codiva);
+		if (tot_imp == NULL)	//se non esiste l'importo legato al codice iva lo crea
+		{
+			tot_imp = new real;
+			//aggiunge all'assoc_array codivae il suo elemento real tot_imp
+			codivae->add(codiva, tot_imp);
+		}
+		
+		//accresce l'importo tot_imp relativo alla coppia codiva+codconto corrente
+		*tot_imp += righeiva[j].get_real(RMI_IMPONIBILE);
+		//aggiungere qui eventuale imposta
+	}
+
+	for (i = 1; i <= analmov.body().rows(); i++)
+	{
+		//scanning delle righe analitiche per estrarne i conti e controllare se compaiono nell'assoc_array..
+		//..dei conti riempito con i conti trovati nelle righe iva
+		const TRectype& riga = analmov.body().row(i);
+		const TString& codconto = riga.get(RMOVANA_CODCONTO);
+		TAssoc_array* codivae = (TAssoc_array*) conti.objptr(codconto);	//assoc_array codivae del codconto
+
+		//se ho almeno un codice iva assocoato a questo conto nell'assoc_array dei conti
+		if (codivae != NULL)
+		{
 		}
 	}
-	return TRUE;
+	
+
+	return true;
+}
+
+bool TInvioP::i_proforma_pagamenti()
+{
+	TInvioP_file* trasfilepag = apri_file("pagament");
+	
+	TRectype da(LF_MOVANA);
+  TRectype a(LF_MOVANA);
+  da.put(MOVANA_DATACOMP, _dataini);
+  a.put(MOV_DATACOMP, _datafin);
+  TRelation rel(LF_MOVANA);
+	rel.add(LF_MOV, "NUMREG==NUMREGCG");
+	rel.add(LF_CAUSALI, "CODCAUS==CODCAUS");
+  TCursor cur(&rel, "NUMREGCG!=0", 2, &da, &a);
+  const long cur_items = cur.items();
+  if (cur_items != 0) 
+  {               
+	  cur.freeze();
+    TRectype& cur_rec = cur.curr();
+    for (cur = 0; cur.pos() < cur_items; ++(cur))
+		{
+
+//			const char tipomov = cur_rec.get(MOVANA_TIPOMOV)[0];
+//			if (tipomov == '3' || tipomov == '2' || tipomov == '6')
+//			{
+				TRelation relpart(LF_PARTITE);
+				TRectype da(LF_PARTITE);
+				da.put(PART_NREG, cur.curr().get(MOV_NUMREG));
+				TCursor curpart(&relpart,	"", 2, &da, &da);
+				const long curpart_items = curpart.items();
+				if (curpart_items != 0) 
+				{               
+					curpart.freeze();
+					TRectype& curpart_rec = curpart.curr();
+					for (curpart = 0; curpart.pos() < curpart_items; ++(curpart))
+					{
+						TRelation relpag(LF_PAGSCA);
+						TRectype da(LF_PAGSCA);
+						da.put(PAGSCA_TIPOC, curpart_rec.get(PART_TIPOCF));
+						da.put(PAGSCA_GRUPPO, curpart_rec.get(PART_GRUPPO));
+						da.put(PAGSCA_CONTO, curpart_rec.get(PART_CONTO));
+						da.put(PAGSCA_SOTTOCONTO, curpart_rec.get(PART_SOTTOCONTO));
+						da.put(PAGSCA_ANNO, curpart_rec.get(PART_ANNO));
+						da.put(PAGSCA_NUMPART, curpart_rec.get(PART_NUMPART));
+						const int nrigapart = curpart_rec.get_int(PART_NRIGA);
+						TString80 filtro;
+						filtro.format("NRIGP == %d", nrigapart);
+						TCursor curpag(&relpag, filtro, 1, &da, &da);
+						const long curpag_items = curpag.items();
+						if (curpag_items != 0) 
+						{  
+							TAssoc_array pagame;
+							pagame.destroy();
+							curpag.freeze();
+							TRectype& curpag_rec = curpag.curr();
+							for (curpag = 0; curpag.pos() < curpag_items; ++(curpag))
+							{
+								TString80 indice = curpag_rec.get(PAGSCA_ANNO);
+								indice << '|' << curpag_rec.get(PAGSCA_NUMPART);
+								indice << '|' << curpag_rec.get(PAGSCA_NRIGA);
+								real importo = ZERO;
+								bool is_key = pagame.is_key(indice);
+								real& somma = is_key ? (real&) pagame[indice] : importo;
+								somma += curpag_rec.get_real(PAGSCA_IMPORTO);
+								if (!is_key)
+									pagame.add(indice, somma);
+							}
+
+							// scrivo i record risultanti
+							real* cp;
+							for (cp = (real*) pagame.first_item(); cp != NULL; cp = (real*) pagame.succ_item())
+							{
+								TToken_string keypart;
+								keypart.add(curpart_rec.get(PART_TIPOCF));
+								keypart.add(curpart_rec.get(PART_GRUPPO));
+								keypart.add(curpart_rec.get(PART_CONTO));
+								keypart.add(curpart_rec.get(PART_SOTTOCONTO));
+								keypart.add(pagame.get_hashobj()->key());
+								const TRectype& partita = cache().get(LF_PARTITE, keypart);
+								_nregpag = cur.curr().get_long(MOV_NUMREG);
+								_nregcosto = partita.get_long(PART_NREG);
+								_importo = *cp;
+								TRecord_text recpag;
+								recpag.set_type("G");
+								trasfilepag->autoload(recpag, curpag); 
+								trasfilepag->write(recpag);
+							}
+
+						}//if curpag_items..
+					}//for curpart =..
+				}//if curpart_items..
+
+//			}//if tipomov..
+
+		}//for cur =..
+	}//if cur_items..
+
+	chiudi_file(trasfilepag);
+	return true;
 }
 
 bool TInvioP::i_proforma_clifor(char tipocf)
 {
-	TFilename configname = "proforma.ini";
-	TConfig configfile(configname);
-	TFilename filename = _msk->get(F_DESTINAZIONE);
+	TInvioP_file* trasfile = NULL;
 	if (tipocf == 'C')
-		filename.add("clienti.txt");
+		TInvioP_file* trasfile = apri_file("clienti");
 	else
-		filename.add("fornit.txt");
-	if (fexist(filename))
-		remove(filename);	
-	_trasfile = new TInvioP_file(filename, configname);
-	_trasfile->open(filename,'w');
-	_trasfile->force_record_separator();
+		TInvioP_file* trasfile = apri_file("fornit");
+	
   TString80 filtro = "";
 	filtro.format("TIPOCF == \"%c\"", tipocf);
 	TRelation rel(LF_CLIFO);
@@ -472,19 +457,74 @@ bool TInvioP::i_proforma_clifor(char tipocf)
 			TRecord_text rec;
 
 			rec.set_type("C");
-			_trasfile->autoload(rec, cur); 
-			_trasfile->write(rec);
+			trasfile->autoload(rec, cur); 
+			trasfile->write(rec);
     }	
   }                  
-	_trasfile->close();
-	delete _trasfile;
-	_trasfile = NULL;
-  return TRUE;
+	chiudi_file(trasfile);
+  return true;
+}
+
+//"metodo dei metodi":in base ai parametri della maschera esegue la procedura indicata
+void TInvioP::invio_proforma()
+{
+	if (_msk->get_bool(F_MOVIMENTI))
+		i_proforma_movimenti();
+	if (_msk->get_bool(F_PAGAMENTI))
+		i_proforma_pagamenti();
+	if (_msk->get_bool(F_CLIENTI))
+		i_proforma_clifor();
+	if (_msk->get_bool(F_FORNITORI))
+		i_proforma_clifor('F');
+	if (_msk->get_bool(F_CONTI))
+		i_proforma_conti();
+}
+
+bool TInvioP::create()
+{               
+  _msk = new TInvioP_mask();
+	_configfile = new TConfig("proforma.ini");
+  return TSkeleton_application::create();
+}
+
+bool TInvioP::destroy()
+{             
+	if (_configfile != NULL)
+		delete _configfile;
+  delete _msk;
+
+  return TSkeleton_application::destroy();
+}
+
+void TInvioP::main_loop()
+{
+	//il programma si puo' usare SOLO se in contabilita' analitica si usa il pianodeiconti contabile
+	TConfig& cfg = ca_config();
+	const bool use_pdcc = cfg.get_bool("UsePdcc");
+	if (!use_pdcc)
+		return;
+
+	TFilename configname = "cg7200a.ini";	//file configurazione della maschera
+	configname.custom_path();
+	TConfig configfile(configname);
+	_msk->set(F_DATAINI, configfile.get("DATA","OPZIONI"));
+	_msk->set(F_DESTINAZIONE, configfile.get("PERCORSO","OPZIONI"));
+
+  while (_msk->run()!=K_QUIT)
+  {                                  
+  	configfile.set("DATA", _msk->get_date(F_DATAFIN),"OPZIONI");
+  	configfile.set("PERCORSO", _msk->get(F_DESTINAZIONE),"OPZIONI");
+  	_dataini = _msk->get_date(F_DATAINI);
+  	_datafin = _msk->get_date(F_DATAFIN);
+		const char tipoinvio = _msk->get(F_TIPOINVIO)[0];
+		if (tipoinvio == 'P')
+			invio_proforma();		//dopo aver preso i parametri dalla maschera chiama il "metodo dei metodi"
+	}	
 }
 
 int cg7200(int argc, char **argv) 
 {
   TInvioP a;
-  a.run(argc, argv, "Invio dati contabilit�");
+  a.run(argc, argv, "Invio dati contabilit� a Proforma");
   return 0;
 }
diff --git a/cg/cg7200a.uml b/cg/cg7200a.uml
index a97d1de91..5c47bec1a 100755
--- a/cg/cg7200a.uml
+++ b/cg/cg7200a.uml
@@ -25,66 +25,67 @@ END
 
 GROUPBOX DLG_NULL 76 6
 BEGIN
-        PROMPT 2 4 "Dati da inviare"
+  PROMPT 2 4 "Dati da inviare"
 END
 
 BOOLEAN F_MOVIMENTI
 BEGIN
-        PROMPT 3 5 "Movimenti contabili"
-        MESSAGE TRUE,ENABLE F_DATAFIN
+  PROMPT 3 5 "Movimenti contabili"
+  MESSAGE FALSE CLEAR,F_PAGAMENTI|DISABLE,F_DATAFIN
+  MESSAGE TRUE ENABLE,F_PAGAMENTI|ENABLE,F_DATAFIN
 END
 
 BOOLEAN F_CLIENTI
 BEGIN
-        PROMPT 3 6 "Clienti"
+  PROMPT 3 6 "Clienti"
 END
 
 BOOLEAN F_FORNITORI
 BEGIN
-        PROMPT 3 7 "Fornitori"
+  PROMPT 3 7 "Fornitori"
 END
 
 BOOLEAN F_CONTI
 BEGIN
-        PROMPT 3 8 "Piano dei conti"
+  PROMPT 3 8 "Piano dei conti"
 END
 
 BOOLEAN F_PAGAMENTI
 BEGIN
-        PROMPT 40 5 "Pagamenti"
+  PROMPT 40 5 "Pagamenti"
 END
 
 LISTBOX F_TIPOINVIO 20
 BEGIN
-        PROMPT 2 10 "Invio a      "
-		ITEM "P|Proforma"
+  PROMPT 2 10 "Invio a      "
+  ITEM "P|Proforma"
 END
 
 STRING F_DESTINAZIONE 20
 BEGIN
-       PROMPT 2 11 "Destinazione  "
+  PROMPT 2 11 "Destinazione  "
 END
 
 DATE F_DATAINI
 BEGIN
-       PROMPT 2 12 "Data iniziale "
+  PROMPT 2 12 "Data iniziale "
 END
 
 DATE F_DATAFIN
 BEGIN
-       PROMPT 40 12 "Data finale  "
+  PROMPT 40 12 "Data finale  "
 END
 
 BUTTON F_RIPRISTINA 20
 BEGIN
-       PROMPT 2 14 "Annulla invio"
-       MESSAGE SHOW,F_DATARIPRISTINO|ENABLE,F_DATARIPRISTINO
+  PROMPT 2 14 "Annulla invio"
+  MESSAGE SHOW,F_DATARIPRISTINO|ENABLE,F_DATARIPRISTINO
 END
 
 DATE F_DATARIPRISTINO
 BEGIN
-        PROMPT 25 14 "Annulla invio fino al "
-        FLAGS "HD"
+  PROMPT 25 14 "Annulla invio fino al "
+  FLAGS "HD"
 END
 
 BUTTON DLG_OK 9 2
diff --git a/cg/proforma.ini b/cg/proforma.ini
index 5c7683aca..9ac0bd1e0 100755
--- a/cg/proforma.ini
+++ b/cg/proforma.ini
@@ -142,7 +142,7 @@ NAME(0) = ID REGISTRAZIONE
 TYPE(0) = NUMERO
 POSITION(0) = 0
 LENGTH(0) = 10
-FIELD(0) = 24->NUMREG
+FIELD(0) = 108->NUMREG
 
 NAME(1) = FLAG RIGA IVA
 TYPE(1) = STRINGA
@@ -154,25 +154,25 @@ NAME(2) = FLAG DARE/AVERE
 TYPE(2) = STRINGA
 POSITION(2) = 11
 LENGTH(2) = 1
-FIELD(2) = 24->SEZIONE
+FIELD(2) = 108->SEZIONE
 
 NAME(3) = CODICE MASTRO
 TYPE(3) = STRINGA
 POSITION(3) = 12
 LENGTH(3) = 5
-FIELD(3) = 24->GRUPPO
+FIELD(3) = 108->CODCONTO[1,3]
 
 NAME(4) = CODICE CONTO
 TYPE(4) = STRINGA
 POSITION(4) = 17
 LENGTH(4) = 5
-FIELD(4) = 24->CONTO
+FIELD(4) = 108->CODCONTO[4,6]
 
 NAME(5) = CODICE SOTTOCONTO
 TYPE(5) = STRINGA
 POSITION(5) = 22
 LENGTH(5) = 5
-FIELD(5) = 24->SOTTOCONTO
+FIELD(5) = 108->CODCONTO[7,12]
 
 NAME(6) = FLAG CLIFOR
 TYPE(6) = STRINGA
@@ -190,12 +190,12 @@ NAME(8) = DESCRIZIONE RIGA
 TYPE(8) = STRINGA
 POSITION(8) = 38
 LENGTH(8) = 40
-FIELD(8) = 24->DESCR[1,40]
+FIELD(8) = 108->DESCR[1,40]
 
 NAME(9) = IMPORTO SOTTOCONTO
 TYPE(9) = IMPORTO
 POSITION(9) = 78
-FIELD(9) = 24->IMPORTO
+FIELD(9) = 108->IMPORTO
 
 NAME(10) = IMPONIBILE
 TYPE(10) = IMPORTO
@@ -215,7 +215,7 @@ NAME(13) = COMMESSA
 TYPE(13) = STRINGA
 POSITION(13) = 125
 LENGTH(13) = 20
-FIELD(13) = 24->CODCMS
+FIELD(13) = 108->CODCMS
 
 NAME(14) = VOCE DI SPESA
 TYPE(14) = STRINGA