Files correlati : si0.exe Ricompilazione Demo : [ ] Commento : Aggiunta gestione del codice IVA diverso per gli articoli che iniziano con Z (detto da Roberto) git-svn-id: svn://10.65.10.50/trunk@10077 c028cbd2-c16b-5b4b-a496-9718f37d4682
		
			
				
	
	
		
			410 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			410 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
| #include <applicat.h>
 | |
| #include <filetext.h>
 | |
| #include <form.h>
 | |
| #include <mask.h>
 | |
| #include <relation.h>
 | |
| #include <tabutil.h>
 | |
| #include <printer.h>
 | |
| #include <progind.h>
 | |
| #include <utility.h>         
 | |
| #include <lffiles.h>         
 | |
| 
 | |
| #include "..\ve\velib.h"
 | |
| #include "si0100a.h"
 | |
| 
 | |
| /////////////////////////////////////////////////////
 | |
| // Classe TPag_file customizzata dalla TFile_text //
 | |
| /////////////////////////////////////////////////////
 | |
| class TPag_file: public TFile_text
 | |
| { 
 | |
| protected:
 | |
|   virtual void validate(TCursor& cur,TRecord_text &rec, TToken_string &val, TString& str);
 | |
| 
 | |
| public:
 | |
|   TPag_file(const TString& file_name, const TString& config_name);
 | |
|   virtual ~TPag_file() { }
 | |
| };
 | |
| 
 | |
| // gestione dei messaggi estesi nei campi
 | |
| void TPag_file::validate(TCursor& cur,TRecord_text &rec, TToken_string &s, TString& str)
 | |
| {
 | |
|   const TString code(s.get(0));
 | |
|   TString valore;
 | |
|   str = valore;
 | |
| }
 | |
| 
 | |
| TPag_file::TPag_file(const TString& file_name, const TString& config_name)
 | |
|           : TFile_text(file_name, config_name)
 | |
| {
 | |
| }
 | |
| 
 | |
| /////////////////////////////////////////////////////
 | |
| // Classe TCli_file customizzata dalla TFile_text //
 | |
| /////////////////////////////////////////////////////
 | |
| class TCli_file: public TFile_text
 | |
| { 
 | |
| protected:
 | |
|   virtual void validate(TCursor& cur,TRecord_text &rec, TToken_string &val, TString& str);
 | |
| 
 | |
| public:
 | |
|   TCli_file(const TString& file_name, const TString& config_name);
 | |
|   virtual ~TCli_file() { }
 | |
| };
 | |
| 
 | |
| // gestione dei messaggi estesi nei campi
 | |
| void TCli_file::validate(TCursor& cur,TRecord_text &rec, TToken_string &s, TString& str)
 | |
| {
 | |
|   const TString code(s.get(0));
 | |
|   TString valore;
 | |
|   str = valore;
 | |
| }
 | |
| 
 | |
| TCli_file::TCli_file(const TString& file_name, const TString& config_name)
 | |
|           : TFile_text(file_name, config_name)
 | |
| {
 | |
| }
 | |
| 
 | |
| /////////////////////////////////////////////////////
 | |
| // Classe TArt_file customizzata dalla TFile_text //
 | |
| /////////////////////////////////////////////////////
 | |
| class TArt_file: public TFile_text
 | |
| { 
 | |
| protected:
 | |
|   virtual void validate(TCursor& cur,TRecord_text &rec, TToken_string &val, TString& str);
 | |
| 
 | |
| public:
 | |
|   TArt_file(const TString& file_name, const TString& config_name);
 | |
|   virtual ~TArt_file() { }
 | |
| };
 | |
| 
 | |
| // gestione dei messaggi estesi nei campi
 | |
| void TArt_file::validate(TCursor& cur,TRecord_text &rec, TToken_string &s, TString& str)
 | |
| {
 | |
|   const TString code(s.get(0));
 | |
|   TString valore;
 | |
|   str = valore;
 | |
| }
 | |
| 
 | |
| TArt_file::TArt_file(const TString& file_name, const TString& config_name)
 | |
|           : TFile_text(file_name, config_name)
 | |
| {
 | |
| }
 | |
| 
 | |
| class TImport: public TSkeleton_application
 | |
