// 771290.cpp - Quadro H
#include <applicat.h>
#include <mask.h>
#include <msksheet.h>
#include <relapp.h>
#include <relation.h>
#include <tabutil.h>
#include <urldefid.h>
#include <config.h>      
#include <utility.h>   
#include <mailbox.h>
#include <execp.h>

#include "771290.h"
#include "771295.h"
#include "77lib.h"  
#include "774200.h"
#include <nditte.h>

class TQuadro_H_app : public TRelation_application
{
  TRelation       * _rel;
  TMask           * _msk; 
  TRiporti        _rip;
  
  int     _mode;              // Modo maschera corrente
  long    _codditta;
  int     _anno;
  TString _ente;
  bool    _registra;
   
protected:
  virtual bool user_create();
  virtual bool user_destroy();   
  virtual int  rewrite(const TMask& m);
  virtual int  write  (const TMask& m);  
  virtual bool remove();
  
  virtual TRelation*   get_relation() const { return _rel; }
  virtual TMask*       get_mask(int mode);
  virtual bool         changing_mask(int mode) {return FALSE; }
  
//  void init_mask(TMask&);
  virtual void init_query_mode(TMask&);
  virtual void init_modify_mode(TMask&);
  virtual void init_insert_mode(TMask&);
  virtual void init_query_insert_mode(TMask&);
  virtual void on_config_change();
  
public:
  bool almeno_un_dettaglio(TMask&);
  void refresh(TMask& m);
  static bool generazione (TMask_field& f , KEY k);
  static bool dettaglio   (TMask_field& f , KEY k);
  static bool desc_ente   (TMask_field& f , KEY k);  
  static bool codditta_hnd(TMask_field& f , KEY k);
  
  TQuadro_H_app() {}
};


HIDDEN TQuadro_H_app& app() { return (TQuadro_H_app&) main_app(); }
                                          
bool TQuadro_H_app::codditta_hnd(TMask_field& f, KEY k)
{
  if (k == K_TAB && !(f.mask().is_running()) )
  {
    TString16 codditta; codditta << get_firm_770();
    if (codditta != "0")        
    {
      f.set(codditta);
      f.check();
    }
  }   

  return TRUE;                                           
}
                                          
void TQuadro_H_app::refresh(TMask& m)
{
  TEdit_field& datore = _msk->efield(F_DAT);
  TEdit_field& lavora = _msk->efield(F_LAV);
                      
  //datore.check();
  //lavora.check();                    
  datore.autoload(_rel);
  lavora.autoload(_rel);

  if (almeno_un_dettaglio(m))
    m.enable (F_BTG_GENERA);
  else
    m.disable(F_BTG_GENERA);
    
  m.enable (F_BTG_DETTAGLIO);
}

bool TQuadro_H_app::generazione(TMask_field& f , KEY k)
{
  if (k == K_SPACE) 
  {
    TString appname = "775 -1";
    TToken_string body;

    body.add(app()._codditta);
    body.add(app()._anno);
    body.add(app()._ente);
    
    TMessage msg (appname,"",(const char*) body);
    
    TMailbox mb;
    mb.send(msg);
    
    TLocalisamfile& quaH = app().get_relation()->lfile();
                 
    quaH.setkey(1);
    quaH.zero();
    quaH.put("CODDITTA", app()._codditta);
    quaH.put("H1ANNO",   app()._anno);
    quaH.put("H1ENTE",   app()._ente);                 
    quaH.read(_isequal,_unlock);
    TExternal_app a(appname);
    a.run();
    quaH.read(_iscurr,_lock);
    f.mask().set_focus();
    app().refresh(f.mask());
  }               
  
  return TRUE;
} 
         
bool TQuadro_H_app::dettaglio(TMask_field& f , KEY k)
{
  if (k == K_SPACE) 
  {
    TString appname = "771mod -4";
    TToken_string body;

    body << F_ANNO << "|";
    body << F_ANNO << "=" << f.mask().get(F_H1ANNO) << "|";
    body << F_CODDITTA << "=" << f.mask().get(F_CODDITTA) << "|";
    body << F_ENTE << "=" << f.mask().get(F_ENTE);
    
    TMessage msg (appname,MSG_FS,(const char*) body);
    
    TMailbox mb;
    mb.send(msg);
    
    TLocalisamfile& quaH = app().get_relation()->lfile();
                 
    quaH.setkey(1);
    quaH.zero();
    quaH.put("CODDITTA", app()._codditta);
    quaH.put("H1ANNO",   app()._anno);
    quaH.put("H1ENTE",   app()._ente);                 
    quaH.read(_isequal,_unlock);
    TExternal_app a(appname);
    a.run();
    quaH.read(_iscurr,_lock);
    f.mask().set_focus();
    app().refresh(f.mask());
  }               
  
  return TRUE;
} 
 
