#include "cglib04.h"            
#include "cg6804.h"  
#include "cg6804a.h"

HIDDEN TVar_sc& app() { return (TVar_sc &) main_app(); }

TVar_sc::TVar_sc() : _control_rec(""), _trasf(""), _std(""), _numpart(""), _tmcf("")
{
}

char TVar_sc::TipoConto(int g, int c)
{
  TLocalisamfile pcon (LF_PCON);
  char tipo = ' ';
  
  pcon.setkey(1);
  pcon.zero();
  pcon.put(PCN_GRUPPO,     g);
  pcon.put(PCN_CONTO,      c);
  pcon.put(PCN_SOTTOCONTO, 0l);
  if (pcon.read() == NOERR)
    tipo = pcon.get_char(PCN_TMCF);

  return tipo;
}

bool TVar_sc::create()
{
  TApplication::create();

  _part       = new TLocalisamfile (LF_PARTITE);
  _scad       = new TLocalisamfile (LF_SCADENZE); 
  _pagsca     = new TLocalisamfile (LF_PAGSCA);  

  _rec_part   = new TRectype (LF_PARTITE);
  _rec_scad   = new TRectype (LF_SCADENZE);
  _rec_pagsca = new TRectype (LF_PAGSCA);
  
  _msk        = new TMask ("cg6804a");
  _mask       = new TMask ("cg6804b");
  
  TSheet_field& rp = (TSheet_field&)(_mask->field(F_RIGAPART));  
  rp.set_notify(a_notify);                          
  rp.sheet_mask().set_handler(101, tipocf_handler);  
  rp.sheet_mask().set_handler(104, codcf_handler);  
  rp.sheet_mask().set_handler(108, rifpart_handler);  
  rp.sheet_mask().set_handler(115, datareg_handler);  
  rp.sheet_mask().set_handler(111, codcaus_handler);  
  rp.sheet_mask().set_handler(109, datadoc_handler);  
  rp.sheet_mask().set_handler(110, numdoc_handler);  
  rp.sheet_mask().set_handler(117, contocl_handler);   
  rp.sheet_mask().set_handler(119, tipomov_handler);   
  rp.sheet_mask().set_handler(121, sezione_handler);   
  rp.sheet_mask().set_handler(123, tipopag_handler);   
  rp.sheet_mask().set_handler(122, datapag_handler);                   
  rp.sheet_mask().set_handler(124, codval_handler);   
  rp.sheet_mask().set_handler(125, datacam_handler);   
  rp.sheet_mask().set_handler(126, cambio_handler);               
  rp.sheet_mask().set_handler(100, gestione_handler);   
  rp.sheet_mask().set_handler(DLG_OK,     registra_dati_comuni);                
  rp.sheet_mask().set_handler(DLG_DELREC, elimina_partita);
  
  rp.swap_columns(105,106);
  rp.swap_columns(105,107);
  rp.swap_columns(105,108);
  rp.swap_columns(105,109);
  rp.swap_columns(105,110);

  _registrato = FALSE;
  _aperti     = FALSE;
  
  dispatch_e_menu (BAR_ITEM(1));

  return TRUE;
}

bool TVar_sc::destroy()
{              
  delete _mask;     
  delete _msk;
  delete _rec_part;
  delete _rec_scad;
  delete _rec_pagsca;
  delete _part;
  delete _scad;
  delete _pagsca;                          
//  delete _tab_reg;   
  if (_aperti)
  {
    delete _tpart;
    delete _tscad;
    delete _tpagsca;
  }
  
  return TApplication::destroy();
}                                

void TVar_sc::apri_temp_file()
{
  TString80 tmppart = "%";
  tmppart  << get_firm_dir();
  tmppart << "\\" << TEMP_PART;
  TString80 tmpscad = "%";
  tmpscad << get_firm_dir();         
  tmpscad << "\\" << TEMP_SCAD;  
  TString80 tmppagsca = "%";
  tmppagsca << get_firm_dir();     
  tmppagsca << "\\" << TEMP_PAGSCA;                     
    
  _tpart     = new TIsamtempfile(LF_PARTITE, tmppart, 0);
  _tscad     = new TIsamtempfile(LF_SCADENZE, tmpscad, 0);
  _tpagsca   = new TIsamtempfile(LF_PAGSCA, tmppagsca, 0); 
  _aperti = TRUE;
}

void TVar_sc::leggi_record_controllo()
{
  _tras_file.read_control_rec();
  _control_rec = _tras_file.record();
}

bool TVar_sc::main_loop()
{      
  _dittaric = get_firm();
  
  if (!esegui_controlli()) return FALSE;

  apri_temp_file();

  if (!video_SC())
  {
    if (_registrato)
    {
      setta_parametri_record(" ","C");
      leggi_record_controllo();
      TString str;
      str.spaces(60);
      _control_rec.overwrite(str,241);
      _tras_file.write_control_rec(_control_rec,1024);
    }
    return FALSE;                                       
  }  
  
  return FALSE;
}

bool TVar_sc::a_notify(TSheet_field& s, int r, KEY k)
{
  if (k == K_INS)
    return FALSE;
    
  return TRUE;
}   

bool TVar_sc::gestione_handler(TMask_field& f, KEY k)
{
  if (k == K_SPACE)
  {         
    TMask& m = f.mask();
    
    if (!m.check_fields()) return FALSE;
    
    char    tipocf  = f.mask().get     (101)[0];
    int     gruppo  = f.mask().get_int (102);
    int     conto   = f.mask().get_int (103);                      
    long    sottoc  = f.mask().get_long(104);
    int     anno    = f.mask().get_int (106);
    TString npart   = f.mask().get     (107);
    int     nriga   = f.mask().get_int (108);
    
    int     tipomov = f.mask().get_int (119);
    
    if (tipomov == 1)
    {
      TMask* msk = new TMask("cg6804d");    
      KEY   k;

      TSheet_field& rp = (TSheet_field&) msk->field(F_RIGASCAD);  
      rp.set_notify(a_notify);                          
      rp.sheet_mask().set_handler(109, nrata_handler);  
      rp.sheet_mask().set_handler(111, codpag_handler);  
      rp.sheet_mask().set_handler(112, tpscad_handler);  
      rp.sheet_mask().set_handler(113, ultclass_handler);  
      rp.sheet_mask().set_handler(110, datascad_handler);  
      rp.sheet_mask().set_handler(120, banca_handler);  
      rp.sheet_mask().set_handler(122, banca_handler);  
      rp.sheet_mask().set_handler(123, codag_handler);   
      rp.sheet_mask().set_handler(124, datasoll_handler);   
      rp.sheet_mask().set_handler(116, importo_handler);   
      rp.sheet_mask().set_handler(117, impval_handler);   
      rp.sheet_mask().set_handler(DLG_DELREC, elimina_scadenza);   

      rp.swap_columns(105,106);
      rp.swap_columns(105,107);
      rp.swap_columns(105,108);
      rp.swap_columns(105,109);
      rp.swap_columns(105,110);
      
      app().setta_mask_scad(tipocf,gruppo,conto,sottoc,anno,npart,nriga,*msk);      
     
      k = msk->run();                                                              

      switch (k)
      {
        case K_ESC :
          break;
        
        case K_QUIT :
          break;       
          
        case K_SAVE :
        {
          app().registra_scadenze(*msk);
          app()._registrato = TRUE;
        }
          break;
        
        default:
          break;
      }
      delete msk;
    }
    else
    {
      TMask* msk = new TMask("cg6804e");    
      KEY   k;

      TSheet_field& rp = (TSheet_field&) msk->field(F_RIGAPAGSCA);  
      rp.set_notify(a_notify);                          
      rp.sheet_mask().set_handler(110, rifpartita_handler);  
      rp.sheet_mask().set_handler(111, accsal_handler);  
      rp.sheet_mask().set_handler(113, importo_handler);  
      rp.sheet_mask().set_handler(120, impvalp_handler);  
      rp.sheet_mask().set_handler(131, passat_handler);  
      rp.sheet_mask().set_handler(127, banca_handler);  
      rp.sheet_mask().set_handler(129, banca_handler);  
      rp.sheet_mask().set_handler(130, codag_handler);   
      rp.sheet_mask().set_handler(124, contropartita_handler);   
      rp.sheet_mask().set_handler(115, ritenute_handler);
      rp.sheet_mask().set_handler(116, sezione_abb_handler);
      rp.sheet_mask().set_handler(117, abbuoni_handler);
      rp.sheet_mask().set_handler(118, sezione_dc_handler);  
      rp.sheet_mask().set_handler(119, diffcambio_handler);
      rp.sheet_mask().set_handler(DLG_DELREC, elimina_pagamenti);   

      rp.swap_columns(105,106);
      rp.swap_columns(105,107);
      rp.swap_columns(105,108);
      rp.swap_columns(105,109);
      rp.swap_columns(105,110);
      rp.swap_columns(105,111);      
      
      app().setta_mask_pagsca(tipocf,gruppo,conto,sottoc,anno,npart,nriga,*msk);      
      
      k = msk->run();                 
      
      switch (k)
      {
        case K_ESC :
          break;
        
        case K_QUIT :
          break;       
          
        case K_SAVE :
        {
          app().registra_pagamenti(*msk);
          app()._registrato = TRUE;
        }
          break;
        
        default:
          break;
      }
      delete msk;
    }
  }
  return TRUE;
}       

char TVar_sc::sezione(char tipo,int gruppo,int conto,long sottoc,int anno,const TString& npart,int nriga,TString& codval,TMask& m)
{
  char sez = '\0';

  TSheet_field& part = (TSheet_field&)m.field(F_RIGAPART);
    
  for (int i = 0 ; i < part.items(); i++)
  { 
    TToken_string& row = part.row(i);

    char    tp = row.get     (0)[0];
    int     g  = row.get_int (1);
    int     c  = row.get_int (2);
    long    s  = row.get_long(3);
    int     an = row.get_int (5);
    TString np = row.get     (6);
    int     nr = row.get_int (7);
    
    if (tipo == tp && gruppo == g && conto == c && sottoc == s &&
        anno == an && npart == np && nriga == nr)
    {          
      sez    = part.sheet_mask().get(121)[0];
      codval = part.sheet_mask().get(124);
      codval.trim();
      break;
    }  
  }
  return sez;
}

void TVar_sc::descr_condpag(const TString& codpag,int tipopag,const TString& ultclass,TString& d_condpag)
{
  if (ultclass.not_empty())
  {
    TTable clr ("%CLR");
    TString dep (format("%d%s", tipopag,(const char*) ultclass));
     
    clr.zero();
    clr.put("CODTAB", dep);
    if (clr.read() == NOERR)
      d_condpag = clr.get("S0");
    else
      d_condpag = "";
  }
  else
  {
    TTable rpg ("%RPG");
    int tipo;
      
    TString dep;
    for (int i = 0; !rpg.eof(); rpg.next(), i++)
    {
      dep.format("%-s%3d", (const char*) codpag, i);
    
      rpg.zero();
      rpg.put("CODTAB", dep);
      if (rpg.read() == NOERR)   
      {
        tipo = rpg.get_int("I1");
        if (tipo == tipopag)
        {
          switch(tipo)
          {
            case 1: d_condpag = "Rimessa diretta";
                    break;
            case 2: d_condpag = "Tratta";
                    break;
            case 3: d_condpag = "Ricevuta bancaria";
                    break;
            case 4: d_condpag = "Cessione";
                    break;
            case 5: d_condpag = "Paghero'";
                    break;
            case 6: d_condpag = "Lettera di credito";
                    break;
            case 7: d_condpag = "Tratta accettata";
                    break;
            case 8: d_condpag = "Rapporti interbancari diretti";
                    break;
            case 9: d_condpag = "Bonifico";
                    break;
            case 10: d_condpag = "Altro";
                     break;
            default: break;
          };
          break;
        }
      }  
      else
      {
        d_condpag = ""; 
        break;
      }
    } 
  }  
}

