//***********************************
//* Rinumerazione numero protocollo *
//***********************************
#include <mov.h>
#include "cg1300.h"  
#include "cg1303.h"

HIDDEN TAgg_nprot& app() { return (TAgg_nprot&) main_app(); }

bool TAgg_nprot::filtra_mov(const TRelation* r)
{           
  TLocalisamfile& mov = r->lfile(); 

  const int annoiva = mov.get_int(MOV_ANNOIVA); 
  const TString16 reg = mov.get(MOV_REG); 

  if (app()._anno == annoiva && app()._reg == reg)  
    return TRUE;
  
  return FALSE;  
}

bool TAgg_nprot::create()
{
  TApplication::create();
  
  _tabreg = new TTable("REG");
  
  dispatch_e_menu (BAR_ITEM(1));
  return TRUE;
}

bool TAgg_nprot::destroy()
{ 
  delete _tabreg;
  
  return TApplication::destroy();
}                                

bool TAgg_nprot::menu(MENU_TAG m)
{
  TMask msk("cg1300b");
  
  TConfig conf(CONFIG_DITTA);
  int annoiva = conf.get_int("AnLiIv");
  
  msk.set(F_ANNO, annoiva);  

  while (msk.run() == K_ENTER)
  {
    _anno = msk.get_int(F_ANNO);   
    _reg  = msk.get(F_REG);
    _prot = msk.get_long(F_PROT);
    
    rinumera_prot();
    
    msk.reset(F_REG);
    msk.reset(F_PROT);
    //return TRUE;
  }         

  return FALSE;
}  

int TAgg_nprot::rinumera_prot()
{
  TRelation rel (LF_MOV);
  TLocalisamfile& mov = rel.lfile();
  
  //TString80 filter;
  //filter.format("ANNOIVA=%04d && REG=\"%s\"", _anno, (const char*)_reg);
  //TCursor cursor(&rel, filter, 2);

  TCursor cursor(&rel, "", 2);  
  cursor.set_filterfunction(filtra_mov);
  
  cursor = 0L;
  const long nitems = cursor.items();
  
  //TProgind p(nitems ? nitems : 1, "Elaborazione in corso..." , TRUE, TRUE, 70);  
  TProgind* p = NULL;
  
  if (nitems > 0L)
    p = new TProgind (nitems, "Elaborazione in corso..." , TRUE, TRUE, 70);
  
  long protiva, uprotiva;
  
  for (; cursor.pos() < cursor.items(); ++cursor)
  {
    if (p) p->addstatus(1);
    protiva  = mov.get_long(MOV_PROTIVA); 
    uprotiva = mov.get_long(MOV_UPROTIVA);
    if (protiva != _prot && uprotiva != _prot) continue;
    else
    {
      if (uprotiva != 0l)
        _prot = uprotiva;
      break;
    } 
  }    
  
  if (protiva != _prot && uprotiva != _prot) //sono alla fine del file
  {
    delete p;
    return message_box("Non trovato record con protocollo indicato: rinumerazione non avvenuta"); 
  }
  
  ++cursor;
  
  long nprot,uprot,dprot;
  dprot = uprot = 0L;
  nprot = _prot;

  for (; cursor.pos() < cursor.items(); ++cursor)  
  {
    if (p) p->addstatus(1);
    protiva  = mov.get_long(MOV_PROTIVA); 
    uprotiva = mov.get_long(MOV_UPROTIVA);
    
    nprot = nprot+1+dprot;  //stile RPG
    dprot = 0L;
    uprot = 0L;
    dprot = (uprotiva == 0L) ? 0L : (uprotiva - protiva);
    uprot = (uprotiva == 0L) ? 0L : (nprot + dprot);
    
    mov.put(MOV_PROTIVA, nprot);
    mov.put(MOV_UPROTIVA, uprot);
    mov.rewrite();
  }     
  
  TTable reg("REG");
  TString16 s; s.format("%04d%s", _anno, (const char*)_reg);
  reg.zero();
  reg.put("CODTAB", s);
  if (reg.read() == NOERR)
  {
    reg.put("I5", nprot + dprot);
    reg.rewrite();
  }
  else
  {
    delete p;
    return error_box("Impossibile leggere il registro %s anno %s", 
                     (const char*)_reg, (const char*)_anno); 
  }                  
  delete p;
  return message_box("Rinumerazione numero protocollo completata");
}

