#include <assoc.h>
#include <config.h>
#include <mask.h>
#include <printapp.h>
#include <progind.h>
#include <sort.h>
#include <tabutil.h>
#include <utility.h>

#include <comuni.h>
#include <nditte.h>
#include <unloc.h>
#include <clifo.h>
#include <pconti.h>
#include <anagr.h>
#include <rmov.h>
#include <mov.h>
#include <saldi.h>

#include "cglib.h"
#include "cg1.h"
#include "cg1600.h"

bool our_handler (TMask_field & f,KEY k);

class Anno_es : public TObject
{
  TDate         _inizio, _fine;
  TToken_string *_str;
public:
  long anno();
  TDate inizio();
  TDate fine()  ;
  Anno_es(long anno, TDate& inizio, TDate& fine); 
  ~Anno_es() { delete _str; }
};

TDate Anno_es::inizio() 
{ 
  _inizio = _str->get(1); 
  return _inizio; 
}

TDate Anno_es::fine()   
{ 
  _fine   = _str->get(2); 
  return _fine; 
}

long Anno_es::anno()
{
  return _str->get_int(0); 
}

Anno_es::Anno_es(long anno, TDate& inizio, TDate& fine)
{
  _str = new TToken_string(35);
  _inizio = inizio;
  _fine = fine;
  _str->add(anno); _str->add(_inizio.string()); _str->add(_fine.string());
}

class Anni_es : public TAssoc_array
{
  TTable  * _tabesc;
public:
  void add(long anno, TDate& inizio, TDate& fine);
  void aggiungi_anno(long anno, TDate& inizio, TDate& fine);
  Anno_es * trova(long anno, TDate& inizio, TDate& fine);
  Anni_es();
  ~Anni_es() { delete _tabesc; }
};

Anni_es::Anni_es()
{
  _tabesc = new TTable (TAB_ESC);
}

void Anni_es::add(long annoe, TDate& in, TDate& fin)
{
  TString key = format("%04ld", annoe);
  Anno_es anno(annoe, in, fin);
  TAssoc_array::add(key, anno);
}

Anno_es * Anni_es::trova(long annoe, TDate& in, TDate& fin)
{
  TString key = format("%04ld", annoe);
  Anno_es *anno = (Anno_es*) objptr ((const char*) key);
  if (anno == NULL) {
    in = ""; fin = "";
  }
  else {
    in  = anno->inizio(); 
    fin = anno->fine();
  }
  return anno;
}

void Anni_es::aggiungi_anno(long annoese, TDate& inizio, TDate& fine)
{
  TString dep;
  TString key = format("%04ld", annoese);
  Anno_es * anno;

  if (!is_key((const char *) key))
  {
    _tabesc->curr().zero();
    dep = format ("%04d",annoese);
    _tabesc->curr().put("CODTAB", (const char*) dep);
    _tabesc->read();
    if (_tabesc->bad())
      _tabesc->curr().zero();
    inizio = _tabesc->curr().get_date("D0");
    fine   = _tabesc->curr().get_date("D1"); 
    anno = new Anno_es(annoese, inizio, fine);
    TAssoc_array::add(key, anno);
  }
  else
    anno = trova (annoese, inizio, fine);
}

class _riga_sez_opp : public TObject
{
  TToken_string  * _str;
public:
  int gruppo() { return atoi(_str->get(0)); }
  int conto() { return atoi(_str->get(1)); }
  int sottoc() { return atoi(_str->get(2)); }
  const char * sezione () { return _str->get(3); }
  const char * lettera () { return _str->get(4); }
  const char * num_rom () { return _str->get(5); }
  int numero () { return atoi(_str->get(6)); } 
  real saldo_conto (); 
  real saldo_conto_raf();
  void incrementa_saldo(real& nuovo_saldo,real& nuovo_saldo_raf);
  _riga_sez_opp(int g, int c, long s,
                const char * sezione, const char * lettera,
                const char * num_rom, int num, real& saldo, real& saldo_raf);
  ~_riga_sez_opp();
};

real _riga_sez_opp::saldo_conto () 
{ 
  real r(_str->get(7));
  return r; 
}

real _riga_sez_opp::saldo_conto_raf () 
{ 
  real r(_str->get(8));
  return r; 
}

void _riga_sez_opp::incrementa_saldo(real& sld,real& sld_raf) 
{
  real sld_prec     = saldo_conto();
  real sld_prec_raf = saldo_conto_raf();
  sld_prec     += sld;
  sld_prec_raf += sld_raf;
  _str->add(sld_prec.string(), 7); 
  _str->add(sld_prec_raf.string(), 8);
}

_riga_sez_opp::_riga_sez_opp(int g, int c, long s,
                             const char * sezione, const char * lettera,
                             const char * num_rom, int num, real& saldo, real& saldo_raf)
{
  _str = new TToken_string(30);
  _str->add(format("%d",g)); 
  _str->add(format("%d",c)); 
  _str->add(format("%ld",s));
  _str->add(sezione);
  _str->add(lettera);
  _str->add(num_rom);
  _str->add(format("%d",num));
  _str->add(saldo.string());   
  _str->add(saldo_raf.string());
}

_riga_sez_opp::~_riga_sez_opp()
{
  delete _str;
}

class Righe_sez_opp : public TAssoc_array
{
public:
  _riga_sez_opp* riga() { return (_riga_sez_opp*) get(); }
  int gruppo() { return riga()->gruppo(); }
  int conto() { return riga()->conto(); }
  int sottoc() { return riga()->sottoc(); }
  const char * sezione () { return riga()->sezione(); }
  const char * lettera () { return riga()->lettera(); }
  const char * num_rom () { return riga()->num_rom(); }
  int numero () { return riga()->numero(); } 
  real saldo_conto () { return riga()->saldo_conto(); }
  real saldo_conto_raf () { return riga()->saldo_conto_raf(); }
  
  void  add (int g, int c, long s, 
             const char * sezione, const char * lettera,
             const char * num_rom, int num, real saldo, real saldo_raf);
};

void Righe_sez_opp::add(int g, int c, long s,
                        const char * sezione, const char * lettera,
                        const char * num_rom, int num, real saldo, real saldo_raf)
{
  _riga_sez_opp * riga;
  TString key = format("%s%s%s%d",sezione,lettera,num_rom,num);
  
  if (!is_key((const char *) key))
  {
    riga = new _riga_sez_opp (g, c, s, sezione, lettera, num_rom, num, saldo, saldo_raf);
    TAssoc_array::add(key,riga);
  }
  else
  {
    riga = (_riga_sez_opp*) objptr ((const char*) key);
    riga->incrementa_saldo(saldo,saldo_raf);
    //    add(key,riga,TRUE);
  }
}

int date2esc(const TDate& d, int* prevesc = NULL);

class CG1600_application : public TPrintapp
{
  friend bool data_limite    (TMask_field & f,KEY k);
  friend bool tipo_stampa    (TMask_field & f,KEY k);
  friend bool data_bil_raff  (TMask_field & f,KEY k);
  friend bool tipo_bilancio  (TMask_field & f,KEY k);
  friend bool data_inizio    (TMask_field & f,KEY k);
  friend bool data_fine      (TMask_field & f,KEY k);
  friend bool anno_esercizio (TMask_field & f,KEY k);

  struct bil_ivd
  {
    char   sez;
    char   let;
    char   numr[5];
    char   num[4];
    char   gruppo[4];
    char   conto[4];
    char   sottoc[8];
    real   saldo;
    real   saldorafr;
    real   sld_prg_dare;
    real   sld_prg_avere;
    real   mov_dare;
    real   mov_avere;
    char   tipocf; 
    bool   conto_dettagliato;
  };

  bil_ivd*           _bil;
  TMask*             _msk;
  TTable*            _tabesc;
  TTable*            _tabivd;
  TLocalisamfile*    _nditte;
  TLocalisamfile*    _comuni;
  TLocalisamfile*    _unloc;
  TLocalisamfile*    _anag;
  TLocalisamfile*    _pconti;
  TLocalisamfile*    _clifo;
  TLocalisamfile*    _saldi;
  TLocalisamfile*    _caus;
  const char*        _buff;
  TSort*             _sort;
  Anni_es*           _anni_es;
  Righe_sez_opp      _sezopps;
  TSaldi_list*       _listasld;
  TProgind*          _prog; 
  TParagraph_string* _descr,*_d;                        
  TSaldo*            _sld;

  TDate _data_fine_ese,_data_fine_ese_prec,_data_fine_raf,_data_fine_raf_prec;
  TDate _datastampa,_datalimite,_databilrafr,_datai,_datairaf;
  TDate _dataini,_datafine,_data_ini_ese,_data_ini_raf;
  int   _annoese,_annoeserafr,_anno_esercizio,_anno_esercizio_raf;
  bool _competenza,_intera_struttura,_stampamov,_stampacod,_stampa_modulo;
  bool _sbilancio_patr_gia_stampato,_attivo_o_passivo;
  bool _diffprod_fatto,_risimp_fatto;
  TString _classe_stampata, _classe_da_stampare,_numr_tot,_num_tot,_numr;
  char _sez_da_stamp,_let_da_stamp,_sez_stamp,_let_stamp,_sez_tot,_let_tot,_let,_sez_saldo,_sez,_tot_sez_saldo;
  TString _numr_da_stamp,_num_da_stamp,_numr_stamp,_num_stamp,_descr_sez;
  int _tipo_bilancio, _tipo_stampa;
  int _cont_let,_cont_numr,_cont_num,_cont_gcs,_num;
  int _stampa_mov_prov; 
  real _sale,_salerafr,_totale_ordine,_totale_economico;
  real _totale_ordine_raf,_totale_economico_raf;
  real _totale_numero,_totale_numr,_totale_lettera,_totale_sezione;
  real _totale_patrimoniale,_totale_attivita,_totale_passivita;
  real _totale_num_raf,_totale_numr_raf,_totale_let_raf,_totale_sez_raf;
  real _totale_patrim_raf,_totale_attiv_raf,_totale_passiv_raf;
  real _totale_ordine_attivo,_totale_ordine_passivo,_totale_ordine_attivo_raf;
  real _totale_ordine_passivo_raf;
  real _mov_periodo_dare,_mov_periodo_avere,_prg_prec_dare,_prg_prec_avere,_saldo_ini_dare,_saldo_ini_avere;
  real _sld_prg_dare,_sld_prg_avere,_mov_dare,_mov_avere;
  real _tot_num_saldo,_tot_numr_saldo,_tot_let_saldo,_tot_gen_saldo;
  real _tot_num_prg_d,_tot_numr_prg_d,_tot_let_prg_d,_tot_gen_prg_d;
  real _tot_num_prg_a,_tot_numr_prg_a,_tot_let_prg_a,_tot_gen_prg_a;
  real _tot_num_mov_d,_tot_numr_mov_d,_tot_let_mov_d,_tot_gen_mov_d;
  real _tot_num_mov_a,_tot_numr_mov_a,_tot_let_mov_a,_tot_gen_mov_a;
  real _tot_num_saldo_d,_tot_numr_saldo_d,_tot_let_saldo_d,_tot_gen_saldo_d;
  real _tot_num_saldo_a,_tot_numr_saldo_a,_tot_let_saldo_a,_tot_gen_saldo_a;
  real _totale_parziale,_totale_parziale_raf;  
  real _tot_parz_sld,_tot_parz_sld_d,_tot_parz_sld_a,_tot_parz_prg_d;
  real _tot_parz_prg_a,_tot_parz_mov_d,_tot_parz_mov_a;
  real _nuovo_tot_saldo_d, _nuovo_tot_saldo_a;
  int _i;
  bool _reset_righe_stampa,_totale_attivita_gia_stampato,_totale_passivita_gia_stampato,_statopatr_no_stamp;
  bool _sbilancio_ordine;
  //TString _causale_ap, _causale_chi;
  
public:

  TDate _inizioEs, _fineEs;

  bool menu (MENU_TAG m) { return TPrintapp::menu(m) ; }
  virtual bool user_create() ;
  virtual bool user_destroy();
  bool set_print(int);       
  
  virtual bool preprocess_page  (int,int);
  virtual print_action postprocess_page (int,int);
  virtual void postclose_print ();
  
  virtual void preprocess_header();
  virtual void set_page(int,int);

  bool preprocess_stampa_scalare(int);  
  bool preprocess_stampa_verifica(int);
  void crea_intestazione();
  void intesta_scalare();
  void intesta_verifica();
  void intesta_verifica_fissa();
  void init_sort();
  void crea_sort_tabella();
  void crea_sort_piano_conti_scalare();
  void crea_sort_piano_conti_verifica();
  void setta_righe_descr(TParagraph_string*,const TString&,const TString&);
  void setta_righe_descr_verifica(TParagraph_string*,const TString&,const TString&);
  void scrivi_record(const TString&,const TString&,const TString&,int,int,int,long,const real&,const real&,const real&,const real&,const real&,const real&,char,bool conto_dettagliato = TRUE);
  void riempi_record(const TString&,const TString&,const TString&,int,int,int,long,const real&,const real&,const real&,const real&,const real&,const real&,char,bool conto_dettagliato = TRUE);
  const char* descrizione_sezione(char);
  const char* descrizione_lettera(char, char);
  const char* descrizione_numeroromano(char, char, int);
  const char* descrizione_numero(char, char, int, int);
  const char* descrizione_sottoconto(int, int, long);
  const char* descr_sottoc_clifo(char,long);
  void setta_righe(const char*);
  void setta_righe_verifica();
  void stampa_totali();
  void stampa_totali_con_raffronto();
  void stampa_totali_verifica();
  bool calcola_saldo(real&, real&,int,int,long,int); 
  bool calcola(int,int,long,const TDate&,const TDate&);
  bool sottoc_clifo_scalare (int,int,int,int,real&,real&);
  void sottoc_clifo_verifica(int,int,int,char,TString&,TString&,TString&,int,int,bool);
  //const char* causale_apertura() { return _causale_ap;}
  //const char* causale_chiusura() { return _causale_chi;}
  void stampa_saldo_132(const real&);
  void stampa_saldo_198(real&, real&);
  void set_bil_key(bil_ivd* b, char sezione, char lettera,
                   const char* numero_romano, int numero,
                   bool conti_ordine = TRUE, int conto = 0,
                   int gruppo = 0, long sottoconto = 0L, char tipocf = ' ');
  void set_bil_val(bil_ivd* b, const real& saldo = ZERO, 
                   const real& saldorafr = ZERO,
                   const real& sld_prg_dare = ZERO,
                   const real& sld_prg_avere = ZERO,
                   const real& mov_dare = ZERO,
                   const real& mov_avere = ZERO,bool conto_dettagliato = TRUE);
  CG1600_application() {}
};

HIDDEN inline CG1600_application & a() {return (CG1600_application&) main_app(); }

void CG1600_application::postclose_print()
{
  delete _sort;
}

void CG1600_application::set_bil_key(bil_ivd* b, char sezione, char lettera,
                                     const char* numero_romano, int numero,
                                     bool conti_ordine, int gruppo, int conto,
                                     long sottoconto, char tipocf)

{
  b->sez = sezione;

  //Se esiste solamente la sezione,significa che e' un conto d'ordine
  //Forzo la lettera della classe a Z, per ottenere, grazie
  //all'ordinamento del sort, i record dei conti d'ordine per ultimi

  b->let = (conti_ordine && lettera == '\0' && sezione < '3') ? 'Z' : lettera;
  strcpy(b->numr, numero_romano);
  sprintf(b->num , "%2d", numero);
  if (gruppo < 0)
  {
    strcpy(b->gruppo, "ZZZ");
    strcpy(b->conto, "ZZZ");
    strcpy(b->sottoc, "ZZZZZZ");
    b->tipocf = ' ';
  }
  else
    if (gruppo == 0)
    {
      strcpy(b->gruppo, "AAA");
      strcpy(b->conto, "AAA");
      strcpy(b->sottoc, "AAAAAA");
      b->tipocf = ' ';
    }
    else
    {
      sprintf(b->gruppo , "%3d", gruppo);
      sprintf(b->conto , "%3d", conto);
      sprintf(b->sottoc , "%6ld", sottoconto);
      b->tipocf = tipocf;
    }
}

void CG1600_application::set_bil_val(bil_ivd* b, const real& saldo, 
                                     const real& saldorafr,
                                     const real& sld_prg_dare,
                                     const real& sld_prg_avere,
                                     const real& mov_dare,
                                     const real& mov_avere,bool conto_dettagliato)
{
  b->saldo             = saldo;
  b->saldorafr         = saldorafr;
  b->sld_prg_dare      = sld_prg_dare;
  b->sld_prg_avere     = sld_prg_avere;
  b->mov_dare          = mov_dare;
  b->mov_avere         = mov_avere;                            
  b->conto_dettagliato = conto_dettagliato;
}

HIDDEN int date2esc(const TDate& d, int* prevesc)
{                   
  if (prevesc) *prevesc = 0;
  TTable esc("ESC");
  for (int err = esc.first(); err == NOERR; err = esc.next())
  {
    const TDate ia(esc.get("D0"));   // Data inizio esercizio
    const TDate fa(esc.get("D1"));   // Data fine esercizio
    a()._inizioEs = ia;
    a()._fineEs   = fa;
    const anno = esc.get_int("CODTAB");  
    if (d >= ia && d <= fa)
      return anno;
    if (prevesc) *prevesc = anno; 
  } 
  return 0;
}

bool data_limite (TMask_field& f, KEY key)
{
  if (key == K_ENTER)
  {
    TMask& m = f.mask();
    int tipobil,tipostampa;
    TDate datalim;
    TDate in="", fin="";
    
    tipobil    = m.get_int(F_TIPOBIL);
    tipostampa = m.get_int(F_TIPOSTAMPA);
    int annoese  = m.get_int(F_ANNOESE);

    if ((tipobil == 1) && (tipostampa == 1))
    {
      datalim = m.get(F_DATALIM); 
      
      if (annoese != 0)
      { 
        a()._anni_es->aggiungi_anno(annoese, in, fin);
        a()._data_fine_ese = fin;
        a()._data_ini_ese  = in;
      
        a()._anno_esercizio = annoese;

        if (datalim == botime)
          a()._datalimite = a()._data_fine_ese;
        else
          if ((datalim < in)||(datalim > fin))
          {
            f.error_box("La data limite non appartiene all' esercizio indicato");
            return FALSE;
          }
          else
            a()._datalimite = datalim; 
      }
      else
        if (annoese == 0)
        {
          if (datalim == botime)
          {  
            f.error_box("La data limite deve essere indicata obbligatoriamente");
            return FALSE;
          }

          int anno = date2esc(datalim);

          if (anno == 0)
          {
            f.error_box("La data limite indicata non appartiene ad alcun esercizio attivo della ditta");
            return FALSE;
          }

          a()._data_ini_ese  = a()._inizioEs;
          a()._data_fine_ese = a()._fineEs;

          a()._datalimite = datalim;
          a()._anno_esercizio = anno;
        }
    }
  }
  TString data1 = a()._datalimite.string();
  TString data2 = a()._data_ini_ese.string();
  TString data3 = a()._data_fine_ese.string();
  return TRUE;
}

bool data_bil_raff (TMask_field& f, KEY key)
{
  TMask& m = f.mask();
  int tipobil,tipostampa;
  TDate datalim, dataraf;
  TDate in = "", fin = "", in_raf = "", fin_raf = "";

  if (key == K_ENTER)
  {
    tipobil    = atoi(m.get(F_TIPOBIL));
    tipostampa = atoi(m.get(F_TIPOSTAMPA));

    int annoese  = m.get_int(F_ANNOESE);
    int annoraf  = m.get_int(F_ANNORAFFR);

    if (tipobil == 1) //&& (tipostampa == 1))
    {  
      dataraf = m.get(F_DATABILRAF);

      datalim = m.get(F_DATALIM);
      
      if (annoraf == 0)
      {  
        int anno;
        
        if (datalim != botime)
        {
          date2esc(datalim);
          in  = a()._inizioEs;
        }
        else
          a()._anni_es->aggiungi_anno(annoese, in, fin);
        
        TString instr = in.string(); 
        if (dataraf != botime) 
        {
          anno = date2esc(dataraf);
          in_raf   = a()._inizioEs;
          fin_raf  = a()._fineEs; 
          a()._anno_esercizio_raf = anno;
        }
        else
          anno == 1;
/****
        if (dataraf == botime)
        {
          f.error_box("La data bilancio da raffrontare deve essere indicata obbligatoriamente");
          return FALSE;
        }       
        else
        { 
********/        
          if (dataraf > in)
          {
            f.error_box("La data bilancio da raffrontare non puo' essere maggiore o uguale alla data inizio esercizio in corso");
            return FALSE;
          }

          if (anno == 0)
          {
            f.error_box("La data bilancio da raffrontare indicata non appartiene ad alcun esercizio attivo della ditta");
            return FALSE;
          }

          a()._databilrafr   = dataraf;
          a()._data_ini_raf  = in_raf;
          a()._data_fine_raf = fin_raf;
        //}
      }
      else
        if (annoraf != 0)
        {  
          a()._anni_es->aggiungi_anno(annoraf, in_raf, fin_raf);
          a()._data_fine_raf = fin_raf;
          a()._data_ini_raf  = in_raf;
      
          if (dataraf == botime)
            a()._databilrafr = fin_raf;

          else
            if (dataraf < in_raf || dataraf > fin_raf)
            {
              f.error_box("La data bilancio da raffrontare deve appartenere all' esercizio da raffrontare");
              return FALSE;
            }
            else
              a()._databilrafr = dataraf; 
          a()._anno_esercizio_raf = annoraf;
        }
    }
  }   // IF (key == K_ENTER)
  TString data1 = in.string();
  TString data2 = in_raf.string();
  TString data3 = fin_raf.string();
  TString data4 = a()._databilrafr.string();
  TString data5 = a()._data_ini_raf.string();
  TString data6 = a()._data_fine_raf.string();
  return TRUE;
}

bool anno_ese_raff (TMask_field& f, KEY key)
{
  int   annoese, annoraf, anno;
  TDate datalim;

  if (key == K_ENTER)
  {
    annoese = f.mask().get_int(F_ANNOESE);
    annoraf = f.mask().get_int(F_ANNORAFFR);

    if (annoraf != 0)
    {
      if (annoese != 0)
      {
    if (annoraf >= annoese)
    {
      f.error_box("L' anno esercizio da raffrontare deve essere inferiore all' anno esercizio in corso");
          return FALSE;
        }
      }
      else
    if (annoese == 0)
    {
      datalim = f.mask().get(F_DATALIM);

      if (datalim != botime)
      {
        anno = date2esc(datalim);

        if (annoraf >= anno)
        {
          f.error_box("L' anno esercizio da raffrontare deve essere inferiore all' anno di esercizio di appartenenza della data limite");
            return FALSE;
        } 
       }
     }
    }
  }
  return TRUE;
}

