// dear emacs, this is -*-C++-*- 
// Questa e' la famosa palla della liquidazione IVA

#ifndef __MASK_H
#include <mask.h>
#endif

#ifndef __PRINTAPP_H
#include <printapp.h>
#endif

#ifndef __TABUTIL_H
#include <tabutil.h>
#endif

#ifndef __CGLIB03_H
#include "cglib03.h"
#endif

class TProgind;

// ------------------------------------------------------------------
// Parametri modificabili
// ------------------------------------------------------------------

// Fucked aliases to complain with new agricoltural rules
#define AGR_PCON1  201
#define AGR_PCON2  202

// picture default per i reali
// in caso di inflazione polacca occorrera' modificare la lunghezza
// e quindi cambiare le set_row in cg4304.cpp onde evitare overlap 
#define REAL_PICTURE      "###.###.###.###"

// IVA a debito da non pagare ma riportare al mese successivo
// #define IVA_DA_RIPORTARE      real(50500.0)

// detrazione per detraibili 6%
#define DETRAZIONE_6PERCENTO  real(0.06)

// soglia che da' diritto alla liquidazione trimestrale per servizi
// currently trecentsesantamiliu'
#define SOGLIA_TRIM_SERVIZI   real(360000000.0)

// soglia che da' diritto alla liquidazione trimestrale per altri
// currently un miliardun
#define SOGLIA_TRIM_ALTRE     real(1000000000.0)

// minima percentuale di operazioni esenti per aver diritto al rimborso
// infrannuale
#define MIN_PARTE_ESENTE      real(0.25)

// percentuale degli imponibili da usare nel calcolo aliquota
// media acquisti e vendite per controllo diritto al rimborso
// infraanuuale secondo norme 1994
// ANNULLATO ANCOR PRIMA DI ESISTERE; LO LASCIO PER MEMORIA FUTURA
// (due giorni di lavoro)
#define PERC_IMP_RIMBORSABILE real(0.51)   

// NUOVO ENNESIMO CRITERIO RIMBORSO; mi si scusera' un minimo di
// risentimento
#define SOGLIA_MAGGIORE_ALIQUOTA_DEL_CAZZO_PER_AVER_DIRITTO_AL_RIMBORSO  real(0.1)

// Macro per riconoscere una eventuale percentuale pro-rata non presente in tabella
// Siccome le % vanno da 0 a 100 vengono usati numeri a piacere.
#define INVALID_PRORATA            real(1999.0) // A Guy piacciono gli 883... a me piace Spazio 1999
#define INVALID_PRORATA_ASSERT     real(883.0)  // ...A little tribute 2 Max Pezzali

//
// ------------------------------------------------------------------
// Fine parametri modificabili
// do not change below this line if you want me to work
// and you to keep your fucking ass healty
// ------------------------------------------------------------------

// per il campo I0 di pim
#define NETTO "1"
#define LORDO "2"

enum recalc  { needed = 1, one = 2, ever = 3, never = 4 };
enum wht     { all = 1, mnt = 2, trimestre = 3};
enum tbc     { precedente = 1, incorso = 2};
enum tiporeg { vendita = 1, acquisto = 2 };
enum tipo_sospensione { nessuna, normale, vol_affari, liquidazione };

