Files correlati : Ricompilazione Demo : [ ] Commento : Riportata la versione 3.2 1010 git-svn-id: svn://10.65.10.50/trunk@16380 c028cbd2-c16b-5b4b-a496-9718f37d4682
		
			
				
	
	
		
			413 lines
		
	
	
		
			9.9 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			413 lines
		
	
	
		
			9.9 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
#include <applicat.h>
 | 
						||
#include <automask.h>
 | 
						||
#include <progind.h>
 | 
						||
#include <reputils.h>
 | 
						||
#include <utility.h>
 | 
						||
#include <textset.h>
 | 
						||
#include <reprint.h>
 | 
						||
#include <scanner.h>
 | 
						||
 | 
						||
#include "tc0.h"
 | 
						||
#include "tc0600a.h"
 | 
						||
 | 
						||
#include "pconti.h"
 | 
						||
#include "causali.h"
 | 
						||
#include "tabutil.h"
 | 
						||
 | 
						||
                                      ///////////////////////////////////////////////
 | 
						||
                                      //// CLASSI DERIVATE PER IMPORTAZIONE DATI ////
 | 
						||
                                      ///////////////////////////////////////////////  
 | 
						||
 | 
						||
/////////////////////////////////////////////////////////////
 | 
						||
//	Recordset specifici per i dati da trasferire
 | 
						||
/////////////////////////////////////////////////////////////
 | 
						||
 | 
						||
//Piano dei conti
 | 
						||
class TImporta_pconto_recordset : public TCSV_recordset
 | 
						||
{
 | 
						||
  public:
 | 
						||
    TImporta_pconto_recordset(const char * fileName);
 | 
						||
};
 | 
						||
 | 
						||
TImporta_pconto_recordset::TImporta_pconto_recordset(const char * fileName)
 | 
						||
                          : TCSV_recordset("CSV(\"|\")")
 | 
						||
{
 | 
						||
	load_file(fileName);
 | 
						||
}
 | 
						||
 | 
						||
                                      ///////////////////////////////////////////////
 | 
						||
                                      ////      DEFINIZIONE CLASSE TAutomask     ////
 | 
						||
                                      ///////////////////////////////////////////////
 | 
						||
 | 
						||
class TImportaTS_mask : public TAutomask
 | 
						||
{
 | 
						||
protected:
 | 
						||
  virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
 | 
						||
 | 
						||
public:
 | 
						||
  TImportaTS_mask();
 | 
						||
};
 | 
						||
  
 | 
						||
TImportaTS_mask::TImportaTS_mask() :TAutomask ("tc0600a")
 | 
						||
{
 | 
						||
}  
 | 
						||
 | 
						||
bool TImportaTS_mask::on_field_event(TOperable_field& f, TField_event e, long jolly)
 | 
						||
{ 
 | 
						||
	switch (f.dlg())
 | 
						||
	{
 | 
						||
		//giochetto per avere la lista dei files validi nella directory di trasferimento!
 | 
						||
		case F_PCONTI:
 | 
						||
			if (e == fe_button)
 | 
						||
			{
 | 
						||
				TArray_sheet as(-1, -1, 72, 20, TR("Selezione file"), 
 | 
						||
                           "File@32");
 | 
						||
				TFilename path = get(F_PATH);
 | 
						||
				path.add("*.txt");	//files delle testate
 | 
						||
				list_files(path, as.rows_array());
 | 
						||
				TFilename name;
 | 
						||
				FOR_EACH_ARRAY_ROW(as.rows_array(), i, row)
 | 
						||
				{
 | 
						||
					name = *row;
 | 
						||
					*row = name.name();
 | 
						||
				}
 | 
						||
				if (as.run() == K_ENTER)
 | 
						||
				{
 | 
						||
					f.set(as.row(as.selected()));
 | 
						||
				}
 | 
						||
			}
 | 
						||
      break;
 | 
						||
    case F_CAUSALI:
 | 
						||
      if (e == fe_button)
 | 
						||
			{
 | 
						||
				TArray_sheet as(-1, -1, 72, 20, TR("Selezione file"), 
 | 
						||
                           "File@32");
 | 
						||
				TFilename path = get(F_PATH);
 | 
						||
				path.add("*.txt");	//files delle testate
 | 
						||
				list_files(path, as.rows_array());
 | 
						||
				TFilename name;
 | 
						||
				FOR_EACH_ARRAY_ROW(as.rows_array(), i, row)
 | 
						||
				{
 | 
						||
					name = *row;
 | 
						||
					*row = name.name();
 | 
						||
				}
 | 
						||
				if (as.run() == K_ENTER)
 | 
						||
				{
 | 
						||
					f.set(as.row(as.selected()));
 | 
						||
				}
 | 
						||
			}
 | 
						||
			break;
 | 
						||
    case F_CODIVA:
 | 
						||
      if (e == fe_button)
 | 
						||
			{
 | 
						||
				TArray_sheet as(-1, -1, 72, 20, TR("Selezione file"), 
 | 
						||
                           "File@32");
 | 
						||
				TFilename path = get(F_PATH);
 | 
						||
				path.add("*.txt");	//files delle testate
 | 
						||
				list_files(path, as.rows_array());
 | 
						||
				TFilename name;
 | 
						||
				FOR_EACH_ARRAY_ROW(as.rows_array(), i, row)
 | 
						||
				{
 | 
						||
					name = *row;
 | 
						||
					*row = name.name();
 | 
						||
				}
 | 
						||
				if (as.run() == K_ENTER)
 | 
						||
				{
 | 
						||
					f.set(as.row(as.selected()));
 | 
						||
				}
 | 
						||
			}
 | 
						||
      break;
 | 
						||
		default:
 | 
						||
			break;
 | 
						||
	}
 | 
						||
  return true;
 | 
						||
}
 | 
						||
 | 
						||