bool tipo_bilancio (TMask_field& f, KEY key)
{
  int tipo_bil, anno;

  if (key == K_SPACE)
  {
    tipo_bil = f.mask().get_int(F_TIPOBIL);
    anno     = f.mask().get_int(F_ANNOESE);
    if (tipo_bil == 1)
    {
      f.mask().hide (98);
      f.mask().hide (99);
      f.mask().hide(96);
      f.mask().hide(97);
    }
    else
      if (tipo_bil == 2)
      {
        if (anno != 0)
        {
      f.mask().show (96);
      f.mask().show (97);
      f.mask().hide (98);
          f.mask().hide (99);
        }
        else
      if (anno == 0)
      {
        f.mask().show(98);
        f.mask().show(99);
        f.mask().hide(96);
        f.mask().hide(97);
      }
      }
  }
  return TRUE;
}

bool anno_esercizio (TMask_field& f, KEY key)
{
  int tipo_bil, anno;

  if (key == K_TAB || f.focusdirty())
  {
    tipo_bil = f.mask().get_int(F_TIPOBIL);
    anno     = f.mask().get_int(F_ANNOESE);
    if (tipo_bil == 1)
    {
      f.mask().hide (98);
      f.mask().hide (99);
      f.mask().hide(96);
      f.mask().hide(97);
    }
    else
      if (tipo_bil == 2)
      {
        if (anno != 0)
        {
      f.mask().show (96);
      f.mask().show (97);
      f.mask().hide (98);
          f.mask().hide (99);
        }
        else
      if (anno == 0)
      {
        f.mask().show(98);
        f.mask().show(99);
        f.mask().hide(96);
        f.mask().hide(97);
      }
      }
  }
  return TRUE;
}

bool tipo_stampa(TMask_field& f,KEY k)
{
  int tipo_stampa;

  if (k == K_ENTER)
  {
    tipo_stampa = f.mask().get_int(F_TIPOSTAMPA);

    int anno = f.mask().get_int(F_ANNOESE);

    if (tipo_stampa == 2)
      if (anno == 0)
      {
        error_box("Nella stampa all' ultima immissione l' anno esercizio e' obbligatorio");
        return FALSE;
      }  

  }
  return TRUE;
}

bool data_inizio(TMask_field& f, KEY k)
{
  int   anno;
  TDate data;
  TDate in="", fin="";

  anno = f.mask().get_int(F_ANNOESE);
  data = f.mask().get    (F_DATAINI);
  //a()._anno_esercizio = anno;
  
  if (k == K_ENTER)
  {
    if (anno != 0)
    {
      a()._anni_es->aggiungi_anno(anno, in, fin);
      a()._data_ini_ese  = in;
      a()._data_fine_ese = fin;
      a()._anno_esercizio = anno;

      if (data == botime)
        a()._dataini = in;
      else
    if (data < in || data > fin)
    {
      f.error_box("La data non appartiene all' esercizio indicato");
          return FALSE;
    }
    else
          a()._dataini = data;
    }
    else
      if (anno == 0)
      {
    if (data == botime)
    {
      f.error_box("La data deve essere obbligatoriamente indicata");
          return FALSE;
    }

    int anno = date2esc(data);

    if (anno == 0)
    {
      f.error_box("La data limite indicata non appartiene ad alcun esercizio attivo della ditta");
      return FALSE;
    }

    a()._anno_esercizio = anno;
    a()._dataini = data;
    a()._data_ini_ese  = a()._inizioEs;
    a()._data_fine_ese = a()._fineEs;
    }
  }  
  TString datastr = a()._dataini.string();
  TString data1 = a()._data_ini_ese.string();
  TString data2 = a()._data_fine_ese.string();
  return TRUE;
}

bool data_fine(TMask_field& f, KEY k)
{
  int   annoes;
  TDate data, data_ini;
  TDate in="", fin="";

  annoes   = f.mask().get_int(F_ANNOESE);
  data     = f.mask().get    (F_DATAFINE);
  data_ini = f.mask().get    (F_DATAINI);
  //a()._anno_esercizio = annoes;
  
  if (k == K_ENTER)
  {
    if (annoes != 0)
    {                  
      a()._anni_es->aggiungi_anno(annoes, in, fin);
      a()._data_ini_ese  = in;
      a()._data_fine_ese = fin;

      if (data == botime)
    a()._datafine = fin;
      else
    if (data < in || data > fin)
    {
      f.error_box("La data non appartiene all' esercizio indicato");
      return FALSE;
    }
    else
          a()._datafine = data;
    }
    else
      if (annoes == 0)
      {
    if (data == botime)
    {
      f.error_box("La data deve essere obbligatoriamente indicata");
          return FALSE;
    }

    date2esc(data_ini);                        
    TString data3 = a()._inizioEs.string();
    TString data4 = a()._fineEs.string();

    if (data < a()._inizioEs || data > a()._fineEs)
    {
      f.error_box("La data non appartiene all' esercizio indicato");
      return FALSE;
        }
        else
      a()._datafine = data;
      }

    if (data < data_ini)
    {
      f.error_box("La data finale non puo' essere inferiore alla data di partenza");
      return FALSE;
    }

    
  } 
  TString datastr = a()._datafine.string();   
  TString data1 = a()._data_ini_ese.string();
  TString data2 = a()._data_fine_ese.string();
  return TRUE;
}

void CG1600_application::scrivi_record(const TString& sez,
                                       const TString& let,  const TString& numerorom,int numero,
                                       int g,int c,long s,const real& saldo,const real& saldorafr,
                                       const real& sld_dare,const real& sld_avere,
                                       const real& mov_dare,const real& mov_avere,char tipocf,bool conto_dettagliato)
{
  
  //Se esiste solamente la sezione,significa che e' un conto d'ordine
  //Forzo la lettera della classe a Z, per ottenere, grazie
  //all'ordinamento del sort, i record dei conti d'ordine per ultimi

  set_bil_key(_bil, sez[0], let[0], numerorom, numero, TRUE, g, c, s, tipocf);
  set_bil_val(_bil, saldo, saldorafr, sld_dare, sld_avere, mov_dare, mov_avere,conto_dettagliato);
  _sort->sort ((const char*) _bil);
}

void CG1600_application::riempi_record(const TString& sez,
                                       const TString& let,  const TString& numerorom,int numero,
                                       int g,int c,long s,const real& saldo,const real& saldorafr,
                                       const real& sld_dare,const real& sld_avere,
                                       const real& mov_dare,const real& mov_avere,char tipocf,bool conto_dettagliato)
{
  set_bil_key(_bil, sez[0], let[0], numerorom, numero, FALSE, g, c, s, tipocf);
  set_bil_val(_bil, saldo, saldorafr, sld_dare, sld_avere, mov_dare, mov_avere,conto_dettagliato);
  _sort->sort ((const char*) _bil);
}

void CG1600_application::crea_sort_tabella()
{
  TRecnotype recno_prec=0l, recno_curr=0l;
  TString codtab_prec;
  TTable tabivd(TAB_IVD);
  TRecfield codtab_curr(tabivd.curr(),"CODTAB");
  TRecfield sezione   (tabivd.curr(),"CODTAB",0,0);
  TRecfield lettera   (tabivd.curr(),"CODTAB",1,1);
  TRecfield numerorom (tabivd.curr(),"CODTAB",2,5);
  TRecfield numero    (tabivd.curr(),"CODTAB",6,7);
  int preclen;
  bool FINITO=FALSE;
  
  tabivd.first();
  codtab_prec = tabivd.get("CODTAB");
  
  // Compilo tanti record quante sono le classi IV direttiva trovate sulla
  // tabella %IVD, usando dei gruppi, conti e sottoconti fittizi. Successivamente
  // nel caso di stampa completa verranno stampati anche questi record; nel caso
  // di stampa non completa non verranno stampati.
  
  do
  {
    recno_prec  = tabivd.recno();
    tabivd.next();
    if (tabivd.eof())
    {
      tabivd.zero();
      FINITO=TRUE;
    }
    recno_curr  = tabivd.recno();
    preclen = codtab_prec.len();
    if (!strncmp(codtab_curr,codtab_prec,preclen))
      codtab_prec = (const char *)codtab_curr;
    else
    {
      tabivd.readat(recno_prec);
      const char sez = *((const char*) sezione);
      const char let = *((const char*) lettera);
      TString16  nrom((const char*)numerorom);
      const int nu = (int) numero;
      
      set_bil_key(_bil, sez, let,(const char*)nrom, nu, FALSE,-1);
      set_bil_val(_bil);
      _sort->sort ((const char*) _bil);
      tabivd.readat(recno_curr);
      codtab_prec = (const char *)codtab_curr;
    }
  } while (!FINITO);
}

// Passo al sort tutti i record presenti su piano dei conti, aventi la classe
// IV direttiva CEE.

void CG1600_application::crea_sort_piano_conti_scalare()
{
  TLocalisamfile pconti(LF_PCON);
  TString sez,let,numerorom;
  TString sez_conto,let_conto,numr_conto,sez_opp,let_opp,numr_opp;
  int     num_conto, indbil;
  char    sezione,lettera,tmcf;
  int     numero,g,c,num_opp;
  long    s;
  bool    sez_opposta           = FALSE;
  bool    no_sez_opposta        = FALSE;
  bool    classe_conto          = FALSE;
  bool    conto_dettagliato     = FALSE;
  bool    stsottbil;
  int     gruppo_prec,conto_prec;
  real    saldo,saldo_raf,saldo_conto,saldo_conto_raf;
  real    saldo_conto_opp,saldo_conto_raf_opp;
  TString saldostr,saldo_rafstr;
  c         = 0;
  num_conto = 0;
  tmcf      = ' ';
  indbil    = 0;

  saldo_conto          = ZERO;
  saldo_conto_raf      = ZERO;
  saldo_conto_opp      = ZERO;
  saldo_conto_raf_opp  = ZERO;

  gruppo_prec          = -1;
  conto_prec           = -1;

  for (pconti.first(); !pconti.eof(); pconti.next())
  {
    _prog->addstatus(1);
    g         = pconti.get_int (PCN_GRUPPO);
    c         = pconti.get_int (PCN_CONTO);
    s         = pconti.get_long(PCN_SOTTOCONTO);
    sez       = pconti.get(PCN_SEZIVD);
    let       = pconti.get(PCN_LETTIVD);
    sezione   = sez[0];
    lettera   = let[0];
    numerorom = pconti.get(PCN_NUMRIVD);
    numero    = pconti.get_int (PCN_NUMIVD);
    
    saldo     = ZERO;
    saldo_raf = ZERO;

    //Anche se il conto non e' da dettagliare ma contiene la classe e' da
    //mandare ugualmente in stampa con il totale di tutti i suoi sottoconti letti
    
    if (classe_conto)
    {
      if (c != conto_prec && conto_prec != -1)
      {
        if (no_sez_opposta)
        {  
          TString saldo_contostr,saldo_conto_rafstr;
          
          saldo_contostr = saldo_conto.string();
          saldo_conto_rafstr = saldo_conto_raf.string();
          riempi_record(sez_conto,let_conto,numr_conto,num_conto,gruppo_prec,conto_prec,0,saldo_conto,saldo_conto_raf,ZERO,ZERO,ZERO,ZERO,tmcf,conto_dettagliato);
          saldo_conto     = ZERO;
          saldo_conto_raf = ZERO;
          classe_conto    = FALSE;
          no_sez_opposta  = FALSE;
        }
        if (sez_opposta)
        {
          int items = _sezopps.items();
          _sezopps.restart();
          for (int i=0; i<items; i++)
          { 
            _riga_sez_opp * lriga = _sezopps.riga();
            TString sez_opp  = lriga->sezione();
            TString let_opp  = lriga->lettera();
            TString numr_opp = lriga->num_rom();  
            if (numr_opp == " ")  //Sembrerebbe che il metodo sezione() quando il numero romano non esiste, ritorni
              numr_opp.ltrim();   //una TString contenente uno spazio e non un NULL, sconvolgendo l' ordinamento.
                                  //Per evitare tutto cio' aggiungo il metodo ltrim(), che toglie gli spazi.
                                  //Pero', essendo il numero romano un campo Zerofill, uso ltrim() solo se non c'e'.
            int     num_opp  = lriga->numero(); 
            real    saldo_conto = lriga->saldo_conto(); 
            real    saldo_conto_raf = lriga->saldo_conto_raf();
            riempi_record(sez_opp,let_opp,numr_opp,num_opp,gruppo_prec,conto_prec,0,saldo_conto,saldo_conto_raf,ZERO,ZERO,ZERO,ZERO,tmcf,conto_dettagliato);
          }
          sez_opposta = FALSE;
            
          _sezopps.destroy();
        }
      }
    }

    //Senza questo controllo conto_prec quando viene letto un gruppo verrebbe
    //settato a 0 (il conto non c'e'), quindi nella eventuale lettura del conto
    //nel ciclo successivo, qualsiasi conto sarebbe diverso da quello precedente.
    
    if (g != gruppo_prec)
      conto_prec = -1;
    else
      conto_prec = c;

    gruppo_prec = g;
    
    // Se si tratta di un conto e contiene la classe, allora lo passo al sort.
    // Gli eventuali sottoconti avranno la stessa classe.
    
    if ((g != 0) && (c != 0) && (s == 0))
    {
      stsottbil   = !pconti.get_bool(PCN_STSOTTBIL);
      tmcf        = pconti.get     (PCN_TMCF)[0];
      indbil      = pconti.get_int (PCN_INDBIL);

      //Se sono nello stesso gruppo, ma ho un conto diverso da quello precedentemente
      //analizzato, e se questi contiene la classe IV dir. CEE,
      //allore devo controllare se va dettagliato (STSOTTBIL) 

      if (sez != "0" && sez != "")
      {
        if (!stsottbil || tmcf == 'C' || tmcf == 'F')
          conto_dettagliato = FALSE;
        else
          conto_dettagliato = TRUE;

        sez_conto  = sez;
          
        if (let != "")
          let_conto  = let;
        else
          if ((sez == "1")||(sez == "2"))
            let_conto  = "Z";
          else
            let_conto = let;
          
        numr_conto   = numerorom;
        num_conto    = numero;
        classe_conto = TRUE;

        if (tmcf == 'C' || tmcf == 'F')
        {
          if (sottoc_clifo_scalare(g, c,_anno_esercizio,indbil,saldo_conto,saldo_conto_raf))
          {
            if (sez == "2")  //Se la sezione e 2 cambio segno comunque
            { 
              //if (saldo_conto < ZERO)
                saldo_conto = -saldo_conto;  
              //if (saldo_conto_raf < ZERO)
                saldo_conto_raf = -saldo_conto_raf;
            }
            no_sez_opposta = TRUE;   
          }
        }
      }
      else
      {
        classe_conto      = FALSE; // Metto conto dettagliato = TRUE perche' potrebbero esserci dei sottoconti
        conto_dettagliato = TRUE;  // di questo conto che hanno la classe e quindi vanno stampati.
      }
    }
    
    // Se si tratta di un sottoconto e contiene la classe, allora lo passo al sort.

    if ((g != 0) && (c != 0) && (s != 0))
    {       
      bool rec_es_corr = FALSE;
      bool rec_es_prec = FALSE;
      
      if (!calcola_saldo(saldo,saldo_raf,g,c,s,indbil))
        continue;

      // classe_conto indica se il conto precedentemente letto conteneva
      // la classe. In caso affermativo anche questo sottoconto appena
      // letto avra' la stessa classe del conto.
      
      saldostr = saldo.string();
      saldo_rafstr = saldo_raf.string();
      bool stessa_sezione = (saldo * saldo_raf) > ZERO;
      
      if (classe_conto)
      {
        sez_opp = pconti.get(PCN_SEZIVDOPP);
        if (sez_opp != "0")
        {    
          let_opp     = pconti.get(PCN_LETTIVDOPP);
          numr_opp    = pconti.get(PCN_NUMRIVDOPP);
          num_opp     = pconti.get_int(PCN_NUMIVDOPP);
                                                          
          if (sez_conto == "1" && saldo < ZERO)// || (sez_conto == "2" && saldo > ZERO) )
          { 
            saldo = -saldo;
            rec_es_corr = TRUE;
          }
          if (sez_conto == "1" && saldo_raf < ZERO) //|| (sez_conto == "2" && saldo_raf > ZERO) )
          {
            saldo_raf = -saldo_raf;
            rec_es_prec = TRUE;    
          }
          if (sez_conto == "2" && saldo > ZERO)  
          {
            rec_es_corr = TRUE;
          }
          if (sez_conto == "2" && saldo_raf > ZERO)
          {
            rec_es_prec = TRUE;
          }       
          
          if (rec_es_corr && rec_es_prec)  
          { 
            if (conto_dettagliato)  
            {             
              _sezopps.add(g,c,s,sez_opp,let_opp,numr_opp,num_opp,saldo,saldo_raf);
              riempi_record(sez_opp,let_opp,numr_opp,num_opp,g,c,s,saldo,saldo_raf,ZERO,ZERO,ZERO,ZERO,tmcf);
              sez_opposta = TRUE;
            } 
            else
              sez_opposta = FALSE;
          }  
          else
            if (rec_es_corr)
            { 
              if (conto_dettagliato)
              { 
                _sezopps.add(g,c,s,sez_opp,let_opp,numr_opp,num_opp,saldo,ZERO);
                riempi_record(sez_opp,let_opp,numr_opp,num_opp,g,c,s,saldo,ZERO,ZERO,ZERO,ZERO,ZERO,tmcf);
                if (saldo_raf != ZERO)  
                {
                  if (sez_conto == "2")  
                    if (saldo_raf < ZERO)
                      saldo_raf = -saldo_raf;
                  
                  riempi_record(sez_conto,let_conto,numr_conto,num_conto,g,c,s,ZERO,saldo_raf,ZERO,ZERO,ZERO,ZERO,tmcf);
                  //saldo_conto     += saldo;
                  saldo_conto_raf += saldo_raf;
                  no_sez_opposta = TRUE;
                }
                sez_opposta = TRUE;
              }                    
              else
                sez_opposta = FALSE;
            }
            else 
              if (rec_es_prec)
              { 
                if (conto_dettagliato)
                {
                  _sezopps.add(g,c,s,sez_opp,let_opp,numr_opp,num_opp,ZERO,saldo_raf);
                  riempi_record(sez_opp,let_opp,numr_opp,num_opp,g,c,s,ZERO,saldo_raf,ZERO,ZERO,ZERO,ZERO,tmcf);
                  if (saldo != ZERO)  
                  { 
                    if (sez_conto == "2")
                      if (saldo < ZERO)
                        saldo = -saldo;
                        
                    riempi_record(sez_conto,let_conto,numr_conto,num_conto,g,c,s,saldo,ZERO,ZERO,ZERO,ZERO,ZERO,tmcf);
                    saldo_conto     += saldo;
                    //saldo_conto_raf += saldo_raf;
                    no_sez_opposta = TRUE;
                  }
                  sez_opposta = TRUE;
                }                    
                else
                  sez_opposta = FALSE;
              }
              else
              { 
                if (sez_conto == "2")
                {
                  if (saldo < ZERO)
                    saldo = -saldo;
                  if (saldo_raf < ZERO)
                    saldo_raf = -saldo_raf;
                }
                if (conto_dettagliato) 
                  riempi_record(sez_conto,let_conto,numr_conto,num_conto,g,c,s,saldo,saldo_raf,ZERO,ZERO,ZERO,ZERO,tmcf);
         
                saldo_conto     += saldo;
                saldo_conto_raf += saldo_raf;
                no_sez_opposta   = TRUE;
              }
        }
        else
        { 
          if (sez_conto == "2")
          {
            saldo = -saldo;
            saldo_raf = -saldo_raf;
          }
          if (conto_dettagliato) 
            riempi_record(sez_conto,let_conto,numr_conto,num_conto,g,c,s,saldo,saldo_raf,ZERO,ZERO,ZERO,ZERO,tmcf);
         
          saldo_conto     += saldo;
          saldo_conto_raf += saldo_raf;
          no_sez_opposta   = TRUE;
        }
      }
      else
      {
        sez_opp = pconti.get(PCN_SEZIVDOPP);
        if (sez_opp != "0")
        {    
          let_opp     = pconti.get(PCN_LETTIVDOPP);
          numr_opp    = pconti.get(PCN_NUMRIVDOPP);
          num_opp     = pconti.get_int(PCN_NUMIVDOPP);
          
          if (sez == "1" && saldo < ZERO) //|| (sez == "2" && saldo > ZERO) )
          { 
            saldo = -saldo;
            rec_es_corr = TRUE;
          }
          if (sez == "1" && saldo_raf < ZERO) //|| (sez == "2" && saldo_raf > ZERO) )
          {
            saldo_raf = -saldo_raf;
            rec_es_prec = TRUE;    
          }                                                                
          if (sez == "2" && saldo > ZERO)
          {
            rec_es_corr = TRUE;
          }
          if (sez == "2" && saldo_raf > ZERO)
          {
            rec_es_prec = TRUE;
          }
          
          if (rec_es_corr && rec_es_prec)  
            riempi_record(sez_opp,let_opp,numr_opp,num_opp,g,c,s,saldo,saldo_raf,ZERO,ZERO,ZERO,ZERO,tmcf);
          else
            if (rec_es_corr)
            {
              riempi_record(sez_opp,let_opp,numr_opp,num_opp,g,c,s,saldo,ZERO,ZERO,ZERO,ZERO,ZERO,tmcf);
              if (saldo_raf != ZERO)
              { 
                if (sez == "2")
                  if (saldo_raf < ZERO)
                    saldo_raf = -saldo_raf;
                riempi_record(sez,let,numerorom,numero,g,c,s,ZERO,saldo_raf,ZERO,ZERO,ZERO,ZERO,tmcf);
              }  
            }
            else 
              if (rec_es_prec) 
              {
                riempi_record(sez_opp,let_opp,numr_opp,num_opp,g,c,s,ZERO,saldo_raf,ZERO,ZERO,ZERO,ZERO,tmcf);
                if (saldo != ZERO)
                {
                  if (sez == "2")
                    if (saldo < ZERO)
                      saldo = -saldo;
                  riempi_record(sez,let,numerorom,numero,g,c,s,saldo,ZERO,ZERO,ZERO,ZERO,ZERO,tmcf);
                }  
              }
              else
                if (sez != "0" && sez != "")   
                { 
                  if (sez == "2")
                  {
                    if (saldo < ZERO)
                      saldo = -saldo;
                    if (saldo_raf < ZERO)
                      saldo_raf = -saldo_raf;
                  }
                  riempi_record(sez,let,numerorom,numero,g,c,s,saldo,saldo_raf,ZERO,ZERO,ZERO,ZERO,tmcf);
                }  
        }
        else
          if (sez != "0" && sez != "")
          {  
            if (sez == "2")
            {
              saldo = -saldo;
              saldo_raf = -saldo_raf;
            }
            riempi_record(sez,let,numerorom,numero,g,c,s,saldo,saldo_raf,ZERO,ZERO,ZERO,ZERO,tmcf);
          }  
      }
    }
  }

  conto_prec = 0;

  if (classe_conto)
  {
    if (c != conto_prec && conto_prec != -1)
    {
      if (no_sez_opposta)
      {
        riempi_record(sez_conto,let_conto,numr_conto,num_conto,gruppo_prec,c,0,saldo_conto,saldo_conto_raf,ZERO,ZERO,ZERO,ZERO,tmcf,conto_dettagliato);
        saldo_conto     = ZERO;
        saldo_conto_raf = ZERO;
        classe_conto    = FALSE;
        no_sez_opposta  = FALSE;
      }
      if (sez_opposta)
      {
        int items = _sezopps.items();
        _sezopps.restart();
        for (int i=0; i<items; i++)
        { 
          _riga_sez_opp * lriga = _sezopps.riga();
          TString sez_opp  = lriga->sezione();
          TString let_opp  = lriga->lettera();
          TString numr_opp = lriga->num_rom(); 
          if (numr_opp == " ")
            numr_opp.ltrim();
          int     num_opp  = lriga->numero();
          real    saldo_conto = lriga->saldo_conto(); 
          real    saldo_conto_raf = lriga->saldo_conto_raf();
          riempi_record(sez_opp,let_opp,numr_opp,num_opp,gruppo_prec,conto_prec,0,saldo_conto,saldo_conto_raf,ZERO,ZERO,ZERO,ZERO,tmcf,conto_dettagliato);
        }
        sez_opposta = FALSE;
          
        _sezopps.destroy();
      }
    }
  }
}

