// sistema il codice esercizio di tutti i movimenti
#include "cg1305.h"
#include "cglib01.h"

#include <mask.h>
#include <progind.h>
#include <recarray.h>
#include <relation.h>
#include <recset.h>

#include <mov.h>
#include <rmov.h>
#include <rmoviva.h>

static bool aggiorna_righe(TRecord_array& righe, int annoes)
{
  bool qualcuno_sbagliato = false;
  for (int i = righe.last_row(); i > 0; i = righe.pred_row(i))
  {
    const TRectype& riga = righe.row(i);
    const int anno = riga.get_int(RMV_ANNOES);
    if (anno != annoes)
    {
      qualcuno_sbagliato = true;
      break;
    }
  }
  if (qualcuno_sbagliato)
  {
    // Serve per righe iva non zerofilled
    TString4 sanno; sanno.format("%04d", annoes);  
    righe.renum_key(RMV_ANNOES, sanno);
    righe.rewrite();
  }
  return qualcuno_sbagliato;
}

void TAgg_codes::main_loop()
{
	open_files(LF_MOV, LF_RMOV, LF_RMOVIVA, LF_TAB, 0);

  TMask msk("cg1300d");
  if (msk.run() == K_ENTER)
  {
    long modified_recs=0L;
    int err = NOERR;

    TISAM_recordset mov("USE MOV");
    const TRecnotype nrec = mov.items();

    if (nrec > 0) // Dummy test for progind destruction
    {
      TEsercizi_contabili esercizi;
      TProgind pi(nrec, TR("Aggiornamento in corso..."), true, true);
      TRecord_array righe(LF_RMOV, RMV_NUMRIG);
      TRecord_array righeiva(LF_RMOVIVA, RMI_NUMRIG);
      TRectype riga(LF_RMOV);
      TRectype rigaiva(LF_RMOVIVA);

      for (bool ok = mov.move_first(); ok && err == NOERR; ok = mov.move_next())
      { 
        if (!pi.addstatus(1))
          break;
    
        const TDate data = mov.get(MOV_DATACOMP).as_date();
        const int oldcodes = mov.get(MOV_ANNOES).as_int();
        const int newcodes = esercizi.date2esc(data);
        bool cambiato = false;
  
        if (oldcodes != newcodes)
        {
          TRectype& curr = mov.cursor()->curr();
          curr.put(MOV_ANNOES, newcodes);
          err = curr.rewrite(mov.cursor()->file());
          cambiato = err == NOERR;
        }

        if (err == NOERR)
        {
          const long numreg = mov.get(MOV_NUMREG).as_int();
          riga.put(RMV_NUMREG, numreg);
          righe.read(riga);
          cambiato |= aggiorna_righe(righe, newcodes);

          rigaiva.put(RMI_NUMREG, numreg);
          righeiva.read(rigaiva);
          cambiato |= aggiorna_righe(righeiva, newcodes);
        }

        if (cambiato)
          modified_recs++;
      }
    }

    if (err != NOERR) 
      warning_box(FR("Aggiornamento codice esercizio interrotta. Rilevato errore %d in riscrittura"),err);
    else 
      message_box(FR("Aggiornamento codice esercizio completata. Modificati %ld movimenti.\nE' necessario procedere col ricalcolo saldi"), modified_recs);
  }
}