// flags per gli items di stampa
#define CHG_PARMS  1   // cambiato qualcosa (attivita', ditta...)
#define PIM_ROW    2   // riga totali parziali per codiva
#define PLAFOND    3   // prospetto plafond
#define THE_END    4   // riepilogo finale 
#define TOT_ROW    5   // totale dei pim (plm)
#define MISC_LIQ   6   // altri dati dichiarazione (ptm)
#define SET_FIRM   7   // dati ditta (senza attivita')
#define ANNUAL     8   // prospetto annuale (prorata etc.)
#define VENTILA    9   // prospetto ventilazione
#define REGAGR     10  // prospetto regime agricolo
#define REGVIA     11  // prospetto agenzie viaggio
#define RIMBORSO   12  // prospetto rimborso infraannuale
#define ACCONTO    13  // riga prospetto acconti
#define ACCHEAD    14  // header prospetto acconti
#define DELDEB     15  // righe tabulato deleghe ditte a debito
#define DELCRED    16  // header tabulato deleghe ditte a credito
#define DELEGA     17  // descrizione versamenti
#define PIM_HEAD   18  // bytes sprecati per far vedere l'intestazione pim
#define LIQACC     19  // prospetto liquidazione acconto 
#define PROGAGR    20  // progressivi per prospetto agricolo dal 1998
#define PIS_HEAD   21  // intestazione per i PIS (stampa cappelletto iniziale)
#define PIS_ROW    22  // riga totali parziali per codiva (tabella progressivi di cui da periodo successivo)
#define PIS_HEAD_D  23  // intestazione per i PIS (stampa cappelletto iniziale) differita
#define PIS_HEAD_DI 24  // intestazione per i PIS (stampa cappelletto iniziale) differita incassati
#define PIM_HEAD_D  25  // intestazione per i PIM (stampa cappelletto iniziale) differita
#define PIM_HEAD_DI 26  // intestazione per i PIM (stampa cappelletto iniziale) differita incassati
#define PIS_ROW_D  27  // riga totali parziali per codiva (tabella progressivi di cui da periodo successivo) differita
#define PIS_ROW_DI 28  // riga totali parziali per codiva (tabella progressivi di cui da periodo successivo) differita incassati
#define PIM_ROW_D  29  // riga totali parziali per codiva differita
#define PIM_ROW_DI 30  // riga totali parziali per codiva differita incassati
#define TOT_ROW_D  31   // totale dei pim (plm) differita
#define TOT_ROW_DI 32   // totale dei pim (plm) differita incassate
// ...............................................................
// support structs
// ...............................................................

class _VentItem : public TObject
{
public: // non e' bello, ma non e' bello neanche dover fare un
  // TObject per poter mettere una struct in un TArray
  real    _imposta;     // per comodita'
  real    _aliquota;    // aliquota iva
  real    _totale;      // totale acquisti
  TString4 _codiva;      // codice iva        
  TString4 _other;       // codice iva a cui ventilare       
  _VentItem() {}
  virtual ~_VentItem() {}
};

class _VendItem : public TObject
{
public:                // vedi sopra per le fisime morali
  real     _totale;     // totale vendite per registro/tipo det.
  TString4 _codreg;     // codice registro
  int      _month;      // mese
  int      _tipodet;    // tipo detraibilita'
  _VendItem() {}
  virtual ~_VendItem() {}
};

class _CorrItem : public TObject
{
public:                // vedi sopra per le fisime morali
  real    _totale;     // totale vendite per registro
  real    _totale_vf;  // usato nella describe_pim(), per includere TUTTI i movimenti anche quelli validi solo per Vol. affari
  TString4 _codreg;     // codice registro
  int     _month;      // mese
  real    _aliquota;    // aliquota iva
  TString4 _codiva;      // codice iva
  TString8 _codatt;      // codice attivita'
  int     _tipodet;     // tipo detraibilita'
  virtual TObject* dup() const { return new _CorrItem(*this); }
  _CorrItem() {}
  virtual ~_CorrItem() {}
};

class _DescrItem : public TObject
// Sembra triste e brutto esattamente come i files tabella
// Ma la verita' e' che non e' affatto inefficiente 
// e che mi piace, nei limiti dell'entusiasmo concessomi, moltissimo 
{
public:
  word    _flags;
  word    _f0, _f1, _f2, _f3;
  TString _s0, _s1, _s2, _s3, _s4, _s5, _s6;
  real    _r0, _r1, _r2, _r3, _r4, _r5, _r6, _r7, _r8, _r9,
					_r10, _r11, _r12, _r13, _r14, _r15, _r16, _r17, _r18, _r19,
					_r20, _r21, _r22, _r23, _r24, _r25, _r26, _r27, _r28, _r29,
					_r30, _r31, _r32, _r33;
  TArray  _arr;
  TDate   _d0;
  
  _DescrItem(word f) : _f0(0), _f1(0), _f2(0) 
  { _flags = f; }
  virtual ~_DescrItem() 
  { }
};

class _ErrItem : public TObject
{

public:

  TString _err;
  TString _att;
  TString _firm;
  _ErrItem(const char* err, const char* att, const char* firm) 
  { _err = err; _att = att; _firm = firm; }
  virtual ~_ErrItem() {}
};