void CG1600_application::crea_sort_piano_conti_verifica()
{
  TLocalisamfile pconti(LF_PCON);
  TString sez,let,numerorom;
  TString sez_conto,let_conto,numr_conto;
  int     num_conto;
  char sezione,lettera,tmcf;
  int numero,g,c;
  long s;
  bool classe_conto           = FALSE;
  bool conto_dettagliato      = FALSE;
  bool stsottbil;
  int gruppo_prec,conto_prec, indbil;
  real saldo,sld_prg_dare,sld_prg_avere,mov_dare,mov_avere;
  real saldo_conto,sld_prg_dare_conto,sld_prg_avere_conto,mov_dare_conto,mov_avere_conto;

  _sld->set_annoes(_anno_esercizio);

  saldo_conto         = ZERO;
  sld_prg_dare_conto  = ZERO;
  sld_prg_avere_conto = ZERO;
  mov_dare_conto      = ZERO;
  mov_avere_conto     = ZERO;
  _nuovo_tot_saldo_d  = ZERO;
  _nuovo_tot_saldo_a  = ZERO;
  
  indbil      = 0;
  gruppo_prec = -1;
  conto_prec  = -1;
  c           = 0;
  num_conto   = 0;
  tmcf        = ' ';

  for (pconti.first(); !pconti.eof(); pconti.next())
  {
    _prog->addstatus(1);
    g         = pconti.get_int (PCN_GRUPPO);
    c         = pconti.get_int (PCN_CONTO);
    s         = pconti.get_long(PCN_SOTTOCONTO);
    sez       = pconti.get(PCN_SEZIVD);
    let       = pconti.get(PCN_LETTIVD);
    sezione   = sez[0];
    lettera   = let[0];
    numerorom = pconti.get(PCN_NUMRIVD);
    numero    = pconti.get_int (PCN_NUMIVD);
    real app;
    
    saldo         = ZERO;
    sld_prg_dare  = ZERO;
    sld_prg_avere = ZERO;
    mov_dare      = ZERO;
    mov_avere     = ZERO;
    app           = ZERO;
    
    if (classe_conto)
    {
      if (c != conto_prec && conto_prec != -1)
      {
        riempi_record(sez_conto,let_conto,numr_conto,num_conto,gruppo_prec,conto_prec,0,saldo_conto,ZERO,sld_prg_dare_conto,sld_prg_avere_conto,mov_dare_conto,mov_avere_conto,tmcf,conto_dettagliato);
        saldo_conto            = ZERO;
        sld_prg_dare_conto     = ZERO;
        sld_prg_avere_conto    = ZERO;
        mov_dare_conto         = ZERO;
        mov_avere_conto        = ZERO;
        classe_conto           = FALSE;
      }
    }

    //Senza questo controllo conto_prec quando viene letto un gruppo verrebbe
    //settato a 0 (il conto non c'e'), quindi nella eventuale lettura del conto
    //nel ciclo successivo, qualsiasi conto sarebbe diverso da quello precedente.
    
    if (g != gruppo_prec)
      conto_prec = -1;
    else
      conto_prec = c;

    gruppo_prec = g;
    
    // Se si tratta di un conto e contiene la classe, allora lo passo al sort.
    // Gli eventuali sottoconti avranno la stessa classe.
    
    if ((g != 0) && (c != 0) && (s == 0))
    {
      stsottbil   = !pconti.get_bool(PCN_STSOTTBIL);
      tmcf        = pconti.get(PCN_TMCF)[0];
      indbil      = pconti.get_int(PCN_INDBIL);

      //Se sono nello stesso gruppo, ma ho un conto diverso da quello precedentemente
      //analizzato , se contiene la classe IV dir. CEE
      //allora devo controllare se va dettagliato (STSOTTBIL)

      if (sez != "0" && sez != "")
      {   
        if ((tmcf == 'C') || (tmcf == 'F'))
        {  
          sottoc_clifo_verifica(g, c,_anno_esercizio, tmcf,sez,let,numerorom,numero,indbil,stsottbil);
          continue;
        }
        else 
          if (!stsottbil)
            conto_dettagliato = FALSE;
          else
            conto_dettagliato = TRUE;

        sez_conto  = sez;
          
        if (let != "")
          let_conto = let;
        else
          if ((sez == "1")||(sez == "2"))
            let_conto = "Z";
          else
            let_conto = let;
          
        numr_conto   = numerorom;
        num_conto    = numero;
        classe_conto = TRUE;
      }
      else
      {
        classe_conto      = FALSE; // Metto conto dettagliato = TRUE perche' potrebbero esserci dei sottoconti
        conto_dettagliato = TRUE;  // di questo conto che hanno la classe e quindi vanno stampati.
      }
    }
    // Se si tratta di un sottoconto e contiene la classe, allora lo passo al sort.

    if ((g != 0) && (c != 0) && (s != 0))
    {
    // classe_conto indica se il conto precedentemente letto conteneva la classe,
    // ma quest' ultima non era presente a livello di gruppo. In caso affermativo
    // anche questo sottoconto appena letto avra' la stessa classe del conto.

      if (_tipo_stampa == 1)
      {
        if(!calcola(g,c,s,_data_fine_ese,_data_fine_ese_prec))
          continue;

        if (_dataini == _data_ini_ese)
        {
          sld_prg_dare  = _saldo_ini_dare;
          sld_prg_avere = _saldo_ini_avere;
          mov_dare      = _mov_periodo_dare;
          mov_avere     = _mov_periodo_avere;
          saldo         = sld_prg_dare-sld_prg_avere+mov_dare-mov_avere; 
          
          //modifica del 27/11/1995
          //real app = sld_prg_dare - sld_prg_avere;
          _nuovo_tot_saldo_d += mov_dare;
          _nuovo_tot_saldo_a += mov_avere;
          /*
          if (app > ZERO)
            _nuovo_tot_saldo_d += app;
          else
          {
           app = -app;
           _nuovo_tot_saldo_a += app;
          }
          */
          _nuovo_tot_saldo_d += sld_prg_dare;
          _nuovo_tot_saldo_a += sld_prg_avere;
          //fine modifica
        }
        else if (_dataini > _data_ini_ese)
        {
          sld_prg_dare  = _prg_prec_dare;
          sld_prg_avere = _prg_prec_avere;
          mov_dare      = _mov_periodo_dare;
          mov_avere     = _mov_periodo_avere;
          saldo         = sld_prg_dare-sld_prg_avere+mov_dare-mov_avere;
        }
      }
      else 
        if (_tipo_stampa == 2)
        {
          if (!_sld->ultima_immissione_verifica(_anno_esercizio,g,c,s,indbil,_stampa_mov_prov))
          //  continue;
          //modifica del 05/04/1995
          {
            if (indbil == 1 || indbil == 2 || indbil == 5)      
              app = _sld->saldofin_esprec(_anno_esercizio,g,c,s);
          }
          else app = _sld->saldoini();
          //fine modifica
          if (app < ZERO)
          {
            app           = -app;
            sld_prg_dare  = ZERO;
            sld_prg_avere = app;
          }
          else
          {
            sld_prg_dare  = app;
            sld_prg_avere = ZERO;
          }
          mov_dare  = _sld->prgdare();
          mov_avere = _sld->prgavere();
          saldo     = sld_prg_dare-sld_prg_avere+mov_dare-mov_avere;
          
          //modifica del 05/04/1995
          if (!(saldo == ZERO && _stampamov))
          {
            _nuovo_tot_saldo_d += mov_dare;
            _nuovo_tot_saldo_a += mov_avere;
            real nuovo = _sld->saldoinisusaldi();
            if (nuovo > ZERO)
              _nuovo_tot_saldo_d += nuovo;
            else
            {
             nuovo = -nuovo;
             _nuovo_tot_saldo_a += nuovo;         
            } 
          }
          //fine modifica 
        }  

      if (classe_conto)
      {
        if (conto_dettagliato)
          riempi_record(sez_conto,let_conto,numr_conto,num_conto,g,c,s,saldo,ZERO,sld_prg_dare,sld_prg_avere,mov_dare,mov_avere,tmcf);

        saldo_conto         += saldo;
        sld_prg_dare_conto  += sld_prg_dare;
        sld_prg_avere_conto += sld_prg_avere;
        mov_dare_conto      += mov_dare;
        mov_avere_conto     += mov_avere;
      }
      else
      {
        if (sez != "0" && sez != "")
            scrivi_record(sez,let,numerorom,numero,g,c,s,saldo,ZERO,sld_prg_dare,sld_prg_avere,mov_dare,mov_avere,tmcf);
      }
    }
  }

  conto_prec = 0;

  if (classe_conto)
  {
    if (c != conto_prec && conto_prec != -1)
    {
      riempi_record(sez_conto,let_conto,numr_conto,num_conto,gruppo_prec,c,0,saldo_conto,ZERO,sld_prg_dare_conto,sld_prg_avere_conto,mov_dare_conto,mov_avere_conto,tmcf,conto_dettagliato);
      saldo_conto            = ZERO;
      sld_prg_dare_conto     = ZERO;
      sld_prg_avere_conto    = ZERO;
      mov_dare_conto         = ZERO;
      mov_avere_conto        = ZERO;
      classe_conto           = FALSE;
    }
  }
}


void CG1600_application::sottoc_clifo_verifica(int g,int c,int anno,char tipocf,TString& sez,TString& let,TString& numerorom,int numero,int indbil,bool stsottbil)
{
  long s;
  _listasld = new TSaldi_list (g,c,anno);
  real saldo,sld_prg_dare,sld_prg_avere,mov_dare,mov_avere;
  real saldo_conto,sld_prg_dare_conto,sld_prg_avere_conto,mov_dare_conto,mov_avere_conto;
  real app;
  TString sez_conto,let_conto,numr_conto;
  int num_conto;

  saldo_conto         = ZERO;
  sld_prg_dare_conto  = ZERO;
  sld_prg_avere_conto = ZERO;
  mov_dare_conto      = ZERO;
  mov_avere_conto     = ZERO;
  
  int items = _listasld->items();

  sez_conto  = sez;
    
  if (let != "")
    let_conto = let;
  else
    if ((sez == "1")||(sez == "2"))
      let_conto = "Z";
    else
      let_conto = let;
    
  numr_conto = numerorom;
  num_conto  = numero;
  
  _listasld->restart();
    
  for (int i=0 ; i < items; i++)
  {
    const TRectype* r=_listasld->saldi();
    if (r == NULL) break;
        
    s = r->get_long(SLD_SOTTOCONTO);
      
    saldo         = ZERO;
    sld_prg_dare  = ZERO;
    sld_prg_avere = ZERO;
    mov_dare      = ZERO;
    mov_avere     = ZERO;
    app           = ZERO;
      
     if (_tipo_stampa == 1)
     {
       if (!calcola(g,c,s,_data_fine_ese,_data_fine_ese_prec))
         continue;

      if (_dataini == _data_ini_ese)
      {
        sld_prg_dare  = _saldo_ini_dare;
        sld_prg_avere = _saldo_ini_avere;
        mov_dare      = _mov_periodo_dare;
        mov_avere     = _mov_periodo_avere;
        saldo         = sld_prg_dare-sld_prg_avere+mov_dare-mov_avere;
        
        //modifica 27/11/1995
        //real app = sld_prg_dare - sld_prg_avere;
        _nuovo_tot_saldo_d += mov_dare;
        _nuovo_tot_saldo_a += mov_avere;
        /*
        if (app > ZERO)
          _nuovo_tot_saldo_d += app;
        else
        {
         app = -app;
         _nuovo_tot_saldo_a += app;
        } 
        */
        _nuovo_tot_saldo_d += sld_prg_dare;
        _nuovo_tot_saldo_a += sld_prg_avere;
        //fine modifica
      }
      else if (_dataini > _data_ini_ese)
      {
        sld_prg_dare  = _prg_prec_dare;
        sld_prg_avere = _prg_prec_avere;
        mov_dare      = _mov_periodo_dare;
        mov_avere     = _mov_periodo_avere;
        saldo         = sld_prg_dare-sld_prg_avere+mov_dare-mov_avere;
      }
    }
    else 
      if (_tipo_stampa == 2)
      {
        /*
        if (!_sld->ultima_immissione_bilancio(_anno_esercizio,g,c,s,indbil))
          continue;
        */ 
        //modifica 05/04/1994
        if (!_sld->ultima_immissione_verifica(_anno_esercizio,g,c,s,indbil,_stampa_mov_prov))
        {
          if (indbil == 1 || indbil == 2 || indbil == 5)      
            app = _sld->saldofin_esprec(_anno_esercizio,g,c,s);
        }
        else app = _sld->saldoini();
        //fine modifica  
        if (app < ZERO)
        {
          app           = -app;
          sld_prg_dare  = ZERO;
          sld_prg_avere = app;
        }
        else
        {
          sld_prg_dare  = app;
          sld_prg_avere = ZERO;
        }
        mov_dare  = _sld->prgdare();
        mov_avere = _sld->prgavere();
        saldo     = sld_prg_dare-sld_prg_avere+mov_dare-mov_avere;
        
        //modifica 05/04/1994
        if (!(saldo == ZERO && _stampamov))
        {
          _nuovo_tot_saldo_d += mov_dare;
          _nuovo_tot_saldo_a += mov_avere;
          real nuovo = _sld->saldoinisusaldi();
          if (nuovo > ZERO)
            _nuovo_tot_saldo_d += nuovo;
          else
          {
           nuovo = -nuovo;
           _nuovo_tot_saldo_a += nuovo;         
          } 
        } 
        //fine modifica
      }  
    
    if (stsottbil)
      riempi_record(sez_conto,let_conto,numr_conto,num_conto,g,c,s,saldo,ZERO,sld_prg_dare,sld_prg_avere,mov_dare,mov_avere,tipocf);
    saldo_conto         += saldo;
    sld_prg_dare_conto  += sld_prg_dare;
    sld_prg_avere_conto += sld_prg_avere;
    mov_dare_conto      += mov_dare;
    mov_avere_conto     += mov_avere;
  }
  if (items > 0)
    riempi_record(sez_conto,let_conto,numr_conto,num_conto,g,c,0,saldo_conto,ZERO,sld_prg_dare_conto,sld_prg_avere_conto,mov_dare_conto,mov_avere_conto,tipocf,stsottbil);
  saldo_conto         = ZERO;
  sld_prg_dare_conto  = ZERO;
  sld_prg_avere_conto = ZERO;
  mov_dare_conto      = ZERO;
  mov_avere_conto     = ZERO;

  delete _listasld;
}

bool CG1600_application::sottoc_clifo_scalare(int g,int c,int anno,int indbil,real& saldo_conto,real& saldo_conto_raf)
{
  long s;
  int aep = 0;
  if (anno) aep = anno-1;
  _listasld = new TSaldi_list (g,c,anno,aep);
  real saldo,saldo_raf;
  bool trovato = FALSE;

  int items = _listasld->items();

  for (int i=0 ; i < items; i++)
  {
    const TRectype* r=_listasld->saldi(); 
    if (r == NULL) break;
    
    s = r->get_long(SLD_SOTTOCONTO);
      
    saldo         = ZERO;
    saldo_raf     = ZERO;
      
    if (!calcola_saldo(saldo,saldo_raf,g,c,s,indbil))
      continue;

    saldo_conto += saldo;
    saldo_conto_raf += saldo_raf;  
    trovato = TRUE;
  }
  delete _listasld;
  return trovato;    
}

//La funzione calcola_saldo calcola il saldo dell'esercizio in corso e di
//quello da raffrontare. Inoltre ritorna vero se il sottoconto e' movimentato
//e falso se non e' movimentato, e quindi non deve essere stampato.

bool CG1600_application::calcola_saldo(real& saldo, real& saldo_raf,int g,int c,long s,int indbil)
{
  bool no_movimentato     = TRUE;
  bool no_movimentato_raf = TRUE; 
  bool esiste = FALSE;
  TString saldostr,saldo_rafstr;
  
  _sld->set_annoes(_anno_esercizio);

  if (_tipo_bilancio == 1)
  {
    if (_tipo_stampa == 1)   //bilancio per data limite
    {
      esiste = _sld->data_limite_bilancio(_tipo_stampa,g,c,s,_datai,_datalimite,indbil,_stampa_mov_prov);
      saldo = _sld->saldo();
          
      if (!esiste  && (!_sld->esiste_saldo() || !_sld->significativo())) 
        no_movimentato = TRUE;
      else
        if (!_stampamov)
        {
          if (saldo == ZERO)
          {
            if (!_sld->esiste_saldo() || !_sld->significativo())
              no_movimentato = TRUE;
            else
              no_movimentato = FALSE;
          }                          
          else
            no_movimentato = FALSE; 
        }  
        else
        { 
          if (saldo == ZERO)
            no_movimentato = TRUE;
          else
            no_movimentato = FALSE;   
        }
    }
    else if (_tipo_stampa == 2)
    {
      if (!_sld->ultima_immissione_bilancio(_anno_esercizio,g,c,s,indbil,_stampa_mov_prov))
      { 
        if (!_sld->esiste_saldo() || !_sld->significativo())
          no_movimentato = TRUE;
        else
          no_movimentato = FALSE;
      }
      else
        no_movimentato = FALSE;
         
      saldo = _sld->saldo();  
    }
    saldostr = saldo.string();
    
    if (_annoeserafr != 0 || _databilrafr != botime)
    {
      _sld->set_annoes(_anno_esercizio_raf);

//      if (_databilrafr != _data_fine_raf) //(_tipo_stampa == 1) bilancio per data limite
//      {
        esiste = _sld->data_limite_bilancio(DataLimite,g,c,s,_datairaf,_databilrafr,indbil,_stampa_mov_prov);
        saldo_raf = _sld->saldo();  
           
        if (!esiste  && (!_sld->esiste_saldo() || !_sld->significativo())) 
          no_movimentato_raf = TRUE;
        else   
          if (!_stampamov)
          {
            if (saldo_raf == ZERO)
            {
              if (!_sld->esiste_saldo() || !_sld->significativo())
                no_movimentato_raf = TRUE;
              else
                no_movimentato_raf = FALSE;
            }                          
            else
              no_movimentato_raf = FALSE;
          }  
          else
          { 
            if (saldo_raf == ZERO)
              no_movimentato_raf = TRUE;
            else
              no_movimentato_raf = FALSE;   
          }
/*      }
      else if (_databilrafr == _data_fine_raf) //(_tipo_stampa == 2)
      {     
        if (!_sld->ultima_immissione_bilancio(_anno_esercizio_raf,g,c,s,indbil,_stampa_mov_prov))
        {
          if (!_sld->esiste_saldo() || !_sld->significativo())
            no_movimentato_raf = TRUE;
          else
            no_movimentato_raf = FALSE;
        }
        else
          no_movimentato_raf = FALSE;  
        
        saldo_raf = _sld->saldo();  
      }*/ 
      saldo_rafstr = saldo_raf.string();
    }
  }
  
  if ((no_movimentato) && (no_movimentato_raf)) 
    return FALSE;
  else
    return TRUE;
}

bool CG1600_application::calcola(int g, int c, long s,
                                 const TDate& fine_es, const TDate& fine_es_prec)
{
  TString sezione;
  real    importo;
  int     annoe;
  long    num_reg;
  char    provvis;
  TDate   datareg, datacomp, data;
  bool    conto_mov = FALSE;
  TLocalisamfile rmov(LF_RMOV);
  TLocalisamfile mov (LF_MOV);

  _mov_periodo_dare  = ZERO;
  _mov_periodo_avere = ZERO;
  _prg_prec_dare     = ZERO;
  _prg_prec_avere    = ZERO;
  _saldo_ini_dare    = ZERO;
  _saldo_ini_avere   = ZERO;

  rmov.setkey(2);
  rmov.zero();
  rmov.put(RMV_GRUPPO,g);
  if (c != 0)
    rmov.put(RMV_CONTO,c);
  if (s != 0)
    rmov.put(RMV_SOTTOCONTO,s);
  TRectype rec(rmov.curr());

  rmov.read(_isgteq);     
  for ( ; !rmov.eof(); rmov.next())
  {
    if (rmov.curr() != rec) break;
    
    annoe      = rmov.get_int(RMV_ANNOES);
    datareg    = rmov.get_date(RMV_DATAREG);
    num_reg    = rmov.get_long(RMV_NUMREG);
    sezione    = rmov.get(RMV_SEZIONE);
    importo    = rmov.get_real(RMV_IMPORTO);
    
    mov.setkey(1);
    mov.zero();
    mov.put(MOV_NUMREG, num_reg);
    mov.read();
    if (mov.bad()) mov.zero();
    provvis = mov.get_char(MOV_PROVVIS);
    datacomp = mov.get_date(MOV_DATACOMP);
    
    if (_stampa_mov_prov == 1 && provvis != '\0') //bilancio normale (non comprende i provvisori)
      continue;

    if (_stampa_mov_prov == 3 && provvis == '\0') //bilancio dei soli provvisori                
      continue;

    const TString codcaus(mov.get(MOV_CODCAUS));

//    if (codcaus.not_empty())
//      if (codcaus == causale_chiusura())  //la causale e' uguale a quella di chiusura
//        continue; 

// Modifica del 03-03-95
    
    TCaus cau (codcaus);
    
    if (codcaus.not_empty())
      if (cau.chiusura())  //la causale e' uguale a quella di chiusura
        continue; 

    if (_annoese == 0)
      data = datareg;
    if (_annoese != 0)
      data = datacomp;
    
    if (importo == ZERO)
      continue;
                                              
    //calcolo i movimenti del periodo
/*    
    if ( (data >= _dataini) && (data <= _datafine) )
      if ((codcaus == causale_apertura() && _data_ini_ese != _dataini) ||
          (codcaus != causale_apertura()))
      {
        conto_mov = TRUE;
        if (sezione == "D")
          _mov_periodo_dare += importo;
        else _mov_periodo_avere += importo;
      }
*/      
// Modifica del 03-03-95

    if ( (data >= _dataini) && (data <= _datafine) )
      if ((cau.apertura() && _data_ini_ese != _dataini) ||
          (!cau.apertura()))
      {
        conto_mov = TRUE;
        if (sezione == "D")
          _mov_periodo_dare += importo;
        else _mov_periodo_avere += importo;
      } 

    //il saldo inizio es. e' dato dall'importo dare - importo avere di quei movimenti che hanno causale == apertura e data reg >= data inizio es. e <= data limite sup.
    
    if (_dataini == _data_ini_ese) //calcolo il saldo iniziale
    {      
      //if (codcaus == causale_apertura())
      if (cau.apertura())
      {
        if (sezione == "D")
          _saldo_ini_dare += importo;
        else _saldo_ini_avere += importo;
        conto_mov = TRUE;
      }
    }     
    else if (_dataini > _data_ini_ese) //calcolo i progressivi precedenti
      if ( (data >= _data_ini_ese) && (data < _dataini) )
      {
        if (sezione == "D")
          _prg_prec_dare += importo;
        else _prg_prec_avere += importo;
        
        conto_mov = TRUE;
      }
  }
  return conto_mov;
}  

