#ifndef __LVLIB_H
#define __LVLIB_H

#ifndef __RECSET_H
#include <recset.h>
#endif

#ifndef __REPORT_H
#include <report.h>
#endif

#ifndef __MGLIB_H 
#include "../mg/mglib.h"
#endif

#ifndef __PACCHI_H 
#include "../ve/pacchi.h"
#endif

#ifndef __VELIB_H 
#include "../ve/velib.h"
#endif

#ifndef __VELIB07_H 
#include "../ve/velib07.h"
#endif

#define RDOC_QTAREALE "CIN01"
#define RDOC_TOTREALE "CIN02"
#define RDOC_PROVV1REALE "CIN03"
#define RDOC_PROVV2REALE "CIN04"
#define RDOC_QTARITREALE "CIN05"

void lv_set_creation_info(TRectype& rec);
void lv_set_update_info(TRectype& rec);
long lv_find_contract(const long codcf, const long indsped, const TDate& data);
bool lv_is_holiday(const TDate& data); 
bool lv_is_02_active(); 
const TFilename & lv_backup_path();

class TLaundry_contract : public TRectype
{
protected:
  TRectype& modify_row(const char* codart);  //restituisce una riga modificabile

public:

  virtual bool ok() const;
  
  bool read(const long codcf, const long codcont);
  bool read(const long codcf, const long indsped, const TDate& data);
  bool can_be_deleted() const;

  //metodi per la gestione delle righe
  const TRectype& row(const char* codart) const;
	const int rows() const ;
  const TRectype& row(int i) const;

  int add_row(const char* codart);
  int update_row(const char* codart, const char* fieldname, const bool bol);
  int update_row(const char* codart, const char* fieldname, const char* str);
  int update_row(const char* codart, const char* fieldname, const long nmr);
  int update_row(const char* codart, const char* fieldname, const real nmr);
  int update_row(const char* codart, const char* fieldname, const TDate& data);

  TLaundry_contract();
  TLaundry_contract(const TRectype & rec);
  TLaundry_contract(const long codcf, const long codcont);
  TLaundry_contract(const long codcf, const long indsped, const TDate& data);
};

class TRecmag_lavanderie : public TVariable_rectype
{
	real _consmese;
	long _update_time;

protected:
  virtual const TString & get_str(const char* fieldname) const ;
	virtual void put_str(const char* fieldname, const char* val) { return TRectype::put_str(fieldname, val);}
	void update();

public:
	virtual int read(TBaseisamfile& f, word op = _isequal, word lockop = _nolock);
  virtual int readat(TBaseisamfile& f, TRecnotype nrec, word lockop = _nolock);

	virtual int name2index(const char* fieldname) const;
	virtual TFieldtypes type(const char* fieldname) const;
	virtual int length(const char* fieldname) const;
	virtual int ndec(const char* fieldname) const;
	virtual bool exist(const char* fieldname) const;
  virtual TObject* dup() const;
  TRecmag_lavanderie();
	TRecmag_lavanderie(const TRecmag_lavanderie & rec) : TVariable_rectype(rec), _update_time(0L) {}
	TRecmag_lavanderie(const TRectype & rec) : TVariable_rectype(rec), _update_time(0L) {}
  virtual ~TRecmag_lavanderie() {}
};

class TArticolo_lavanderie : public TArticolo_giacenza_data
{      
	int _anno_lav;
	char _tipocf;
	long _codcf;
	int _indsped;

protected:
  // la get_str supporta anche la sintassi:
  //     #LF->fieldname              
  //     #LF_par1->fieldname              
  //     #LF_par1_par2->fieldname              
  //     #LF_par1_par2_par3->fieldname              
  // dove:
  //   LF = numero logico del sottofile collegato (LF_UMART, LF_DESLIN, LF_CODCORR
  //   par1, par2, par3 = varie parti della chiave dell'indice del file collegato
  //          il numero di queste parti ed il loro valore dipende dal file collegato
  //          se parX comincia per # rappresenta il numero progressivo nell'indice 
  //   fieldname = nome del campo nel file collegato
  virtual const TString & get_str(const char* fieldname) const ;
  virtual void set_body_key(TRectype & rowrec);
  void set_anno_lav (int anno = 0);
	void set_anno_lav (const char * anno) { set_anno_mag(atoi(anno)); }
  virtual TRectype * new_body_record(int logicnum = 0);
public:
  virtual TObject* dup() const { return new TArticolo_lavanderie(codice(), _tipocf, _codcf, _indsped); }

  int find_clifomag(TRecord_array& rclifomag, const char * livello = NULL, int from = 0) const ;
  int find_clifomag(int annoes, const char * livello = NULL, int from = 0) const ;
	int find_clifomag(const char * annoes, const char * livello = NULL, int from = 0) const { return find_clifomag(atoi(annoes), livello, from); }

