
#include <applicat.h>
#include <tabapp.h>  
#include <strings.h>
#include <stdtypes.h>
#include <tabutil.h>
#include <utility.h> 
#include <prefix.h>    
#include <nditte.h>

#include "..\ba\batbind.h"
#include "cglib04.h"

class Tabinv_application : public Tab_application
{
private:
  TMask*         _msk;     
  TString        _tabname;
  TTransfer_file _tras_file;
  
  TString _trasf,_control_rec;                   
  long    _ditta_tab, _ditta_tras;  
  bool    _disable,_ditte_uguali,_salta_hnd,_messaggio;
  
public:
  bool user_create();
  virtual void init_query_mode(TMask&);
  virtual void init_modify_mode(TMask&);
  virtual void init_insert_mode(TMask&);
  virtual int  write(const TMask& m);
  virtual int  rewrite(const TMask& m);

  void leggi_trasfer();
  char cerca_stato(long codditta);
  
  static bool controlli_hnd (TMask_field& f, KEY k);
  
  static bool nascosto_handler(TMask& m, KEY k);    
  static bool stato_invio     (TMask_field& f, KEY k);
  
  static bool ditta_handler (TMask_field& f, KEY k); 
  static bool almeno_un_flag(TMask_field& f, KEY k);
  static bool clifo_comune  (TMask_field& f, KEY k);
  static bool pcon_comune   (TMask_field& f, KEY k);    
  static bool prima_nota    (TMask_field& f, KEY k);    
  static bool iva           (TMask_field& f, KEY k);    
  static bool saldaconto    (TMask_field& f, KEY k);        
  static bool data_invio    (TMask_field& f, KEY k);
  static bool sigla_file    (TMask_field& f, KEY k);    
  static bool chiave_file   (TMask_field& f, KEY k);

  static bool nome_id       (TMask_field& f, KEY k);      
  
  void   setta_chiave       (TMask& m);

  Tabinv_application() {}
  virtual ~Tabinv_application() {}
};

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

char Tabinv_application::cerca_stato(long ditta)
{
  TTable ind ("%IND");
  TString dep;
  char    stato = '\0';
  
  dep = format("%05d", ditta);
  
  ind.zero();
  ind.put("CODTAB", dep);
  if (ind.read() == NOERR)
    stato = ind.get_char("S6");
  
  return stato;  
}

bool Tabinv_application::nascosto_handler(TMask& m, KEY k)
{
  if (k == K_SHIFT+K_F12)
  { 
    if (app()._tabname == "%IND")
    {             
      app()._disable = FALSE;
      
      m.enable(F_NUMULINV);
      m.enable(F_DATAULIN);
      m.enable(F_STATO);

      if ( (app()._ditta_tab == app()._ditta_tras) && m.mode() != MODE_INS)   
      {
        m.enable(F_USELAB);
        m.enable(F_CHIAVE);
      }
    }
    else
      if (app()._tabname == "%INS")
      {
        m.enable(F_DITTAINV);
        app()._salta_hnd = TRUE;
      }
  }
  
  return TRUE;
}

bool Tabinv_application::stato_invio(TMask_field& f, KEY k)
{
  if ( (k == K_ENTER || k == K_TAB) && f.mask().mode() != MODE_QUERY )
  {                                
    if ( k == K_ENTER)
    {                  
      TString stato = f.get();
      int num = f.mask().get_int(F_NUMULINV);
      TString sigla = f.mask().get(F_USELAB);
      
      if (num == 0 && stato != "")
        return error_box("Numero ultimo invio NON INDICATO: impossibile indicare lo stato ultimo invio");  
    
      if ( (stato == "F" && sigla == "") || (stato == "D" && sigla != "") )
        return error_box("La sigla ultimo file elaborato deve essere indicata se lo stato ultimo invio e' uguale a F");    
    }
    
    if (k == K_TAB && app()._messaggio)
    { 
      long codditta = f.mask().get_long(F_DITTAINV);
      
      char stato = app().cerca_stato(codditta);
      
      if (stato != '\0' && app()._disable)
      {
        app()._messaggio = FALSE; 
        return message_box("Rilevato STATO DI RIPARTENZA: prima concludere il trasferimento");    
      }
    }
  }
  
  return TRUE;
}

