// cg3300.h

enum stampe {
  clienti=1, 
  fornitori=2, 
  modulo101=3, 
  modulo102=4,
  entrambi=5
  };

class desc_campo : public TObject
{
public:
  int      _riga;
  TString  _formato;
  desc_campo() : _riga(0), _formato("") {}
  virtual ~desc_campo() {}
};

class Array_desc_campi : public TObject
{
  TArray  _campi;            // Array di campi e stringhe di formato
  int     _passo;            // Numero di righe tra le righe dettaglio
  int     _righe_modulo;     // Numero di righe totali del modulo

public:
  const desc_campo&  campi(int i)    { return (const desc_campo&) _campi[i]; }
  int   riga (int i)    { return ((const desc_campo&)_campi[i])._riga; }
  const char * formato (int i) 
  { return ((desc_campo&)_campi[i])._formato; }
  void               add (int, const char*);
  void               leggi_modulo (const char *, const char *);

  const int          passo() { return _passo; }
  const int          righe_modulo () { return _righe_modulo; }

  Array_desc_campi() {};
  virtual ~Array_desc_campi() {};
};

class Record_B {
  int  esc;
  real impesc;
  real ivaesc;
  real tot;
  
public:
  void compila (TLocalisamfile *);
  void azzera(); 
  void somma();

  real tot_real()    { return tot; }
  int  esc_int()     { return esc; }
  real impesc_real() { return impesc; }
  real ivaesc_real() { return ivaesc; }

  const char * tot_str()    { return tot.string("@@@@@@@@@@@"); }
  //  const char * esc_str()    { return esc.string("@@@@@@@@@@@"); }
  const char * impesc_str() { return impesc.string("@@@@@@@@@@@"); }
  const char * ivaesc_str() { return ivaesc.string("@@@@@@@@@@@"); }

  Record_B() : esc(0), impesc(0.00), ivaesc(0.00), tot(0.00) {};
  virtual ~Record_B () {};
};

struct alleg_sort {
  long          codditta_dic;
  char          tipopers_dic  [2];
  char          paiva_dic [12];
  char          cognome_dic [31];
  char          nome_dic [21];
  char          ragsoc_dic[51];
  //  char         datana_dic[11];
  TDate         datana_dic;
  char          sesso_dic [2];
  char          comunena_dic [51];
  char          provna_dic [6];
  char          viafis_dic[36];  // via + numero civico
  char          comunefis_dic [51];
  char          provfis_dic [6];
  char          attivita_dic [51];
  char          codatt_dic [6];
  int           natgiu_dic;
  int      anno;
  char     codatt_dett   [6];
  char     tipopers_dett [2];
  long     codcf_dett ;

  char     ragsoc_dett [51];
  char     cognome_dett [31];
  char     nome_dett [21];

  char     via_dett [36];
  char     comune_dett [51];
  char     prov_dett [6];

  char     statopaiva_dett [2];
  char     paiva_dett [12];

  bool     immesso;

  real    impesc;
  real    ivaesc;
  real    niesc;
  real    e8esc;
  int     ndocesc;

  real    impesp;
  real    ivaesp;
  real    niesp;
  real    e8esp;
  int     ndocesp;

  real    prog101102;

  real    tot_rigac;
  real    tot_rigap;
};

class SortRecord {
  TLocalisamfile    * _clifo;
  TLocalisamfile    * _comuni;
  TLocalisamfile    * _anagfis;
  TLocalisamfile    * _anaggiu;
  TLocalisamfile    * _anag;
  TTable            * _attiv;
  TTable            * _tpd;
  struct alleg_sort * _all;

protected:
  TRectype& look_com(const char *);
  long cerca_codice_all(TString tipo, long codcf) ;
  const char * decodifica_desc_att (TString & codatt);
  bool corrispettivo (const char * tipodoc);

public:
  void         azzera_struttura(); 
  bool         fill_dati_anag_dic (TLocalisamfile *);
  const char * fill_dati_dettaglio (const char * tipo, long codcf);
  const char * Strutt_str() { return (const char *) _all; }
  struct alleg_sort * Strutt() { return _all; }
  void         compila(TLocalisamfile *);
  void         somma  (TLocalisamfile *, stampe);
  real         importo() { return _all->impesc; }
  int          RecSize () { return sizeof(struct alleg_sort); }
  long         codcf_dett() { return _all->codcf_dett; }
  const real&  Impesc() { return _all->impesc; }

  SortRecord(); 
  ~SortRecord(); 
};


struct Totali {
  
  // Totali anno corrente
  real          _tot_tot_rigac;
  int           _tot_esc;
  real          _tot_impesc;
  real          _tot_ivaesc;
  real          _tot_niesc;
  real          _tot_e8esc;