void TVar_sc::setta_mask_scad(char tipo,int gruppo,int conto,long sottoc,
                              int anno,const TString& numpart,int nriga,TMask& m)
{
  _tscad->setkey(1);
  _tscad->zero();
  _tscad->put(SCAD_TIPOCF,     tipo); 
  if (gruppo != 0)
    _tscad->put(SCAD_GRUPPO,     gruppo);
  if (conto != 0)
    _tscad->put(SCAD_CONTO,      conto);
  if (sottoc != 0)
    _tscad->put(SCAD_SOTTOCONTO, sottoc);
  if (anno != 0)
    _tscad->put(SCAD_ANNO,       anno);
  _tscad->put(SCAD_NUMPART,    numpart);
  if (nriga != 0)
    _tscad->put(SCAD_NRIGA,      nriga); 
    
  TRectype scadenza (_tscad->curr());  

  TSheet_field& scad = (TSheet_field&)m.field(F_RIGASCAD);
  const long last_c = _tscad->items();
  
  _tscad->read(_isgteq);
    
  for (int i = 0 ; !_tscad->eof(); _tscad->next(), i++)
  {           
    TString part_rec  = scadenza.get(SCAD_NUMPART);
    TString part_file = _tscad->get(SCAD_NUMPART);
    
    if (_tscad->curr() != scadenza || part_rec != part_file) break;
    
    TToken_string& row = scad.row(i);
    
    TString   tipoc     (_tscad->get     (SCAD_TIPOCF));
    int       nrata    = _tscad->get_int (SCAD_NRATA);
    TString16 datascad  (_tscad->get_date(SCAD_DATASCAD));
    TString16 codpag    (_tscad->get     (SCAD_CODPAG));
    int       tipopag  = _tscad->get_int (SCAD_TIPOPAG);
    TString   ultclass  (_tscad->get     (SCAD_ULTCLASS));
    real      importo   (_tscad->get_real(SCAD_IMPORTO));
    real      impval    (_tscad->get_real(SCAD_IMPORTOVAL));
    TString   descr     (_tscad->get     (SCAD_DESCR)); 
    long      nsabi    = _tscad->get_long(SCAD_CODABIPR);
    long      nscab    = _tscad->get_long(SCAD_CODCABPR);
    long      vsabi    = _tscad->get_long(SCAD_CODABI);
    long      vscab    = _tscad->get_long(SCAD_CODCAB);
    TString   codag     (_tscad->get     (SCAD_CODAG));
    TString16 datasoll  (_tscad->get_date(SCAD_DATASOLL));
    int       nsoll    = _tscad->get_int (SCAD_NSOLL);
    
    TString d_conto,d_condpag,codval;
    codval = "";

    char sez = sezione(tipo,gruppo,conto,sottoc,anno,numpart,nriga,codval,*_mask); 
    descr_conto(tipoc,gruppo,conto,sottoc,d_conto);
    descr_condpag(codpag,tipopag,ultclass,d_condpag);
    
    TString16 str;
    
    row.add(tipo);
    str.format("%3d", gruppo);
    row.add(str);
    str.format("%3d", conto);
    row.add(str);
    str.format("%6ld", sottoc);
    row.add(str);
    row.add(d_conto);
    str.format("%4d", anno);
    row.add(str);
    row.add(numpart);
    str.format("%4d", nriga);
    row.add(str);  
    str.format("%4d", nrata); 
    row.add(str);     
    row.add(datascad);
    row.add(codpag);
    str.format("%d", tipopag);
    row.add(str);
    row.add(ultclass);
    row.add(d_condpag);
    row.add(sez); 
    row.add(importo.string());
    row.add(impval.string());
    row.add(descr); 
    str.format("%5ld", nsabi);
    row.add(str); 
    str.format("%5ld", nscab);
    row.add(str);   
    str.format("%5ld", vsabi);
    row.add(str);   
    str.format("%5ld", vscab);
    row.add(str);
    row.add(codag);
    row.add(datasoll); 
    str.format("%2d", nsoll);
    row.add(str);
  } 
}

void TVar_sc::setta_mask_pagsca(char tipo,int gruppo,int conto,long sottoc,
                              int anno,const TString& numpart,int nriga,TMask& m)
{
  _tpagsca->setkey(1);
  _tpagsca->zero();
  _tpagsca->put(PAGSCA_TIPOC,      tipo); 
  if (gruppo != 0)
    _tpagsca->put(PAGSCA_GRUPPO,     gruppo);
  if (conto != 0)
    _tpagsca->put(PAGSCA_CONTO,      conto);
  if (sottoc != 0)
    _tpagsca->put(PAGSCA_SOTTOCONTO, sottoc);
  if (anno != 0)
    _tpagsca->put(PAGSCA_ANNO,       anno);
  _tpagsca->put(PAGSCA_NUMPART,    numpart);

  TRectype pagamenti (_tpagsca->curr());  

  TSheet_field& pag = (TSheet_field&)m.field(F_RIGAPAGSCA);
  const long last_c = _tpagsca->items();
  
  _tpagsca->read(_isgteq);
    
  for (int i = 0 ; !_tpagsca->eof(); _tpagsca->next(), i++)
  {                
    TString rec  = pagamenti.get(PAGSCA_NUMPART);
    TString file = _tpagsca->get(PAGSCA_NUMPART);
    
    if (_tpagsca->curr() != pagamenti || file != rec) break;
    
    int nrigp      = _tpagsca->get_int(PAGSCA_NRIGP); 
    int nriga_fatt = _tpagsca->get_int(PAGSCA_NRIGA);
    
    if (nriga != nrigp) continue;
    
    TToken_string& row = pag.row(i);
    
    TString   tipoc     (_tpagsca->get     (PAGSCA_TIPOC));
    int       nrata    = _tpagsca->get_int (PAGSCA_NRATA);
    TString16 accsal    (_tpagsca->get     (PAGSCA_ACCSAL));
    real      importo   (_tpagsca->get_real(PAGSCA_IMPORTO));
    real      ritenute  (_tpagsca->get_real(PAGSCA_RITENUTE));
    real      abbuoni   (_tpagsca->get_real(PAGSCA_ABBUONI));
    real      diffcam   (_tpagsca->get_real(PAGSCA_DIFFCAM));
    real      impval    (_tpagsca->get_real(PAGSCA_IMPORTOVAL));
    TString   tipocc    (_tpagsca->get     (PAGSCA_TIPOCC));
    int       gruppoc  = _tpagsca->get_int (PAGSCA_GRUPPOC);
    int       contoc   = _tpagsca->get_int (PAGSCA_CONTOC);
    long      sottocc  = _tpagsca->get_long(PAGSCA_SOTTOCONTC);
    long      nsabi    = _tpagsca->get_long(PAGSCA_CODABIPR);
    long      nscab    = _tpagsca->get_long(PAGSCA_CODCABPR);
    long      vsabi    = _tpagsca->get_long(PAGSCA_CODABI);
    long      vscab    = _tpagsca->get_long(PAGSCA_CODCAB);
    TString   codag     (_tpagsca->get     (PAGSCA_CODAG));
    char      passat   = _tpagsca->get_char(PAGSCA_PASSATT);
    
    TString d_conto,d_contoc,codval;
    char sezab = '\0';
    char sezdc = '\0';
    
    char sez = sezione(tipo,gruppo,conto,sottoc,anno,numpart,nriga,codval,*_mask);
    descr_conto(tipoc,gruppo,conto,sottoc,d_conto); 
    descr_conto(tipocc,gruppoc,contoc,sottocc,d_contoc);  // Contropartita
    
    if (abbuoni != ZERO)
    {             
      sezab;
      if (passat == 'A')
        sezab = 'D';
      else
        if (passat == 'P')
          sezab = 'A';
    
      if (sezab != sez)
        abbuoni = abbuoni * -1;
    }                                    
    if (diffcam != ZERO)
    {             
      sezdc = sez;
      if (diffcam < ZERO)
      {
        diffcam = diffcam * -1;
        if (sez == 'D')
          sezdc = 'A';
        else
          if (sez == 'A')
            sezdc = 'D';
      }
    }
    
    TString16 str;
    
    row.add(tipo);
    str.format("%3d", gruppo);
    row.add(str);
    str.format("%3d", conto);
    row.add(str);
    str.format("%6ld", sottoc);
    row.add(str);
    row.add(d_conto);
    str.format("%4d", anno);
    row.add(str);
    row.add(numpart);
    str.format("%4d", nriga_fatt);
    row.add(str);  
    str.format("%4d", nrata); 
    row.add(str); 
    str.format("%4d", nrigp);    
    row.add(str);
    row.add(accsal);
    str.format("%c", sez);
    row.add(str);
    row.add(importo.string());
    if (ritenute != ZERO)
      row.add(str);
    else
      row.add("");
    row.add(ritenute.string());  
    str.format("%c", sezab);    
    row.add(str);
    row.add(abbuoni.string()); 
    str.format("%c", sezdc);    
    row.add(str);
    row.add(diffcam.string()); 
    row.add(impval.string()); 
    row.add(tipocc);
    str.format("%3d", gruppoc);
    row.add(str);            
    str.format("%3d", contoc);
    row.add(str);
    str.format("%6ld", sottocc);
    row.add(str);   
    row.add(d_contoc);
    str.format("%5ld", nsabi);
    row.add(str); 
    str.format("%5ld", nscab);
    row.add(str);   
    str.format("%5ld", vsabi);
    row.add(str);   
    str.format("%5ld", vscab);
    row.add(str);
    row.add(codag);
    str.format("%c", passat);
    row.add(str);
  } 
}
                              
bool TVar_sc::video_SC()
{   
  KEY   tasto;
  
  do
  {      
    _msk->reset(F_ANNO);
    _msk->reset(F_NUMPART);
    _msk->reset(F_NRIGA);
    
    tasto = _msk->run();     
    
    if (tasto != K_ENTER) return FALSE;

    _tipocf  = _msk->get     (F_TIPOCF)[0];
    _gruppo  = _msk->get_int (F_GRUPPO);
    _conto   = _msk->get_int (F_CONTO);
    _sottoc  = _msk->get_long(F_SOTTOCONTO);
    _anno    = _msk->get_int (F_ANNO);
    _numpart = _msk->get     (F_NUMPART);
    _nriga   = _msk->get_int (F_NRIGA);
  
    setta_campi_maschera(*_mask);
                 
    _mask->force_update();
                 
    tasto = _mask->run();
      
    switch (tasto)
    {
      case K_ESC :
        break;
        
      case K_QUIT :
        break;       
        
      case K_SAVE :
      {
        registra_partita(*_mask);
        _registrato = TRUE;
      }
        break;
        
      default:
        break;
    }
  }
  while (tasto != K_QUIT);                              //K_ENTER
  
  return TRUE;
}

bool TVar_sc::descr_conto(const TString& tipo,int g,int c,long s,TString& d_conto)
{
  if (tipo == "C" || tipo == "F")
  {
    TLocalisamfile clifo (LF_CLIFO);
    
    clifo.setkey(1);
    clifo.zero();
    clifo.put(CLI_TIPOCF, tipo);
    clifo.put(CLI_CODCF,  s);
    if (clifo.read() == NOERR)
    {
      d_conto = clifo.get(CLI_RAGSOC);
      return TRUE;
    }
    else
    {
      d_conto = "";
      return FALSE;
    }
  } 
  else
  {
    TLocalisamfile pcon (LF_PCON);
    
    pcon.setkey(1);
    pcon.zero();
    pcon.put(PCN_GRUPPO,     g);
    pcon.put(PCN_CONTO,      c); 
    pcon.put(PCN_SOTTOCONTO, s);
    if (pcon.read() == NOERR)   
    {
      d_conto = pcon.get(PCN_DESCR);
      return TRUE;
    }
    else
    {
      d_conto = "";
      return FALSE;
    }
  }
  return TRUE;
}