| {
 | |
|   
 | |
| protected:
 | |
|   virtual bool create(void);
 | |
|   virtual void main_loop();
 | |
|   virtual bool destroy(void) ;
 | |
|   void transfer(void);
 | |
|   bool check_seq(TConfig & c);
 | |
|   bool localita2comune(const TString & cap, const TString & localita, TString & codice);
 | |
|   void update_cli(TCli_file & in, TRecord_text & r, TLocalisamfile & cli);
 | |
|   void update_art(TArt_file & in, TRecord_text & r, TLocalisamfile & art, TLocalisamfile & umart);
 | |
|   void update_doc(TPag_file & in, TRecord_text & r, TDocumento &doc, const char * codnum, const char * tipodoc,
 | |
|                   const char * tiporiga, const char * codiva, const char * codivaz);
 | |
|   virtual const char * extra_modules() const { return "BA"; }
 | |
| 
 | |
| public:
 | |
|   TImport() {}
 | |
|   virtual ~TImport() {}
 | |
| };
 | |
| 
 | |
| // restituisce un riferimento all' applicazione
 | |
| inline TImport& app() { return (TImport&) main_app();}
 | |
| 
 | |
| // creazione dell'applicazione
 | |
| bool TImport::create()
 | |
| {                         
 | |
|   open_files(LF_DOC, LF_RIGHEDOC, LF_CONDV, LF_RCONDV, LF_ANAMAG, LF_SCONTI, LF_UMART, 
 | |
|              LF_TAB, LF_TABCOM, LF_CLIFO, LF_CFVEN, LF_INDSP, LF_OCCAS, LF_PCON,
 | |
|              LF_MOVMAG, LF_RMOVMAG, LF_MAG, LF_SVRIEP, LF_AGENTI, LF_PERCPROV, LF_ATTIV, LF_CAUSALI, 0);
 | |
| 
 | |
|   return TSkeleton_application::create();
 | |
| }
 | |
| 
 | |
| // distruzione dell'applicazione
 | |
| bool TImport::destroy()
 | |
| {
 | |
|   return TSkeleton_application::destroy();
 | |
| }
 | |
| 
 | |
| // carica la maschera 
 | |
| void TImport::main_loop()
 | |
| { 
 | |
|   transfer();
 | |
| }
 | |
| 
 | |
| // trasferimento dati su file per ct bo
 | |
| void TImport::transfer()
 | |
| {  
 | |
|   TMask msk("si0100a");
 | |
|   TConfig c(CONFIG_STUDIO, "sipag");
 | |
|   msk.set(F_FILESEQ, c.get("FileSeq"));
 | |
|   msk.set(F_FILEPAG, c.get("FilePag"));
 | |
|   msk.set(F_FILECLI, c.get("FileCli"));
 | |
|   msk.set(F_FILEART, c.get("FileArt"));
 | |
|   
 | |
|   while (msk.run() != K_QUIT)
 | |
|   {
 | |
|     c.set("FileSeq", msk.get(F_FILESEQ));
 | |
|     c.set("FilePag", msk.get(F_FILEPAG));
 | |
|     c.set("FileCli", msk.get(F_FILECLI));
 | |
|     c.set("FileArt", msk.get(F_FILEART));
 | |
|   
 | |
|     if (check_seq(c)) 
 | |
|     {       
 | |
|       TRecord_text rec;
 | |
|       TProgind p(3L, "Trasferimento da AS/400");
 | |
|       TFilename clisrc(msk.get(F_FILECLI));
 | |
| 
 | |
|       if (clisrc.exist())
 | |
|       {
 | |
|         TCli_file clifile(clisrc, "cli.ini");
 | |
|         TLocalisamfile clienti(LF_CLIFO);
 | |
|         
 | |
|         clifile.open(clisrc,'r');  
 | |
|         while (clifile.read(rec) == NOERR)
 | |
|           update_cli(clifile, rec, clienti);
 | |
|         clifile.close();
 | |
|       }
 | |
|       p.addstatus(1L);
 | |
|       
 | |
|       TFilename artsrc(msk.get(F_FILEART));
 | |
| 
 | |
|       if (artsrc.exist())
 | |
|       {
 | |
|         TArt_file artfile(artsrc, "art.ini");
 | |
|         TLocalisamfile articoli(LF_ANAMAG);
 | |
|         TLocalisamfile umart(LF_UMART);
 | |
|         
 | |
|         artfile.open(artsrc,'r');
 | |
|         while (artfile.read(rec) == NOERR)
 | |
|           update_art(artfile, rec, articoli, umart);
 | |
|         artfile.close();
 | |
|       }
 | |
|       p.addstatus(1L);
 | |
|       
 | |
|       TFilename pagsrc(msk.get(F_FILEPAG));
 | |
|       
 | |
|       if (pagsrc.exist())
 | |
|       {
 | |
|         TPag_file pagfile(pagsrc, "pag.ini");
 | |
|         TDocumento doc;
 | |
|         TString codnum(c.get("CodNum"));
 | |
|         TString tipodoc(c.get("TipoDoc"));
 | |
|         TString tiporiga(c.get("TipoRiga"));                
 | |
|         TString codiva(c.get("CodIva"));                
 | |
|         TString codivaz(c.get("CodIvaZ"));                
 | |
|         
 | |
|         
 | |
|         pagfile.open(pagsrc,'r');
 | |
|         while (pagfile.read(rec) == NOERR)
 | |
|           update_doc(pagfile, rec, doc, codnum, tipodoc, tiporiga, codiva, codivaz);
 | |
|         pagfile.close();              
 | |
|       }
 | |
|       p.addstatus(1L);
 | |
|       
 | |
|       message_box("Operazione terminata");
 | |
|     }           
 | |
|   }
 | |
| }
 | |
