// Dichiarazione della classe generale.

#ifndef _TELABORAZIONI_DECL
#define _TELABORAZIONI_DECL

#include <applicat.h>
#include <relation.h>
#include <sheet.h>

#include "ve6retv.h"
#include "ve6300.h"
#include "ve6gen.h"

#define _TDD_IN_FILTER

#define STATO_PPT '*'
#define SET_PROCESSED TRUE
#define DONT_SET_PROCESSED FALSE

class TElaborazioni : public TApplication
{
protected:
  // i data members sono protected in modo che gli oggetti generatori
  // possano accedervi senza la necessità di funzioni specifiche
  TString16 _codnum;            // (stringa di 4)
  TString16 _anno;              // int _anno;
  TString16 _provv;             // char _provv;
  TString16 _ndoc;              // int _ndoc;
  bool _crea_doc;               // deve creare il documento di destinazione ?
  int _ordinamento;             // indica il tipo di ordinamento
  bool _raggruppa;              // indica se si deve raggruppare o no
  bool _per_articolo;           // indica se raggruppare le righe per codice articolo o no
  int _chiave;                  // chiave di doc usata per selezionare i doc. originali
  TBit_array _processed;        // array in cui è indicato se un documento di _chiavi è stato processato o no
  TString _tipo_doc_org;        // tipo documento originale
  TString _tipo_doc_des;        // tipo documento finale
  TString80 _stati_validi_doc_i;// lista stati documenti originali prima dell'elaborazione
  TString _stato_f_doc_i;       // dopo l'elaborazione
  TString _stato_f_doc_f;       // stato documento finale al termine dell'operazione
//  TString _codnum;              // codice per la numerazione del documento di destinazione
  bool _sosp_imposta;           // T/F sospensione imposta
  bool _cod_sconto;             // T/F codice sconto
  bool _stesso_anno;            // T/F STESSOANNOFISCALE in [RAGGR.] del .ini del doc pilota
  TDate _datadoc;               // data dei documenti che si vanno a creare

  bool errore_fatale(int);              // ritorna true se l'errore passato come argomento è nella lista degli errori fatali
public:
  TElaborazioni() : _provv(1) { _chiave = 2; }
  ~TElaborazioni () {}
};

// TCursor_sheet con la on_key() customizzata per l'inserimento del campo QTAEVASA nelle righe
class TInterattivo_sheet : public TCursor_sheet
{
protected:
   virtual bool on_key(KEY);

  // modificata per fare apparire anche le qta' da evadere
  virtual void get_row(long n, TToken_string& l); 

public:
  TInterattivo_sheet(TCursor* cursor, const char* fields, const char* title, const char* head, byte buttons = 0)
     : TCursor_sheet(cursor, fields, title, head, buttons) { }
  virtual ~TInterattivo_sheet() { }
};

class TBatch_crea_doc : public TElaborazioni
{
protected:
  bool  _interattivo; // TRUE se e' stata attivata l'elaborazione interattiva;
//  bool  _stesso_anno_fiscale;  // TRUE se i documenti originali debbono avere lo stesso anno fiscale del documento da creare
  TString _descr_tipodocorg; // descrizione del tipo documento originale (solo come titolo del TSheet_array)
  virtual bool menu (MENU_TAG);
  virtual bool create ();
  virtual bool destroy();
  
  int run_mask (TRectype&, TRectype&);          // lancia la maschera e scandisce i records
  int per_cliente(TRectype&, TRectype&, const char*);   // crea fatture ordinate tramite la elab_princ
  int elab_princ(TSorted_cursor&);  // elabora tutti i documenti del cursore che hanno un record ELD
  bool search (TRectype&, TRectype&, TSorted_cursor&);   // cerca il prossimo record da includere nel doc. destinazione
  bool getflag (TRectype&, int);          // ritorna i valori di due flag
  static bool filterfunct(const TRelation*);    // funzione di filtro per i campi non alfanumerici
  void raggruppa_righe (TRecord_array&);      // raggruppa le righe per codice articolo
  bool prox_riga (int&, TRecord_array&, TBit_array&, TRectype&);  // cerca la prossima riga da raggruppare
  long _first_codcf, _last_codcf;     // valori del campo CODCF dei records first e last, per potervi accedere dalla filterfunct()
  bool elab_righe(TString metodo,bool raggr_parz,TRectype &tempr,TRecord_array &doc_destinazione,TRectype &temprdoc);
                                      // elabora le righe (di doc_originale), mettendole in doc_destinazione
                                      // usando il metodo metodo, tramite il record temprdoc gia' inizializzato
  bool next_pilota(TSorted_cursor &curs,TRectype &pilota);
                            // cerca il prossimo documeto pilota in cursor tenendo conto di processed
  int esiste_ELD(TSorted_cursor &curs,int i,bool set_proc = DONT_SET_PROCESSED);
        // ritorna ELAB_FOUND se esiste una ELD che passa dal tipo documento di pilota a _tipo_dest
        // (o _tipo_doc_dest, se _tipo_dest non viene specificato) e riempie eventualmente dest con la prima ELD
  int leggi_da_ELD(TRectype &dest,TString _tipo_pilota,TString _tipo_dest = "");
        // legge dalla tabella ELD il record _tipo_pilota->_tipo_destinazione, lo mette in dest e ritorna l'errore
  TString metodo(TRectype &rec);
        // restituisce la stringa metodo di trasf. dal record ELD per rec->_tipo_destinazione
  int statovalido(TRectype& rec);
        // controlla che il documento rec sia in uno degli stati validi indicati nella sezione [RAGGRUPPA] del suo .ini
  const char *td_ELD_to_filter(TString &_tipo_doc_des);
        // trova il .ini di rec e lo restituisce
  TString getini(TRectype& rec, int &err);
        // prende RAGGRPARZ della sezione [RAGGRUPPA]
  bool get_raggr_parz(TRectype& rec, int& err);
        // ritorna TRUE se _stesso_anno_fiscale o STESSOANNOFISCALE del .ini di rec
  bool stesso_anno_fiscale(TRectype& rec);
        // setta le informazioni sugli stati del doc e le mette nelle  relative variabili globali
  int get_info(TRectype &doc);
        // guarda se i documenti pil e pil2 sono compatibili per essere uniti nello stesso documento finale
  bool doc_i_compatibili(TRectype &pil,TRectype &pil2);

public:
  TBatch_crea_doc () {}               // costruttore
  ~TBatch_crea_doc () {}
};     

#endif // _TELABORAZIONI_DECL //
