#include <config.h>
#include <currency.h>
#include <prefix.h>
#include <defmask.h>
#include <printer.h>
#include <recarray.h>
#include <tabapp.h>

#include "../cg/cglib03.h"

#include "batbreg.h" 
#include "batbcam.h" 
#include "batbdel.h"
#define F_NUM                           104
#include "batbval.h" 
#include "batbver.h"
#include "batbnoc.h"
#include "batbnot.h"
#define F_PREZZO        107

#define REG_JOURNAL 5
#define REG_DICHINT  10
#define TAB_BANCHE      "%BAN"
#define TAB_CAMBI       "CAM"
#define TAB_DELEGHE     "%DEL"
#define TAB_DET         "%DET"
#define TAB_IVDIRETTIVA "%IVD"
#define TAB_REGISTRI    "REG"
#define TAB_VALUTE      "%VAL"
#define TAB_VERSAMENTI  "%VER"
#define TAB_GRMERC      "GMC"
#define TAB_NOMENCOMB   "%NOC"
#define TAB_NOTECLI     "%NOT"
#define TAB_PREST       "PRS"
#define TAB_SPESE       "SPP"

class TGeneric_table_app : public TTable_application
{
  long       _oldditta;
  int        _oldanno;
  bool       _exist_journal;
  bool       _exist_dich_int;
  bool       _stampa_intest;

  // ------------- specifiche tabella versamenti ed interessi IVA
  void load_rec_in_disabled_fields(TMask& m);
  void copy_rec_in_insert_fields(TMask& m);
  // ------------------------------------------------------------

protected:  // TRelation_application
  virtual bool user_destroy() ;
  virtual bool user_create() ;
  virtual bool protected_record(TRectype& rec) ;
  virtual void init_insert_mode(TMask& m) ;
  virtual void init_modify_mode(TMask& m);
  virtual void init_query_mode (TMask&);
  virtual int read(TMask& m);
  virtual int write(const TMask& m);
  virtual int rewrite(const TMask& m);
  
protected:
  static bool valute_decimals_handler(TMask_field& f, KEY k);
  static bool change_decimals_handler(TMask_field& f, KEY k);
  static bool codcab_handler(TMask_field& f, KEY k);
  static bool codmag_handler(TMask_field& f, KEY k);
  static bool codgmc_handler(TMask_field& f, KEY k);
  static bool codnoc_handler(TMask_field& f, KEY k);
  static bool desnot_handler(TMask_field& f, KEY k);
  static bool numivd_handler(TMask_field& f, KEY k);

  void fragment_string();
  void glue_string();

public:
  bool exist_journal() { return _exist_journal; }
  bool exist_dich_int() { return _exist_dich_int; }
  char frequenza_versamenti(long firm, int year) const;
  
  TGeneric_table_app();
  virtual ~TGeneric_table_app() {}
};

HIDDEN inline TGeneric_table_app& app() { return (TGeneric_table_app&)main_app(); }

TGeneric_table_app::TGeneric_table_app() 
                  : _exist_journal(FALSE), _stampa_intest(FALSE)
{
}

// - tabella versamenti-specific -------------------------------
void TGeneric_table_app::load_rec_in_disabled_fields(TMask& m)
// carica il record del periodo precedente a quello immesso
// nei campi disabilitati relativi.
{                 
  TTable ver(TAB_VERSAMENTI);

  TString16 key(m.get(F_ANNOES));
  key << m.get(F_MESEES);
  
  ver.put("CODTAB",key);
  if (ver.read(_isgteq) == _iseof) // Se non lo trova si posiziona sull'ultimo
    ver.last();
  else
    ver.prev(); // altrimenti legge il periodo precedente. 
  if (ver.good()) // se si e' immesso un periodo precedente al primo , non copiera' nulla
  {
    m.set(F_1_TRIMESTRE_P,ver.get("R0"));
    m.set(F_2_TRIMESTRE_P,ver.get("R1"));
    m.set(F_3_TRIMESTRE_P,ver.get("R2"));
    m.set(F_4_TRIMESTRE_P,ver.get("R3"));
    m.set(F_ANNUALE_P,ver.get("R4"));
    m.set(F_I_PERIODO_P,ver.get("R5"));
    m.set(F_I_ANNUALE_P,ver.get("R6"));
    m.set(F_I_ACCONTO_P,ver.get("R7"));
    m.set(F_I_INTEGRATIVO_P,ver.get("R8"));
    m.set(F_I_CESSAZIONE_P,ver.get("R9"));
    m.set(F_I_ART74_P,ver.get("R10"));
    m.set(F_P_LIQ_NORMALE_P,ver.get("R11"));
    m.set(F_P_LIQ_DIFFERI_P,ver.get("R12"));
  }
}

