
#ifndef __SC2403_H
#define __SC2403_H

#include <printer.h>
#include <form.h>

#include "../cg/saldacon.h"
#include "sc2102.h"
#include "sc2400a.h"
#include "sc21pec.h"

#include <clifo.h>
#include <causali.h>
#include <pagsca.h>
#include <scadenze.h>

#ifndef __SCSELECT_H
#include "scselect.h"
#endif

class TESSL_mask: public TSelection_mask

{
  TRelation _ditta;

protected:
  virtual void on_firm_change();
  virtual void start_run();

public:
  const char *get_prof_base() const;
  const TString &get_prof_code() const;
  const TString &get_prof_lang() const;  

  TESSL_mask(const char *name);
  virtual ~TESSL_mask();
};

///////////////////////////////////////////////////////////
// TESSL_row
///////////////////////////////////////////////////////////

class TESSL_row : public TSortable

{                
  TDate    _data;                // Data scadenza o pagamento
  int      _riga;                // Riga della fattura
  int      _rata;                // Numero rata o progrssivo

  TString  _causale;             // Codice causale
  TString  _descrizione;         // Sua descrizione
  
  TDate    _data_doc;            // Data del documento
  TString  _num_doc;             // Numero documento
  long     _num_prot;            // Protocollo IVA
  TImporto _importo;             // Importo in valuta
  real     _importo_lire;        // Importo in lire
  real     _scaduto;             // Importo scaduto
  real     _esposto;             // Importo esposto
  bool     _salvo_buon_fine;     // Importo esposto salvo buon fine
  real     _totale;              // Totale documento
  TValuta  _valuta;              // Codice valuta, data cambio e cambio
  
protected: // TSortable
  virtual int compare(const TSortable& s) const;
  void set_imp(TForm_item& fi, const real& imp, bool valuta) const;

public:                               
  int riga() const { return _riga; }
  int rata() const { return _rata; }

  void reset_causale() { _causale.cut(0); _descrizione.cut(0); }
  void descrizione(const char* s) { _descrizione = s; }
  void importo(const TImporto& i) { _importo = i; }
  void scaduto(const real& s) { _scaduto = s; }
  void esposto(const real& e) { _esposto = e; }
  void importo_in_lire(const real& il) { _importo_lire = il; }
  void salvo_buon_fine(bool sbf) { _salvo_buon_fine = sbf; }
  
  const TValuta& valuta() const { return _valuta; } 
  const TImporto& importo() const { return _importo; }
  real importo_in_lire() const { return _importo_lire; }
  real scaduto() const { return _scaduto; }
  real esposto() const { return _esposto; }
  const TDate& data() const { return _data; }
  
  void print_on(TPrint_section& body);
  
  TESSL_row(const TRiga_partite& row, const TDate& data, const TImporto& imp, int rata);
  TESSL_row(const char* desc, const TImporto& imp);
  virtual ~TESSL_row() {}
};

///////////////////////////////////////////////////////////
// TESSL_form: form speciale per estratti conto
///////////////////////////////////////////////////////////

class TESSL_form : public TForm
{                       
  static TESSL_form* _form;

  TCursor*   _cursore;
  TTotalizer _totali;
  TDecoder _causali;           // Decodoficatore dei codici causale
  
  TString _lingua;             
  TDate _dlo, _dls, _dir;
  int _giorni_rischio;
  bool _in_valuta;
  int _footer_used;            // Numero di righe per ogni valuta del footer  
  char _who;

protected:
  static void header_handler(TPrinter& p);
  static void footer_handler(TPrinter& p);
  
public:
  TTotalizer& totali() { return _totali; }
  TDecoder& causali() { return _causali; }

  const TDate& data_limite_operazione() const { return _dlo; }
  const TDate& data_limite_scaduto() const { return _dls; }
  int giorni_rischio() const { return _giorni_rischio; }
  const TDate& data_inizio_rischio() const { return _dir; }

  const TString& lingua() const { return _lingua; }
  bool in_valuta() const { return _in_valuta; }
  const TString& describe(short id, char sez = 'B') const;
  const char sezione_normale() const { return _who == 'C' ? 'D' : 'A' ; }
  
  virtual bool print_game(const TPartita& game);

  TESSL_form(const TESSL_mask& m, short id_datalim, short id_datascad = 0, short id_giorni_rischio = 0);      
  virtual ~TESSL_form();
};    

///////////////////////////////////////////////////////////
// TESSL_array
///////////////////////////////////////////////////////////

class TESSL_array : public TArray
{   
  TArray _scaduto;        // Array di importi scaduti
  
  const TESSL_form* _form;

protected:
  TESSL_row& new_row(const TRiga_partite& row, const TDate& data, const TImporto& imp, int rata = 0);
  void add_row(const TRiga_partite& row);

  const TESSL_form& form() const { return *_form; }
  real calcola_scaduto(const TRiga_scadenze& rata, bool valuta);
  
  
  TImporto* importo_riga_scaduto_ptr(int n) const { return (TImporto*)_scaduto.objptr(n); }
  TImporto& importo_riga_scaduto(int n);

  TImporto importo(const TPartita& game, const TRectype& pag, bool valuta) const;
  
public:    
  TESSL_row& row(int r) const { return (TESSL_row&)operator[](r); }

  TESSL_array(const TPartita& game, const TESSL_form* f);
  virtual ~TESSL_array() {}
};

#endif // __SC2403_H
