// 771230.cpp - Quadri C, D, D1, E, E1, E2
#include <relapp.h>
#include <config.h>
#include <msksheet.h>
#include <sort.h>
#include <tabutil.h>                
#include <progind.h>
#include "caus77.h"
#include "77lib.h"
#include "scperc.h"
#include "rpag.h"
#include "perc.h"
#include "prospe1.h"
#include "defmask.h"
#include "771230a.h" 
#include "774200.h"

class TQuadroC_E2 : public TRelation_application
{
  private:                                             
    TString			_quadro;	// Codice del quadro in gestione        
    bool  			_registra;  // Se TRUE fa i riporti
    
    struct righe_pag
    {
     char tipoa;
     char codan[6];
     char codcau[3];
     char perc[7]; //3 + 2decimali + la virgola
     real somme;
     real impo;
     real rite;
     real comp;
     bool acim;
     bool bInps;
     real inps;                                 
    };
    righe_pag*       	_rig;
    TRelation*       	_rel;
    TMask*           	_msk[2];
    TSort*           	_sort;
    long             	_codanagr;
    char             	_tipoa, _tipoq;
    int              	_nproga;
    int              	_mode;
    int              	_anno_dic;  // anno dichiarazione
    TLocalisamfile*  	_per, *_scper, *_rpag, *_qd;
    TTable*          	_ca7; 
    TRiporti         	_rip;
    long							_codditta;    
    int   						_file;

  private:               
    static bool nprog_handler   (TMask_field& f, KEY key);
    static bool codanagr_handler(TMask_field& f, KEY key);
    static bool genera_handler  (TMask_field& f, KEY key);
    static bool codditta_hnd    (TMask_field& f, KEY key);    
    static bool setta_nprog     (TMask_field& f);
    static bool imponibile_hnd  (TMask_field& f, KEY key);

    bool QuadroC()  const { return _tipoq == 'C'; }  
    bool QuadroD()  const { return _tipoq == 'D'; }  
    bool QuadroD1() const { return _tipoq == '1'; }  
    bool QuadroE()  const { return _tipoq == 'E'; }  
    bool QuadroE1() const { return _tipoq == '2'; }  
    bool QuadroE2() const { return _tipoq == '3'; }  
                    
  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);  
    virtual void init_query_mode (TMask&);
    virtual void init_query_insert_mode (TMask&);    
    virtual void on_config_change();    
    
    TMask* load_mask(int n);
    bool generazione(); 
    bool azzera_quadro();
    void riempi_record(char,long,int,const real&,const real&,
                       const real&,const real&,const real&,bool,
                       const real& inps_perc, bool bCinps=FALSE);
    void init_sort(); 
    void leggi_sort(TProgind&);
    TRectype& look_causali(int c);
    int anno_dic() const { return _anno_dic; }
    bool scrivi_dati_per(TRectype& rec);
    void genera_prospetto(int,real&,real&,real&);
        
  public:                    
    TQuadroC_E2(char tipo);
    virtual ~TQuadroC_E2() {};
};                    

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

TQuadroC_E2::TQuadroC_E2(char tipo): _rel(NULL), _mode(0), _tipoq(tipo)
{  
  memset(_msk, 0, sizeof(_msk));  
}

bool TQuadroC_E2::changing_mask(int mode)
{
  if (mode == MODE_QUERY)
    return _mode != MODE_QUERY;
  else
    return TRUE;
}
        
TMask* TQuadroC_E2::get_mask(int mode)
{
  const int m = (mode == MODE_QUERY) ? 0 : 1;
  _mode = mode;
  return load_mask(m);
}

