#ifndef __CG2103_H                
#define __CG2103_H

#ifndef __ISAM_H
#include <isam.h>
#endif                                           

#ifndef __CONTO_H
#include "conto.h"
#endif

enum TipoIVA 
{
  iva_errata     = -1,
  nessuna_iva    = 0,
  iva_vendite    = 1,
  iva_acquisti   = 2,   
  libro_giornale = 5,
  iva_generica   = 9
};

enum TipoConto
{ 
  spr = 'G',           // spese e rimborsi
  aba = 'A',           // abbuoni attivi
  abp = 'P',           // abbuoni passivi
  rpf = 'R',           // ritenute professionali
  asp = 'L',           // altre spese
  dfc = 'C',           // differenza cambio
  tot = 'Z'
  };

const char* iva2name(TipoIVA i);                                                 

class TRegistro : public TObject
{           
  bool read_att();

protected:
  TRectype _rec, _att;
  real _prorata;

public:
  bool read(const char* code, int year);
  bool reread();
  TRegistro& operator =(const TRegistro& r);

  virtual bool ok() const { return !_rec.empty(); }

  int tipo() const;
  TipoIVA iva() const;
  bool corrispettivi() const;
  bool sospeso() const { return _rec.get_bool("B1");}
  const TString& name() const;
  int year() const;
  TDate last_reg() const { return _rec.get_date("D2"); } 
  TDate last_print() const { return _rec.get_date("D3"); }
  long protocol() const { return _rec.get_long("I5"); }
  const TString& attivita() const { return _rec.get("S8"); }

  bool agenzia_viaggi();
  const TString& tipo_attivita();
  bool attivita_mista() { const char a = tipo_attivita()[0]; return a == 'E'; }
  const real& prorata();
  bool update(long uprotiva, const TDate& lastreg);

  TRegistro(const char* code = "", int year = 0);  
  virtual ~TRegistro() {}
};


class TLibro_giornale : public TRegistro
{
public:
  bool read(int year);
  TDate global_last_print() const;

  TLibro_giornale(int year = 0);
  virtual ~TLibro_giornale() {}
};


class TCausale : public TArray
{ 
  TRectype _rec;
  TRegistro _reg;

  TipoIVA _iva;
  bool _corrisp;
  char _sezione_clifo, _sezione_ritsoc;
  
protected:       
  const TRectype* row(int num) const { return (const TRectype*)objptr(num); }
  void calcIVA();

public: // TObject
  virtual bool ok() const;

public:
  TBill& bill(int num, TBill& c) const;
  
  const char* codice() const;
  const char* descrizione() const;
  const char* desc_agg(int num) const;
  
  bool data_doc() const;
  bool num_doc() const;
  bool apertura() const;
  bool sezionale() const;
  bool valuta() const;
  bool intra() const;
  bool valintra() const;
  const char* causale_inc_imm() const;
  const char* tipo_doc() const;

  TRegistro& reg() const { return (TRegistro&)_reg; }
  TipoIVA iva() const { return _iva; }
  bool corrispettivi() const { return _corrisp; }
  int tipomov() const;
  bool saldaconto() const;
  int link_m770() const;
  
  bool similar(const TCausale& c) const;
  
  char sezione(int riga) const;
  char sezione_clifo();
  char sezione_ritsoc();
  
  virtual bool read(const char* cod, int year);

  TCausale(const char* code = "", int year = 0);
  virtual ~TCausale() {}
};                                               


class TCodiceIVA : public TRectype
{
public:
  TCodiceIVA(const char* codice = NULL);                        
  bool read(const char* codice);                    
  bool ok() const { return !empty(); }
  const TString& codice() const { return get("CODTAB"); }
  real percentuale() const { return get_real("R0"); }
  const TString& tipo() const { return  get("S1"); }
};

#endif