bool CG1600_application::set_print(int)
{
  KEY tasto;
/*
{
  TConfig conf(CONFIG_DITTA);

  _causale_ap = conf.get("CoCaAp");
  _causale_chi = conf.get("CoCaCh");
}  
*/

_msk->set_handler(F_DATALIM,    data_limite);
_msk->set_handler(F_TIPOSTAMPA, tipo_stampa);
_msk->set_handler(F_TIPOBIL,    tipo_bilancio);
_msk->set_handler(F_ANNOESE,    anno_esercizio); 
_msk->set_handler(F_DATAINI,    data_inizio);
_msk->set_handler(F_DATAFINE,   data_fine);
_msk->set_handler(F_DATABILRAF, data_bil_raff);
_msk->set_handler(F_ANNORAFFR,  anno_ese_raff);

tasto = _msk->run(); 

if (tasto == K_ENTER) 
{  
  _datastampa  = (_msk->get(F_DATASTAMPA));    
  _annoese     = _msk->get_int(F_ANNOESE);
  _annoeserafr = _msk->get_int(F_ANNORAFFR);
  _intera_struttura = (bool)(_msk->get(F_STAMPAINT) == "X");
  _stampamov = (bool)(_msk->get(F_STAMPAMOV) == "X");
  _stampacod = (bool)(_msk->get(F_STAMPACOD) == "X");
  _stampa_modulo = (bool)(_msk->get(F_STAMPAMODULO) == "X");
  _tipo_bilancio = atoi(_msk->get(F_TIPOBIL));
  _stampa_mov_prov = _msk->get_int(F_STAMPAMOVPROV);
  if (_tipo_bilancio == 1)
  {
    _tipo_stampa = atoi(_msk->get(F_TIPOSTAMPA));
    _prog = new TProgind(_pconti->items(),"Elaborazione in corso... prego attendere",FALSE);
  }
  else if (_tipo_bilancio == 2)
  {
    _tipo_stampa = atoi(_msk->get(F_TIPOSTAMPA1));
    _prog = new TProgind(_pconti->items(),"Elaborazione in corso... prego attendere",FALSE);
  }

  _cont_let  = 0;
  _cont_numr = 0;
  _cont_num  = 0;
  _cont_gcs  = 0;
  _reset_righe_stampa = TRUE;
 
  //17/11/1995
  if (_tipo_bilancio == 1)
    set_real_picture("#.###.###.###.###");  
  else set_real_picture("###.###.###.###");  
  //fine
  
//  if (_stampamov)
//    set_print_zero(FALSE);
//  else
    set_print_zero(TRUE);

  _totale_attivita_gia_stampato  = FALSE;
  _totale_passivita_gia_stampato = FALSE;
  _statopatr_no_stamp            = TRUE;   
  _diffprod_fatto                = TRUE;            
  _risimp_fatto                  = TRUE;
  _sbilancio_ordine              = FALSE;   
  _sbilancio_patr_gia_stampato   = FALSE;
  _attivo_o_passivo              = FALSE;

  _sez_stamp  = ' ';
  _let_stamp  = ' ';
  _numr_stamp = "";
  _num_stamp  = "";
  _sez_tot    = ' ';
  _let_tot    = ' ';
  _numr_tot   = "";
  _num_tot    = "";
 
  _sale = _salerafr = _totale_ordine = _totale_economico = ZERO;
  _totale_ordine_raf = _totale_economico_raf = _totale_numero = ZERO;
  _totale_numr = _totale_lettera = _totale_sezione = ZERO;
  _totale_patrimoniale = _totale_attivita = _totale_passivita = ZERO;
  _totale_num_raf = _totale_numr_raf = _totale_let_raf = ZERO;
  _totale_sez_raf = _totale_patrim_raf = _totale_attiv_raf = ZERO;
  _totale_passiv_raf = _totale_ordine_attivo = _totale_ordine_passivo = ZERO;
  _totale_ordine_attivo_raf = _totale_ordine_passivo_raf = ZERO;
  _mov_periodo_dare = _mov_periodo_avere = _prg_prec_dare = ZERO;
  _prg_prec_avere = _saldo_ini_dare = _saldo_ini_avere = ZERO;
  _sld_prg_dare = _sld_prg_avere = _mov_dare = _mov_avere = ZERO;
  _tot_num_saldo = _tot_numr_saldo = _tot_let_saldo = _tot_gen_saldo = ZERO;
  _tot_num_prg_d = _tot_numr_prg_d = _tot_let_prg_d = _tot_gen_prg_d = ZERO;
  _tot_num_prg_a = _tot_numr_prg_a = _tot_let_prg_a = _tot_gen_prg_a = ZERO;
  _tot_num_mov_d = _tot_numr_mov_d = _tot_let_mov_d = _tot_gen_mov_d = ZERO;
  _tot_num_mov_a = _tot_numr_mov_a = _tot_let_mov_a = _tot_gen_mov_a = ZERO;
  _tot_num_saldo_d = _tot_numr_saldo_d = _tot_let_saldo_d = ZERO;
  _tot_gen_saldo_d = _tot_num_saldo_a = _tot_numr_saldo_a = ZERO;
  _tot_let_saldo_a = _tot_gen_saldo_a = _totale_parziale = ZERO;
  _totale_parziale_raf = _tot_parz_sld = _tot_parz_sld_d = ZERO;
  _tot_parz_sld_a = _tot_parz_prg_d = _tot_parz_prg_a = ZERO;
  _tot_parz_mov_d = _tot_parz_mov_a = ZERO;
  
  _datai    = _data_ini_ese;
  _datairaf = _data_ini_raf;  
  TString data1 = _data_ini_ese.string();
  TString data2 = _data_ini_raf.string();

// Se si tratta di stampa intera struttura allora passo al sort anche tutte 
// le classi presenti sulla tabella IV dir. CEE, altrimenti passo solamente
// le classi associate ai conti/sottoconti del Piano dei conti.
  
  init_sort();
  if (_intera_struttura)
    crea_sort_tabella();
  if (_tipo_bilancio == 1)
    crea_sort_piano_conti_scalare();
  else if (_tipo_bilancio == 2)
    crea_sort_piano_conti_verifica();
  _sort->endsort();


  crea_intestazione();
  delete _bil;
  delete _prog;
  return TRUE;
}
return FALSE;
}

void CG1600_application::stampa_totali()
{
  bool gia_stampato_conto_ord = FALSE;
  TString16 diff_prod;
  TString16 ris_imp;   
  
  diff_prod.format("%c%c",'9','B');
  ris_imp.format  ("%c%c%8s%2s",'9','E',"","21");
  
  TString16 classe;    
  classe.format("%c%c%8s%2s", _sez_da_stamp,_let_da_stamp,(const char*)_numr_da_stamp,(const char*)_num_da_stamp);
  
  _num  = atoi(_num_tot);
  _numr = _numr_tot;
  _let  = _let_tot;

  if (_buff == NULL) 
  {
    _num_tot  = "";
    _numr_tot = "";
    _let_tot  = ' ';
    _sez_tot  = ' ';
  }    
      
  if ((_sez_stamp == '1' || _sez_stamp == '2') && _let_stamp != 'Z')  
    _attivo_o_passivo = TRUE;
        
  if (_num_da_stamp!=_num_tot)
  {       
    if (_let_stamp != 'Z')
    {
      if (_sez_stamp != '5')
        if (_cont_gcs != 0)//(_cont_gcs >= 2)
        {
          //Fai il totale del numero arabo e stampalo 
          if (_num != 0)
          {
            set_row (_i,"@18gTotale@25g%2d@27g)", _num);
            set_row (_i++,"@84g%r", &_totale_numero);
          }
        }
    }
    if (_sez_stamp == '9')
    {      
      if (classe > ris_imp && _risimp_fatto)
      { 
        if (_num_tot == "20" || _num_tot == "21")
        {
          set_row (_i,"@4gTotale delle partite straordinarie");
          set_row (_i++,"@84g%r", &_totale_parziale);
        }       
        set_row (_i,"@4gRisultato prima delle imposte");
        set_row (_i++,"@84g%r", &_totale_economico);
        _risimp_fatto = FALSE;                                      
      }
    }
    
    _cont_gcs = 0;
    _totale_numero = 0;
  }
  if (_numr_da_stamp!=_numr_tot)
  {
    if (_let_stamp != 'Z')
    {
      if (_sez_stamp != '5')
      {
        if (_cont_gcs != 0)//(_cont_gcs >= 2)
        {
          //Fai il totale del numero arabo e stampalo 
          if (_num != 0)
          {
            set_row (_i,"@18gTotale@25g%2d@27g)", _num);
            set_row (_i++,"@84g%r", &_totale_numero); 
          }
        }
        if (_cont_num != 0)//(_cont_num >= 2)
        {
          //Fai il totale del numero romano e stampalo
          int numeror = atoi(_numr);
          TString numrom  = itor(numeror); 
          if (numrom != "")
          {
            set_row (_i,"@14gTotale@21g%s", (const char*) numrom);
            set_row (_i++,"@84g%r", &_totale_numr);
          }
        }
      }
    }
    _cont_gcs = 0;
    _cont_num = 0;
    _totale_numero = 0;
    _totale_numr = 0;
  }   
  if (_let_da_stamp!=_let_tot)
  { 
    if (_sez_stamp == '9')
    {
      TString16 classe;
      
      classe.format("%c%c%8s%2s",_sez_stamp,_let_stamp,(const char*)_numr_stamp,(const char*)_num_stamp);
       
      if (_cont_gcs != 0)//(_cont_gcs >= 2)
      {
        //Fai il totale del numero arabo e stampalo
        if (_num != 0)
        {
          set_row (_i,"@18gTotale@25g%2d@27g)", _num);
          set_row (_i++,"@84g%r", &_totale_numero);
        }
      }
      if (_cont_num != 0)//(_cont_num >= 2)
      {
        //Fai il totale del numero romano e stampalo  
        int numeror = atoi(_numr);
        TString numrom  = itor(numeror);
        if (numrom != "")
        {
          set_row (_i,"@14gTotale@21g%s", (const char*) numrom);
          set_row (_i++,"@84g%r", &_totale_numr);
        }
      }
      if (_cont_numr != 0)//(_cont_numr >= 2)
      {
        //Fai il totale della lettera e stampalo  
        if (_let_stamp == 'D')
          set_row (_i,"@4gTotale delle rettifiche");
        else          
          if (_let != ' ')
            if (_sez_stamp == '9' && _let_stamp != 'E')
              set_row (_i,"@3gTotale@10g%c@12g)", _let);
            else  
              if (_sez_stamp != '9')
                set_row (_i,"@3gTotale@10g%c@12g)", _let);
        if (_let != ' ')
        {
          if (_sez_stamp == '9' && _let_stamp != 'E')  
            set_row (_i++,"@84g%r", &_totale_lettera);
          else
            if (_sez_stamp != '9')                    
              set_row (_i++,"@84g%r", &_totale_lettera);    
        }
      }
      
      if (classe > diff_prod && _diffprod_fatto)
      { 
        if (_let_tot == 'A' || _let_tot == 'B') //Solo se esiste una delle due lettere
        {               
          set_row (_i++,"@4gDifferenza tra valore e costi della produzione@84g%r", &_totale_economico);
          _diffprod_fatto = FALSE;
        }
      }
    }
    else
    {
    if (_let_stamp != 'Z')
    {
      if (_sez_stamp != '5')
      {
        if (_cont_gcs != 0)//(_cont_gcs >= 2)
        {
          //Fai il totale del numero arabo e stampalo 
          if (_num != 0)
          {
            set_row (_i,"@18gTotale@25g%2d@27g)", _num);
            set_row (_i++,"@84g%r", &_totale_numero);
          }
        }
        if (_cont_num != 0)//(_cont_num >= 2)
        {    
          //Fai il totale del numero romano e stampalo
          int numeror = atoi(_numr);
          TString numrom  = itor(numeror); 
          if (numrom != "")
          {
            set_row (_i,"@14gTotale@21g%s", (const char*) numrom);
            set_row (_i++,"@84g%r", &_totale_numr);
          }
        }
        if (_cont_numr != 0)//(_cont_numr >= 2)
        {
          //Fai il totale della lettera e stampalo 
          if (_let != ' ')
          {
            set_row (_i,"@3gTotale@10g%c@12g)", _let);
            set_row (_i++,"@84g%r", &_totale_lettera);
          }
        }
      }   
    }
    
    if ((_sez_stamp == '1')&&(_let_da_stamp == 'Z'))
    {
      char app = ' ';
      set_row (_i++,"@0g%c", app);
      set_row (_i,"@0gTOTALE ATTIVO");  
      set_row (_i++,"@84g%r", &_totale_sezione);
      _totale_attivita = _totale_sezione;
      _totale_sezione = ZERO;
      _totale_attivita_gia_stampato = TRUE;
    }
    
    if ((_sez_stamp == '2')&&(_let_da_stamp == 'Z'))
    {
      char app = ' ';
      set_row (_i++,"@0g%c", app);
      set_row (_i,"@0gTOTALE PASSIVO");     
      set_row (_i++,"@84g%r", &_totale_sezione);
      _totale_passivita = _totale_sezione;
      _totale_sezione = ZERO;
      _totale_passivita_gia_stampato = TRUE;
    }
    
    if ((_sez_stamp == '1')&&(_let_stamp == 'Z'))
    {
      char app = ' ';
      set_row (_i++,"@0g%c", app);
      set_row (_i,"@0gTOTALE CONTI D'ORDINE ATTIVI"); 
      set_row (_i++,"@84g%r", &_totale_ordine_attivo);
//    _totale_ordine_attivo = ZERO;
      gia_stampato_conto_ord = TRUE;
    }
    
    if ((_sez_stamp == '2')&&(_let_stamp == 'Z'))
    {
      char app = ' ';
      set_row (_i++,"@0g%c", app);
      set_row (_i,"@0gTOTALE CONTI D'ORDINE PASSIVI");
      set_row (_i++,"@84g%r", &_totale_ordine_passivo);
      _i++;
      
      if (!_attivo_o_passivo)
      {
        real totale  = _totale_ordine_attivo - _totale_ordine_passivo;    
        if (totale != ZERO)
        {
          set_row (_i++,"@0gSALDO CONTI D'ORDINE");
          set_row (_i,"@0gSBILANCIO");           
          set_row (_i++,"@84g%r", &totale); 
        }
        _totale_ordine_attivo = ZERO;
        _totale_ordine_passivo = ZERO;
        _sbilancio_ordine = TRUE;
      }
      gia_stampato_conto_ord = TRUE;
    }
    }
    _cont_gcs = 0;
    _cont_num = 0;
    _cont_numr = 0;
    _totale_numero  = 0;
    _totale_numr    = 0;
    _totale_lettera = 0;
  }     
  if (_sez_da_stamp != _sez_tot)
  {
    if (_let_stamp != 'Z')
    {
      if (_sez_stamp != '5')
      {
        if (_cont_gcs != 0)//(_cont_gcs >= 2)
        {
          //Fai il totale del numero arabo e stampalo
          if (_num != 0)
          {
            set_row (_i,"@18gTotale@25g%2d@27g)", _num);
            set_row (_i++,"@84g%r", &_totale_numero);
          }
        }
        if (_cont_num != 0)//(_cont_num >= 2)
        {
          //Fai il totale del numero romano e stampalo
          int numeror = atoi(_numr);
          TString numrom  = itor(numeror);
          if (numrom != "")
          {
            set_row (_i,"@14gTotale@21g%s", (const char*) numrom);
            set_row (_i++,"@84g%r", &_totale_numr);
          }
        }
        if (_cont_numr != 0)//(_cont_numr >= 2)
        {
          //Fai il totale della lettera e stampalo
          if (_let != ' ')
          {   
            if (_sez_stamp == '9' && _let_stamp != 'E')
            {
              set_row (_i,"@3gTotale@10g%c@12g)", _let);
              set_row (_i++,"@84g%r", &_totale_lettera);
            }
            else
              if (_sez_stamp != '9')
              {
                set_row (_i,"@3gTotale@10g%c@12g)", _let);
                set_row (_i++,"@84g%r", &_totale_lettera);
              }
          }
        }
      }
    }

    if (!_totale_attivita_gia_stampato)
      if ((_sez_stamp == '1') && (_let_stamp != 'Z'))
      {
        char app = ' ';
        set_row (_i++,"@0g%c", app);
        set_row (_i,"@0gTOTALE ATTIVO");
        set_row (_i++,"@84g%r", &_totale_sezione);
        _totale_attivita = _totale_sezione;
        _totale_sezione = ZERO;
      }
    
    if (!_totale_passivita_gia_stampato)
      if ((_sez_stamp == '2') && (_let_stamp != 'Z'))
      {
        char app = ' ';
        set_row (_i++,"@0g%c", app);
        set_row (_i,"@0gTOTALE PASSIVO");
        set_row (_i++,"@84g%r", &_totale_sezione);
        _totale_passivita = _totale_sezione;
        _totale_sezione = ZERO;
      }  
    
    if (!gia_stampato_conto_ord)
    {  
      if (_sez_stamp == '2')
      {
        if (!_sbilancio_patr_gia_stampato)
        {                              
          _totale_patrimoniale = _totale_attivita - _totale_passivita;
          if (_totale_patrimoniale != ZERO)
          { 
            char app = ' ';
            set_row (_i++,"@0g%c", app);
            set_row (_i++,"@0gSALDO STATO PATRIMONIALE");
            set_row (_i,"@0gSBILANCIO (ATTIVO - PASSIVO)");
            //_totale_patrimoniale = _totale_attivita - _totale_passivita;
            set_row (_i++,"@84g%r", &_totale_patrimoniale);
            _totale_patrimoniale = ZERO;   
          }      
          _sbilancio_patr_gia_stampato = TRUE;
        }
      }
      if ((_sez_stamp == '1')&&(_let_stamp == 'Z'))
      {
        char app = ' ';
        set_row (_i++,"@0g%c", app);
        set_row (_i,"@0gTOTALE CONTI D'ORDINE ATTIVI");
        set_row (_i++,"@84g%r", &_totale_ordine_attivo);
        // _totale_ordine_attivo = ZERO;
      }
      if ((_sez_stamp == '2')&&(_let_stamp == 'Z'))
      {
        char app = ' ';
        set_row (_i++,"@0g%c", app);
        set_row (_i,"@0gTOTALE CONTI D'ORDINE PASSIVI");  
        set_row (_i++,"@84g%r", &_totale_ordine_passivo);  
        _i++;   
        if (!_sbilancio_ordine)
        {
          real totale = _totale_ordine_attivo - _totale_ordine_passivo;   
          if (totale != ZERO)
          {                           
            set_row (_i++,"@0g%c", app);
            set_row (_i++,"@0gSALDO CONTI D'ORDINE");
            set_row (_i,"@0gSBILANCIO");    
            set_row (_i++,"@84g%r", &totale);   
            _sbilancio_ordine = TRUE;
          }
          _totale_ordine_passivo = ZERO; 
          _totale_ordine_attivo = ZERO; 
        }
      }
    }

    if (_sez_stamp == '2')
    {  
      char app = ' ';
       
      if (!_sbilancio_patr_gia_stampato)
      {
        _totale_patrimoniale = _totale_attivita - _totale_passivita;  
        if (_totale_patrimoniale != ZERO)
        {
          set_row (_i++,"@0g%c", app);
          set_row (_i++,"@0gSALDO STATO PATRIMONIALE");
          set_row (_i,"@0gSBILANCIO (ATTIVO - PASSIVO)");
          //_totale_patrimoniale = _totale_attivita - _totale_passivita;
          set_row (_i++,"@84g%r", &_totale_patrimoniale);
          _totale_patrimoniale = ZERO;   
        }
      }
      if (!_sbilancio_ordine)
      {
        real totale = _totale_ordine_attivo - _totale_ordine_passivo;
        if (totale != ZERO && !_sbilancio_ordine)
        {   
          set_row (_i++,"@0g%c", app);
          set_row (_i++,"@0gSALDO CONTI D'ORDINE");
          set_row (_i,"@0gSBILANCIO");    
          set_row (_i++,"@84g%r", &totale);
        }
      }
    }
    if (_sez_stamp == '5')
    {
      char app = ' ';
      set_row (_i++,"@0g%c", app);
      set_row (_i,"@0gTOTALE CONTI D'ORDINE");
      set_row (_i++,"@84g%r", &_totale_ordine);
      _totale_ordine = ZERO;
    }
    if (_sez_stamp == '9')
    { 
      if (_buff == NULL) 
      {  
        if ((_let_stamp == 'A' || _let_stamp == 'B') && _diffprod_fatto)//Solo se esiste una delle due lettere
        {               
          set_row (_i++,"@4gDifferenza tra valore e costi della produzione@84g%r", &_totale_economico);
          _diffprod_fatto = FALSE;
        }
        if (_risimp_fatto)
        { 
          if (_let_da_stamp == 'E' && (_num_da_stamp == "20" || _num_da_stamp == "21"))
          { 
            set_row (_i,"@4gTotale delle partite straordinarie");
            set_row (_i++,"@84g%r", &_totale_parziale);
          }
          
          if ( (classe > ris_imp && _risimp_fatto) || _buff == NULL)         
          {
            set_row (_i,"@4gRisultato prima delle imposte");
            set_row (_i++,"@84g%r", &_totale_economico);
            _risimp_fatto = FALSE;
          }
        }
      }  
      
      char app = ' ';
      set_row (_i++,"@0g%c", app);  
      if (_totale_economico != ZERO)
      {
        set_row (_i,"@0gRISULTATO CONTO ECONOMICO");
        set_row (_i++,"@84g%r", &_totale_economico);
        _totale_economico = ZERO;
      }
    }
    _cont_gcs = 0;
    _cont_num = 0;
    _cont_numr = 0;
    _cont_let = 0;
    _totale_numero  = 0;
    _totale_numr    = 0;
    _totale_lettera = 0;
  }
}

