#include <prefix.h>
#include <postman.h>

#include <relation.h>
#include <tabutil.h>

#include "velib.h"
#include "ve0100b.h"

#include <doc.h>

int numerazione_definitiva(TDocumento& doc)
{
  int err = NOERR;                        
  if (doc.get_char(DOC_PROVV) == 'D')  // Se e' una numerazione definitiva
  {
    if (doc.stampabile())       // Controlla se non e' gia' nello stato si stampato in definitiva
    {                             
      doc.stato(doc.tipo().stato_finale_stampa()); // Se e' gia' in definitiva aggiorna solo lo stato
      err = doc.rewrite();   
      
      // Invia la transazione di cambio stato se necessario
      if (::can_dispatch_transaction(doc))
      {
        TFilename tmpname; tmpname.temp();
        { // Parentesi strategiche
          TConfig ini(tmpname, "Transaction");
          ini.set("Action", "MODIFY");
          ini.set("Firm", prefix().get_codditta());
          ini.set("Mode", "A");            
          TString8 paradoc; paradoc.format("%d", LF_DOC);
          ini.set_paragraph(paradoc);
          ini.set(DOC_PROVV, doc.get(DOC_PROVV));    
          ini.set(DOC_ANNO, doc.get(DOC_ANNO));    
          ini.set(DOC_CODNUM, doc.get(DOC_CODNUM));    
          ini.set(DOC_NDOC, doc.get(DOC_NDOC));    
          ini.set(DOC_STATO, doc.stato());    
        }
        ::dispatch_transaction(doc, tmpname); 
        ::remove(tmpname);
      }
    }
  }
  else // Se e' una numerazione provvisoria
  {
    // Scrive il nuovo documento con lo stato, numero e flag di definitiva 
    TDocumento bak_doc;
    bak_doc = doc; // Setta il flag di nuovo documento
    bak_doc.put(DOC_STATO,doc.tipo().stato_finale_stampa());
    bak_doc.put(DOC_PROVV,"D");
    bak_doc.put(DOC_NDOC,-1L);
    const int pr = bak_doc.physical_rows();
    for (int i=1;i<=pr;i++)
      bak_doc[i].put(DOC_PROVV,"D");
    err = bak_doc.write(); // Esegue automagicamente rinumerazione di testata e righe nel caso di reinsert
    if (err == NOERR)  // Cancella il vecchio documento
      doc.remove();
  }         
  return err;
}