249 lines
6.7 KiB
C++
Executable File
249 lines
6.7 KiB
C++
Executable File
/////////////////////////////////////////////////////////////////////////////
|
|
// cglib02.cpp
|
|
//
|
|
// Aggiornamento saldi
|
|
//
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
#include <isam.h>
|
|
#include <date.h>
|
|
#include <saldi.h>
|
|
#include <utility.h>
|
|
|
|
#include "conto.h"
|
|
#include "cglib.h"
|
|
|
|
void TTab_conti::do_agg(TConto* tc, int anno_es, const real& importo,
|
|
char sezione, bool movap, bool provv, bool somma, const char* key)
|
|
{
|
|
real i = somma ? importo : -importo;
|
|
|
|
if (movap)
|
|
{
|
|
if (sezione == 'D') tc->saldo() += i;
|
|
else tc->saldo() -= i;
|
|
}
|
|
else
|
|
if (provv)
|
|
{
|
|
if (sezione == 'D') tc->darepro() += i;
|
|
else tc->averepro() += i;
|
|
}
|
|
else
|
|
{
|
|
if (sezione == 'D') tc->dare() += i;
|
|
else tc->avere() += i;
|
|
}
|
|
|
|
// rimuovo dalla tabella il conto se dare e avere vanno a zero
|
|
if (tc->dare().is_zero() && tc->avere().is_zero() &&
|
|
tc->darepro().is_zero() && tc->averepro().is_zero() &&
|
|
tc->saldo().is_zero()) remove(key);
|
|
}
|
|
|
|
|
|
void TTab_conti::aggiorna_conto(const TConto& tcon, int anno_es, const real& importo, char sezione, bool movap, bool provv, bool somma)
|
|
{
|
|
TString80 key;
|
|
key << format("%4d", anno_es);
|
|
key << format("%3d", tcon.gruppo());
|
|
key << format("%3d", tcon.conto());
|
|
key << format("%6ld", tcon.sottoconto());
|
|
|
|
TConto* tc = (TConto*) objptr(key);
|
|
if (tc == NULL)
|
|
{
|
|
tc = new TConto(tcon.gruppo(), tcon.conto(), tcon.sottoconto(),
|
|
tcon.tipo());
|
|
add(key, tc);
|
|
tc->dare() = ZERO;
|
|
tc->avere() = ZERO;
|
|
tc->darepro() = ZERO;
|
|
tc->averepro() = ZERO;
|
|
tc->saldo() = ZERO;
|
|
}
|
|
do_agg(tc, anno_es, importo, sezione, movap, provv, somma, key);
|
|
}
|
|
|
|
void TTab_conti::aggiorna_conto(int gruppo, int conto, long sottoconto,
|
|
int anno_es, const real& importo, char sezione,
|
|
bool movap, bool provv, bool somma)
|
|
{
|
|
TString80 key;
|
|
key << format("%4d", anno_es);
|
|
key << format("%3d", gruppo);
|
|
key << format("%3d", conto);
|
|
key << format("%6ld", sottoconto);
|
|
|
|
TConto* tc = (TConto*) objptr(key);
|
|
if (tc == NULL)
|
|
{
|
|
tc = new TConto(gruppo, conto, sottoconto);
|
|
add(key, tc);
|
|
}
|
|
do_agg(tc, anno_es, importo, sezione, movap, provv, somma, key);
|
|
}
|
|
|
|
|
|
TSaldo_agg::TSaldo_agg()
|
|
{
|
|
_anno_es = 0;
|
|
_data_ulmov = "";
|
|
_num_ulmov = 0l;
|
|
_movap = FALSE;
|
|
_provv = FALSE;
|
|
reset(); // pulizia dell'array dei conti
|
|
}
|
|
|
|
void TSaldo_agg::aggiorna(const TConto& tc, const real& importo, char sezione,
|
|
bool somma)
|
|
{
|
|
_tab_conti.aggiorna_conto(tc, _anno_es, importo, sezione, _movap, _provv,
|
|
somma);
|
|
}
|
|
|
|
void TSaldo_agg::aggiorna(int gruppo, int conto, long sottoconto, const real& importo, char sezione, bool somma)
|
|
{
|
|
_tab_conti.aggiorna_conto(gruppo, conto, sottoconto, _anno_es, importo,
|
|
sezione, _movap, _provv, somma);
|
|
}
|
|
|
|
void TSaldo_agg::reset()
|
|
{
|
|
_tab_conti.destroy();
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
// pulizia file saldi
|
|
//
|
|
// Scorro il file saldi per l' anno year o per tutti gli anni se year = 0
|
|
// e azzero i progressivi.
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
void TSaldo_agg::clear_saldi(int year)
|
|
{
|
|
TLocalisamfile saldi(LF_SALDI);
|
|
|
|
set_anno_es(year);
|
|
saldi.zero();
|
|
if (anno_es() != 0)
|
|
saldi.put(SLD_ANNOES, anno_es());
|
|
|
|
TRectype last(saldi.curr());
|
|
|
|
for (saldi.read(_isgteq, _lock);
|
|
!saldi.eof() && saldi.curr() <= last;
|
|
saldi.next(_lock))
|
|
{
|
|
saldi.put(SLD_FLAGSALINI, "D");
|
|
saldi.zero(SLD_SALDO);
|
|
saldi.zero(SLD_PDAREPRO);
|
|
saldi.zero(SLD_PAVEREPRO);
|
|
saldi.zero(SLD_PDARE);
|
|
saldi.zero(SLD_PAVERE);
|
|
saldi.rewrite();
|
|
}
|
|
saldi.reread(_unlock);
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
// Aggiornamento file saldi
|
|
//
|
|
// Scorro la tabella dei conti interna _tab_conti.
|
|
// Per ogni conto cerco il record su saldi, se non c'e' lo creo.
|
|
// Se c'e' gia' lo aggiorno nel seguente modo:
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
void TSaldo_agg::registra()
|
|
{
|
|
real s, r;
|
|
TString Flagsalini;
|
|
TDate data_ulmov;
|
|
long num_ulmov;
|
|
TLocalisamfile saldi(LF_SALDI);
|
|
int conti = _tab_conti.items();
|
|
|
|
_tab_conti.restart();
|
|
for (int i=0; i < conti; i++)
|
|
{
|
|
THash_object * hobj = tconti();
|
|
TConto & tcon = hobj->obj();
|
|
|
|
if (!tcon.ok()) continue;
|
|
saldi.zero();
|
|
saldi.put(SLD_ANNOES, atoi(hobj->key().left(4)) );
|
|
saldi.put(SLD_GRUPPO, tcon.gruppo());
|
|
saldi.put(SLD_CONTO, tcon.conto());
|
|
saldi.put(SLD_SOTTOCONTO, tcon.sottoconto());
|
|
if (saldi.read(_isequal, _lock) == NOERR)
|
|
{
|
|
num_ulmov = saldi.get_long(SLD_NUMULTMOV);
|
|
data_ulmov = saldi.get_date(SLD_DATAULMOV);
|
|
|
|
if (((_num_ulmov != 0L) && (_num_ulmov > num_ulmov)) ||
|
|
((_data_ulmov.ok()) && (_data_ulmov > data_ulmov)))
|
|
{
|
|
saldi.put(SLD_DATAULMOV, _data_ulmov);
|
|
saldi.put(SLD_NUMULTMOV, _num_ulmov);
|
|
}
|
|
r = tcon.saldo();
|
|
if (r != ZERO)
|
|
{
|
|
s = saldi.get_real(SLD_SALDO);
|
|
Flagsalini = saldi.get(SLD_FLAGSALINI);
|
|
if (Flagsalini == "A") s = r - s;
|
|
else s = r + s;
|
|
if (s < ZERO)
|
|
{
|
|
Flagsalini = "A"; s = -s;
|
|
}
|
|
else
|
|
Flagsalini = "D";
|
|
saldi.put(SLD_FLAGSALINI, (const char *) Flagsalini);
|
|
saldi.put(SLD_SALDO, s);
|
|
}
|
|
r = saldi.get_real(SLD_PDAREPRO);
|
|
r += tcon.darepro();
|
|
saldi.put(SLD_PDAREPRO, r);
|
|
r = saldi.get_real(SLD_PAVEREPRO);
|
|
r += tcon.averepro();
|
|
saldi.put(SLD_PAVEREPRO, r);
|
|
r = saldi.get_real(SLD_PDARE);
|
|
r += tcon.dare();
|
|
saldi.put(SLD_PDARE, r);
|
|
r = saldi.get_real(SLD_PAVERE);
|
|
r += tcon.avere();
|
|
saldi.put(SLD_PAVERE, r);
|
|
saldi.rewrite();
|
|
}
|
|
else
|
|
{
|
|
saldi.zero();
|
|
saldi.put(SLD_ANNOES, anno_es());
|
|
saldi.put(SLD_GRUPPO, tcon.gruppo());
|
|
saldi.put(SLD_CONTO, tcon.conto());
|
|
saldi.put(SLD_SOTTOCONTO, tcon.sottoconto());
|
|
s = tcon.saldo();
|
|
if (s < ZERO)
|
|
{
|
|
Flagsalini = "A"; s = -s;
|
|
}
|
|
else
|
|
Flagsalini = "D";
|
|
|
|
saldi.put(SLD_FLAGSALINI, (const char *) Flagsalini);
|
|
saldi.put(SLD_SALDO, s);
|
|
saldi.put(SLD_PDAREPRO, tcon.darepro());
|
|
saldi.put(SLD_PAVEREPRO, tcon.averepro());
|
|
saldi.put(SLD_PDARE, tcon.dare());
|
|
|
|
saldi.put(SLD_PAVERE, tcon.avere());
|
|
if (_num_ulmov != 0L) saldi.put(SLD_NUMULTMOV, _num_ulmov);
|
|
if (_data_ulmov.ok()) saldi.put(SLD_DATAULMOV, _data_ulmov);
|
|
saldi.write();
|
|
}
|
|
}
|
|
}
|
|
|
|
|