void CG1600_application::stampa_totali_con_raffronto()
{
  bool gia_stampato_conto_ord = FALSE;
  TString16 diff_prod;
  TString16 ris_imp;

  diff_prod.format("%c%c",'9','B');
  ris_imp.format  ("%c%c%8s%2s",'9','E',"","21");
  
  TString16 classe;
  classe.format("%c%c%8s%2s", _sez_da_stamp,_let_da_stamp,(const char*)_numr_da_stamp,(const char*)_num_da_stamp);
  
  _num  = atoi(_num_tot);
  _numr = _numr_tot;
  _let  = _let_tot;
  
  if (_buff == NULL) 
  {
    _num_tot  = "";
    _numr_tot = "";
    _let_tot  = ' ';
    _sez_tot  = ' ';
  }    
   
  if ((_sez_stamp == '1' || _sez_stamp == '2') && _let_stamp != 'Z')  
    _attivo_o_passivo = TRUE;
     
  if (_num_da_stamp!=_num_tot)
  {
    
    if (_let_stamp != 'Z')
    {
      if (_sez_stamp != '5')
        if (_cont_gcs != 0)//(_cont_gcs >= 2)
        {
          //Fai il totale del numero arabo e stampalo
          if (_num != 0)
          {
            set_row (_i,"@18gTotale@25g%2d@27g)", _num);
            set_row (_i,"@84g%r", &_totale_numero);
            set_row (_i++,"@110g%r", &_totale_num_raf);
          }
        }
    } 
    if (_sez_stamp == '9')
    {      
      if (classe > ris_imp && _risimp_fatto)
      { 
        if (_num_tot == "20" || _num_tot == "21")
        {
          set_row (_i,"@4gTotale delle partite straordinarie");
          set_row (_i,"@84g%r", &_totale_parziale);
          set_row (_i++,"@110g%r", &_totale_parziale_raf);
        }
        set_row (_i,"@4gRisultato prima delle imposte");
        set_row (_i,"@84g%r", &_totale_economico);
        set_row (_i++,"@110g%r", &_totale_economico_raf);
        _risimp_fatto = FALSE;
      }
    }
    _cont_gcs = 0;
    _totale_numero  = 0;
    _totale_num_raf = 0;
  }
  if (_numr_da_stamp!=_numr_tot)
  {
    if (_let_stamp != 'Z')
    {
      if (_sez_stamp != '5')
      {
        if (_cont_gcs != 0)//(_cont_gcs >= 2)
        {
          //Fai il totale del numero arabo e stampalo
          if (_num != 0)
          {
            set_row (_i,"@18gTotale@25g%2d@27g)", _num);
            set_row (_i,"@84g%r", &_totale_numero);
            set_row (_i++,"@110g%r", &_totale_num_raf);
          }
        }
        if (_cont_num != 0)//(_cont_num >= 2)
        {
          //Fai il totale del numero romano e stampalo
          int numeror = atoi(_numr);
          TString numrom  = itor(numeror);
          if (numrom != "")
          {
            set_row (_i,"@14gTotale@21g%s", (const char*) numrom);
            set_row (_i,"@84g%r", &_totale_numr);
            set_row (_i++,"@110g%r", &_totale_numr_raf);
          }
        }
      }
    }
    _cont_gcs = 0;
    _cont_num = 0;
    _totale_numero   = 0;
    _totale_numr     = 0;
    _totale_num_raf  = 0;
    _totale_numr_raf = 0;
  }   
  if (_let_da_stamp!=_let_tot)
  {
    if (_sez_stamp == '9')
    {
      TString16 classe;
      
      classe.format("%c%c%8s%2s",_sez_stamp,_let_stamp,(const char*)_numr_stamp,(const char*)_num_stamp);
       
      if (_cont_gcs != 0)//(_cont_gcs >= 2)
      {
        //Fai il totale del numero arabo e stampalo
        if (_num != 0)
        {
          set_row (_i,"@18gTotale@25g%2d@27g)", _num); 
          set_row (_i++,"@84g%r", &_totale_numero);
        }
      }
      if (_cont_num != 0)//(_cont_num >= 2)
      {
        //Fai il totale del numero romano e stampalo
        int numeror = atoi(_numr);
        TString numrom  = itor(numeror);
        if (numrom != "")
        {
          set_row (_i,"@14gTotale@21g%s", (const char*) numrom);
          set_row (_i++,"@84g%r", &_totale_numr);
        }
      }
      if (_cont_numr != 0)//(_cont_numr >= 2)
      {
        //Fai il totale della lettera e stampalo  
        if (_let_stamp == 'D')
          set_row (_i,"@4gTotale delle rettifiche");
        else
          if (_let != ' ')
            if (_sez_stamp == '9' && _let_stamp != 'E')
              set_row (_i,"@3gTotale@10g%c@12g)", _let); 
            else
              if (_sez_stamp != '9')
                set_row (_i,"@3gTotale@10g%c@12g)", _let);
        if (_let != ' ')
        {                 
          if (_sez_stamp == '9' && _let_stamp != 'E')
          {        
            set_row (_i,"@84g%r", &_totale_lettera);  
            set_row (_i++,"@110g%r", &_totale_let_raf);   
          }
          else
            if (_sez_stamp != '9')
            {
              set_row (_i,"@84g%r", &_totale_lettera);  
              set_row (_i++,"@110g%r", &_totale_let_raf); 
            }
        }
      } 
      if (classe > diff_prod && _diffprod_fatto)
      { 
        if (_let_tot == 'A' || _let_tot == 'B')
        {               
          set_row (_i++,"@4gDifferenza tra valore e costi della produzione@84g%r@110g%r", &_totale_economico,&_totale_economico_raf);
          _diffprod_fatto = FALSE;
        }
      }
      
    }
    else
    {
    if (_let_stamp != 'Z')
    {
      if (_sez_stamp != '5')
      {
        if (_cont_gcs != 0)//(_cont_gcs >= 2)
        {
          //Fai il totale del numero arabo e stampalo
          if (_num != 0)
          {
            set_row (_i,"@18gTotale@25g%2d@27g)", _num);
            set_row (_i,"@84g%r", &_totale_numero);
            set_row (_i++,"@110g%r", &_totale_num_raf); 
          }
        }
        if (_cont_num != 0)//(_cont_num >= 2)
        {
          //Fai il totale del numero romano e stampalo
          int numeror = atoi(_numr);
          TString numrom  = itor(numeror);
          if (numrom != "")
          {
            set_row (_i,"@14gTotale@21g%s", (const char*) numrom);
            set_row (_i,"@84g%r", &_totale_numr);
            set_row (_i++,"@110g%r", &_totale_numr_raf);
          }
        }
        if (_cont_numr != 0)//(_cont_numr >= 2)
        {
          //Fai il totale della lettera e stampalo
          if (_let != ' ')
          {
            set_row (_i,"@3gTotale@10g%c@12g)", _let);
            set_row (_i,"@84g%r", &_totale_lettera);
            set_row (_i++,"@110g%r", &_totale_let_raf);  
          }
        }
      }
    }
    
    if ((_sez_stamp == '1')&&(_let_da_stamp == 'Z'))
    {
      char app = ' ';
      set_row (_i++,"@0g%c", app);
      set_row (_i,"@0gTOTALE ATTIVO");   
      set_row (_i,"@84g%r", &_totale_sezione);
      set_row (_i++,"@110g%r", &_totale_sez_raf);
      _totale_attivita = _totale_sezione;
      _totale_attiv_raf = _totale_sez_raf;
      _totale_sezione = ZERO;
      _totale_sez_raf = ZERO;
      _totale_attivita_gia_stampato = TRUE;
    }
    
    if ((_sez_stamp == '2')&&(_let_da_stamp == 'Z'))
    {
      char app = ' ';
      set_row (_i++,"@0g%c", app);
      set_row (_i,"@0gTOTALE PASSIVO");
      set_row (_i,"@84g%r", &_totale_sezione);
      set_row (_i++,"@110g%r", &_totale_sez_raf);
      _totale_passivita = _totale_sezione;
      _totale_passiv_raf = _totale_sez_raf;
      _totale_sezione = ZERO;
      _totale_sez_raf = ZERO;
      _totale_passivita_gia_stampato = TRUE;
    }
    
    if ((_sez_stamp == '1')&&(_let_stamp == 'Z'))
    {
      char app = ' ';
      set_row (_i++,"@0g%c", app);
      set_row (_i,"@0gTOTALE CONTI D'ORDINE ATTIVI");
      set_row (_i,"@84g%r", &_totale_ordine_attivo);
      set_row (_i++,"@110g%r", &_totale_ordine_attivo_raf);
      //_totale_ordine_attivo = ZERO;
      //_totale_ordine_attivo_raf = ZERO;
      gia_stampato_conto_ord = TRUE;
    }
    
    if ((_sez_stamp == '2')&&(_let_stamp == 'Z'))
    {
      char app = ' ';
      set_row (_i++,"@0g%c", app);
      set_row (_i,"@0gTOTALE CONTI D'ORDINE PASSIVI");
      set_row (_i,"@84g%r", &_totale_ordine_passivo);
      set_row (_i++,"@110g%r", &_totale_ordine_passivo_raf);
      _i++; 
      gia_stampato_conto_ord     = TRUE;
      if (!_attivo_o_passivo)
      {
        real totale  = _totale_ordine_attivo - _totale_ordine_passivo; 
        real tot_raf = _totale_ordine_attivo_raf - _totale_ordine_passivo_raf; 
        if (totale != ZERO || tot_raf != ZERO)
        {
          set_row (_i++,"@0gSALDO CONTI D'ORDINE");
          set_row (_i,"@0gSBILANCIO");     
          set_row (_i,"@84g%r", &totale); 
          set_row (_i++,"@110g%r", &tot_raf);
        }
        _totale_ordine_attivo      = ZERO;
        _totale_ordine_attivo_raf  = ZERO;
        _totale_ordine_passivo     = ZERO;
        _totale_ordine_passivo_raf = ZERO; 
        _sbilancio_ordine = TRUE;
        _sbilancio_patr_gia_stampato = TRUE; //Se passa di qui non ci sono ne attivi ne passivo
      }
    }
    }
    _cont_gcs = 0;
    _cont_num = 0;
    _cont_numr = 0;
    _totale_numero   = 0;
    _totale_numr     = 0;
    _totale_lettera  = 0;
    _totale_num_raf  = 0;
    _totale_numr_raf = 0;
    _totale_let_raf  = 0;
  }     
  if (_sez_da_stamp != _sez_tot)
  {
    if (_let_stamp != 'Z')
    { 
      if (_sez_stamp != '5')
      {
        if (_cont_gcs != 0)//(_cont_gcs >= 2)
        {
          //Fai il totale del numero arabo e stampalo
          if (_num != 0)
          {
            set_row (_i,"@18gTotale@25g%2d@27g)", _num);
            set_row (_i,"@84g%r", &_totale_numero);
            set_row (_i++,"@110g%r", &_totale_num_raf);
          }
        }
        if (_cont_num != 0)//(_cont_num >= 2)
        {
          //Fai il totale del numero romano e stampalo
          int numeror = atoi(_numr);
          TString numrom  = itor(numeror);       
          if (numrom != "")
          {
            set_row (_i,"@14gTotale@21g%s", (const char*) numrom);
            set_row (_i++,"@84g%r", &_totale_numr);
            set_row (_i++,"@110g%r", &_totale_numr_raf);
          }
        }
        if (_cont_numr != 0)//(_cont_numr >= 2)
        {
          //Fai il totale della lettera e stampalo
          if (_let != ' ')
          { 
            if (_sez_stamp == '9' && _let_stamp != 'E')
            {
              set_row (_i,"@3gTotale@10g%c@12g)", _let);
              set_row (_i++,"@84g%r", &_totale_lettera);
              set_row (_i++,"@110g%r", &_totale_let_raf);
            }
            else
              if (_sez_stamp != '9')
              {
                set_row (_i,"@3gTotale@10g%c@12g)", _let);
                set_row (_i++,"@84g%r", &_totale_lettera);
                set_row (_i++,"@110g%r", &_totale_let_raf);
              }
          }
        }
      }
    }

    if (!_totale_attivita_gia_stampato)
      if ((_sez_stamp == '1') && (_let_stamp != 'Z'))
      {
        char app = ' ';
        set_row (_i++,"@0g%c", app);
        set_row (_i,"@0gTOTALE ATTIVO");
        set_row (_i,"@84g%r", &_totale_sezione);
        set_row (_i++,"@110g%r", &_totale_sez_raf);
        _totale_attivita = _totale_sezione;
        _totale_attiv_raf = _totale_sez_raf;
        _totale_sezione = ZERO;
        _totale_sez_raf = ZERO;
        _totale_attivita_gia_stampato = TRUE;
      }
    
    if (!_totale_passivita_gia_stampato)
      if ((_sez_stamp == '2') && (_let_stamp != 'Z'))
      {
        char app = ' ';
        set_row (_i++,"@0g%c", app);
        set_row (_i,"@0gTOTALE PASSIVO");
        set_row (_i,"@84g%r", &_totale_sezione);
        set_row (_i++,"@110g%r", &_totale_sez_raf);
        _totale_passivita = _totale_sezione;
        _totale_passiv_raf = _totale_sez_raf;
        _totale_sezione = ZERO;
        _totale_sez_raf = ZERO;
        _totale_passivita_gia_stampato = TRUE;
      }  
    
    if (!gia_stampato_conto_ord)
    { 
      if (_sez_stamp == '2')
      {
        if (!_sbilancio_patr_gia_stampato)
        {
          _totale_patrimoniale = _totale_attivita - _totale_passivita;
          _totale_patrim_raf   = _totale_attiv_raf - _totale_passiv_raf;
          if (_totale_patrimoniale != ZERO || _totale_patrim_raf != ZERO)
          { 
            char app = ' ';
            set_row (_i++,"@0g%c", app);
            set_row (_i++,"@0gSALDO STATO PATRIMONIALE");
            set_row (_i,"@0gSBILANCIO (ATTIVO - PASSIVO)");
            //_totale_patrimoniale = _totale_attivita - _totale_passivita;
            //_totale_patrim_raf   = _totale_attiv_raf - _totale_passiv_raf;
            set_row (_i,"@84g%r", &_totale_patrimoniale);
            set_row (_i++,"@110g%r", &_totale_patrim_raf);
            _totale_patrimoniale = 0;
            _totale_patrim_raf   = 0;
          }
          _sbilancio_patr_gia_stampato = TRUE; 
        }
      } 
      if ((_sez_stamp == '1')&&(_let_stamp == 'Z'))
      {
        char app = ' ';
        set_row (_i++,"@0g%c", app);
        set_row (_i,"@0gTOTALE CONTI D'ORDINE ATTIVI");
        set_row (_i,"@84g%r", &_totale_ordine_attivo);   
        set_row (_i++,"@110g%r", &_totale_ordine_attivo_raf);
        //_totale_ordine_attivo = ZERO; 
        //_totale_ordine_attivo_raf = ZERO;
      }
      
      if ((_sez_stamp == '2')&&(_let_stamp == 'Z'))
      {
        char app = ' ';
        set_row (_i++,"@0g%c", app);
        set_row (_i,"@0gTOTALE CONTI D'ORDINE PASSIVI");
        set_row (_i,"@84g%r", &_totale_ordine_passivo);  
        set_row (_i++,"@110g%r", &_totale_ordine_passivo_raf);
        _i++;  
        if (!_sbilancio_ordine)
        {
          real totale  = _totale_ordine_attivo - _totale_ordine_passivo; 
          real tot_raf = _totale_ordine_attivo_raf - _totale_ordine_passivo_raf;
          if (totale != ZERO || tot_raf != ZERO)
          {                                 
            set_row (_i++,"@0g%c", app);
            set_row (_i++,"@0gSALDO CONTI D'ORDINE");
            set_row (_i,"@0gSBILANCIO");    
            set_row (_i,"@84g%r", &totale); 
            set_row (_i++,"@110g%r", &tot_raf); 
            _sbilancio_ordine = TRUE;
          }
          _totale_ordine_attivo      = ZERO;
          _totale_ordine_attivo_raf  = ZERO;
          _totale_ordine_passivo     = ZERO;
          _totale_ordine_passivo_raf = ZERO; 
          _sbilancio_ordine = TRUE; 
        }
      }
    }

    if (_sez_stamp == '2')
    {
      char app = ' ';  
      if (!_sbilancio_patr_gia_stampato)
      {                                             
        _totale_patrimoniale = _totale_attivita - _totale_passivita;
        _totale_patrim_raf   = _totale_attiv_raf - _totale_passiv_raf; 
        if (_totale_patrimoniale != ZERO || _totale_patrim_raf != ZERO)
        {
          set_row (_i++,"@0g%c", app);
          set_row (_i++,"@0gSALDO STATO PATRIMONIALE");
          set_row (_i,"@0gSBILANCIO (ATTIVO - PASSIVO)");
          //_totale_patrimoniale = _totale_attivita - _totale_passivita;
          //_totale_patrim_raf   = _totale_attiv_raf - _totale_passiv_raf;
          set_row (_i,"@84g%r", &_totale_patrimoniale);
          set_row (_i++,"@110g%r", &_totale_patrim_raf);
          _totale_patrimoniale = 0;
          _totale_patrim_raf   = 0;
        } 
      }
      if (!_sbilancio_ordine)
      {
        real totale  = _totale_ordine_attivo - _totale_ordine_passivo; 
        real tot_raf = _totale_ordine_attivo_raf - _totale_ordine_passivo_raf;
        if ((totale != ZERO || tot_raf != ZERO) && !_sbilancio_ordine)
        {                               
          set_row (_i++,"@0g%c", app);
          set_row (_i++,"@0gSALDO CONTI D'ORDINE");
          set_row (_i,"@0gSBILANCIO");    
          set_row (_i,"@84g%r", &totale); 
          set_row (_i++,"@110g%r", &tot_raf);
        }
      }  
    }
    if (_sez_stamp == '5')
    {
      char app = ' ';
      set_row (_i++,"@0g%c", app);
      set_row (_i,"@0gTOTALE CONTI D'ORDINE");
      set_row (_i,"@84g%r", &_totale_ordine);
      set_row (_i++,"@110g%r", &_totale_ordine_raf);
      _totale_ordine = 0;
      _totale_ordine_raf = 0;
    }
    if (_sez_stamp == '9')
    {     
      if (_buff == NULL) 
      { 
        if ((_let_stamp == 'A' || _let_stamp == 'B') && _diffprod_fatto)
        {               
          set_row (_i++,"@4gDifferenza tra valore e costi della produzione@84g%r@110g%r", &_totale_economico,&_totale_economico_raf);
          _diffprod_fatto = FALSE;
        }
        if (_risimp_fatto)
        { 
          if (_let_da_stamp == 'E' && (_num_da_stamp == "20" || _num_da_stamp == "21"))
          {
            set_row (_i,"@4gTotale delle partite straordinarie");
            set_row (_i,"@84g%r", &_totale_parziale);
            set_row (_i++,"@110g%r", &_totale_parziale_raf);
          }

          if ( (classe > ris_imp && _risimp_fatto) || _buff == NULL) 
          {
            set_row (_i,"@4gRisultato prima delle imposte");
            set_row (_i,"@84g%r", &_totale_economico);
            set_row (_i++,"@110g%r", &_totale_economico_raf);
            _risimp_fatto = FALSE;
          }
        }
      }
      char app = ' ';
      set_row (_i++,"@0g%c", app);   
      if (_totale_economico != ZERO || _totale_economico_raf != ZERO)
      {
        set_row (_i,"@0gRISULTATO CONTO ECONOMICO");
        set_row (_i,"@84g%r", &_totale_economico);
        set_row (_i++,"@110g%r", &_totale_economico_raf);
        _totale_economico = 0;
        _totale_economico_raf = 0;
      }
    }
    _cont_gcs = 0;
    _cont_num = 0;
    _cont_numr = 0;
    _cont_let = 0;
    _totale_numero   = 0;
    _totale_numr     = 0;
    _totale_lettera  = 0;
    _totale_num_raf  = 0;
    _totale_numr_raf = 0;
    _totale_let_raf  = 0;
  }
}  