// _Iva11Item serve per memorizzare gli elementi da trasferire su tab1100
class _Iva11Item : public TObject
{
  real _value;
  int  _file;
public:
  virtual TObject* dup() const { return new _Iva11Item(*this); }
  real& value()  { return _value; }
  int& file()    { return _file; }
  void zero()    { _value = 0.0; _file = LF_TAB1100A; }
  _Iva11Item() { _file = LF_TAB1100A; }
  virtual ~_Iva11Item() {}
};

// Definisco solo i metodi add e sub, per aggiungere elementi _Iva11Item
// per il resto e' un normalissimo TAssoc_array
class _Iva11Array : public TAssoc_array
{
public:
  bool add(const real& val, const char* fld_name, int num_file = LF_TAB1100A);
  bool sub(const real& val, const char* fld_name, int num_file = LF_TAB1100A);
  void zero(const char* fld_name);
  _Iva11Array() {}
  virtual ~_Iva11Array() {}
};

// _ProrataItem serve per calcolare prorata dal 1998
// E' un po' bruttino, perche' il caricamento delle percentuali
// e' obbligato a farlo dentro all'applicazione.
class _ProrataItem : public TObject
{
  TAssoc_array _percentuali; // Elenco delle percentuali prorata memorizzate per anno

public:
  TAssoc_array& perc_array() { return _percentuali; }
  real calc_prorata(const real& acq, const char * year);
  real percentuale(const char * year);
  _ProrataItem() {}
  virtual ~_ProrataItem() {}
};

// ------------------------------------------------------------------------
// Application
// ------------------------------------------------------------------------

class TLiquidazione_app : public TPrint_application
{  
  TArray_sheet* _ditte;
  wht           _what;
  TBit_array _selected;
  int        _menu;            // 1 = Liquidazione, 2 = Deleghe, 3 = Acconti
  TString16  _year;            // anno di calcolo
  int        _month;           // mese da calcolare
  TDate      _date;            // data di stampa
  bool       _isprint;         // vuoi stampare o no?
  bool       _canprint;        // PUOI stampare o no?
  bool       _printonly;       // calcolo definitivo        
  recalc     _recalc;          // tipo ricalcolo scelto
  bool       _isplafond;       // plafond importatori abituali
  bool       _isvent;          // ventilazione
  bool       _isagricolo;      // regime agricolo
  bool       _isviaggio;       // regime agenzie viaggio
  bool       _isdiff;          // liquidazione differita attiva
  bool       _isbenzinaro;     // regime benzinaro
  bool       _gest4;           // gestione 4� trim. per benzinaro
  bool       _isannual;        // dichiarazione annuale
  bool       _mixed;           // attivita' mista 
  bool       _isriepilogo;     // 13a liq   
  bool       _isendliq;        // annuale o riepilogo
  bool       _isservizio;      // servizi, professionisti, artisti
  bool       _isrimborso;      // vuole il rimborso infraannuale
  bool       _isricacq;        // ricalcolo imposte acq. riv (par. ditta)
  bool       _isdifferita;     // liquidazione differita e mese != 13
  bool       _isdiffacc;       // liq. differita (usato per stampa registri)
  bool       _isagr98;         // TRUE se l'anno e' > 1997 e si sta calcolando una attivita' agricola
  bool       _recalc_only;     // solo ricalcolo progressivi
  bool       _recalc_regis;    // solo ricalcolo progressivi per registri
  bool       _calcall;         // tutte le ditte nessuna esclusa
  bool       _isbase;          // stampa base di calcolo acconto
  bool       _isfinal;         // stampa definitiva (su registro bollato)
  bool       _isregis;         // stampa per registro       
  bool       _isintr;          // calcola interessi per trimestrali 
  bool       _stampa_vers;     // stampa trafiletto versamento;
  bool       _stampa_acc;      // stampa trafiletto saldo/acconto 
  bool       _riepilogo;       // stampa riepilogo sul registro
  bool       _sind11;          // somma imposte non detraibili in trasferimento IVA11 (da configurazione dati studio)
  tbc        _basecalc;        // tipo base di calcolo acconto
  TString16  _freqviva;        // frequenza versamenti (M|T)
  long       _n_ditte;         // numero ditte
  bool       _comp_acconto;    // stiamo calcolando l'acconto
  TArray     _nomiditte;       // array descr. ditte per sheet
  
