campo-sirio/cg/pagament.h

149 lines
6.0 KiB
C
Raw Normal View History

#ifndef __PAGAMENT_H
#define __PAGAMENT_H
#ifndef __REAL_H
#include <real.h>
#endif
#ifndef __STRINGS_H
#include <string.h>
#endif
#ifndef __DATE_H
#include <date.h>
#endif
#ifndef __MSKSHEET_H
#include <msksheet.h>
#endif
#ifndef __TABUTIL_H
#include <tabutil.h>
#endif
// Error codes for pagation
const word P_OK = 0x0000; // ok
const word P_RSUM = 0x0001; // percentages do not sum up to 100
const word P_IMPNC = 0x0002; // inconsistenza percentuali / importi
const word P_SCAD = 0x0004; // scadenze non consecutive
const word P_INIZIO = 0x0008; // data 1a rata < data inizio pagamenti
class Pagamento : public TObject
{
TString _code; // codice
TString _name; // descrizione
real _imponibile; // imponibile da affettare
real _imposta; // imposta da affettare
real _spese; // spese da affettare
TDistrib _slicer; // affettatrice
bool _new; // non letto da database
TArray _rate; // rate medesime
char _inscad; // inizio scadenze: S1
bool _mcomm; // mese commerciale: B0
bool _rdiff; // rate differenziate: B1
int _tpr; // tipo prima rata: S3
bool _dirty; // modificato (strutturalmente!)
TDate _inizio; // data inizio pagamenti
bool _inited; // vero se c'e' un movimento di riferimento
real _firstr; // importo da pagare in prima rata (o distribuire se tpr == 0)
real _secndr; // importo da distribuire
int _rata_ifield(int n, int f) const;
real _rata_rfield(int n, int f) const;
TDate _rata_dfield(int n, int f) const;
const char* _rata_sfield(int n, int f) const;
public:
int n_rate() const { return _rate.items(); }
bool is_new() const { return _new; }
bool dirty() const { return _dirty; }
real imponibile() const { return _imponibile; }
real imposta() const { return _imposta; }
real spese() const { return _spese; }
int tipo_rata(int n) const { return _rata_ifield(n,2);}
real perc_rata(int n) const { return _rata_rfield(n,1);}
int scad_rata(int n) const { return _rata_ifield(n,0);}
TDate data_rata(int n) const { return _rata_dfield(n,3);}
real tpay_rata(int n) const { return _rata_rfield(n,4);}
const char* ulc_rata(int n) const { return _rata_sfield(n,5);}
char inizio_scadenza() const { return _inscad; }
bool mese_commerciale() const { return _mcomm; }
bool rate_differenziate() const { return _rdiff; }
int tipo_prima_rata() const { return _tpr; }
// mi scuso per la mancanza di underscore, ma mi piaceva cosi'
bool ratapagata(int n);
const TString& name() const { return _name; }
const TString& code() const { return _code; }
const char* desc_tpr() const;
const char* desc_tipo(int) const;
// queste vengono usate solo per movimenti editabili nella struttura
// (da tabella pagamenti) e riaggiustano tutte le rate in accordo
// con il parametro modificato
void set_intervallo_rate(int i);
void set_mese_commerciale(bool v, int& sscad);
void set_rate_differenziate(int v);
void set_tipo_prima_rata(int v, int sscad = -1);
void set_numero_rate(int n, int sscad = -1);
void set_inizio_scadenza(char v) { _inscad = v; }
void set_code(const char* c) { _code = c; }
// check consistency: returns word with errors flagged, 0 if ok
word validate() const;
void strerr(word err, TString& s);
// read/write from database
// relapp passa i files, se no vengono aperti
bool read(TTable* cpg = NULL, TTable* rpg = NULL);
// chiamabili solo da relapp, agiscono solo su %RPG
int write(TTable& rpg);
int rewrite(TTable& rpg);
int remove(TTable& rpg);
// modifica rate manualmente o non
TToken_string& rata(int r) { return (TToken_string&)_rate[r]; }
TToken_string& add_rata (real perc, int day, int type);
TToken_string& set_rata (int index, real perc, int day, int type,
const char* ulc = NULL, const char* imp = NULL,
const char* data = NULL);
// questa calcola percentuali e scadenze a partire dagli importi
TToken_string& set_rata (int index, real howmuch, TDate& date, int type,
const char* ulc, bool pagato);
void remove_rata(int r);
void zap_rate () { _rate.destroy(); }
// calcola le rate automaticamente secondo quanto specificato
void set_rate_auto();
// data una rata esistente, riaggiusta gli importi usando lo slicer e
// le scadenze usando la data di inizio
void set_imprata(int i, real r);
// slicer interface
void set_total(real& ib, real& im, real& sp);
// istanzia uno sheet field come diobue comanda
void set_sheet(TSheet_field& sf, int sscad = -1);
// ricalcola automaticamente tutto il ricalcolabile
// alla modifica di una percentuale (o di un importo)
// ritorna TRUE se non si poteva; non occorre che sia inizializzato
// con un importo
word recalc_rate(int row, bool is_perc_modified, const char* new_value,
const char* scad, const char* typ, int rdiff,
bool mcomm, bool& need_recalc);
// determina la prossima scadenza
void next_scad(TDate& d, int scad, bool mcomm, int rata);
// se codtab non e' NULL legge da file (e da' errore se non c'e')
// se si vuole fare un pagamento nuovo si da' il codice con set_code
Pagamento(const char* codtab = NULL, const char* data = NULL);
virtual ~Pagamento() {}
};
#endif