void CG1600_application::stampa_totali_verifica()
{ 
  TString16 ris_imp;
         
  ris_imp.format  ("%c%c%8s%2s",'9','E',"","21");
  
  _num  = atoi(_num_tot);
  _numr = _numr_tot;
  _let  = _let_tot;
  _sez  = _sez_tot;

  if (_buff == NULL) 
  {
    _num_tot  = "";
    _numr_tot = "";
    _let_tot  = ' ';
    _sez_tot  = ' ';
  }    

  if (_num_da_stamp!=_num_tot)
  {
    if (_cont_gcs != 0)//(_cont_gcs >= 2)
    {
      //Fai il totale del numero arabo e stampalo
      if (((_sez == '1')||(_sez == '2')||(_sez == '9'))&&(_let != 'Z'))
      {    
        if (_num != 0)
          set_row (_i,"@8gTotale@15g%2d@17g)",_num);
      }
      else
        if (_num != 0)
          set_row (_i,"@8gTotale");   
      
      if (_num != 0)
      {    
        set_row (_i,"@49g%r", &_tot_num_prg_d);
        set_row (_i,"@65g%r", &_tot_num_prg_a);
        set_row (_i,"@82g%r", &_tot_num_mov_d);
        set_row (_i,"@98g%r", &_tot_num_mov_a);
      }

      if (!_stampa_modulo)
      {
        if (_tot_num_saldo < ZERO)
        {
          _tot_num_saldo = -_tot_num_saldo;
          _tot_sez_saldo = 'A';
        }
        else
          _tot_sez_saldo = 'D';  
        
        if (_num != 0)  
          stampa_saldo_132(_tot_num_saldo);
      }
      else
      {   
        if (_num != 0)
          stampa_saldo_198(_tot_num_saldo_d,_tot_num_saldo_a);
        //  _tot_num_saldo_d = 0;
        //  _tot_num_saldo_a = 0;
      } 
      if (_sez_stamp == '9')
      {
        TString16 classe;

        classe.format("%c%c%8s%2s", _sez_da_stamp,_let_da_stamp,(const char*)_numr_da_stamp,(const char*)_num_da_stamp);
      
        if (classe > ris_imp && _risimp_fatto)
        { 
          if (_num_tot == "20" || _num_tot == "21")
          {                     
            set_row (_i,"@4gTotale delle partite straordinarie");
            set_row (_i,"@49g%r", &_tot_parz_prg_d);
            set_row (_i,"@65g%r", &_tot_parz_prg_a);
            set_row (_i,"@82g%r", &_tot_parz_mov_d);
            set_row (_i,"@98g%r", &_tot_parz_mov_a);
            _risimp_fatto = FALSE;  
            if (!_stampa_modulo)
            {
              if (_tot_parz_sld < ZERO)
              {
                _tot_parz_sld = -_tot_parz_sld;
                _tot_sez_saldo = 'A';
              }
              else
                _tot_sez_saldo = 'D';  
        
              if (_num != 0)  
                stampa_saldo_132(_tot_parz_sld);
            }
            else
            {   
              if (_num != 0)
                stampa_saldo_198(_tot_parz_sld_d,_tot_parz_sld_a);
            } 
          }
        }
      }
    }
    _cont_gcs = 0;
    _tot_num_prg_d = ZERO;
    _tot_num_prg_a = ZERO;
    _tot_num_mov_d = ZERO;
    _tot_num_mov_a = ZERO;
    _tot_num_saldo = ZERO;
  }
  if (_numr_da_stamp!=_numr_tot)
  {
    if (_cont_gcs != 0)//(_cont_gcs >= 2)
    {
      //Fai il totale del numero arabo e stampalo
      if (((_sez == '1')||(_sez == '2')||(_sez == '9'))&&(_let != 'Z'))
      { 
        if (_num != 0)
          set_row (_i,"@8gTotale@15g%2d@17g)", _num);
      }
      else    
        if (_num != 0)
          set_row (_i,"@8gTotale");
          
      if (_num != 0)
      {    
        set_row (_i,"@49g%r", &_tot_num_prg_d);
        set_row (_i,"@65g%r", &_tot_num_prg_a);
        set_row (_i,"@82g%r", &_tot_num_mov_d);
        set_row (_i,"@98g%r", &_tot_num_mov_a);
      }

      if (!_stampa_modulo)
      {
        if (_tot_num_saldo < ZERO)
        {
          _tot_num_saldo = -_tot_num_saldo;
          _tot_sez_saldo = 'A';
        }
        else
          _tot_sez_saldo = 'D'; 
          
        if (_num != 0)
          stampa_saldo_132(_tot_num_saldo);
      }
      else
      {   
        if (_num != 0)
          stampa_saldo_198(_tot_num_saldo_d,_tot_num_saldo_a);
        //_tot_num_saldo_d = 0;
        //_tot_num_saldo_a = 0;
      }
    }
    if (_cont_num != 0)//(_cont_num >= 2)
    {
      //Fai il totale del numero romano e stampalo
      int numeror = atoi(_numr);
      TString numrom  = itor(numeror);  
      if (numrom != "")
      {
        set_row (_i,"@8gTotale@15g%s", (const char*) numrom);
        set_row (_i,"@49g%r", &_tot_numr_prg_d);
        set_row (_i,"@65g%r", &_tot_numr_prg_a);
        set_row (_i,"@82g%r", &_tot_numr_mov_d);
        set_row (_i,"@98g%r", &_tot_numr_mov_a);
      }

      if (!_stampa_modulo)
      {
        if (_tot_numr_saldo < ZERO)
        {
          _tot_numr_saldo = -_tot_numr_saldo;
          _tot_sez_saldo = 'A';
        }
        else
          _tot_sez_saldo = 'D'; 
          
        if (numrom != "")
          stampa_saldo_132(_tot_numr_saldo);
      }
      else
      {  
        if (numrom != "")
          stampa_saldo_198(_tot_numr_saldo_d,_tot_numr_saldo_a);
        // _tot_numr_saldo_d = 0;
        // _tot_numr_saldo_a = 0;
      }
    }
    _cont_gcs = 0;
    _cont_num = 0;
    _tot_num_prg_d  = ZERO;
    _tot_num_prg_a  = ZERO;
    _tot_num_mov_d  = ZERO;
    _tot_num_mov_a  = ZERO;
    _tot_num_saldo  = ZERO;
    _tot_numr_prg_d = ZERO;
    _tot_numr_prg_a = ZERO;
    _tot_numr_mov_d = ZERO;
    _tot_numr_mov_a = ZERO;
    _tot_numr_saldo = ZERO;      
  }   
  if ((_let_da_stamp!=_let_tot) || (_sez_da_stamp != _sez_tot))
  {
    if (_cont_gcs != 0)//(_cont_gcs >= 2)
    {
      //Fai il totale del numero arabo e stampalo
      if (((_sez == '1')||(_sez == '2')||(_sez == '9'))&&(_let != 'Z'))
      {  
        if (_num != 0)
          set_row (_i,"@8gTotale@15g%2d@17g)",_num);
      }
      else
        if (_num != 0)
          set_row (_i,"@8gTotale");
  
      if (_num != 0)
      {
        set_row (_i,"@49g%r", &_tot_num_prg_d);
        set_row (_i,"@65g%r", &_tot_num_prg_a);
        set_row (_i,"@82g%r", &_tot_num_mov_d);
        set_row (_i,"@98g%r", &_tot_num_mov_a);
      }

      if (!_stampa_modulo)
      {
        if (_tot_num_saldo < ZERO)
        {
          _tot_num_saldo = -_tot_num_saldo;
          _tot_sez_saldo = 'A';
        }
        else
          _tot_sez_saldo = 'D';  
          
        if (_num != 0)
          stampa_saldo_132(_tot_num_saldo);
      }
      else
      {   
        if (_num != 0)
          stampa_saldo_198(_tot_num_saldo_d,_tot_num_saldo_a);
        // _tot_num_saldo_d = 0;
        // _tot_num_saldo_a = 0;
      } 
    }
    if (_cont_num != 0)//(_cont_num >= 2)
    {
      //Fai il totale del numero romano e stampalo
      int numeror = atoi(_numr);
      TString numrom  = itor(numeror);
      if (numrom != "")
      {
        set_row (_i,"@8gTotale@15g%s", (const char*) numrom);
        set_row (_i,"@49g%r", &_tot_numr_prg_d);
        set_row (_i,"@65g%r", &_tot_numr_prg_a);
        set_row (_i,"@82g%r", &_tot_numr_mov_d);
        set_row (_i,"@98g%r", &_tot_numr_mov_a);
      }

      if (!_stampa_modulo)
      {
        if (_tot_numr_saldo < ZERO)
        {
          _tot_numr_saldo = -_tot_numr_saldo;
          _tot_sez_saldo = 'A';
        }
        else
          _tot_sez_saldo = 'D';
          
        if (numrom != "")
          stampa_saldo_132(_tot_numr_saldo);
      }
      else
      {   
        if (numrom != "")
          stampa_saldo_198(_tot_numr_saldo_d,_tot_numr_saldo_a);
        // _tot_numr_saldo_d = 0;
        // _tot_numr_saldo_a = 0;
      }
    }
    if (_cont_numr != 0)//(_cont_numr >= 2)
    {
      //Fai il totale della lettera e stampalo   
      if (_let != ' ')
      { 
        if (_sez_stamp == '9' && _let_stamp != 'E')
        {
          set_row (_i,"@8gTotale@15g%c@16g)", _let);
          set_row (_i,"@49g%r", &_tot_let_prg_d);
          set_row (_i,"@65g%r", &_tot_let_prg_a);
          set_row (_i,"@82g%r", &_tot_let_mov_d);
          set_row (_i,"@98g%r", &_tot_let_mov_a);
        }
        else
          if (_sez_stamp != '9')
          {
            set_row (_i,"@8gTotale@15g%c@16g)", _let);
            set_row (_i,"@49g%r", &_tot_let_prg_d);
            set_row (_i,"@65g%r", &_tot_let_prg_a);
            set_row (_i,"@82g%r", &_tot_let_mov_d);
            set_row (_i,"@98g%r", &_tot_let_mov_a);
          }
      }

      if (!_stampa_modulo)
      {
        if (_tot_let_saldo < ZERO)
        {
          _tot_let_saldo = -_tot_let_saldo;
          _tot_sez_saldo = 'A';
        }
        else
          _tot_sez_saldo = 'D';
          
        if (_let != ' ') 
          if (_sez_stamp == '9' && _let_stamp != 'E')  
            stampa_saldo_132(_tot_let_saldo);
          else
            if (_sez_stamp != '9')
              stampa_saldo_132(_tot_let_saldo);
      }
      else
      {   
        if (_let != ' ')                       
          if (_sez_stamp == '9' && _let_stamp != 'E')
            stampa_saldo_198(_tot_let_saldo_d,_tot_let_saldo_a);
          else
            stampa_saldo_198(_tot_let_saldo_d,_tot_let_saldo_a);
        // _tot_let_saldo_d = 0;
        // _tot_let_saldo_a = 0;
      } 
    }
    _cont_gcs = 0;
    _cont_num = 0;
    _cont_numr = 0;
    _tot_num_prg_d  = ZERO;
    _tot_num_prg_a  = ZERO;
    _tot_num_mov_d  = ZERO;
    _tot_num_mov_a  = ZERO;
    _tot_num_saldo  = ZERO;
    _tot_numr_prg_d = ZERO;
    _tot_numr_prg_a = ZERO;
    _tot_numr_mov_d = ZERO;
    _tot_numr_mov_a = ZERO;
    _tot_numr_saldo = ZERO;      
    _tot_let_prg_d  = ZERO;
    _tot_let_prg_a  = ZERO;
    _tot_let_mov_d  = ZERO;
    _tot_let_mov_a  = ZERO;
    _tot_let_saldo  = ZERO;      
  }     
}

void CG1600_application::stampa_saldo_198(real& saldo_d,real& saldo_a)
{ 
  set_row (_i,"@115g%r", &saldo_d);
  set_row (_i,"@48g!@81g!@114g!@131g!");
  set_row (_i,"@133g%r", &saldo_a);
  set_row (_i++,"@48g!@81g!@114g!@131g!");
  saldo_d = real(ZERO);
  saldo_a = real(ZERO);
}

void CG1600_application::stampa_saldo_132(const real& saldo)
{
  set_row (_i,"@115g%r", &saldo);
  set_row (_i,"@48g!@81g!@114g!");
  set_row (_i++,"@131g%c", _tot_sez_saldo);
}

print_action CG1600_application::postprocess_page(int file, int counter)
{ 
  struct bil_ivd* bil = (struct bil_ivd*) _buff;                              

  bil = (struct bil_ivd*) _buff;

  if (_tipo_bilancio == 1)
  {
    if (_sez_da_stamp != _sez_stamp)
    {
      if (_sez_da_stamp == '5')
      { 
        if (!_intera_struttura)
        {
          if (bil->gruppo[0] != 'Z')
          {    
            reset_print();
            _i = 1;
            setta_righe("CONTI D'ORDINE");
            _reset_righe_stampa = FALSE;
          }
        }
        else
        {
          reset_print();
          _i = 1;
          setta_righe("CONTI D'ORDINE");
          _reset_righe_stampa = FALSE;
        }  
      }
      if (_sez_da_stamp == '9')
      {                      
        if (!_intera_struttura)
        {
          if (bil->gruppo[0] != 'Z')
          {
            reset_print();
            _i = 1;
            setta_righe("CONTO ECONOMICO");
            _reset_righe_stampa = FALSE; 
          }
        } 
        else
        {
          reset_print();
          _i = 1;
          setta_righe("CONTO ECONOMICO");
          _reset_righe_stampa = FALSE;
        }   
      }
    }

    set_auto_ff(FALSE);
  }

  if (_buff == NULL) 
    return NEXT_PAGE;

  _sale     = 0;
  _salerafr = 0;

  return REPEAT_PAGE;
}

bool CG1600_application::preprocess_page(int file, int counter)
{ 
  if (_tipo_bilancio == 1)
  {
    if (preprocess_stampa_scalare(counter))
      return TRUE;
    else 
      return FALSE;
  }
  else if (_tipo_bilancio == 2)
  {
    if (preprocess_stampa_verifica(counter))
      return TRUE;
    else 
      return FALSE;
  }

  return TRUE;
}

bool CG1600_application::preprocess_stampa_scalare(int counter)
{ 
  struct bil_ivd* bil = (struct bil_ivd*) _buff;
  int     g,c;
  long    s;
  bool    fai = TRUE;
  TString saldostr,saldo_rafstr;    
  bool conto_dettagliato = TRUE;
  
  if (!counter)
  {
    reset_print();
    _i = 1;
  }

  if (_reset_righe_stampa)
  {
    reset_print();
    _i = 1;
  }
  else
    _reset_righe_stampa = TRUE;
  
  if (counter)
  {
    if (!_intera_struttura)
    {
      if (bil->gruppo[0] != 'Z')
      {
        _sez_stamp  = bil->sez;
        _let_stamp  = bil->let;
        _numr_stamp = bil->numr;
        _numr_stamp.ltrim();
        _num_stamp  = bil->num;
        _num_stamp.ltrim();
        _sez_tot  = bil->sez;
        _let_tot  = bil->let;
        _numr_tot = bil->numr;
        _numr_tot.ltrim();
        _num_tot  = bil->num;
        _num_tot.ltrim();
      }
    }
    else
    {
      _classe_stampata = format ("%1c%1c%8s%2d",bil->sez,bil->let,(const char*) bil->numr,bil->num);
      _sez_stamp  = bil->sez;
      _let_stamp  = bil->let;
      _numr_stamp = bil->numr;
      _numr_stamp.ltrim();
      _num_stamp  = bil->num;
      _num_stamp.ltrim();
      _sez_tot  = bil->sez;
      _let_tot  = bil->let;
      _numr_tot = bil->numr;
      _numr_tot.ltrim();
      _num_tot  = bil->num;
      _num_tot.ltrim();
    }
  }

  _buff = _sort->retrieve();

  if (_buff == NULL) 
  {
    if (_annoeserafr == 0 && _databilrafr == botime)
      stampa_totali(); 
    else
      stampa_totali_con_raffronto();       
    _sez_da_stamp = ' ';
    _sez_stamp    = ' ';
    return TRUE;
  }      

  if (_buff != NULL)
  {
    bil = (struct bil_ivd*) _buff;
    _classe_da_stampare = format ("%1c%1c%8s%2d",bil->sez,bil->let,(const char*) bil->numr,bil->num);
    _sez_da_stamp  = bil->sez;
    _let_da_stamp  = bil->let;
    _numr_da_stamp = bil->numr;
    _numr_da_stamp.ltrim();
    _num_da_stamp  = bil->num;
    _num_da_stamp.ltrim();
    g = atoi(bil->gruppo);
    c = atoi(bil->conto);
    s = atol(bil->sottoc);      
    conto_dettagliato = bil->conto_dettagliato;

    if (_intera_struttura)
      fai = TRUE;
    else
    {
      if (bil->gruppo[0] != 'Z')
        fai = TRUE;
      else
        fai = FALSE;
    }

    if (counter)
    {
      if (fai)
        if (_annoeserafr == 0 && _databilrafr == botime)
          stampa_totali(); 
        else
          stampa_totali_con_raffronto();       
    }

    //Fare ricerca di dataregmov

    if (!_intera_struttura)
    {
      if (bil->gruppo[0]=='Z')
        return FALSE;
      
      _sale = bil->saldo;
      if (_annoeserafr != 0 || _databilrafr != botime)
        _salerafr = bil->saldorafr;
/***      
      if (_stampamov)
      {
        if (_annoeserafr != 0 || _databilrafr != botime)
        {
          if ((_sale.is_zero()) && (_salerafr.is_zero()))
            return FALSE;
        }
        else
          if (_sale.is_zero())
            return FALSE;
      }
***/      
    }
    else
    {
      if (bil->gruppo[0]=='Z')
//      {
        if (_classe_da_stampare == _classe_stampata)
//        {
//          sprintf (bil->gruppo,"%s", "   ");
//          sprintf (bil->conto ,"%s", "   ");
//          sprintf (bil->sottoc,"%s", "      ");
//        }
//        else
          return FALSE;
//      }

      _sale = bil->saldo;
      if (_annoeserafr != 0 || _databilrafr != botime)
        _salerafr = bil->saldorafr;
/***      
      if (_stampamov)
      {
        if (_annoeserafr != 0 || _databilrafr != botime)
        {
          if ((_sale.is_zero()) && (_salerafr.is_zero()))
            return FALSE;
        }
        else
        {
          if (_sale.is_zero())
            return FALSE;
        }
      }
***/      
    }  
    
    saldostr = _sale.string();
    saldo_rafstr = _salerafr.string();
    
    // Faccio passare solo i sottoconti o i conti non dettagliati (che non hanno sottoconti)
    // perchè l' importo dei conti dettagliati non è altri che il totale degli importi di
    // tutti i suoi sottoconti; dunque se li sommassi anche loro, sommerei l'importo due volte.
    // Pero' devo ricordarmi di cambiare ugualmente segno ai conti che vanno dettagliati.
    
    if (g != 0 && c != 0 && s == 0 && conto_dettagliato)
      if (_sez_da_stamp == '9') 
      {
        _sale = -_sale;
        if (_annoeserafr != 0 || _databilrafr != botime)
          _salerafr = -_salerafr;
      }

       
    if ((g != 0 && c != 0 && s != 0)||(g != 0 && c != 0 && s == 0 && !conto_dettagliato))
    {      
 //     if (_sez_da_stamp == '5')
 //       if (_sale < ZERO)
 //         _sale = -_sale;
      
      if (_sez_da_stamp == '9')
      //  if (_sale> ZERO)
          _sale = -_sale;

      _totale_numero  += _sale;
      _totale_numr    += _sale;
      _totale_lettera += _sale;
      if ((_sez_da_stamp == '1')||(_sez_da_stamp == '2'))
      {
        if (_let_da_stamp != 'Z')
          _totale_sezione += _sale;
        else
        {
          if (_sez_da_stamp == '1')
            _totale_ordine_attivo += _sale;
          else
            if (_sez_da_stamp == '2')
              _totale_ordine_passivo += _sale;
        }
      }
      
      if (_sez_da_stamp == '5')
        _totale_ordine += _sale;

      if (_sez_da_stamp == '9') 
      {
        _totale_economico += _sale; 
        if (_let_da_stamp == 'E' && (_num_da_stamp == "20" || _num_da_stamp == "21"))
          _totale_parziale += _sale;
      }  

      if (_annoeserafr != 0 || _databilrafr != botime)
      {
        //if (_sez_da_stamp == '5')
        //  if (_salerafr < ZERO)
        //    _salerafr = -_salerafr;
        if (_sez_da_stamp == '9')
          //if (_salerafr> ZERO)
            _salerafr = -_salerafr;

        _totale_num_raf  += _salerafr;
        _totale_numr_raf += _salerafr;
        _totale_let_raf  += _salerafr;
        if ((_sez_da_stamp == '1')||(_sez_da_stamp == '2'))
        {
          if (_let_da_stamp != 'Z')
            _totale_sez_raf  += _salerafr;
          else
          {
            if (_sez_da_stamp == '1')
              _totale_ordine_attivo_raf += _salerafr;
            else
              if (_sez_da_stamp == '2')
                _totale_ordine_passivo_raf += _salerafr;
          }
        }      

        if (_sez_da_stamp == '5')
          _totale_ordine_raf += _salerafr;

        if (_sez_da_stamp == '9') 
        {
          _totale_economico_raf += _salerafr; 
          if (_let_da_stamp == 'E' && (_num_da_stamp == "20" || _num_da_stamp == "21"))
            _totale_parziale_raf += _salerafr;
        }  
      }
    }
    return TRUE;
  }
  else
    return FALSE;  
}