bool TVar_sc::descr_caus(const TString& codcaus,TString& d_caus)
{
  TLocalisamfile cau (LF_CAUSALI);
  
  cau.setkey(1);
  cau.zero();
  cau.put("CODCAUS", (const char*) codcaus);
  if (cau.read() == NOERR) 
  {
    d_caus   = cau.get     (CAU_DESCR);  
    _dd_caus = cau.get_bool(CAU_DATADOC);
    _nd_caus = cau.get_bool(CAU_NUMDOC);
    _tm_caus = cau.get_int (CAU_TIPOMOV); 
    _movval  = cau.get_bool(CAU_MOVVAL);
    return TRUE;
  }
  else 
  {
   d_caus = "";            
   _dd_caus = FALSE;
   _nd_caus = FALSE;                     
   _tm_caus = 0;       
   _movval  = FALSE;
   return FALSE;
 }
   
 return TRUE;
}

bool TVar_sc::descr_contocl(int g,int c,TString& d_conto)
{
  TLocalisamfile pcon (LF_PCON);
    
  pcon.setkey(1);
  pcon.zero();
  pcon.put(PCN_GRUPPO,     g);
  pcon.put(PCN_CONTO,      c); 
  pcon.read();
  if ( (g == pcon.get_int(PCN_GRUPPO)) && (c == pcon.get_int(PCN_CONTO)) )
  {
    d_conto = pcon.get(PCN_DESCR);  
    return TRUE;
  }
  else
  {
    d_conto = "";                
    return FALSE;
  }  
  return TRUE;  
}

void TVar_sc::setta_campi_maschera(TMask& m)
{ 

  if (_gruppo == 0 && _conto == 0 && _sottoc == 0 && _anno == 0
      && _numpart.empty() && _nriga == 0)
  {
    _tpart->setkey(1);
    _tpart->zero();
    _tpart->first();
  }                 
  else
  {                                   
    _tpart->setkey(1);
    _tpart->zero();
    _tpart->put(PART_TIPOCF,     _tipocf); 
    if (_gruppo != 0)
      _tpart->put(PART_GRUPPO,     _gruppo);
    if (_conto != 0)
      _tpart->put(PART_CONTO,      _conto);
    if (_sottoc != 0)
      _tpart->put(PART_SOTTOCONTO, _sottoc);
    if (_anno != 0)
      _tpart->put(PART_ANNO,       _anno);
    _tpart->put(PART_NUMPART,    _numpart);
    if (_nriga != 0)
      _tpart->put(PART_NRIGA,      _nriga); 
    
    TRectype partita (_tpart->curr());  
    _tpart->read(_isgteq);
    if (_tpart->curr() != partita)
    {
      _tpart->zero();
      _tpart->first();
    }
  }

  TSheet_field& partita = (TSheet_field&)m.field(F_RIGAPART);
  const long last_c = _tpart->items(); 
  partita.destroy();
    
  for (int i = 0 ; !_tpart->eof(); _tpart->next(), i++)
  { 
    TToken_string& row = partita.row(i);
    
    TString16 tipoc     (_tpart->get     (PART_TIPOCF));
    int       gruppo   = _tpart->get_int (PART_GRUPPO);        
    int       conto    = _tpart->get_int (PART_CONTO);   
    long      sottoc   = _tpart->get_long(PART_SOTTOCONTO);
    int       anno     = _tpart->get_int (PART_ANNO); 
    TString16 numpart   (_tpart->get     (PART_NUMPART));
    int       nriga    = _tpart->get_int (PART_NRIGA);
    TString16 datareg   (_tpart->get_date(PART_DATAREG));
    TString16 codcaus   (_tpart->get     (PART_CODCAUS));
    int       gruppocl = _tpart->get_int (PART_GRUPPOCL);
    int       contocl  = _tpart->get_int (PART_CONTOCL);
    int       tipomov  = _tpart->get_int (PART_TIPOMOV); 
    TString   descr     (_tpart->get     (PART_DESCR));
    TString16 sezione   (_tpart->get     (PART_SEZ));
    TString16 datapag   (_tpart->get_date(PART_DATAPAG));
    TString16 codval    (_tpart->get     (PART_CODVAL));
    TString16 datacam   (_tpart->get_date(PART_DATACAM));
    TString16 numdoc    (_tpart->get     (PART_NUMDOC));
    TString16 datadoc   (_tpart->get_date(PART_DATADOC));
    int       tipopag  = _tpart->get_int (PART_TIPOPAG);
    real      cambio    (_tpart->get_real(PART_CAMBIO));
    long      numreg   = _tpart->get_long(PART_NREG);
    int       numrig   = _tpart->get_int (PART_NUMRIG);
    
    
    TString d_conto,d_caus,d_contocl;
    
    descr_conto(tipoc,gruppo,conto,sottoc,d_conto);
    descr_caus(codcaus,d_caus);
    descr_contocl(gruppocl,contocl,d_contocl);
    
    TString16 str;
    
    row.add(tipoc);
    str.format("%3d", gruppo);
    row.add(str);
    str.format("%3d", conto);
    row.add(str);
    str.format("%6ld", sottoc);
    row.add(str);
    row.add(d_conto);
    str.format("%4d", anno);
    row.add(str);
    row.add(numpart);
    str.format("%4d", nriga);
    row.add(str);        
    row.add(datadoc);
    row.add(numdoc);
    row.add(codcaus);
    row.add(d_caus); 
    str.format("%7ld", numreg);
    row.add(str);
    str.format("%3d", numrig);
    row.add(str);
    row.add(datareg); 
    str.format("%3d", gruppocl);
    row.add(str); 
    str.format("%3d", contocl);
    row.add(str);   
    row.add(d_contocl);
    str.format("%d", tipomov);
    row.add(str);
    row.add(descr);
    row.add(sezione);
    row.add(datapag); 
    str.format("%d", tipopag);
    row.add(str);
    row.add(codval);
    row.add(datacam);
    row.add(cambio.string());
    row.add(tipoc);
    str.format("%3d", gruppo);
    row.add(str);
    str.format("%3d", conto);
    row.add(str);
    str.format("%6ld", sottoc);
    row.add(str);
    row.add(d_conto);
    row.add(tipoc);
    str.format("%3d", gruppo);
    row.add(str);
    str.format("%3d", conto);
    row.add(str);
    str.format("%6ld", sottoc);
    row.add(str);
    row.add(d_conto);
  }                        
}

bool TVar_sc::tipo_contocl(int g,int c,TString& tipo)
{
  TLocalisamfile pcon (LF_PCON);
    
  pcon.setkey(1);
  pcon.zero();
  pcon.put(PCN_GRUPPO,     g);
  pcon.put(PCN_CONTO,      c); 
  pcon.read();
  if ( (g == pcon.get_int(PCN_GRUPPO)) && (c == pcon.get_int(PCN_CONTO)) )
  {
    tipo = pcon.get(PCN_TMCF);  
    return TRUE;
  }
  else
  {
    tipo = "";                
    return FALSE;
  }  
  return TRUE;  
}

bool TVar_sc::codvaluta(const TString& codval)
{             
  TTable val ("%VAL");
  TString dep;
  
  dep.format("%-3s", (const char*) codval);
  
  val.zero();
  val.put("CODTAB", dep);
  if (val.read() == NOERR)
    return TRUE;
  else
    return FALSE;
    
  return TRUE;
}

int TVar_sc::tipo_movimento(char tipo,int gruppo,int conto,long sottoc,int anno,const TString& npart,int nriga,TMask& m)
{
  int tipomov = 0;

  TSheet_field& part = (TSheet_field&)m.field(F_RIGAPART);
    
  for (int i = 0 ; i < part.items(); i++)
  { 
    TToken_string& row = part.row(i);

    char    tp = row.get     (0)[0];
    int     g  = row.get_int (1);
    int     c  = row.get_int (2);
    long    s  = row.get_long(3);
    int     an = row.get_int (5);
    TString np = row.get     (6);
    int     nr = row.get_int (7);
    
    if (tipo == tp && gruppo == g && conto == c && sottoc == s &&
        anno == an && npart == np && nriga == nr)
    {          
      tipomov = part.sheet_mask().get_int(119);
      break;
    }  
  }
  return tipomov;
}

// *****************************************
// ***** HANDLER sulla riga di partita *****
// *****************************************
bool TVar_sc::tipocf_handler(TMask_field& f, KEY k)
{
  if ( (k == K_TAB || k == K_ENTER) && f.mask().is_running())
  {
    TString16 tipocf(f.get());
    if (tipocf != "" && tipocf != "C" && tipocf != "F")
      return f.warning_box("Tipo anagrafica errato");
  }
  return TRUE;
}                                                

bool TVar_sc::codcf_handler(TMask_field& f, KEY k)
{
  if ( (k == K_TAB || k == K_ENTER) && f.mask().is_running())
  {  
    TString tipocf = f.mask().get    (101);
    int     gruppo = f.mask().get_int(102);
    int     conto  = f.mask().get_int(103);
    long    sottoc = atol(f.get());
    TString desc;
    
    if (!app().descr_conto(tipocf,gruppo,conto,sottoc,desc))
      return f.warning_box("Codice anagrafica errato");
  }
  return TRUE;
}                               

bool TVar_sc::rifpart_handler(TMask_field& f, KEY k)
{             
  if ( (k == K_TAB || k == K_ENTER) && f.mask().is_running())
  {
    int     anno    = f.mask().get_int(106);
    TString numpart = f.mask().get    (107);
    int     nriga   = atoi(f.get());
    
    if (anno == 0 || numpart.empty() || nriga == 0)
      return f.warning_box("Riferimento partita errato");
  }
  return TRUE;
}                 

bool TVar_sc::datareg_handler(TMask_field& f, KEY k)
{             
  if ( (k == K_TAB || k == K_ENTER) && f.mask().is_running())
  {
    if ( !(TDate::isdate(f.get())) )
      return warning_box("Data errata o formato non valido");
  }
  return TRUE;
}                 

bool TVar_sc::codcaus_handler(TMask_field& f, KEY k)
{             
  if ( (k == K_TAB || k == K_ENTER) && f.mask().is_running())
  { 
    TString appoggio;                                                               
    TString codcaus = f.get(); 
    int     tipomov = f.mask().get_int(119);
    
    if (codcaus.not_empty())
      if (!app().descr_caus(codcaus,appoggio))
        return f.warning_box("Valore non valido per codice causale");
        
    long nreg = f.mask().get_long(113);
    if (nreg != 0 && codcaus.empty())
      return f.warning_box("Se e' indicato il numero di operazione la causale deve essere significativa");  
    
    if (tipomov == 0)
      f.mask().set(119,app()._tm_caus);
    else
    {  
      if (codcaus.not_empty())  
        if (tipomov != app()._tm_caus)
          return f.warning_box("Tipo movimento partita non congruo con tipo movimento indicato sulla causale");  
    }
  }
  return TRUE;
}                 

bool TVar_sc::datadoc_handler(TMask_field& f, KEY k)
{             
  if ( (k == K_TAB || k == K_ENTER) && f.mask().is_running())
  {                  
    TString appoggio;
    TString codcaus = f.mask().get(111);                                                             
    TString datadoc = f.get();
    datadoc.trim();
    app().descr_caus(codcaus,appoggio);
    if (datadoc.empty() && app()._dd_caus)
      return f.warning_box("Data documento obbligatoria");
  }
  return TRUE;
}                 