void  TGeneric_table_app::copy_rec_in_insert_fields(TMask& m)
{
  TString tmp;

  tmp = m.get(F_1_TRIMESTRE_P);    m.set(F_1_TRIMESTRE, tmp);
  tmp = m.get(F_2_TRIMESTRE_P);    m.set(F_2_TRIMESTRE, tmp);
  tmp = m.get(F_3_TRIMESTRE_P);    m.set(F_3_TRIMESTRE, tmp);
  tmp = m.get(F_4_TRIMESTRE_P);    m.set(F_4_TRIMESTRE, tmp);
  tmp = m.get(F_ANNUALE_P);        m.set(F_ANNUALE, tmp);
  tmp = m.get(F_I_PERIODO_P);      m.set(F_I_PERIODO,tmp);
  tmp = m.get(F_I_ANNUALE_P);      m.set(F_I_ANNUALE,tmp);
  tmp = m.get(F_I_ACCONTO_P);      m.set(F_I_ACCONTO,tmp);
  tmp = m.get(F_I_INTEGRATIVO_P);  m.set(F_I_INTEGRATIVO,tmp);
  tmp = m.get(F_I_CESSAZIONE_P);   m.set(F_I_CESSAZIONE,tmp);
  tmp = m.get(F_I_ART74_P);        m.set(F_I_ART74,tmp);
  tmp = m.get(F_P_LIQ_NORMALE_P);  m.set(F_P_LIQ_NORMALE,tmp);
  tmp = m.get(F_P_LIQ_DIFFERI_P);  m.set(F_P_LIQ_DIFFERI,tmp);
}
// -------------------------------------------------------------

void TGeneric_table_app::init_insert_mode(TMask& m) 
{
  const TString& n = get_tabname();
  if (n == TAB_REGISTRI)
  {
    const long ditta = get_firm();
    const int anno = m.get_int(F_ANNO);

    m.set(F_STAMPA_INTESTAZIONE, _stampa_intest ? "X" : "");


      TTable reg(TAB_REGISTRI);
      reg.put("CODTAB", m.get(F_ANNO));

      const TRectype to(reg.curr());

      _exist_journal = FALSE;
      _exist_dich_int = FALSE;

      for (reg.read(_isgteq); !_exist_journal && reg.good() && reg.curr() <= to; reg.next())
        _exist_journal = (reg.get_long("I0") == REG_JOURNAL);
			reg.zero();
      reg.put("CODTAB", m.get(F_ANNO));
      for (reg.read(_isgteq); !_exist_dich_int && reg.good() && reg.curr() <= to; reg.next())
        _exist_dich_int = (reg.get_long("I0") == REG_DICHINT);
  }
	else
		if (n == TAB_VERSAMENTI)
		{
			// Se il record e' nuovo prima carica il record precedente
			load_rec_in_disabled_fields(m);
			// poi copia il contenuto nei campi di input, come valori predefiniti
			copy_rec_in_insert_fields(m);
		}
		else
		  if (n == TAB_VALUTE)
				m.enable(-3);
}