bool Tabinv_application::ditta_handler(TMask_field& f, KEY k)
{
  if (k == K_TAB && f.mask().mode() == MODE_QUERY)
  { 
    long codditta = f.mask().get_long(F_DITTAINV);
    
    if (codditta != 0)
    {
      if (!prefix().exist(codditta))
      {
        f.error_box("La ditta selezionata non e' abilitata per la contabilita' ");
        return FALSE;
      }
    }  
  }   
  if (k == K_TAB)
  {
    TLocalisamfile ditte (LF_NDITTE);
  
    long ditta = f.mask().get_long(F_DITTAINV);
  
    ditte.setkey(1);
    ditte.zero();
    ditte.put(NDT_CODDITTA, ditta);
    if (ditte.read() == NOERR)
    {
      TString ragsoc = ditte.get(NDT_RAGSOC);
      f.mask().set(F_RAGSOC, ragsoc);
    }  
    else
      f.mask().set(F_RAGSOC, "");

    app()._ditta_tab = f.mask().get_long(F_DITTAINV);
    
    if (app()._ditta_tab == app()._ditta_tras) 
    { 
      TTable ind ("%IND");
      TString dep;
  
      dep = format("%05d", app()._ditta_tab);
    
      ind.zero();
      ind.put("CODTAB", dep);
      if (ind.read() == NOERR)
      {                
        TString uselab = app()._tras_file.ult_file();
        TString chiave = app()._tras_file.key();
                                                       
        f.mask().set(F_USELAB, uselab);
        f.mask().set(F_CHIAVE, chiave);
      }
      else
      {
        f.mask().set(F_USELAB, "");
        f.mask().set(F_CHIAVE, "");
      }
      app()._ditte_uguali = TRUE;
    }                      
    else 
    {
      app()._ditte_uguali = FALSE;
      f.mask().set(F_USELAB, "");
      f.mask().set(F_CHIAVE, "");
    }  
  }   
  return TRUE;
}

bool Tabinv_application::almeno_un_flag(TMask_field& f, KEY k)
{
  if (k == K_ENTER && f.mask().mode() != MODE_QUERY) 
  {          
    bool cau   = f.mask().get_bool(F_CAUSALI);
    bool clifo = f.mask().get_bool(F_CLIFO);
    bool pcon  = f.mask().get_bool(F_PCON);
    bool pn    = f.mask().get_bool(F_MOV);
    bool iva   = f.mask().get_bool(F_IVA);
    bool fat   = f.mask().get_bool(F_FATT);
    
    if (!cau && !clifo && !pcon && !pn && !iva && !fat)
      return error_box("E' necessario indicare almeno una sigla file da trasferire");            
    
    long ditta = f.mask().get_long(F_DITTAINV);
    
    app().set_firm(ditta);            
    
    TConfig conf (CONFIG_DITTA);

    TString pcon_cau = conf.get("PcTcCm","cg");
    
    bool causali = f.mask().get_bool(F_CAUSALI);    
    
    if (causali && pcon_cau != "")
      return error_box("Tabella causali in comune: impossibile trasferirla");
  }
  
  return TRUE;
}

bool Tabinv_application::clifo_comune(TMask_field& f, KEY k)
{
  if (k == K_ENTER && f.mask().mode() != MODE_QUERY)
  {
    long ditta = f.mask().get_long(F_DITTAINV);
    
    app().set_firm(ditta);            
    
    TConfig conf (CONFIG_DITTA);

    TString ana_com  = conf.get("AnCfCm","cg");
    
    bool clifo = f.mask().get_bool(F_CLIFO);
    
    if (clifo && ana_com != "")
      return error_box("Anagrafica clienti / fornitori in comune: impossibile trasferirla");
  }
  
  return TRUE;
}

