Files correlati : ve0.exe ve6.exe Ricompilazione Demo : [ ] Commento Nella distribuzione delle spese senza conto sui movimenti contabile e analitico ora non cosidera piu' le righe di spesa. NB queste spese devono essere esenti per poter utilizzare questo meccanismo. git-svn-id: svn://10.65.10.50/branches/R_10_00@21000 c028cbd2-c16b-5b4b-a496-9718f37d4682
		
			
				
	
	
		
			398 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			398 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
| //#include <progind.h>
 | |
| #include <recset.h>
 | |
| 
 | |
| #include "velib04.h" 
 | |
| #include "ve6200.h"
 | |
| #include "ve6200a.h"
 | |
| 
 | |
| #include <doc.h> 
 | |
| 
 | |
| ///////////////////////////////////////////////////////////
 | |
| // TFatturazione_bolle_app
 | |
| ///////////////////////////////////////////////////////////
 | |
| 
 | |
| bool TFatturazione_bolle_app::create()
 | |
| {
 | |
|   open_files(LF_TABCOM, LF_TAB, LF_CLIFO, LF_OCCAS, LF_INDSP, LF_CFVEN, 
 | |
|              LF_DOC, LF_RIGHEDOC, LF_ANAMAG, LF_MOVMAG, LF_RMOVMAG, LF_CONDV, LF_SVRIEP, 
 | |
|              LF_AGENTI, LF_PERCPROV, LF_CAUSALI, 0);
 | |
|                                             
 | |
|   TConfig cfg(CONFIG_DITTA, "ve");
 | |
|   _default_selection = cfg.get("FATBOLSEL");
 | |
|              
 | |
|   return TSkeleton_application::create();
 | |
| }
 | |
| 
 | |
| bool TFatturazione_bolle_app::process(TIndwin& iw, TElaborazione & eld, 
 | |
|                                       TLista_documenti& din, const TDate& data_elab)
 | |
| {
 | |
|   // Crea documenti di output
 | |
|   TLista_documenti dout;
 | |
|   bool ok = true;
 | |
|   if (eld.elabora(din, dout, data_elab)) 
 | |
|   {
 | |
|     TString msg;
 | |
|     msg << din.items() << TR(" documenti raggruppati in ") << dout.items(); 
 | |
|     iw.set_text(msg);           // Messaggio sul cliente
 | |
|     do_events();                // Attende visualizzazione
 | |
| 
 | |
|     int err = dout.write();     // Scrive documenti di output
 | |
|     if (err == NOERR)
 | |
|     {
 | |
|       err = din.rewrite();      // Aggiorna stato dei documenti di input
 | |
|       if (err != NOERR)
 | |
|         ok = error_box("Errore %d durante la scrittura dei documenti raggruppati!", err);
 | |
|     }
 | |
|     else
 | |
|       ok = error_box("Errore %d durante l'aggiornamento dei documenti da raggruppare!", err);
 | |
|   }
 | |
|   return ok;
 | |
| }
 | |
| 
 | |
| void TFatturazione_bolle_app::process_by_cli(const TMask& m)
 | |
