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
		
			
				
	
	
		
			479 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			479 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
| #include <applicat.h>
 | ||
| #include <automask.h>
 | ||
| #include <progind.h>
 | ||
| #include <reputils.h>
 | ||
| #include <utility.h>
 | ||
| #include <relation.h>
 | ||
| #include <textset.h>
 | ||
| #include <reprint.h>
 | ||
| 
 | ||
| #include "pt0002.h"
 | ||
| #include "pt0002100a.h"
 | ||
| 
 | ||
| #include "../cg/cglib01.h"
 | ||
| 
 | ||
| #include "clifo.h"
 | ||
| #include "comuni.h"
 | ||
| 
 | ||
| ///////////////////////////////////////////////////////////
 | ||
| // TClient_textset
 | ||
| ///////////////////////////////////////////////////////////
 | ||
| 
 | ||
| class TClifo_recset : public TCSV_recordset
 | ||
| {
 | ||
| 	TAssoc_array _index;
 | ||
| 
 | ||
| protected:
 | ||
|   virtual TRecnotype new_rec(const char* buf = NULL);
 | ||
| 
 | ||
| public:
 | ||
|   const TString& rag_sociale() const;
 | ||
|   TClifo_recset(const char * query);
 | ||
| };
 | ||
| 
 | ||
| 
 | ||
| TRecnotype TClifo_recset::new_rec(const char* buf)
 | ||
| {
 | ||
|   TToken_string str(256,'\t'); //nuovo record tab separator
 | ||
| 
 | ||
|   if(buf && *buf)
 | ||
|   {
 | ||
|     bool apici=false;
 | ||
| 
 | ||
|     for (const char* c = buf; *c ; c++)
 | ||
|     {
 | ||
|       if (*c == '"')
 | ||
|       {
 | ||
|         apici = !apici;
 | ||
|       }
 | ||
|       else
 | ||
|       {
 | ||
|         if (*c == ',')
 | ||
|         {
 | ||
|           if (!apici)
 | ||
|             str << str.separator();
 | ||
|           else
 | ||
|             str << *c;
 | ||
|         }
 | ||
|         else
 | ||
|           str << *c;
 | ||
| 
 | ||
|       }
 | ||
|     }
 | ||
|   }
 | ||
| 
 | ||
|   const TRecnotype n = TText_recordset::new_rec(str);
 | ||
| 
 | ||
|   if (n >= 0)
 | ||
|     row(n).separator(str.separator());
 | ||
|   
 | ||
|   return n;
 | ||
| }
 | ||
| 
 | ||
| //funzione che crea il campo ragione sociale dai primi 2 campi del file csv
 | ||
| const TString& TClifo_recset::rag_sociale() const
 | ||
| {
 | ||
|   const TString& nome = get(1).as_string();
 | ||
|   TString ragsoc = get(0).as_string();
 | ||
|   if (nome.full())  
 | ||
|   {
 | ||
|     ragsoc.cut(30);
 | ||
|     ragsoc.left_just(30);
 | ||
|     ragsoc << nome;
 | ||
|   }
 | ||
|   ragsoc.cut(50);
 | ||
|   return get_tmp_string() = ragsoc;
 | ||
| }
 | ||
| 
 | ||
| TClifo_recset::TClifo_recset(const char * fileName)
 | ||
|              : TCSV_recordset("CSV(,)\n")
 | ||
| {
 | ||
|   load_file(fileName);
 | ||
| }
 | ||
| 
 | ||
| ///////////////////////////////////////////////////////////
 | ||
| // TAutomask
 | ||
| ///////////////////////////////////////////////////////////
 | ||
| 
 | ||
| class TImportaClifo_mask : public TAutomask
 | ||
| {
 | ||
| protected:
 | ||
|   virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
 | ||
| 
 | ||
| public:
 | ||
|   TImportaClifo_mask();
 | ||
| };
 | ||
|   
 | ||
