campo-sirio/sv/svlib01.cpp
guy 52a0e9cd8f Aggiunti programmi di gestione parametri statistiche e stampa schede
git-svn-id: svn://10.65.10.50/trunk@5063 c028cbd2-c16b-5b4b-a496-9718f37d4682
1997-08-18 14:20:21 +00:00

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