bool Tabinv_application::pcon_comune(TMask_field& f, KEY k)
{
  if (k == K_ENTER && f.mask().mode() != MODE_QUERY)
  {
    long ditta = f.mask().get_long(F_DITTAINV);
    
    app().set_firm(ditta);            
    
    TConfig conf (CONFIG_DITTA);
    
    TString pcon_cau = conf.get("PcTcCm","cg");
    
    bool pcon = f.mask().get_bool(F_PCON);
    
    if (pcon && pcon_cau != "")
      return error_box("Anagrafica Piano dei conti in comune: impossibile trasferirla");
  }
  
  return TRUE;
}

bool Tabinv_application::prima_nota(TMask_field& f, KEY k)
{
  if (k == K_SPACE && f.mask().mode() != MODE_QUERY)
  {
    bool pn = f.mask().get_bool(F_MOV);

    if (!pn && f.mask().get_bool(F_IVA) )    
    {
      f.mask().set(F_MOV, "X");
      return f.error_box("Se si vuole inviare l' iva e' obbligatorio inviare anche la primanota");            
    }
    if (!pn && f.mask().get_bool(F_FATT) )  
    {
      f.mask().set(F_MOV, "X");
      return f.error_box("Se si vuole inviare il saldaconto e' obbligatorio inviare anche la primanota");            
    }
  }

  return TRUE;
}

bool Tabinv_application::iva(TMask_field& f, KEY k)
{
  if (k == K_SPACE && f.mask().mode() != MODE_QUERY)
  {
    bool iva = f.mask().get_bool(F_IVA);
    bool sc  = f.mask().get_bool(F_FATT);

    if (iva)
      f.mask().set(F_MOV, "X");
  }

  return TRUE;
}

bool Tabinv_application::saldaconto(TMask_field& f, KEY k)
{
  if (k == K_SPACE && f.mask().mode() != MODE_QUERY)
  {
    bool iva = f.mask().get_bool(F_IVA);
    bool sc  = f.mask().get_bool(F_FATT);

    if (sc)
      f.mask().set(F_MOV, "X");
  }

  return TRUE;
}

bool Tabinv_application::data_invio    (TMask_field& f, KEY k)
{
  if (k == K_ENTER && f.mask().mode() != MODE_QUERY)
  {
    int   num = f.mask().get_int(F_NUMULINV);
    TDate data (f.get());
    
    if (num != 0 && !data.ok())
      return error_box("Se indicato il numero deve essere indicata anche la data di invio");
    
    if (num == 0 && data.ok())
      return error_box("Se non indicato il numero non puo' essere indicata la data di invio");
  }
  
  return TRUE;
}

bool Tabinv_application::sigla_file(TMask_field& f, KEY k)
{
  if (k == K_ENTER && f.mask().mode() != MODE_QUERY)
  {
    int     num   = f.mask().get_int(F_NUMULINV);
    TString sigla = f.get();
    
    if (num == 0 && sigla != "")
      return error_box("Numero ultimo invio NON INDICATO: impossibile indicare la sigla ultimo file elaborato");

//    TString stato = f.mask().get(F_STATO);
    
//    if ( (stato == "F" && sigla == "") || (stato == "D" && sigla != "") )
//      return error_box("La sigla ultimo file elaborato deve essere indicata se lo stato ultimo invio e' uguale a F");  
    
  }
  
  return TRUE;
}