bool TQuadro_H_app::desc_ente(TMask_field& f, KEY k)
{
  if (k == K_TAB && f.to_check(k) && f.mask().is_running())
  { 
    TTable ente ("%ENT");
    TString descrizione;
    
    TString codice = f.get();
    
    ente.zero();
    ente.put("CODTAB", codice);
    if (ente.read() == NOERR)
    {
      descrizione = ente.get("S0");
      f.mask().set(F_DESCENTE, descrizione);  
    }
    else
    {
      descrizione = "";
      f.mask().set(F_DESCENTE, descrizione);  
      return f.warning_box("Valore non presente in tabella Enti previdenziali");
    }  
    
  }                                        
                                          
  return TRUE;  
}

void TQuadro_H_app::on_config_change()
{
  TConfig conf(CONFIG_STUDIO);
  _anno = (int) conf.get_long(ANNO_SEL);
} 

TMask* TQuadro_H_app::get_mask(int mode)
{
  return _msk;
}

bool TQuadro_H_app::almeno_un_dettaglio(TMask& m)
{        
  TLocalisamfile dett (LF_DETH);
  
  dett.setkey(1);
  dett.zero();
  dett.put("CODDITTA", _codditta);
  dett.put("ANNO",     _anno);
  dett.put("ENTE",     _ente);
  for (dett.read();!dett.eof();dett.next())
  {
    long    codditta = dett.get_long("CODDITTA");
    int     anno     = dett.get_int ("ANNO");
    TString ente     = dett.get     ("ENTE");
    
    if (_codditta == codditta && _anno == anno && _ente == ente)
      return TRUE;
  }
    
  return FALSE;
}

void TQuadro_H_app::init_insert_mode(TMask& m)
{
  m.show(F_ENTE);
  m.hide(F_ENTEBIS);

  m.disable(F_BTG_GENERA);
  m.disable(F_BTG_DETTAGLIO);
}
                               
void TQuadro_H_app::init_query_mode(TMask& m)
{ 
  on_config_change();
                            
  m.set(F_H1ANNO, _anno);
  
  m.disable(F_BTG_GENERA);
  m.disable(F_BTG_DETTAGLIO);

  m.show(F_ENTE);
  m.hide(F_ENTEBIS);
}                                             

void TQuadro_H_app::init_query_insert_mode(TMask& m)
{                        
  m.set(F_H1ANNO, _anno);
  
  m.hide(F_ENTE);
  m.show(F_ENTEBIS);

  m.disable(F_BTG_GENERA);
  m.disable(F_BTG_DETTAGLIO);
}

void TQuadro_H_app::init_modify_mode(TMask& m)
{                               

  _codditta = m.get_long(F_CODDITTA);
  _anno     = m.get_int (F_H1ANNO);
  _ente     = m.get     (F_ENTE);
  
  if (almeno_un_dettaglio(m))
    m.enable (F_BTG_GENERA);
  else
    m.disable(F_BTG_GENERA);
    
  m.enable (F_BTG_DETTAGLIO);
  
  m.show(F_ENTE);
  m.hide(F_ENTEBIS);
}

int TQuadro_H_app::rewrite(const TMask& m)
{
  m.autosave(_rel);
  _registra = TRUE;
  return _rel->rewrite();
}

int TQuadro_H_app::write(const TMask& m)
{
  m.autosave(_rel);
  _registra = TRUE;
  return _rel->write();
}

bool TQuadro_H_app::remove()
{
  _registra = TRUE;
  return TRelation_application::remove();
}

bool TQuadro_H_app::user_create()
{
  _rel = new TRelation (LF_QUAH);
  _msk = new TMask("771290a");
  
  set_search_field(F_H1ANNO);
  _msk->set_handler (F_CODDITTA,       codditta_hnd);
  _msk->set_handler (F_BTG_GENERA,     generazione);        
  _msk->set_handler (F_BTG_DETTAGLIO,  dettaglio);        
  _msk->set_handler (F_ENTE,           desc_ente);
  _msk->set_handler (F_ENTEBIS,        desc_ente);  
  
  _registra = FALSE;
  
  return TRUE;
}

bool TQuadro_H_app::user_destroy()
{                   
  if (_registra)
// 20.12.95 l'anno deve essere quello dei parametri
//    _rip.set("H",_anno); 
    _rip.set("H");
    
  delete _msk;
  delete _rel;

  return TRUE;
}

int m71290(int argc, char* argv[])
{
  TQuadro_H_app a;
  a.run(argc, argv, "Quadro H");
  return 0;
}