| {
 | |
|   TIndwin iw(0, "Inizializzazione...\n ", TRUE, FALSE, 60);
 | |
|   
 | |
|   const TDate data_elab = m.get_date(F_DATA_ELAB); 
 | |
|   const int anno = data_elab.year();
 | |
|     
 | |
|   const long dc = m.get_long(F_CODICE_CLIFO_DA);
 | |
|   const long ac = m.get_long(F_CODICE_CLIFO_A);
 | |
|   const int da = m.get_int(F_CODICE_AGENTE_DA);
 | |
|   const int aa = m.get_int(F_CODICE_AGENTE_A);
 | |
|   const TString16 dz(m.get(F_CODICE_ZONA_DA)); 
 | |
|   const TString16 az(m.get(F_CODICE_ZONA_A));
 | |
|     
 | |
|   const TDate dd = m.get_date(F_DATA_DOCUMENTO_DA);
 | |
|   TString st_da = m.get(F_DATA_DOCUMENTO_A); // qui verificare
 | |
|   const TDate ad = st_da.not_empty() ? (TDate)(const char*)st_da : data_elab;
 | |
|   const TString& codnum = m.get(F_CODICE_NUMERAZIONE);
 | |
|   const long dn = m.get_long(F_NUMERO_DOCUMENTO_DA);
 | |
|   const long an = m.get_long(F_NUMERO_DOCUMENTO_A);
 | |
|     
 | |
|   TElaborazione * e = elab(m.get(F_CODICE_ELAB));
 | |
|   TElaborazione & eld = *e;
 | |
|   TToken_string tipidoc(24), statidoc(10);
 | |
|   eld.tipi_stati_iniziali(tipidoc, statidoc);
 | |
|       
 | |
|   TTipo_documento t(eld.tipo_iniziale(0)); 
 | |
|   char tipocf(t.tipocf());
 | |
|   TLista_cf clienti(tipocf);
 | |
|   const int tot_cli = clienti.leggi(dc, ac, da, aa, dz, az);
 | |
|     
 | |
|   TString msg(80);
 | |
|   for (int c = 0; c < tot_cli && !iw.iscancelled(); c++)
 | |
|   { 
 | |
|     const long codcli = clienti[c];     // Codice cliente in esame
 | |
|     msg = "Elaborazione dei documenti del cliente "; 
 | |
|     msg << codcli << " ...";
 | |
|     iw.set_text(msg);                   // Messaggio sul cliente
 | |
|     do_events();                        // Attende visualizzazione
 | |
|       
 | |
|     TLista_documenti din;               // Legge tutti i documenti di input
 | |
|     din.read('D', tipocf, codcli, anno, tipidoc, statidoc, dd, ad, codnum, dn, an);
 | |
|     if (din.items() > 0 && !iw.iscancelled())
 | |
|     {
 | |
|       bool ok = process(iw, eld, din, data_elab);
 | |
|       if (!ok) // In caso di errore termina qui l'elaborazione.   
 | |
|         break;   
 | |
|     }
 | |
|   }
 | |
| 	delete e;
 | |
| }
 | |
| 
 | |
| void TFatturazione_bolle_app::process_by_ragsoc(const TMask& m)
 | |
| {
 | |
|   TIndwin iw(0, "Inizializzazione...\n ", TRUE, FALSE, 60);
 | |
|   
 | |
|   const TDate data_elab = m.get_date(F_DATA_ELAB); 
 | |
|   const int anno = data_elab.year();
 | |
|     
 | |
|   const TString dr = m.get(F_RAGSOC_CLIFO_DA);
 | |
|   const TString ar = m.get(F_RAGSOC_CLIFO_A);
 | |
|   const int da = m.get_int(F_CODICE_AGENTE_DA);
 | |
|   const int aa = m.get_int(F_CODICE_AGENTE_A);
 | |
|   const TString16 dz(m.get(F_CODICE_ZONA_DA)); 
 | |
|   const TString16 az(m.get(F_CODICE_ZONA_A));
 | |
|     
 | |
|   const TDate dd = m.get_date(F_DATA_DOCUMENTO_DA);
 | |
|   TString st_da = m.get(F_DATA_DOCUMENTO_A); // qui verificare
 | |
|   const TDate ad = st_da.not_empty() ? (TDate)(const char*)st_da : data_elab;
 | |
|   const TString& codnum = m.get(F_CODICE_NUMERAZIONE);
 | |
|   const long dn = m.get_long(F_NUMERO_DOCUMENTO_DA);
 | |
|   const long an = m.get_long(F_NUMERO_DOCUMENTO_A);
 | |
|     
 | |
|   TElaborazione * e = elab(m.get(F_CODICE_ELAB));
 | |
|   TElaborazione & eld = *e;
 | |
|   TToken_string tipidoc(24), statidoc(10);
 | |
|   eld.tipi_stati_iniziali(tipidoc, statidoc);
 | |
|       
 | |
|   TTipo_documento t(eld.tipo_iniziale(0)); 
 | |
|   char tipocf(t.tipocf());
 | |
|   TLista_cf clienti(tipocf);
 | |
|   const int tot_cli = clienti.leggi_ragsoc(dr, ar, da, aa, dz, az);
 | |
|     
 | |
|   TString msg(80);
 | |
|   for (int c = 0; c < tot_cli && !iw.iscancelled(); c++)
 | |
|   { 
 | |
|     const long codcli = clienti[c];     // Codice cliente in esame
 | |
|     msg = "Elaborazione dei documenti del cliente "; 
 | |
|     msg << codcli << " ...";
 | |
|     iw.set_text(msg);                   // Messaggio sul cliente
 | |
|     do_events();                        // Attende visualizzazione
 | |
|       
 | |
|     TLista_documenti din;               // Legge tutti i documenti di input
 | |
|     din.read('D', tipocf, codcli, anno, tipidoc, statidoc, dd, ad, codnum, dn, an);
 | |
|     if (din.items() > 0 && !iw.iscancelled())
 | |
|     {
 | |
|       bool ok = process(iw, eld, din, data_elab);
 | |
|       if (!ok) // In caso di errore termina qui l'elaborazione.   
 | |
|         break;   
 | |
|     }
 | |
|   }
 | |
| 	delete e;
 | |
| 
 | |
| }
 | |
