288 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			288 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
| #include <prefix.h>
 | |
| #include <progind.h>
 | |
| 
 | |
| #include "svlib01.h"
 | |
| 
 | |
| #include "svriep.h"
 | |
| 
 | |
| ///////////////////////////////////////////////////////////
 | |
| // TStats_agg
 | |
| ///////////////////////////////////////////////////////////
 | |
| 
 | |
| void TStats_agg::init()
 | |
| {
 | |
|   TConfig ini(CONFIG_DITTA, "sv");
 | |
| 
 | |
|   switch(ini.get_char("Frequenza"))
 | |
|   {
 | |
|   case 'B': _frequenza = fs_bimestrale; break;
 | |
|   case 'M': _frequenza = fs_mensile; break;
 | |
|   case 'Q': _frequenza = fs_quindicinale; break;
 | |
|   case 'S': _frequenza = fs_settimanale; break;
 | |
|   case 'T': _frequenza = fs_trimestrale; break;
 | |
|   default : _frequenza = fs_giornaliera; break;
 | |
|   }
 | |
|   
 | |
|   _merce            = ini.get_bool("StatMerce");
 | |
|   _prestazioni      = ini.get_bool("StatPrestazioni");
 | |
|   _omaggi           = ini.get_bool("StatOmaggi");
 | |
|   _omaggio_is_merce = ini.get_bool("OmaggioIsMerce");
 | |
|   
 | |
|   _art_nocode     = ini.get_bool("ArtNoCode");
 | |
|   _art_noanag     = ini.get_bool("ArtNoAnag");
 | |
|   _art_noanag_grp = ini.get_bool("ArtNoAnagGrp");
 | |
| 
 | |
|   _agente    = ini.get_bool("AgenteGrp");
 | |
|   _cliente   = ini.get_bool("ClienteGrp");
 | |
|   _giacenza  = ini.get_bool("GiacenzaGrp");
 | |
|   _magazzino = ini.get_bool("MagazzinoGrp");
 | |
| }
 | |
| 
 | |
| void TStats_agg::test_firm() const
 | |
| {
 | |
|   const long ditta = prefix().get_codditta();  
 | |
|   if (ditta != _ditta)
 | |
|   { 
 | |
|     CHECK(_data.items() == 0, "Non cambiare ditta durante un'operazione di ricalcolo!");
 | |
|     ((TStats_agg*)this)->init();
 | |
|     ((TStats_agg*)this)->_ditta = ditta;
 | |
|   }
 | |
| }
 | |
| 
 | |
| int TStats_agg::date2period(const TDate& datadoc) const
 | |
| {
 | |
|   test_firm();
 | |
| 
 | |
|   int classe;
 | |
|   if (_frequenza > fs_settimanale)
 | |
|   {
 | |
|     classe = datadoc.month();
 | |
|     switch(_frequenza)
 | |
|     {
 | |
|     case fs_quindicinale:
 | |
|       classe = (classe-1) * 2 + 1;
 | |
|       if (datadoc.day() > 15) classe++;
 | |
|       break;
 | |
|     case fs_bimestrale:
 | |
|       classe = (classe-1) / 2 + 1;
 | |
|       break;
 | |
|     case fs_trimestrale:
 | |
|       classe = (classe-1) / 3 + 1;
 | |
|       break;
 | |
|     default:
 | |
|       break;
 | |
|     }    
 | |
|   }  
 | |
|   else
 | |
|   {
 | |
|     const TDate primo(1, 1, datadoc.year());
 | |
|     classe = int(datadoc - primo);
 | |
|     if (_frequenza == fs_settimanale)
 | |
|       classe /= 7;
 | |
|     classe++;
 | |
|   }  
 | |
|   return classe;
 | |
| }
 | |
| 
 | |
| void TStats_agg::put_key(TRectype& stat, TToken_string& key) const
 | |