bool TVar_sc::numdoc_handler(TMask_field& f, KEY k)
{             
  if ( (k == K_TAB || k == K_ENTER) && f.mask().is_running())
  {                  
    TString appoggio;
    TString codcaus = f.mask().get(111);                                                             
    TString numdoc = f.get();
    app().descr_caus(codcaus,appoggio);
    if (numdoc.empty() && app()._nd_caus)
      return f.warning_box("Numero documento obbligatorio");
  }
  return TRUE;
}                 

bool TVar_sc::contocl_handler(TMask_field& f, KEY k)
{             
  if ( (k == K_TAB || k == K_ENTER) && f.mask().is_running())
  {                  
    TString tmcf;
    int gruppo = f.mask().get_int(116);                                                             
    int conto  = atoi(f.get());      
    
    if (gruppo == 0 && conto == 0) return TRUE;
    
    if (!app().tipo_contocl(gruppo,conto,tmcf))
      return f.warning_box("Codice conto non esistente su piano dei conti");
  
    TString tipo = f.mask().get(101);
    if (tipo != tmcf) 
      return f.warning_box("Tipo conto C/F non congruo con tipo anagrafica"); 
  }
  return TRUE;
}                 

bool TVar_sc::tipomov_handler(TMask_field& f, KEY k)
{             
  if ( (k == K_TAB || k == K_ENTER) && f.mask().is_running())
  {                  
    int tipomov = atoi(f.get());                                                             
    if (tipomov != 1 && tipomov != 2 && tipomov != 3 && tipomov != 5 && tipomov != 6)
      return f.warning_box("Tipo movimento errato");
   
    TString appoggio = "";   
    TString codcaus  = f.mask().get(111);
    if (codcaus.not_empty())
    {
      app().descr_caus(codcaus,appoggio);
      if (tipomov != app()._tm_caus)
        return f.warning_box("Tipo movimento partita non congruo con tipo movimento indicato sulla causale");  
    }    
  }
  return TRUE;
}                 

bool TVar_sc::sezione_handler(TMask_field& f, KEY k)
{             
  if ( (k == K_TAB || k == K_ENTER) && f.mask().is_running())
  {                  
    TString sezione = f.get();                                                             
    if (sezione != "D" && sezione != "A")
      return f.warning_box("Sezione dare/avere errata");
  }
  return TRUE;
}                 

bool TVar_sc::tipopag_handler(TMask_field& f, KEY k)
{             
  if ( (k == K_TAB || k == K_ENTER) && f.mask().is_running())
  {                  
    int tipomov = f.mask().get_int(119);
    int tipopag = atoi(f.get());
    
    if (tipomov == 1 && tipopag != 0)
      return f.warning_box("In caso di fattura non e' possibile indicare il tipo pagamento");
                                                                   
    if (tipomov != 1 && tipomov != 2)
      if (tipopag < 1 || tipopag > 9)
        return f.warning_box("Tipo pagamento errato");
  }
  return TRUE;
}                 

bool TVar_sc::datapag_handler(TMask_field& f, KEY k)
{             
  if ( (k == K_TAB || k == K_ENTER) && f.mask().is_running())
  {                  
    int     tipomov = f.mask().get_int(119);
    TString datapag (f.get());    
    datapag.trim();

    if (tipomov == 1 && datapag.not_empty())
      return f.warning_box("In caso di fattura non e' possibile indicare la data del pagamento");
                                                                 
    if (tipomov != 1)
      if (datapag.empty() || !(TDate::isdate(datapag)))
        return f.warning_box("Se il movimento non e' una fattura la data di pagamento deve essere indicata");
  }
  return TRUE;
}                 

bool TVar_sc::codval_handler(TMask_field& f, KEY k)
{             
  if ( (k == K_TAB || k == K_ENTER) && f.mask().is_running())
  {                  
    TString codval (f.get());
                                                                   
    if (codval.not_empty())                                                               
    {
      if (!app().codvaluta(codval))
        return f.warning_box("Codice valuta non presente in tabella");
      
      TConfig conf (CONFIG_DITTA);
      TString valuta = conf.get("GesVal");
      if (codval.not_empty && valuta.empty())
        return f.warning_box("Non e' possibile indicare il codice valuta se non indicata la gestione valuta sui parametri ditta");
      if (codval.empty() && valuta.not_empty())
        return f.warning_box("Il codice valuta deve essere indicato in quanto indicata la gestione in valuta sui parametri ditta");
      TString codcaus (f.mask().get(111));
      if (codcaus.not_empty())
      { 
        TString appoggio;
        if (app().descr_caus(codcaus,appoggio))      
        {
          if (app()._movval && codval.empty())
            return f.warning_box("Il codice valuta deve essere indicato in quanto indicata la gestione in valuta sulla causale");
          if (!app()._movval && codval.not_empty())
            return f.warning_box("Non e' possibile indicare il codice in valuta se non indicato il flag gestione valuta sulla causale");
        }    
      }    
    }
    else
    {
      TDate datacam (f.mask().get_date(125));
      real  cambio  (f.mask().get_real(126));
      
      if (datacam.ok())
        return f.warning_box("Non e' possibile indicare la data cambio se non e' indicato il codice valuta");
      if (cambio != ZERO)
        return f.warning_box("Non e' possibile indicare il cambio se non e' indicato il codice valuta");  
    }    
  }
  return TRUE;
}                 

bool TVar_sc::datacam_handler(TMask_field& f, KEY k)
{             
  if ( (k == K_TAB || k == K_ENTER) && f.mask().is_running())
  {                
    TString codval  (f.mask().get(124));
    TString datacam (f.get());
    datacam.trim();
                                                                   
    if (codval.not_empty())                                                               
      if (datacam.empty() || !(TDate::isdate(datacam)))
        return f.warning_box("Se il codice valuta e' indicato la data cambio deve essere significativa");
  }
  return TRUE;
}                 

bool TVar_sc::cambio_handler(TMask_field& f, KEY k)
{             
  if ( (k == K_TAB || k == K_ENTER) && f.mask().is_running())
  {                
    TString codval (f.mask().get(124));
    real    cambio (f.get());
                                                                   
    if (codval.not_empty())                                                               
      if (cambio == ZERO)
        return f.warning_box("Se il codice valuta e' indicato il cambio deve essere significativo");
  }
  return TRUE;
}                 
// ******************************************
// ***** HANDLER sulla riga di scadenza *****
// ******************************************
bool TVar_sc::nrata_handler(TMask_field& f, KEY k)
{             
  if ( (k == K_TAB || k == K_ENTER) && f.mask().is_running())
  {                
    int nrata = atoi(f.get());
                                                                   
    if (nrata == 0)
      return f.warning_box("Il numero di rata deve essere significativo");
  }
  return TRUE;
}                 

bool TVar_sc::codpag_handler(TMask_field& f, KEY k)
{             
  if ( (k == K_TAB || k == K_ENTER) )
  { 
    TString descr;              
    
    TString codpag = f.get();
    
    if (codpag.not_empty())
    {        
      if (f.mask().is_running())
      {
        TTable cpg ("%CPG");
        TString dep (format("%-4s", (const char*) codpag));
     
        cpg.zero();
        cpg.put("CODTAB", dep);
        if (cpg.read() != NOERR)   
          return f.warning_box("Codice di pagamento errato o non presente in tabella");
      }
      TTable rpg ("%RPG");
      int tipo;
      
      int tipopag = f.mask().get_int(112);
      
      TString dep;
      for (int i = 0; !rpg.eof(); rpg.next(), i++)
      {
        dep.format("%-s%3d", (const char*) codpag, i);
    
        rpg.zero();
        rpg.put("CODTAB", dep);
        if (rpg.read() == NOERR)   
        {
          tipo = rpg.get_int("I1");
          if (tipo == tipopag)
          {
            switch(tipo)
            {
              case 1: descr = "Rimessa diretta";
                      break;
              case 2: descr = "Tratta";
                      break;
              case 3: descr = "Ricevuta bancaria";
                      break;
              case 4: descr = "Cessione";
                      break;
              case 5: descr = "Paghero'";
                      break;
              case 6: descr = "Lettera di credito";
                      break;
              case 7: descr = "Tratta accettata";
                      break;
              case 8: descr = "Rapporti interbancari diretti";
                      break;
              case 9: descr = "Bonifico";
                      break;
              case 10: descr = "Altro";
                       break;
              default: break;
            };
            break;
          }
        }  
        else
        {
          descr = ""; 
          break;
        }
      }
      if (f.mask().is_running())
      {    
        if (tipopag != 0)
        {
          if (tipopag != tipo)
            return f.warning_box("Il tipo pagamento della scadenza non e' congruo con il tipo pagamento del codice di pagamento");
        }
        else
          f.mask().set(112,tipo);
      }
    }      
    TString ultclass = f.mask().get(113);
    if (ultclass.empty())
      f.mask().set(114, descr);  
  }
  return TRUE;
}                 

bool TVar_sc::tpscad_handler(TMask_field& f, KEY k)
{             
  if ( (k == K_TAB || k == K_ENTER) && f.mask().is_running())
  {                  
    TString codpag = f.mask().get(111);
    
    if (codpag.empty()) return TRUE;
    
    int tipopag = atoi(f.get());
                                                                 
    if (tipopag < 1 || tipopag > 9)
      return f.warning_box("Tipo pagamento errato");

    TTable cpg ("%CPG");
    TString dep (format("%-4s", (const char*) codpag));
    
    int tipo = 0;
     
    cpg.zero();
    cpg.put("CODTAB", dep);
    if (cpg.read() == NOERR)   
      tipo  = atoi(cpg.get("S4"));
    
    if (tipopag != tipo)
      return f.warning_box("Il tipo pagamento della scadenza non e' congruo con il tipo pagamento del codice di pagamento");
  }
  return TRUE;
}                 

bool TVar_sc::ultclass_handler(TMask_field& f, KEY k)
{             
  if ( (k == K_TAB || k == K_ENTER) && f.mask().is_running())
  { 
    TString descr;             
    TString ultclass = f.get(); 
    int     tipopag  = f.mask().get_int(112);
    
    if (ultclass.empty())
    {                   
      TTable rpg ("%RPG");
      int tipo;
                                       
      TString codpag  = f.mask().get(111);                                       
      int     tipopag = f.mask().get_int(112);
      
      TString dep;
      for (int i = 0; !rpg.eof(); rpg.next(), i++)
      {
        dep.format("%-s%3d", (const char*) codpag, i);
    
        rpg.zero();
        rpg.put("CODTAB", dep);
        if (rpg.read() == NOERR)   
        {
          tipo = rpg.get_int("I1");
          if (tipo == tipopag)
          {
            switch(tipo)
            {
              case 1: descr = "Rimessa diretta";
                      break;
              case 2: descr = "Tratta";
                      break;
              case 3: descr = "Ricevuta bancaria";
                      break;
              case 4: descr = "Cessione";
                      break;
              case 5: descr = "Paghero'";
                      break;
              case 6: descr = "Lettera di credito";
                      break;
              case 7: descr = "Tratta accettata";
                      break;
              case 8: descr = "Rapporti interbancari diretti";
                      break;
              case 9: descr = "Bonifico";
                      break;
              case 10: descr = "Altro";
                       break;
              default: break;
            };
            break;
          }
        }  
        else
        {
          descr = ""; 
          break;
        }
      }                          
      f.mask().set(114, descr);  
      return TRUE;
    } 
    
    TTable clr ("%CLR");
    TString dep (format("%d%s", tipopag,(const char*) ultclass));
     
    clr.zero();
    clr.put("CODTAB", dep);
    if (clr.read() == NOERR)
      descr = clr.get("S0");
    else
      return f.warning_box("Ulteriore classificazione errata o non presente in tabella");
    
    f.mask().set(114, descr);  
  }
  return TRUE;
}                 

