#include "svlib01.h" #include "doc.h" #include "rdoc.h" /////////////////////////////////////////////////////////// // TStats_data /////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////// // TStats_agg /////////////////////////////////////////////////////////// int TStats_agg::date2class(const TDate& datadoc) const { int classe; if (_frequenza > fs_settimanale) { classe = datadoc.month(); if (_frequenza == fs_bimestrale) classe = (classe-1) / 2 + 1; else if (_frequenza == fs_trimestrale) classe = (classe-1) / 3 + 1; else if (_frequenza == fs_quindicinale) { classe = (classe-1) * 2 + 1; if (datadoc.day() > 15) classe++; } } else { const TDate primo(1, 1, datadoc.year()); classe = int(datadoc - primo); if (_frequenza == fs_settimanale) classe /= 7; classe++; } return classe; } TStats_agg::TStats_data& TStats_agg::find(const TRiga_documento& rdoc) { const TDocumento& doc = rdoc.doc(); const TDate datadoc = doc.get(DOC_DATADOC); TToken_string key(24); key = doc.get(DOC_TIPODOC); key.add(datadoc.year()); key.add(date2class(datadoc)); key.add(rdoc.get(RDOC_UMQTA)); char tipo = rdoc.tipo().tipo(); if (tipo == 'O' && _omaggio_is_merce) tipo = 'M'; key.add(tipo); TString80 codart = rdoc.get(RDOC_CODARTMAG); if (codart.empty()) codart = rdoc.get(RDOC_CODART); key.add(codart); if (_agente) key.add(doc.get(DOC_CODAG)); if (_cliente) key.add(doc.get(DOC_CODCF)); if (_giacenza) key.add(doc.get(DOC_CODCF)); if (_magazzino) key.add(doc.get(RDOC_CODMAG)); 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 { bool ok; const char tipo = rdoc.tipo().tipo(); switch(tipo) { case 'M': ok = _merce; break; case 'O': ok = _omaggi; break; case 'P': ok = _prestazioni; break; default : ok = FALSE; break; } return ok; } 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._quantita += rdoc.quantita(); data._valore += rdoc.imponibile(); } return ok; } bool TStats_agg::update() { return TRUE; } TStats_agg::TStats_agg() { TConfig ini(CONFIG_DITTA, "sv"); switch(ini.get_char("DataFreq")) { 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"); }