| {    
 | |
|   CHECK(stat.num() == LF_SVRIEP, "Ci vuole un record delle statistiche");
 | |
|   stat.zero();
 | |
|   stat.put(SVR_ANNO,    key.get(0));
 | |
|   stat.put(SVR_PERIODO, key.get());
 | |
|   stat.put(SVR_TIPODOC, key.get());
 | |
|   stat.put(SVR_TIPOART, key.get());
 | |
|   stat.put(SVR_CODART,  key.get());
 | |
|   stat.put(SVR_UMQTA,   key.get());
 | |
|   stat.put(SVR_CODAG,   key.get());
 | |
|   stat.put(SVR_CODCF,   key.get());
 | |
|   stat.put(SVR_LIVELLO, key.get());
 | |
|   stat.put(SVR_CODMAG,  key.get());
 | |
| }
 | |
| 
 | |
| TStats_agg::TStats_data& TStats_agg::find(const TRiga_documento& rdoc)
 | |
| {
 | |
|   test_firm();
 | |
| 
 | |
|   const TDocumento& doc = rdoc.doc();
 | |
|   const TDate datadoc = doc.get(DOC_DATADOC);
 | |
| 
 | |
|   TToken_string key(64);         
 | |
|   
 | |
|   key.add(datadoc.year()); 
 | |
|   key.add(date2period(datadoc));
 | |
|   key.add(doc.get(DOC_TIPODOC));
 | |
|   
 | |
|   char tipo = rdoc.tipo().tipo();
 | |
|   if (tipo == RIGA_OMAGGI && _omaggio_is_merce)
 | |
|     tipo = RIGA_MERCE;
 | |
|   key.add(tipo);  
 | |
|   
 | |
|   TString80 codart;
 | |
|   if (tipo != RIGA_PRESTAZIONI)
 | |
|   {
 | |
|     codart = rdoc.get(RDOC_CODARTMAG);
 | |
|     if (codart.empty() && !_art_noanag_grp) 
 | |
|       codart = rdoc.get(RDOC_CODART);
 | |
|   }
 | |
|   else
 | |
|     codart = rdoc.get(RDOC_CODART);
 | |
|   key.add(codart);
 | |
|   key.add(rdoc.get(RDOC_UMQTA));
 | |
|   
 | |
|   if (_agente)
 | |
|     key.add(doc.get(DOC_CODAG));
 | |
|   else
 | |
|     key.add("");
 | |
| 
 | |
|   if (_cliente)
 | |
|     key.add(doc.get(DOC_CODCF));
 | |
|   else
 | |
|     key.add("");
 | |
|   
 | |
|   if (_giacenza)
 | |
|     key.add(rdoc.get(RDOC_LIVELLO));
 | |
|   else
 | |
|     key.add("");
 | |
| 
 | |
|   if (_magazzino)
 | |
|     key.add(rdoc.get(RDOC_CODMAG));
 | |
|   else
 | |
|     key.add("");
 | |
|     
 | |
|   TStats_data* ptr = (TStats_data*)_data.objptr(key);
 | |
|   if (ptr == NULL)
 | |
|   {
 | |
|     ptr = new TStats_data;
 | |
|     _data.add(key, ptr);
 | |
|   }
 | |
| 
 | |
|   return *ptr;
 | |
| } 
 | |
| 
 | |
| bool TStats_agg::can_add(const TRiga_documento& rdoc) const
 | |
| {          
 | |
|   test_firm();
 | |
| 
 | |
|   const TTipo_documento& tip = rdoc.doc().tipo();
 | |
|   bool ok = tip.statistiche();
 | |
|   
 | |
|   if (ok)
 | |
|   {
 | |
|     const char tipo = rdoc.tipo().tipo();
 | |
|     switch(tipo)
 | |
|     {
 | |
|     case RIGA_MERCE      : ok = _merce; break;
 | |
|     case RIGA_OMAGGI     : ok = _omaggi; break;
 | |
|     case RIGA_PRESTAZIONI: ok = _prestazioni; break;
 | |
|     default              : ok = FALSE; break;
 | |
|     }
 | |
|   }
 | |
|   
 | |
|   if (ok && !rdoc.is_articolo())
 | |
|   {     
 | |
|     const TString& codart = rdoc.get(RDOC_CODART);
 | |
|     if (codart.empty()) 
 | |
|       ok = _art_nocode;
 | |
|     else
 | |
|       ok = _art_noanag;
 | |
|   }
 | |
|   
 | |
|   return ok;
 | |
| } 
 | |