void TGeneric_table_app::init_modify_mode(TMask& m) 
{             
  Tab_application::init_modify_mode(m);
  const TString& n = get_tabname();
  if (n == TAB_REGISTRI)
  {                    
    TString16 config;
    config.format("REG%05ld", m.get_long(F_CODDITTA));
    config << m.get(F_CODICE);
    TConfig ini(CONFIG_STAMPE, config);              
    const int what = ini.get_int("Type", NULL, -1, -1);
    m.set(F_CONFIG, what >= 0 ? "X" : "");
    m.enable(F_CONFIG, what >= 0);
  } else
  if (n == TAB_VALUTE)
  {
    m.disable(-3);  // Disabilita scelta decimali e contro-euro
  } else
  if (n == TAB_VERSAMENTI)         
  {
    load_rec_in_disabled_fields(m);
  }
  if (n == TAB_DET)         
	{
	  const bool prot = get_relation()->curr().get_bool(FPC);

		m.enable(DLG_SAVEREC, !prot);
		m.enable(DLG_DELREC, !prot);
	}
}  

void TGeneric_table_app::init_query_mode(TMask& m)
{
  Tab_application::init_query_mode(m);
  if (get_tabname() == TAB_DELEGHE)
  {
    m.show(F_BANCA1);
    m.show(F_BANCA2);
    m.show(F_CONCESSIONE);
  }
}

bool TGeneric_table_app::protected_record(TRectype& rec) 
{ 
  bool prot = rec.get_bool(FPC);
  if (!prot)
  {
    if (get_tabname() == TAB_IVDIRETTIVA)  // Impedisce la cancellazione di una classe se ha sottoclassi
    {               
      TLocalisamfile& f = get_relation()->lfile();               
      const TRecnotype pos = f.recno();
      const TString16 cod(rec.get("CODTAB"));
      const int err = f.next();
      if (err == NOERR)
      {
        TString16 next(f.get("CODTAB")); next.cut(cod.len());
        prot = cod == next;
      }  
      f.readat(pos);
    }
  }
  return prot;
}

HIDDEN bool tiporeg_handler(TMask_field& f, KEY k)
{
	const int tipo = atoi(f.get());
  if ((k == K_TAB || k == K_ENTER) && app().exist_journal() && (tipo == REG_JOURNAL))
    return f.error_box(TR("Non e' possibile avere due registri giornale nello stesso anno"));
  if ((k == K_TAB || k == K_ENTER) && app().exist_dich_int() && (tipo == REG_DICHINT))
    return f.error_box(TR("Non e' possibile avere due registri dichiarazioni d'intenti nello stesso anno"));
  if (k == K_SPACE)
		f.mask().enable_page(1, tipo != REG_DICHINT);
  return TRUE;
}

HIDDEN bool printer_handler(TMask_field& f, KEY k)
{        
  if (k == K_SPACE)
  {                  
    TMask& m = f.mask();
    if (!m.query_mode())
    {
      TString16 config;
      config.format("REG%05ld", m.get_long(F_CODDITTA));
      config << m.get(F_CODICE);
  
      if (config.len() > 8)                   // REG+ANNO+CODICE di tre caratteri
      {
        TPrinter& p = printer();
        p.set_printtype(winprinter);           // Force configuration update
        p.read_configuration(config);
        if (p.set())
        {
          m.enable(F_CONFIG);
          m.set(F_CONFIG, "X");
        }  
        p.read_configuration();
      }   
      else 
        return f.error_box(TR("Nessun registro selezionato")); 
    }    
  }
  return TRUE;  
}

char TGeneric_table_app::frequenza_versamenti(long firm, int year) const
{        
  char freq = 'M';
  
  TString16 key; key.format("%05ld%d", firm, year);
  TTable lia("%LIA");
  lia.put("CODTAB", key);
  if (lia.read() != NOERR)
  { 
    TLocalisamfile nditte(LF_NDITTE);
    nditte.put("CODDITTA", firm);
    nditte.read();
    freq = nditte.get_char("FREQVIVA");
  }
  else 
    freq = lia.get_char("S7");
  CHECK(freq == 'M' || freq == 'T', "Frequenza versamenti IVA assurda");
  
  return freq;
}  

HIDDEN bool ditta_handler(TMask_field& f, KEY k)
{
  if (f.to_check(k))
  {
    const long ditta = atol(f.get());
    TFirm firm(ditta);
    f.mask().set(F_CODVAL, firm.codice_valuta());
  }
  return TRUE;
}

