#ifndef __CONTO_H
#define __CONTO_H

#ifndef __REAL_H
#include <real.h>
#endif

#ifndef __ISAM_H
class TRectype;
#endif

#ifndef __MASK_H
class TMask;
#endif


class TBill : public TSortable
{
  char _tipo;              // ' ' = Conto, 'C' = Cliente, 'F' = 'Fornitore'
  int _gruppo, _conto;
  long _sottoconto;        // Sottoconto, codice cliente o fornitore
  TString _descrizione;    // Vuota fino alla chiamata di describe
  int _tipo_cr;            // Tipo costo/ricavo
  bool _sospeso;
  char _sezione;
  
protected:           
  virtual int compare(const TSortable& s) const;
  virtual const char* class_name() const { return "Conto"; }
  
  const TBill& copy(const TBill& b);
  const char* field_name(int n, bool contro) const;

public: // TObject
  virtual bool ok() const;        // Gruppo, Conto e Sottoconto non nulli

public:
  TBill(int g = 0, int c = 0, long s = 0L, char t = ' ', const char* d = NULL, int r = -1)
    : _tipo(t), _gruppo(g), _conto(c), _sottoconto(s), _descrizione(d), 
  _sezione(' '), _sospeso(FALSE)
  { set(g,c,s,t,d,r);}

  TBill(TToken_string& tgcsd, int from, int mode = 0) { get(tgcsd, from, mode); }
  TBill(const TRectype& rec, bool contro = FALSE) { get(rec, contro); }
  TBill(const TBill& b) { copy(b); }
  virtual ~TBill() {}

  const TBill& set(int g = 0, int c = 0, long s = 0L, char t = ' ', 
                   const char* d = NULL, int r = -1);

  const TBill& get(TToken_string& ts, int from, int mode = 0);
  const TBill& add_to(TToken_string& ts, int from, int mode = 0);
  const TBill& operator=(const TBill& b) { return copy(b); }

  bool empty() const { return _gruppo==0 && _conto==0 && _sottoconto == 0; }

  char tipo() const { return _tipo; }
  int gruppo() const { return _gruppo; }
  int conto() const { return _conto; }
  long sottoconto() const { return _sottoconto; }
  long codclifo() const { return _sottoconto; }
  long& codclifo() { return _sottoconto; }
  
  bool find();
  const TString& descrizione() const;
  int tipo_cr() const;
  void tipo_cr(int tcr) { _tipo_cr = tcr; }
  
  int tipo_att();
  bool read(TRectype& r);
  bool sospeso() const { return _sospeso; }  // _sospeso e' letto nella read()
  char sezione() const { return _sezione; }
  
  void put(TRectype& r, bool contro = FALSE) const;
  bool get(const TRectype& r, bool contro = FALSE);
  
  void set(TMask& m, short g, short c, short s, short t = 0, short d = 0) const;
  void get(const TMask& m, short g, short c, short s, short t = 0, short d = 0);
  
  const char* string(int mode = 0) const;
};


enum TIndbil { ib_null, ib_attivita, ib_passivita, ib_costi, ib_ricavi, ib_conti_ordine };

class TConto : public TBill
{
  real _dare, _avere, _darepro, _averepro, _saldofin, _saldo;
  TImporto _saldo_finale;

public:
  TConto(int g = 0, int c = 0, long s = 0L, char t = ' ', const char* d = NULL)
    : TBill(g, c, s, t, d) {}
  TConto (TToken_string& tgcsd, int from, int mode = 0)
    : TBill(tgcsd, from, mode) {}
  
  real& dare() { return _dare; }
  const real& dare() const { return _dare; }

  real& avere() { return _avere; }
  const real& avere() const { return _avere; }

  real& darepro() { return _darepro; }
  const real& darepro() const { return _darepro; }

  real& averepro() { return _averepro; }
  const real& averepro() const { return _averepro; }

  real& saldo() { return _saldo; }
  const real& saldo() const { return _saldo; }
  
  real& saldofin() { return _saldofin; }
  const real& saldofin() const { return _saldofin; }
  
  TImporto& saldo_finale() { return _saldo_finale; }
  const TImporto& saldo_finale() const { return _saldo_finale; }
};

#endif