bool Tabinv_application::chiave_file(TMask_field& f, KEY k)
{
  if (k == K_ENTER && f.mask().mode() != MODE_QUERY)
  {
    TString sigla  = f.mask().get(F_USELAB);
    TString chiave = f.get();
    
    if (sigla == "" && chiave != "")
      return error_box("Sigla ultimo file elaborato NON INDICATA: impossibile indicare la chiave ultimo record elaborato");
    
    TString stato = f.mask().get(F_STATO);
    
    if (stato != "F" && chiave == "" && sigla != "")
      return error_box("La chiave ultimo record elaborato deve essere indicata obbligatoriamente");  
  }
  
  return TRUE;
}

void Tabinv_application::setta_chiave(TMask& m)
{
  m.set(F_CODICE, "INS");
  m.field(F_CODICE).check();
}

bool Tabinv_application::nome_id(TMask_field& f, KEY k)
{
  if (k == K_TAB)
  {
    TLocalisamfile ditte (LF_NDITTE);
  
    long ditta = f.mask().get_long(F_DITTAINV);
    if (ditta != 0)
    {
      if (!prefix().exist(ditta))
      {
        f.error_box("La ditta selezionata non e' abilitata per la contabilita' ");
        return FALSE;
      }
    }    
  
    ditte.setkey(1);
    ditte.zero();
    ditte.put(NDT_CODDITTA, ditta);
    if (ditte.read() == NOERR)
    {
      TString ragsoc = ditte.get(NDT_RAGSOC);
      f.mask().set(F_RAGSOC, ragsoc);
    }
    else
      f.mask().set(F_RAGSOC, "");
    
    TTable ind ("%IND");
    TString dep;
  
    if (ditta != 0)
    {
      dep = format("%05d", ditta);
    
      ind.zero();
      ind.put("CODTAB", dep);
      if (ind.read() == NOERR)
      {
        TString stato = ind.get     ("S6");
        int     num   = ind.get_int ("I0");
        TDate   data  = ind.get_date("D0");
      
        f.mask().set(F_STATO,    stato);
        f.mask().set(F_NUMULINV, num);
        f.mask().set(F_DATAULIN, data.string());
      }                     
      else
      {
        f.mask().set(F_STATO,    "");
        f.mask().set(F_NUMULINV, "");
        f.mask().set(F_DATAULIN, "");    
        f.error_box("Codice ditta NON PRESENTE in tabella trasferimenti");
      }
    }
    else
    {
      f.mask().set(F_STATO,    "");
      f.mask().set(F_NUMULINV, "");
      f.mask().set(F_DATAULIN, "");    
    }
    
    app()._ditta_tab = f.mask().get_long(F_DITTAINV);
  
    if (app()._ditta_tab == app()._ditta_tras)
    {
      TString uselab = app()._tras_file.ult_file();
      TString chiave = app()._tras_file.key();
    
      f.mask().set(F_USELAB, uselab);
      f.mask().set(F_CHIAVE, chiave);
      app()._ditte_uguali = TRUE;
    }                      
    else 
    {
      app()._ditte_uguali = FALSE;
      f.mask().set(F_USELAB, "");
      f.mask().set(F_CHIAVE, "");
    } 
  }
  if (k == K_TAB && !app()._salta_hnd && f.mask().mode() != MODE_QUERY)
  { 
    long codditta = f.mask().get_long(F_DITTAINV);
    
    if (codditta != 0)  
      return message_box("Rilevato STATO DI RIPARTENZA: prima concludere il trasferimento");
  }
        
  return TRUE;
}