bool TVar_sc::datascad_handler(TMask_field& f, KEY k)
{             
  if ( (k == K_TAB || k == K_ENTER) && f.mask().is_running())
  {                  
    TString datascad (f.get());  
    datascad.trim();
                                                                 
    if (datascad.empty() || !(TDate::isdate(datascad)))
      return f.warning_box("Data scadenza errata");
  }
  return TRUE;
}                 

bool TVar_sc::banca_handler(TMask_field& f, KEY k)
{             
  if ( (k == K_TAB || k == K_ENTER) && f.mask().is_running())
  {    
    TString mess;
    long abi;             
    long cab = atol(f.get());
    int id = f.dlg();
    if (id == 120)                  
    {
      abi = f.mask().get_long(119);  
      mess = "Codice nostra banca errato o non presente in tabella";
    }
    else
      if (id == 122)
      {
        abi = f.mask().get_long(121);
        mess = "Codice vostra banca errato o non presente in tabella";
      }  
      else
        if (id == 127)
        {
          abi = f.mask().get_long(126);  
          mess = "Codice nostra banca errato o non presente in tabella";
        }    
        else
          if (id == 129)
          {
            abi = f.mask().get_long(128);
            mess = "Codice vostra banca errato o non presente in tabella";
          }
        
    if (abi == 0 && cab == 0) return TRUE;
    
    TTable ban ("%BAN");
    TString dep;
    if (abi != 0 && cab != 0)
      dep.format("%05ld%05ld", abi,cab);  
    if (abi != 0 && cab == 0)  
      dep.format("%05ld", abi);
             
    ban.zero();
    ban.put("CODTAB", dep);
    if (ban.read() != NOERR)
      return f.warning_box("%s", (const char*) mess);
  }
  return TRUE;
}                 

bool TVar_sc::codag_handler(TMask_field& f, KEY k)
{             
  if ( (k == K_TAB || k == K_ENTER) && f.mask().is_running())
  { 
    TString dep;   
    TString codag = f.get();
        
    if (codag.empty()) return TRUE;
    
    TTable age ("AGE");        
    if (real::is_natural(codag))
      dep.format("%05s", (const char*) codag);
    else
      dep.format("%-5s", (const char*) codag);
     
    age.zero();
    age.put("CODTAB", dep);
    if (age.read() != NOERR)
      return f.warning_box("Codice agente errato o non presente in tabella");
  }
  return TRUE;
}                 

bool TVar_sc::datasoll_handler(TMask_field& f, KEY k)
{             
  if ( (k == K_TAB || k == K_ENTER) && f.mask().is_running())
  {                  
    TString datasoll (f.get()); 
    datasoll.trim();
    
    if (datasoll.empty) return TRUE;
                                                                 
    if (!(TDate::isdate(datasoll)))
      return f.warning_box("Data sollecito errata");
  }
  return TRUE;
}                 

bool TVar_sc::importo_handler(TMask_field& f, KEY k)
{             
  if ( (k == K_TAB || k == K_ENTER) && f.mask().is_running())
  {                  
    real importo (f.get());
    
    if (importo == ZERO) 
      return f.warning_box("L'importo del pagamento deve essere significativo");
  }
  return TRUE;
}                 

bool TVar_sc::impval_handler(TMask_field& f, KEY k)
{             
  if ( (k == K_TAB || k == K_ENTER) && f.mask().is_running())
  { 
    TString codval;                 
    real importo (f.get());
    
    char tipo     = f.mask().get     (101)[0];
    int  g        = f.mask().get_int (102);
    int  c        = f.mask().get_int (103);
    long s        = f.mask().get_long(104);
    int  anno     = f.mask().get_int (106);
    TString npart = f.mask().get     (107);
    int     nriga = f.mask().get_int (108);
    
    app().sezione(tipo,g,c,s,anno,npart,nriga,codval,*(app()._mask));
    
    if (codval.empty() && importo != ZERO)
      return f.warning_box("L'importo in valuta della scadenza non puo' essere indicato se non indicato il codice valuta");
      
    if (codval.not_empty() && importo == ZERO) 
      return f.warning_box("L'importo in valuta della scadenza deve essere significativo");
  }
  return TRUE;
}                 

// *******************************************
// ***** HANDLER sulla riga di pagamento *****
// *******************************************
bool TVar_sc::record_partite(char tipo,int g,int c,long s,int anno,TString& npart,int nriga)
{
  TRecnotype nrec = _tpart->recno();
  TIsamtempfile& part = *_tpart;
  
  part.zero();
  part.put(PART_TIPOCF,     tipo);
  part.put(PART_GRUPPO,     g);
  part.put(PART_CONTO,      c);
  part.put(PART_SOTTOCONTO, s);
  part.put(PART_ANNO,       anno);
  part.put(PART_NUMPART,    npart);
  part.put(PART_NRIGA,      nriga);
  if (part.read() == NOERR)  
  {
    _tpart->readat(nrec);
    return TRUE;         
  }
  _tpart->readat(nrec);
    
  return FALSE;
}

bool TVar_sc::record_scadenze(char tipo,int g,int c,long s,int anno,TString& npart,int nriga,int nrata)
{
  TRecnotype nrec = _tscad->recno();
  TIsamtempfile& scad = *_tscad;
  
  scad.zero();
  scad.put(SCAD_TIPOCF,     tipo);
  scad.put(SCAD_GRUPPO,     g);
  scad.put(SCAD_CONTO,      c);
  scad.put(SCAD_SOTTOCONTO, s);
  scad.put(SCAD_ANNO,       anno);
  scad.put(SCAD_NUMPART,    npart);
  scad.put(SCAD_NRIGA,      nriga); 
  scad.put(SCAD_NRATA,      nrata);
  if (scad.read() == NOERR)  
  {
    _tscad->readat(nrec);
    return TRUE;         
  }
  _tscad->readat(nrec);
    
  return FALSE;
}

bool TVar_sc::rifpartita_handler(TMask_field& f, KEY k)
{             
  if ( (k == K_TAB || k == K_ENTER) && f.mask().is_running())
  {
    int nriga = f.mask().get_int(108);
    int nrata = f.mask().get_int(109);
    
    if (nriga == 9999 || nrata == 9999) return TRUE;
    
    char    t     = f.mask().get     (101)[0];
    int     g     = f.mask().get_int (102);
    int     c     = f.mask().get_int (103);
    long    s     = f.mask().get_long(104);
    int     anno  = f.mask().get_int (106);
    TString npart = f.mask().get     (107);       

    if (!app().record_partite(t,g,c,s,anno,npart,nriga))           
      return f.warning_box("Non esiste la riga partita corrispondente");
    if (!app().record_scadenze(t,g,c,s,anno,npart,nriga,nrata))
      return f.warning_box("Non esiste la rata di scadenza corrispondente");  
  }
  return TRUE;
}                 

bool TVar_sc::accsal_handler(TMask_field& f, KEY k)
{             
  if ( (k == K_TAB || k == K_ENTER) && f.mask().is_running())
  { 
    TString accsal = f.get();
    
    char    t     = f.mask().get     (101)[0];
    int     g     = f.mask().get_int (102);
    int     c     = f.mask().get_int (103);
    long    s     = f.mask().get_long(104);
    int     anno  = f.mask().get_int (106);
    TString npart = f.mask().get     (107);       
    int     nriga = f.mask().get_int (110);    
                                                                
    int tipo = app().tipo_movimento(t,g,c,s,anno,npart,nriga,*(app()._mask));
    if ( (tipo == 2 || tipo == 5) && accsal == "S")
      return f.warning_box("Il flag in acconto / a saldo non puo' essere indicato in caso di Nota credito e Insoluto");
                                                                     
    if (accsal != "S" && accsal != "A")
      return f.warning_box("Flag in acconto / a saldo errato");  
  }
  return TRUE;
}                 

bool TVar_sc::passat_handler(TMask_field& f, KEY k)
{             
  if ( (k == K_TAB || k == K_ENTER) && f.mask().is_running())
  {            
    real    abbuoni (f.mask().get_real(117));    
    TString passat  = f.get();
    
    if (abbuoni != ZERO)                                                             
      if (passat != "P" && passat != "A")
        return f.warning_box("Flag attivo / passivo errato");
  }
  return TRUE;
}                 

bool TVar_sc::impvalp_handler(TMask_field& f, KEY k)
{             
  if ( (k == K_TAB || k == K_ENTER) && f.mask().is_running())
  { 
    TString codval;                 
    real importo (f.get());
    
    char tipo     = f.mask().get     (101)[0];
    int  g        = f.mask().get_int (102);
    int  c        = f.mask().get_int (103);
    long s        = f.mask().get_long(104);
    int  anno     = f.mask().get_int (106);
    TString npart = f.mask().get     (107);
    int     nriga = f.mask().get_int (110);
    
    app().sezione(tipo,g,c,s,anno,npart,nriga,codval,*(app()._mask));

    if (codval.empty() && importo != ZERO)
      return f.warning_box("L'importo in valuta del pagamento non puo' essere indicato se non indicato il codice valuta");
      
    if (codval.not_empty() && importo == ZERO) 
      return f.warning_box("L'importo in valuta del pagamento deve essere significativo");
  }
  return TRUE;
}                 

bool TVar_sc::sezione_abb_handler(TMask_field& f, KEY k)
{
  if ( (k == K_TAB || k == K_ENTER) && f.mask().is_running())
  {
    TString sez     (f.get());
    real    abbuoni (f.mask().get(117));
    
    if (sez != "D" && sez != "A" && sez != "")
      return f.warning_box("Valore non valido per sezione");
      
    if (abbuoni != ZERO && sez.empty())
      return f.warning_box("Se gli abbuoni sono significativi la sezione deve essere indicata");
      
    if (sez == "D")
      f.mask().set(131,"A");
    else  
      if (sez == "A")
        f.mask().set(131,"P");   
      else
        f.mask().set(131,"");
 
  }
  return TRUE;
}

bool TVar_sc::ritenute_handler(TMask_field& f, KEY k)
{             
  if ( (k == K_TAB || k == K_ENTER) && f.mask().is_running())
  { 
    TString codval;                 
    
    char tipo     = f.mask().get     (101)[0];
    int  g        = f.mask().get_int (102);
    int  c        = f.mask().get_int (103);
    long s        = f.mask().get_long(104);
    int  anno     = f.mask().get_int (106);
    TString npart = f.mask().get     (107);
    int     nriga = f.mask().get_int (110);

    real ritenute (f.get());
    int tipomov = app().tipo_movimento(tipo,g,c,s,anno,npart,nriga,*(app()._mask));
    if ( (tipomov == 2 || tipomov == 5) && ritenute != ZERO)
      return f.warning_box("La ritenuta non puo' essere indicata in caso di Nota credito e Insoluto");
    
    char sez = app().sezione(tipo,g,c,s,anno,npart,nriga,codval,*(app()._mask));
    
    TString str (format("%c", sez));
    if (ritenute != ZERO)
      f.mask().set(114,str);
    else
      f.mask().set(114,"");
  }
  return TRUE;
}                 

