campo-sirio/cg/cglib01.cpp

488 lines
13 KiB
C++
Executable File

// cglib01.cpp
// calcolo dei saldi
#include <applicat.h>
#include <date.h>
#include <real.h>
#include <lffiles.h>
#include <isam.h>
#include <utility.h>
#include <config.h>
#include <rmov.h>
#include <mov.h>
#include <saldi.h>
#include <pconti.h>
#include <clifo.h>
#include "cglib.h"
const MAXSTR = 128;
static char __tmp [MAXSTR];
static TFixed_string tmp (__tmp, MAXSTR);
TClifo_list::TClifo_list(int g, int c, char tipocf)
{
TLocalisamfile cf(LF_CLIFO);
destroy();
cf.setkey(3);
cf.zero();
cf.put(CLI_TIPOCF,tipocf);
cf.put(CLI_GRUPPO,g);
cf.put(CLI_CONTO,c);
TRectype rec(cf.curr());
cf.read(_isgteq);
for ( ;!cf.eof();cf.next())
{
if (cf.curr() > rec) break;
TRectype r(cf.curr());
add(r);
}
}
Saldo::Saldo()
{
_saldo_iniziale = 0.00;
_prg_dare = 0.00;
_prg_avere = 0.00;
_saldo = 0.00;
_indbil = 0;
_saldi = new TLocalisamfile(LF_SALDI);
_mov = new TLocalisamfile(LF_MOV);
_rmov = new TLocalisamfile(LF_RMOV);
_clifo = new TLocalisamfile(LF_CLIFO);
}
Saldo::~Saldo()
{
delete _saldi;
delete _mov;
delete _rmov;
delete _clifo;
}
real Saldo::saldofin_esprec(int annoes, int g, int c, long s)
{
real saldo,pdare,pavere,pdaresca,paveresca;
char flag;
TRectype app = ricerca_progr_prec(annoes-1, g, c, s);
flag = app.get(SLD_FLAGSALINI)[0];
saldo = app.get_real(SLD_SALDO);
pdare = app.get_real(SLD_PDARE);
pavere = app.get_real(SLD_PAVERE);
pdaresca = app.get_real(SLD_PDARESCA);
paveresca = app.get_real(SLD_PAVERESCA);
if (flag == 'D')
return saldo+pdaresca-paveresca+pdare-pavere;//saldo finale es. precedente;
else //if (flag == 'A')
return pdaresca-saldo-paveresca+pdare-pavere;
}
real Saldo::calcola_saldo_iniziale(int annoes,int g,int c,long s,int indbil)
{
real saldoini, pdaresca, paveresca;
char flag;
TLocalisamfile& saldi = *_saldi;
saldi.zero();
saldi.put(SLD_GRUPPO,g);
if (c != 0)
saldi.put(SLD_CONTO,c);
if (s != 0)
saldi.put(SLD_SOTTOCONTO,s);
saldi.put(SLD_ANNOES,annoes);
saldi.read();
if (saldi.bad())
saldi.zero();
flag = saldi.get(SLD_FLAGSALINI)[0];
saldoini = saldi.get_real(SLD_SALDO);
pdaresca = saldi.get_real(SLD_PDARESCA);
paveresca = saldi.get_real(SLD_PAVERESCA);
if (saldoini == 0.00) //e il conto e' patrimoniale o d'ordine
if ( (indbil == 1)||(indbil == 2)||(indbil == 5) )
saldoini = saldofin_esprec(annoes, g, c, s);
if (flag == 'D')
return saldoini+pdaresca-paveresca;
else //if (flag == 'A')
return pdaresca-saldoini-paveresca;
}
// La funzione seguente calcola il saldo per data limite o all'ultima immissione es.in /
// corso o precedente, a seconda del valore dei suoi parametri al momento della chiamata
bool Saldo::calcola(int annoes, int annoesprec, int g, int c, long s,
const TDate& data_inf, const TDate& data_sup,
int indbil, bool controllo_competenza, const TDate& inizio_es,
const TDate& fine_es, const TDate& fine_es_prec,bool stp_prov)
{
if (data_sup.ok())
{
if (!calcola_data_limite(annoes, g, c, s, data_inf, data_sup, indbil,
controllo_competenza, inizio_es, fine_es, fine_es_prec,stp_prov))
return FALSE;
}
else
if (!calcola_ultima_immissione(annoes, annoesprec, g, c, s, indbil))
return FALSE;
return TRUE;
}
const char* Saldo::causale_chiusura_es()
{
TConfig conf(CONFIG_DITTA);
tmp = conf.get("CoCaCh");
return __tmp;
}
const char* Saldo::causale_apertura_es()
{
TConfig conf(CONFIG_DITTA);
tmp = conf.get("CoCaAp");
return __tmp;
}
bool Saldo::causale_mov(long nr, const TDate& inizio_es, const TDate& data_sup, TString& provv)
{
TString codcaus;
TDate datareg;
TLocalisamfile& mov = *_mov;
mov.zero();
mov.put (MOV_NUMREG,nr);
if (mov.read() == NOERR)
{
codcaus = mov.get(MOV_CODCAUS);
datareg = mov.get_date(MOV_DATAREG);
provv = mov.get(MOV_PROVVIS);
if (codcaus == causale_chiusura_es())
return TRUE;
if (codcaus == causale_apertura_es())
if ( (datareg < inizio_es) || (datareg > data_sup) )
return TRUE;
}
return FALSE;
}
bool Saldo::calcola_data_limite(int annoes, int g, int c, long s, const TDate& data_inf, const TDate& data_sup, int indbil, bool controllo_competenza, const TDate& inizio_es, const TDate& fine_es, const TDate& fine_es_prec,bool stp_prov)
{
TString sezione, gcs_corr, gcs_prec="", provv = "";
real importo, dep = 0.00;
int gruppo, conto, annoe;
long sottoconto, num_reg;
TLocalisamfile& rmov = *_rmov;
TDate data_rmv;
bool esito = FALSE;
rmov.setkey(2);
rmov.zero();
rmov.put(RMV_GRUPPO,g);
if (c != 0)
rmov.put(RMV_CONTO,c);
if (s != 0)
rmov.put(RMV_SOTTOCONTO,s);
TRectype rec(rmov.curr());
rmov.read(_isgteq);
for ( ; !rmov.eof(); rmov.next())
{
if (rmov.curr() != rec) break;
annoe = rmov.get_int(RMV_ANNOES);
gruppo = rmov.get_int(RMV_GRUPPO);
conto = rmov.get_int(RMV_CONTO);
sottoconto = rmov.get_long(RMV_SOTTOCONTO);
data_rmv = rmov.get_date(RMV_DATAREG);
num_reg = rmov.get_long(RMV_NUMREG);
//se la causale del movimento e' uguale a quella di chiusura, il movimento non va considerato
if (causale_mov(num_reg,inizio_es,data_sup,provv))
break;
if ((!stp_prov) && (provv.trim().not_empty())) //se non e' richiesta stampa
continue; //mov. provvisori li scarto
gcs_corr = format ("%3d%3d%6ld", gruppo, conto, sottoconto);
if (gcs_corr != gcs_prec)
{
gcs_prec = gcs_corr;
dep += calcola_saldo_iniziale(annoe,gruppo,conto,sottoconto,indbil);
}
//controllo sulle date
if (annoe != annoes)
if (annoe != annoes-1)
continue;
if (controllo_competenza)
if ( (annoe == annoes -1) && (data_sup != fine_es) )
continue;
else
if ( (data_rmv <= fine_es) && (data_rmv <= fine_es_prec) ||
(data_rmv > fine_es) )
continue;
if ( (data_rmv < data_inf) || (data_rmv > data_sup) )
continue;
sezione = rmov.get(RMV_SEZIONE);
importo = rmov.get_real(RMV_IMPORTO);
if (importo.is_zero())
continue;
esito = TRUE;
if (sezione == "D") dep += importo;
else dep -= importo;
}
_saldo = dep;
return esito;
}
bool Saldo::calcola_ultima_immissione(int annoes, int annoesprec, int g, int c,
long s, int indbil)
{
//Si considerano i saldi e non piu' i movimenti
int gruppo, conto, annoe;
long sottoconto;
real saldo, pdare, pavere;
TLocalisamfile& saldi = *_saldi;
bool esito = FALSE;
_saldo_iniziale = 0.00;
_prg_dare = 0.00;
_prg_avere = 0.00;
saldi.zero();
if (annoes != 0)
saldi.put(SLD_ANNOES,annoes);
if (g != 0)
saldi.put(SLD_GRUPPO,g);
if (c != 0)
saldi.put(SLD_CONTO,c);
if (s != 0)
saldi.put(SLD_SOTTOCONTO,s);
if (saldi.read() == NOERR)
{
annoe = saldi.get_int(SLD_ANNOES);
gruppo = saldi.get_int(SLD_GRUPPO);
conto = saldi.get_int(SLD_CONTO);
sottoconto = saldi.get_long(SLD_SOTTOCONTO);
saldo = saldi.get_real(SLD_SALDO);
pdare = saldi.get_real(SLD_PDARE);
pavere = saldi.get_real(SLD_PAVERE);
if (annoesprec == 0) //all'ultima immissione es.in corso
{
if ( (pdare == 0)&&(pavere == 0.0) )
{
if ( (indbil == 3) || (indbil == 4) )
return esito;
if ( (indbil == 1) || (indbil == 2) || (indbil == 5) )
{
if (saldo == 0)
{
saldo = saldofin_esprec(annoes,gruppo,conto,sottoconto);
if (saldo == 0.00)
return esito;
}
_saldo_iniziale = saldo;
}
}
else _saldo_iniziale = saldo;
esito = TRUE;
_prg_dare = pdare;
_prg_avere = pavere;
// i tre valori precedenti vengono utilizzati per la stampa bilancio
// di verifica
_saldo = _saldo_iniziale + _prg_dare - _prg_avere;
}
else //all'ultima immissione es.precedente
{
TRecnotype numrec = saldi.recno();
TRectype app = ricerca_progr_prec(annoe-1, gruppo, conto, sottoconto);
annoe = app.get_int (SLD_ANNOES);
pdare = app.get_real(SLD_PDARE);
pavere = app.get_real(SLD_PAVERE);
saldi.readat(numrec);
if ( (pdare == 0) && (pavere == 0) )
return esito;
esito = TRUE;
_prg_dare = pdare;
_prg_avere = pavere;
_saldo = pdare - pavere;
}
}
return esito;
}
TRectype& Saldo::ricerca_progr_prec (int annoesprec, int g, int c, long s)
{
TLocalisamfile& saldi = *_saldi;
saldi.zero();
static TRectype rec(saldi.curr());
if (annoesprec != 0)
saldi.put(SLD_ANNOES,annoesprec);
if (g != 0)
saldi.put(SLD_GRUPPO,g);
if (c != 0)
saldi.put(SLD_CONTO,c);
if (s != 0)
saldi.put(SLD_SOTTOCONTO,s);
saldi.read();
if (saldi.bad())
saldi.zero();
rec = saldi.curr();
return rec;
}
//calcolo dei progressivi attuali
bool Saldo::prg_attuali(int annoes,TConto& conto,int indbil,real& prgdare,real& prgavere)
{
real saldoini, pdare, pavere, pdaresca, paveresca;
char flagsalini;
int g = conto.gruppo();
int c = conto.conto();
long s = conto.sottoconto();
TLocalisamfile& saldi = *_saldi;
saldi.zero();
saldi.put(SLD_GRUPPO,g);
if (conto.conto() != 0)
saldi.put(SLD_CONTO,c);
if (conto.sottoconto() != 0)
saldi.put(SLD_SOTTOCONTO,s);
saldi.put(SLD_ANNOES,annoes);
if (saldi.read() == NOERR)
{
flagsalini = saldi.get(SLD_FLAGSALINI)[0];
saldoini = saldi.get_real(SLD_SALDO);
if ( (indbil == 1) || (indbil == 2) || (indbil == 5) )
if (saldoini == 0)
{
saldoini = saldofin_esprec(annoes,conto.gruppo(),conto.conto(),conto.sottoconto());
if (saldoini > 0.00)
flagsalini = 'D';
else flagsalini = 'A';
}
pdare = saldi.get_real(SLD_PDARE);
pavere = saldi.get_real(SLD_PAVERE);
pdaresca = saldi.get_real(SLD_PDARESCA);
paveresca = saldi.get_real(SLD_PAVERESCA);
if (flagsalini == 'D')
{
prgdare = saldoini + pdare + pdaresca;
prgavere = pavere + paveresca;
}
else
{
prgdare = pdare + pdaresca;
prgavere = saldoini + pavere + paveresca;
}
}
return TRUE;
}
bool Saldo::prg_mov_eliminati(int annoes,TConto& conto,int indbil,real& prgdare,real& prgavere)
{
real saldoini, pdaresca, paveresca;
char flagsalini;
TLocalisamfile& saldi = *_saldi;
saldi.zero();
saldi.put(SLD_GRUPPO,conto.gruppo());
if (conto.conto() != 0)
saldi.put(SLD_CONTO,conto.conto());
if (conto.sottoconto() != 0)
saldi.put(SLD_SOTTOCONTO,conto.sottoconto());
saldi.put(SLD_ANNOES,annoes);
if (saldi.read() == NOERR)
{
flagsalini = saldi.get(SLD_FLAGSALINI)[0];
saldoini = saldi.get_real(SLD_SALDO);
if ( (indbil == 1) || (indbil == 2) || (indbil == 5) )
if (saldoini == 0)
{
saldoini = saldofin_esprec(annoes,conto.gruppo(),conto.conto(),conto.sottoconto());
if (saldoini > 0.00)
flagsalini = 'D';
else flagsalini = 'A';
}
pdaresca = saldi.get_real(SLD_PDARESCA);
paveresca = saldi.get_real(SLD_PAVERESCA);
if (flagsalini == 'D')
{
prgdare = saldoini + pdaresca;
prgavere = paveresca;
}
else
{
prgdare = pdaresca;
prgavere = saldoini + paveresca;
}
}
return TRUE;
}
TLocalisamfile * get_descr_cf (TLocalisamfile * pconti,
TLocalisamfile * clifo, int g, int c, long s)
{
pconti->zero();
pconti->put (PCN_GRUPPO, g);
pconti->put (PCN_CONTO , c);
pconti->put (PCN_SOTTOCONTO, s);
pconti->read();
if (pconti->good())
return pconti;
TString tipocf = pconti->get(PCN_TMCF);
long codcf = s;
clifo->zero();
clifo->put(CLI_CODCF, codcf);
clifo->put(CLI_TIPOCF, tipocf);
clifo->read();
if (clifo->good())
return clifo;
return NULL;
}