#include "ba3601.h"

HIDDEN inline Stp_indici_LUnico & a() {return (Stp_indici_LUnico&) main_app(); }

bool Stp_indici_LUnico::user_create()
{
  _nditte = new TLocalisamfile (LF_NDITTE);
  _anag   = new TLocalisamfile (LF_ANAG);
  _comuni = new TLocalisamfile (LF_COMUNI);
  _indlib = new TLocalisamfile (LF_INDLIB);
  _tab_lbu = new TTable (TAB_LBU);
  _tab_reg = NULL;
  _msk = new TMask("ba3601a"); 
  _msk->set_handler(F_CODDITTA, registri_ditta_hnd);
  _sort = NULL;
  
  return TRUE;
}
                               
bool Stp_indici_LUnico::user_destroy()
{
  delete  _msk;
  delete _tab_lbu;
  delete _indlib;
  delete _nditte;
  delete _anag;
  delete _comuni;
  if (_sort) delete _sort;
  if (_tab_reg) delete _tab_reg;
  
  return TRUE;
}

bool Stp_indici_LUnico::registri_ditta_hnd(TMask_field& f, KEY k)
{
  if (k == K_TAB && f.mask().is_running())
  {  
    bool trovato = FALSE;            
    long    ditta   = f.mask().get_long(F_CODDITTA);  
    if (ditta == 0)
      return f.error_box("La ditta e' obbligatoria");
    long    old_dta = a().get_firm();
    TString cod_lu  = f.mask().get(F_LIBRO_UNICO1);
    if (!prefix().exist(ditta)) return f.error_box("La ditta %ld non ha nessun registro",ditta);
    a().set_firm(ditta);
    int anno = f.mask().get_int(F_ANNO);  
    TTable reg ("REG");
    
    reg.zero();
    for (reg.first();!reg.eof();reg.next())
    {                    
      TString codtab  = reg.get("CODTAB");
      int     annoreg = atoi(codtab.mid(0,4));
      
      if (annoreg == anno)
      {            
        TString cod_lu_reg = reg.get("S6");
        if (cod_lu == cod_lu_reg)
        {
          trovato = TRUE;
          break;
        }
      }
    }                  
    a().set_firm(old_dta); 
    if (!trovato)
      return f.error_box("La ditta %ld per l'anno %d non ha registri che vengono stampati sul libro unico", ditta, anno);
  }
  return TRUE;
}

void Stp_indici_LUnico::ragsoc_ditta(long codditta)
{

  _nditte->zero();
  _nditte->put(NDT_CODDITTA, codditta);
  _nditte->read();
  if (_nditte->bad())        
    _nditte->zero();
  _ragsoc_dta   = _nditte->get(NDT_RAGSOC);
  _tipoa_ditta  = _nditte->get_char(NDT_TIPOA);
  _codana_ditta = _nditte->get_long(NDT_CODANAGR);
}

void Stp_indici_LUnico::dati_anagrafici_ditta()
{
  _anag->setkey(1);
  _anag->zero();
  _anag->put(ANA_TIPOA,    _tipoa_ditta);
  _anag->put(ANA_CODANAGR, _codana_ditta);
  if (_anag->read(_isequal) == NOERR)
  { 
    _cofi_dta   = _anag->get(ANA_COFI);
    _paiv_dta   = _anag->get(ANA_PAIV);
    _codcom_dta = _anag->get(ANA_COMRF);    
    if (_codcom_dta.not_empty())
    {  
      _ind_dta    = _anag->get(ANA_INDRF);
      _civ_dta    = _anag->get(ANA_CIVRF);
      _cap_dta    = _anag->get(ANA_CAPRF);
    }                             
    else
    {
      _codcom_dta = _anag->get(ANA_COMRES);
      _ind_dta    = _anag->get(ANA_INDRES);
      _civ_dta    = _anag->get(ANA_CIVRES);
      _cap_dta    = _anag->get(ANA_CAPRES);
    }                                 
  }
  
  _comuni->setkey(1);
  _comuni->zero();
  _comuni->put(COM_COM,   _codcom_dta);
  if (_comuni->read(_isequal) == NOERR)
  {
    _com_dta  = _comuni->get(COM_DENCOM);
    _prov_dta = _comuni->get(COM_PROVCOM);
  }
}

void Stp_indici_LUnico::dati_libro_unico()
{
  TTable lbu ("%LBU");
  TString dep;
  dep.format("%4d%-3s", _anno, (const char*) _codlib);

  _tab_lbu->put("CODTAB", (const char*) dep);

  if (_tab_lbu->read(_isequal) == NOERR)
  { 
    //_stampa_intesta = _tab_lbu->get_bool("B0");          
    //_stampa_ind     = _tab_lbu->get_bool("B1");
    _tipo_intesta   = _tab_lbu->get_char("S2");
    _codana_intesta = _tab_lbu->get_long("I4");
    _desc_cod_lib   = _tab_lbu->get     ("S0");
  }
}                                        