bool TVar_sc::abbuoni_handler(TMask_field& f, KEY k)
{             
  if (k == K_TAB)
  { 
    TString codval;                 
    
    char tipo     = f.mask().get     (101)[0];
    int  g        = f.mask().get_int (102);
    int  c        = f.mask().get_int (103);
    long s        = f.mask().get_long(104);
    int  anno     = f.mask().get_int (106);
    TString npart = f.mask().get     (107);
    int     nriga = f.mask().get_int (110);
    
    app().sezione(tipo,g,c,s,anno,npart,nriga,codval,*(app()._mask));
    
    if (codval.not_empty()) 
      ((TReal_field&)f).set_decimals(3);
    else
      ((TReal_field&)f).set_decimals(0); 
  }
  if ( (k == K_TAB || k == K_ENTER) && f.mask().is_running())
  {
    TString accsal  (f.mask().get(111));   
    real    abbuoni (f.get());
    if (accsal == "A" && abbuoni != ZERO)
      return f.warning_box("Gli abbuoni possono essere indicati solo se a SALDO");
  }
  return TRUE;
}                 

bool TVar_sc::sezione_dc_handler(TMask_field& f, KEY k)
{
  if ( (k == K_TAB || k == K_ENTER) && f.mask().is_running())
  {
    TString sez     (f.get());
    real    diffcam (f.mask().get(119));
      
    if (sez != "D" && sez != "A" && sez != "")
      return f.warning_box("Valore non valido per sezione");
        
    if (diffcam != ZERO && sez.empty())
      return f.warning_box("Se la differenza cambio e' significativa la sezione deve essere indicata");
  }
  return TRUE;
}

bool TVar_sc::diffcambio_handler(TMask_field& f, KEY k)
{
  if ( (k == K_TAB || k == K_ENTER) && f.mask().is_running())
  { 
    TString codval;                 
    
    char tipo     = f.mask().get     (101)[0];
    int  g        = f.mask().get_int (102);
    int  c        = f.mask().get_int (103);
    long s        = f.mask().get_long(104);
    int  anno     = f.mask().get_int (106);
    TString npart = f.mask().get     (107);
    int     nriga = f.mask().get_int (110);
    
    app().sezione(tipo,g,c,s,anno,npart,nriga,codval,*(app()._mask));
    
    TString accsal  (f.mask().get(111));   
    real    diffcam (f.get());
    if (accsal == "A" && diffcam != ZERO)
      return f.warning_box("La differenza cambio puo' essere indicata solo se a SALDO");  
    if (codval.empty() && diffcam != ZERO)
      return f.warning_box("La differenza cambio puo' essere indicata solo in caso di valuta");  
  }
  return TRUE;
}

bool TVar_sc::contropartita_handler(TMask_field& f, KEY k)
{ 
  if ( (k == K_TAB || k == K_ENTER) && f.mask().is_running())
  {
    char tipo     = f.mask().get     (101)[0];
    int  g        = f.mask().get_int (102);
    int  c        = f.mask().get_int (103);
    long s        = f.mask().get_long(104);
    int  anno     = f.mask().get_int (106);
    TString npart = f.mask().get     (107);
    int     nriga = f.mask().get_int (110);

//    int tipomov = app().tipo_movimento(tipo,g,c,s,anno,npart,nriga,*(app()._mask));
//    if ( (tipomov == 2 || tipomov == 5) && (g != 0 || c != 0 || s != 0) )
//      return f.warning_box("La contropartita non puo' essere indicata in caso di Nota credito e Insoluto");

    TString tipocf = f.mask().get(121);
    
    if (tipocf == "C" || tipocf == "F")
    {  
      long codcf = f.mask().get_long(124); 
      
      if (codcf == 0) return TRUE;
      
      TLocalisamfile clifo (LF_CLIFO);
    
      clifo.setkey(1);
      clifo.zero();
      clifo.put(CLI_TIPOCF, tipocf);
      clifo.put(CLI_CODCF,  codcf);
      if (clifo.read() != NOERR)
        return f.warning_box("Codice di contropartita errato o non presente in anagrafica clienti/fornitori");
    }
    else
    {   
      int  gruppo = f.mask().get_int (122);
      int  conto  = f.mask().get_int (123);
      long sottoc = f.mask().get_long(124);  
    
      if (gruppo == 0 && conto == 0 && sottoc == 0) return TRUE;
    
      TLocalisamfile pcon (LF_PCON);
     
      pcon.setkey(1);
      pcon.zero();
      pcon.put(PCN_GRUPPO,     gruppo);
      pcon.put(PCN_CONTO,      conto);
      pcon.put(PCN_SOTTOCONTO, sottoc);
      if (pcon.read() != NOERR)
        return f.warning_box("Codice contropartita errato o non presente in piano conti");
    }    
  }

  return TRUE;
}                 

bool TVar_sc::registra_dati_comuni(TMask_field& f, KEY k)
{                    
  if (k == K_ENTER && f.mask().is_running())
  {
    long nreg = f.mask().get_long(113);
    int  nrig = f.mask().get_int (114);
  
    if (nreg != 0 && nrig != 0)
    { 
      TDate   datareg (f.mask().get_date(115));
      TString numdoc  (f.mask().get     (110));
      TDate   datadoc (f.mask().get_date(109));
      TString codcaus (f.mask().get     (111));
    
      TSheet_field& part = (TSheet_field&)app()._mask->field(F_RIGAPART);      
    
      for (int i = 0; i < part.items(); i++)
      {
        TToken_string& row = part.row(i);
      
        long numreg = row.get_long(12);
        int  numrig = row.get_int (13);
      
        if (nreg != numreg || nrig != numrig) continue;
      
        TString d_caus;
      
        app().descr_caus(codcaus,d_caus);
      
        row.add(datadoc,8);
        row.add(numdoc,9);      
        row.add(codcaus,10); 
        row.add(d_caus,11); 
        row.add(datareg,14);      
      }        
      part.force_update();
    }
  }           
  
  return TRUE;
}

bool TVar_sc::cancella_partita(TMask_field& f)
{
  TIsamtempfile& part = *_tpart;
    
  char    tipo    = f.mask().get     (101)[0];
  int     gruppo  = f.mask().get_int (102);
  int     conto   = f.mask().get_int (103);
  long    sottoc  = f.mask().get_long(104);
  int     anno    = f.mask().get_int (106);
  TString numpart = f.mask().get     (107);
  int     nriga   = f.mask().get_int (108);
    
  int     tipomov = f.mask().get_int (119);

  if (!controlla_abbuoni_diffcam(tipo,gruppo,conto,sottoc,anno,numpart,nriga,0))
    return f.message_box("Impossibile eliminare questa partita in quanto esistono uno o piu' pagamenti riferiti ad essa contenenti abbuoni o differenze cambio");
    
  part.setkey(1);
  part.zero();
  part.put(PART_TIPOCF,     tipo);
  part.put(PART_GRUPPO,     gruppo);
  part.put(PART_CONTO,      conto);
  part.put(PART_SOTTOCONTO, sottoc);
  part.put(PART_ANNO,       anno);
  part.put(PART_NUMPART,    numpart);
  part.put(PART_NRIGA,      nriga);  
  if (part.read() == NOERR)
  {
    part.remove();
    if (tipomov == 1)
    {
      TIsamtempfile& scad = *_tscad;
        
      scad.setkey(1);
      scad.zero();
      scad.put(SCAD_TIPOCF,     tipo);
      scad.put(SCAD_GRUPPO,     gruppo);
      scad.put(SCAD_CONTO,      conto);
      scad.put(SCAD_SOTTOCONTO, sottoc);
      scad.put(SCAD_ANNO,       anno);
      scad.put(SCAD_NUMPART,    numpart);
      scad.put(SCAD_NRIGA,      nriga);
        
      TRectype scadenza (scad.curr());
        
      for (scad.read(_isgteq); !scad.eof(); scad.next())
      {  
        TString rec  = scadenza.get(SCAD_NUMPART);
        TString file = scad.get(SCAD_NUMPART);
        
        if (scad.curr() != scadenza || file != rec) break;
          
        int nrata = scad.get_int (SCAD_NRATA);
          
        scad.remove();
          
        sgancia_pagamenti(tipo,gruppo,conto,sottoc,anno,numpart,nriga,nrata);
      }
    }
    else
      if (tipomov != 1)
      {
        TIsamtempfile& pagsca = *_tpagsca;
 
        pagsca.setkey(1);
        pagsca.zero();
        pagsca.put(PAGSCA_TIPOC,      tipo);
        pagsca.put(PAGSCA_GRUPPO,     gruppo);
        pagsca.put(PAGSCA_CONTO,      conto);
        pagsca.put(PAGSCA_SOTTOCONTO, sottoc);
        pagsca.put(PAGSCA_ANNO,       anno);
        pagsca.put(PAGSCA_NUMPART,    numpart);
  
        TRectype pagamenti (pagsca.curr());
  
        for (pagsca.read(_isgteq); !pagsca.eof(); pagsca.next())
        {              
          TString rec  = pagamenti.get(PAGSCA_NUMPART);
          TString file = pagsca.get(PAGSCA_NUMPART);
          
          if (pagsca.curr() != pagamenti || file != rec) break;  
            
          int nrigp = pagsca.get_int (PAGSCA_NRIGP);
            
          if (nriga != nrigp) continue;
            
          pagsca.remove();
        }                              
      }
  }
  else
    return f.warning_box("Non esiste la riga di partita richiesta sull'archivio delle partite");
    
  return TRUE;
}

bool TVar_sc::controlla_abbuoni_diffcam(char tipo,int g,int c,long s,int anno,TString& npart,int nriga,int nrata)
{
  TIsamtempfile& pagsca = *_tpagsca;
  
  pagsca.setkey(1);
  pagsca.zero();
  pagsca.put(PAGSCA_TIPOC,      tipo);
  pagsca.put(PAGSCA_GRUPPO,     g);
  pagsca.put(PAGSCA_CONTO,      c);
  pagsca.put(PAGSCA_SOTTOCONTO, s);
  pagsca.put(PAGSCA_ANNO,       anno);
  pagsca.put(PAGSCA_NUMPART,    npart);
  pagsca.put(PAGSCA_NRIGA,      nriga);
  if (nrata != 0)
    pagsca.put(PAGSCA_NRATA,    nrata);
      
  TRectype pagamenti (pagsca.curr());
  
  for (pagsca.read(_isgteq); !pagsca.eof(); pagsca.next())
  {  
    TString rec  = pagamenti.get(PAGSCA_NUMPART);
    TString file = pagsca.get(PAGSCA_NUMPART);
    
    if (pagsca.curr() != pagamenti || file != rec) break;
    
    real abbuoni = pagsca.get_real(PAGSCA_ABBUONI);
    real diffcam = pagsca.get_real(PAGSCA_DIFFCAM);
    if (abbuoni != ZERO || diffcam != ZERO)
      return FALSE;
  }                
  return TRUE;              
}

bool TVar_sc::elimina_partita(TMask_field& f, KEY k)
{                    
  if (k == K_SPACE && f.mask().is_running())
    if (!app().cancella_partita(f))
      return FALSE;

  return TRUE;
}