| 
 | |
| void TStats_agg::reset()
 | |
| {
 | |
|   _data.destroy();
 | |
| }
 | |
| 
 | |
| bool TStats_agg::sub(const TRiga_documento& rdoc)
 | |
| {               
 | |
|   bool ok = can_add(rdoc);
 | |
|   if (ok)
 | |
|   {
 | |
|     TStats_data& data = find(rdoc);
 | |
|     data._quantita -= rdoc.quantita();
 | |
|     data._valore -= rdoc.imponibile();
 | |
|   }  
 | |
|   return ok;
 | |
| }
 | |
| 
 | |
| bool TStats_agg::add(const TRiga_documento& rdoc)
 | |
| { 
 | |
|   bool ok = can_add(rdoc);
 | |
|   if (ok)   
 | |
|   {
 | |
|     TStats_data& data = find(rdoc);
 | |
|     
 | |
|     data._valore += rdoc.imponibile();
 | |
|     real qta = rdoc.quantita();
 | |
|     if (qta.is_zero())
 | |
|       qta = 1.0;
 | |
|     data._quantita += qta;
 | |
|   }
 | |
|   return ok;
 | |
| }
 | |
| 
 | |
| bool TStats_agg::update()
 | |
| {        
 | |
|   TProgind pi(_data.items(), "Aggiornamento statistiche", FALSE, TRUE, 60);
 | |
| 
 | |
|   test_firm();
 | |
| 
 | |
|   bool ok = TRUE;
 | |
| 
 | |
|   TToken_string key(64);
 | |
|   TLocalisamfile stat(LF_SVRIEP);
 | |
|   TRectype& curr = stat.curr();
 | |
|   
 | |
|   _data.restart();
 | |
|   for (THash_object* h = _data.get_hashobj(); h; h = _data.get_hashobj())
 | |
|   { 
 | |
|     pi.addstatus(1);
 | |
|     
 | |
|     TStats_data& data = (TStats_data&)h->obj();
 | |
|     if (data._quantita.is_zero() && data._valore.is_zero())
 | |
|       continue;
 | |
|       
 | |
|     key = h->key();
 | |
|     
 | |
|     bool saved = FALSE;
 | |
|     while (!saved)
 | |
|     {
 | |
|       put_key(curr, key);
 | |
|       int err = stat.read(_isequal, _lock);
 | |
|       if (err != NOERR)
 | |
|         put_key(curr, key);
 | |
|       real quantita(curr.get(SVR_QUANTITA));
 | |
|       real valore(curr.get(SVR_VALORE));
 | |
|       quantita += data._quantita;
 | |
|       valore += data._valore;
 | |
|       curr.put(SVR_QUANTITA, quantita);
 | |
|       curr.put(SVR_VALORE, valore);
 | |
|       
 | |
|       if (err == NOERR)
 | |
|         err = stat.rewrite();
 | |
|       else  
 | |
|         err = stat.write();
 | |
|           
 | |
|       switch(err)
 | |
|       {
 | |
|       case NOERR      : saved = TRUE; 
 | |
|                         break;
 | |
|       case _isreinsert: break; 
 | |
|       default         : saved = !yesno_box("Errore %d nell'aggiornamento statistiche:"
 | |
|                                            "Si desidera ritentare?", err);
 | |
|                         break;
 | |
|       }
 | |
|     }  
 | |
|   }
 | |
|   reset();
 | |
|   
 | |
|   return ok;
 | |
| }
 | |
| 
 | |
| TStats_agg::TStats_agg() : _ditta(0)
 | |
| {
 | |
| }
 |