  TProgind*  _prind;
  int        _row;
  TArray     _vend_arr;        // tabella vendite per ventilazione
  TArray     _corr_arr;        // tabella corrispettivi
  TArray     _vent_arr;        // tabella acquisti per ventilazione
  TArray     _descr_arr;       // things to be printed
  TArray     _errors;          // errors to notify


  TAssoc_array _codiva_arr;    // cache dei codici IVA.
  TAssoc_array _reg_arr;       // cache dei registri.
  TAssoc_array _iva11_arr;     // array contenente le informazioni da trasferire.
                               // La chiave di ordinamento e' sul codice attivita'.
                               // Ogni elemento dell'array e' un _Iva11Array
                               // La cui chiave e' a sua volta sul nome campo

  // totali vari per attivita'
  real _p8, _p8b, _p9;         // totali plafond
  _ProrataItem _prorata;       // Mini cazzetto per calcoli prorata
  long       __firm;           // ditta selezionata all'inizio
  bool       _is_interactive;  // lanciata da menu o da altro prog
  bool       _is_visliq;       // lanciata da visualizzazione liquidazione
  int        _monthinatt;      // mese inizio attivita' (serve per differita)
  
  // main cursor
  TRelation* _rel;
  TCursor*   _cur;
  
  // files, tables
  TRelation*      _tab11;     // un giorno tab1100a e tab1100b saranno un unico file!
  TRelation*      _nditte;
  TLocalisamfile* _mov;
  TLocalisamfile* _rmoviva;
  TLocalisamfile* _pcon_1;
  TLocalisamfile* _pcon_2;
  
  TInteressi_IVA_table* _ver;
    
  TTable*    _pim;
  TTable*    _pis;
  TTable*    _prm;
  TTable*    _prp;
  TTable*    _pum;  
  TTable*    _pam;  
  TTable*    _pom;  
  TTable*    _plm;  
  TTable*    _pia;
  TTable*    _lim;  
  TTable*    _lam;  
  TTable*    _pla; 
  TTable*    _ppa;
  TTable*    _reg;
  TTable*    _iva;
  TTable*    _del;
  TTable*    _lia;  
  
  // a reference rectype per file/table
  TRectype*  _mov_r;
  TRectype*  _rmoviva_r;
  TRectype*  _pcon_1_r;
  TRectype*  _pcon_2_r;
  TRectype*  _iva_r;
  TRectype*  _pim_r;
  TRectype*  _pis_r;
  TRectype*  _prm_r;
  TRectype*  _prp_r;
  TRectype*  _pum_r;
  TRectype*  _pam_r;
  TRectype*  _pom_r;
  TRectype*  _reg_r;
  TRectype*  _nditte_r;
  TRectype*  _pla_r;
  TRectype*  _plm_r;
  TRectype*  _pia_r;
  TRectype*  _ppa_r;
  TRectype*  _lim_r;
  TRectype*  _lam_r;
  TRectype*  _del_r;
  TRectype*  _att_r;     
  
  // recfields for each stronz codtab
  TRecfield* _pim_anno;
  TRecfield* _pim_codatt;
  TRecfield* _pim_codreg;
  TRecfield* _pim_mese;
  TRecfield* _pim_tipocr;
  TRecfield* _pim_codiva;
  TRecfield* _pim_tipodet;
  TRecfield* _pis_anno;
  TRecfield* _pis_codatt;
  TRecfield* _pis_codreg;
  TRecfield* _pis_mese;
  TRecfield* _pis_tipocr;
  TRecfield* _pis_codiva;
  TRecfield* _pis_tipodet;
  TRecfield* _prm_anno;
  TRecfield* _prm_codatt;
  TRecfield* _prm_codreg;
  TRecfield* _prm_mese;
  TRecfield* _prm_tipocr;
  TRecfield* _prm_codiva;
  TRecfield* _prm_tipodet;
  TRecfield* _prp_anno;
  TRecfield* _prp_codatt;
  TRecfield* _prp_codreg;
  TRecfield* _prp_mese;
  TRecfield* _prp_tipocr;
  TRecfield* _prp_codiva;
  TRecfield* _prp_tipodet;
  TRecfield* _pum_anno;
  TRecfield* _pum_codatt;
  TRecfield* _pum_mese;
  TRecfield* _pam_anno;
  TRecfield* _pam_codatt;
  TRecfield* _pam_mese;
  TRecfield* _pom_anno;
  TRecfield* _pom_codatt;
  TRecfield* _pom_mese;
  TRecfield* _ppa_year;
  TRecfield* _ppa_codatt;
  TRecfield* _ppa_month;
  TRecfield* _ppa_kind;
  TRecfield* _plm_anno;
  TRecfield* _plm_codatt;
  TRecfield* _plm_mese;
  TRecfield* _pia_anno;
  TRecfield* _pia_codatt;
  TRecfield* _pia_mese;
  TRecfield* _pia_codord;
  TRecfield* _pia_codcom;
  