HIDDEN bool coddel_handler(TMask_field& f, KEY k)
{
  TMask& m = f.mask();
  
  if (!m.query_mode() && k == K_TAB)
  {
    const short id = f.dlg();
    const long cod = m.get_long(id == F_BANCA1 ? F_BANCA1 : F_CONCESSIONE);  
    
      if (cod != 0)
      {
        const long firm = m.get_long(F_DITTA);
        TLocalisamfile nditte(LF_NDITTE);
        nditte.put("CODDITTA", firm);
        if (nditte.read() == NOERR)
        { 
          const char tipoa = nditte.get_char("TIPOA");
          const long codan = nditte.get_long("CODANAGR");
          TLocalisamfile anag(LF_ANAG);
          anag.put("TIPOA", tipoa);
          anag.put("CODANAGR", codan);
          if (anag.read() == NOERR)
          {
            const bool titcf = anag.get_bool("TITCF");
            const bool isdel = anag.get_long("TIPOSTDEL") == 0l;
            
            if (titcf && isdel)
              return TRUE; // Se e' titolare CF e ha scelto la delega vanno abilitati sia 
                           // Il codice conc. che la banca
            if (id == F_CONCESSIONE)
            {
              if (!titcf)
              {
                m.hide(F_CONCESSIONE);
                f.error_box(TR("Concessione non ammessa senza conto fiscale"));
              }
              else
              {
                m.hide(F_BANCA1);
                m.hide(F_BANCA2);
              }
            }
            else
              m.hide(F_CONCESSIONE);
          }
        }
      }
  }
  return TRUE;
}

HIDDEN bool intdel_handler(TMask_field& f, KEY k)
{
  const TMask& m = f.mask();
  
  if (!m.query_mode() && k == K_ENTER)
  {                                            
    const long firm = m.get_long(F_DITTA);
    const int anno = m.get_int(F_ANNODEL); 
    const real imp(m.get(F_IMPORTO));
    const real intr(f.get());
    if (!intr.is_zero())
      if (app().frequenza_versamenti(firm, anno) == 'T')
      {
        TConfig cnf(CONFIG_DITTA, "cg");
        bool isintr = cnf.get_bool("InTrTr");
        if (isintr)
          return f.error_box(TR("Interessi non ammessi: ditta con NO calcolo interessi"));
      } 
      else return f.error_box(TR("Interessi non ammessi: ditta con versamenti mensili"));
    
    if (imp < intr)
      return f.error_box(TR("Incoerenza importo versato e interessi"));
    else if (!imp.is_zero() && imp == intr)
      return f.error_box(TR("Incoerenza importo versato e interessi"));
  }
  return TRUE;
}                       

HIDDEN bool impdel_handler(TMask_field& f, KEY k)
{
  const TMask& m = f.mask();

  if (!m.query_mode() && f.to_check(k))
  { 
    const int anno = m.get_int(F_ANNODEL); 
    const int tipo_del = m.get_int(F_TIPODEL); 
    const long ditta = m.get_long(F_DITTA);
    TIva_round ir; ir.set_default_iva_mode(anno, tipo_del == 2, ditta);
                          
    real r(f.get());
    ir.round(r);
    f.set(r.string());
  }
  
  if (!m.query_mode() && k == K_ENTER)
  {                                            
    const int tipo_del = m.get_int(F_TIPODEL); 
    if (tipo_del == 1 || tipo_del == 7)
    { 
      TInteressi_IVA_table ver;
      const int mese_del = m.get_int(F_MESEDEL);
      real lim;
      
      if (ver.read(m.get_int(F_ANNODEL), (mese_del>12) ? 12 : mese_del) != NOERR)
        warning_box(FR("Errore %d in lettura tabella versamenti ed interessi."),ver.status());
      if (tipo_del == 1)
      {
        if (mese_del == 12) lim = ver.get(I_ANNUALE);
        else lim = ver.get(I_PERIODICO);
      }
      else lim = ver.get(I_ACCONTOIVA);
      const real imp(m.get(F_IMPORTO));
      if (imp < lim) 
        return f.yesno_box(FR("Importo inferiore a %s. Registrare ugualmente?"), lim.string("."));
    }
  }
  return TRUE;
}                       