| 
 | |
| //inizializza il cursore
 | |
| bool TImport::check_seq(TConfig & c)
 | |
| {            
 | |
|   TScanner seq(c.get("FileSeq")); 
 | |
|   const int expected_seq = c.get_int("Seq") + 1;
 | |
|   const int seqnum = seq.integer();
 | |
|   
 | |
|   if (expected_seq != seqnum)
 | |
|     return error_box("Il numero di sequenza trovato %d\nnon coincide con quello atteso %d", seqnum, expected_seq);
 | |
|   c.set("Seq", seqnum);
 | |
|   
 | |
|   return TRUE;
 | |
| }
 | |
| 
 | |
| int si0100(int argc, char* argv[])
 | |
| {
 | |
|   TImport a ;
 | |
|   a.run(argc, argv, "Ricezione da AS/400");
 | |
|   return 0;
 | |
| }
 | |
|   
 | |
| bool TImport::localita2comune(const TString & caporig, const TString & localita, TString & codice)
 | |
| {             
 | |
|   TLocalisamfile comuni (LF_COMUNI);                 
 | |
|   TString cap(caporig);
 | |
|   bool found = FALSE;
 | |
| 
 | |
|   if (cap.mid(2,1) == "1")
 | |
|   {
 | |
|     cap = cap.left(3);
 | |
|     cap << "00";
 | |
|   }
 | |
|   
 | |
|   comuni.setkey(3);
 | |
|   comuni.zero();
 | |
|   comuni.put("CAPCOM", cap);
 | |
|   
 | |
|   TRectype com (comuni.curr());  
 | |
|   codice = "";
 | |
|   
 | |
|   for (comuni.read(_isgteq); !comuni.eof() && !found; comuni.next())
 | |
|   {
 | |
|     if (comuni.curr() != com)
 | |
|       break;
 | |
|     
 | |
|     found = localita.compare(comuni.get("DENCOM"), 3, FALSE) == 0;
 | |
|     if (found)
 | |
|       codice = comuni.get("COM");
 | |
|   } 
 | |
|   return found;
 | |
| }
 | |
| 
 | |
| void TImport::update_cli(TCli_file & in, TRecord_text & r, TLocalisamfile & cli)
 | |
| {                  
 | |
|   cli.zero();
 | |
|   cli.put("TIPOCF", "C");
 | |
|   cli.put("CODCF", in.get_field(r, 1));
 | |
|   bool newrec = cli.read() != NOERR;
 | |
|   if (newrec)
 | |
|   {
 | |
|     cli.zero();
 | |
|     cli.put("TIPOCF", "C");
 | |
|     cli.put("CODCF", in.get_field(r, 1));
 | |
|   }               
 | |
|   
 | |
|   cli.put("RAGSOC", in.get_field(r, 2));
 | |
|   TString ind(in.get_field(r, 3));
 | |
|   TString loc;
 | |
|   
 | |
|   int p = ind.find('-');
 | |
|   if (p > 0)
 | |
|   {
 | |
|     loc = ind.mid(p+1);
 | |
|     loc.strip("-");
 | |
|     loc.trim();
 | |
|     ind.cut(p);
 | |
|     ind.trim();
 | |
|   }
 | |
|   
 | |
|   p = ind.rfind(',');
 | |
|   if (p > 0)
 | |
|   {                    
 | |
|     cli.put("INDCF", ind.left(p));
 | |
|     cli.put("CIVCF", ind.mid(p+1));
 | |
|   }
 | |
|   else
 | |
|     cli.put("INDCF", ind.left(35));
 | |
|   
 | |
|   TString cap(in.get_field(r, 4));
 | |
|   
 | |
|   cli.put("CAPCF", cap);
 | |
|   cli.put("COFI", in.get_field(r, 6));
 | |
|   cli.put("PAIV", in.get_field(r, 7));
 | |
|   
 | |
|   TString localita(in.get_field(r, 8));    
 | |
|   TString codice;
 | |
|   
 | |
|   if (localita2comune(cap, localita, codice) == TRUE)
 | |
|     localita = "";    
 | |
| 
 | |
|   if (loc.not_empty())
 | |
|   {
 | |
|     localita.insert(" ");
 | |
|     localita.insert(loc);
 | |
|   }
 | |
|   cli.put("COMCF", codice);
 | |
|   cli.put("LOCALITACF", localita);
 | |
|   
 | |
|   if (newrec)
 | |
|     cli.write();
 | |
|   else
 | |
|     cli.rewrite();
 | |
| }
 | |