  TRecfield* _pla_ditta;
  TRecfield* _pla_anno;
  TRecfield* _pla_codatt;
  
  TRecfield* _del_ditta;
  TRecfield* _del_anno;
  TRecfield* _del_mese;
  TRecfield* _del_tipo;
  TRecfield* _lim_anno;
  TRecfield* _lim_mese;                                    
  TRecfield* _lam_anno;
  TRecfield* _lam_mese;                                    
  
  // supporto per l'ultima figata                         
  int        _firm_bookmark;
  int        _att_bookmark;
  
protected:              
  
  long select_firm_range(long from, long to, wht freq);
  
  static bool ch_year_handler(TMask_field& f, KEY key);
  static bool to_ditt_handler(TMask_field& f, KEY key);
  static bool fr_ditt_handler(TMask_field& f, KEY key);
  static bool what_freq_handler(TMask_field& f, KEY key);
  static bool lst_tm_handler(TMask_field& f, KEY key);
  static bool select_button(TMask_field& f, KEY key);
  static bool reset_button(TMask_field& f, KEY key);
  static bool chk_final_handler(TMask_field& f, KEY key);
    
  static TLiquidazione_app& app() { return (TLiquidazione_app&)main_app(); }
  
public:
  
  virtual bool user_create();
  virtual bool user_destroy();
  virtual bool set_print(int i);
  
  // cazzatelle per handlers
  TArray_sheet* get_ditte_sheet() { return _ditte; }
  TBit_array&   get_selected()    { return _selected; }  
  void          build_ditte_sheet(wht);
  void          reset_choices(TMask&);
  void          set_choice_limits(TMask&);
  void          build_nomiditte(TProgind* pnd = NULL);
  void          set_year(const char* y) { _year  = y; }
  void          set_month(const int m)  { _month = m; }
  
  bool set_liquidazione();
  bool recalc_all();
  
  // ricalcolo progressivi mese
  bool update_firm   (int month, bool recalc = TRUE);
  bool update_att    (int month, const char* codatt, bool recalc = TRUE);
  void zero_att      (int month, const char* codatt);
  void zero_annual   (int month);
  void recalc_att    (int month, const char* codatt);
  void recalc_annual (const char* codatt);
  _DescrItem* recalc_rimborso(int month, const char* codatts, bool print);
  
  // Le funzioni che hanno come prefisso iva11 sono per creare il file di trasferimento per IVA11
  // Viene chiamata quando vengono scorsi tutti i movimenti, settando gli elementi di _iva11_arr.
  void iva11_set_arr_phase_1    (const TString& codatt);
  // Scorre tutti i PIM della ditta, per completare _iva11_arr prima di chiamare write_IVA11()
  void iva11_set_arr_phase_2    (const TString& codatt);
  // Scrive per la ditta/attivita' corrente, i dati relativi al trasferimento IVA11
  // Se viene passato TRUE come parametro, azzera i campi R1 ed R2.
  void iva11_write   (bool reset_r1r2 = FALSE);

  // ricalcolo liquidazioni dai progressivi mensili
  void write_liq     (int month, const char* atts);
  