bool CG1600_application::preprocess_stampa_verifica(int counter)
{ 
  struct bil_ivd* bil = (struct bil_ivd*) _buff;
  int     g,c;
  long    s;
  bool    fai = TRUE;
  bool    conto_dettagliato = TRUE;

  if (!counter)
  {
    reset_print();
    _i = 1;
  }

  if (_reset_righe_stampa)
  {
    reset_print();
    _i = 1;
  }
  else
    _reset_righe_stampa = TRUE;
  
  if (counter)
  {
    if (!_intera_struttura)
    {
      if (bil->gruppo[0] != 'Z')
      {
        _sez_stamp  = bil->sez;
        _let_stamp  = bil->let;
        _numr_stamp = bil->numr;
        _numr_stamp.ltrim();
        _num_stamp  = bil->num;
        _num_stamp.ltrim();
        _sez_tot  = bil->sez;
        _let_tot  = bil->let;
        _numr_tot = bil->numr;
        _numr_tot.ltrim();
        _num_tot  = bil->num;
        _num_tot.ltrim();
      }
    }
    else
    {
      _classe_stampata = format ("%1c%1c%8s%2d",bil->sez,bil->let,(const char*) bil->numr,bil->num);
      _sez_stamp  = bil->sez;
      _let_stamp  = bil->let;
      _numr_stamp = bil->numr;
      _numr_stamp.ltrim();
      _num_stamp  = bil->num;
      _num_stamp.ltrim();
      _sez_tot  = bil->sez;
      _let_tot  = bil->let;
      _numr_tot = bil->numr;
      _numr_tot.ltrim();
      _num_tot  = bil->num;
      _num_tot.ltrim();
    }
  }

  _buff = _sort->retrieve();

  if (_buff == NULL) 
  {
    stampa_totali_verifica();
    set_row (_i,"@0g****** ******** TOTALE GENERALE"); 
    //17/11/1995
    if (strlen(_tot_gen_prg_d.string()) > 12 ||
        strlen(_tot_gen_prg_a.string()) > 12 ||
        strlen(_tot_gen_mov_d.string()) > 12 ||           
        strlen(_tot_gen_mov_a.string()) > 12)
    {
     TString tgpd (_tot_gen_prg_d.string("#############"));
     TString tgpa (_tot_gen_prg_a.string("#############"));
     TString tgmd (_tot_gen_mov_d.string("#############"));
     TString tgma (_tot_gen_mov_a.string("#############"));
     set_row (_i,"@51g%s", (const char*)tgpd);
     set_row (_i,"@67g%s", (const char*)tgpa);
     set_row (_i,"@84g%s", (const char*)tgmd);
     set_row (_i,"@100g%s",(const char*)tgma);
    }
    else
    {    
     set_row (_i,"@49g%r", &_tot_gen_prg_d);
     set_row (_i,"@65g%r", &_tot_gen_prg_a);
     set_row (_i,"@82g%r", &_tot_gen_mov_d);
     set_row (_i,"@98g%r", &_tot_gen_mov_a);
    } 
    //fine
    
    if (!_stampa_modulo)
    {
      if (_tot_gen_saldo < ZERO)
      {
        _tot_gen_saldo = -_tot_gen_saldo;
        _tot_sez_saldo = 'A';
      }
      else
        _tot_sez_saldo = 'D';
      stampa_saldo_132(_tot_gen_saldo);
    }
    else
      stampa_saldo_198(_tot_gen_saldo_d,_tot_gen_saldo_a);
    
    //modifica 05/04/1995
    if ((_tipo_stampa == 1 && _dataini == _data_ini_ese) || _tipo_stampa == 2)
    {
      if (strlen(_nuovo_tot_saldo_d.string()) > 12 ||
            strlen(_nuovo_tot_saldo_a.string()) > 12)         
      {    
        TString ntsd (_nuovo_tot_saldo_d.string("#############"));
        TString ntsa (_nuovo_tot_saldo_a.string("#############"));      
        if (_tipo_stampa == 1 && _dataini == _data_ini_ese)
          set_row(_i,"****** ******** TOTALE CON MOVIM. DI APERTURA@48g!@81g!@84g%s@100g%s@114g!",(const char*)ntsd,(const char*)ntsa);
        else
          set_row(_i,"****** ******** TOTALE CON SALDI INIZIALI@48g!@81g!@84g%s@100g%s@114g!",(const char*)ntsd,(const char*)ntsa);
      }
      else
      { 
        if (_tipo_stampa == 1 && _dataini == _data_ini_ese)
          set_row(_i,"****** ******** TOTALE CON MOVIM. DI APERTURA@48g!@81g!@82g%r@98g%r@114g!",&_nuovo_tot_saldo_d,&_nuovo_tot_saldo_a);
        else
          set_row(_i,"****** ******** TOTALE CON SALDI INIZIALI@48g!@81g!@82g%r@98g%r@114g!",&_nuovo_tot_saldo_d,&_nuovo_tot_saldo_a);
      }
    }
    //fine modifica
    
    _sez_da_stamp = ' ';
    _sez_stamp    = ' '; 
    return TRUE;
  }      

  if (_buff != NULL)
  {
    bil = (struct bil_ivd*) _buff;
    _classe_da_stampare = format ("%1c%1c%8s%2d",bil->sez,bil->let,(const char*) bil->numr,bil->num);
    _sez_da_stamp  = bil->sez;
    _let_da_stamp  = bil->let;
    _numr_da_stamp = bil->numr;
    _numr_da_stamp.ltrim();
    _num_da_stamp  = bil->num;
    _num_da_stamp.ltrim();
    g = atoi(bil->gruppo);
    c = atoi(bil->conto);
    s = atol(bil->sottoc);  
    conto_dettagliato = bil->conto_dettagliato;

    if (_intera_struttura)
      fai = TRUE;
    else
    {
      if (bil->gruppo[0] != 'Z')
        fai = TRUE;
      else
        fai = FALSE;
    }

    if (counter)
    {
      if (fai)
        stampa_totali_verifica(); 
    }

    _sale          = bil->saldo;
    _sld_prg_dare  = bil->sld_prg_dare;
    _sld_prg_avere = bil->sld_prg_avere;
    _mov_dare      = bil->mov_dare;
    _mov_avere     = bil->mov_avere;
    
    if (!_intera_struttura)
    {
      if (bil->gruppo[0]=='Z')
        return FALSE;
      
      if (_stampamov)
      {
        if (_sale.is_zero())
          return FALSE;
      }
    }
    else
    {
      if (bil->gruppo[0]=='Z')
//      {
        if (_classe_da_stampare == _classe_stampata)
//        {
//          sprintf (bil->gruppo,"%s", "   ");
//          sprintf (bil->conto ,"%s", "   ");
//          sprintf (bil->sottoc,"%s", "      ");
//        }
//        else
          return FALSE;
//      }
      
      if (_stampamov)
      {
        if (_sale.is_zero())
          return FALSE;
      }
    }

    if ((g != 0) && (c != 0) && (s == 0) && (conto_dettagliato))
    {
      //if (_sld_prg_avere < ZERO)
      //  _sld_prg_avere = -_sld_prg_avere;

      //if (_mov_avere < ZERO)
      //  _mov_avere = -_mov_avere;

      if (_sale < ZERO)
      {
        _sale = -_sale;
        _sez_saldo = 'A';
      }
      else
        _sez_saldo = 'D';
    }
    
    if ((g != 0 && c != 0 && s != 0)||(g != 0 && c != 0 && s == 0 && !conto_dettagliato))
    {
      _tot_num_saldo  += _sale;
      _tot_numr_saldo += _sale;
      _tot_let_saldo  += _sale;
      _tot_gen_saldo  += _sale;
      if (_sez_da_stamp == '9') 
        if (_let_da_stamp == 'E' && (_num_da_stamp == "20" || _num_da_stamp == "21"))
          _tot_parz_sld += _sale;

      //if (_sld_prg_avere < ZERO)
      //  _sld_prg_avere = -_sld_prg_avere;

      //if (_mov_avere < ZERO)
      //  _mov_avere = -_mov_avere;

      if (_sale < ZERO)
      {
        _sale = -_sale;
        _sez_saldo = 'A';
        if (_stampa_modulo)
        {
          _tot_num_saldo_a  += _sale;
          _tot_numr_saldo_a += _sale;
          _tot_let_saldo_a  += _sale;
          _tot_gen_saldo_a  += _sale;
          if (_sez_da_stamp == '9') 
            if (_let_da_stamp == 'E' && (_num_da_stamp == "20" || _num_da_stamp == "21"))
              _tot_parz_sld_a += _sale;
        }
      }
      else
      {
        _sez_saldo = 'D';
        if (_stampa_modulo)
        {
          _tot_num_saldo_d  += _sale;
          _tot_numr_saldo_d += _sale;
          _tot_let_saldo_d  += _sale;
          _tot_gen_saldo_d  += _sale;
          if (_sez_da_stamp == '9') 
            if (_let_da_stamp == 'E' && (_num_da_stamp == "20" || _num_da_stamp == "21"))
              _tot_parz_sld_d += _sale;

        }
      }
      
      if (_dataini == _data_ini_ese)
      {
        //modifica del 27/11/1995
        if (_tipo_stampa == 2)
        {
         real saldo_num = _sld_prg_dare - _sld_prg_avere;
         if (saldo_num > ZERO)
           _tot_num_prg_d += saldo_num;
         else
         {
          saldo_num = -saldo_num;
          _tot_num_prg_a  += saldo_num;
         }
         real saldo_numr = _sld_prg_dare - _sld_prg_avere;
         if (saldo_numr > ZERO)
           _tot_numr_prg_d += saldo_numr;
         else                     
         {
          saldo_numr = -saldo_numr;
          _tot_numr_prg_a += saldo_numr;
         }
         real saldo_let = _sld_prg_dare - _sld_prg_avere;
         if (saldo_let > ZERO)
           _tot_let_prg_d  += saldo_let;
         else
         {
          saldo_let = -saldo_let;
          _tot_let_prg_a  += saldo_let;
         }
         real saldo_gen = _sld_prg_dare - _sld_prg_avere;
         if (saldo_gen > ZERO)
           _tot_gen_prg_d  += saldo_gen;
         else                                       
         {
          saldo_gen = -saldo_gen;
          _tot_gen_prg_a  += saldo_gen;
         }
        } 
        else if (_tipo_stampa == 1)
        { 
          _tot_num_prg_d += _sld_prg_dare;
          _tot_num_prg_a += _sld_prg_avere;
          _tot_numr_prg_d += _sld_prg_dare;
          _tot_numr_prg_a += _sld_prg_avere;
          _tot_let_prg_d += _sld_prg_dare;
          _tot_let_prg_a += _sld_prg_avere;
          _tot_gen_prg_d += _sld_prg_dare;
          _tot_gen_prg_a += _sld_prg_avere;
        }
         //fine   
      }
      else
      { 
        _tot_num_prg_d  += _sld_prg_dare;
        _tot_numr_prg_d += _sld_prg_dare;
        _tot_let_prg_d  += _sld_prg_dare;
        _tot_gen_prg_d  += _sld_prg_dare;
        _tot_num_prg_a  += _sld_prg_avere;
        _tot_numr_prg_a += _sld_prg_avere;
        _tot_let_prg_a  += _sld_prg_avere;
        _tot_gen_prg_a  += _sld_prg_avere;      
      } 
      _tot_num_mov_d  += _mov_dare;
      _tot_numr_mov_d += _mov_dare;
      _tot_let_mov_d  += _mov_dare;
      _tot_gen_mov_d  += _mov_dare;
      _tot_num_mov_a  += _mov_avere;
      _tot_numr_mov_a += _mov_avere;
      _tot_let_mov_a  += _mov_avere; 
      _tot_gen_mov_a  += _mov_avere;
      if (_sez_da_stamp == '9') 
        if (_let_da_stamp == 'E' && (_num_da_stamp == "20" || _num_da_stamp == "21"))
        {
          _tot_parz_prg_d += _sld_prg_dare;
          _tot_parz_prg_a += _sld_prg_avere;
          _tot_parz_mov_d += _mov_dare;
          _tot_parz_mov_a += _mov_avere;         
        } 
    }
    return TRUE;
  }
  else
    return FALSE;  
}

void CG1600_application::set_page(int file, int counter)
{ 
  if (_tipo_bilancio == 1)
  {
    if (_sez_da_stamp != _sez_stamp)
    {
      if ((_sez_da_stamp=='1')||((_sez_da_stamp=='2')&&(_statopatr_no_stamp)))
      {
        setta_righe ("STATO PATRIMONIALE");
        _statopatr_no_stamp = FALSE;
      }
      if (_sez_da_stamp == '2')
        setta_righe("");
      if ((_sez_da_stamp == '5') || (_sez_da_stamp == '9'))
        set_auto_ff(TRUE);
    }
    else
    {
      if (_buff != NULL)
        setta_righe("");
    }
  }
  else if (_tipo_bilancio == 2)
  {
    if (_buff != NULL)
      setta_righe_verifica();
  }
}

void CG1600_application::setta_righe(const char * titolo)
{
  struct bil_ivd* bil = (struct bil_ivd*) _buff;
  int numeror, numero, gruppo, conto;
  char sezione,lettera;
  long sottoc;
  TString numrom,numr;
  TString descr_let,descr_numr,descr_num,descr_sottoc,descr_classe;
  bool stampa_classe = TRUE;
  TString lettera1  = "@1g)@3g%s";
  TString lettera2 = "@3g%s";
  TString numr1     = "@12g-@14g%s"; 
  TString numr2    = "@14g%s";
  TString num      = "@15g)@18g%s"; 
  TString num2     = "@18g%s"; 
  
  _descr->set_width(40);
  sezione = bil->sez;
  lettera = bil->let;
  numr = bil->numr;
  //  numr.ltrim();
  numeror = atoi(bil->numr);
  numrom  = itor(numeror);
  numero  = atoi(bil->num);
//  num     = bil->num;
  gruppo  = atoi(bil->gruppo);
  conto   = atoi(bil->conto);
  sottoc  = atoi(bil->sottoc);
  descr_let  = descrizione_lettera(sezione,lettera);
  descr_numr = descrizione_numeroromano(sezione,lettera,numeror);
  descr_num  = descrizione_numero(sezione,lettera,numeror,numero);
  descr_sottoc = descrizione_sottoconto(gruppo,conto,sottoc);
  
  //Se la classe prelevata dal record corrente del sort e' diversa dalla classe
  //prelevata dal record precedente, allora stampo la nuova classe con i relativi
  //sottoconti. In caso contrario continuo a stampare solo i sottoconti.

  if (_sez_da_stamp != _sez_stamp)
  {
    set_row (_i++,"@0g%s", titolo);
    char app = ' ';
    set_row(_i++,"@0g%c", app);
    
    if ((_sez_da_stamp == '1')&&(_let_da_stamp == 'Z'))
    {
      char app = ' ';
      set_row (_i++,"@0g%c", app);   
      set_row (_i++,"@0gCONTI D'ORDINE ATTIVI");
      set_row (_i++,"@0g%c", app);
      stampa_classe = FALSE;
    } 
    else
      if ((_sez_da_stamp == '1')&&(_let_da_stamp != 'Z'))
       {
         char app = ' ';
         set_row (_i++,"@0g%c", app);   
         set_row (_i++,"@0gATTIVO");
         set_row (_i++,"@0g%c", app);
       }
        
    if ((_sez_da_stamp == '2')&&(_let_da_stamp == 'Z'))
    {
      char app = ' ';
      set_row(_i++,"@0g%c", app); 
      set_row (_i++,"@0gCONTI D'ORDINE PASSIVI");
      set_row(_i++,"@0g%c", app); 
      stampa_classe = FALSE;
    } 
    else
      if ((_sez_da_stamp == '2')&&(_let_da_stamp != 'Z'))
      {
        char app = ' ';
        set_row(_i++,"@0g%c", app); 
        set_row (_i++,"@0gPASSIVO");
        set_row(_i++,"@0g%c", app); 
      }
      
    if (stampa_classe)
    {
      if ((_sez_da_stamp=='1')||(_sez_da_stamp=='2')||(_sez_da_stamp== '9'))
      { 
        //set_row(_i++,"@0g%s", (const char*) _descr_sez);  
        if (!_intera_struttura || (_intera_struttura && bil->gruppo[0] != 'Z'))
        {        
          _cont_let  = 1;
          _cont_numr = 1;
          _cont_num  = 1;
          _cont_gcs  = 0;
        }
        if (lettera != ' ')
        {
          set_row(_i,"@0g%c", bil->let);                              
          *_descr = (const char*) descr_let;   
          setta_righe_descr(_descr,lettera1,lettera2);
          //set_row(_i++,"@1g)@3g%s", (const char*) descr_let);
        }
        if (numrom != "")
        {
          set_row(_i,"@3g%8s", (const char*) numrom);
          *_descr = (const char*) descr_numr;
          setta_righe_descr(_descr,numr1,numr2);
          //set_row(_i++,"@12g-@14g%s", (const char*) descr_numr);
        }
        if (numero != 0)
        {
          set_row(_i,"@13g%s", bil->num);
          *_descr = (const char*) descr_num;
          setta_righe_descr(_descr,num,num2);
          //set_row(_i++,"@15g)@18g%s", (const char*) descr_num);
        }
      }
    }
  }
  else
    if ((_let_da_stamp!=_let_stamp)&&(_sez_da_stamp==_sez_stamp))
    {
      if ((_sez_da_stamp == '1')&&(_let_da_stamp == 'Z'))
      {
        char app = ' ';
        set_row (_i++,"@0g%c", app);   
        set_row (_i++,"@0gCONTI D'ORDINE ATTIVI");
        set_row (_i++,"@0g%c", app);
        stampa_classe = FALSE;
      }
      if ((_sez_da_stamp == '2')&&(_let_da_stamp == 'Z'))
      {
        char app = ' ';
        set_row(_i++,"@0g%c", app); 
        set_row (_i++,"@0gCONTI D'ORDINE PASSIVI");
        set_row(_i++,"@0g%c", app); 
        stampa_classe = FALSE;
      }
      if (stampa_classe)
      {
        if ((_sez_da_stamp=='1')||(_sez_da_stamp=='2')||(_sez_da_stamp=='9'))
        {
          set_row(_i,"@0g%c", bil->let);  
          *_descr = (const char*) descr_let;   
          setta_righe_descr(_descr,lettera1,lettera2);
          //set_row(_i++,"@1g)@3g%s", (const char*) descr_let);
          //_cont_let += 1;
          if (!_intera_struttura || (_intera_struttura && bil->gruppo[0] != 'Z'))
          {
            _cont_numr = 1;
            _cont_num  = 1;
            _cont_gcs  = 0;
          }
        
          if (numrom != "")
          {
            set_row(_i,"@3g%8s", (const char*) numrom);
            *_descr = (const char*) descr_numr;
            setta_righe_descr(_descr,numr1,numr2);
            //set_row(_i++,"@12g-@14g%s", (const char*) descr_numr);
          }
          if (numero != 0)
          {
            set_row(_i,"@13g%s", bil->num);
            *_descr = (const char*) descr_num;
            setta_righe_descr(_descr,num,num2);
            //set_row(_i++,"@15g)@18g%s", (const char*) descr_num); 
          }
        }
      }
    }
    else
      if ((_numr_da_stamp!=_numr_stamp)&&(_sez_da_stamp==_sez_stamp)&&(_let_da_stamp==_let_stamp))
      {
        if ((_sez_da_stamp=='1')||(_sez_da_stamp=='2')||(_sez_da_stamp=='9'))
        {
          set_row(_i,"@3g%8s", (const char*) numrom);
          *_descr = (const char*) descr_numr;
          setta_righe_descr(_descr,numr1,numr2);
          //set_row(_i++,"@12g-@14g%s", (const char*) descr_numr);
          //_cont_numr += 1; 
          //_cont_numr = 1; 
          if (!_intera_struttura || (_intera_struttura && bil->gruppo[0] != 'Z'))
          {
            _cont_num  = 1;
            _cont_gcs  = 0;
          }
        
          if (numero != 0)
          {
            set_row(_i,"@13g%s", bil->num);
            *_descr = (const char*) descr_num;
            setta_righe_descr(_descr,num,num2);
            //set_row(_i++,"@15g)@18g%s", (const char*) descr_num);
          }
        }
      }
      else
        if ((_num_da_stamp!=_num_stamp)&&(_sez_da_stamp==_sez_stamp)&&(_let_da_stamp==_let_stamp)&&(_numr_da_stamp==_numr_stamp))
        {
          if ((_sez_da_stamp=='1')||(_sez_da_stamp=='2')||(_sez_da_stamp=='9'))
          {
            set_row(_i,"@13g%s", bil->num);
            *_descr = (const char*) descr_num;
            setta_righe_descr(_descr,num,num2);
            //set_row(_i++,"@15g)@18g%s", (const char*) descr_num);
            //_cont_num += 1;   
            if (!_intera_struttura || (_intera_struttura && bil->gruppo[0] != 'Z'))
              _cont_gcs = 0;
          }
        }
  if (bil->gruppo[0] != 'A')
  {
    if (!_stampacod)
    {               
      if (!_intera_struttura || (_intera_struttura && bil->gruppo[0] != 'Z'))
      {
        _cont_gcs += 1;
        set_row (_i,"@18g%s", bil->gruppo);
        set_row (_i,"@22g%s", bil->conto);
        set_row (_i,"@26g%s", bil->sottoc);
        set_row (_i,"@33g%s", (const char*) descr_sottoc);
        set_row (_i,"@84g%r", &_sale);
        if (_annoeserafr != 0 || _databilrafr != botime)
          set_row (_i,"@110g%r", &_salerafr);
        _i++;
      }  
    }
    else
    {                                                  
      if (!_intera_struttura || (_intera_struttura && bil->gruppo[0] != 'Z'))
      {
        _cont_gcs += 1;
        if ((sezione != '0')&&(lettera == ' ')&&(numrom == "")&&(numero == 0))
          descr_classe = _descr_sez;
        if ((sezione != '0')&&(lettera != ' ')&&(numrom == "")&&(numero == 0))
          descr_classe = descr_let;
        if ((sezione != '0')&&(lettera != ' ')&&(numrom != "")&&(numero == 0))
          descr_classe = descr_numr;
        if ((sezione != '0')&&(lettera != ' ')&&(numrom != "")&&(numero != 0))
          descr_classe = descr_num;
        if (descr_classe != descr_sottoc)
        {                       
          set_row (_i,"@20g%s", (const char*) descr_sottoc);
          set_row (_i,"@84g%r", &_sale);
          if (_annoeserafr != 0 || _databilrafr != botime)
            set_row (_i,"@110g%r", &_salerafr);
          _i++;
        } 
      }
    } 
  }
}