TMask* TQuadroC_E2::load_mask(int n)
{
  if (_msk[n] != NULL) 
    return _msk[n]; 
    
  TFilename name("771230"); 
  
  if (n == 0) 
  { 
    switch (_tipoq) 
    {
    case 'C':
      name << 'd';
      break;
    case 'D':
      name << 'a';
      break;
    case '1':
      name << 'e';
      break;
    case 'E' :
      name << 'g';
      break;
    case '2' :
      name << 'i';
      break;       
    case '3':
      name = "77qe2a";
      break;
    default:
      break;
    }
  }
  else 
  {
    switch (_tipoq)
    {
    case 'C':
      name << 'f';
      break;
    case 'D':
      name << 'b';
      break;
    case '1':
      name << 'c';
      break;      
    case 'E':
      name << 'h';
      break;
    case '2' :
      name << 'l';
      break;        
    case '3':
      name = "77qe2b";
      break;
    default:
      break;
    }
  }  
  
  TMask* m = new TMask(name);

  switch (n)
  {                                   
    case 0:
      if (m)
      {        
       m->set_handler(F_CODDITTA, codditta_hnd);
       m->set_handler(F_NPROG, nprog_handler);
       m->set_handler(F_CODANAGRCOM, codanagr_handler);
       m->set_handler(F_CODANAGRPERC, codanagr_handler);
       if (_quadro != "E2")
         m->set_handler(F_GENERA, genera_handler);    
      }
      break;
    case 1:                                 
      if (m)
      {
        m->set_handler(F_IMPONIBILE, imponibile_hnd);
        m->set_handler(F_PERC,       imponibile_hnd);
      }
      break;
    default:
      break;  
  }        
  m->disable(DLG_FINDREC);
  
  return _msk[n] = m;
}

// Ricerca e output dell'ultimo nprog del percipiente scelto
bool TQuadroC_E2::setta_nprog(TMask_field& f)
{
  long  nprog = 0L;
  const char tipoa    = f.mask().get(F_TIPOA)[0];
  const long codanagr = atol(f.get());
  const long codditta = get_firm_770();
  
  TLocalisamfile quad(app()._file);
    
  quad.zero();
  quad.put("CODDITTA", codditta);
  quad.put("TIPOA",    tipoa);
  quad.put("CODANAGR", codanagr);
    
  TRectype rec(quad.curr());
    
  quad.read();
    
  if (quad.curr() > rec) 
  {
    f.mask().set(F_NPROG, nprog+1);
    return TRUE;
  }
      
  for ( ; !quad.eof(); quad.next())   
  {
    if (quad.curr() > rec) break;
    nprog = quad.get_long("NPROG");
  }

  //app()._last_scheda = nprog;

  f.mask().set(F_NPROG, nprog+1);
  return TRUE;
}