| 
 | |
| void TFatturazione_bolle_app::process_by_doc(const TMask& m)
 | |
| {
 | |
|   TIndwin iw(0, TR("Inizializzazione...\n "), TRUE, FALSE, 60);
 | |
| 
 | |
|   const TDate data_elab = m.get_date(F_DATA_ELAB); 
 | |
|   const int anno = data_elab.year();
 | |
|   long dc = m.get_long(F_CODICE_CLIFO_DA);
 | |
|   long ac = m.get_long(F_CODICE_CLIFO_A);   
 | |
|   
 | |
|   const int da = m.get_int(F_CODICE_AGENTE_DA);
 | |
|   const int aa = m.get_int(F_CODICE_AGENTE_A);
 | |
|   const TString8 dz(m.get(F_CODICE_ZONA_DA)); 
 | |
|   const TString8 az(m.get(F_CODICE_ZONA_A));
 | |
|     
 | |
|   const TDate dd = m.get_date(F_DATA_DOCUMENTO_DA);
 | |
|   TDate ad = m.get_date(F_DATA_DOCUMENTO_A);
 | |
|   if (!ad.ok()) ad = data_elab;
 | |
|   
 | |
|   const TString& codnum = m.get(F_CODICE_NUMERAZIONE);
 | |
|   const long dn = m.get_long(F_NUMERO_DOCUMENTO_DA);
 | |
|   const long an = m.get_long(F_NUMERO_DOCUMENTO_A);
 | |
| 
 | |
|   TElaborazione * e = elab(m.get(F_CODICE_ELAB));
 | |
|   TElaborazione & eld = *e;
 | |
|   TToken_string tipidoc(24), statidoc(10);
 | |
|   eld.tipi_stati_iniziali(tipidoc, statidoc);
 | |
| 
 | |
|   TTipo_documento t(eld.tipo_iniziale(0));
 | |
|   char tipocf(t.tipocf());
 | |
|   TLista_cf clienti(tipocf);
 | |
|   const int tot_cli = clienti.leggi(dc, ac);
 | |
|   TLista_documenti din, dout;         // Legge tutti i documenti di input
 | |
| 
 | |
|   TString msg(80);
 | |
|   for (int c = 0; c < tot_cli && !iw.iscancelled(); c++)
 | |
|   { 
 | |
|     const long codcli = clienti[c];     // Codice cliente in esame
 | |
|     msg = TR("Elaborazione dei documenti del cliente"); 
 | |
|     msg << ' ' << codcli << "...";
 | |
|     iw.set_text(msg);                   // Messaggio sul cliente
 | |
|     do_events();                        // Attende visualizzazione
 | |
|     
 | |
| 		TLista_documenti list;
 | |
| 
 | |
|     list.read('D', tipocf, codcli, anno, tipidoc, statidoc, dd, ad, codnum, dn, an);
 | |
|     
 | |
|     for (int i = list.items()-1; i >= 0; i--)
 | |
|     {              
 | |
|       const TDocumento& doc = list[i];        
 | |
|       
 | |
|       bool to_del = FALSE;
 | |
|       const int agente = doc.get_int(DOC_CODAG);
 | |
|       if (agente > 0)
 | |
|       {
 | |
|         if (da > 0 && agente < da) to_del = true;
 | |
|         if (aa > 0 && agente > aa) to_del = true;
 | |
|       }
 | |
|       const TString8 zona = doc.get(DOC_ZONA);
 | |
|       if (zona.full())
 | |
|       {
 | |
|         if (dz.not_empty() && zona < dz) to_del = true;
 | |
|         if (az.not_empty() && zona > az) to_del = true;
 | |
|       }
 | |
|       if (to_del)
 | |
|         list.destroy(i);
 | |
|     }
 | |
|     const int items = list.items();
 | |
|     for (int j = 0; j < items; j++)
 | |
| 			din.add(list[j]);
 | |
|   }
 | |
|   if (din.items() > 0 && !iw.iscancelled())
 | |
|     bool ok = process(iw, eld, din, data_elab);
 | |
| 	delete e;
 | |
| }
 | |