void Stp_indici_LUnico::intestatario()
{    
  _anag->setkey(1);        
  _anag->zero();
  _anag->put(ANA_TIPOA,    _tipo_intesta);
  _anag->put(ANA_CODANAGR, _codana_intesta);

  if (_anag->read(_isequal) == NOERR)
  {   
    _cofi   = _anag->get(ANA_COFI);
    _paiv   = _anag->get(ANA_PAIV);
    _ragsoc = _anag->get(ANA_RAGSOC);
    _codcom = _anag->get(ANA_COMRF);
    
    if (_codcom.not_empty())
    {      
      _ind    = _anag->get(ANA_INDRF);
      _civ    = _anag->get(ANA_CIVRF);
      _cap    = _anag->get(ANA_CAPRF);
    }                             
    else
    {
      _codcom = _anag->get(ANA_COMRES);
      _ind    = _anag->get(ANA_INDRES);
      _civ    = _anag->get(ANA_CIVRES);
      _cap    = _anag->get(ANA_CAPRES);
    }                                 
  }
  
  _comuni->setkey(1);
  _comuni->zero();
  _comuni->put(COM_COM,   _codcom);
  if (_comuni->read(_isequal) == NOERR)
  {
    _com  = _comuni->get(COM_DENCOM);
    _prov = _comuni->get(COM_PROVCOM);
  }
}

//Crea sort ordina i record della tabella  per mese registrazione,
//numero iniziale pagine registro libro unico

void Stp_indici_LUnico::crea_sort()
{
  TString dep;
  int     mese;
  long ditta;
  
  ind_lib lib;

  if (_sort) delete _sort;
  _sort = new TSort (sizeof(ind_lib));
  
  _sort -> addsortkey((char*)&(lib.mese)      - (char*)&(lib.mese),2);
  _sort -> addsortkey((char*)&(lib.nini_plib) - (char*)&(lib.mese),5);
  _sort->init(); 
  set_firm(_ditta);
  
  if (_tab_reg != NULL) delete _tab_reg;
  _tab_reg = new TTable ("REG");
  _tab_lbu->zero();
  dep.format ("%4d%-3s", _anno, (const char*)_codlib);
  _tab_lbu->put("CODTAB", (const char*) dep);

  if (_tab_lbu->read(_isequal) == NOERR)
  { 
    _indlib->setkey(1);
    _indlib->zero();
    _indlib->put("ANNO",   _anno);
    _indlib->put("CODLIB", (const char*) _codlib);

    TRectype rec (_indlib->curr());

    for (_indlib->read(); !_indlib->eof(); _indlib->next())
    {
      if (_indlib->curr() > rec)  break;
      
      mese  = _indlib->get_int("MESEREG");
      ditta = _indlib->get_long("CODDITTA");

      if (mese >= _meseda && mese <= _mesea && ditta == _ditta)
      {
        sprintf (lib.mese,      "%2d", mese);
        sprintf (lib.nini_plib, "%5ld", _indlib->get_long("PAGINI"));
        lib.nfin_plib = _indlib->get_long("PAGFIN");
        sprintf (lib.cod_reg,   "%-3s", (const char*) _indlib->get("CODREG"));
        lib.nini_put  = _indlib->get_long("PAGINIUT");
        lib.nfin_put  = _indlib->get_long("PAGFINUT");
        sprintf (lib.cod_vid,   "%3s", (const char*) _indlib->get("CODVID"));
        lib.pag_ann = _indlib->get_bool("ANNULLATE");
        _sort->sort ((const char*) &lib);
      }
    }
  }
  _sort->endsort();
}

bool Stp_indici_LUnico::set_print(int)
{
  KEY tasto;

  tasto = _msk->run();
  _oldditta = get_firm();
  if (tasto == K_ENTER) 
  {
    _ended = FALSE;
    _meseprec = "";
    _codlib      = _msk->get(F_LIBRO_UNICO1);
    _datastampa  = _msk->get_date(F_DATA_STAMPA); 
    _meseda      = _msk->get_int (F_MESEDA);
    _mesea       = _msk->get_int (F_MESEA);
    _anno        = _msk->get_int (F_ANNO);
    _ditta       = _msk->get_long(F_CODDITTA);
    ragsoc_ditta(_ditta);
    dati_anagrafici_ditta();
    dati_libro_unico();
    intestatario();
    crea_sort();
    return TRUE;
  }
  return FALSE;
}

