#ifndef __PAGAMENT_H #define __PAGAMENT_H #ifndef __MSKSHEET_H #include #endif #ifndef __TABUTIL_H #include #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 TPagamento : 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 TPagamento(const char* codtab = NULL, const char* data = NULL); virtual ~TPagamento() {} }; #endif