void CG1600_application::setta_righe_verifica()
{
  struct bil_ivd* bil = (struct bil_ivd*) _buff;
  int numeror, numero, gruppo, conto;
  char sezione,lettera,tmcf;
  long sottoc;
  TString numrom,numr;
  TString descr_let,descr_numr,descr_num,descr_sottoc,descr_classe;
  TString lettera1 = "@1g)@3g%s";
  TString lettera2 = "@3g%s";
  TString numr1    = "@8g)@10g%s";
  TString numr2    = "@10g%s";
  TString num      = "@2g)@4g%s";
  TString num2     = "@4g%s";
  
  _descr->set_width(35);
 
  sezione = bil->sez;
  lettera = bil->let;
  numr = bil->numr;
  numeror = atoi(bil->numr);
  numrom  = itor(numeror);
  numero  = atoi(bil->num);
//  num     = bil->num;
  gruppo  = atoi(bil->gruppo);
  conto   = atoi(bil->conto);
  sottoc  = atoi(bil->sottoc);
  tmcf    = bil->tipocf;
  descr_let  = descrizione_lettera(sezione,lettera);
  descr_numr = descrizione_numeroromano(sezione,lettera,numeror);
  descr_num  = descrizione_numero(sezione,lettera,numeror,numero);
  if ((tmcf == 'C') || (tmcf == 'F')) 
  {                     
    if (gruppo != 0 && conto != 0 && sottoc != 0)
    {
      TConto tc (gruppo,conto,sottoc,tmcf);
      descr_sottoc = tc.descrizione();
    }
    else
      descr_sottoc = descrizione_sottoconto(gruppo,conto,sottoc);
  }
  else
    descr_sottoc = descrizione_sottoconto(gruppo,conto,sottoc);
  
  *_d = (const char*) descr_sottoc;
  
  //Se la classe prelevata dal record corrente del sort e' diversa dalla classe
  //prelevata dal record precedente, allora stampo la nuova classe con i relativi
  //sottoconti. In caso contrario continuo a stampare solo i sottoconti.

  if (_sez_da_stamp != _sez_stamp)
  {
    char app = ' ';
    set_row (_i,"@0g%c", app);
    set_row (_i++,"@48g!@81g!@114g!");       
    if ((_sez_da_stamp=='1')||(_sez_da_stamp=='2')||(_sez_da_stamp== '9'))
    {
      if (_let_da_stamp != 'Z')
      {      
        if (!_intera_struttura || (_intera_struttura && bil->gruppo[0] != 'Z'))
        {
          _cont_let  = 1;
          _cont_numr = 1;
          _cont_num  = 1;
          _cont_gcs  = 0;
        }
        if (lettera != '\0')
        {
          set_row(_i,"@0g%c", bil->let);
          *_descr = (const char*) descr_let;   
          setta_righe_descr_verifica(_descr,lettera1,lettera2);
          //set_row(_i,"@1g)@3g%s", (const char*) descr_let);
          //set_row (_i++,"@48g!@81g!@114g!");
        }
        if (numrom != "")
        {
          set_row(_i,"@0g%8s", (const char*) numrom);
          *_descr = (const char*) descr_numr;
          setta_righe_descr_verifica(_descr,numr1,numr2);
          //set_row(_i,"@8g)@10g%s", (const char*) descr_numr);
          //set_row (_i++,"@48g!@81g!@114g!");
        }
        if (numero != 0)
        {
          set_row(_i,"@0g%s", bil->num);
          *_descr = (const char*) descr_num;
          setta_righe_descr_verifica(_descr,num,num2);
          //set_row(_i,"@2g)@4g%s", (const char*) descr_num);
          //set_row (_i++,"@48g!@81g!@114g!");
        }
      }
    }
  }
  else
    if ((_let_da_stamp!=_let_stamp)&&(_sez_da_stamp==_sez_stamp))
    {
      char app = ' ';
      set_row (_i,"@0g%c", app);
      set_row (_i++,"@48g!@81g!@114g!");   
      if ((_sez_da_stamp=='1')||(_sez_da_stamp=='2')||(_sez_da_stamp=='9'))
      {
        if (_let_da_stamp != 'Z')
        {
          set_row(_i,"@0g%c", bil->let);
          *_descr = (const char*) descr_let;   
          setta_righe_descr_verifica(_descr,lettera1,lettera2);
          //set_row(_i,"@1g)@3g%s", (const char*) descr_let);
          //set_row (_i++,"@48g!@81g!@114g!");
          //_cont_let += 1;
          if (!_intera_struttura || (_intera_struttura && bil->gruppo[0] != 'Z'))
          { 
            _cont_numr = 1;
            _cont_num  = 1;
            _cont_gcs  = 0;
          }
       
          if (numrom != "")
          {
            set_row(_i,"@0g%8s", (const char*) numrom);
            *_descr = (const char*) descr_numr;
            setta_righe_descr_verifica(_descr,numr1,numr2);
            //set_row(_i,"@8g)@10g%s", (const char*) descr_numr);
            //set_row (_i++,"@48g!@81g!@114g!");
          }
          if (numero != 0)
          {
            set_row(_i,"@0g%s", bil->num);
            *_descr = (const char*) descr_num;
            setta_righe_descr_verifica(_descr,num,num2);
            //set_row(_i,"@2g)@4g%s", (const char*) descr_num);
            //set_row (_i++,"@48g!@81g!@114g!"); 
          }
        }
      }
    }
    else
      if ((_numr_da_stamp!=_numr_stamp)&&(_sez_da_stamp==_sez_stamp)&&(_let_da_stamp==_let_stamp))
      {
        char app = ' ';
        set_row (_i,"@0g%c", app);   
        set_row (_i++,"@48g!@81g!@114g!");
        if ((_sez_da_stamp=='1')||(_sez_da_stamp=='2')||(_sez_da_stamp=='9'))
        {
          if (_let_da_stamp != 'Z')
          {
            set_row(_i,"@0g%8s", (const char*) numrom);
            *_descr = (const char*) descr_numr;
            setta_righe_descr_verifica(_descr,numr1,numr2);
            //set_row(_i,"@8g)@10g%s", (const char*) descr_numr);
            //set_row (_i++,"@48g!@81g!@114g!");
            //_cont_numr += 1; 
            //_cont_numr = 1;
            if (!_intera_struttura || (_intera_struttura && bil->gruppo[0] != 'Z'))
            {
              _cont_num  = 1;
              _cont_gcs  = 0;
            }
       
            if (numero != 0)
            {
              set_row(_i,"@0g%s", bil->num);
              *_descr = (const char*) descr_num;
              setta_righe_descr_verifica(_descr,num,num2);
              //set_row(_i,"@2g)@4g%s", (const char*) descr_num);
              //set_row (_i++,"@48g!@81g!@114g!");
            }
          }
        }
      }
      else
        if ((_num_da_stamp!=_num_stamp)&&(_sez_da_stamp==_sez_stamp)&&(_let_da_stamp==_let_stamp)&&(_numr_da_stamp==_numr_stamp))
        {
          char app = ' ';
          set_row (_i,"@0g%c", app);  
          set_row (_i++,"@48g!@81g!@114g!"); 
          if ((_sez_da_stamp=='1')||(_sez_da_stamp=='2')||(_sez_da_stamp=='9'))
          {
            if (_let_da_stamp != 'Z')
            {
              set_row(_i,"@0g%s", bil->num);
              *_descr = (const char*) descr_num;
              setta_righe_descr_verifica(_descr,num,num2);
              //set_row(_i,"@2g)@4g%s", (const char*) descr_num);
              //set_row (_i++,"@48g!@81g!@114g!");
              _cont_num += 1;
              _cont_gcs = 0;
            }
          }
        }
  if (bil->gruppo[0] != 'A')
  {
    if (!_stampacod)
    {  
      if (!_intera_struttura || (_intera_struttura && bil->gruppo[0] != 'Z'))
      { 
        _cont_gcs += 1; 
        set_row (_i,"@0g%s", bil->gruppo);
        set_row (_i,"@4g%s", bil->conto);
        set_row (_i,"@8g%s", bil->sottoc);
        //set_row (_i,"@15g%-.33s", (const char*) descr_sottoc);
        set_row (_i,"@15g#a", _d);
        
        if (_dataini == _data_ini_ese)
        {
          //modifica del 27/11/1995
          if (_tipo_stampa == 2) //all'ultima immissione
          {
           real saldoini = _sld_prg_dare - _sld_prg_avere;
           if (saldoini >= ZERO)
             set_row(_i,"@49g%r", &saldoini);
           else
           {                                 
            saldoini = -saldoini;
            set_row(_i,"@65g%r", &saldoini);
           } 
          }
          else if (_tipo_stampa == 1) //per date limiti
          { 
           set_row(_i,"@49g%r", &_sld_prg_dare);
           set_row(_i,"@65g%r", &_sld_prg_avere);
          }
          //fine 
        } 
        else
        {
          set_row (_i,"@49g%r", &_sld_prg_dare);
          set_row (_i,"@65g%r", &_sld_prg_avere);
        } 
        
        set_row (_i,"@82g%r", &_mov_dare);
        set_row (_i,"@98g%r", &_mov_avere);
        if (_stampa_modulo)
        {
          if (_sez_saldo == 'D')
          {
            set_row (_i,"@115g%r", &_sale);
            set_row (_i,"@48g!@81g!@114g!@131g!");
          }
          else
            if (_sez_saldo == 'A')
            {
              set_row (_i,"@133g%r", &_sale);
              set_row (_i,"@48g!@81g!@114g!@131g!");
            }
        }
        else
        {
          set_row (_i,"@115g%r", &_sale);
          set_row (_i,"@131g%c", _sez_saldo);
          set_row (_i,"@48g!@81g!@114g!");
        } 
      }
    }
    else
    {  
      if (!_intera_struttura || (_intera_struttura && bil->gruppo[0] != 'Z'))
      { 
        _cont_gcs += 1;
        if ((sezione != '0')&&(lettera == ' ')&&(numrom == "")&&(numero == 0))
          descr_classe = _descr_sez;
        if ((sezione != '0')&&(lettera != ' ')&&(numrom == "")&&(numero == 0))
          descr_classe = descr_let;
        if ((sezione != '0')&&(lettera != ' ')&&(numrom != "")&&(numero == 0))
          descr_classe = descr_numr;
        if ((sezione != '0')&&(lettera != ' ')&&(numrom != "")&&(numero != 0))
          descr_classe = descr_num;
        if (descr_classe != descr_sottoc)
        {
          //set_row (_i,"@2g%s", (const char*) descr_sottoc);
          set_row (_i,"@2g#a", _d);
      
          if (_dataini == _data_ini_ese)
          {
            //modifica del 27/11/1995
            if (_tipo_stampa == 2)
            {
             real saldoini = _sld_prg_dare - _sld_prg_avere;
             if (saldoini >= ZERO)
               set_row(_i,"@49g%r", &saldoini);
             else                 
             {
              saldoini = -saldoini;
              set_row(_i,"@65g%r", &saldoini);
             }
            }
            else if (_tipo_stampa == 1)
            {
             set_row(_i,"@49g%r", &_sld_prg_dare);
             set_row(_i,"@65g%r", &_sld_prg_avere);
            } 
            //fine
          }                            
          else
          {
            set_row (_i,"@49g%r", &_sld_prg_dare);
            set_row (_i,"@65g%r", &_sld_prg_avere);
          }
          
          set_row (_i,"@82g%r", &_mov_dare);
          set_row (_i,"@99g%r", &_mov_avere);
          if (_stampa_modulo)
          {
            if (_sez_saldo == 'D')
            {
              set_row (_i,"@115g%r", &_sale);
              set_row (_i,"@48g!@81g!@114g!@131g!");
            }
            else 
              if (_sez_saldo == 'A')
              {
                set_row (_i,"@133g%r", &_sale);
                set_row (_i,"@48g!@81g!@114g!@131g!");
              }
          }
          else
          {
            set_row (_i,"@115g%r", &_sale);
            set_row (_i,"@131g%c", _sez_saldo);
            set_row (_i,"@48g!@81g!@114g!");
          }
        }
      }
    }
  }
}    

void CG1600_application::setta_righe_descr(TParagraph_string* str,const TString& formato,const TString& formato2)
{
  const char* r;
  int i = 1;

  while ((r = str->get()) != NULL)
  { 
    if (i == 1)
      set_row (_i,formato, r); 
    else
      if (i > 1)
        set_row (_i,formato2,r);
    _i++;           
    i++;
  } 
}

void CG1600_application::setta_righe_descr_verifica(TParagraph_string* str,const TString& formato,const TString& formato2)
{
  const char* r;
  int i = 1;

  while ((r = str->get()) != NULL)
  { 
    if (i == 1)
      set_row (_i,formato, r); 
    else
      if (i > 1)
        set_row (_i,formato2,r);      
        
    set_row (_i,"@48g!@81g!@114g!");    
    
    _i++;           
    i++;
  } 
}

const char* CG1600_application::descrizione_sezione(char sezione)
{
  TTable tabivd(TAB_IVD);
  TString dep, dep2;

  tabivd.zero();
  dep = format("%1c", sezione);
  tabivd.put("CODTAB", dep);
  tabivd.read();
  dep2 = tabivd.get("CODTAB");
  if (dep == dep2)
    tmp = tabivd.get("S0");
  else
    tmp = "";
  return tmp;
}

const char* CG1600_application::descrizione_lettera(char sezione, char lettera)
{
  TTable tabivd(TAB_IVD);
  TString dep, dep2;

  tabivd.zero();
  dep = format("%1c%1c", sezione, lettera);
  tabivd.put("CODTAB", dep);
  tabivd.read();
  dep2 = tabivd.get("CODTAB");
  if (dep == dep2)
    tmp = tabivd.get("S0");
  else
    tmp = "";
  return tmp;
}

const char* CG1600_application::descrizione_numeroromano(char sezione, char lettera, int numr)
{
  TTable tabivd(TAB_IVD);
  TString dep, dep2;

  tabivd.zero();    
  if (numr != 0)
    dep = format("%1c%1c%04d", sezione, lettera, numr);
  else
    dep = format("%c%c    ", sezione, lettera);
    
  tabivd.put("CODTAB", dep);
  tabivd.read();
  dep2 = tabivd.get("CODTAB");
  if (dep == dep2)
    tmp = tabivd.get("S0");
  else
    tmp = "";
  return tmp;
}

const char* CG1600_application::descrizione_numero(char sezione, char lettera, int numr, int numero)
{
  TTable tabivd(TAB_IVD);
  TString dep,dep2;

  tabivd.zero();            
  if (numr != 0)
    dep = format("%1c%1c%04d%02d",sezione, lettera, numr, numero);
  else
    dep = format("%c%c    %02d",sezione,lettera,numero);
  tabivd.put("CODTAB", dep);
  tabivd.read();   
  dep2 = tabivd.get("CODTAB");
  if (dep == dep2)
    tmp = tabivd.get("S0");
  else
    tmp = "";
  return tmp;
}

const char* CG1600_application::descrizione_sottoconto(int gruppo, int conto, long sottoc)
{
  TLocalisamfile pconti (LF_PCON);

  pconti.zero();
  pconti.put(PCN_GRUPPO    , gruppo);
  if (conto != 0)
    pconti.put(PCN_CONTO     , conto );
  if (sottoc != 0)
    pconti.put(PCN_SOTTOCONTO, sottoc);
  pconti.read();
  if (pconti.bad())
    pconti.zero();
  tmp = pconti.get(PCN_DESCR);
  return tmp;
}

const char* CG1600_application::descr_sottoc_clifo(char tipocf,long s)
{
  TLocalisamfile clifo (LF_CLIFO);

  clifo.zero();
  clifo.put(CLI_TIPOCF,tipocf);
  if (s != 0)
    clifo.put(CLI_CODCF, s);
  clifo.read();
  if (clifo.bad())
    clifo.zero();
  tmp = clifo.get(CLI_RAGSOC);
  return tmp;
}

void CG1600_application::preprocess_header()
{  
}

// Crea l'intestazione per la stampa a 132 e a 198 caratteri

void CG1600_application::crea_intestazione()
{
  TString datastampastr;
  TString sep(132),sep1(147);

  TString app(8);
  TLocalisamfile nditte (LF_NDITTE);
  TLocalisamfile comuni (LF_COMUNI);
  TLocalisamfile unloc (LF_UNLOC);
  TLocalisamfile anag (LF_ANAG);
  TString codice_ditta,ragsoc,indulc,civulc,capulc,com,prov,comulc;
  TString cofi,paiv,tipoa,codanagr;  

  reset_header();
  
  nditte.setkey(1);
  codice_ditta << get_firm();
  nditte.curr().zero();
  nditte.curr().put(NDT_CODDITTA,codice_ditta);
  nditte.read();
  app=nditte.curr().get(NDT_CODDITTA);
  ragsoc=nditte.curr().get(NDT_RAGSOC);
  tipoa =nditte.curr().get(NDT_TIPOA);
  codanagr = nditte.get(NDT_CODANAGR);
  
  unloc.setkey(1);
  unloc.curr().zero();
  unloc.curr().put(ULC_CODDITTA,app);
  unloc.curr().put(ULC_CODULC,"1");
  unloc.read();
  indulc=unloc.curr().get(ULC_INDULC);
  civulc=unloc.curr().get(ULC_CIVULC);
  capulc=unloc.curr().get(ULC_CAPULC);
  comulc=unloc.curr().get(ULC_COMULC);
  
  comuni.setkey(1);
  comuni.curr().zero();
  comuni.curr().put(COM_COM,comulc);
  comuni.read();
  com=comuni.curr().get(COM_DENCOM);
  prov=comuni.curr().get(COM_PROVCOM);

  anag.setkey(1); 
  anag.curr().zero();
  anag.curr().put(ANA_TIPOA,tipoa);
  anag.curr().put(ANA_CODANAGR,codanagr);
  anag.read();
  cofi=anag.curr().get(ANA_COFI);
  paiv=anag.curr().get(ANA_PAIV);

  set_header (1, "@0gDITTA@6g%-5s", (const char*) codice_ditta);
  set_header (1, "@12g%-45s", (const char*) ragsoc);
  set_header (1, "@59g%-25s", (const char*) indulc);
  set_header (1, "@86g%-9s", (const char*) civulc);
  set_header (1, "@97g%-5s", (const char*) capulc);
  set_header (1, "@103g%-25s", (const char*) com);
  set_header (1, "@129g%-3s", (const char*) prov);

  if (_stampa_modulo)
  {
    sep1 << "Pag. @#";
    sep1.right_just(139); 
    set_header(2,(const char*) sep1);
  }
  else
  {
    sep << "Pag. @#";
    sep.right_just(132); 
    set_header(2,(const char*) sep);
  }
  
  datastampastr = _datastampa.string();

  set_header (2,"@0gPartita iva@12g%-11s", (const char*) paiv);
  set_header (2,"@30gCodice fiscale@45g%-16s", (const char*) cofi);
  if (_stampa_modulo)
    set_header (2,"@131gData@136g%s",(const char*) datastampastr);
  else
    set_header (2,"@105gData@110g%s",(const char*) datastampastr);
  
  if (_tipo_bilancio == 1)
  {
    intesta_scalare();
  }
  else if (_tipo_bilancio == 2)
  {
    intesta_verifica();
  }
  
}

void CG1600_application::intesta_verifica_fissa()
{
  TString sep(132),app(32),sep1(147);

  if (_tipo_stampa == 1)
  {
    if (_dataini == _data_ini_ese)
      //set_header(5,"@57gSALDO INIZIALE@87gMOVIMENTI DEL PERIODO");
      set_header(5,"@54gMOVIMENTI DI APERTURA@87gMOVIMENTI DEL PERIODO");
    else if (_dataini > _data_ini_ese)
      set_header(5,"@54gPROGRESSIVI PRECEDENTI@87gMOVIMENTI DEL PERIODO");
  }
  else if (_tipo_stampa == 2)
    set_header(5,"@57gSALDO INIZIALE@87gMOVIMENTI DEL PERIODO");

  if (_stampa_modulo)
    set_header(5,"@129gSALDO");

  set_header(5,"@48g!@81g!@114g!");

  if (_stampa_modulo)
  {
    set_header(5,"@147g!");
    set_header(6,"@131g!@147g!");
  }
  
  set_header(6,"@48g!@81g!@114g!");
  app = "--------------------------------";
  if (_stampa_modulo)
  {
    set_header(6,"@49g%s@82g%s@115g%s", (const char*) app, (const char*) app,(const char*) app);
    set_header(7,"@1gdescrizione voce@48g!@57gDare@65g!@72gAvere@81g!@90gDare@98g!@105gAvere@114g!@122gDare@131g!@138gAvere@147g!");
    sep1.fill('-');                            //Stampa 132 - (sep(132))       
    set_header (8, (const char *) sep1);
  }
  else
  {
    set_header(6,"@49g%s@82g%s@122gSALDO", (const char*) app, (const char*) app);
    set_header(7,"@1gdescrizione voce@48g!@57gDare@65g!@72gAvere@81g!@90gDare@98g!@105gAvere@114g!");
    sep.fill('-');                            //Stampa 132 - (sep(132))       
    set_header (8, (const char *) sep);
  }
}

void CG1600_application::intesta_scalare()
{
  TString datalimitestr,databilrafrstr;
  TString sep(132);

  set_header (3,"@0gSTAMPA BILANCIO CONFORME ALLA IV DIRETTIVA");
  set_header (3,"@89gEsercizio@99g%d", _anno_esercizio);
  if (_annoeserafr != 0 || _databilrafr != botime)
  {
    set_header (3,"@115gEsercizio@125g%d", _anno_esercizio_raf);
    databilrafrstr = _databilrafr.string();
    set_header (4,"@112galla data@122g%s", (const char*) databilrafrstr);
  }
  if (_tipo_stampa == 1)
  {
    datalimitestr = _datalimite.string();
    set_header (4,"@86galla data@96g%s", (const char*) datalimitestr);  
  }
  else if (_tipo_stampa == 2)
    set_header (4,"@90gall'ultima immissione");

  sep.fill('-');                            //Stampa 132 - (sep(132))       
  set_header (5, (const char *) sep);
}

void CG1600_application::intesta_verifica()
{ 
  TString sep(132),sep1(147);

  set_header (3,"@0gBILANCIO DI VERIFICA IV DIRETTIVA");
  if (_tipo_stampa == 1)
  {
    TString datainistr  = _dataini.string();
    TString datafinestr = _datafine.string();
    set_header (3,"@43gdalla data@54g%s", (const char*) datainistr);
    set_header (3,"@65galla data@75g%s", (const char*) datafinestr);
  } 
  else if (_tipo_stampa == 2)
    set_header (3,"@42gall'ultima immissione");

  if (_stampa_modulo)
  {
    sep1.fill('-');                            //Stampa 132 - (sep(132))       
    set_header (4, (const char *) sep1);
  }
  else
  {
    sep.fill('-');                            //Stampa 132 - (sep(132))       
    set_header (4, (const char *) sep);
  }
  intesta_verifica_fissa();
}

void CG1600_application::init_sort()
{
  _bil = new bil_ivd;
  _sort = new TSort (sizeof(bil_ivd));
  
  _sort -> addsortkey ((char*)&(_bil->sez)    - (char*)&(_bil->sez),1);
  _sort -> addsortkey ((char*)&(_bil->let)    - (char*)&(_bil->sez),1);
  _sort -> addsortkey ((char*)&(_bil->numr)   - (char*)&(_bil->sez),4);
  _sort -> addsortkey ((char*)&(_bil->num)    - (char*)&(_bil->sez),2);
  _sort -> addsortkey ((char*)&(_bil->gruppo) - (char*)&(_bil->sez),3);
  _sort -> addsortkey ((char*)&(_bil->conto)  - (char*)&(_bil->sez),3);
  _sort -> addsortkey ((char*)&(_bil->sottoc) - (char*)&(_bil->sez),6);
  _sort->init();
}

bool CG1600_application::user_create()
{
  _nditte  = new TLocalisamfile (LF_NDITTE);
  _comuni  = new TLocalisamfile (LF_COMUNI);
  _unloc   = new TLocalisamfile (LF_UNLOC);
  _anag    = new TLocalisamfile (LF_ANAG);
  _pconti  = new TLocalisamfile (LF_PCON);
  _clifo   = new TLocalisamfile (LF_CLIFO); 
  _saldi   = new TLocalisamfile (LF_SALDI);
  _caus    = new TLocalisamfile (LF_CAUSALI); 
  _descr   = new TParagraph_string("",40);
  _d       = new TParagraph_string("",33);
  _tabivd  = new TTable (TAB_IVD);
  _tabesc  = new TTable (TAB_ESC);
  
  _anni_es = new Anni_es();
  _sld     = new TSaldo();
  
  _msk     = new TMask("cg1600a");
  
  return TRUE;
}

bool CG1600_application::user_destroy()
{
  delete  _msk;

  delete _tabivd;
  delete _tabesc;
  delete _nditte;
  delete _comuni;
  delete _unloc;
  delete _anag;
  delete _pconti;
  delete _clifo;
  delete _saldi; 
  delete _caus;                         
  delete _descr;
  delete _d;
  delete _anni_es;       
  delete _sld;
  
  return TRUE;
}

int cg1600 (int argc, char* argv[])
{

  CG1600_application a;

  a.run(argc, argv, "Stampa Bilancio IV direttiva CEE");
  return 0;
}


