// ve6100.cpp: modulo per la generazione delle fatture.

#include "ve6retv.h"    // valori di ritorno dalle varie funzioni

class TCrea_fatture : public TElaborazioni
{
protected:   
  virtual bool menu (MENU_TAG);
  virtual bool create () ;
  virtual bool destroy();

public:
  TCrea_fatture (void) {}               // costruttore
};

bool TCrea_fatture::create()
{
  cod_elab = "01";                                      // imposta il codice elaborazione (per il riferimento alla tabella ELD)
  dispatch_e_menu(BAR_ITEM(1)); // chiama il metodo menu
  return TRUE;
}

bool TCrea_fatture::destroy()
{
  delete _msk;
  return TRUE;
}

bool TCrea_fatture::menu(MENU_TAG)
{
  int err;                      // errore ritornato dalle funzioni
  if (err = scan_doc())         // se durante la scansione c'è un errore, esci
    return !errore_fatale(err);
  
  switch (ordinamento)  // in base all'ordinamento, lancia diverse procedure di creazione
  {
  case CLIENTE:
    // crea fatture raggruppando per cliente
    err = per_cliente();
    break;
  case AGENTE:
    // crea fatture per agente
    break;
  case ZONA:
    // crea fatture per zona
    break;
  case DATA_NUMDOC:
    if (raggruppa)
      // crea fatture per data/numero documento
    else
      // crea una fattura per ogni cliente
      break;
  default:
    break;
  }
  if (err) while (!getchar());          // se c'è un errore, attende la pressione di invio
  return !errore_fatale(err)            // ritorna FALSE se c'è stato un errore fatale
  }

int per_cliente(void)
{
  TLocalisamfile f(LF_DOC);
  TLocalisamfile rdoc(LF_RDOC);
  int current = 0;                      // chiave corrente
  TToken_string tempt;          // ttoken string temporanea
  TString cliente;
  TRectype tempr (LF_DOC);
  TRectype temprdoc (LF_RDOC);
  TTable t("NUM");                      // tabella numerazioni
  int nrdoc=0;          // numero di riga della fattura
  
  do
  {
    // memorizza il record del documento pilota
    f.zero();
    tempt = _chiavi->row(current);      // rileva la chiave corrente
    codnum = tempt.get(0)
      f.put ("CODNUM", codnum);                 // memorizza i valori della chiave corrente nel record
    f.put ("ANNO", tempt.get());
    f.put ("PROVV", tempt.get());
    f.put ("NDOC", tempt.get());
    if (!f.read (_isequal))                     // cerca il record corrispondente alla chiave corrente
    {
      error_box ("TCrea_fatture::per_cliente() : errore %d durante la lettura su doc", err);
      return READ_ERROR;
    }
    tempr = f.curr();                           // copia ilrecord del doc. pilota in tempr
    
    // imposta il numero documento per la fattura da creare
    t.zero();
    t.put ("CODTAB", _elab.codnum);     // codice numerazione per le fatture
    t.read (_isgteq);                                   // legge il primo record con lo stesso codice di numerazione
    if (t.get("CODTAB") == _elab.codnum)        // controlla che il codice numerazione sia effettivamente lo stesso
    {
      n = t.get("I1");                  // legge l'ultimo numero di documento utilizzato (o il primo disponibile)
      // supponiamo che sia l'ultimo utilizzato
      n++;              // ora n è il numero della mia fattura (da mettere in NDOC);
    }
    else
      n = 1;            // se non esiste alcun documento con il codice numerazione specificato, allora la fattura corrente è la n° 1
    
    // inserisce il record del documento pilota in doc
    f.curr() = tempr                    // tutti i campi della fattura sono uguali al documento pilota, tranne alcuni (impostati più sotto)
      f.put ("NDOC", n);                // imposta il numero del documento
    f.put ("TIPODOC", _elab.tipo_doc_des);      // imposta il tipo di documento
    f.put ("STATO", ???);               // stato della fattura appena creata
    
    if ((err = f.write()) == NOERR)             // se nonci sono problemi
    {
      t--;                              // si posiziona sul record precedente nella tabella numerazione
      t.put ("I1", n);  // imposta nuovo numero del documento
      t.write();                        // registra
    }
    else
    {
      switch (err)
      {
      case REINSERT:
        message_box ("ve6100: Errore fatale: il record con la chiave specificata esiste già: impossibile sovrascrivere");
        break;
      default:
        message_box ("ve6100: Errore fatale: %d scrivendo sulla tabella NDOC", err);
        break;
      }
      return RECORD_WRITE_ERROR;                // indica al chiamante un errore nella scrittura di un record
    }
    
    // cerca la prima riga del documento pilota in rdoc
    nrdoc = 1;                  // comincia dalla prima riga
    temprdoc.zero();
    temprdoc.put ("CODNUM", tempr.get("CODNUM"));
    temprdoc.put ("ANNO", tempr.get ("ANNO"));
    temprdoc.put ("PROVV", tempr.get("PROVV"));
    temprdoc.put ("NDOC", tempr.get("NDOC"));
    
    TRecord_array doc_originale;
    doc_originale.read (temprdoc);              // legge tutte le righe del documento originale
    
    // con la funzione doc_originale.row(i) ho l'i-esima riga del doc. originale
    TRecord_array doc_destinazione;
    temprdoc.put ("CODNUM", _elab.codnum);      // imposta il codice numerazione per la fattura
    
    
    /*
       prendi la prima chiave
       
       ripeti
       cerca su doc il record corrispondente alla chiave corrente
       
       prendi il codcf (codice cliente)         // costruzion file pilota per il cliente corrente
       prendi tutti i campi obbligatori         // meglio: copia il record trovato in un oggetto record
       
       scrivi su doc il record relativo alla nuova fattura creata
       cerca su rdoc la prima riga del doc. pilota              // inserimento del doc. pilota nella fattura
       copia le righe del doc. pilota nella fattura
       segna a[0] come processato
       
       per ogni chiave dell'array (dopo la prima)
       se non è processata
       cerca su doc il record corrispondente
       se codcf è uguale a codcf del doc. pilota             // meglio: crea un record campione con codcf e campi obbligatori = a guelli del record pilota e cerca il 
       allora se i campi obbligatori sono uguali a quelli del doc. pilota
       allora copia tutte le righe del doc. attuale nella fattura
       indica il record come processato
       
       prendi dall'array la prima chiave non processata
       finché la chiave corrente è oltre l'ultimo record. (chiave corrente == a.items()
       */


    Per numerazione fatture:
    TTable t ("NUM");
    metto in codtab il codice numerazione
      leggo il record con quel codice
        nel campi I1 c'è il numero del primo campo disponibile (o dell'ultimo utilizzato)

       }


int ve6100 (int argc, char **argv)
{
  TCrea_fatture a;
  a.run (argc, argv, "Fatturazione");
  return 0;
}