HIDDEN bool mese_handler(TMask_field& f, KEY k)
{

  if (k == K_ENTER)
  {
    TMask& m = f.mask();
    const int vers = m.get_int(F_TIPODEL);
    if (vers == 1)
    {
      const int mese = m.get_int(F_MESEDEL);
      const long firm = m.get_long(F_DITTA);
      const int anno = m.get_int(F_ANNODEL);             
      
      if (app().frequenza_versamenti(firm, anno) == 'T')
      {
        TLocalisamfile nditte(LF_NDITTE);
        nditte.zero();
        nditte.put("CODDITTA",firm);
        if (nditte.read() == NOERR)
        {
          TString16 attprev = nditte.get("CODATTPREV");
          TLocalisamfile attiv(LF_ATTIV);
          attiv.zero();
          attiv.put("CODDITTA",firm); 
          attiv.put("CODATT",attprev);
          if (attiv.read() != NOERR) attiv.zero();
          bool benzinaio = attiv.get_bool("ART74_4");
          bool gest4 = FALSE;
          if (benzinaio) 
          {
            TConfig cnf(CONFIG_DITTA, "cg");
            gest4 = cnf.get_bool("GesT74");
          } 
          if (benzinaio && gest4)
          {
            if (mese != 3 && mese != 6 && mese != 9 && mese != 12 && mese != 13)       
            {
              TMask* mask = &m;
              mask->reset();
              return f.error_box(TR("Ditta trimestrale: indicare trimestre"));
            } 
          }
          else if (mese != 3 && mese != 6 && mese != 9 && mese != 13)   
          {
            TMask* mask = &m;
            mask->reset();
            return f.error_box(TR("Ditta trimestrale: indicare trimestre"));
          }
        }
      }
    }   
  } 
  return TRUE;
}

HIDDEN bool key_handler(TMask& m, KEY k)
{  
  // Per ora facciamo che il SHIFT+F12 attiva sempre il campo 3
  if (m.edit_mode())
  {
    if (k == K_SHIFT+K_F12)
      m.enable(-3);
  }
  return TRUE;
}

bool TGeneric_table_app::valute_decimals_handler(TMask_field& f, KEY k)
{
  if (k == K_SPACE)
  {     
    TMask& m = f.mask();
    const int dec = atoi(f.get());
    TReal_field& exc = (TReal_field&)m.efield(VAL_CHANGE);
    if (dec != exc.decimals())
    {
      exc.set_decimals(dec);
      exc.set(exc.get());
    }
    if (!m.is_running() && exc.empty())
      exc.set(m.get(VAL_CHANGE_OLD));
  }
  if (k == K_ENTER)
  {
    TMask& m = f.mask();
    real cambio(m.get(VAL_CHANGE));
    if (cambio > ZERO && m.get_bool(VAL_INEURO))
    {
      // Se il cambio e' espresso in EURO metto in R10 il valore in lire
      cambio = 1936.27 / cambio;
      cambio.round(5);
    }
    m.set(VAL_CHANGE_OLD, cambio);
  }
  return TRUE;
}

bool TGeneric_table_app::change_decimals_handler(TMask_field& f, KEY k)
{
  if (k == K_TAB && f.to_check(k, TRUE))
  {     
    TMask& m = f.mask();
    const int dec = m.get_int(FLD_TABCAM_I2);
    TReal_field& exc = (TReal_field&)f;
    if (dec != exc.decimals())
    {
      exc.set_decimals(dec);
      exc.set(exc.get());
    }
    if (!m.is_running() && exc.empty())
      exc.set(m.get(FLD_TABCAM_R10));
  }
  if (k == K_ENTER)
  {
    TMask& m = f.mask();
    real cambio(f.get());
    if (cambio > ZERO && m.get_bool(FLD_TABCAM_B1))
    {
      // Se il cambio e' espresso in EURO metto in R10 il valore in lire
      cambio = 1936.27 / cambio;
      cambio.round(5);
    }
    m.set(FLD_TABCAM_R10, cambio);
  }
  return TRUE;
}

