Files correlati : tc2.exe Ricompilazione Demo : [ ] Commento : Corretto segno sui movimenti git-svn-id: svn://10.65.10.50/branches/R_10_00@21692 c028cbd2-c16b-5b4b-a496-9718f37d4682
		
			
				
	
	
		
			1620 lines
		
	
	
		
			47 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			1620 lines
		
	
	
		
			47 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
| #include "tc2.h"
 | ||
| #include "tc2700.h"
 | ||
| #include "tc2700a.h"
 | ||
| 
 | ||
| #include <automask.h>
 | ||
| #include <lffiles.h>
 | ||
| #include <progind.h>
 | ||
| #include <reprint.h>
 | ||
| 
 | ||
| #include <anafis.h>
 | ||
| #include <anagr.h>
 | ||
| #include <causali.h>
 | ||
| #include <clifo.h>
 | ||
| #include <comuni.h>
 | ||
| #include "../in/intra.h"
 | ||
| #include "../in/rintra.h"
 | ||
| #include <mov.h>
 | ||
| #include <rmov.h>
 | ||
| #include <rmoviva.h>
 | ||
| #include <partite.h>
 | ||
| #include <scadenze.h>
 | ||
| #include <multirel.h>
 | ||
| #include <pconti.h>
 | ||
| 
 | ||
| #include "../cg/cglib01.h"
 | ||
| #include "../cg/cglib03.h"
 | ||
| 
 | ||
| #define CFLD "C"
 | ||
| #define INTFLD "INT"
 | ||
| #define NPFLD  "NP"
 | ||
| #define NUFLD  "NU"
 | ||
| #define FLFLD  "FL"
 | ||
| #define DATEFLD  "DATE"
 | ||
| 
 | ||
| #define CAU  "IPCAU"
 | ||
| #define CDP  "IPCDP"
 | ||
| #define IVA  "IPIVA"
 | ||
| #define ICC	 "IPICC" // aggiungere
 | ||
| #define NAZ  "IPNAZ"
 | ||
| #define REG  "IPREG"
 | ||
| #define VAL  "IPVAL"
 | ||
| 
 | ||
| bool TIP_mask::apply_filter(const TRecordset& righe) const
 | ||
| {
 | ||
|   const TDate dal = get(F_DATA_DA);
 | ||
|   const TDate al = get(F_DATA_AL);
 | ||
|   if (dal.ok() || al.ok())
 | ||
|   {
 | ||
|     const TDate scad = righe.get("DATASCAD").as_date();
 | ||
|     if ((dal.ok() && scad < dal) || (al.ok() && scad > al))
 | ||
|       return false;
 | ||
|   }
 | ||
|   return true;
 | ||
| }
 | ||
| 
 | ||
| bool TIP_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
 | ||
| {
 | ||
|   bool ok = true;
 | ||
|   switch (o.dlg())
 | ||
|   {
 | ||
|   case F_DATA_DA:
 | ||
|   case F_DATA_AL:
 | ||
|     break;
 | ||
|   default:
 | ||
|     break;
 | ||
|   }
 | ||
|   return ok;
 | ||
| }
 | ||
| 
 | ||
| void TIP_mask::serialize(bool bSave)
 | ||
| {
 | ||
|   const char* defpar = "tc";
 | ||
|   TConfig ini(CONFIG_DITTA, defpar);
 | ||
|   for (int i = fields()-1; i >= 0; i--)
 | ||
|   {
 | ||
|     TMask_field& f = fld(i);
 | ||
|     const TFieldref* fr = f.field();
 | ||
|     if (fr != NULL)
 | ||
|     {
 | ||
|       if (bSave)
 | ||
|         fr->write(ini, defpar, f.get());
 | ||
|       else
 | ||
|         f.set(fr->read(ini, defpar));
 | ||
|     }
 | ||
|   }
 | ||
| }
 | ||
| 
 | ||
| TIP_mask::TIP_mask(const char * maskname) 
 | ||
|          : TAutomask(maskname), _updating(false), _next_update(0)
 | ||
| {
 | ||
|   serialize(false);
 | ||
| }
 | ||
| 
 | ||
| TIP_mask::~TIP_mask()
 | ||
| {
 | ||
|   serialize(true);
 | ||
| }
 | ||
| 
 | ||
| ///////////////////////////////////////////////////////////
 | ||
| // TCausali_cache
 | ||
| ///////////////////////////////////////////////////////////
 | ||
| 
 | ||
| TObject* TCausali_cache::key2obj(const char* key)
 | ||
| {
 | ||
|   // Metodo bastardo per evitare TToken_string temporanee "a randa"
 | ||
|   // sfrutto chiave a lunghezza fissa
 | ||
|   const int anno = atoi(key);
 | ||
|   const char* codice = key+5;
 | ||
|   TCausale* pcaus = new TCausale(codice, anno);
 | ||
|   return pcaus;
 | ||
| }
 | ||
| 
 | ||
| const TCausale& TCausali_cache::causale(const char* codice, int annoiva)
 | ||
| {
 | ||
|   // Metodo bastardo per evitare TToken_string temporanee "a randa"
 | ||
|   // creo chiave a lunghezza fissa anno+codice = 9999|AAA
 | ||
|   TString8 key;
 | ||
|   key.format("%04d|%s", annoiva, codice);
 | ||
|   return *(const TCausale*)objptr(key);
 | ||
| }
 | ||
| 
 | ||
| ///////////////////////////////////////////////////////////
 | ||
| // TRiclassifica_cache
 | ||
| ///////////////////////////////////////////////////////////
 | ||
| 
 | ||
| HIDDEN const char* const __tiporicconti = "IPCONTI";
 | ||
| 
 | ||
| TObject* TIPRiclassifica_cache::key2obj(const char* key)
 | ||
| {
 | ||
| 	TToken_string tok(key);
 | ||
| 	TString8 tab, cod;
 | ||
| 	tok.get(0,tab);
 | ||
| 	tok.get(1, cod);
 | ||
| 	_multirel.put(MULTI_COD, tab);
 | ||
| 	_multirel.put(MULTI_FIRST, cod);
 | ||
| 	_multirel.zero(MULTI_SECOND);
 | ||
| 	if (_multirel.read() == NOERR)
 | ||
| 		return new TString(_multirel.get(MULTI_DATA));
 | ||
| 	return NULL;
 | ||
| }
 | ||
| 
 | ||
| long TIPRiclassifica_cache::decode(const char* tab, const TString& cod)
 | ||
| {
 | ||
| 	TToken_string tok;
 | ||
| 	tok.add(tab);
 | ||
| 	tok.add(cod);
 | ||
| 	const TString* ric = (const TString*) objptr(tok);
 | ||
| 	return (ric ? atol(*ric) : 0);
 | ||
| }
 | ||
| 
 | ||
| const char * TIPRiclassifica_cache::sdecode(const char* tab, const TString& cod)
 | ||
