#ifndef __CGLIB_H
#define __CGLIB_H

#ifndef __ISAM_H
#include <isam.h>
#endif
#ifndef __REAL_H
#include <real.h>
#endif
#ifndef __DATE_H
#include <date.h>
#endif

#include <assoc.h>
#include "conto.h"

//TLocalisamfile * get_descr_cf(TLocalisamfile * pconti,TLocalisamfile * clifo , int g, int c, long s);

class TSaldi_list : public TAssoc_array
{
public:
  TSaldi_list (int g, int c, int aec, int aep=0);
  TRectype* saldi() const;
};

#define Saldo TSaldo

enum tipobil { DataLimite=1, UltimaImmissione };        

class TSaldo 
{
  real      _saldo, _saldo_iniziale;
  real      _prg_dare, _prg_avere, _prg_daresca, _prg_averesca;
  int       _indbil;
  TRectype* _saldo_ep;
  int       _annoes;
  TDate     _inizioEs, _fineEs;
  TString16 _codcaus;
  TDate     _datareg;
  TDate     _datacomp;
  TString   _provv;

  bool      _movimentato;
  bool      _significativo;
  bool      _rec_presente_ec;
  bool      _rec_presente_ep;

protected:
  void      InFinEs(int);
  void      leggi_mov(long numreg);       // Leggi testata      
  real      calcola_saldo_iniziale(int g, int c, long s, int indbil);
  
public:

  bool  movimentato()   const { return _movimentato; }
  bool  significativo() const { return _significativo; }
  bool  esiste_saldo()  const { return _rec_presente_ec || _rec_presente_ep;}
  
  const int EsePre (const int annocorr);  // Determina esercizio precedente
  int   annoes () const { return _annoes; }
  void  set_annoes (int anno) { _annoes = anno; }

  bool  causale_mov(long, const TDate&, const TDate&, TString&);
  const char*   causale_chiusura_es();
  const char*   causale_apertura_es();

  bool ultima_immissione_bilancio(int anno,int g,int c,long s,int indbil);
  bool ultima_immissione_verifica(int anno,int g,int c,long s,int indbil);
  bool data_limite_bilancio(int,int,int,long,const TDate&,const TDate&,int,bool);

  TRectype& ricerca_progr_prec(int, int, int, long);

  real saldofin_esprec(int,int,int,long); 
  bool prg_attuali(int,TConto&,real&,real&);
  bool prg_mov_eliminati(int,TConto&,real&,real&);

  real saldo() const {return _saldo;}
  real saldoini() const {return _saldo_iniziale;}
  real prgdare() const {return _prg_dare;}
  real prgavere() const {return _prg_avere;}
  bool prg_attuali(int,TConto&,int,real&,real&);
  bool prg_mov_eliminati(int,TConto&,int,real&,real&);
  Saldo();
  ~Saldo();
};

class TTab_conti : public TAssoc_array
{
  void do_agg(TConto* tc, int anno_es, const real& importo, char sezione,
              bool movap, bool provv, bool somma, const char* key);
public:
  void aggiorna_conto(const TConto& tc, int anno_es, const real& importo,
                      char sezione, bool movap, bool provv, bool somma);
  void aggiorna_conto (int gruppo, int conto, long sottoconto, int anno_es,
                       const real& importo, char sezione, bool movap,
                       bool provv, bool somma);
};

class TSaldo_agg : public TObject
{
  TTab_conti  _tab_conti;
  bool _movap;   // se e' mov. d'apertura (aggiorno SALDO e FLAGSALINI in 
  //  saldi)
  bool  _provv;
  int  _anno_es; // anno esercizio
  TDate _data_ulmov;  // data ultimo movimento
  long  _num_ulmov;   // numero ultimo movimento 
  TRectype  * _rec;  // record corrente sui saldi
  THash_object * tconti() { return _tab_conti.get_hashobj(); }

public:
  void clear_saldi(int year);
  void registra();
  void aggiorna (const TConto& tc, const real& importo, char sezione,
                 bool somma=TRUE);  
  void aggiorna (int gruppo, int conto, long sottoconto, const real& importo,
                 char sezione, bool somma=TRUE);  

  void set_anno_es(int anno) { _anno_es = anno; }
  int anno_es() const { return _anno_es; }

  void set_movap (bool movap) { _movap = movap; }
  bool movap() const { return _movap; }

  void set_movprovv (bool p) { _provv = p; }
  bool movprovv() { return _provv; }

  void set_data_ulmov (const TDate& data) { _data_ulmov = data; }
  const TDate& data_ulmov() const { return _data_ulmov; }

  void set_num_ulmov (long num) { _num_ulmov = num; }
  long num_ulmov() const { return _num_ulmov; }

  void reset(); // pulisce l'array dei conti
  TSaldo_agg();
  int items() const { return _tab_conti.items();}
};


#endif