///////////////////////////////////////
 | 
						||
// TSkeleton_application
 | 
						||
///////////////////////////////////////
 | 
						||
class TDocTS : public TSkeleton_application
 | 
						||
{
 | 
						||
	TImportaTS_mask*  				_msk;
 | 
						||
	
 | 
						||
protected:
 | 
						||
  //metodi che fanno gli inserimenti sulle tabelle di campo
 | 
						||
  void upload_pconti (const TFilename& file, TLog_report& log) const;
 | 
						||
  void upload_causali(const TFilename& file, TLog_report& log) const;
 | 
						||
  void upload_codiva (const TFilename& file, TLog_report& log) const;
 | 
						||
  
 | 
						||
public:           
 | 
						||
  virtual bool create();
 | 
						||
  virtual bool destroy();
 | 
						||
  virtual void main_loop();
 | 
						||
  bool transfer();
 | 
						||
 
 | 
						||
  TDocTS() {};
 | 
						||
};
 | 
						||
 | 
						||
TDocTS& app() { return (TDocTS&) main_app(); }
 | 
						||
 | 
						||
//funzione che importa il piano dei conto sulla tabella corretta
 | 
						||
void TDocTS::upload_pconti (const TFilename& file, TLog_report& log) const
 | 
						||
{
 | 
						||
  TImporta_pconto_recordset s(file); //crea un recordset con struttura predefinita come indicato nella classe opportuna
 | 
						||
  
 | 
						||
  TLocalisamfile pconti(LF_PCON); //instanzio l'ISAM file che lavota sulla tabella PCON
 | 
						||
    
 | 
						||
  TProgind pi(s.items(),"Importazione Piano dei Conti in Corso...",true,true);
 | 
						||
 | 
						||
  for (bool ok=s.move_first();ok;ok=s.move_next())
 | 
						||
  {
 | 
						||
    if (!pi.addstatus(1)) 
 | 
						||
      break;
 | 
						||
    
 | 
						||
    //salto le righe di testata del file
 | 
						||
    //per farlo leggo il gruppo e controllo che sia numerico
 | 
						||
    TString dconto = s.get(1).as_string();
 | 
						||
    if (!isdigit(dconto[1]))
 | 
						||
      continue;
 | 
						||
 | 
						||
    TString4 gr = dconto.mid(0,2); //leggo il gruppo
 | 
						||
    TString4 co = dconto.mid(3,2); //leggo il conto
 | 
						||
    TString4 sc = dconto.mid(6,3);   //leggo il sottoconto
 | 
						||
    TString desc = s.get(2).as_string(); //leggo la descrizione
 | 
						||
 | 
						||
    if (co == "  " || co == "**")
 | 
						||
    {
 | 
						||
      co = "00";
 | 
						||
      atoi(co);
 | 
						||
    }
 | 
						||
 | 
						||
    if (sc == "   " || sc == "***")
 | 
						||
    {
 | 
						||
      sc = "000";
 | 
						||
      atoi(sc);
 | 
						||
    }
 | 
						||
 | 
						||
    pconti.zero();
 | 
						||
 | 
						||
    pconti.put(PCN_GRUPPO,gr);  //put del gruppo
 | 
						||
    pconti.put(PCN_CONTO,co); //put del conto
 | 
						||
    pconti.put(PCN_SOTTOCONTO,sc);  //put del sottoconto
 | 
						||
    pconti.put(PCN_DESCR,desc); //put della descrizione
 | 
						||
 | 
						||
    TString str = "Il Conto ";
 | 
						||
    str << gr << " " << " " << co << " " << sc;   
 | 
						||
 | 
						||
 | 
						||
    //pconti.put(PCN_???,s.get("TCONTO").as_string());
 | 
						||
 | 
						||
    int err = pconti.write_rewrite(); //Tenta di aggiungere un record ma se esiste gia' lo aggiorna
 | 
						||
 | 
						||
    if (err == NOERR)
 | 
						||
    {
 | 
						||
      str << " <20> stato inserito";
 | 
						||
      log.log(0,str);
 | 
						||
    }
 | 
						||
    else
 | 
						||
    {
 | 
						||
      str << " non <20> stato inserito, errore " << err;
 | 
						||
      log.log(2,str);
 | 
						||
    }
 | 
						||
  }
 | 
						||
  return;
 | 
						||
}
 | 
						||
 | 
						||