bool TGeneric_table_app::codcab_handler(TMask_field& f, KEY k)
{                     
  if (k == K_ENTER && !f.empty())
  {
    TMask& m = f.mask();
    const TString& abi = m.get(f.dlg()-1);
    const TRectype& rec = cache().get(TAB_BANCHE, abi);
    if (rec.empty())
      return f.error_box(FR("Il codice ABI %s non esiste"), (const char*)abi);
  }
  return TRUE;
}

bool TGeneric_table_app::codmag_handler(TMask_field& f, KEY k)
{
  TMask& m = f.mask();
  if (m.query_mode() && k == K_ENTER)
  {
    const TString& codice = m.get(f.dlg()); //stringa immessa nella maschera
    const TString& codtab = cache().get("MAG", codice, "CODTAB"); //stringa cercata nella tabella
    if (codtab.empty()) //se non trovi la stringa in tabella (in codice magazzino non esiste->se in insert mode)
    {
      const int lungh = codice.len();
      if (lungh > 0 && lungh < 3)
        return f.error_box("Il codice magazzino deve avere obbligatoriamente lunghezza 3");
    }
  }
  return TRUE;
}

bool TGeneric_table_app::codgmc_handler(TMask_field& f, KEY k)
{
  TMask& m = f.mask();
  if (m.query_mode() && k == K_ENTER)
  {
    const TString& codice = m.get(f.dlg()); //stringa immessa nella maschera
    const TString& codtab = cache().get("GMC", codice, "CODTAB"); //stringa cercata nella tabella
    if (codtab.empty()) //se non trovi la stringa in tabella (in codice magazzino non esiste->se in insert mode)
    {
      const int lungh = codice.len();
      if (lungh > 0 && lungh < 3)
        return f.error_box("Il codice del gruppo merceologico deve avere obbligatoriamente lunghezza 3");
    }
  }
  return TRUE;
}

bool TGeneric_table_app::codnoc_handler(TMask_field& f, KEY k)
{
  if (f.to_check(k))
  {
    TString8 str; str << atoi(f.get());
    if (str.len() < f.size())
      str.right_just(f.size(), '0');
    f.set(str);
  }
  return true;
}

bool TGeneric_table_app::desnot_handler(TMask_field& f, KEY k)
{
  if (k == K_ENTER)
  {
    const TString& stringone = f.get();
    if (stringone.len() > 320)
      return f.error_box("La nota non puo' superare i 320 caratteri");
  }
  return true;
}
 
bool TGeneric_table_app::numivd_handler(TMask_field& f, KEY k)
{
  if (f.to_check(k))
  {
		const TString & val = f.get();
		
		if (val.not_empty())
		{
			if (!isdigit(val[0]) || !isdigit(val[1]))
				return error_box("i primi due caratteri devono eesere numerici");
		}
	}
	return true;
}