void TVar_sc::sgancia_pagamenti(char tipo,int g,int c,long s,int anno,TString& npart,int nriga,int nrata)
{
  TIsamtempfile& pagsca = *_tpagsca;
  
  pagsca.setkey(1);
  pagsca.zero();
  pagsca.put(PAGSCA_TIPOC,      tipo);
  pagsca.put(PAGSCA_GRUPPO,     g);
  pagsca.put(PAGSCA_CONTO,      c);
  pagsca.put(PAGSCA_SOTTOCONTO, s);
  pagsca.put(PAGSCA_ANNO,       anno);
  pagsca.put(PAGSCA_NUMPART,    npart);
  pagsca.put(PAGSCA_NRIGA,      nriga);
  pagsca.put(PAGSCA_NRATA,      nrata);
  
  TRectype pagamenti (pagsca.curr());
  
  for (pagsca.read(_isgteq); !pagsca.eof(); pagsca.next())
  {  
    TString rec  = pagamenti.get(PAGSCA_NUMPART);
    TString file = pagsca.get(PAGSCA_NUMPART);
    
    if (pagsca.curr() != pagamenti || file != rec) break;
    
    TRectype pag (pagsca.curr());
    
    pag.put(PAGSCA_NRIGA, 9999);
    pag.put(PAGSCA_NRATA, 9999);
    
    TRecnotype nrec = pagsca.recno();
    pagsca.remove();
    pagsca.curr() = pag;  
    if (pagsca.read() == NOERR)
    { 
      real importo  = pagsca.get_real(PAGSCA_IMPORTO) + pag.get_real(PAGSCA_IMPORTO);
      real impval   = pagsca.get_real(PAGSCA_IMPORTOVAL) + pag.get_real(PAGSCA_IMPORTOVAL);
      real ritenute = pagsca.get_real(PAGSCA_RITENUTE) + pag.get_real(PAGSCA_RITENUTE);
      pagsca.put(PAGSCA_IMPORTO,    importo);
      pagsca.put(PAGSCA_IMPORTOVAL, impval);
      pagsca.put(PAGSCA_RITENUTE,   ritenute);
      pagsca.put(PAGSCA_ACCSAL, "A"); 
      pagsca.rewrite();
    }
    else      
    {
      pagsca.curr() = pag;
      pagsca.write();     
    }             
    pagsca.readat(nrec);
  }                              
}

bool TVar_sc::elimina_scadenza(TMask_field& f, KEY k)
{
  if (k == K_SPACE && f.mask().is_running())
    if (!app().cancella_scadenza(f))
      return FALSE;

  return TRUE;
}

bool TVar_sc::cancella_scadenza(TMask_field& f)
{
  TIsamtempfile& scad = *_tscad;
    
  char    tipo    = f.mask().get     (101)[0];
  int     gruppo  = f.mask().get_int (102);
  int     conto   = f.mask().get_int (103);
  long    sottoc  = f.mask().get_long(104);
  int     anno    = f.mask().get_int (106);
  TString numpart = f.mask().get     (107);
  int     nriga   = f.mask().get_int (108);
  int     nrata   = f.mask().get_int (109);

  if (!controlla_abbuoni_diffcam(tipo,gruppo,conto,sottoc,anno,numpart,nriga,nrata))
    return f.message_box("Impossibile eliminare questa scadenza in quanto esistono uno o piu' pagamenti riferiti ad essa contenenti abbuoni o differenze cambio");
    
  scad.setkey(1);
  scad.zero();
  scad.put(SCAD_TIPOCF,     tipo);
  scad.put(SCAD_GRUPPO,     gruppo);
  scad.put(SCAD_CONTO,      conto);
  scad.put(SCAD_SOTTOCONTO, sottoc);
  scad.put(SCAD_ANNO,       anno);
  scad.put(SCAD_NUMPART,    numpart);
  scad.put(SCAD_NRIGA,      nriga);
  scad.put(SCAD_NRATA,      nrata);
        
  if (scad.read() == NOERR)
  {
    scad.remove();
          
    sgancia_pagamenti(tipo,gruppo,conto,sottoc,anno,numpart,nriga,nrata);
  }
  else
    return f.warning_box("Non esiste la scadenza richiesta sull'archivio delle scadenze");
    
  return TRUE;
}

bool TVar_sc::elimina_pagamenti(TMask_field& f, KEY k)
{
  if (k == K_SPACE && f.mask().is_running())
    if (!app().cancella_pagamenti(f))
      return FALSE;

  return TRUE;
}

bool TVar_sc::cancella_pagamenti(TMask_field& f)
{
  TIsamtempfile& pagsca = *_tpagsca;
    
  char    tipo    = f.mask().get     (101)[0];
  int     gruppo  = f.mask().get_int (102);
  int     conto   = f.mask().get_int (103);
  long    sottoc  = f.mask().get_long(104);
  int     anno    = f.mask().get_int (106);
  TString numpart = f.mask().get     (107);
  int     nriga   = f.mask().get_int (108);  
  int     nrata   = f.mask().get_int (109);
  int     nrigp   = f.mask().get_int (110);
 
  pagsca.setkey(1);
  pagsca.zero();
  pagsca.put(PAGSCA_TIPOC,      tipo);
  pagsca.put(PAGSCA_GRUPPO,     gruppo);
  pagsca.put(PAGSCA_CONTO,      conto);
  pagsca.put(PAGSCA_SOTTOCONTO, sottoc);
  pagsca.put(PAGSCA_ANNO,       anno);
  pagsca.put(PAGSCA_NUMPART,    numpart);
  pagsca.put(PAGSCA_NRIGA,      nriga);
  pagsca.put(PAGSCA_NRATA,      nrata);
  pagsca.put(PAGSCA_NRIGP,      nrigp);
  
  if (pagsca.read() == NOERR)
  {
    pagsca.remove();
  }                              
  else
    return f.warning_box("Non esiste il pagamento richiesto sull'archivio dei pagamenti");
    
  return TRUE;
}

void TVar_sc::registra_partita(TMask& m)
{ 
  TSheet_field& part = (TSheet_field&)m.field(F_RIGAPART);
    
  for (int i = 0 ; i < part.items(); i++)
  { 
    TToken_string& row = part.row(i);

    char    tipo      = row.get     (0)[0];
    int     gruppo    = row.get_int (1);
    int     conto     = row.get_int (2);
    long    sottoc    = row.get_long(3);
    int     anno      = row.get_int (5);
    TString numpart   = row.get     (6);
    int     nriga     = row.get_int (7);
  
    TDate   datadoc    (row.get     (8));
    TString numdoc    = row.get     (9);
    TString codcaus   = row.get     (10);
    long    nreg      = row.get_long(12);
    int     nrig      = row.get_int (13);
    TDate   datareg    (row.get     (14)); 
    int     gruppocl  = row.get_int (15);
    int     contocl   = row.get_int (16);
    int     tipomov   = row.get_int (18);
    TString descr     = row.get     (19);
    char    sez       = row.get     (20)[0];
    TDate   datapag    (row.get     (21));
    int     tipopag   = row.get_int (22);
    TString codval     (row.get     (23));
    TDate   datacam    (row.get     (24));
    real    cambio     (row.get     (25));

    _tpart->setkey(1);
    _tpart->zero();
    _tpart->put(PART_TIPOCF,     tipo);
    _tpart->put(PART_GRUPPO,     gruppo);
    _tpart->put(PART_CONTO,      conto);
    _tpart->put(PART_SOTTOCONTO, sottoc);
    _tpart->put(PART_ANNO,       anno);
    _tpart->put(PART_NUMPART,    numpart);
    _tpart->put(PART_NRIGA,      nriga);
          
    if (_tpart->read() == NOERR)
    {                              
      _tpart->put(PART_TIPOCF,     tipo);
      _tpart->put(PART_GRUPPO,     gruppo);
      _tpart->put(PART_CONTO,      conto);
      _tpart->put(PART_SOTTOCONTO, sottoc);
      _tpart->put(PART_ANNO,       anno);
      _tpart->put(PART_NUMPART,    numpart);
      _tpart->put(PART_NRIGA,      nriga);
      _tpart->put(PART_DATADOC,    datadoc);
      _tpart->put(PART_NUMDOC,     numdoc);
      _tpart->put(PART_CODCAUS,    codcaus);
      _tpart->put(PART_NREG,       nreg);
      _tpart->put(PART_NUMRIG,     nrig);
      _tpart->put(PART_DATAREG,    datareg);  
      _tpart->put(PART_GRUPPOCL,   gruppocl);
      _tpart->put(PART_CONTOCL,    contocl);
      _tpart->put(PART_TIPOMOV,    tipomov);
      _tpart->put(PART_DESCR,      descr);
      _tpart->put(PART_SEZ,        sez);
      _tpart->put(PART_DATAPAG,    datapag); 
      _tpart->put(PART_TIPOPAG,   tipopag);
      _tpart->put(PART_CODVAL,    codval);
      _tpart->put(PART_DATACAM,   datacam);
      _tpart->put(PART_CAMBIO,    cambio);
    
      _tpart->rewrite();  
    }
    else
    {
      _tpart->put(PART_TIPOCF,     tipo);
      _tpart->put(PART_GRUPPO,     gruppo);
      _tpart->put(PART_CONTO,      conto);
      _tpart->put(PART_SOTTOCONTO, sottoc);
      _tpart->put(PART_ANNO,       anno);
      _tpart->put(PART_NUMPART,    numpart);
      _tpart->put(PART_NRIGA,      nriga);
      _tpart->put(PART_DATADOC,    datadoc);
      _tpart->put(PART_NUMDOC,     numdoc);
      _tpart->put(PART_CODCAUS,    codcaus);
      _tpart->put(PART_NREG,       nreg);
      _tpart->put(PART_NUMRIG,     nrig);
      _tpart->put(PART_DATAREG,    datareg);  
      _tpart->put(PART_GRUPPOCL,   gruppocl);
      _tpart->put(PART_CONTOCL,    contocl);
      _tpart->put(PART_TIPOMOV,    tipomov);
      _tpart->put(PART_DESCR,      descr);
      _tpart->put(PART_SEZ,        sez);
      _tpart->put(PART_DATAPAG,    datapag); 
      _tpart->put(PART_TIPOPAG,   tipopag);
      _tpart->put(PART_CODVAL,    codval);
      _tpart->put(PART_DATACAM,   datacam);
      _tpart->put(PART_CAMBIO,    cambio);
    
      _tpart->write();
    }
  } 
}

