#ifndef __77STQAB_H
#define __77STQAB_H

#include "77stq.h"

//////////////////////////////////////
//      QUADRO A
//////////////////////////////////////

class TDipendente : public TSortable
{ 
  TRecnotype _pos;
  
  long _codice_ditta;
  TString _ragsoc;
  long _codice_dipendente;
  long _codice_deceduto;
  TDate _fine_rapporto;
  bool _lavoro_precedente;
  char _causa;
  char _rettifica_conguaglio;
  int _numero_progressivo;
  
public:  
  virtual int compare(const TSortable& s) const;
  
  TRecnotype pos() const { return _pos; }
  long codice_deceduto() const { return _codice_deceduto; }
  void reset_deceduto() { _codice_deceduto = -_codice_deceduto; }
  long codice() const { return _codice_dipendente; }
  
  int anno_fine_rapporto() const { return _fine_rapporto.year(); }
  bool lavoro_precedente() const { return _lavoro_precedente; }
  char rettifica_conguaglio() const { return _rettifica_conguaglio; }
  
  TDipendente(const TCursor& cur);
  virtual ~TDipendente() { }
};

class TDipendenti : public TObject
{ 
  TArray _data;
  
protected:  
  const TDipendente& dip(int i) const { return (const TDipendente&)_data[i]; }
  
public:    
  const TDipendente& operator[](int i) const { return dip(i); }
  
  int fill(TCursor& cur); 
  int items() const { return _data.items(); }
  
  int find(long d) const;

  TDipendenti() { }
  virtual ~TDipendenti() { }
};

class TQuadroA : public TDicForm
{
  enum { QA_FORMLEN = 72 };
  
protected:  
  virtual void next_page(TPrinter& pr);
  virtual bool print(const long codditta, const long NumFis, const long NumNoFis);
  
  virtual void azzera_totali();
  virtual void aggiorna_totali(const char) { }
  
  virtual int elementi_pagina(PaginaQuadro p) const;
  virtual int prima_riga(PaginaQuadro p) const;
  virtual int riga_totali(PaginaQuadro p) const;
  
  bool init(long codditta);
  
  virtual void preprocess_corpo(const TRectype& rec);

  int calcola_firma();
  void stampa_corpo(TPrinter& pr);
  void stampa_totali(TPrinter& pr);
  void stampa_firma(TPrinter& pr);

public:
  TQuadroA(const char* form, const char* quadro)  : TDicForm(form, quadro) {}
  virtual ~TQuadroA() {} 
};      

class TStampaQuadroA : public TStampaQuadro
{
protected:
  TDicForm* _form;
  TCursor* _cur;
    
protected:    
  virtual bool user_create();
  virtual bool user_destroy();

  virtual bool conta_tipi_per() const { return FALSE; }
  virtual TDicForm* get_form()  const { return _form; }
  virtual TCursor* get_cursor() const { return _cur; }    

public:
  TStampaQuadroA(const char* quadro, char livel) : TStampaQuadro(quadro, livel) { }
  virtual ~TStampaQuadroA() { } 
};

///////////////////////////////////////////////
//         QUADRO A1
///////////////////////////////////////////////

class TQuadroA1 : public TQuadroA
{
protected:  
  virtual int elementi_pagina(PaginaQuadro p) const;
  virtual int prima_riga(PaginaQuadro p) const;
  virtual long filtra(const long codditta);
  virtual void preprocess_corpo(const TRectype& rec);

public:
  TQuadroA1(const char* form, const char* quadro) : TQuadroA(form, quadro) { }
  virtual ~TQuadroA1() { } 
};      

class TStampaQuadroA1 : public TStampaQuadroA
{
protected:    
  virtual bool user_create();

public:
  TStampaQuadroA1(const char* quadro, char livel) : TStampaQuadroA(quadro, livel) { }
  virtual ~TStampaQuadroA1() { }
};

///////////////////////////////////////////////
//           QUADRO A2
///////////////////////////////////////////////

class TQuadroA2 : public TQuadroA
{
protected:  
  virtual int elementi_pagina(PaginaQuadro p) const;
  virtual int prima_riga(PaginaQuadro p) const;
  virtual void preprocess_corpo(const TRectype& rec);

public:
  TQuadroA2(const char* form, const char* quadro) : TQuadroA(form, quadro) { }
  virtual ~TQuadroA2() { } 
};      

class TStampaQuadroA2 : public TStampaQuadroA
{
protected:    
  virtual bool user_create();

public:
  TStampaQuadroA2(const char* quadro, char livel) : TStampaQuadroA(quadro, livel) { }
  virtual ~TStampaQuadroA2() { }
};

/////////////////////////////////////////////////
//            QUADRO A3
/////////////////////////////////////////////////

class TQuadroA3 : public TQuadroA
{
protected:  
  virtual int elementi_pagina(PaginaQuadro p) const;
  virtual int prima_riga(PaginaQuadro p) const;

public:
  TQuadroA3(const char* form, const char* quadro) : TQuadroA(form, quadro) { }
  virtual ~TQuadroA3() { } 
};      

class TStampaQuadroA3 : public TStampaQuadroA
{
protected:    
  virtual bool user_create();

public:
  TStampaQuadroA3(const char* quadro, char livel) : TStampaQuadroA(quadro, livel) { }
  virtual ~TStampaQuadroA3() { }
};

///////////////////////////////////////////////////////
//                   QUADRO B
///////////////////////////////////////////////////////

class TQuadroB : public TQuadroA
{
protected:  
  virtual int elementi_pagina(PaginaQuadro p) const;
  virtual int prima_riga(PaginaQuadro p) const;

public:
  TQuadroB(const char* form, const char* quadro) : TQuadroA(form, quadro) { }
  virtual ~TQuadroB() { } 
};      

class TStampaQuadroB : public TStampaQuadroA
{
protected:    
  virtual bool user_create();

public:
  TStampaQuadroB(const char* quadro, char livel) : TStampaQuadroA(quadro, livel) { }
  virtual ~TStampaQuadroB() { }
};

///////////////////////////////////////////////////////////////////////////////////////////
//
// Quadro H
//
///////////////////////////////////////////////////////////////////////////////////////////

class TQuadroH : public TQuadroA
{                          
  enum { QH_FORMLEN = 72 };
  
protected:    
  virtual bool ultima_pagina() const { return _PaginaCorrente==SECONDA; }
  virtual int elementi_pagina(PaginaQuadro p) const;
  virtual int prima_riga(PaginaQuadro p) const;
  virtual bool print(const long codditta, const long NumFis, const long NumNoFis);  
  virtual void inc_curr_page();
  virtual long filtra(const long codditta);

public:  
  TQuadroH(const char* form, const char* quadro) : TQuadroA(form, quadro) { }
  virtual ~TQuadroH() { } 
};      

class TStampaQuadroH : public TStampaQuadroA
{
protected:    
  virtual bool user_create();

public:
  TStampaQuadroH(const char* quadro, char livel) : TStampaQuadroA(quadro, livel) {}
  virtual ~TStampaQuadroH() {}
};

#endif

