//Apertura nuovo esercizio IVA
#include "nditte.h"
#include "cg4501.h"
#include "cg4500b.h"

bool TAp_iva::mask_annoiva (TMask_field& f, KEY k)
{
  if ( (k == K_ENTER) && f.to_check(k) )
    //if ( (k == K_TAB) && f.mask().is_running() )
  {
    int annoiva = f.mask().get_int(F_ANNOIVA);
    TConfig conf(CONFIG_DITTA);
    int annoivap = atoi(conf.get("AnLiIv"));
    if (annoiva != annoivap + 1)
    {
      f.warning_box("Il nuovo anno esercizio IVA deve essere successivo all'anno esercizio IVA precedente");
      return FALSE;
    }    
  }
  return TRUE;
}  

bool TAp_iva::create()
{
  _nditte = new TLocalisamfile(LF_NDITTE);
  _reg    = new TTable("REG");
  _lia    = new TTable("%LIA"); 
  _lbu    = new TTable("%LBU");

  enable_menu_item(M_FILE_NEW, FALSE);

  dispatch_e_menu (BAR_ITEM(1));
  
  return TRUE;
}

bool TAp_iva::destroy()
{
  delete _nditte;
  delete _reg;
  delete _lia;
  delete _lbu;
  
  return TRUE;
}

bool TAp_iva::apertura_iva()
{
  TTable TabReg ("REG"); 
  TTable TabLia ("%LIA");
  TTable TabLbu ("%LBU");
  TLocalisamfile nditte (LF_NDITTE);
  TString annoiva (4);
  TDate data;
  bool ok = FALSE;

  int annop = atoi(_annop);
  annoiva = format("%04d", _annoiva);
  
  //viene aggiornata la tabella LIA (liquidazione iva annuale)
  TabLia.zero();
  TabLia.put ("CODTAB", format("%05ld%04d", get_firm(), _annoiva));
  if (TabLia.read() == NOERR)
    TabLia.remove();
  
  TabLia.zero();
  TRectype newrec (TabLia.curr());   
  TabLia.put ("CODTAB", format("%05ld%04d", get_firm(), annop));
  
  if (TabLia.read() == NOERR)
  {
    ok = TRUE;
    newrec = TabLia.curr();
    newrec.put("CODTAB", format("%05ld%04d", get_firm(), _annoiva));
    newrec.put("S7", _frequenza);
    
    TabLia.write(newrec);
  }   
  if (!ok)
  {
    error_box("Non esiste il record relativo all'anno iva precedente sulla tabella liquidazione annuale iva");
    return FALSE;
  }  
  
  //viene aggiornata la tabella del libro unico. 
  TabLbu.zero();
  TabLbu.put ("CODTAB", annoiva);
  
  TRectype r (TabLbu.curr());
  
  TabLbu.read(_isgteq);
  
  for (; !TabLbu.eof(); TabLbu.next())
  {
    if (TabLbu.curr() != r) break;
    
    TabLbu.remove();      
  } 

  ok = FALSE;
  TabLbu.zero();
  TRectype nrec (TabLbu.curr());   
  TabLbu.put ("CODTAB", _annop);
  
  TRectype rec (TabLbu.curr());
  
  TabLbu.read(_isgteq);
  
  for (; !TabLbu.eof(); TabLbu.next())
  { 
    if (TabLbu.curr() != rec) break;
    
    TRecnotype nr = TabLbu.recno();    
    TString cod_lib = TabLbu.get("CODTAB");
    cod_lib = cod_lib.mid(4,3);
    ok = TRUE;
    nrec = TabLbu.curr();
    TString16 cod;
    cod << _annoiva << cod_lib; 
    nrec.put("CODTAB", cod);
    nrec.put("I0", 0L);
    
    TabLbu.write(nrec);  
    TabLbu.readat(nr);
  }   
  /*
     if (!ok)
     {
     error_box("Non esistono i registri del libro unico relativi all'anno iva precedente");
     return FALSE;
     }
  */
  
  //viene aggiornata la tabella dei registri. 
  TabReg.zero();
  TabReg.put ("CODTAB", annoiva);
  
  TRectype rr (TabReg.curr());
  
  TabReg.read(_isgteq);
  
  for (; !TabReg.eof(); TabReg.next())
  {
    if (TabReg.curr() != rr) break;
    
    int tiporeg = TabReg.get_int("I0");
    if ( (tiporeg == 1)||(tiporeg == 2)||(tiporeg == 3) )
      TabReg.remove();
  }
  
  ok = FALSE;
  TabReg.zero();
  TRectype nuovo (TabReg.curr());   
  TabReg.put ("CODTAB", _annop);
  
  TRectype recc (TabReg.curr());
  
  TabReg.read(_isgteq);
  
  for (; !TabReg.eof(); TabReg.next())
  { 
    if (TabReg.curr() != recc) break;
    
    TRecnotype nr = TabReg.recno();
    int tiporeg     = TabReg.get_int("I0");
    TString cod_reg = TabReg.get("CODTAB");
    TDate  data_vid = TabReg.get_date("D0");
    data_vid.addyear();
    cod_reg = cod_reg.mid(4,3);
    if ( (tiporeg == 1)||(tiporeg == 2)||(tiporeg==3) )
    {
      ok = TRUE;
      nuovo  = TabReg.curr();
      TString16 cod;
      cod << annoiva << cod_reg;  
      nuovo.put("CODTAB", cod);
      nuovo.put("I1", 0L);
      nuovo.put("I2", 0L);
      nuovo.put("I4", 0L);
      nuovo.put("I5", 0L);
      nuovo.put("I6", 0L);
      nuovo.put("S1", "");
      nuovo.put("D0", data_vid);
      nuovo.put("D2", data);
      nuovo.put("D3", data);
      nuovo.put("R1", real(0.0));
      nuovo.put("R2", real(0.0));
      
      TabReg.write(nuovo);
      TabReg.readat(nr);
    }   
  }
  /*
     if (!ok)
     {
     error_box("Non esistono i registri iva relativi all'anno iva precedente");
     return FALSE;
     }  
  */
  
  //viene aggiornato l'anno iva sui parametri ditta 
  TConfig conf(CONFIG_DITTA);
  conf.set("AnLiIv", annoiva);

  //sull'anagrafica ditte viene aggiornata la frequenza versamento
  nditte.zero();
  nditte.put("CODDITTA", _ditta);
  if (nditte.read() == NOERR)
  {
    nditte.put(NDT_FREQVIVA, _frequenza);
    nditte.rewrite();
  }
  message_box("Apertura nuovo esercizio IVA completata");
  return TRUE;
}

