// 775100.cpp - Gestione archivio percipienti
#include <relapp.h> 

#include "77lib.h"
#include "775100a.h"

class TGestionePercipienti : public TRelation_application
{
  private:
    TRelation*          _rel;
    TMask*              _msk;
    long				_codditta;
    char				_tipoa;
    long				_codanagr;  
    bool				_auto_posiz, _deleted;
    int					_anno_dic;
  protected:
    virtual void	on_config_change();
    virtual void	init_query_mode(TMask& m);
    virtual void	init_modify_mode(TMask& m);
    void 			init_mask(TMask& m);
    virtual bool 	user_create();
    virtual bool 	user_destroy();  
    virtual TRelation*   get_relation() const { return _rel; }
    virtual TMask*       get_mask(int mode)   { return _msk; }
    virtual bool         changing_mask(int mode) { return FALSE; }
    virtual bool	remove();
    static  bool		codditta_handler(TMask_field& f, KEY k);
  public:
    TGestionePercipienti(const long codditta=0L, const char tipoa='\0', const long codanagr=0L);
    virtual ~TGestionePercipienti() {};    
};

inline TGestionePercipienti& app() { return (TGestionePercipienti&) main_app(); }

bool TGestionePercipienti::remove()
{
  bool ok1 = FALSE, ok2 = FALSE, ha_schede = FALSE;
  int err;
  TPercipiente perc(_rel->curr());                
  
  ha_schede = perc.esiste_scheda();
  if (ha_schede)
    ok1 = yesno_box("Esistono in archivio delle schede riguardanti il percipiente selezionato\nEliminare ugualmente?");  
  if (!ok1)
    return TRUE;
  err = _rel->remove();

// Non ri-compilare i dati in init_query_mode()
  _deleted = TRUE;

  if (err != NOERR) 
    return TRUE;
  if (ha_schede)
  {
    ok2 = yesno_box("Eliminare anche le schede collegate?");
    err = perc.elimina_schede();
  }
  return TRUE;
}

void TGestionePercipienti::init_mask(TMask& m)
{ 
  TString16 tipo;
  m.set(F_ANNODIC, _anno_dic);  
  tipo << _tipoa; 
  m.set(F_TIPOA, tipo);
}

void TGestionePercipienti::init_query_mode(TMask& m)
{
  init_mask(m);
  if (_auto_posiz && !_deleted) 
  {
    TString16 dit, tipo, coda;
    dit << _codditta;
    tipo << _tipoa;
    coda << _codanagr;
    m.set(F_CODDITTA, dit);
    m.set(F_TIPOA,    tipo);
    m.set(F_CODANAGR, coda);
    m.send_key(K_AUTO_ENTER, 0);
  }
}

void TGestionePercipienti::init_modify_mode(TMask& m)
{
  init_mask(m);
}

TGestionePercipienti::TGestionePercipienti(const long codditta, const char tipoa, const long codanagr)
 : _codditta(codditta), _tipoa(tipoa), _codanagr(codanagr), _auto_posiz(FALSE)
{
  _auto_posiz = _codanagr != 0L;
  _deleted    = FALSE;
}

void TGestionePercipienti::on_config_change()
{
  TConfig conf(CONFIG_STUDIO);
  _anno_dic = (int)conf.get_long(ANNO_SEL, NULL); 
}

bool TGestionePercipienti::codditta_handler(TMask_field& f, KEY k)
{         
  if (k == K_TAB && !(f.mask().is_running()) )
  {
    TString16 codditta; codditta << app()._codditta;
    if (codditta != "0")        
    {
      f.set(codditta);
      f.check();
    }
  }   
  return TRUE;                                           
}

bool TGestionePercipienti::user_create()
{
  _rel  = new TRelation(LF_PERC);
  _msk  = new TMask("775100a");

  if (!_auto_posiz) 
    _codditta = get_firm_770();

  _msk->set_handler(F_CODDITTA, codditta_handler);  
  set_search_field(F_CODANAGR);
  return TRUE;
}

bool TGestionePercipienti::user_destroy()
{
  delete _rel; delete _msk;
  return TRUE;
}

// 775 -0 10001 F 10
int GestPerc(int argc, char* argv[])
{ 
  long codditta = 0L;
  char tipoa = 'F';
  long codanagr = 0L;
    
  if (argc >= 5)   
  {
    codditta = atol(argv[2]);
    tipoa    = *argv[3];
    codanagr = atol(argv[4]); 
  }
  
  TGestionePercipienti a(codditta, tipoa, codanagr);
  a.run(argc, argv, "Gestione percipienti");
  return 0;
}