  TRecord_array & clifomag(int annoes) const;
	TRecord_array & clifomag(const char * annoes) const { return clifomag(atoi(annoes));}

	void set_tipocf(char tipocf);
	void set_codcf(long codcf);
	void set_indsped(int indsped);

	const TRecmag_lavanderie & find_rec(int annoes) const;
	const TRecmag_lavanderie & find_rec(const char * annoes) const { return find_rec(atoi(annoes)); }
  
	TArticolo_lavanderie(const char* codice = NULL, const char tipocf = ' ', const long codcf = 0L, const int indsped = 0);
	TArticolo_lavanderie(const TRectype& rec, const char tipocf = ' ', const long codcf = 0L, const int indsped = 0);
  virtual ~TArticolo_lavanderie() {}
};  

TArticolo_lavanderie& cached_article_laundry(const char * codart, const char tipocf, const long codcf, const int indsped);

class TLavanderie_calendar : public TObject
{
	int _year;
  TBit_array _days;

public:
	int read(int year = 0);
  int write() const;
  int rewrite() const { return write(); }
  int remove() const;

  void set_holiday(const TDate& date, bool holiday = true);
	void reset_holiday(const TDate& date) { set_holiday(date, false);}
  bool is_holiday(const TDate& date) const;

  TLavanderie_calendar(int year);
  virtual ~TLavanderie_calendar() {}
};

class TCausale_lavanderie : public TRectype
{
protected:
  //metodi che restituiscono le indicazioni sulle causali di magazzino associate
  const TString& caurit()  const {return get("S1");}
  const TString& caucon()  const {return get("S2");}

public:
  //metodi che restituiscono i dati di interesse sulla causale di lavanderia
  const TString& codice()  const {return get("CODTAB");}
  const TString& descr()   const {return get("S0");}
  const TString& caucol()  const {return get("S4");}
  const bool is_ritiro()   const {return get_bool("B0");}
  const bool is_consegna() const {return get_bool("B1");}
  const bool is_reso()     const {return get_bool("B2");}
  const bool is_rotto()    const {return get_bool("B3");}
  const bool movcong()     const {return !get_bool("B4");}
  //metodi che restituiscono le causali di magazzino associate
  const TCausale_magazzino& causale_ritiro()   const {return cached_causale_magazzino(caurit());}
  const TCausale_magazzino& causale_consegna() const {return cached_causale_magazzino(caucon());}
  //costruttore
  TCausale_lavanderie(const char * codice);
	TCausale_lavanderie(const TRectype &r);

  virtual ~TCausale_lavanderie() {}  
};

TCausale_lavanderie & cached_causale_lavanderie(const char * codcaus);

                                 ////////////////////////
                                 ////    TDOC_KEY    ////
                                 ////////////////////////

//classe TDoc_key
class TDoc_key: public TToken_string
{
public:
  const char provv();
  const int anno();
  const char* codnum();
  const long ndoc();

  TDoc_key& operator= (const char* key){set(key);}

  TDoc_key(const int anno, const TString& codnum, const long ndoc, const char provv = 'D');
  TDoc_key(const char* key):TToken_string(key){}
  TDoc_key(const TToken_string& key):TToken_string(key){}
  TDoc_key(const TDoc_key& key):TToken_string(key){}
};

                                 /////////////////////////
                                 ////    TRDOC_KEY    ////
                                 /////////////////////////

//classe TRdoc_key
class TRdoc_key: public TToken_string
{
public:
  const char provv();
  const int anno();
  const char* codnum();
  const long ndoc();
  const int nriga();

  TRdoc_key& operator= (const char* key){set(key);}

  TRdoc_key(const int anno, const TString& codnum, const long ndoc, const int nriga, const char provv = 'D');
  TRdoc_key(const char* key):TToken_string(key){}
  TRdoc_key(const TToken_string& key):TToken_string(key){}
  TRdoc_key(const TRdoc_key& key):TToken_string(key){}
};


                                 /////////////////////////////////////////////////////
                                 ////    TBUONO_PRELIEVO & TBUONO_PRELIEVO_ROW    ////
                                 /////////////////////////////////////////////////////


//classe TBuono_prelievo
class TBuono_prelievo: public TDocumento
{
public:
  const TToken_string& chiave() const;  
  const TDate datadoc() const;
  const long codcont() const;

  void set_dataprco(const TDate& data);
  void set_itinerario(const int coditi);
  void set_contratto(const int codcont);

  TBuono_prelievo& operator= (const TBuono_prelievo bpre){bpre;}

  TBuono_prelievo(TDoc_key& key): TDocumento(key.provv(), key.anno(), key.codnum(), key.ndoc()){};
  TBuono_prelievo(TBuono_prelievo& bpre): TDocumento(bpre){};
};