  // ritorna l'eventuale ma sempre appropriato debito (< 50.000)
  real debt_prec(int month);
  // ritorna il risultato della liquidazione del mese
  // non considera il conguaglio prorata (annuale) 
  real result_liq(int month);
  // ritorna l'appropriato credito precedente al mese in corso
  real credito_prec(int month);
  // ritorna l'appropriato credito di costo precedente al mese in corso
  // (travel agency only)
  real credito_costo_prec(int month);
  // ritorna i versamenti effettuati nel mese per
  // i tipi delega passati (stile tokenstring) sommando  
  // gli interessi se interesse = TRUE
  real versamenti_IVA(int month, const char* types, bool interesse = FALSE);
  // Ritorna il valore dell'iva da riportare (solitamente 50500)
  real iva_da_riportare(int month);
  
  // Funzione personale di arrotondamento alle 1000 LIRE o all'euro.
  // Risolve il seguente problema: da 0 a 500 lire arrotonda alle mille inferiori
  // da 501 a 999 arrotonda alle mille superiori.
  void round_imposta(real& d) const;
  // Funzione personale di arrotondamento alla lira o centesimo di euro.
  void round_alla_lira(real& d, bool superiore = FALSE);
  
  // supporto stampa
  void describe_firm(int month);
  void describe_att(int month, const char* codatt, bool isresult, char flags);
  void describe_name(int month, TToken_string& atts, char flags);
  void describe_plafond(int month, const char* codatt); 
  void describe_ventilation(int month, const char* codatt); 
  void describe_agricolo(int month, const char* codatt); 
  void describe_viaggio(int month, const char* codatt); 
  void describe_pims(int month, const char* codatt, const bool describe_pis);
  void describe_liq(int month, const char* codatts, _DescrItem* d = NULL);
  void describe_error(const char* errstr, const char* codatt);
  void describe_annual(const char* codatt);
  void describe_consistence(const char* codatt);
  void describe_liqacc();
  
  _DescrItem* describe_deleghe(int month);
  
  // corrispettivi
  void recalc_corrispettivi (int month, const char* codatt);
  
  // ventilasiun
  void recalc_ventilation (int month, const char* codatt);

  // ag. viaggio
  void recalc_viaggio (int month, const char* codatt);
  
  // plafond
  void zero_plafond (int month, const char* codatt);
  void add_plafond  (int month, const char* codatt, int type,
                     const real& howmuch, bool intra);
  
  // Ritorna il parametro della liquidazione differita per la ditta corrente, cosi come 
  // e' scritto sui parametri liquidazione (LIA)
  // Se si passa 0 (default) vede prende la ditta correntemente in corso di calcolo
  // Analogamente per l'anno
  bool TLiquidazione_app::is_differita(long firm = 0, int year = 0);
  
  // ritorna l'aliquota ordinaria dal
  // codice IVA apposito immesso nei parametri studio
  real aliquota_agvia();
  
  // ritorna l'interesse per il mese in questione (dai parametri studio)
  real interesse_trimestrale(int month);
  
  // minchia di puro suino
  void add_vendite     (int month, const char* codreg, int tipoind, const real& imp);
  void add_ventilation (real iva, real sum, const char* codiva, const char* other);
  void add_corrisp     (int month, const char* codreg, const real& r,
                        const real& p, int tipodet, const char* codiva, const char* codatt);
  
  //vergine immacolata, richiamata per scorporare l'iva nei corrispettivi peccatori 
  void lordo2netto(const real& totale, real& imponibile, real& imposta, const real& aliquota);
  void lordo2netto(real& imponibile, real& imposta, const real& aliquota);
  
  // printappings
  virtual void         set_page(int file, int counter);
  virtual bool         preprocess_page(int file, int counter);
  virtual print_action postprocess_page(int file, int counter);
  
  // settaggio righe per ogni elemento di _descr_arr
  void set_plafond(_DescrItem& d);
  void set_ventila(_DescrItem& d);
  void set_regagr(_DescrItem& d);
  void set_viaggio(_DescrItem& d);
  void set_firm(_DescrItem& d);
  void set_att(_DescrItem& d);
  void set_pim(_DescrItem& d);
  void set_pumpam(_DescrItem& d);
	void set_plm_diff(_DescrItem& d);
  void set_plm(_DescrItem& d);
  bool set_annual(_DescrItem& d);
  void set_grand(_DescrItem& d);
  void set_grand_1999(_DescrItem& d, int &rw);
  void set_grand_2000(_DescrItem& d, int &rw);
  void set_pim_head(_DescrItem& d);
  void set_liqacc_1999(_DescrItem& d);
  void set_liqacc_2000(_DescrItem& d);
  