  // Totali anno precedente
  real          _tot_tot_rigap;
  int           _tot_esp;
  real          _tot_impesp;
  real          _tot_ivaesp;
  real          _tot_niesp;
  real          _tot_e8esp;

  // Riporti
  real          _rip_tot_riga;
  int           _rip_tot_es;
  real          _rip_tot_impes;
  real          _rip_tot_ivaes;
  real          _rip_tot_nies;
  real          _rip_tot_e8es;

  real          _tot_col_101102;

public:

  void azzera_totali();
  void incrementa_totali(struct alleg_sort*, stampe);
  void compila_riporti();  

  const real& TotTotRigac()  { return _tot_tot_rigac; }
  const int   TotEsc()       { return _tot_esc; }
  const real& TotImpesc()    { return _tot_impesc; }
  const real& TotIvaesc()    { return _tot_ivaesc; }
  const real& TotNiesc()     { return _tot_niesc; }
  const real& TotE8esc()     { return _tot_e8esc; }
  
  const real& TotTotRigap()  { return _tot_tot_rigap; }
  const int   TotEsp()       { return _tot_esp; }
  const real& TotImpesp()    { return _tot_impesp; }
  const real& TotIvaesp()    { return _tot_ivaesp; }
  const real& TotNiesp()     { return _tot_niesp; }
  const real& TotE8esp()     { return _tot_e8esp; }

  const real& RipTotTotRiga()   { return _rip_tot_riga; }
  const int   RipTotEs()       { return _rip_tot_es; }
  const real& RipTotImpes()    { return _rip_tot_impes; }
  const real& RipTotIvaes()    { return _rip_tot_ivaes; }
  const real& RipTotNies()     { return _rip_tot_nies; }
  const real& RipTotE8es()     { return _rip_tot_e8es; }
};

enum modi_stampa {
  modulo=1,
  controllo=2,
  dischetto=3 
  };

enum posizioni {
  PAIVA_DIC = 0,
  PAG_NUM,
  COGNOME_DIC,
  NOME_DIC   ,
  GG_NA  ,
  MM_NA  ,
  AA_NA  ,
  MASCHIO,
  FEMMINA,
  COMUNE_NA,
  PROV_NA  ,
  IND_FIS  ,
  COMUNE_FIS,
  PROV_FIS  ,
  PAIVA_FIS,
  ATT_FIS   ,
  CODATT_FIS ,
  RAGSOC_DIC      ,
  NAT_GIU    ,
  IND_GIU    ,
  COMUNE_GIU ,
  PROV_GIU   ,
  PAIVA_GIU,
  ATT_GIU   ,
  CODATT_GIU  ,
  NUM_PAG_TOT,
  NUM_REC,
  PROG_DETT,
  COG_DETT,
  NOM_DETT,
  VIA_DETT,
  COM_DETT,
  PRO_DETT,
  PAIVA_DETT,
  ESC_DETT,
  SEGNO_IMPESC,
  IMPESC_DETT,
  SEGNO_IVAESC,
  IVAESC_DETT,
  SEGNO_NIESC,
  NIESC_DETT,
  SEGNO_E8ESC,
  E8ESC_DETT,
  SEGNO_TOTC,
  TOTC_DETT,
  CASELLA_PAIVA,
  ESP_DETT,
  SEGNO_IMPESP,  
  IMPESP_DETT,
  SEGNO_IVAESP,
  IVAESP_DETT,
  SEGNO_NIESP,
  NIESP_DETT,
  SEGNO_E8ESP,
  E8ESP_DETT,
  SEGNO_TOTP,
  TOTP_DETT,
  RECB_ESC,
  RECB_IMPESP,
  RECB_IVAESC,
  RECB_SEGNO_TOT,
  RECB_TOT,
  RIP_ESC,
  RIP_SEGNO_IMPESP,
  RIP_IMPESP,
  RIP_SEGNO_IVAESP,
  RIP_IVAESP,
  RIP_SEGNO_NIESP,
  RIP_NIESP,
  RIP_SEGNO_E8ESP,
  RIP_E8ESP,
  RIP_SEGNO_TOTALE,
  RIP_TOTALE,
  TOT_ESC,
  TOT_SEGNO_IMPESP,
  TOT_IMPESP,
  TOT_SEGNO_IVAESP,
  TOT_IVAESP,
  TOT_SEGNO_NIESP,
  TOT_NIESP,
  TOT_SEGNO_E8ESP,
  TOT_E8ESP,
  TOT_SEGNO_TOTALE,
  TOT_TOTALE
  };