//classe TBuono_prelievo_row
class TBuono_prelievo_row: public TObject
{
  TRiga_documento&  _rdoc;
public:
  const bool evaso() const;
  const TString& codart() const;
  const TString& desart() const;
  const TString& causale() const;
  const real qta_ritirata() const;
  const real qta_dacons() const;
  const real qta_consegnata() const;
  const int num_pacchi() const;
  const real prezzo() const;
  const long cong_pre() const;
  const long cong_att() const;
  const TToken_string& rifbcon() const;
  const TToken_string& rifbrit() const;
  const TDate& dataeva() const;

  void set_evaso(const bool evaso);
  void set_codart(const char* codart);
  void set_desart(const TString& desart);
  void set_causale(const char* causale);
  void set_qta_ritirata(const real qta);
  void set_qta_dacons(const real qta);
  void set_qta_consegnata(const real qta);
  void set_num_pacchi(const int numpacchi);
  void set_codiva(const char* codiva);
  void set_um(const char* um);
  void set_prezzo(const real prezzo);
  void set_mag(const char* mag);
  void set_magc(const char* magc);
  void set_cong_pre(const real qtacong);
  void set_cong_att(const real qtacong);
  void set_rifbcon(const TToken_string& keybcon);
  void set_rifbrit(const TToken_string& keybrit);
  void set_dataeva(const TDate& data);

  void add_qta_consegnata(const real qta);
  void add_pacchi(const int nmr = 1);

  TBuono_prelievo_row(TRiga_documento& rdoc):_rdoc(rdoc){}
};


                                 ///////////////////////////
                                 ////    TRIGA_PACCO    ////
                                 ///////////////////////////

//classe TRiga_pacco
class TRiga_pacco: public TRectype
{
public:  
  TRiga_pacco & operator =(const TRiga_pacco& rpacco);

  bool read(const TString& codpacco, const long codriga = 1);

  const TString&        codpacco()  const;
  const TToken_string&  key()       const;
  const TString&        articolo()  const;
  const real            quantita()  const;
  const TString&        um()        const;
  const TDate           data()      const;
  const long            cliente()   const;
  const TDate           databo()    const;
  const bool            annullato() const;
  const TToken_string&  rigabolla() const;
  const long            movmag()    const;

  void set_key(const char* codpacco, const int codriga = 1);
  void set_articolo(const char* codart);
  void set_quantita(const real qta);
  void set_um(const char* um);
  void set_data(const TDate& data);
  void set_cliente(const long codcf);
  void set_databo(const TDate& data);
  void set_annullato(const bool ann);
  void set_rigabolla(const int anno, const char* codnum, const long ndoc, const long idriga);
  void set_movmag(const long movmag);

  bool is_annullato();
  bool is_associato();

  TRiga_pacco(const TRectype& rec);
  TRiga_pacco(const TRiga_pacco& rpacco);
  TRiga_pacco(const char* codpacco, const long codriga = 1);
  TRiga_pacco();
};


                            ////////////////////////////////////
                            ////    CLASSE TGIAC_PER_CLI    ////
                            ////////////////////////////////////

//Definizione della classe Giacenza per Cliente
class TGiac_per_cli : public TObject
{
private:
  TAssoc_array  _odierna;     //TAssoc_array che conterr� le dotazioni odierne
  TAssoc_array  _temporanea;  //TAssoc_array che conterr� le dotazioni temporanee
  long          _clifo;       //variabile che conterr� il cliente selezionato
  long          _cont;        //variabile che conterr� il contratto selezionato
  int           _year;        //variabile che conterr� l'anno documento
  long          _indsped;     //variabile che conterr� l'indirizzo di spedizione

protected:
  real& giacart_od(const TString& codart);  //restituisce un puntatore al valore della dot. od. salvato
  real& giacart_tmp(const TString& codart); //restituisce un puntatore al valore valore della dot. temp. salvato
  long giac_in_mag(const TString& codart, bool odierna) const;  //restituisce il valore salvato nel magazzino

public:
  bool preset(const TDocumento& doc); //precarico le variabili globali della classe 
  bool reset(const TDocumento& doc);  //svuota i TAssoc_array e carica cli e cont
  bool load_row(TRiga_documento& rdoc, const bool aggiorna = false, const bool reading = false);  //popola i TAssoc_array
  real giac_att(TRiga_documento& rdoc, bool odierna); //restituisce le quantit� attuali di dotazione
  TGiac_per_cli(); //costruttore 
};

class TLV_recordset : public TDocument_recordset
{
public:
  virtual TCursor* cursor() const;

	TLV_recordset(const char* use) : TDocument_recordset(use) {}
	virtual ~TLV_recordset() {}
};

class TLV_report : public TDocument_report
{
protected:
  virtual bool get_usr_val(const TString& name, TVariant& var) const;

public:
	virtual bool set_recordset(TRecordset* rs) { return TReport::set_recordset(rs); }
  virtual bool set_recordset(const TString& sql);
	TLV_report() {}
	virtual ~TLV_report() {}
};

#endif