bool TQuadroC_E2::codditta_hnd(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 TQuadroC_E2::imponibile_hnd(TMask_field& f, KEY k)
{         
  if (k == K_TAB)
  {
    if (f.dlg() == F_PERC)
    {
      real perc (f.get());
      if (perc == ZERO)
      {                              
        int causale = f.mask().get_int(F_CODCAUS);
        TRectype& cau = app().look_causali(causale);
        real aliquota = cau.get_real(rPERC_RAC);
        f.mask().set(F_PERC, aliquota.string());
      }
    }

    real imponibile (f.mask().get(F_IMPONIBILE));
    real aliquota   (f.mask().get(F_PERC));
    
    real importo = ZERO;
    
    importo = imponibile * (aliquota/100);

    f.mask().set(app()._tipoq == 'C' ? F_RITENUTE : F_IMPORTO, importo.string());
  }   
  return TRUE;                                           
}

void TQuadroC_E2::init_sort()
{
  _rig  = new righe_pag;
  _sort = new TSort(sizeof(righe_pag));

  _sort->addsortkey ((char*)&(_rig->tipoa)  - (char*)&(_rig->tipoa), 1);
  _sort->addsortkey ((char*)&(_rig->codan)  - (char*)&(_rig->tipoa), 5);
  _sort->addsortkey ((char*)&(_rig->codcau) - (char*)&(_rig->tipoa), 2);
  _sort->addsortkey ((char*)&(_rig->perc)   - (char*)&(_rig->tipoa), 6);
  _sort->init();
}

void TQuadroC_E2::riempi_record(char t,long ca,int cc,const real& p, 
                             const real& so,const real& im,
                             const real& ri,const real& co,bool acim,
                             const real& inps, bool bInps)
{
  _rig->tipoa = t;
  sprintf(_rig->codan, "%5ld", ca);
  sprintf(_rig->codcau, "%02d", cc);
// 22.5.96 Cambiato il formato @@@,@@ con @.@@@,@@
// Ci vuole anche il punto delle migliaia se real::string() sbaglia 
// a calcolare il numero di decimali.
//  TString16 pp(p.string("@.@@@,@@"));
  double ppd = atof(p.string());
  sprintf(_rig->perc, "%.2f", ppd);
  _rig->somme = so;
  _rig->impo  = im;
  _rig->rite  = ri;
  _rig->comp  = co;
  _rig->acim  = acim;                        
  _rig->inps  = inps;                                    
  _rig->bInps = bInps;
  _sort->sort((const char*)_rig);
}    

bool TQuadroC_E2::genera_handler(TMask_field& f , KEY k)
{
  if (k == K_SPACE)  
  {
    app().generazione();
    app()._registra = TRUE; // Genera i riporti alla fine
  }
  return TRUE;
}

TRectype& TQuadroC_E2::look_causali(int codc)
{                            
  TString16 dep;
  _ca7->zero();
  dep.format("%02d", codc);
  _ca7->put("CODTAB", dep);
  _ca7->read();      
  if (_ca7->bad())
     _ca7->zero();
  return _ca7->curr();
}

bool TQuadroC_E2::generazione()
{ 
  if (!yesno_box("Conferma la generazione ?"))
    return FALSE;

  init_sort();
  
  TToken_string exp;
  exp.add("CODDITTA=CODDITTA");
  exp.add("TIPOA=TIPOA");
  exp.add("CODANAGR=CODANAGR");
  exp.add("NPROG=NPROG");
  
  TRelation rel (LF_SCPERC);
  rel.add(LF_RPAG, exp, 1);
  TString16 filt; filt.format("CODDITTA=%ld", get_firm_770());
  
  TCursor cur (&rel,filt,1);              
  
  azzera_quadro();
  
  TLocalisamfile& scperc = rel.lfile();
  TLocalisamfile& rpag   = rel.lfile(LF_RPAG);  
  cur = 0L;
  const long nitems = cur.items();  
  
  TProgind p(nitems ? nitems : 1, "Generazione in corso...", FALSE, TRUE, 70);
  long codan, codditta;
  char tipoa;
  int codcaus, nprog;
  TString16 qua;
  TDate datapag; 
  real perc=ZERO,spesa=ZERO,impo=ZERO,rite=ZERO,comp=ZERO,inps=ZERO;
  
  for (; cur.pos() < nitems; ++cur)
  { 
    p.addstatus(1);
    
    codditta = scperc.get_long(SPR_CODDITTA);
    tipoa    = scperc.get(SPR_TIPOA)[0];
    codan    = scperc.get_long(SPR_CODANAGR);
    codcaus  = scperc.get_int(SPR_CODCAUS);
    nprog    = scperc.get_int(SPR_NPROG);
    
    TRectype  cau        = look_causali(codcaus);
    TString16 qua        = cau.get(bCODICE_QUADRO);
    bool      acc_imp    = cau.get_bool(bSOMME_ASSOG_RAC);
    bool	  bContrInps = cau.get_bool(bCONTRIBUTO_INPS);
                         
    if (_tipoq == 'D' && qua != "D")  continue;
    if (_tipoq == 'C' && qua != "C")  continue;  
    if (_tipoq == '1' && qua != "D1") continue;
    if (_tipoq == 'E' && qua != "E")  continue;
    if (_tipoq == '2' && qua != "E1") continue;
    
    if (cur.is_first_match(LF_RPAG))
    {
      TRecnotype nrec = rpag.recno();
      rpag.zero();
      rpag.setkey(1);
      rpag.put(PAG_CODDITTA, (long)codditta);      
      rpag.put(PAG_TIPOA, tipoa);
      rpag.put(PAG_CODANAGR, (long)codan);
      rpag.put(PAG_NPROG, nprog);
      TRectype recc (rpag.curr());
      for (rpag.read(_isgteq); !rpag.eof() ;rpag.next())
      {
        TRectype rec (rpag.curr());
        if (rec > recc) break;
        datapag = rpag.get(PAG_DATAPAG);
        if (datapag.year() != _anno_dic)
          continue;  
        //codtrib = cau.get_int("I0");
        perc  = rpag.get_real(PAG_PERC);
        spesa = rpag.get_real(PAG_SPESA);
        rite  = rpag.get_real(PAG_RITENUTA);
        impo  = rpag.get_real(PAG_IMPONIBILE);
        comp  = rpag.get_real(PAG_COMPENSO);    
        inps  = rpag.get_real(PAG_INPSPERC);
        
        if (perc==ZERO && comp==ZERO && rite==ZERO && impo==ZERO 
            && spesa==ZERO) 
          continue;
        riempi_record(tipoa,codan,codcaus,perc,spesa,impo,rite,comp,acc_imp,inps,bContrInps);  
      } 
      rpag.readat(nrec);
    }
  }
  _sort->endsort();      
  
  leggi_sort(p);
  
  delete _rig;
  delete _sort;
  return TRUE;
}                

bool TQuadroC_E2::azzera_quadro()
{ 
  const char* title;
  
  if (_tipoq == 'C')
    title = "Azzeramento quadro C";
  else
    if (_tipoq == 'D')
      title = "Azzeramento quadro D";
    else    
      if (_tipoq == '1')
        title = "Azzeramento quadro D1";
      else 
        if (_tipoq == 'E')
          title = "Azzeramento quadro E";
        else
          title = "Azzeramento quadro E1";
                 

// Tutto cio' solo per contare gli items e far andare correttamente
// il "termometro" (sic..)
  TRelation rel (_file);
  TString16 filt; filt.format("CODDITTA=%ld", get_firm_770());
  TCursor cur (&rel,filt,1);           
//  TLocalisamfile& quadro = rel.lfile();   
  TLocalisamfile quadro(_file);                    
  cur = 0L;
  const long nitems = cur.items();  
  
  TProgind prog(nitems, title, FALSE, TRUE);

  quadro.zero();
  quadro.put("CODDITTA", (long)get_firm_770());
  TRectype dep(quadro.curr());
    
  for (quadro.read(); !quadro.eof(); quadro.next())
  { 
    prog.addstatus(1);
    if (quadro.curr() > dep) break;
    quadro.read(_isequal, _lock);
    quadro.remove();
  }   
  
  if (_tipoq == '2')
  {            
    TLocalisamfile quadro(LF_PROSPE1);                    
  
    TProgind prog(quadro.items(), "Azzeramento prospetto del quadro E1", FALSE, TRUE);
  
    quadro.zero();
    quadro.put("CODDITTA", (long)get_firm_770());
    TRectype dep(quadro.curr());
    
    for (quadro.read(); !quadro.eof(); quadro.next())
    { 
      prog.addstatus(1);
      if (quadro.curr() > dep) break;
      quadro.read(_isequal, _lock);
      quadro.remove();
    }   
  }
  return TRUE;
}     

void TQuadroC_E2::genera_prospetto(int cau, real& comp, real& impo, real& rite)
{
  TLocalisamfile pr (LF_PROSPE1);
  
  pr.setkey(1);
  pr.zero();
  pr.put(PRE_CODDITTA, (long)get_firm_770());
  pr.put(PRE_CODCAUS,  cau);
  if (pr.read() == NOERR)
  {
    comp += pr.get_real(PRE_COMPENSO);
    impo += pr.get_real(PRE_IMPONIBILE);
    rite += pr.get_real(PRE_RITENUTA);

    pr.put(PRE_COMPENSO,   comp);
    pr.put(PRE_IMPONIBILE, impo);
    pr.put(PRE_RITENUTA,   rite);
    pr.rewrite();    
  }
  else
  {
    pr.put(PRE_CODDITTA,   (long)get_firm_770());
    pr.put(PRE_CODCAUS,    cau);
    pr.put(PRE_COMPENSO,   comp);
    pr.put(PRE_IMPONIBILE, impo);
    pr.put(PRE_RITENUTA,   rite);
    pr.write();
  }
}

void TQuadroC_E2::leggi_sort(TProgind& p)
{
  TLocalisamfile qd(_file);
  const char* buf;
  TString16 keyp, key, perc, perc_p; 
  char tipoa, tipoa_p;
  long codanag, codanag_p;
  int codcaus_p, codcaus, nprog;
  real tot_somme=ZERO,tot_impo=ZERO,tot_rite=ZERO,tot_comp=ZERO, rQCInps=ZERO;
  real rTotQCInps    = ZERO;
  bool esiste_record=FALSE, bAssoggettateRacc=FALSE,bFattoProspetto=FALSE;
  struct righe_pag* rp;

  keyp = key = ""; 
  nprog = 1;
  tot_somme = tot_impo = tot_rite = tot_comp = ZERO;
  
  while ((buf = _sort->retrieve()) != NULL)
  {
    p.addstatus(1);
    esiste_record = TRUE;
    rp 			= (struct righe_pag*)buf;
    tipoa   					= rp->tipoa;           
    codanag 					= atol(rp->codan);
    codcaus 					= atoi(rp->codcau);
    perc    					= rp->perc;                                                      
    bAssoggettateRacc = rp->acim;
// non frega un tubo    bInps   = rp->bInps;  // se la riga aveva il contributo inps nella caus.
    rQCInps =  rp->inps;    

    if (QuadroE1() && !bAssoggettateRacc) 
    {
      genera_prospetto(codcaus,rp->comp,rp->impo,rp->rite);
      bFattoProspetto = TRUE;
    }
    else
    {
      key.format("%c%5ld%2d%s", tipoa, codanag, codcaus, (const char*)perc);
      if ( (key != keyp) && (keyp != "") ) 
      {
        bFattoProspetto = FALSE;
        qd.zero();
        qd.put("CODDITTA", (long)get_firm_770());
        qd.put("TIPOA",    tipoa_p);
        qd.put("CODANAGR", (long)codanag_p);
        qd.put("CODCAUS",  codcaus_p);                
        qd.put("NPROG",    nprog++);

// 12.6.96 aggiunto contributo inps        
        if (QuadroC())
          qd.put("CONTSSN", rTotQCInps);
          
        if (QuadroD() || QuadroC() || QuadroE())
          qd.put("SOMME", tot_somme + tot_comp - tot_impo);
        else
          if (QuadroD1())
          {
            qd.put("QUOTAPRO", tot_comp - tot_impo);
            qd.put("SPESEANT", tot_somme);
          }
          else
            if (QuadroE1())
              qd.put("SOMME", tot_comp);
        
        if (QuadroE1())
          qd.put("AMMONTARE",  tot_impo);
        else
          qd.put("IMPONIBILE", tot_impo);
        
        if (QuadroC())
          qd.put("RITENUTE", tot_rite);
        else
          qd.put("IMPORTO",  tot_rite);
    
        qd.put("PERC", perc_p);
      
        if (!QuadroE() && !QuadroE1())
          qd.put("TOTALE", tot_comp + tot_somme);
        
        if (QuadroC())
      qd.put("TOTALE", tot_somme + tot_impo + rTotQCInps);
          
        if (QuadroE1())
          qd.put("NETTO", tot_comp - tot_rite);
        else
          qd.put("NETTO", tot_impo - tot_rite); 
        qd.write();     
        rTotQCInps = tot_impo = tot_somme = tot_rite = tot_comp = ZERO;
      }                  
      
      tot_somme 	+= rp->somme;
      tot_rite  	+= rp->rite;
      tot_impo  	+= rp->impo; 
      tot_comp  	+= rp->comp;
      rTotQCInps 	+= rQCInps;
    
      if (tipoa_p != tipoa || codanag != codanag_p)
        nprog = 1;
      
      tipoa_p   = tipoa;        
      codanag_p = codanag;
      codcaus_p = codcaus;
      perc_p    = perc;
    
      keyp.format("%c%5ld%2d%s", tipoa_p, codanag_p, codcaus_p, (const char*)perc_p);
    } 
  }    // while (retrieve() != NULL)

  if (esiste_record || bFattoProspetto)
  {
    qd.zero();
    qd.put("CODDITTA", (long)_codditta);
    qd.put("TIPOA",    tipoa_p);
    qd.put("CODANAGR", (long)codanag_p);
    qd.put("CODCAUS",  codcaus_p);                
    qd.put("NPROG",    nprog++);

    if (QuadroD() || QuadroC() || QuadroE())
      qd.put("SOMME", tot_somme + tot_comp - tot_impo);
    else
      if (QuadroD1())
      {
        qd.put("QUOTAPRO", tot_comp - tot_impo);
        qd.put("SPESEANT", tot_somme);      
      }
      else                              
        if (QuadroE1())
          qd.put("SOMME", tot_comp);
  
    if (QuadroE1())
      qd.put("AMMONTARE",  tot_impo);
    else
      qd.put("IMPONIBILE", tot_impo);
    
    if (QuadroC())
      qd.put("RITENUTE", tot_rite);
    else
      qd.put("IMPORTO",  tot_rite);
      
    qd.put("PERC", perc_p);

// 12.6.96 aggiunto contributo inps
    if (QuadroC())
      qd.put("CONTSSN", rTotQCInps);
          
    if (!QuadroE() && !QuadroE1())
      qd.put("TOTALE", tot_comp + tot_somme);

    if (QuadroC())
      qd.put("TOTALE", tot_somme + tot_impo + rTotQCInps);
      
    if (QuadroE1())
      qd.put("NETTO", tot_comp - tot_rite);
    else
      qd.put("NETTO", tot_impo - tot_rite); 
    qd.write();     
  }  
}

bool TQuadroC_E2::codanagr_handler(TMask_field& f, KEY k)
{
  if (k == K_TAB && f.focusdirty())
  {                      
    TMask& m = f.mask();
    const long codanagr = atol(f.get()); 
    const char tipoa    = m.get(F_TIPOA)[0];
// 12.6.96 Non lascia andare avanti se il perc. non esiste
    if (!esiste_perc(tipoa, codanagr))
      return f.warning_box("Percipiente inesistente");
    if (app()._quadro != "E2")
      f.mask().disable(F_GENERA);
    TString16 dummy(f.get());
    if (dummy.not_empty())   
      setta_nprog(f);
  }
  return TRUE;
}

// Passa al modo inserimento/modifica.
bool TQuadroC_E2::nprog_handler(TMask_field& f, KEY key)
{
  if (!f.mask().is_running()) return TRUE;
  
  if (key == K_TAB)   
  {
    const int nprog = atoi(f.get());
    if (nprog==0) return TRUE;
    f.mask().stop_run(K_AUTO_ENTER); // entra in modo modifica (se il record che ha chiave specificata esiste gia') oppure
                                     // inserimento (se trova che non esiste)
  }                                   
  return TRUE;
}

bool TQuadroC_E2::scrivi_dati_per(TRectype& rec)
{
  TLocalisamfile dati_per(LF_PERC);
  const long codditta = rec.get_long("CODDITTA");
  char       tipoa    = rec.get_char("TIPOA");
  const long codanagr = rec.get_long("CODANAGR");
  
  dati_per.zero();
  dati_per.put("CODDITTA", codditta);    
  dati_per.put("TIPOA", tipoa);    
  dati_per.put("CODANAGR", codanagr);   
  
  const bool preesistente = (dati_per.read() == NOERR);
  
  if (!preesistente)
  {
    dati_per.zero();
    dati_per.put("CODDITTA", codditta);    
    dati_per.put("TIPOA", tipoa);    
    dati_per.put("CODANAGR", codanagr);   
  
    dati_per.write();   
  }
    
  return preesistente;
}

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

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

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

bool TQuadroC_E2::user_create()
{                      
  switch (_tipoq)
  {
  case 'C':
    _file   = LF_QUAC;
    _quadro = "C";
    break;
  case 'D':
    _file   = LF_QUAD;
    _quadro = "D";
    break;
  case '1':
    _file   = LF_QUAD1;
    _quadro = "D1";
    break;           
  case 'E':
    _file   = LF_QUAE;
    _quadro = "E";
    break;
  case '2':
    _file   = LF_QUAE1;
    _quadro = "E1";
    break;    
  case '3':
    _file   = LF_QUAE2;
    _quadro = "E2";
    break;    
  default:
    break;
  }
     
  _qd       = new TLocalisamfile(_file);
  _rel      = new TRelation(_file);
  _rpag     = new TLocalisamfile(LF_RPAG);
  _ca7      = new TTable ("%CA7");
  _codditta	= get_firm_770();
  set_search_field(F_CODANAGRPERC);
  
  _registra = FALSE;
  
  load_mask(0);                                   

  return TRUE;
}

bool TQuadroC_E2::user_destroy()
{ 
  if (_msk[1] != NULL) delete _msk[1];
  if (_msk[0] != NULL) delete _msk[0];

  TString16 quadro = "";
  
  switch (_tipoq)
  {
  case 'C':
    quadro << "C";
    break;
  case 'D':
    quadro << "D";
    break;
  case '1':
    quadro << "D1";
    break;         
  case 'E':
    quadro << "E";
    break;
  case '2':
    quadro << "E1";
    break;    
  case '3':
    quadro << "E2";
    break;    
  default:
    break;
  }
  
  if (_registra)
    _rip.set(quadro);

  delete _rel; 
  delete _qd;
  delete _rpag;
  delete _ca7;
  
  return TRUE;
}

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

void TQuadroC_E2::init_query_mode(TMask& m)
{ 
  m.set(F_ANNODIC, _anno_dic); 
  if (_quadro != "E2")
    m.enable(F_GENERA); 
    
// forza il ricalcolo dell'ultimo numero disponibile
  TString16 dummy(m.get(F_NPROG));
  if (dummy.not_empty())
    setta_nprog(m.field(F_NPROG));

  m.send_key(K_SHIFT+K_CTRL+'h', -1);  // nasconde (hide) group 1 - Scelta ANAGR
  m.send_key(K_SHIFT+K_CTRL+'s', -2);  // abilita (show) group 2 - Ricerca su DATI PERC
}

void TQuadroC_E2::init_query_insert_mode(TMask& m)
{ 
  m.set(F_ANNODIC, _anno_dic);

  m.send_key(K_SHIFT+K_CTRL+'h', -2);  // group 3 Nasconde ricerca su PERC
  m.send_key(K_SHIFT+K_CTRL+'s', -1);  // group 1 Ricerca su ANAGR
}

int quadriC_E2(int argc, char* argv[])
{
  const char tipo = toupper(*argv[2]); 
  const char* title = "Quadro D";
  TQuadroC_E2 a(tipo);
  switch (tipo)
  {
    case '1':
      title = "Quadro D1";
      break;
    case 'C':
      title = "Quadro C";
      break;      
    case 'E':
      title = "Quadro E";
      break;
    case '2':
      title = "Quadro E1";
      break;
    case '3':
      title = "Quadro E2";
      break;
    default:
      break;    
  }
  a.run(argc, argv, title);
  return TRUE;
}