bool TGeneric_table_app::user_create()
{
  bool ok = TTable_application::user_create();
  if (ok) 
  {
    const TString& name = get_tabname();
    TMask& mask = *get_mask();
    
    if (name == TAB_DELEGHE) 
    {
      mask.set_handler(F_DITTA, ditta_handler);
      mask.set_handler(F_MESEDEL, mese_handler);    
      mask.set_handler(F_IMPORTO, impdel_handler);
      mask.set_handler(F_INTERESSI, intdel_handler);    
      mask.set_handler(F_BANCA1, coddel_handler);    
      mask.set_handler(F_CONCESSIONE, coddel_handler);
    }
    if (name == TAB_REGISTRI) 
    {
      mask.set_handler(F_TIPO, tiporeg_handler);
      mask.set_handler(F_PRINTER, printer_handler);
      
      TConfig st(CONFIG_STUDIO, "cg");
      _stampa_intest = st.get_bool("StiReg");
    }
    if (name == TAB_VALUTE) 
    {
      mask.set_handler(VAL_DECIMALS_CHANGE, valute_decimals_handler);
      mask.set_handler(key_handler);  // Handler dello SHIFT-F12  
    }
    if (name == TAB_CAMBI) 
    {
      mask.set_handler(FLD_TABCAM_S4, change_decimals_handler);
    }
   
    if (name == TAB_CAMBI)
      set_search_field(FLD_TABCAM_D0);

    if (name == TAB_BANCHE)
      mask.set_handler(102, codcab_handler);

    if (name == TAB_GRMERC)
      mask.set_handler(101, codgmc_handler);

    if (name == TAB_NOMENCOMB)
      mask.set_handler(NOC_CODICE2, codnoc_handler);

    if (name == TAB_NOTECLI)
      mask.set_handler(F_NOT_DESC, desnot_handler);

    if (name == TAB_IVDIRETTIVA)
      mask.set_handler(F_NUM, numivd_handler);
  }
  
  return ok;
}

//folle metodo per suddividere una stringa lunga in piu' stringhe corte da mettere nei campi
//stringa delle tabelle (per ora solo tabella %NOT)
void TGeneric_table_app::fragment_string()
{
  TMask& mask = *get_mask();
  TString stringone = mask.get(F_NOT_DESC);
  TRectype& rec = get_relation()->curr();
  TString4 fieldname;
  int tot_length = 0;
  stringone.replace('\n', (char)0xB6);
  for (int i = 0; i < 6; i++)
  {
    fieldname.format("S%d", i);
    const int length = rec.length(fieldname);
    const TString& pezzo = stringone.mid(tot_length, length);
    rec.put(fieldname, pezzo);
    tot_length += length;
  }
}

void TGeneric_table_app::glue_string()
{
  TMask& mask = *get_mask();
  TString stringone;
  TRectype& rec = get_relation()->curr();
  TString4 fieldname;
  for (int i = 0; i < 6; i++)
  {
    fieldname.format("S%d", i);
    stringone << rec.get(fieldname);
  }
  stringone.replace((char)0xB6, '\n');
  mask.set(F_NOT_DESC, stringone);
}

bool TGeneric_table_app::user_destroy()
{
  return Tab_application::user_destroy();
}

int TGeneric_table_app::read(TMask& m)
{
  int err = Tab_application::read(m);
	const TString & table_name = get_tabname();
  if (table_name == TAB_NOTECLI)
    glue_string();
	else
		if (table_name == TAB_SPESE || table_name == TAB_PREST)
		{
			if (get_relation()->lfile().get_real("R10") == ZERO)
				m.set(F_PREZZO, get_relation()->lfile().get("R0"));
		}
  return err;
}

int TGeneric_table_app::write(const TMask& m)
{
	const TString & table_name = get_tabname();

  if (table_name == TAB_NOTECLI)
    fragment_string();
	else
		if (table_name == TAB_SPESE || table_name == TAB_PREST)
			get_relation()->lfile().put("R0",	m.get(F_PREZZO));
  
  return Tab_application::write(m);
}

int TGeneric_table_app::rewrite(const TMask& m)
{
	const TString & table_name = get_tabname();

  if (table_name == TAB_REGISTRI && !m.get_bool(F_CONFIG))
  {
    TString16 config;
    config.format("REG%05ld", m.get_long(F_CODDITTA));
    config << m.get(F_CODICE);
    TConfig ini(CONFIG_STAMPE, config);
    const int what = ini.get_int("Type", NULL, -1, -1);
    if (what >= 0)
      ini.set("Type", -1);
  }

  if (table_name == TAB_NOTECLI)
    fragment_string();
	else
		if (table_name == TAB_SPESE || table_name == TAB_PREST)
			get_relation()->lfile().put("R0",	m.get(F_PREZZO));
  
  return Tab_application::rewrite(m);
}

int ba3100(int argc, char* argv[])
{
  TGeneric_table_app a;
  a.run(argc, argv, TR("Tabella"));
  return 0;
}