//funzione che importa il piano dei conto sulla tabella corretta
 | 
						||
void TDocTS::upload_causali(const TFilename& file, TLog_report& log) const
 | 
						||
{
 | 
						||
  TScanner s(file); //legge il file che gli passo riga per riga
 | 
						||
  TString curr = s.line();
 | 
						||
  
 | 
						||
  TLocalisamfile causa(LF_CAUSALI); //instanzio l'ISAM file che lavota sulla tabella CAUS
 | 
						||
    
 | 
						||
  TProgind pi(fsize(file),"Importazione Causali in Corso...",true,true);
 | 
						||
 | 
						||
  while (s.ok())
 | 
						||
  {
 | 
						||
    if (!pi.addstatus(s.tellg())) 
 | 
						||
      break;
 | 
						||
    
 | 
						||
    curr = s.line();
 | 
						||
    TString8 cod = curr.mid(1,6);
 | 
						||
    cod.trim();
 | 
						||
    TString desc = curr.mid(7,16);
 | 
						||
    
 | 
						||
    //salto le righe di testata del file
 | 
						||
    if (!real::is_natural(cod))
 | 
						||
      continue;
 | 
						||
 | 
						||
    if (cod.len() > 3)
 | 
						||
    {
 | 
						||
      TString errore = "ERRORE:";
 | 
						||
      errore <<" la causale con codice " << cod << " non pu<70> essere inserita (codice max 3 caratteri)";
 | 
						||
      log.log(2,errore);
 | 
						||
    }
 | 
						||
    
 | 
						||
    //il codice causale deve essere sempre di tre caratteri zero-filled
 | 
						||
    while (cod.len() < 3)
 | 
						||
    {
 | 
						||
      cod.insert("0",0);
 | 
						||
    }
 | 
						||
 | 
						||
    causa.zero();
 | 
						||
 | 
						||
    causa.put(CAU_CODCAUS,cod);
 | 
						||
    causa.put(CAU_DESCR,desc);
 | 
						||
    
 | 
						||
    int err = causa.write_rewrite(); //Tenta di aggiungere un record ma se esiste gia' lo aggiorna
 | 
						||
 | 
						||
    TString str = "La Causale con codice ";
 | 
						||
    str << cod;
 | 
						||
    
 | 
						||
    if (err == NOERR)
 | 
						||
    {
 | 
						||
      str << " <20> stata inserita";
 | 
						||
      log.log(0,str);
 | 
						||
    }
 | 
						||
    else
 | 
						||
    {
 | 
						||
      str << " non <20> stata inserita, errore " << err;
 | 
						||
      log.log(2,str);
 | 
						||
    }
 | 
						||
 | 
						||
      
 | 
						||
  }
 | 
						||
  return;
 | 
						||
};
 | 
						||
  
 | 
						||
//funzione che importa i codici IVA sulla tabella corretta
 | 
						||