//void Tabinv_application::esegui_controlli(TMask& m)
bool Tabinv_application::controlli_hnd(TMask_field& f, KEY k)
{                                                            
  if (k == K_TAB && !f.mask().field(F_NUMULINV).enabled()) 
  {
    int   num  = f.mask().get_int(F_NUMULINV);
    TDate data (f.mask().get(F_DATAULIN));
    
    if (num != 0 && !data.ok())
      return error_box("Se indicato il numero deve essere indicata anche la data di invio");
    
    if (num == 0 && data.ok())
      return error_box("Se non indicato il numero non puo' essere indicata la data di invio");

    TString sigla = f.mask().get(F_USELAB);
    
    if (num == 0 && sigla != "")
      return error_box("Numero ultimo invio NON INDICATO: impossibile indicare la sigla ultimo file elaborato");
    
    TString stato = f.mask().get(F_STATO);
    
    if (stato != "F" && sigla != "")
      return error_box("La sigla ultimo file elaborato puo' essere indicata solo se lo stato ultimo invio e' F");  

    TString chiave = f.mask().get(F_CHIAVE);
    
    if (sigla == "" && chiave != "")
      return error_box("Sigla ultimo file elaborato NON INDICATA: impossibile indicare la chiave ultimo record elaborato");
    
    if (stato != "F" && chiave == "" && sigla != "")
      return error_box("La chiave ultimo record elaborato deve essere indicata obbligatoriamente");  
  }
  return TRUE;
}

void Tabinv_application::leggi_trasfer()
{                           
  _trasf = ""; 
  _trasf = firm2dir(0);
  _trasf << HEADER;
  
  _tras_file.open(_trasf);
  
  if (_tras_file.exist())
  {  
    if (_tras_file.read_control_rec())  
    {
      _control_rec = _tras_file.record();
      _ditta_tras  = _tras_file.ditta();
    }
    else
      _ditta_tras = 0;
  } 
  else
    _ditta_tras = 0;
}

void Tabinv_application::init_query_mode(TMask& m)
{
  leggi_trasfer();
  _disable = TRUE;
  _messaggio = TRUE;    

  if (_tabname == "%INS")
  {              
    setta_chiave(m);        
    m.send_key(K_AUTO_ENTER,0);  
    
    m.disable(F_DITTAINV);
  }  
  
  m.disable(F_NUMULINV);
  m.disable(F_DATAULIN);
  m.disable(F_STATO);
  m.disable(F_USELAB);
  m.disable(F_CHIAVE);
}

void Tabinv_application::init_modify_mode(TMask& m)
{  
  if (_tabname == "%IND")  
  {
    leggi_trasfer();

    long ditta = m.get_long(F_DITTAINV);
    
    if (ditta == _ditta_tras) 
    { 
      TString uselab = _tras_file.ult_file();
      TString chiave = _tras_file.key();
                                                       
      m.set(F_USELAB, uselab);
      m.set(F_CHIAVE, chiave);
    }
    else
    {
      m.set(F_USELAB, "");
      m.set(F_CHIAVE, "");
    }   

    char stato = app().cerca_stato(ditta);    
    
    if (stato == '\0')
    {
      m.enable(F_CAUSALI);
      m.enable(F_CLIFO);
      m.enable(F_PCON);
      m.enable(F_MOV);
      m.enable(F_IVA);
      //m.enable(F_FATT);
      m.enable(F_BOLLATO);    
    }
    else
    {
      m.disable(F_CAUSALI);
      m.disable(F_CLIFO);
      m.disable(F_PCON);
      m.disable(F_MOV);
      m.disable(F_IVA);
      //m.disable(F_FATT);
      m.disable(F_BOLLATO);
    }
  }
  if (_tabname == "%INS")
  {                 
    setta_chiave(m);        
  
    m.disable(F_DITTAINV);
    
    long ditta = m.get_long(F_DITTAINV);
    if (ditta == 0)
      m.enable(F_NOMEID);
    else
      m.disable(F_NOMEID);
  }
  
  m.disable(F_NUMULINV);
  m.disable(F_DATAULIN);
  m.disable(F_STATO);
  m.disable(F_USELAB);
  m.disable(F_CHIAVE);  
}

void Tabinv_application::init_insert_mode(TMask& m)
{  
  if (_tabname == "%IND")
    leggi_trasfer();
  
  if (_tabname == "%INS")
    m.disable(F_DITTAINV);
  
  m.disable(F_NUMULINV);
  m.disable(F_DATAULIN);
  m.disable(F_STATO);
  m.disable(F_USELAB);
  m.disable(F_CHIAVE);  
}