| TImportaClifo_mask::TImportaClifo_mask() :TAutomask ("pt0002100a")
 | ||
| {
 | ||
| }  
 | ||
| 
 | ||
| bool TImportaClifo_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_NAME:
 | ||
| 			if (e == fe_button)
 | ||
| 			{
 | ||
| 				TArray_sheet as(-1, -1, 72, 20, TR("Selezione file"), 
 | ||
|                            "File@32");
 | ||
| 				TFilename path = get(F_PATH);
 | ||
| 				path.add("*.csv");	//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 TClifoCSV : public TSkeleton_application
 | ||
| {
 | ||
| 	virtual bool check_autorization() const {return false;}
 | ||
|   virtual const char * extra_modules() const {return "ve";}
 | ||
| 
 | ||
| 	TImportaClifo_mask*				_msk;
 | ||
| 	TConfig*							    _configfile;
 | ||
| 
 | ||
| 
 | ||
| protected:
 | ||
|   long find_clifo(const char tipo, const TString& cofi, const TString& paiv, const TString& ragsoc) const;
 | ||
|   bool safe_put(TLocalisamfile& clienti, const char* field, const char* val) const;
 | ||
| 	long find_last_clifo(const char tipo) const;
 | ||
|   void pulisci_cap(TString& cap) const;
 | ||
| 
 | ||
| 
 | ||
| public:           
 | ||
|   virtual bool create();
 | ||
|   virtual bool destroy();
 | ||
|   virtual void main_loop();
 | ||
|   virtual void ini2mask();
 | ||
|   virtual void mask2ini();
 | ||
| 	bool transfer(const TFilename& file);
 | ||
|  
 | ||
|   TClifoCSV() {};
 | ||
| };
 | ||
| 
 | ||
| TClifoCSV& app() { return (TClifoCSV&) main_app(); }
 | ||
| 
 | ||
| /////////////////////////////////
 | ||
| //		ricerca clifo
 | ||
| /////////////////////////////////
 | ||
| 
 | ||
| //funzione che ricerca un cliente o un fornitore nel file clifo di campo
 | ||
| //restituisce 0 (zero) se non lo trova, se no cerca il pi<70> simile possibile
 | ||
| long TClifoCSV::find_clifo(const char tipo, const TString& cofi, const TString& paiv, const TString& ragsoc) const
 | ||
| {
 | ||
|   long found=0;
 | ||
| 
 | ||
|   TRelation clifo(LF_CLIFO);
 | ||
|   TRectype& rec = clifo.curr();
 | ||
|   TString up_ragsoc = ragsoc;
 | ||
|   up_ragsoc.upper();
 | ||
| 
 | ||
|   for (int key = 4; key<=5 && !found; key++)
 | ||
|   {
 | ||
|     bool good_key = false; // Assumiamo che la chiave sia icompleta
 | ||
|     
 | ||
|     rec.zero();
 | ||
|     rec.put(CLI_TIPOCF,tipo);
 | ||
|     switch (key)
 | ||
|     {    
 | ||
|     case 4: rec.put(CLI_COFI,cofi);     good_key = cofi.full(); break;
 | ||
|     case 5: rec.put(CLI_PAIV,paiv);     good_key = paiv.full(); break;
 | ||
|     default: break;
 | ||
|     }
 | ||
| 
 | ||
|     if (good_key)  // Se la chiave e' completa ... cerco bene
 | ||
|     {
 | ||
|       TCursor cur(&clifo,"", key, &rec, &rec);
 | ||
|       const TRecnotype items = cur.items();
 | ||
| 
 | ||
|       if (items > 0)
 | ||
|       {
 | ||
|         double best = -1;
 | ||
| 
 | ||
|         TString80 cur_ragsoc;
 | ||
|         
 | ||
|         cur.freeze();
 | ||
|         for (cur=0; cur.pos() < items; ++cur)
 | ||
|         {
 | ||
|           cur_ragsoc = rec.get(CLI_RAGSOC);
 | ||
|           cur_ragsoc.upper();
 | ||
|     
 | ||
|           // funzione che mi dice quanto due stringhe si assomiglino
 | ||
|           const double var = xvt_str_fuzzy_compare(up_ragsoc, cur_ragsoc); 
 | ||
|           if (var > best)
 | ||
|           {
 | ||
|             best = var;
 | ||
|             found = rec.get_long(CLI_CODCF);
 | ||
|           }
 | ||
|         }
 | ||
|       }
 | ||
|     }
 | ||
|   }
 | ||
|   return found;
 | ||
| }
 | ||
| 
 | ||
| /////////////////////////////////
 | ||
| //		aggiornamento clifo
 | ||
| /////////////////////////////////
 | ||
| 
 | ||
| //funzione che effettua la put solo se non cerco di inserire un campo vuoto
 | ||
| bool TClifoCSV::safe_put(TLocalisamfile& file, const char* field, const char* val) const
 | ||
| {
 | ||
| 	const bool ok = val && *val;
 | ||
| 	if (ok)
 | ||
| 		file.put(field, val);
 | ||
| 	return ok;
 | ||
| }
 | ||
| 
 | ||
| //funzione che trova il primo codice libero di un cliento o di un fornitore
 | ||
| long TClifoCSV::find_last_clifo(const char tipo) const
 | ||
| {
 | ||
|   TLocalisamfile clifo(LF_CLIFO);
 | ||
|   long  codcf = 1L ;  
 | ||
|   if (tipo == 'C')
 | ||
|   {
 | ||
|     clifo.put(CLI_TIPOCF, 'F');
 | ||
|     if (clifo.read(_isgteq) == NOERR)
 | ||
|       clifo.prev();
 | ||
| 		else
 | ||
| 			clifo.last();
 | ||
| 
 | ||
|     if (clifo.get_char(CLI_TIPOCF) == 'C')
 | ||
|       codcf += clifo.get_long(CLI_CODCF);
 | ||
|   }
 | ||
|   else
 | ||
|   {
 | ||
|     clifo.last();
 | ||
|     if (clifo.get_char(CLI_TIPOCF) == 'F')
 | ||
|       codcf+=clifo.get_long(CLI_CODCF);
 | ||
|   }
 | ||
|   return codcf;
 | ||
| }
 | ||
| 
 | ||
| void TClifoCSV::pulisci_cap(TString& cap) const
 | ||
| {
 | ||
|   TString8 str;
 | ||
|   for (int i = 0; cap[i] && str.len() < 5; i++)
 | ||
|     if (isdigit(cap[i]))
 | ||
|       str << cap[i];
 | ||
|   cap = str;
 | ||
| }
 | ||
| 
 | ||
| bool TClifoCSV::transfer(const TFilename& file)
 | ||
| {
 | ||
|   const char tipo = _msk->get(F_TIPO)[0];
 | ||
|   const char* head = tipo == 'C' ? TR("Trasferimento clienti") : TR("Trasferimento fornitori");
 | ||
| 
 | ||
|   TLog_report log(head);
 | ||
|   
 | ||
|   TClifo_recset s(file);
 | ||
|   
 | ||
|   TLocalisamfile clifo(LF_CLIFO);
 | ||
|   
 | ||
|   TProgind pi(s.items(),head,true,true);
 | ||
| 
 | ||
|   for (bool ok=s.move_first();ok;ok=s.move_next())
 | ||
|   {
 | ||
|     if (!pi.addstatus(1)) 
 | ||
|       break;
 | ||
|     
 | ||
|     const TString ragsoc = s.rag_sociale();
 | ||
|     if (ragsoc.full())
 | ||
|     {
 | ||
|       const TString16 cofi = s.get(2).as_string(); //get da file del cod. fisc.
 | ||
|       const TString16 paiv = s.get(3).as_string(); //get da file della p. iva
 | ||
|     
 | ||
|       const long var = find_clifo(tipo,cofi,paiv,ragsoc); //controllo se il clifo esiste gi<67>
 | ||
| 
 | ||
|       clifo.zero();
 | ||
|       clifo.put(CLI_TIPOCF, tipo);
 | ||
|     
 | ||
|       if (var)
 | ||
|       {
 | ||
|         //se esiste leggo il record corrispondente
 | ||
|         clifo.put(CLI_CODCF,var);
 | ||
|         clifo.read();
 | ||
|       }
 | ||
|       else
 | ||
|       {
 | ||
|         //se no ne creo uno nuovo
 | ||
|         long codcf = find_last_clifo(tipo);
 | ||
| 		    clifo.put(CLI_CODCF, codcf);
 | ||
|       }
 | ||
|     
 | ||
| 	    safe_put(clifo, CLI_RAGSOC, ragsoc);	//ragsoc
 | ||
|       if (!var)
 | ||
|         safe_put(clifo, CLI_TIPOAPER, s.get(1).is_empty() ? "G" : "F");
 | ||
| 
 | ||
| 
 | ||
| 	    safe_put(clifo, CLI_PAIV, paiv);	//p.iva
 | ||
| 	    safe_put(clifo, CLI_COFI, cofi);	//cod. fisc.
 | ||
| 
 | ||
| 	    
 | ||
| 	    safe_put(clifo, CLI_INDCF, s.get(4).as_string());	//indirizzo
 | ||
|       safe_put(clifo, CLI_CIVCF, s.get(5).as_string());	//num. civico
 | ||
| 
 | ||
| 	    if (s.get(6).as_string().empty())                 //italiano
 | ||
|       {
 | ||
|         TString cap = s.get(9).as_string();
 | ||
| 
 | ||
|         pulisci_cap(cap);
 | ||
| 	      
 | ||
|         TString80 comune = s.get(11).as_string();	//comune o localita'
 | ||
| 	      comune.trim();
 | ||
| 	      safe_put(clifo, CLI_CAPCF, cap);		//cap
 | ||
| 	      const TString& codcom = cap2comune(cap, comune);
 | ||
| 	      if (codcom.blank())
 | ||
|         {
 | ||
| 		      if (s.get(10).as_string().full())
 | ||
|             comune << " (" << s.get(10).as_string() << ')'; //inserisce la localit<69> se non trova un comune
 | ||
|           safe_put(clifo, CLI_LOCCF, comune);
 | ||
|         }
 | ||
| 	      else
 | ||
| 		      safe_put(clifo, CLI_COMCF, codcom);
 | ||
|       }
 | ||
|       else
 | ||
|       {
 | ||
|         TString comune = s.get(7).as_string();
 | ||
|         comune << ", " << s.get(8).as_string() << '(' << s.get(6).as_string() <<')';  //inserisce la localit<69> estera
 | ||
|         safe_put(clifo, CLI_LOCCF, comune);
 | ||
|         if (!var)
 | ||
|           safe_put(clifo, CLI_ALLEG, "5");  // Cliente/Fornitore Estero
 | ||
|       }
 | ||
| 
 | ||
|       const char* tp = tipo == 'C' ? TR("Cliente") : TR("Fornitore");
 | ||
|       TString str;
 | ||
|       str << "Il "<< tp << " codice (" << clifo.get(CLI_CODCF) <<") " << ragsoc << " ";
 | ||
| 
 | ||
|       if (var)
 | ||
|       {
 | ||
|         const int err = clifo.rewrite();
 | ||
|         if (err == NOERR)
 | ||
|         {
 | ||
|           str << "<EFBFBD> stato aggiornato";
 | ||
|           log.log(0, str); 
 | ||
|         }
 | ||
|         else
 | ||
|         {
 | ||
|           str << "NON <20> stato aggiornato. Errore " << err;
 | ||
|           log.log(2, str); 
 | ||
|         }
 | ||
|       }
 | ||
|       else
 | ||
|       {
 | ||
|         const int err = clifo.write();
 | ||
|         if (err == NOERR)
 | ||
|         {
 | ||
|           str << "<EFBFBD> stato inserito";
 | ||
|           log.log(0, str); 
 | ||
|         }
 | ||
|         else
 | ||
|         {
 | ||
|           str << "NON <20> stato inserito. Errore " << err;
 | ||
|           log.log(2, str); 
 | ||
|         }
 | ||
|       }
 | ||
| 
 | ||
|       if (cofi.empty() && paiv.empty())
 | ||
|       {
 | ||
|         TString str;
 | ||
|         str << "Il " << tp << ' ' << ragsoc << " non ha n<> CODICE FISCALE n<> PARTITA IVA";
 | ||
|         log.log(1, str);
 | ||
|       }
 | ||
|     }
 | ||
| 
 | ||
|   }
 | ||
| 
 | ||
|   TReport_book buc;
 | ||
| 	buc.add(log);
 | ||
| 	buc.preview();
 | ||
| 
 | ||
|   return true;
 | ||
| }
 | ||
| 
 | ||
| void TClifoCSV::mask2ini()
 | ||
| {
 | ||
| 	//carica i parametri del file di configurazione
 | ||
| 	_configfile->set_paragraph("MAIN");
 | ||
|   for (int i = 0; i < _msk->fields() ; i++)
 | ||
| 	{
 | ||
| 		TMask_field& f = _msk->fld(i);
 | ||
| 		const TFieldref* fr = f.field();
 | ||
| 		if (fr != NULL)
 | ||
| 			_configfile->set(fr->name(), f.get());
 | ||
| 	}
 | ||
| }
 | ||
| 
 | ||
| void TClifoCSV::ini2mask()
 | ||
| {
 | ||
| 	//carica i parametri del file di configurazione
 | ||
| 	_configfile->set_paragraph("MAIN");
 | ||
|   for (int i = 0; i < _msk->fields() ; i++)
 | ||
| 	{
 | ||
| 		TMask_field& f = _msk->fld(i);
 | ||
| 		const TFieldref* fr = f.field();
 | ||
| 		if (fr != NULL)
 | ||
| 			f.set(_configfile->get(fr->name()));
 | ||
| 	}
 | ||
| }
 | ||
| 
 | ||
| bool TClifoCSV::create()
 | ||
| {
 | ||
|   _configfile = new TConfig("pt0002conf.ini");
 | ||
|   _msk = new TImportaClifo_mask();
 | ||
| 
 | ||
|          
 | ||
|   return TSkeleton_application::create();
 | ||
| }
 | ||
| 
 | ||
| bool TClifoCSV::destroy()
 | ||
| {
 | ||
| 	delete _msk;
 | ||
| 	delete _configfile;
 | ||
|   return TApplication::destroy();
 | ||
| }
 | ||
| 
 | ||
| void TClifoCSV::main_loop()
 | ||
| {
 | ||
|   KEY	tasto;
 | ||
| 	ini2mask();
 | ||
|   tasto = _msk->run();
 | ||
|   if (tasto == K_ENTER)
 | ||
|   {
 | ||
| 		mask2ini();
 | ||
| 
 | ||
|     //genero il nome del file da caricare
 | ||
|     TFilename name = _msk->get(F_PATH);
 | ||
|     name.add(_msk->get(F_NAME));
 | ||
| 		if (transfer(name))
 | ||
| 		{
 | ||
| 			message_box(TR("Importazione documenti completata"));
 | ||
| 		}
 | ||
|   }   
 | ||
| }
 | ||
| 
 | ||
| int pt0002100 (int argc, char* argv[])
 | ||
| {
 | ||
|   TClifoCSV main_app;
 | ||
|   main_app.run(argc, argv, TR("Importazione Clienti/Fornitori"));
 | ||
|   return true;
 | ||
| }
 |