bool TAp_iva::menu(MENU_TAG m)
{
  TTable TabLia ("%LIA");
  TLocalisamfile nditte (LF_NDITTE);
  TMask msk ("cg4500b");

  TConfig conf(CONFIG_DITTA);
  _annop    = conf.get("AnLiIv");
  int aivap = atoi(_annop);
  int anno = aivap+1;
  
  TabLia.zero();    
  TString16 chiave; chiave.format("%05ld%04d", get_firm(), anno);
  TabLia.put("CODTAB",chiave);
  if (TabLia.read() == NOERR)
    msk.set(F_FREQUENZA, TabLia.get("S7"));
  else
  {  
    TabLia.zero();         
    chiave = "";
    chiave.format("%05ld%04d", get_firm(), aivap);
    TabLia.put("CODTAB", chiave);
    if (TabLia.read() == NOERR)
      msk.set(F_FREQUENZA, TabLia.get("S7"));
    else
    {      
      nditte.zero();
      nditte.put("CODDITTA", get_firm());
      if (nditte.read() == NOERR)
        msk.set(F_FREQUENZA, nditte.get(NDT_FREQVIVA));
    }
  }
  
  msk.set(F_ANNOIVA, aivap+1);  

  msk.set_handler (F_ANNOIVA, mask_annoiva);

  if (msk.run() == K_ENTER)
  {
    _ditta     = msk.get_long(F_CODDITTA); 
    _annoiva   = msk.get_int(F_ANNOIVA);   
    _frequenza = msk.get(F_FREQUENZA)[0];
    
    apertura_iva();
  }
  return FALSE;
}