int Tabinv_application::write(const TMask& m)
{                                            
  if (_tabname == "%IND")
  {  
    if (m.mode() != MODE_INS)
    {
      TString str;
    
      TString std = m.get(F_STATO);
      
      TConfig conf (CONFIG_DITTA);
      conf.set("FlStInv", std);
    
      int     num    = m.get_int(F_NUMULINV);
      TString data   = m.get    (F_DATAULIN);
      TString sigla  = m.get    (F_USELAB);        
      TString chiave = m.get    (F_CHIAVE);
    
      if (sigla == "")
        sigla = " ";
    
      if (_tras_file.read_control_rec())  
      {                               
        if (_ditte_uguali)
        {
          _control_rec = _tras_file.record();
          str = format("%03d", num);
          _control_rec.overwrite(str,30);
          str = riconverti(data,TRUE);
          _control_rec.overwrite(str,33);
          _control_rec.overwrite(sigla,240);
          str = format("%-15s", (const char*) chiave);
          _control_rec.overwrite(str,241);
        
          _tras_file.write_control_rec(_control_rec,256);
        }
      }
    }
  }      
  
  return Tab_application::write(m);
}

int Tabinv_application::rewrite(const TMask& m)
{    
  if (_tabname == "%IND")
  {  
    if (m.mode() != MODE_INS)
    {
      TString str;
    
      TString std = m.get(F_STATO);
    
      TConfig conf (CONFIG_DITTA);
      conf.set("FlStInv", std);
    
      int     num    = m.get_int(F_NUMULINV);
      TString data   = m.get    (F_DATAULIN);
      TString sigla  = m.get    (F_USELAB);        
      TString chiave = m.get    (F_CHIAVE);
    
      if (sigla == "")
        sigla = " ";
    
      if (_tras_file.read_control_rec())  
      {  
        if (_ditte_uguali)
        {
          _control_rec = _tras_file.record();
          str = format("%03d", num);
          _control_rec.overwrite(str,30);
          str = riconverti(data,TRUE);
          _control_rec.overwrite(str,33);
          _control_rec.overwrite(sigla,240);
          str = format("%-15s", (const char*) chiave);
          _control_rec.overwrite(str,241);
        
          _tras_file.write_control_rec(_control_rec,256);
        }
      }
    }
  }    
  
  return Tab_application::rewrite(m);  
}

bool Tabinv_application::user_create()
{ 
  Tab_application::user_create();

  _msk     = get_mask();
  _tabname = get_tabname();

  if (_tabname == "%IND") 
  {                    
    _msk->set_handler(nascosto_handler);
    _msk->set_handler(F_STATO,    stato_invio);                 
    _msk->set_handler(F_DITTAINV, ditta_handler);
    _msk->set_handler(F_CAUSALI,  almeno_un_flag);
    _msk->set_handler(F_CLIFO,    clifo_comune);
    _msk->set_handler(F_PCON,     pcon_comune);
    _msk->set_handler(F_MOV,      prima_nota);
    _msk->set_handler(F_IVA,      iva);
    _msk->set_handler(F_FATT,     saldaconto);
    _msk->set_handler(F_DATAULIN, data_invio);
    _msk->set_handler(F_USELAB,   sigla_file);
    _msk->set_handler(F_CHIAVE,   chiave_file);
    _msk->set_handler(F_GHOST_FIELD, controlli_hnd);
    _msk->disable(F_FATT);     
  }                               
  
  if (_tabname == "%INS")
  {             
    _msk->set_handler(nascosto_handler);  
    _msk->set_handler(F_DITTAINV, nome_id);  
    _salta_hnd = FALSE;
  }
  
  return TRUE;
}

cg6500(int argc, char* argv[])
{
  Tabinv_application a;
  
  a.run(argc,argv, "Tabelle");
  return 0;
}