|  
 | |
| void TFatturazione_bolle_app::process_by_fatt(const TMask& m)
 | |
| {
 | |
|   TWait_cursor hourglass;
 | |
| 
 | |
|   TElaborazione* e = elab(m.get(F_CODICE_ELAB));
 | |
|   TElaborazione& eld = *e;
 | |
|   TToken_string tipidoc(24), statidoc(10);
 | |
|   eld.tipi_stati_iniziali(tipidoc, statidoc);
 | |
| 
 | |
|   const TTipo_documento t(eld.tipo_iniziale(0));
 | |
|   const char tipocffatt = t.tipocf() == 'C' ? 'F' : 'C';
 | |
| 
 | |
|   const TDate data_elab = m.get_date(F_DATA_ELAB); 
 | |
|   const int anno = data_elab.year();
 | |
|   long dc = m.get_long(F_CODICE_CLIFO_DA);
 | |
|   long ac = m.get_long(F_CODICE_CLIFO_A);   
 | |
|   
 | |
|   const int da = m.get_int(F_CODICE_AGENTE_DA);
 | |
|   const int aa = m.get_int(F_CODICE_AGENTE_A);
 | |
|   const TString& dz = m.get(F_CODICE_ZONA_DA); 
 | |
|   const TString& az = m.get(F_CODICE_ZONA_A);
 | |
|     
 | |
|   const TString& codnum = m.get(F_CODICE_NUMERAZIONE);
 | |
|   const long dn = codnum.full() ? m.get_long(F_NUMERO_DOCUMENTO_DA) : 0;
 | |
|   const long an = codnum.full() ? m.get_long(F_NUMERO_DOCUMENTO_A)  : 0;
 | |
| 
 | |
|   TDate dd = m.get_date(F_DATA_DOCUMENTO_DA);
 | |
|   if (!dd.ok())
 | |
|     dd = TDate(1,1,anno);
 | |
|   TDate ad = m.get_date(F_DATA_DOCUMENTO_A);
 | |
|   if (!ad.ok()) 
 | |
|     ad = data_elab;
 | |
| 
 | |
|   const int nkey = (dn > 0 || an > 0) ? 1 : 3;
 | |
|   TString query;
 | |
|   query << "USE DOC KEY " << nkey << " SELECT (TIPOCFFATT=\"" << tipocffatt << "\")";
 | |
| 
 | |
|   if (dc > 0 || ac > 0)
 | |
|     query << "&&(BETWEEN(CODCFFATT," << dc << ',' << ac << "))";
 | |
|   
 | |
|   query << "&&(BETWEEN(DATADOC," << dd.date2ansi() << ',' << ad.date2ansi() << "))";
 | |
| 
 | |
|   if (da > 0 || aa > 0)
 | |
|     query << "&&(BETWEEN(CODAG," << da << "," << aa << "))";
 | |
|   
 | |
|   if (dz.full() || az.full())
 | |
|     query << "&&(BETWEEN(ZONA,\"" << dz << "\",\"" << az << "\"))";
 | |
| 
 | |
|   if (nkey == 3 && codnum.full())
 | |
|     query << "&&(CODNUM=\"" << codnum << "\")";
 | |
| 
 | |
|   query << "\nBY " << DOC_CODCFFATT;
 | |
|   if (eld.usa_doc_rif())
 | |
|     query << ' ' << DOC_DATADOCRIF;
 | |
| 
 | |
|   if (nkey == 1)
 | |
|   {
 | |
|     query << "\nFROM PROVV=D ANNO=" << anno << " CODNUM=" << codnum << " NDOC=" << dn;
 | |
|     query << "\nTO   PROVV=D ANNO=" << anno << " CODNUM=" << codnum << " NDOC=" << an;
 | |
|   }
 | |
|   else
 | |
|   {
 | |
|     query << "\nFROM DATADOC=" << dd.date2ansi();
 | |
|     query << "\nTO   DATADOC=" << ad.date2ansi();
 | |
|   }
 | |
| 
 | |
| 
 | |
|   TISAM_recordset docs(query);
 | |
|   const TRectype& head = docs.cursor()->curr();
 | |
| 
 | |
|   TProgind iw(docs.items(), "Elaborazione documenti da fatturare", true, true);
 | |
| 
 | |
|   long last_clifo = 0;          // Ultimo cliente elaborato
 | |
|   TLista_documenti din;         // Lista dei documenti dell'ultimo cliente
 | |
|   
 | |
| 
 | |
|   for (bool ok = docs.move_first(); ok; ok = docs.move_next())
 | |
|   {
 | |
|     const long clifo = docs.get(DOC_CODCFFATT).as_int();
 | |
|     if (clifo > 0 && clifo >= dc && (clifo <= ac || ac <= 0)) // Cliente da fatturare non nullo e valido
 | |
|     {
 | |
|       if (clifo != last_clifo) // Cambio cliente
 | |
|       {
 | |
|         if (din.items() > 0)                 // Ci sono documenti da elaborare?
 | |
|         {
 | |
|           process(iw, eld, din, data_elab);  // Elaborali ...
 | |
|           din.destroy(-1);                   // ... e poi buttali 
 | |
|         }
 | |
|         last_clifo = clifo;
 | |
|       }
 | |
| 
 | |
|       if (!iw.addstatus(1))
 | |
|         break;
 | |
| 
 | |
|       // Controlla se il documento e' in uno stato valido per l'elaborazione
 | |
|       const TString4 tipodoc = head.get(DOC_TIPODOC);
 | |
|       const TString4 statodoc = head.get(DOC_STATO);
 | |
|       for (int i = tipidoc.items()-1; i>=0; i--)
 | |
|       {
 | |
|         if (tipodoc == tipidoc.get(i) && statodoc == statidoc.get(i))
 | |
|         {
 | |
|           din.add(head);
 | |
|           break;
 | |
|         }
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   // Termina l'elaborazione dei documenti dell'ultimo cliente
 | |
|   if (din.items() > 0 && !iw.iscancelled())
 | |
|     process(iw, eld, din, data_elab);
 | |
| 
 | |
| 	delete e;
 | |
| }
 | |
| 
 | |
| bool TFatturazione_bolle_app::clifo_da_fatt(const TMask& m) const
 | |
| {
 | |
|   TElaborazione* e = elab(m.get(F_CODICE_ELAB));
 | |
|   TFatturazione_bolle& eld = *(TFatturazione_bolle*)e;
 | |
| 
 | |
|   const bool yes = eld.change_clifo();
 | |
| 
 | |
|   delete e;
 | |
| 
 | |
|   return yes;
 | |
| }
 | |
|  
 | |
| void TFatturazione_bolle_app::main_loop()
 | |
| {
 | |
|   TMask m("ve6200a");
 | |
|   m.set(F_SELEZIONE, _default_selection);
 | |
|   
 | |
|   while (m.run() == K_ENTER)
 | |
|   {                              
 | |
|     const TString& select_from = m.get(F_SELEZIONE);  
 | |
|     if (select_from != _default_selection)
 | |
|     {
 | |
|       TConfig cfg(CONFIG_DITTA, "ve"); 
 | |
|       cfg.set("FATBOLSEL", _default_selection = select_from);
 | |
|     }
 | |
| 	
 | |
| 		if (m.get(F_ORDINAMENTO) == "R")
 | |
|       process_by_ragsoc(m);
 | |
| 		else
 | |
| 		{
 | |
|       if (clifo_da_fatt(m))
 | |
|       {
 | |
|         process_by_fatt(m);
 | |
|       }
 | |
|       else
 | |
|       {
 | |
| 			if (select_from == "D")
 | |
| 				process_by_doc(m);
 | |
| 			else  
 | |
| 				process_by_cli(m);
 | |
| 		}
 | |
|   }
 | |
|   }
 | |
| }
 | |
| 
 | |
| int ve6200 (int argc, char **argv)
 | |
| {
 | |
|   TFatturazione_bolle_app a;
 | |
|   a.run (argc, argv, TR("Fatturazione Bolle"));
 | |
|   return TRUE;
 | |
| }
 |