| 
 | |
| void TImport::update_art(TArt_file & in, TRecord_text & r, TLocalisamfile & art, TLocalisamfile & umart)
 | |
| {
 | |
|   art.zero();
 | |
|   art.put("CODART", in.get_field(r, 0));
 | |
|   bool newrec = art.read() != NOERR;
 | |
|   if (newrec)
 | |
|   {
 | |
|     art.zero();
 | |
|     art.put("CODART", in.get_field(r, 0));
 | |
|   }               
 | |
|   
 | |
|   art.put("DESCR", in.get_field(r, 1));
 | |
|   
 | |
|   if (newrec)
 | |
|   {
 | |
|     art.write();
 | |
|     umart.zero();
 | |
|     umart.put("CODART", in.get_field(r, 0));
 | |
|     umart.put("NRIGA", "1");
 | |
|     umart.put("UM", "N.");
 | |
|     umart.put("FC", "1.00");
 | |
|     umart.write();
 | |
|   }  
 | |
|   else
 | |
|     art.rewrite();
 | |
| }
 | |
| 
 | |
| void TImport::update_doc(TPag_file & in, TRecord_text & r, TDocumento &doc, const char * codnum, const char * tipodoc,
 | |
|                          const char * tiporiga, const char * codiva, const char * codivaz)
 | |
| {                                        
 | |
|   doc.zero();
 | |
|   const bool newdoc = doc.read('D', TDate(TODAY).year(), codnum, atol(in.get_field(r, 1))) != NOERR;
 | |
|   const TDate oggi(TODAY);
 | |
|   
 | |
|   if (newdoc)
 | |
|   {
 | |
|     doc.zero();
 | |
|     
 | |
|     TDocumento::set_key(doc, 'D', oggi.year(), codnum, atol(in.get_field(r, 1)));
 | |
|     doc.set_tipo(tipodoc);      
 | |
|     doc.put("TIPOCF", "C");
 | |
|     doc.put("CODCF", in.get_field(r, 1));
 | |
|     doc.put("DATADOC", oggi);
 | |
|     doc.put("DATACONS", oggi);
 | |
|   }
 | |
|                   
 | |
|   TRiga_documento & riga = doc.new_row(tiporiga);
 | |
|   
 | |
|   const TString & cod = in.get_field(r, 2);
 | |
|   riga.put("CODART", cod);
 | |
|   riga.put("CODARTMAG", cod);
 | |
| 
 | |
|   TString descr = cache().get(LF_ANAMAG, cod, "DESCR");
 | |
| 
 | |
|   riga.put("DESCR", descr); 
 | |
|   riga.put("CHECKED", "X"); 
 | |
|   doc.put("DATACONS", oggi);
 | |
|   
 | |
|      
 | |
|   real qta(in.get_field(r, 3)); 
 | |
|   
 | |
|   if (qta == ZERO)
 | |
|     qta = 1.00;
 | |
| 
 | |
|   riga.put("UMQTA", "N."); 
 | |
|   riga.put("QTA", qta); 
 | |
|  
 | |
|   TString prezzo_str(in.get_field(r, 4));
 | |
|   prezzo_str.replace(',', '.');
 | |
|   
 | |
|   const real prezzo(prezzo_str);
 | |
|   riga.put("PREZZO", prezzo); 
 | |
|   if (cod[0] == 'Z')
 | |
|   	riga.put("CODIVA", codivaz); 
 | |
|   else
 | |
|   	riga.put("CODIVA", codiva); 
 | |
|                     
 | |
|   if (newdoc)
 | |
|     doc.write();
 | |
|   else
 | |
|     doc.rewrite();
 | |
| }
 |