#include #include #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) { }