| {
 | ||
| 	TToken_string tok;
 | ||
| 	tok.add(tab);
 | ||
| 	tok.add(cod);
 | ||
| 	const TString* ric = (const TString*) objptr(tok);
 | ||
| 	return ric ? (const char *) *ric : "";
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| const long IPbill2ricl(char & t, int gr, int co, long so)
 | ||
| {
 | ||
| 	TRecord_cache *	__conti = NULL;
 | ||
| 
 | ||
| 	if (__conti == NULL)
 | ||
| 		__conti = new TRecord_cache(LF_RICLPDC, 1);
 | ||
| 
 | ||
|   long codricl = 0;
 | ||
| 	if (gr > 0)
 | ||
| 	{
 | ||
| 		TToken_string cod;
 | ||
| 		cod.add(__tiporicconti);
 | ||
| 		cod.add(gr);
 | ||
| 		cod.add(co);
 | ||
| 		if (t <= ' ')
 | ||
| 			cod.add(so);
 | ||
| 
 | ||
| 		// Provo il sottoconto ma se non riesco provo con conto e poi anche gruppo
 | ||
| 		for (int c = 3; c > 0 && codricl <= 0; c--)
 | ||
| 		{
 | ||
| 			codricl = atol(__conti->get(cod, "CODICE"));
 | ||
| 			cod.add(0, c);
 | ||
| 		}
 | ||
| 	}
 | ||
|   return codricl;
 | ||
| }
 | ||
| 
 | ||
| TIP_sender& app() { return (TIP_sender&)main_app(); }
 | ||
| 
 | ||
| ///////////////////////////////////////////////////////////
 | ||
| // TIP_textset
 | ||
| ///////////////////////////////////////////////////////////
 | ||
| 
 | ||
| class TInt : public TObject
 | ||
| {
 | ||
| public:
 | ||
| 	int _int;
 | ||
| 
 | ||
| 	TInt(int i) : _int(i) {}
 | ||
| };
 | ||
| 
 | ||
| 
 | ||
| bool TIP_textset::destroy(TRecnotype r)
 | ||
| {
 | ||
| 	bool ok;
 | ||
|   ok = TCSV_recordset::destroy(r);
 | ||
|   return ok; 
 | ||
| }
 | ||
| 
 | ||
| int TIP_textset::find_column(const char * name)
 | ||
| {
 | ||
| 	const TString80 fname(name);
 | ||
| 	TInt * i = (TInt *) _colnames.objptr(fname);
 | ||
|  
 | ||
| 	if (i != NULL)
 | ||
| 		return i->_int;
 | ||
| 	return -1;
 | ||
| }
 | ||
| 
 | ||
| void TIP_textset::add_field(const char* name, int len, const char * tipo)
 | ||
| {
 | ||
|   const TString80 fname(name);
 | ||
| 
 | ||
| 	const TString4 strtipo(tipo);
 | ||
|   TFieldtypes t = _alfafld; 
 | ||
| 	
 | ||
| 	if (strtipo == INTFLD || strtipo == NPFLD)
 | ||
| 	{
 | ||
| 		if (len > 10)
 | ||
| 			len = 10;
 | ||
| 		t = _longzerofld;
 | ||
| 	}
 | ||
| 	else
 | ||
| 		if (strtipo == NUFLD || strtipo == FLFLD)
 | ||
| 		{
 | ||
| 			if (len > 19)
 | ||
| 				len = 19;
 | ||
| 			t = _realfld;
 | ||
| 		}
 | ||
| 		else
 | ||
| 			if (strtipo == DATEFLD)
 | ||
| 			{
 | ||
| 				len = 8;
 | ||
| 				t = _datefld;
 | ||
| 			}
 | ||
|   create_column(fname, t);
 | ||
|   TRecordset_column_info& ci = (TRecordset_column_info&) column_info(columns() - 1);
 | ||
|   ci._width = len;
 | ||
| 	_colnames.add(fname, new TInt(columns() - 1));
 | ||
| }
 | ||
| 
 | ||
| bool TIP_textset::set(const char* field, const TVariant& var)
 | ||
| {
 | ||
|   TString msg;
 | ||
| 	bool ok = true;
 | ||
| 	TString val;
 | ||
| 	int column = find_column(field);
 | ||
| 
 | ||
| 	if (column < 0)
 | ||
| 	{
 | ||
|     msg  << field << ": " << TR("Campo sconosiuto");
 | ||
|     app().log(2, msg);
 | ||
| 	}
 | ||
| 
 | ||
| 	TRecordset_column_info& ci = (TRecordset_column_info&) column_info(column);
 | ||
| 	const int len = ci._width;
 | ||
| 
 | ||
| 	switch (var.type())
 | ||
|   {
 | ||
| 		case _datefld:
 | ||
| 			if (!var.is_zero())
 | ||
| 			{
 | ||
| 				const TDate d = var.as_date();
 | ||
| 				const long ansi = d.date2ansi();
 | ||
| 				val.format("%8ld", ansi);
 | ||
| 				ok = true;
 | ||
| 			}
 | ||
| 			break;
 | ||
| 		case _realfld:
 | ||
| 			if (!var.is_zero())
 | ||
| 			{
 | ||
| 				const real v = var.as_real();
 | ||
| 				val = v.string(0, 2);
 | ||
| 				ok = val.len() <= len;
 | ||
| 			}
 | ||
| 			break;
 | ||
| 		case _longzerofld:
 | ||
| 			if (!var.is_zero())
 | ||
| 			{
 | ||
| 				const long v = var.as_int();
 | ||
| 				val.format("%ld", v );
 | ||
| 				ok = val.len() <= len;
 | ||
| 			}
 | ||
| 			break;
 | ||
| 		default:
 | ||
| 			val = var.as_string().left(len);
 | ||
| 			break;
 | ||
| 	}
 | ||
| 	if (ok)
 | ||
| 		TCSV_recordset::set(column, TVariant(val)); 
 | ||
| 	else
 | ||
| 	{
 | ||
|     msg  << field << TR(": Valore - ") << val<< TR(" - Lunghezza errata ");
 | ||
|     app().log(2, msg);
 | ||
|   }
 | ||
|   return ok;
 | ||
| }
 | ||
| 
 | ||
| ///////////////////////////////////////////////////////////
 | ||
| // TIP_clienti_textset
 | ||
| ///////////////////////////////////////////////////////////
 | ||
| 
 | ||
| TIP_clienti_textset::TIP_clienti_textset(const char* query) : TIP_textset(query)
 | ||
| {
 | ||
| 	add_field("ID_Cliente", 6);
 | ||
| 	add_field("Descrizione_1", 40);
 | ||
| 	add_field("Descrizione_2", 40);
 | ||
| 	add_field("Indirizzo", 40);
 | ||
| 	add_field("Citta", 62);
 | ||
| 	add_field("Cap", 9);
 | ||
| 	add_field("ID_Provincia", 2);
 | ||
| 	add_field("ID_Regione", 3);
 | ||
| 	add_field("ID_Nazione_Estera", 3);
 | ||
| 	add_field("Email", 40);
 | ||
| 	add_field("Telefono1_1", 5);
 | ||
| 	add_field("Telefono1_2", 5);
 | ||
| 	add_field("Telefono1_3", 10);
 | ||
| 	add_field("Telefono2_1", 5);
 | ||
| 	add_field("Telefono2_2", 5);
 | ||
| 	add_field("Telefono2_3", 10);
 | ||
| 	add_field("Fax_1", 5);
 | ||
| 	add_field("Fax_2", 5);
 | ||
| 	add_field("Fax_3", 10);
 | ||
| 	add_field("PersonaContattare", 30);
 | ||
| 	add_field("Chiave_Ricerca", 40);
 | ||
| 	add_field("Nota", 80);
 | ||
| 	add_field("Flag_Persona_Fisica", 1);
 | ||
| 	add_field("Sesso", 1);
 | ||
| 	add_field("Data_Nascita", 8);
 | ||
| 	add_field("Citta_Nascita", 62);
 | ||
| 	add_field("Cognome", 25);
 | ||
| 	add_field("Nome", 25);
 | ||
| 	add_field("Indirizzo_Legale", 40);
 | ||
| 	add_field("Citta_Legale", 62);
 | ||
| 	add_field("Cap_Legale", 9);
 | ||
| 	add_field("ID_Provincia_Legale", 2);
 | ||
| 	add_field("ID_Regione_Legale", 3);
 | ||
| 	add_field("ID_ISO_IVA", 2);
 | ||
| 	add_field("Partita_IVA", 12);
 | ||
| 	add_field("Codice_Fiscale", 16);
 | ||
| 	add_field("Codice_Fiscale_Estero", 16);
 | ||
| 	add_field("ID_Conto", 12);
 | ||
| 	add_field("ID_Conto_Fat", 12);
 | ||
| 	add_field("ID_Conto_Pag", 12);
 | ||
| 	add_field("ID_IVA", 12);
 | ||
| 	add_field("ID_Divisa", 3);
 | ||
| 	add_field("Bloccato", 1, INTFLD);
 | ||
| 	add_field("Data_Inizio_Rapporto", 8, DATEFLD);
 | ||
| 	add_field("ID_Tipo_Pagamento_Default", 1);
 | ||
| 	add_field("TitolareP_IVA", 1);
 | ||
| }
 | ||
| 
 | ||
| ///////////////////////////////////////////////////////////
 | ||
| // TIP_fornitori_textset
 | ||
| ///////////////////////////////////////////////////////////
 | ||
| 
 | ||
| TIP_fornitori_textset::TIP_fornitori_textset(const char* query) : TIP_textset(query)
 | ||
| {
 | ||
| 	add_field("ID_Cliente", 6);
 | ||
| 	add_field("Descrizione_1", 40);
 | ||
| 	add_field("Descrizione_2", 40);
 | ||
| 	add_field("Indirizzo", 40);
 | ||
| 	add_field("Citta", 62);
 | ||
| 	add_field("Cap", 9);
 | ||
| 	add_field("ID_Provincia", 2);
 | ||
| 	add_field("ID_Regione", 3);
 | ||
| 	add_field("ID_Nazione_Estera", 3);
 | ||
| 	add_field("Email", 40);
 | ||
| 	add_field("Telefono1_1", 5);
 | ||
| 	add_field("Telefono1_2", 5);
 | ||
| 	add_field("Telefono1_3", 10);
 | ||
| 	add_field("Telefono2_1", 5);
 | ||
| 	add_field("Telefono2_2", 5);
 | ||
| 	add_field("Telefono2_3", 10);
 | ||
| 	add_field("Fax_1", 5);
 | ||
| 	add_field("Fax_2", 5);
 | ||
| 	add_field("Fax_3", 10);
 | ||
| 	add_field("PersonaContattare", 30);
 | ||
| 	add_field("Chiave_Ricerca", 40);
 | ||
| 	add_field("Nota", 80);
 | ||
| 	add_field("Flag_Persona_Fisica", 1);
 | ||
| 	add_field("Sesso", 1);
 | ||
| 	add_field("Data_Nascita", 8, DATEFLD);
 | ||
| 	add_field("Citta_Nascita", 62);
 | ||
| 	add_field("Cognome", 25);
 | ||
| 	add_field("Nome", 25);
 | ||
| 	add_field("Indirizzo_Legale", 40);
 | ||
| 	add_field("Citta_Legale", 62);
 | ||
| 	add_field("Cap_Legale", 9);
 | ||
| 	add_field("ID_Provincia_Legale", 2);
 | ||
| 	add_field("ID_Regione_Legale", 3);
 | ||
| 	add_field("ID_ISO_IVA", 2);
 | ||
| 	add_field("Partita_IVA", 12);
 | ||
| 	add_field("Codice_Fiscale", 16);
 | ||
| 	add_field("Codice_Fiscale_Estero", 16);
 | ||
| 	add_field("ID_Conto", 12);
 | ||
| 	add_field("ID_Conto_Fat", 12);
 | ||
| 	add_field("ID_Conto_Pag", 12);
 | ||
| 	add_field("ID_IVA", 12);
 | ||
| 	add_field("ID_Divisa", 3);
 | ||
| 	add_field("Flag_Enasarco", 1);
 | ||
| 	add_field("Data_Inizio_Rapporto", 8, DATEFLD);
 | ||
| 	add_field("Bloccato", 1, INTFLD);
 | ||
| 	add_field("ID_Tipo_Pagamento_Default", 1);
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| ///////////////////////////////////////////////////////////
 | ||
| // TIP_scadenze_textset
 | ||
| ///////////////////////////////////////////////////////////
 | ||
| 
 | ||
| TIP_scadenze_textset::TIP_scadenze_textset(const char* query) : TIP_textset(query)
 | ||
| {
 | ||
| 	add_field("ID_Scadenza", 10, NPFLD);
 | ||
| 	add_field("Data_Scadenza", 8, DATEFLD);
 | ||
| 	add_field("Importo_Scadenza", 19, NUFLD); 
 | ||
| 	add_field("Importo_Divisa", 19, NUFLD);
 | ||
| 	add_field("ID_Divisa", 3);
 | ||
| 	add_field("ID_Tipo_Pagamento", 1);
 | ||
| 	add_field("ID_Movimento", 10, NPFLD);
 | ||
| 	add_field("Importo_IVASosp", 19, NUFLD);
 | ||
| }
 | ||
| 
 | ||
| ///////////////////////////////////////////////////////////
 | ||
| // TIP_movimenti_textset
 | ||
| ///////////////////////////////////////////////////////////
 | ||
| 
 | ||
| TIP_movimenti_textset::TIP_movimenti_textset(const char* query)
 | ||
|              : TIP_textset(query)
 | ||
| {
 | ||
| 	add_field("ID_Movimento", 10, NPFLD);
 | ||
| 	add_field("Data_Registrazione", 8, DATEFLD);
 | ||
| 	add_field("Data_Comp_Esercizio", 8, DATEFLD);
 | ||
| 	add_field("Data_Comp_LiqIVA", 8, DATEFLD);
 | ||
| 	add_field("Data_Documento", 8, DATEFLD);
 | ||
| 	add_field("Num_Documento", 10);
 | ||
| 	add_field("ID_Causale", 4, CFLD);
 | ||
| 	add_field("Descrizione", 40);
 | ||
| 	add_field("ID_Provvisorio", 2);
 | ||
| 	add_field("ID_RegIVA", 2);
 | ||
| 	add_field("Prot_IVA", 10);
 | ||
| 	add_field("ID_Conto", 12, CFLD);
 | ||
| 	add_field("ID_ContoCompetenza", 12);
 | ||
| 	add_field("ID_SubConto", 6);
 | ||
| 	add_field("Descrizione_Riga", 40);
 | ||
| 	add_field("Importo_Lire", 19, NUFLD);
 | ||
| 	add_field("Imponibile_IVA", 19, NUFLD);
 | ||
| 	add_field("ID_IVA", 3);
 | ||
| 	add_field("Importo_IVA", 19, NUFLD);
 | ||
| 	add_field("Indetraibilit<EFBFBD>", 3, INTFLD); // quanto lunghi gli interi
 | ||
| 	add_field("Importo_Divisa", 19, NUFLD);
 | ||
| 	add_field("ID_Divisa", 3);
 | ||
| 	add_field("Cambio", 19, NUFLD);
 | ||
| 	add_field("ID_Partita", 10);
 | ||
| 	add_field("Anno_Partita", 4, INTFLD);
 | ||
| 	add_field("Data_Inizio_Comp", 8, DATEFLD);
 | ||
| 	add_field("Data_Fine_Comp", 8, DATEFLD);
 | ||
| 	add_field("ID_Forfait", 1);
 | ||
| 	add_field("Tipo_Riga", 1, CFLD);
 | ||
| 	add_field("ID_CauRiga", 2);
 | ||
| 	add_field("ID_RegIVA_Vendite", 2);
 | ||
| 	add_field("Prot_IVA_Vendite", 10);
 | ||
| 	add_field("ID_Scadenza", 10, NUFLD);
 | ||
| 	add_field("TitolareP_IVA", 1);
 | ||
| }
 | ||
| 
 | ||
| ///////////////////////////////////////////////////////////
 | ||
| // TIP_cespiti_textset
 | ||
| ///////////////////////////////////////////////////////////
 | ||
| 
 | ||
| TIP_cespiti_textset::TIP_cespiti_textset(const char* query)
 | ||
|              : TIP_textset(query)
 | ||
| {
 | ||
| 	add_field("ID_Cespite", 6);
 | ||
| 	add_field("ID_CategoriaCespite", 10);
 | ||
| 	add_field("Descrizione", 40);
 | ||
| 	add_field("ID_Attivita", 2);
 | ||
| 	add_field("Ubicazione", 20);
 | ||
| 	add_field("ID_Fornitore", 6);
 | ||
| 	add_field("Data_Documento", 8, DATEFLD);
 | ||
| 	add_field("Num_Documento", 10);
 | ||
| 	add_field("Prot_IVA", 10);
 | ||
| 	add_field("TitoloAcquisto", 1);
 | ||
| 	add_field("Data_Inizio_Utilizzazione", 8, DATEFLD);
 | ||
| 	add_field("Costo", 19, NUFLD);
 | ||
| 	add_field("Flag_IndeducibilitaFiscale", 1);
 | ||
| 	add_field("PercIndeducibilita", 6, FLFLD); // quanto lunghi i float
 | ||
| 	add_field("Limite_Deducibilita", 10, NPFLD);
 | ||
| 	add_field("ValoreMassimoDeducibile", 19, NUFLD);
 | ||
| 	add_field("Flag_Autotrasportatori", 1);
 | ||
| 	add_field("Flag_Manutenzione", 1);
 | ||
| 	add_field("Flag_PubblicoRegistro", 1);
 | ||
| 	add_field("Flag_TecnoTremonti", 1);
 | ||
| 	add_field("CostoAgevolabile", 19, NUFLD);
 | ||
| 	add_field("StatoCespite", 1);
 | ||
| 	add_field("Flag_AmmTecnico", 1);
 | ||
| 	add_field("AliquotaAmmOrdinario", 4, NUFLD);
 | ||
| 	add_field("AliquotaAmmAnticipato", 4, NUFLD);
 | ||
| 	add_field("FondoAmmOrdinario", 19, NUFLD);
 | ||
| 	add_field("FondoAmmAnticipato", 19, NUFLD);
 | ||
| 	add_field("ValoreAmmortizzato", 19, NUFLD);
 | ||
| 	add_field("QuotaNonAmmortizzabile", 19, NUFLD);
 | ||
| 	add_field("Rivalutazioni", 19, NUFLD);
 | ||
| 	add_field("Svalutazioni", 19, NUFLD);
 | ||
| 	add_field("FondoSvalutazione", 19, NUFLD);
 | ||
| 	add_field("EccedenzaPregressa", 19, NUFLD);
 | ||
| 	add_field("SommatoriaDecrementi", 19, NUFLD);
 | ||
| 	add_field("Flag_NonCalcolare", 1);
 | ||
| 	add_field("DecrementoPeriodo", 19, NUFLD);
 | ||
| 	add_field("Flag_RecuperoCivilistico", 1);
 | ||
| 	add_field("Flag_IndeducibileRetroattiva", 1);
 | ||
| 	add_field("Flag_CalcoloPregressiFiscali", 1);
 | ||
| }
 | ||
| 
 | ||
| ///////////////////////////////////////////////////////////
 | ||
| // TIP_categorie_textset
 | ||
| ///////////////////////////////////////////////////////////
 | ||
| 
 | ||
| TIP_categorie_textset::TIP_categorie_textset(const char* query) : TIP_textset(query)
 | ||
| {
 | ||
| 	add_field("ID_CategoriaCespite", 10);
 | ||
| 	add_field("Descrizione", 40);
 | ||
| 	add_field("TipoBene", 1);
 | ||
| 	add_field("Flag_StampaLibroImmateriale", 1);
 | ||
| 	add_field("AliquotaAmmOrdinario", 6, FLFLD); // lunghezza
 | ||
| 	add_field("Flag_AmmAnticipato", 1);
 | ||
| 	add_field("AliquotaAmmAnticipato", 6, FLFLD); // lunghezza
 | ||
| 	add_field("ID_ContoAmmAnticipato", 12);
 | ||
| 	add_field("ID_ContoFondoAmmAnticipato", 12);
 | ||
| 	add_field("ID_ContoAmmOrdinario", 12);
 | ||
| 	add_field("ID_ContoFondoAmmOrdinario", 12);
 | ||
| 	add_field("ID_ContoCespite", 12);
 | ||
| 	add_field("Flag_AmmIndiretto", 1);
 | ||
| 	add_field("ID_ContoMinusValenza", 12);
 | ||
| 	add_field("ID_ContoPlusValenza", 12);
 | ||
| 	add_field("Flag_PubblicoRegistro", 1);
 | ||
| 	add_field("ID_ContoSvalutazioni", 12);
 | ||
| 	add_field("ID_ContoRivalutazioni", 12);
 | ||
| 	add_field("ID_ContoFondoSvalutazioni", 12);
 | ||
| 	add_field("ID_ContoSopravvenienzePassive", 12);
 | ||
| 	add_field("Flag_Ammortizzabile", 1);
 | ||
| 	add_field("Flag_StampaLibroNonAmmort", 1);
 | ||
| 	add_field("ID_ContoRiservaRivalutazione", 12);
 | ||
| 	add_field("Flag_CategoriaMinisteriale", 1);
 | ||
| 	add_field("ID_ContoAmmAnticipatoNonDed", 12);
 | ||
| 	add_field("ID_ContoFdoAmmAnticipatoNonDed", 12);
 | ||
| 	add_field("ID_ContoAmmOrdinarioNonDed", 12);
 | ||
| 	add_field("ID_ContoFdoAmmOrdinarioNonDed", 12);
 | ||
| 	add_field("ID_ContoSvalutazioniNonDed", 12);
 | ||
| 	add_field("ID_ContoFdoSvalutazioniNonDed", 12);
 | ||
| 	add_field("ID_ContoRivalutazioniNonTassabile", 12);
 | ||
| 	add_field("ID_ContoRiservaRivalutazioniNonTassabile", 12);
 | ||
| 	add_field("ID_ContoMinusvalenzaNonDed", 12);
 | ||
| 	add_field("ID_ContoPlusvalenzaNonTassabile", 12);
 | ||
| 	add_field("ID_ContoSopravvenienzePassiveNonDed", 12);
 | ||
| 	add_field("ID_TipoCategoria", 1);
 | ||
| 	add_field("ID_VoceBilancio", 1);
 | ||
| }
 | ||
| 
 | ||
| ///////////////////////////////////////////////////////////
 | ||
| // TIP_intra_textset
 | ||
| ///////////////////////////////////////////////////////////
 | ||
| 
 | ||
| TIP_intra_textset::TIP_intra_textset(const char* query) : TIP_textset(query)
 | ||
| {
 | ||
| 	add_field("ID_Subconto", 6, CFLD);
 | ||
| 	add_field("ID_Movim_CG", 10, NPFLD);
 | ||
| 	add_field("Data_Riferimento", 8, DATEFLD);
 | ||
| 	add_field("TipoMovimento", 1, NPFLD); // verificare
 | ||
| 	add_field("Importo", 19, NUFLD);
 | ||
| 	add_field("Importo_Divisa", 19, NUFLD); // Importo divisa movimento Intra
 | ||
| 	add_field("SezioneIntra", 1, INTFLD); //Sezione Intra. 0 = non definito, 1=Bis, 2= Ter, 3=Quater, 4=Quinquies
 | ||
| 	add_field("ID_NaturaTransazione", 1); // Codice della natura transazione
 | ||
| 	add_field("ID_NomenclaturaCombinata", 9); // Codice della nomenclatura combinata
 | ||
| 	add_field("ID_CondizioniConsegna", 1); // Condizioni Consegna  <20>C?, <20>D?, <20>E? o <20>F?
 | ||
| 	add_field("ID_ModalitaTrasporto", 1); // Codice della modalit<69> di trasporto
 | ||
| 	add_field("ID_SezioneDoganale", 6); // Sezione Doganale
 | ||
| 	add_field("ID_ProvinciaDest", 2); // Provincia destinazione
 | ||
| 	add_field("ID_NazioneProvenienza", 3); // Codice della nazione di provenienza
 | ||
| 	add_field("ID_NazioneOrigine", 3); // Codice della nazione di origine
 | ||
| 	add_field("MassaNetta", 19, NUFLD); // Massa netta
 | ||
| 	add_field("UnitaSupplementari", 10, NPFLD); // Unit<69> supplementare
 | ||
| 	add_field("ValoreStatistico", 19, NUFLD); // Valore statistico
 | ||
| 	add_field("PeriodoRettifica", 2, INTFLD); // Periodo rettifica (mese o trimestre) (*)
 | ||
| 	add_field("AnnoRettifica", 4, INTFLD); //Anno relativo al periodo di rettifica
 | ||
| 	add_field("Num_Documento", 10); // Alfanumerico: numero documento (Quater/Quinquies)
 | ||
| 	add_field("Data_Documento", 8, DATEFLD); // Data documento: data documento (Quater/Quinqies)
 | ||
| 	add_field("Codice_Servizio", 6); // Codice servizio
 | ||
| 	add_field("Mod_Erogazione", 1); // I = Istantanea, R = A pi<70> riprese
 | ||
| 	add_field("Mod_Incasso",1); // Modalit<69> incasso
 | ||
| 	add_field("Num_Protocollo", 10, NPFLD); // Numero protocollo da indicare nelle righe di rettifica del Quinquies
 | ||
| 	add_field("Prog_Riga", 10, NPFLD); // Progressivo riga (univoco) da indicare nelle righe di rettifica del Quinquies
 | ||
| }
 | ||
| 
 | ||
| ///////////////////////////////////////////////////////////
 | ||
| // TIP_sender
 | ||
| ///////////////////////////////////////////////////////////
 | ||
| 
 | ||
| void TIP_sender::log(int sev, const char* msg)
 | ||
| { 
 | ||
| 	if (_log != NULL)
 | ||
| 	{
 | ||
| 		if (sev > 0)
 | ||
| 		{
 | ||
| 			TString m;
 | ||
| 			m << TR("Record") <<  ": " << msg;
 | ||
| 			_log->log(sev, m); 
 | ||
| 			_errors_logged = true;
 | ||
| 		}
 | ||
| 		else
 | ||
| 			_log->log(sev, msg);
 | ||
| 	}
 | ||
| }
 | ||
| 
 | ||
| bool TIP_sender::mov_regolarizzazione(const TRecordset& mov)
 | ||
| {
 | ||
|   const TString& codcaus = mov.get(MOV_CODCAUS).as_string();
 | ||
| 
 | ||
| 	return _caus_regolarizzazione.objptr(codcaus) != NULL;
 | ||
| }
 | ||
| 
 | ||
| bool TIP_sender::mov_intra(const TRecordset& mov)
 | ||
| {
 | ||
|   const TRectype& caus = cache().get(LF_CAUSALI, mov.get(MOV_CODCAUS).as_string());
 | ||
| 	
 | ||
| 	return caus.get_bool(CAU_INTRACOM);
 | ||
| }
 | ||
| 
 | ||
| bool TIP_sender::mov_reverse_charge(const TRecordset& mov)
 | ||
| {
 | ||
|   const TRectype& caus = cache().get(LF_CAUSALI, mov.get(MOV_CODCAUS).as_string());
 | ||
| 	const int	regsp = caus.get_int(CAU_REGSPIVA);
 | ||
| 
 | ||
| 	return regsp == 13 || regsp == 50 || regsp == 51;
 | ||
| }
 | ||
| 
 | ||
| bool TIP_sender::test_swap(const TRecordset& mov)
 | ||
| {
 | ||
| 	const int anno = mov.get(MOV_ANNOIVA).as_int();
 | ||
| 	const TCausale & caus = _causali->causale(mov.get(MOV_CODCAUS).as_string(), anno);
 | ||
| 	char sez = caus.sezione_clifo();
 | ||
|   const bool vendite = mov.get(MOV_TIPO).as_string()[0] != 'F';
 | ||
|   
 | ||
|   const bool s = vendite ^ (sez == 'D');
 | ||
|   return s;
 | ||
| }
 | ||
| 
 | ||
| bool TIP_sender::find_regolarizzazione(TRecordset& mov)
 | ||
| {
 | ||
| 	bool found = false;
 | ||
|   
 | ||
|   const TRectype& caus = cache().get(LF_CAUSALI, mov.get(MOV_CODCAUS).as_string());
 | ||
| 	const TString4 causreg =	caus.get(CAU_CODCAUREG);
 | ||
| 	real totdoc = mov.get(MOV_TOTDOC).as_real();
 | ||
| 	const real ritfis = mov.get(MOV_RITFIS).as_real();
 | ||
| 	const real ritsoc = mov.get(MOV_RITSOC).as_real();
 | ||
| 
 | ||
| 	if (ritfis != ZERO)
 | ||
| 		totdoc += ritfis;
 | ||
|   if (ritsoc != ZERO)
 | ||
| 		  totdoc += ritsoc;                        
 | ||
|   if (test_swap(mov))
 | ||
| 		totdoc = -totdoc;
 | ||
| 
 | ||
| 	TToken_string key(mov.get(MOV_TIPO).as_string());
 | ||
| 	key.add(mov.get(MOV_CODCF).as_int());
 | ||
| 	const TRectype & cli = cache().get(LF_CLIFO, key);
 | ||
| 	const TString16 paiv = cli.get(CLI_PAIV);
 | ||
| 	const TString16 cf = cli.get(CLI_COFI);
 | ||
| 	TEsercizi_contabili esc;
 | ||
| 	const TEsercizio & e = esc.esercizio(esc.date2esc(mov.get(MOV_DATAREG).as_date()));
 | ||
| 	const TDate to(e.fine());
 | ||
| 
 | ||
| 	for (bool ok = mov.move_next(); ok && ! found; ok = mov.move_next())
 | ||
| 	{
 | ||
| 		const TDate dreg = mov.get(MOV_DATAREG).as_date();
 | ||
| 		if (dreg >to)
 | ||
| 			break;
 | ||
| 	  const TRectype& caus = cache().get(LF_CAUSALI, mov.get(MOV_CODCAUS).as_string());
 | ||
| 		const TString4 cod = caus.get(CAU_CODCAUS);
 | ||
| 		
 | ||
| 		found = (causreg.full() && cod == causreg) || (causreg.blank() && (_caus_regolarizzazione.objptr(cod) || caus.get_bool(CAU_SOLOIVA)));
 | ||
| 		found &= (totdoc == mov.get(MOV_TOTDOC).as_real());
 | ||
| 
 | ||
| 		key = mov.get(MOV_TIPO).as_string();
 | ||
| 		key.add(mov.get(MOV_CODCF).as_int());
 | ||
| 		const TRectype & clireg = cache().get(LF_CLIFO, key);
 | ||
| 		const TString16 paivreg = clireg.get(CLI_PAIV);
 | ||
| 		const TString16 cfreg = clireg.get(CLI_COFI);
 | ||
| 
 | ||
| 		found &= ((paiv.full() && paiv == paivreg) || (paiv.blank() && cf == cfreg));
 | ||
| 		if (found)
 | ||
| 			break;
 | ||
| 	}
 | ||
| 
 | ||
| 	return found;
 | ||
| }
 | ||
| 
 | ||
| const long TIP_sender::bill2ricl(char t, int gr, int co, long so)
 | ||
| {
 | ||
|   long codricl = 0;
 | ||
| 	if (gr > 0)
 | ||
| 	{
 | ||
| 		const bool ricl = _riclassifica.is_key(__tiporicconti);
 | ||
| 
 | ||
| 		if (ricl)
 | ||
| 		{
 | ||
| 			codricl = ::IPbill2ricl(t, gr, co, so);
 | ||
| 
 | ||
| 			if (codricl <= 0)
 | ||
| 			{
 | ||
| 				TString msg;
 | ||
| 				msg << TR("Conto") << " " << gr << " " << co << " " << so  << " :" << TR("Non presente in tabella");
 | ||
| 				log(2, msg);
 | ||
| 			}
 | ||
| 		}
 | ||
| 	}
 | ||
|   return codricl;
 | ||
| }
 | ||
| 
 | ||
| const TString & TIP_sender::scod2ricl(const char* tab, const TString& cod)
 | ||
| {
 | ||
|   TString & codricl = get_tmp_string();
 | ||
| 	if (cod.full())
 | ||
| 	{
 | ||
| 		const bool ricl = _riclassifica.is_key(tab);
 | ||
| 		const char* err = NULL;
 | ||
| 		if (ricl)
 | ||
| 		{
 | ||
| 			codricl = _tabelle->sdecode(tab, cod);
 | ||
| 			if (codricl.blank())
 | ||
| 				err = TR("Non presente in tabella");  
 | ||
| 		}
 | ||
| 		else
 | ||
| 			codricl = cod;
 | ||
| 		if (err)
 | ||
| 		{
 | ||
| 			TString msg;
 | ||
| 			msg << TR("Codice") << " " <<  cod << " " << TR("Tabella") << " " << tab << " :" << err;
 | ||
| 			log(2, msg);
 | ||
| 		}
 | ||
| 	}
 | ||
|   return codricl;
 | ||
| }
 | ||
| 
 | ||
| const TString & TIP_sender::scod2ricl(const char* tab, const TVariant& cod)
 | ||
| {
 | ||
| 	return scod2ricl(tab, cod.as_string());
 | ||
| }
 | ||
| 
 | ||
| const long TIP_sender::cod2ricl(const char* tab, const TString& cod)
 | ||
| {
 | ||
|   long codricl = 0;
 | ||
| 	if (cod.full())
 | ||
| 	{
 | ||
| 		const bool ricl = _riclassifica.is_key(tab);
 | ||
| 		const char* err = NULL;
 | ||
| 		if (ricl)
 | ||
| 		{
 | ||
| 			codricl = _tabelle->decode(tab, cod);
 | ||
| 			if (codricl <= 0)
 | ||
| 				err = TR("Non presente in tabella");  
 | ||
| 		}
 | ||
| 		else
 | ||
| 		{
 | ||
| 			if (real::is_natural(cod))
 | ||
| 				codricl = atol(cod);
 | ||
| 			else
 | ||
| 				err = TR("Non e' un codice numerico");  
 | ||
| 		}
 | ||
| 		if (err)
 | ||
| 		{
 | ||
| 			TString msg;
 | ||
| 			msg << TR("Codice") << " " <<  cod << " " << TR("Tabella") << " " << tab << " :" << err;
 | ||
| 			log(2, msg);
 | ||
| 		}
 | ||
| 	}
 | ||
|   return codricl;
 | ||
| }
 | ||
| 
 | ||
| const long TIP_sender::cod2ricl(const char* tab, const TVariant& cod)
 | ||
| {
 | ||
| 	return cod2ricl(tab, cod.as_string());
 | ||
| }
 | ||
| 
 | ||
| const TString & TIP_sender::pag2tipo(const TVariant & codpag)
 | ||
| {
 | ||
| 	TString & str = get_tmp_string(4);
 | ||
| 	const int tipopag = atoi(cache().get("CPG", codpag.as_string(), "S4"));
 | ||
| 
 | ||
| 	str = "";
 | ||
| 	if (tipopag < 2)
 | ||
| 		str = "D";
 | ||
| 	else
 | ||
| 		if (tipopag == 2)
 | ||
| 			str = "T";
 | ||
| 		else
 | ||
| 			if (tipopag == 3)
 | ||
| 				str = "B";
 | ||
| 			else
 | ||
| 				if (tipopag == 5)
 | ||
| 					str = "G";
 | ||
| 				else
 | ||
| 					if (tipopag == 7)
 | ||
| 						str = "T";
 | ||
| 					else
 | ||
| 						if (tipopag == 9)
 | ||
| 							str = "O";
 | ||
| 	return str;
 | ||
| }
 | ||
| 
 | ||
| const TString & TIP_sender::row2cauriga(TISAM_recordset& rmov, const TCausale & caus)
 | ||
| {
 | ||
| 	TString & str = get_tmp_string(4);
 | ||
| 	const char tipo = rmov.get(RMV_ROWTYPE).as_string()[0];
 | ||
| 	if (tipo == 'F')
 | ||
| 		str = "P5";
 | ||
| 	else
 | ||
| 		if (tipo == 'S')
 | ||
| 			str = "P6";
 | ||
| 		else
 | ||
| 			if (caus.tipomov() > 2)
 | ||
| 			{
 | ||
| 				TBill c;
 | ||
| 
 | ||
| 				caus.bill(0, c);
 | ||
| 				if (c.tipo() == 'F')
 | ||
| 					str = "P7";
 | ||
| 				else
 | ||
| 					if (c.tipo() == 'C')
 | ||
| 						str = "P8";
 | ||
| 			}
 | ||
| 	return str;
 | ||
| }
 | ||
| void TIP_sender::get_pref(const TVariant & pref, TVariant & pint, TVariant & pnaz)
 | ||
| {
 | ||
| 	if (pref.as_string()[0] == '+')
 | ||
| 	{
 | ||
| 		pint = pref.as_string().left(3);
 | ||
| 		pnaz = pref.as_string().mid(3);
 | ||
| 	}
 | ||
| 	else
 | ||
| 		if (pref.as_string().starts_with("00"))
 | ||
| 		{
 | ||
| 			pint = pref.as_string().left(4);
 | ||
| 			pnaz = pref.as_string().mid(4);
 | ||
| 		}
 | ||
| 		else
 | ||
| 		{
 | ||
| 			pint.set_null();
 | ||
| 			pnaz = pref;
 | ||
| 		}
 | ||
| }
 | ||
| 
 | ||
| const real TIP_sender::ind2perc(const TVariant & tipodet)
 | ||
| {
 | ||
| 	return real(cache().get("%DET", tipodet.as_string(), "R0")); //verificare
 | ||
| }
 | ||
| 
 | ||
| void TIP_sender::add_cli(TISAM_recordset & cli, TIP_clienti_textset & ipcli)
 | ||
| {
 | ||
| 	TVariant val;
 | ||
| 	TVariant val1;
 | ||
| 	TToken_string key;
 | ||
| 
 | ||
| 	ipcli.new_rec();
 | ||
| 	ipcli.set("ID_Cliente", cli.get(CLI_CODCF));
 | ||
| 	ipcli.set("Descrizione_1", cli.get(CLI_RAGSOC).as_string().left(40));
 | ||
| 	ipcli.set("Descrizione_2", cli.get(CLI_RAGSOC).as_string().mid(40));
 | ||
| 	val = cli.get(CLI_INDCF);
 | ||
| 	if (!cli.get(CLI_CIVCF).is_empty())
 | ||
| 	{
 | ||
| 		if (!val.is_empty())
 | ||
| 			val += ", ";
 | ||
| 		val += cli.get(CLI_CIVCF);
 | ||
| 	}
 | ||
| 	ipcli.set("Indirizzo", val);
 | ||
| 	val = cli.get(CLI_LOCCF);
 | ||
| 	if (!val.is_empty())
 | ||
| 		val += " ";
 | ||
| 	key.add(cli.get(CLI_STATOCF).as_string());
 | ||
| 	key.add(cli.get(CLI_COMCF).as_string());
 | ||
| 	
 | ||
| 	const TRectype & comune = cache().get(LF_COMUNI, key);
 | ||
| 	val += comune.get(COM_DENCOM);
 | ||
| 	ipcli.set("Citta", val);
 | ||
| 	ipcli.set("Cap", cli.get(CLI_CAPCF));
 | ||
| 	ipcli.set("ID_Provincia", comune.get(COM_PROVCOM));
 | ||
| 	ipcli.set("ID_Regione", comune.get(COM_CODREG));
 | ||
| 	ipcli.set("ID_Nazione_Estera", scod2ricl(NAZ, cli.get(CLI_STATOCF)));
 | ||
| 	ipcli.set("Email", cli.get(CLI_DOCMAIL));
 | ||
| 	get_pref(cli.get(CLI_PTEL), val, val1);
 | ||
| 	ipcli.set("Telefono1_1", val);
 | ||
| 	ipcli.set("Telefono1_2", val1);
 | ||
| 	ipcli.set("Telefono1_3", cli.get(CLI_TEL));
 | ||
| 	get_pref(cli.get(CLI_PTEL2), val, val1);
 | ||
| 	ipcli.set("Telefono2_1", val);
 | ||
| 	ipcli.set("Telefono2_2", val1);
 | ||
| 	ipcli.set("Telefono2_3", cli.get(CLI_TEL2));
 | ||
| 	get_pref(cli.get(CLI_PFAX), val, val1);
 | ||
| 	ipcli.set("Fax_1", val);
 | ||
| 	ipcli.set("Fax_2", val1);
 | ||
| 	ipcli.set("Fax_3", cli.get(CLI_FAX));
 | ||
| 	ipcli.set("Chiave_Ricerca", cli.get(CLI_RICALT));
 | ||
| 	const bool persona_fisica = cli.get(CLI_TIPOAPER).as_string() == "F";
 | ||
| 	ipcli.set("Flag_Persona_Fisica", persona_fisica ? "S" : "N");
 | ||
| 	if (persona_fisica)
 | ||
| 	{
 | ||
| 		key.cut(0);
 | ||
| 		key.add(cli.get(CLI_TIPOAPER).as_string());
 | ||
| 		key.add(cli.get(CLI_CODANAGPER).as_string());
 | ||
| 		const TRectype & recanag = cache().get(LF_ANAG, key); 
 | ||
| 		const TRectype & recpf = cache().get(LF_ANAGFIS, cli.get(CLI_CODANAGPER).as_string()); 
 | ||
| 
 | ||
| 		ipcli.set("Sesso", recpf.get(ANF_SESSO));
 | ||
| 		ipcli.set("Data_Nascita", recpf.get(ANF_DATANASC));
 | ||
| 		key.cut(0);
 | ||
| 		key.add(recpf.get(ANF_STATONASC));
 | ||
| 		key.add(recpf.get(ANF_COMNASC));
 | ||
| 		
 | ||
| 		const TRectype & comunenasc = cache().get(LF_COMUNI, key);
 | ||
| 
 | ||
| 		ipcli.set("Citta_Nascita", comunenasc.get(COM_DENCOM));
 | ||
| 		ipcli.set("Cognome", recanag.get(ANA_RAGSOC).left(25));
 | ||
| 		ipcli.set("Nome", recanag.get(ANA_RAGSOC).mid(25));
 | ||
| 	}
 | ||
| 	ipcli.set("ID_ISO_IVA", cli.get(CLI_STATOPAIV));
 | ||
| 	ipcli.set("Partita_IVA", cli.get(CLI_PAIV));
 | ||
| 	const int alleg = cli.get(CLI_ALLEG).as_int();
 | ||
| 	if (alleg != 5)
 | ||
| 		ipcli.set("Codice_Fiscale", cli.get(CLI_COFI));
 | ||
| 	else
 | ||
| 		ipcli.set("Codice_Fiscale_Estero", cli.get(CLI_COFI));
 | ||
| 	if (cli.get(CLI_PAIV).is_empty() && cli.get(CLI_COFI).is_empty())
 | ||
| 	{
 | ||
| 		TString cod = cli.get(CLI_TIPOCF).as_string();
 | ||
| 
 | ||
| 		cod << cli.get(CLI_CODCF).as_int();
 | ||
| 		ipcli.set("Codice_Fiscale", cod);
 | ||
| 	}
 | ||
| 	ipcli.set("ID_Conto", bill2ricl(' ', cli.get(CLI_GRUPPO).as_int(), cli.get(CLI_CONTO).as_int(), 0L));
 | ||
| 	ipcli.set("ID_Conto_Fat", bill2ricl(' ', cli.get(CLI_GRUPPORIC).as_int(), cli.get(CLI_CONTORIC).as_int(), cli.get(CLI_SOTTOCRIC).as_int()));
 | ||
| 	ipcli.set("ID_Divisa", scod2ricl(VAL, cli.get(CLI_CODVAL)));
 | ||
| 	ipcli.set("Bloccato", cli.get(CLI_SOSPESO).as_bool() ? "0" : "9");
 | ||
| 	ipcli.set("ID_Tipo_Pagamento_Default", pag2tipo(cli.get(CLI_CODPAG)));
 | ||
| 	ipcli.set("TitolareP_IVA", alleg != 6 ? "S" : "N");
 | ||
| }
 | ||
| 
 | ||
| void TIP_sender::transfer_cli(const char * path)
 | ||
| {
 | ||
| 
 | ||
| 	TIP_clienti_textset ipcli;
 | ||
| 	TString query;
 | ||
| 	
 | ||
| 	query << "USE " << LF_CLIFO << '\n' << "FROM " << CLI_TIPOCF << "=\"C\"\n" << "TO " << CLI_TIPOCF << "=\"C\"\n";
 | ||
| 
 | ||
| 	TISAM_recordset cli(query);
 | ||
|   log(0, "Clienti");
 | ||
| 	_errors_logged = false;
 | ||
|   TProgind pi(cli.items(), TR("Scansione clienti"), true, true);
 | ||
| 
 | ||
|   for (bool ok = cli.move_first(); ok && pi.addstatus(1); ok = cli.move_next())
 | ||
| 		add_cli(cli, ipcli);					
 | ||
| 
 | ||
|   bool save = true;
 | ||
| 	_errors |= _errors_logged;
 | ||
|   if (_errors_logged)
 | ||
|     save = yesno_box(TR("Sono stati riscontrati uno o piu' errori:\n"
 | ||
|                         "Si desidera salvare il file ugualmente?"));
 | ||
|   if (save)
 | ||
|   {
 | ||
| 		TFilename name(path);
 | ||
| 
 | ||
| 		name.add("clienti.txt");
 | ||
| 		ipcli.save_as(name);
 | ||
|   }
 | ||
| }
 | ||
| void TIP_sender::add_forn(TISAM_recordset & forn, TIP_fornitori_textset & ipforn)
 | ||
| {
 | ||
| 	TVariant val;
 | ||
| 	TVariant val1;
 | ||
| 	TToken_string key;
 | ||
| 
 | ||
| 	ipforn.new_rec();
 | ||
| 	ipforn.set("ID_Cliente", forn.get(CLI_CODCF));
 | ||
| 	ipforn.set("Descrizione_1", forn.get(CLI_RAGSOC).as_string().left(40));
 | ||
| 	ipforn.set("Descrizione_2", forn.get(CLI_RAGSOC).as_string().mid(40));
 | ||
| 	val = forn.get(CLI_INDCF);
 | ||
| 	if (!forn.get(CLI_CIVCF).is_empty())
 | ||
| 	{
 | ||
| 		if (!val.is_empty())
 | ||
| 			val += ", ";
 | ||
| 		val += forn.get(CLI_CIVCF);
 | ||
| 	}
 | ||
| 	ipforn.set("Indirizzo", val);
 | ||
| 	val = forn.get(CLI_LOCCF);
 | ||
| 	if (!val.is_empty())
 | ||
| 		val += " ";
 | ||
| 	key.add(forn.get(CLI_STATOCF).as_string());
 | ||
| 	key.add(forn.get(CLI_COMCF).as_string());
 | ||
| 	
 | ||
| 	const TRectype & comune = cache().get(LF_COMUNI, key);
 | ||
| 	val += comune.get(COM_DENCOM);
 | ||
| 	ipforn.set("Citta", val);
 | ||
| 	ipforn.set("Cap", forn.get(CLI_CAPCF));
 | ||
| 	ipforn.set("ID_Provincia", comune.get(COM_PROVCOM));
 | ||
| 	ipforn.set("ID_Regione", comune.get(COM_CODREG));
 | ||
| 	ipforn.set("ID_Nazione_Estera", scod2ricl(NAZ, forn.get(CLI_STATOCF)));
 | ||
| 	ipforn.set("Email", forn.get(CLI_DOCMAIL));
 | ||
| 	get_pref(forn.get(CLI_PTEL), val, val1);
 | ||
| 	ipforn.set("Telefono1_1", val);
 | ||
| 	ipforn.set("Telefono1_2", val1);
 | ||
| 	ipforn.set("Telefono1_3", forn.get(CLI_TEL));
 | ||
| 	get_pref(forn.get(CLI_PTEL2), val, val1);
 | ||
| 	ipforn.set("Telefono2_1", val);
 | ||
| 	ipforn.set("Telefono2_2", val1);
 | ||
| 	ipforn.set("Telefono2_3", forn.get(CLI_TEL2));
 | ||
| 	get_pref(forn.get(CLI_PFAX), val, val1);
 | ||
| 	ipforn.set("Fax_1", val);
 | ||
| 	ipforn.set("Fax_2", val1);
 | ||
| 	ipforn.set("Fax_3", forn.get(CLI_FAX));
 | ||
| 	ipforn.set("Chiave_Ricerca", forn.get(CLI_RICALT));
 | ||
| 	const bool persona_fisica = forn.get(CLI_TIPOAPER).as_string() == "F";
 | ||
| 	ipforn.set("Flag_Persona_Fisica", persona_fisica ? "S" : "N");
 | ||
| 	if (persona_fisica)
 | ||
| 	{
 | ||
| 		key.cut(0);
 | ||
| 		key.add(forn.get(CLI_TIPOAPER).as_string());
 | ||
| 		key.add(forn.get(CLI_CODANAGPER).as_string());
 | ||
| 		const TRectype & recanag = cache().get(LF_ANAG, key); 
 | ||
| 		const TRectype & recpf = cache().get(LF_ANAGFIS, forn.get(CLI_CODANAGPER).as_string()); 
 | ||
| 
 | ||
| 		ipforn.set("Sesso", recpf.get(ANF_SESSO));
 | ||
| 		ipforn.set("Data_Nascita", recpf.get(ANF_DATANASC));
 | ||
| 		key.cut(0);
 | ||
| 		key.add(recpf.get(ANF_STATONASC));
 | ||
| 		key.add(recpf.get(ANF_COMNASC));
 | ||
| 		
 | ||
| 		const TRectype & comunenasc = cache().get(LF_COMUNI, key);
 | ||
| 
 | ||
| 		ipforn.set("Citta_Nascita", comunenasc.get(COM_DENCOM));
 | ||
| 		ipforn.set("Cognome", recanag.get(ANA_RAGSOC).left(25));
 | ||
| 		ipforn.set("Nome", recanag.get(ANA_RAGSOC).mid(25));
 | ||
| 	}
 | ||
| 	ipforn.set("ID_ISO_IVA", forn.get(CLI_STATOPAIV));
 | ||
| 	ipforn.set("Partita_IVA", forn.get(CLI_PAIV));
 | ||
| 	const int alleg = forn.get(CLI_ALLEG).as_int();
 | ||
| 	if (alleg != 5)
 | ||
| 		ipforn.set("Codice_Fiscale", forn.get(CLI_COFI));
 | ||
| 	else
 | ||
| 		ipforn.set("Codice_Fiscale_Estero", forn.get(CLI_COFI));
 | ||
| 	ipforn.set("ID_Conto", bill2ricl(' ', forn.get(CLI_GRUPPO).as_int(), forn.get(CLI_CONTO).as_int(), 0L));
 | ||
| 	ipforn.set("ID_Conto_Fat", bill2ricl(' ', forn.get(CLI_GRUPPORIC).as_int(), forn.get(CLI_CONTORIC).as_int(), forn.get(CLI_SOTTOCRIC).as_int()));
 | ||
| 	ipforn.set("ID_Divisa", scod2ricl(VAL, forn.get(CLI_CODVAL)));
 | ||
| 	ipforn.set("Bloccato", forn.get(CLI_SOSPESO).as_bool() ? "0" : "9");
 | ||
| 	ipforn.set("ID_Tipo_Pagamento_Default", pag2tipo(forn.get(CLI_CODPAG)));
 | ||
| }
 | ||
| 
 | ||
| void TIP_sender::transfer_forn(const char * path)
 | ||
| {
 | ||
|   log(0, "Fornitori");
 | ||
| 
 | ||
| 	TIP_fornitori_textset ipforn;
 | ||
| 	TString query;
 | ||
| 	
 | ||
| 	query << "USE " << LF_CLIFO << '\n' << "FROM " << CLI_TIPOCF << "=\"F\"\n" << "TO " << CLI_TIPOCF << "=\"F\"\n";
 | ||
| 
 | ||
| 	TISAM_recordset forn(query);
 | ||
| 	_errors_logged = false;
 | ||
|   TProgind pi(forn.items(), TR("Scansione fornitori"), true, true);
 | ||
| 
 | ||
|   for (bool ok = forn.move_first(); ok && pi.addstatus(1); ok = forn.move_next())
 | ||
| 		add_forn(forn, ipforn);					
 | ||
| 
 | ||
|   bool save = true;
 | ||
| 	_errors |= _errors_logged;
 | ||
|   if (_errors_logged)
 | ||
|     save = yesno_box(TR("Sono stati riscontrati uno o piu' errori:\n"
 | ||
|                         "Si desidera salvare il file ugualmente?"));
 | ||
|   if (save)
 | ||
|   {
 | ||
| 		TFilename name(path);
 | ||
| 
 | ||
| 		name.add("fornitori.txt");
 | ||
| 		ipforn.save_as(name);
 | ||
|   }
 | ||
| }
 | ||
| 
 | ||
| void TIP_sender::add_mov_cg(TISAM_recordset & mov, TIP_movimenti_textset & ipmov, const TVariant & reg_regol, const TVariant & prot_regol, const char tipo)
 | ||
| {
 | ||
| 	TVariant val;
 | ||
| 	TToken_string key;
 | ||
| 	TString query;
 | ||
|   const int anno = mov.get(MOV_ANNOIVA).as_int();
 | ||
| 	const TCausale & caus = _causali->causale(mov.get(MOV_CODCAUS).as_string(), anno);
 | ||
| 	char tipocf = mov.get(MOV_TIPO).as_string()[0];
 | ||
| 	long codcf = mov.get(MOV_CODCF).as_int();
 | ||
| 	key.cut(0);
 | ||
| 	key.add(tipocf);
 | ||
| 	key.add(codcf);
 | ||
| 	const int alleg = atoi(cache().get(LF_CLIFO, key, CLI_ALLEG));
 | ||
| 	const TVariant & numreg = mov.get(MOV_NUMREG);
 | ||
| 	
 | ||
| 
 | ||
| 	query << "USE " << LF_RMOV << "\nFROM " << RMV_NUMREG << "=" << numreg << "\nTO " << RMV_NUMREG << "=" << numreg << "\n";
 | ||
| 
 | ||
| 	TISAM_recordset	rmov(query);
 | ||
| 
 | ||
|   for (bool ok = rmov.move_first(); ok; ok = rmov.move_next())
 | ||
| 	{
 | ||
| 		TString tiporiga = rmov.get(RMV_ROWTYPE).as_string();
 | ||
| 
 | ||
| 		if (tipo == ' ' || tipo == tiporiga[0])
 | ||
| 		{
 | ||
| 			ipmov.new_rec();
 | ||
| 			ipmov.set("ID_Movimento", mov.get(MOV_NUMREG));
 | ||
| 			ipmov.set("Data_Registrazione", mov.get(MOV_DATAREG));
 | ||
| 			ipmov.set("Data_Comp_Esercizio", mov.get(MOV_DATACOMP));
 | ||
| 			ipmov.set("Data_Documento", mov.get(MOV_DATADOC));
 | ||
| 			ipmov.set("Num_Documento", mov.get(MOV_NUMDOC));
 | ||
| 			ipmov.set("ID_Causale", scod2ricl(CAU, mov.get(MOV_CODCAUS)));
 | ||
| 			ipmov.set("Descrizione", mov.get(MOV_DESCR).as_string().left(40));
 | ||
| 			// ipmov.set("ID_Provvisorio", 2); // da ferificare???
 | ||
| 			ipmov.set("ID_RegIVA", scod2ricl(REG, mov.get(MOV_REG)));
 | ||
| 			ipmov.set("Prot_IVA", mov.get(MOV_PROTIVA));
 | ||
| 			char tipoconto = rmov.get(RMV_TIPOC).as_string()[0]; 
 | ||
| 			val = bill2ricl(tipoconto, 
 | ||
| 											rmov.get(RMV_GRUPPO).as_int(), 
 | ||
| 											rmov.get(RMV_CONTO).as_int(), 
 | ||
| 											rmov.get(RMV_SOTTOCONTO).as_int());
 | ||
| 			ipmov.set("ID_Conto", val);
 | ||
| 			if (tiporiga == "T" || tipoconto > ' ')
 | ||
| 				ipmov.set("ID_SubConto", mov.get(MOV_CODCF));
 | ||
| 			ipmov.set("Descrizione_Riga", rmov.get(RMV_DESCR).as_string().left(40));
 | ||
| 			ipmov.set("Importo_Lire", rmov.get(RMV_SEZIONE).as_string() == "D" ? rmov.get(RMV_IMPORTO).as_real() : -rmov.get(RMV_IMPORTO).as_real());
 | ||
| 			key = numreg.as_string();
 | ||
| 			key.add(rmov.get(RMV_NUMRIG).as_string());
 | ||
| 			const TRectype & partrec = _part->get(key);
 | ||
| 			ipmov.set("ID_Partita", partrec.get(PART_NUMPART));
 | ||
| 			ipmov.set("Anno_Partita", partrec.get(PART_ANNO));
 | ||
| 			val = "";
 | ||
| 			if (tiporiga == "T")
 | ||
| 				val = "S";
 | ||
| 			else
 | ||
| 				if (tiporiga == "N" || tiporiga == "D")
 | ||
| 					val = "I";
 | ||
| 			ipmov.set("Tipo_Riga", val);
 | ||
| 			ipmov.set("ID_CauRiga", row2cauriga(rmov, caus));
 | ||
| 			ipmov.set("ID_RegIVA_Vendite", reg_regol);
 | ||
| 			ipmov.set("Prot_IVA_Vendite", prot_regol);
 | ||
| 			ipmov.set("TitolareP_IVA", alleg != 6 ? "S" : "N");
 | ||
| 		}
 | ||
| 	}
 | ||
| }
 | ||
| 
 | ||
| void TIP_sender::add_mov_iva(TISAM_recordset & mov, TIP_movimenti_textset & ipmov, const TVariant & reg_regol, const TVariant & prot_regol)
 | ||
| {
 | ||
| 	add_mov_cg(mov, ipmov, reg_regol, prot_regol, 'T');
 | ||
|   const int anno = mov.get(MOV_ANNOIVA).as_int();
 | ||
| 	const TCausale & caus = _causali->causale(mov.get(MOV_CODCAUS).as_string(), anno);
 | ||
| //	const char sezione = caus.sezione(2);
 | ||
| //	const real fattore = (sezione == 'D' ? UNO : -UNO);
 | ||
| 	const TipoIVA tipo = caus.iva();
 | ||
| 	const real fattore = (tipo == iva_acquisti ? UNO : -UNO);
 | ||
| 	char tipocf = mov.get(MOV_TIPO).as_string()[0];
 | ||
| 	long codcf = mov.get(MOV_CODCF).as_int();
 | ||
| 	TToken_string key;
 | ||
| 	key.add(tipocf);
 | ||
| 	key.add(codcf);
 | ||
| 	const int alleg = atoi(cache().get(LF_CLIFO, key, CLI_ALLEG));
 | ||
| 	const TVariant & numreg = mov.get(MOV_NUMREG);
 | ||
| 	TString query;
 | ||
| 	TVariant val;
 | ||
| 
 | ||
| 	if (numreg.as_int() == 88L)
 | ||
| 		int i = 1;
 | ||
| 	query << "USE " << LF_RMOVIVA << "\nFROM " << RMI_NUMREG << "=" << numreg << "\nTO " << RMI_NUMREG << "=" << numreg << "\n";
 | ||
| 
 | ||
| 	TISAM_recordset	rivamov(query);
 | ||
| 
 | ||
| 	for (bool ok = rivamov.move_first(); ok; ok = rivamov.move_next())
 | ||
| 	{
 | ||
| 		ipmov.new_rec();
 | ||
| 		ipmov.set("ID_Movimento", mov.get(MOV_NUMREG));
 | ||
| 		ipmov.set("Data_Registrazione", mov.get(MOV_DATAREG));
 | ||
| 		ipmov.set("Data_Comp_Esercizio", mov.get(MOV_DATACOMP));
 | ||
| 		ipmov.set("Data_Documento", mov.get(MOV_DATADOC));
 | ||
| 		ipmov.set("Num_Documento", mov.get(MOV_NUMDOC));
 | ||
| 		ipmov.set("ID_Causale", scod2ricl(CAU, mov.get(MOV_CODCAUS)));
 | ||
| 		ipmov.set("Descrizione", mov.get(MOV_DESCR).as_string().left(40));
 | ||
| //				ipmov.set("ID_Provvisorio", 2); da chiarire
 | ||
| 		ipmov.set("ID_RegIVA", scod2ricl(REG, mov.get(MOV_REG)));
 | ||
| 		ipmov.set("Prot_IVA", mov.get(MOV_PROTIVA));
 | ||
| 		const char tipoconto = rivamov.get(RMI_TIPOC).as_string()[0];
 | ||
| 		const long sottoconto = rivamov.get(RMI_SOTTOCONTO).as_int();
 | ||
| 		val = bill2ricl(tipoconto, 
 | ||
| 										rivamov.get(RMI_GRUPPO).as_int(), 
 | ||
| 										rivamov.get(RMI_CONTO).as_int(), 
 | ||
| 										sottoconto);
 | ||
| 		ipmov.set("ID_Conto", val);
 | ||
| 			if (tipoconto > ' ')
 | ||
| 				ipmov.set("ID_SubConto", sottoconto);
 | ||
| 		const real imponibile = rivamov.get(RMI_IMPONIBILE).as_real();
 | ||
| 		const real imposta = rivamov.get(RMI_IMPOSTA).as_real();
 | ||
| 		real impind;
 | ||
| 		real impdet;
 | ||
| 		real ivaind;
 | ||
| 		real ivadet;
 | ||
| 		int tipodet;
 | ||
| 		const real perc = indetraibile_al(rivamov.get(RMI_TIPODET).as_string(), caus, anno, tipodet);
 | ||
| 
 | ||
| 		analizza_IVA(imponibile, imposta, perc, false, true, rivamov.get(RMI_CODIVA).as_string(),
 | ||
|              impdet, ivadet, impind, ivaind); // attenzione ai corrispettivi
 | ||
| 		const real totimp = impdet + impind;
 | ||
| 		ipmov.set("Importo_Lire", totimp * fattore);
 | ||
| 		ipmov.set("Imponibile_IVA", abs(imponibile));
 | ||
| 		ipmov.set("ID_IVA", scod2ricl(IVA, rivamov.get(RMI_CODIVA)));
 | ||
| 		ipmov.set("Importo_IVA", abs(imposta));
 | ||
| 		ipmov.set("Indetraibilit<EFBFBD>", ind2perc(rivamov.get(RMI_TIPODET)));
 | ||
| 		ipmov.set("ID_CauRiga", "" ); // finire
 | ||
| 		ipmov.set("ID_RegIVA_Vendite", reg_regol);
 | ||
| 		ipmov.set("Prot_IVA_Vendite", prot_regol);
 | ||
| //				ipmov.set("ID_Scadenza", numreg); // verificare
 | ||
| 		ipmov.set("TitolareP_IVA", alleg != 6 ? "S" : "N");
 | ||
| 	}
 | ||
| 	add_mov_cg(mov, ipmov, reg_regol, prot_regol, 'D');
 | ||
| }
 | ||
| 
 | ||
| void TIP_sender::add_mov(TISAM_recordset & mov, TIP_movimenti_textset & ipmov)
 | ||
| {
 | ||
|   TString msg; msg << TR("Registrazione n.") << ' ' << mov.get(MOV_NUMREG);
 | ||
|   log(0, msg);
 | ||
| 
 | ||
| 	const TRecnotype pos = mov.current_row(); // Salva la posizione
 | ||
|   const bool is_intra = mov_intra(mov);
 | ||
| 	TVariant reg_regol;
 | ||
| 	TVariant prot_regol;
 | ||
| 
 | ||
| 	if (is_intra ||	mov_reverse_charge(mov))
 | ||
| 	{
 | ||
| 		if (find_regolarizzazione(mov))
 | ||
| 		{
 | ||
| 			prot_regol =  mov.get(MOV_PROTIVA).as_int();
 | ||
| 			reg_regol = scod2ricl(REG, mov.get(MOV_REG));
 | ||
| 		}
 | ||
| 		else
 | ||
| 		{
 | ||
| 			if (is_intra)
 | ||
| 				log(2, TR("Manca la regolarizzazione del movimento intra"));
 | ||
| 			else
 | ||
| 				log(2, TR("Manca la regolarizzazione del movimento reverse charge"));
 | ||
| 		}
 | ||
| 		mov.move_to(pos); // Ripristina posizione
 | ||
| 	}
 | ||
| 
 | ||
| 	const bool moviva = !mov.get(MOV_REG).is_empty();
 | ||
| 
 | ||
| 	if (moviva)
 | ||
| 		add_mov_iva(mov, ipmov, reg_regol, prot_regol);
 | ||
| 	else
 | ||
| 		add_mov_cg(mov,ipmov, reg_regol, prot_regol);
 | ||
| }
 | ||
| 
 | ||
| void TIP_sender::transfer_mov(const char * path)
 | ||
| {
 | ||
|   log(0, "Movimenti");
 | ||
| 
 | ||
| 	TIP_movimenti_textset ipmov;
 | ||
| 	TString query;
 | ||
| 	
 | ||
| 	query << "USE " << LF_MOV << " KEY 2 SELECT " << MOV_INVIATO << "!=\"X\"\n"
 | ||
| 		    << "FROM " << MOV_DATAREG << "=" << _mask->get_date(F_DATA_DA) << "\n"
 | ||
| 				<< "TO " << MOV_DATAREG << "=" << _mask->get_date(F_DATA_AL) << "\n";      
 | ||
| 
 | ||
| 	TISAM_recordset mov(query);
 | ||
| 	_errors_logged = false;
 | ||
|   TProgind pi(mov.items(), TR("Scansione movimenti"), true, true);
 | ||
| 
 | ||
|   for (bool ok = mov.move_first(); ok && pi.addstatus(1); ok = mov.move_next())
 | ||
| 		if (!mov_regolarizzazione(mov))
 | ||
| 			add_mov(mov, ipmov);					
 | ||
| 
 | ||
|   bool save = true;
 | ||
| 	_errors |= _errors_logged;
 | ||
|   if (_errors_logged)
 | ||
|     save = yesno_box(TR("Sono stati riscontrati uno o piu' errori:\n"
 | ||
|                         "Si desidera salvare il file ugualmente?"));
 | ||
|   if (save)
 | ||
|   {
 | ||
| 		TFilename name(path);
 | ||
| 
 | ||
| 		name.add("movimenti.txt");
 | ||
| 		ipmov.save_as(name);
 | ||
|   }
 | ||
| }
 | ||
| 
 | ||
| void TIP_sender::add_scad(TISAM_recordset & mov, TIP_scadenze_textset & ipscad)
 | ||
| {
 | ||
| 	TToken_string key;
 | ||
| 	const TVariant & numreg = mov.get(MOV_NUMREG);
 | ||
|   TString msg; msg << TR("Registrazione n.") << ' ' << numreg.as_string();
 | ||
|   log(0, msg);
 | ||
| 
 | ||
| 	key = numreg.as_string();
 | ||
| 	key.add(1);
 | ||
| 	const TRectype & partrec = _part->get(key);
 | ||
| 	TString query;
 | ||
| 	
 | ||
| 	query << "USE " << LF_SCADENZE << "\n"
 | ||
| 				<< "FROM " << SCAD_TIPOCF << "=" << mov.get(MOV_TIPO).as_string() << " " << SCAD_GRUPPO << "=\"\"" << " " << SCAD_CONTO << "=\"\""
 | ||
| 				<< " " << SCAD_SOTTOCONTO << "=" << mov.get(MOV_CODCF).as_string() << " " << SCAD_ANNO << "=" << partrec.get(PART_ANNO)
 | ||
| 				<< " " << SCAD_NUMPART << "=" << partrec.get(PART_NUMPART)	<< " " << SCAD_NRIGA << "=" << partrec.get(PART_NRIGA) << "\n"
 | ||
| 				<< "TO " << SCAD_TIPOCF << "=" << mov.get(MOV_TIPO).as_string() << " " << SCAD_GRUPPO << "=\"\"" << " " << SCAD_CONTO << "=\"\""
 | ||
| 				<< " " << SCAD_SOTTOCONTO << "=" << mov.get(MOV_CODCF).as_string() << " " << SCAD_ANNO << "=" << partrec.get(PART_ANNO)
 | ||
| 				<< " " << SCAD_NUMPART << "=" << partrec.get(PART_NUMPART)	<< " " << SCAD_NRIGA << "=" << partrec.get(PART_NRIGA) << "\n";
 | ||
| 
 | ||
| 	TISAM_recordset scad(query);
 | ||
| 
 | ||
| 	for (bool ok = scad.move_first(); ok; ok = scad.move_next())
 | ||
| 	{
 | ||
| 		ipscad.new_rec();
 | ||
| 		ipscad.set("ID_Scadenza", ++_ultscadid); 
 | ||
| 		ipscad.set("Data_Scadenza", scad.get(SCAD_DATASCAD));
 | ||
| 		ipscad.set("Importo_Scadenza", scad.get(SCAD_IMPORTO)); 
 | ||
| 		ipscad.set("Importo_Divisa", scad.get(SCAD_IMPORTOVAL));
 | ||
| 		ipscad.set("ID_Divisa", scod2ricl(VAL, mov.get(MOV_CODVAL)));
 | ||
| 		ipscad.set("ID_Tipo_Pagamento", pag2tipo(mov.get(MOV_CODPAG)));
 | ||
| 		ipscad.set("ID_Movimento", numreg);
 | ||
| 	}
 | ||
| }
 | ||
| 
 | ||
| void TIP_sender::transfer_scad(const char * path)
 | ||
| {
 | ||
|   log(0, "Scadenze");
 | ||
| 
 | ||
| 	TIP_scadenze_textset ipscad;
 | ||
| 	TString query;
 | ||
| 	
 | ||
| 	query << "USE " << LF_MOV << " KEY 2 SELECT (" << MOV_INVIATO << "!=\"X\")&&(" << MOV_REG << "!=\"\")\n" 
 | ||
| 		    << "FROM " << MOV_DATAREG << "=" << _mask->get_date(F_DATA_DA) << "\n"
 | ||
| 				<< "TO " << MOV_DATAREG << "=" << _mask->get_date(F_DATA_AL) << "\n";      
 | ||
| 	
 | ||
| 	TISAM_recordset mov(query);
 | ||
| 	_errors_logged = false;
 | ||
|   TProgind pi(mov.items(), TR("Scansione scadenze"), true, true);
 | ||
| 
 | ||
|   for (bool ok = mov.move_first(); ok && pi.addstatus(1); ok = mov.move_next())
 | ||
| 	{
 | ||
| 	  const int anno = mov.get(MOV_ANNOIVA).as_int();
 | ||
| 		const TCausale & caus = _causali->causale(mov.get(MOV_CODCAUS).as_string(), anno);
 | ||
| 		if (caus.tipomov() > 0 && caus.tipomov() <= 2)
 | ||
| 			add_scad(mov, ipscad);					
 | ||
| 	}
 | ||
| 
 | ||
|   bool save = true;
 | ||
| 	_errors |= _errors_logged;
 | ||
|   if (_errors_logged)
 | ||
|     save = yesno_box(TR("Sono stati riscontrati uno o piu' errori:\n"
 | ||
|                         "Si desidera salvare il file ugualmente?"));
 | ||
|   if (save)
 | ||
|   {
 | ||
| 		TFilename name(path);
 | ||
| 
 | ||
| 		name.add("scadenze.txt");
 | ||
| 		ipscad.save_as(name);
 | ||
|   }
 | ||
| }
 | ||
| 
 | ||
| void TIP_sender::transfer_cesp(const char * path)
 | ||
| {
 | ||
| }
 | ||
| 
 | ||
| void TIP_sender::transfer_cat(const char * path)
 | ||
| {
 | ||
| }
 | ||
| 
 | ||
| void TIP_sender::add_intra(TISAM_recordset & mov, TIP_intra_textset & ipintra)
 | ||
| {
 | ||
| 	TToken_string key;
 | ||
| 	const TVariant & numreg = mov.get(MOV_NUMREG);
 | ||
|   TString msg; msg << TR("Registrazione n.") << ' ' << numreg.as_string();
 | ||
|   log(0, msg);
 | ||
| 
 | ||
| 	TString query;
 | ||
| 	
 | ||
| 	query << "USE " << LF_RINTRA << "\n" 
 | ||
| 				<< "JOIN " << LF_INTRA << "INTO " << INTRA_NUMREG << "==" << RINTRA_NUMREG << "\n"
 | ||
| 				<< "FROM " << INTRA_NUMREG << "==" << numreg << "\n" 
 | ||
| 				<< "TO " << INTRA_NUMREG << "==" << numreg << "\n";
 | ||
| 	
 | ||
| 	TISAM_recordset intra(query);
 | ||
| 
 | ||
| 	for (bool ok = intra.move_first(); ok; ok = intra.move_next())
 | ||
| 	{
 | ||
| 		ipintra.new_rec();
 | ||
| 		const bool cess = intra.get(INTRA_TIPOCF).as_string() == "C";
 | ||
| 
 | ||
| 		ipintra.set("ID_Subconto", intra.get(LF_INTRA, INTRA_CODCF));
 | ||
| 		ipintra.set("ID_Movim_CG", numreg);
 | ||
| 		ipintra.set("Data_Riferimento", intra.get(LF_INTRA, INTRA_DATAREG));
 | ||
| 		ipintra.set("TipoMovimento", cess ? "C" : "A"); // verificare
 | ||
| 		ipintra.set("Importo", intra.get(RINTRA_AMMLIRE));
 | ||
| 		ipintra.set("Importo_Divisa", intra.get(RINTRA_AMMVALUTA));
 | ||
| 		ipintra.set("ID_NaturaTransazione", intra.get(RINTRA_NATURA));
 | ||
| 		ipintra.set("ID_NomenclaturaCombinata", intra.get(RINTRA_NOMENCL));
 | ||
| 		ipintra.set("ID_CondizioniConsegna", scod2ricl(ICC, intra.get(RINTRA_CONSEGNA)));
 | ||
| 		ipintra.set("ID_ModalitaTrasporto", intra.get(RINTRA_TRASPORTO));
 | ||
| 		ipintra.set("ID_ProvinciaDest", intra.get(RINTRA_PROV));
 | ||
| 		ipintra.set("ID_NazioneProvenienza", intra.get(RINTRA_PAESE));
 | ||
| 		ipintra.set("ID_NazioneOrigine", intra.get(RINTRA_PAESEORIG));
 | ||
| 		ipintra.set("MassaNetta", intra.get(RINTRA_MASSAKG));
 | ||
| 		ipintra.set("UnitaSupplementari", intra.get(RINTRA_MASSAUMS));
 | ||
| 		ipintra.set("ValoreStatistico", intra.get(RINTRA_VALSTAT));
 | ||
| 	}
 | ||
| }
 | ||
| 
 | ||
| void TIP_sender::transfer_intra(const char * path)
 | ||
| {
 | ||
|   log(0, "Intra");
 | ||
| 
 | ||
| 	TIP_intra_textset ipintra;
 | ||
| 	TString query;
 | ||
| 	
 | ||
| 	query << "USE " << LF_MOV << " KEY 2 SELECT (" << MOV_INVIATO << "!=\"X\")&&(" << MOV_REG << "!=\"\")\n" 
 | ||
| 		    << "FROM " << MOV_DATAREG << "=" << _mask->get_date(F_DATA_DA) << "\n"
 | ||
| 				<< "TO " << MOV_DATAREG << "=" << _mask->get_date(F_DATA_AL) << "\n";      
 | ||
| 
 | ||
| 	TISAM_recordset  mov(query);
 | ||
| 	_errors_logged = false;
 | ||
|   TProgind pi(mov.items(), TR("Scansione scadenze"), true, true);
 | ||
| 
 | ||
|   for (bool ok = mov.move_first(); ok && pi.addstatus(1); ok = mov.move_next())
 | ||
| 		add_intra(mov, ipintra);					
 | ||
| 
 | ||
|   bool save = true;
 | ||
| 	_errors |= _errors_logged;
 | ||
|   if (_errors_logged)
 | ||
|     save = yesno_box(TR("Sono stati riscontrati uno o piu' errori:\n"
 | ||
|                         "Si desidera salvare il file ugualmente?"));
 | ||
|   if (save)
 | ||
|   {
 | ||
| 		TFilename name(path);
 | ||
| 
 | ||
| 		name.add("intra.txt");
 | ||
| 		ipintra.save_as(name);
 | ||
|   }
 | ||
| }
 | ||
| 
 | ||
| void TIP_sender::set_parameters()
 | ||
| {
 | ||
| 	TConfig configtc(CONFIG_DITTA, "tc");
 | ||
| 	TAssoc_array& tab = configtc.list_variables();
 | ||
| 		
 | ||
| 	FOR_EACH_ASSOC_STRING(tab, h, k, v)
 | ||
| 	{
 | ||
| 		TString16 var(k);
 | ||
| 
 | ||
| 		if (var.starts_with("IPR"))
 | ||
| 		{
 | ||
| 			const bool ric = (*v > ' ') && strchr("1SXY", *v) != NULL;
 | ||
| 
 | ||
| 			if (ric)
 | ||
| 			{
 | ||
| 				var.format("IP%s", (const char *)var.mid(3));
 | ||
| 				_riclassifica.add(var, NULL);
 | ||
| 			}
 | ||
| 		}
 | ||
| 	}
 | ||
| 	_ultscadid = configtc.get_long("IPULTSCADID");
 | ||
| }
 | ||
| 
 | ||
| TMask & TIP_sender::get_mask()
 | ||
| {
 | ||
| 	if (_mask == NULL)
 | ||
| 	{
 | ||
| 		_mask = new TIP_mask("tc2700a");
 | ||
| 		TDate to(TODAY);
 | ||
| 		TConfig configtc(CONFIG_DITTA, "tc");
 | ||
| 		const TDate from(configtc.get("IPULTINV"));
 | ||
| 
 | ||
| 		if (from.ok())
 | ||
| 			to.addmonth(-1);
 | ||
| 		to.set_end_month();
 | ||
| 		if (to <= from)
 | ||
| 		{
 | ||
| 			to = from;
 | ||
| 			to.addmonth(1);
 | ||
| 			to.set_end_month();
 | ||
| 		}
 | ||
| 		_mask->set(F_DATA_DA, from);
 | ||
| 		_mask->set(F_DATA_AL, to);
 | ||
| 	}
 | ||
| 	return * _mask;
 | ||
| }
 | ||
| 	
 | ||
| bool search_reg(const TRelation& rel, void* pJolly)
 | ||
| {
 | ||
| 	TAssoc_array * _caus_regolarizzazione =	(TAssoc_array *) pJolly;
 | ||
| 	const bool solaiva = rel.lfile().get_bool(CAU_SOLOIVA);
 | ||
| 	const TString codcaus = rel.lfile().get(CAU_CODCAUREG);
 | ||
| 
 | ||
| 	if (codcaus.full())
 | ||
| 		_caus_regolarizzazione->add(codcaus, codcaus);
 | ||
| 	
 | ||
| 	return true;
 | ||
| }
 | ||
| 
 | ||
| void TIP_sender::postprocess_movs(TRecordset & mov)
 | ||
| {
 | ||
| 	if (yesno_box(TR("Confermare il traferimento")))
 | ||
| 	{
 | ||
| 		TConfig configtc(CONFIG_DITTA);
 | ||
| 		TMask & m = get_mask();
 | ||
| 
 | ||
| 		configtc.set("IPULTINV", m.get_date(F_DATA_AL));
 | ||
| 		configtc.set("IPULTSCADID", _ultscadid);
 | ||
| 
 | ||
| 		if (mov.items() > 0L)
 | ||
| 		{
 | ||
| 			TProgind pi(mov.items(), TR("Conferma movimenti"), true, true);
 | ||
| 			TLocalisamfile cgmov(LF_MOV);
 | ||
| 		
 | ||
| 			for (bool ok = mov.move_first(); ok; ok = mov.move_next())
 | ||
| 			{
 | ||
| 				if (!pi.addstatus(1))
 | ||
| 					break;
 | ||
| 
 | ||
| 				const long numreg = mov.get(MOV_NUMREG).as_int();
 | ||
| 
 | ||
| 				cgmov.put(MOV_NUMREG, numreg);
 | ||
| 				if (cgmov.read(_isequal, _lock) == NOERR)
 | ||
| 				{
 | ||
| 					cgmov.put(MOV_INVIATO, true);
 | ||
| 					cgmov.rewrite();
 | ||
| 				}
 | ||
| 			}
 | ||
| 		}
 | ||
| 	}
 | ||
| }
 | ||
| 
 | ||
| bool TIP_sender::create()
 | ||
| {
 | ||
| 	TRelation rel(LF_CAUSALI);
 | ||
| 	TCursor c(&rel);
 | ||
|   bool ok = c.scan(search_reg, &_caus_regolarizzazione, "Ricerca causali di regolarizzazione");
 | ||
| 	
 | ||
| 	_tabelle = new TIPRiclassifica_cache;
 | ||
| 	_part = new TRecord_cache(LF_PARTITE, 2);
 | ||
| 	_causali = new TCausali_cache;
 | ||
| 	set_parameters();
 | ||
| 	return TSkeleton_application::create();
 | ||
| }
 | ||
| 
 | ||
| bool TIP_sender::destroy()
 | ||
| {
 | ||
| 	delete _tabelle;
 | ||
| 	delete _part;
 | ||
| 	delete _causali;
 | ||
| 	delete _mask;
 | ||
| 	return TSkeleton_application::destroy();
 | ||
| }
 | ||
| 
 | ||
| void TIP_sender::main_loop()
 | ||
| {
 | ||
| 	TMask & m = get_mask();
 | ||
|   while (m.run() != K_QUIT)
 | ||
|   {
 | ||
| 		TFilename path = m.get(F_PATH);
 | ||
| 	
 | ||
| 		_book = new TReport_book;
 | ||
| 		const char* const title = TR("Invio a IPSOA");
 | ||
| 		_log = new TLog_report(title);
 | ||
| 		_errors = false;
 | ||
| 		if (m.get_bool(F_CLIENTI))
 | ||
| 			transfer_cli(path);
 | ||
| 		if (m.get_bool(F_FORNITORI))
 | ||
| 			transfer_forn(path);
 | ||
| 		if (m.get_bool(F_MOVIMENTI))
 | ||
| 			transfer_mov(path);
 | ||
| 		if (m.get_bool(F_SCADENZE))
 | ||
| 			transfer_scad(path);
 | ||
| 		if (m.get_bool(F_CESPITI))
 | ||
| 			transfer_cesp(path);
 | ||
| 		if (m.get_bool(F_CATEGORIE))
 | ||
| 			transfer_cat(path);
 | ||
| 		if (m.get_bool(F_INTRASTAT))
 | ||
| 			transfer_intra(path);
 | ||
| 
 | ||
| 	  _book->add(*_log);
 | ||
| 		_book->preview();
 | ||
| 		if (!_errors)
 | ||
| 		{
 | ||
| 			TString query;
 | ||
| 
 | ||
| 			query << "USE " << LF_MOV << " KEY 2 SELECT " << MOV_INVIATO << "!=\"X\"\n" << "FROM " << MOV_DATAREG << "=#DATA_DA\n" << "TO " << MOV_DATAREG << "=#DATA_AL";      
 | ||
| 
 | ||
| 			TISAM_recordset mov(query);
 | ||
| 			postprocess_movs(mov);
 | ||
| 		}
 | ||
| 		delete _book;
 | ||
| 		delete _log;
 | ||
|   }
 | ||
| }
 | ||
| int tc2700(int argc, char* argv[])
 | ||
| {
 | ||
|   TIP_sender app;
 | ||
|   app.run(argc, argv, TR("Invio a IPSOA"));
 | ||
|   return 0;
 | ||
| }
 |