  // Utility per stampare nella colonna debito o credito
  void print_importo(int rw, const char* prompt, real imp, bool red = FALSE);
  
  // cercapalle in tabelle con opzione di creazione se serve
  bool look_pim(int m, const char* a, const char* r, const char* cr,
                const char* i, int tipodet = 0, bool create = FALSE);
  bool look_pis(int m, const char* a, const char* r, const char* cr,
                const char* i, int tipodet = 0, bool create = FALSE);
  bool look_prm(int m, const char* a, const char* r, const char* cr,
                const char* i, int tipodet = 0, bool create = FALSE);
  bool look_prp(int m, const char* a, const char* r, const char* cr,
                const char* i, int tipodet = 0, bool create = FALSE);
  bool look_pum(int m, const char* a, bool create = FALSE);
  bool look_pam(int m, const char* a, bool create = FALSE);
	bool look_pem(TTable & pem, int codreg);
  bool look_pom(int m, const char* a, bool create = FALSE);
  bool look_plm(int m, const char* a, bool create = FALSE);
  bool look_pia(int m, const char* a, const char* cod1, const char* cod2, bool create = FALSE);
  bool look_lim(int m, bool create = FALSE);
  bool look_lam(int m, bool create = FALSE);
  bool look_pla(const char* a, bool create = FALSE);
  bool look_ppa(int m, const char* a, int t, bool create = FALSE);
  bool look_del(int month, int type, bool create = FALSE);
  bool look_iva(const char* cod);
  bool look_reg(const char* reg);                              
  bool look_lia(long ditta = 0l, bool create = FALSE, int anno = 0);
  
  // trova il mytical ufficio concessione da mettere nelle deleghe
  bool look_conc(TString& uffcon, TString& uffiva);
  
  _VendItem* look_vendita(int m, const char* codreg);
  _VentItem* look_ventilation(int m, const char* codreg);
  
  // tutti i controlli del mondo sui mesi da calcolare
  static bool is_trim (int x);
  // ritorna il mese corrispondente alla scadenza del trimestre relativo 
  // senza considerare la frequenza versamenti
  int next_trim(int x);
  // is_month_ok controlla che il mese passato sia
  // da prendere in considerazione per la liquidazione 
  // controllando il regime trimestrale o mensile e 
  // il ricalcolo annuale
  bool is_month_ok(int x, int mtocalc);
  // is_month_ok_strict controlla che il mese sia OK per la
  // liquidazione, ma ritorna TRUE per le trimestrali solo
  // se il mese cade ESATTAMENTE su un trimestre
  bool is_month_ok_strict(int x, int month = -1);
  // questa e' la piu' semplice, per vedere se devo
  // calcolare il mese fottendomene dell'annuale
  bool is_month_plain(int x); 
  // questa serve per i progressivi: la data passata va bene
  // se il movimento deve essere considerato in calcolo e riepilogo
  // per la liquidazione di month
  bool is_date_ok     (const TDate& d, int month, int liqmonth, int year);
  bool is_in_liq_period(const TDate& d);
  bool is_first_month (int m);
  int  liq_month(int x);

  int  previous_month (int m);
  
  // Funzioni accessorie: estrazione deleghe
  bool set_deleghe();
  bool extract_deleghe();
  bool extract_delega(int m, TArray& desc);
  bool video_conferma(const real&, const real&, const real&, bool to_del = FALSE);
  // stampa
  void set_deltab(_DescrItem& d, bool iscred);
  
  // Funzioni accessorie: calcolo acconto dicembre  
  // i real passati sono due cazzi di correzioni iva che 
  // vanno settate nella maschera anche se non potranno
  // mai riguardare tutte le ditte

  bool set_acconto   (real&, real&);
  bool recalc_acconti(real&, real&);
  bool recalc_acconto(real&, real&);
  // stampa
  void set_acconto_p(_DescrItem& d);  
  void set_acchead_p(_DescrItem& d);
  
  real credito_utilizzato(int month, bool iva, bool f24) const;
  
  // cippiuppiu'  
  TLiquidazione_app(int men);
  virtual ~TLiquidazione_app() {}
};