void TVar_sc::registra_scadenze(TMask& m)
{ 
  TSheet_field& scad = (TSheet_field&)m.field(F_RIGASCAD);
    
  for (int i = 0 ; i < scad.items(); i++)
  { 
    TToken_string& row = scad.row(i);

    char    tipo      = row.get     (0)[0];
    int     gruppo    = row.get_int (1);
    int     conto     = row.get_int (2);
    long    sottoc    = row.get_long(3);
    int     anno      = row.get_int (5);
    TString numpart   = row.get     (6);
    int     nriga     = row.get_int (7);
    int     nrata     = row.get_int (8);
  
    TDate   datascad   (row.get     (9));
    TString codpag    = row.get     (10);
    int     tipopag   = row.get_int (11);
    TString ultclass  = row.get     (12);
    real    importo    (row.get     (15));
    real    impval     (row.get     (16));
    TString descr     = row.get     (17);
    long    nsabi     = row.get_long(19);
    long    nscab     = row.get_long(19);
    long    vsabi     = row.get_long(20);
    long    vscab     = row.get_long(21);
    TString codag     = row.get     (22);
    TDate   datasoll   (row.get     (23)); 
    int     nsoll     = row.get_int (24);

    _tscad->setkey(1);
    _tscad->zero();
    _tscad->put(SCAD_TIPOCF,     tipo);
    _tscad->put(SCAD_GRUPPO,     gruppo);
    _tscad->put(SCAD_CONTO,      conto);
    _tscad->put(SCAD_SOTTOCONTO, sottoc);
    _tscad->put(SCAD_ANNO,       anno);
    _tscad->put(SCAD_NUMPART,    numpart);
    _tscad->put(SCAD_NRIGA,      nriga);
    _tscad->put(SCAD_NRATA,      nrata);
          
    if (_tscad->read() == NOERR)
    {                              
      _tscad->put(SCAD_TIPOCF,     tipo);
      _tscad->put(SCAD_GRUPPO,     gruppo);
      _tscad->put(SCAD_CONTO,      conto);
      _tscad->put(SCAD_SOTTOCONTO, sottoc);
      _tscad->put(SCAD_ANNO,       anno);
      _tscad->put(SCAD_NUMPART,    numpart);
      _tscad->put(SCAD_NRIGA,      nriga);
      _tscad->put(SCAD_NRATA,      nrata);
      _tscad->put(SCAD_DATASCAD,   datascad);
      _tscad->put(SCAD_CODPAG,     codpag);
      _tscad->put(SCAD_TIPOPAG,    tipopag);
      _tscad->put(SCAD_ULTCLASS,   ultclass);
      _tscad->put(SCAD_IMPORTO,    importo);
      _tscad->put(SCAD_IMPORTOVAL, impval);  
      _tscad->put(SCAD_DESCR,      descr);
      _tscad->put(SCAD_CODABIPR,   nsabi);
      _tscad->put(SCAD_CODCABPR,   nscab);
      _tscad->put(SCAD_CODABI,     vsabi);
      _tscad->put(SCAD_CODCAB,     vscab);
      _tscad->put(SCAD_CODAG,      codag); 
      _tscad->put(SCAD_DATASOLL,   datasoll);
      _tscad->put(SCAD_NSOLL,      nsoll);
    
      _tscad->rewrite();
    }
    else
    {
      _tscad->put(SCAD_TIPOCF,     tipo);
      _tscad->put(SCAD_GRUPPO,     gruppo);
      _tscad->put(SCAD_CONTO,      conto);
      _tscad->put(SCAD_SOTTOCONTO, sottoc);
      _tscad->put(SCAD_ANNO,       anno);
      _tscad->put(SCAD_NUMPART,    numpart);
      _tscad->put(SCAD_NRIGA,      nriga);
      _tscad->put(SCAD_NRATA,      nrata);
      _tscad->put(SCAD_DATASCAD,   datascad);
      _tscad->put(SCAD_CODPAG,     codpag);
      _tscad->put(SCAD_TIPOPAG,    tipopag);
      _tscad->put(SCAD_ULTCLASS,   ultclass);
      _tscad->put(SCAD_IMPORTO,    importo);
      _tscad->put(SCAD_IMPORTOVAL, impval);  
      _tscad->put(SCAD_DESCR,      descr);
      _tscad->put(SCAD_CODABIPR,   nsabi);
      _tscad->put(SCAD_CODCABPR,   nscab);
      _tscad->put(SCAD_CODABI,     vsabi);
      _tscad->put(SCAD_CODCAB,     vscab);
      _tscad->put(SCAD_CODAG,      codag); 
      _tscad->put(SCAD_DATASOLL,   datasoll);
      _tscad->put(SCAD_NSOLL,      nsoll);
    
      _tscad->write();
    }
  } 
}

void TVar_sc::registra_pagamenti(TMask& m)
{ 
  TString passat;
  
  TSheet_field& pag = (TSheet_field&)m.field(F_RIGAPAGSCA);
    
  for (int i = 0 ; i < pag.items(); i++)
  { 
    TToken_string& row = pag.row(i);

    char    tipo      = row.get     (0)[0];
    int     gruppo    = row.get_int (1);
    int     conto     = row.get_int (2);
    long    sottoc    = row.get_long(3);
    int     anno      = row.get_int (5);
    TString numpart   = row.get     (6);
    int     nriga     = row.get_int (7);
    int     nrata     = row.get_int (8); 
    int     nrigp     = row.get_int (9);
  
    TString accsal    = row.get     (10);
    real    importo    (row.get     (12));
    real    ritenute   (row.get     (14));
    real    abbuoni    (row.get     (16));
    real    diffcam    (row.get     (18));
    real    impval     (row.get     (19));
    char    tipoc     = row.get     (20)[0];
    int     gruppoc   = row.get_int(21);
    int     contoc    = row.get_int(22);
    long    sottocc   = row.get_long(23);
    long    nsabi     = row.get_long(25);
    long    nscab     = row.get_long(26);
    long    vsabi     = row.get_long(27);
    long    vscab     = row.get_long(28);
    TString codag     = row.get     (29);
    
    TString codval = "";
    char sez = sezione(tipo,gruppo,conto,sottoc,anno,numpart,nriga,codval,*_mask);
    
    char sezab = row.get(15)[0];
    
    if (sezab != sez)
      abbuoni = abbuoni * -1;

    if (sezab == 'A')
      passat = "P";
    else
      if (sezab == 'D')
        passat = "A";
    
    char sezdc = row.get(17)[0];
                                        
    if (sezdc != sez)
      diffcam = diffcam * -1;

    _tpagsca->setkey(1);
    _tpagsca->zero();
    _tpagsca->put(PAGSCA_TIPOC,      tipo);
    _tpagsca->put(PAGSCA_GRUPPO,     gruppo);
    _tpagsca->put(PAGSCA_CONTO,      conto);
    _tpagsca->put(PAGSCA_SOTTOCONTO, sottoc);
    _tpagsca->put(PAGSCA_ANNO,       anno);
    _tpagsca->put(PAGSCA_NUMPART,    numpart);
    _tpagsca->put(PAGSCA_NRIGA,      nriga);
    _tpagsca->put(PAGSCA_NRATA,      nrata);   
    _tpagsca->put(PAGSCA_NRIGP,      nrigp);
          
    if (_tpagsca->read() == NOERR)
    {                              
      _tpagsca->put(PAGSCA_TIPOC,      tipo);
      _tpagsca->put(PAGSCA_GRUPPO,     gruppo);
      _tpagsca->put(PAGSCA_CONTO,      conto);
      _tpagsca->put(PAGSCA_SOTTOCONTO, sottoc);
      _tpagsca->put(PAGSCA_ANNO,       anno);
      _tpagsca->put(PAGSCA_NUMPART,    numpart);
      _tpagsca->put(PAGSCA_NRIGA,      nriga);
      _tpagsca->put(PAGSCA_NRATA,      nrata); 
      _tpagsca->put(PAGSCA_NRIGP,      nrigp);
      _tpagsca->put(PAGSCA_ACCSAL,     accsal);
      _tpagsca->put(PAGSCA_IMPORTO,    importo);
      _tpagsca->put(PAGSCA_RITENUTE,   ritenute);
      _tpagsca->put(PAGSCA_ABBUONI,    abbuoni);
      _tpagsca->put(PAGSCA_DIFFCAM,    diffcam);
      _tpagsca->put(PAGSCA_IMPORTOVAL, impval);  
      _tpagsca->put(PAGSCA_TIPOCC,     tipoc);  
      _tpagsca->put(PAGSCA_GRUPPOC,    gruppoc);
      _tpagsca->put(PAGSCA_CONTOC,     contoc);
      _tpagsca->put(PAGSCA_SOTTOCONTC, sottocc);
      _tpagsca->put(PAGSCA_CODABIPR,   nsabi);
      _tpagsca->put(PAGSCA_CODCABPR,   nscab);
      _tpagsca->put(PAGSCA_CODABI,     vsabi);
      _tpagsca->put(PAGSCA_CODCAB,     vscab);
      _tpagsca->put(PAGSCA_CODAG,      codag); 
      _tpagsca->put(PAGSCA_PASSATT,    passat);
    
      _tpagsca->rewrite();
    }  
    else
    {
      _tpagsca->put(PAGSCA_TIPOC,      tipo);
      _tpagsca->put(PAGSCA_GRUPPO,     gruppo);
      _tpagsca->put(PAGSCA_CONTO,      conto);
      _tpagsca->put(PAGSCA_SOTTOCONTO, sottoc);
      _tpagsca->put(PAGSCA_ANNO,       anno);
      _tpagsca->put(PAGSCA_NUMPART,    numpart);
      _tpagsca->put(PAGSCA_NRIGA,      nriga);
      _tpagsca->put(PAGSCA_NRATA,      nrata); 
      _tpagsca->put(PAGSCA_NRIGP,      nrigp);
      _tpagsca->put(PAGSCA_ACCSAL,     accsal);
      _tpagsca->put(PAGSCA_IMPORTO,    importo);
      _tpagsca->put(PAGSCA_RITENUTE,   ritenute);
      _tpagsca->put(PAGSCA_ABBUONI,    abbuoni);
      _tpagsca->put(PAGSCA_DIFFCAM,    diffcam);
      _tpagsca->put(PAGSCA_IMPORTOVAL, impval);  
      _tpagsca->put(PAGSCA_TIPOCC,     tipoc);  
      _tpagsca->put(PAGSCA_GRUPPOC,    gruppoc);
      _tpagsca->put(PAGSCA_CONTOC,     contoc);
      _tpagsca->put(PAGSCA_SOTTOCONTC, sottocc);
      _tpagsca->put(PAGSCA_CODABIPR,   nsabi);
      _tpagsca->put(PAGSCA_CODCABPR,   nscab);
      _tpagsca->put(PAGSCA_CODABI,     vsabi);
      _tpagsca->put(PAGSCA_CODCAB,     vscab);
      _tpagsca->put(PAGSCA_CODAG,      codag); 
      _tpagsca->put(PAGSCA_PASSATT,    passat);
    
      _tpagsca->write();
    }
  }
}   

bool TVar_sc::leggi_trasfer()
{ 
  _trasf = _tras_file.path(_dittaric);
  _trasf << HEADER;
  
  _tras_file.open(_trasf);
  
  if (_tras_file.exist())
  {  
    if (_tras_file.read_control_rec())
      _control_rec = _tras_file.record();
    else
      return error_box("Rilevati gravi errori negli archivi:procedura interrotta");
  } 
  else
    return error_box("Al momento non presenti trasferimenti attivi sulla ditta selezionata");
  
  return TRUE; 
}

bool TVar_sc::esegui_controlli()
{                    
  TConfig conf(CONFIG_DITTA);           
  
  _std = conf.get("FlStTra");

  if (!prefix().exist(_dittaric))
    return error_box("Rilevati gravi errori negli archivi: procedura interrotta");
  
  if (!leggi_trasfer())
    return FALSE;

  if (!controlli())
    return FALSE;     
  
  return TRUE;
}

void TVar_sc::setta_parametri_record(const TString& sigla,const TString& flag)
{ 
  TConfig conf (CONFIG_DITTA);
  
  conf.set("FlStTra", flag);
  
  leggi_record_controllo();
  _control_rec.overwrite(sigla,240);
  
  const int size = 1024;
  
  _tras_file.write_control_rec(_control_rec, size);
}

bool TVar_sc::controlli()
{ 
  TString16 chiave,sigla;
  
  chiave = _control_rec.sub(241,256);
  chiave.trim();        
  sigla  = _control_rec.sub(240,241);
  sigla.trim();

  if (_std == "M" && sigla == "Z" && chiave != "")
    return error_box("Variazione NON POSSIBILE: trasferimento movimenti gia' iniziato");           
  
  if (_std == "M" && sigla == "U")
    return error_box("Variazione NON POSSIBILE: trasferimento movimenti gia' iniziato");           

  if (_std == "M" && sigla == "B")
    return error_box("Variazione NON POSSIBILE: trasferimento movimenti saldaconto gia' iniziato");           

  if (_std == "*") 
  {
    warning_box("Trasferimento interamente completato: proseguire per cancellare il file");    
    _tras_file.remove_all();
    setta_parametri_record(" "," ");
    return FALSE;
  }

  if (_std == "T")
    return error_box("Variazione NON POSSIBILE: eseguire prima la ricezione delle tabelle");           
  
  return TRUE;
}

bool TVar_sc::menu(MENU_TAG m)
{
  if (m == BAR_ITEM(1))
    return main_loop(); 
  return FALSE;
}