// sistema il codice esercizio di tutti i movimenti

#include <relation.h>
#include "cglib.h"
#include "cg1300.h"
#include "cg1305.h"
#include <mov.h>
#include <rmov.h>
#include <rmoviva.h>

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

bool TAgg_codes::create()
{
  TApplication::create();
  _mov = new TLocalisamfile(LF_MOV);
  _rmov = new TLocalisamfile(LF_RMOV);
  _rmoviva = new TLocalisamfile(LF_RMOVIVA);
  dispatch_e_menu (BAR_ITEM(1));
  return TRUE;
}

bool TAgg_codes::destroy()
{ 
  delete _mov;
  delete _rmov;
  delete _rmoviva;
  
  return TApplication::destroy();
}                                

bool TAgg_codes::menu(MENU_TAG m)
{
  TMask msk("cg1300d");
  if (msk.run() == K_ENTER)
    return calcola_codes();
  else 
    return FALSE;
}  

bool TAgg_codes::calcola_codes()
{
  TLocalisamfile& mov = get_mov();
  TEsercizi_contabili esercizi;
  TDate data;
  long modified_recs=0L;

  long nrecs = (long) mov.eod();
  int err = NOERR;
  TProgind p(nrecs, "Aggiornamento in corso...", TRUE, TRUE, 100);
  TRecord_array righe(LF_RMOV,RMV_NUMRIG);
  TRecord_array righeiva(LF_RMOVIVA,RMI_NUMRIG);
  TRectype riga(LF_RMOV);
  TRectype rigaiva(LF_RMOVIVA);
  TString s_codes;

  for (mov.first(); !mov.eof() && err == NOERR; mov.next())
  { 
    p.addstatus(1);
    data=mov.get_date(MOV_DATACOMP);
    const int codes = mov.get_int(MOV_ANNOES);
    const int newcodes = esercizi.date2esc(data);
    if (codes != newcodes)
    {
      mov.put(MOV_ANNOES,newcodes);
      err = mov.rewrite();
      const long numreg = mov.get_long(MOV_NUMREG);
      riga.put(RMV_NUMREG,numreg);
      rigaiva.put(RMI_NUMREG,numreg);
      righe.read(riga);
      righeiva.read(rigaiva);
      righe.renum_key(RMV_ANNOES,newcodes);
      s_codes = format("%04d",newcodes);
      righeiva.renum_key(RMI_ANNOES,s_codes);
      if (err == NOERR)
      {
        err = righe.rewrite();
        if (err == NOERR)
          err = righeiva.rewrite();
        if (err == NOERR)
        modified_recs++;
      }
    }
  }
  if (err != NOERR) warning_box("Aggiornamento codice esercizio interrotta. Rilevato errore %d in riscrittura",err);
  else message_box("Aggiornamento codice esercizio completata. Modificati %ld movimenti.",modified_recs);
  return FALSE;
}