void Stp_indici_LUnico::descrizione_codreg(const TString& codreg, TString& desc)
{
  TString16 dep;
  dep.format("%4d%-3s", _anno, (const char*)codreg);
  
  _tab_reg->zero();
  _tab_reg->put("CODTAB", dep);
  _tab_reg->read();

  if (_tab_reg->bad())
    _tab_reg->zero();
  desc = _tab_reg->get("S0");
}

void Stp_indici_LUnico::compatta_ragsoc(TString& ragsoc)
{   
  TString app;
  
  if (_tipo_intesta == 'F')
  {
    app  = ragsoc.mid(29,20);
    app.trim();
    ragsoc = ragsoc.mid(0,30);
    ragsoc.trim();
    ragsoc << ' ' << app; 
  }
} 

void Stp_indici_LUnico::postclose_print()
{
  set_firm(_oldditta);
}

bool Stp_indici_LUnico::preprocess_page(int file, int counter)
{ 
  reset_print();

  struct ind_lib* lib = (struct ind_lib*)  _sort->retrieve();
  if (lib == NULL)
  {
    _ended = TRUE;
    return FALSE;
  }
    
  _mese          = itom(atoi(lib->mese));
  if (_mese == _meseprec) _mese = "";
  else _meseprec = _mese;
  _numini_paglib = atol(lib->nini_plib);
  _numfin_paglib = lib->nfin_plib;
  _cod_reg       = lib->cod_reg;
  descrizione_codreg(_cod_reg,_descrizione);
  _cod_vidimaz   = lib->cod_vid;
  _numini_pagut  = lib->nini_put;
  _numfin_pagut  = lib->nfin_put;
  _pag_ann       = lib->pag_ann;

  return TRUE;
}

void Stp_indici_LUnico::set_page(int file, int counter)
{ 
  int i;

  i = 1;
  
  print_header();
  set_row (i,  "@0g#t",     &_mese);
  set_row (i,  "@22g#t",    &_cod_vidimaz);
  set_row (i,  "@27g#5d",   &_numini_paglib);
  set_row (i,  "@35g#5d",   &_numfin_paglib);

  if (_pag_ann && _cod_reg == "")
    set_row (i,"@53gPAGINE ANNULLATE");
  else
  {
    set_row (i,"@50g#t",    &_cod_reg);
    set_row (i,"@54g#t", &_descrizione);
  }

  set_row (i,  "@85g#5d",  &_numini_pagut);
  set_row (i,  "@93g#5d",  &_numfin_pagut);
}

print_action Stp_indici_LUnico::postprocess_page(int file, int counter)
{ 
  if (_ended) return NEXT_PAGE;
  return REPEAT_PAGE;
}


void Stp_indici_LUnico::print_header()
{ 
  TString sep(132);
  TString ind(_ind);
  
  reset_header();
  ind << ", " << _civ;
  compatta_ragsoc(_ragsoc);
  // Dati studio
  if (_ragsoc.len() > 50) _ragsoc.cut(50);
  set_header (1,"Studio  %-50s @60g%s @110g%s @116g%-13s @129g%s", 
       (const char*)_ragsoc, (const char*)ind, (const char*)_cap, (const char*)_com, (const char*)_prov);
  sep << "Pag. @#";
  sep.right_just(132); 
  set_header (2,(const char*) sep);
  set_header (2,"@0gPartita iva %-11s", (const char*)_paiv);
  set_header (2,"@26gCodice fiscale %-16s", (const char*)_cofi);
  set_header (2,"@105gData  %s",(const char*) _datastampa.string());
  set_header (3,"@0gLibro unico : %s %s", (const char*)_codlib, (const char*)_desc_cod_lib);
  set_header (3,"@70gANNO %4d", _anno);
  sep.fill('-');
  set_header(4, (const char *) sep);
  // Dati ditta
  ind = _ind_dta;
  ind << ", " << _civ_dta;
  if (_ragsoc_dta.len() > 45) _ragsoc_dta.cut(45);
  set_header(5,"Ditta  %05ld %-45s @60g%s @110g%s @116g%-13s @129g%s",
            _ditta,(const char*)_ragsoc_dta,(const char*) ind,(const char*)_cap_dta,
            (const char*)_com_dta,(const char*)_prov_dta);
  set_header(6,"@0gPartita iva %-11s", (const char*)_paiv_dta);
  set_header(6,"@26gCodice fiscale %-16s", (const char*)_cofi_dta);
  set_header(7, (const char *) sep);
  // Intestazione colone
  set_header(8,"@20g---- Libro Unico ----");
  set_header(8,"@50g------------------------------");
  set_header(8,"@81gRegistri della ditta");
  set_header(8,"@102g------------------------------");
  set_header (9,"Mese @20gVidim. Da pag   A pag @50gCod Descrizione @84gDa pag   A pag");
  set_header (10, (const char *) sep);
}