void TDocTS::upload_codiva(const TFilename& file, TLog_report& log) const
 | 
						||
{
 | 
						||
  TScanner s(file); //crea un recordset con struttura predefinita come indicato nella classe opportuna
 | 
						||
  
 | 
						||
  TTable iva("%IVA"); //instanzio l'ISAM file che lavota sulla tabella IVA
 | 
						||
    
 | 
						||
  TProgind pi(fsize(file),"Importazione Dati IVA in Corso...",true,true);
 | 
						||
 | 
						||
  while(s.ok())
 | 
						||
  {
 | 
						||
    if (!pi.addstatus(s.tellg())) 
 | 
						||
      break;
 | 
						||
    
 | 
						||
    //salto le righe di testata del file
 | 
						||
    TString curr = s.line();
 | 
						||
    TString8 cod = curr.mid(1,8);
 | 
						||
    cod.trim();
 | 
						||
    TString desc = curr.mid(9,20);
 | 
						||
    
 | 
						||
    //salto le righe di testata del file
 | 
						||
    if (!real::is_natural(cod))
 | 
						||
      continue;
 | 
						||
 | 
						||
    if (cod.len() > 4)
 | 
						||
    {
 | 
						||
      TString errore = "ERRORE:";
 | 
						||
      errore <<" i dati IVA  con codice " << cod << " non possono essere inseriti (codice max 4 caratteri)";
 | 
						||
      log.log(2,errore);
 | 
						||
    }
 | 
						||
 | 
						||
    iva.zero();
 | 
						||
 | 
						||
    iva.put("CODTAB",cod);   
 | 
						||
    iva.put("S0",desc);
 | 
						||
    
 | 
						||
    int err = iva.write_rewrite(); //Tenta di aggiungere un record ma se esiste gia' lo aggiorna
 | 
						||
 | 
						||
    TString str = "I dati IVA con codice ";
 | 
						||
    str << cod;
 | 
						||
  
 | 
						||
 | 
						||
    if (err == NOERR)
 | 
						||
    {
 | 
						||
      str << " sono stati inseriti";
 | 
						||
      log.log(0,str);
 | 
						||
    }
 | 
						||
    else
 | 
						||
    {
 | 
						||
      str << " non sono stati inseriti, errore " << err;
 | 
						||
      log.log(2,str);
 | 
						||
    }
 | 
						||
  }
 | 
						||
  return;
 | 
						||
};
 | 
						||
 | 
						||
bool TDocTS::transfer()
 | 
						||
{
 | 
						||
  TLog_report log("Importazione documenti da TeamSystem");
 | 
						||
    
 | 
						||
  //prelevo il path dei file da caricare dalla maschera
 | 
						||
  TFilename path = _msk->get(F_PATH);
 | 
						||
  
 | 
						||
  const short ids [] = {F_PCONTI,F_CAUSALI,F_CODIVA,0};
 | 
						||
 | 
						||
  //eseguo tutte le importazioni (una alla volta)
 | 
						||
  for (int i = 0; ids[i]; i++)
 | 
						||
  {
 | 
						||
    //prelevo di volta in volta il nome del file giusto dalla maschera:
 | 
						||
    //prima il file Anagrafiche, poi quello delle fatture e poi quello delle ricevute
 | 
						||
    TFilename name = _msk->get(ids[i]);
 | 
						||
        
 | 
						||
    //se sono riuscito a prelevare un nome di file, allora:
 | 
						||
    if (name.full())
 | 
						||
    {
 | 
						||
      //costruisco il nome del file
 | 
						||
      TFilename full = path;
 | 
						||
      full.add(name);
 | 
						||
      
 | 
						||
      //se eiste il file, esegui l'elaborazione corretta
 | 
						||
      if (full.exist())
 | 
						||
      {
 | 
						||
        switch (i)
 | 
						||
        {
 | 
						||
        case 0: upload_pconti (full, log); break;
 | 
						||
        case 1: upload_causali(full, log); break;
 | 
						||
        case 2: upload_codiva (full, log); break;
 | 
						||
        default: break;
 | 
						||
        }
 | 
						||
      }
 | 
						||
    }
 | 
						||
  }
 | 
						||
 | 
						||
  TReport_book buc;
 | 
						||
  
 | 
						||
	buc.add(log);
 | 
						||
  if (buc.pages()>0)
 | 
						||
	  buc.preview(); //visualizzo il log di importazione dei documenti
 | 
						||
  
 | 
						||
  return true;
 | 
						||
}
 | 
						||
 | 
						||
bool TDocTS::create()
 | 
						||
{
 | 
						||
  _msk = new TImportaTS_mask();
 | 
						||
         
 | 
						||
  return TSkeleton_application::create();
 | 
						||
}
 | 
						||
 | 
						||
bool TDocTS::destroy()
 | 
						||
{
 | 
						||
	delete _msk;
 | 
						||
  return TApplication::destroy();
 | 
						||
}
 | 
						||
 | 
						||
void TDocTS::main_loop()
 | 
						||
{
 | 
						||
  KEY	tasto;
 | 
						||
	tasto = _msk->run();
 | 
						||
  if (tasto == K_ENTER)
 | 
						||
  {
 | 
						||
		if (transfer())
 | 
						||
		{
 | 
						||
			message_box(TR("Importazione documenti completata"));
 | 
						||
		}
 | 
						||
  }   
 | 
						||
}
 | 
						||
 | 
						||
int tc0600 (int argc, char* argv[])
 | 
						||
{
 | 
						||
  TDocTS main_app;
 | 
						||
  main_app.run(argc, argv, TR("Importazione Clienti/Fornitori"));
 | 
						||
  return true;
 | 
						||
}
 |