2475 2521 2493 2494 2559 2558 2556 2495 2487 2491 2470 2461 2568 2492 2587 2457 2458 2459 2460 2574 2582 2525 2526 2524 2523 2522 2531 2530 2529 2528 2527 2534 2533 2536 2537 2538 2510 2515 2585 2539 2570 2555 2584 2503 2500 2499 2543 2547 2569 2472 ???? git-svn-id: svn://10.65.10.50/trunk@702 c028cbd2-c16b-5b4b-a496-9718f37d4682
437 lines
12 KiB
C++
Executable File
437 lines
12 KiB
C++
Executable File
// ba3700.cpp - Tabella condizioni di pagamento
|
|
|
|
#include <relapp.h>
|
|
#include <tabutil.h>
|
|
#include <urldefid.h>
|
|
#include <utility.h>
|
|
#include <msksheet.h>
|
|
|
|
#include "ba3700.h"
|
|
#include "../cg/pagament.h"
|
|
|
|
#define ALIAS 1
|
|
|
|
class BA3700_application : public TRelation_application
|
|
{
|
|
TRelation* _rel;
|
|
TMask* _msk;
|
|
Pagamento* _pag;
|
|
TSheet_field* _cs;
|
|
int _mode; // Modo maschera corrente
|
|
int _interv_rate;
|
|
int _numero_rate;
|
|
int _riga;
|
|
|
|
protected:
|
|
|
|
virtual bool user_create();
|
|
virtual bool user_destroy();
|
|
|
|
// minchia di cristo
|
|
virtual TRelation* get_relation() const { return _rel; }
|
|
virtual TMask* get_mask(int mode) { return _msk; }
|
|
virtual bool changing_mask(int mode) { return FALSE; }
|
|
|
|
// file intertface
|
|
virtual bool remove();
|
|
virtual void init_insert_mode(TMask&);
|
|
virtual void init_query_mode(TMask&);
|
|
virtual int rewrite(const TMask& m);
|
|
virtual int write(const TMask& m);
|
|
virtual int read(TMask& m);
|
|
|
|
// notifier
|
|
static bool sheet_action(int r, KEY k);
|
|
|
|
// handlers
|
|
static bool intervallo_rate (TMask_field& f, KEY k);
|
|
static bool rate_differenziate (TMask_field& f, KEY k);
|
|
static bool tipo_prima_rata (TMask_field& f, KEY k);
|
|
static bool numero_rate (TMask_field& f, KEY k);
|
|
static bool mese_commerciale (TMask_field& f, KEY k);
|
|
|
|
void* _app_data;
|
|
|
|
public:
|
|
|
|
void set_app_data(void* v) { _app_data = v; }
|
|
static void* get_app_data() { return ((BA3700_application &)main_app())._app_data; }
|
|
|
|
BA3700_application() : TRelation_application() {}
|
|
virtual ~BA3700_application() {}
|
|
};
|
|
|
|
|
|
// app-data per handlers
|
|
struct sht {
|
|
TMask* _msk;
|
|
Pagamento* _pag;
|
|
TSheet_field* _sht;
|
|
TArray* _rws;
|
|
} shuttle;
|
|
|
|
|
|
|
|
bool BA3700_application::user_create()
|
|
{
|
|
_rel = new TRelation(TAB_CPG);
|
|
_rel->add(TAB_RPG, "CODTAB[1,4]=CODTAB" ,1, 0, ALIAS);
|
|
|
|
_interv_rate = 30;
|
|
_pag = NULL;
|
|
_msk = new TMask("ba3700a");
|
|
_cs = &((TSheet_field&)_msk->field(F_SHEET_RPG));
|
|
_cs->set_notify(sheet_action);
|
|
|
|
_msk->set_handler (F_INT_RATE , intervallo_rate);
|
|
_msk->set_handler (F_RATE_DIFF , rate_differenziate);
|
|
_msk->set_handler (F_TIPO_PRIMA_RATA , tipo_prima_rata);
|
|
_msk->set_handler (F_NUM_RATE , numero_rate);
|
|
_msk->set_handler (F_MESECOMM , mese_commerciale);
|
|
|
|
shuttle._msk = _msk;
|
|
shuttle._sht = _cs;
|
|
|
|
set_app_data(&shuttle);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
bool BA3700_application::user_destroy()
|
|
{
|
|
delete _msk;
|
|
delete _rel;
|
|
if (_pag) delete _pag;
|
|
return TRUE;
|
|
}
|
|
|
|
int BA3700_application::read(TMask& m)
|
|
{
|
|
m.autoload(_rel);
|
|
|
|
TString code(m.get(F_CODICE));
|
|
int ir = m.get_int(F_INT_RATE); if (ir == 0) ir = -1;
|
|
shuttle._pag = _pag = new Pagamento(code);
|
|
_pag->set_sheet(*_cs, ir);
|
|
if (_pag->n_rate() > 1)
|
|
_interv_rate = _pag->scad_rata(_pag->n_rate() - 1);
|
|
|
|
TArray* arr = new TArray;
|
|
if (shuttle._rws != NULL) delete shuttle._rws;
|
|
(*arr) = _cs->rows_array();
|
|
shuttle._rws = arr;
|
|
|
|
// shuttle._msk->field(F_INT_RATE).set(format("%d",_interv_rate));
|
|
shuttle._msk->field(F_NUM_RATE).set(format("%d",_pag->n_rate()));
|
|
shuttle._msk->field(F_RATE_DIFF).set(_pag->rate_differenziate() ? "1" : "2");
|
|
|
|
return NOERR;
|
|
}
|
|
|
|
void BA3700_application::init_insert_mode(TMask& m)
|
|
{
|
|
TString code(m.get(F_CODICE));
|
|
shuttle._pag = _pag = new Pagamento(code);
|
|
_pag->set_sheet(*_cs);
|
|
TArray* arr = new TArray;
|
|
if (shuttle._rws != NULL) delete shuttle._rws;
|
|
(*arr) = _cs->rows_array();
|
|
shuttle._rws = arr;
|
|
shuttle._msk->field(F_INT_RATE).set("30");
|
|
shuttle._msk->field(F_INIZIOSCAD).set("F");
|
|
shuttle._msk->field(F_NUM_RATE).set("1");
|
|
shuttle._msk->field(F_RATE_DIFF).set("2");
|
|
}
|
|
|
|
void BA3700_application::init_query_mode(TMask& m)
|
|
{
|
|
_cs->reset(); _cs->force_update();
|
|
if (shuttle._rws != NULL) delete shuttle._rws;
|
|
shuttle._rws = new TArray;
|
|
}
|
|
|
|
// handlers
|
|
|
|
bool BA3700_application::intervallo_rate(TMask_field& f, KEY k)
|
|
{
|
|
// ricalcola tutte le scadenze
|
|
// occorre pag->set_intervallo_rate(intervallo)
|
|
if (k != K_TAB) return TRUE;
|
|
|
|
sht* s = (sht*)get_app_data();
|
|
Pagamento* pag = s->_pag;
|
|
TSheet_field* shf = s->_sht;
|
|
TMask* msk = s->_msk;
|
|
|
|
if (!pag || msk->get(F_INT_RATE).empty()) return TRUE;
|
|
|
|
pag->set_intervallo_rate(msk->get_int(F_INT_RATE));
|
|
if (pag->dirty())
|
|
{
|
|
pag->set_sheet(*shf);
|
|
(*(s->_rws)) = shf->rows_array();
|
|
msk->field(F_MESECOMM).set(pag->mese_commerciale() ? "X" : "");
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
bool BA3700_application::rate_differenziate(TMask_field& f, KEY k)
|
|
{
|
|
// se erano differenziate e non lo sono piu' occorre riaggiustare
|
|
// il riaggiustabile; altrimenti si lascia cosi'
|
|
// pag->set_rate_differenziate()
|
|
if (k != K_TAB) return TRUE;
|
|
|
|
sht* s = (sht*)get_app_data();
|
|
Pagamento* pag = s->_pag;
|
|
TSheet_field* shf = s->_sht;
|
|
TMask* msk = s->_msk;
|
|
TArray* rws = s->_rws;
|
|
|
|
if (!pag) return TRUE;
|
|
pag->set_rate_differenziate(msk->get_int(F_RATE_DIFF));
|
|
if (pag->dirty())
|
|
{
|
|
pag->set_sheet(*shf);
|
|
(*rws) = shf->rows_array();
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
bool BA3700_application::tipo_prima_rata(TMask_field& f, KEY k)
|
|
{
|
|
// aggiunge o toglie se necessario rata 0, lasciando
|
|
// le altre e shiftando le scadenze
|
|
// pag->set_tipo_prima_rata()
|
|
if (k != K_TAB) return TRUE;
|
|
|
|
sht* s = (sht*)get_app_data();
|
|
Pagamento* pag = s->_pag;
|
|
TSheet_field* shf = s->_sht;
|
|
TMask* msk = s->_msk;
|
|
TArray* rws = s->_rws;
|
|
|
|
if (!pag || pag->n_rate() == 0) return TRUE;
|
|
|
|
int ir = msk->get_int(F_INT_RATE);
|
|
if (ir == 0) ir = -1;
|
|
|
|
pag->set_tipo_prima_rata(msk->get_int(F_TIPO_PRIMA_RATA),ir);
|
|
if (pag->dirty())
|
|
{
|
|
pag->set_sheet(*shf);
|
|
(*rws) = shf->rows_array();
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
bool BA3700_application::numero_rate(TMask_field& f, KEY k)
|
|
{
|
|
// azzera tutto e ricrea da capo mantenendo le scadenze che ci sono
|
|
if (k != K_TAB) return TRUE;
|
|
|
|
sht* s = (sht*)get_app_data();
|
|
Pagamento* pag = s->_pag;
|
|
TSheet_field* shf = s->_sht;
|
|
TMask* msk = s->_msk;
|
|
TArray* rws = s->_rws;
|
|
int nr = msk->get_int(F_NUM_RATE);
|
|
if (!pag || nr == pag->n_rate() || msk->get(F_NUM_RATE).empty()) return TRUE;
|
|
int ir = msk->get_int(F_INT_RATE);
|
|
if (ir == 0) ir = -1;
|
|
|
|
pag->set_numero_rate(msk->get_int(F_NUM_RATE),ir);
|
|
if (pag->dirty())
|
|
{
|
|
pag->set_sheet(*shf);
|
|
(*rws) = shf->rows_array();
|
|
}
|
|
|
|
msk->field(F_NUM_RATE).set(format("%d",pag->n_rate()));
|
|
return TRUE;
|
|
}
|
|
|
|
bool BA3700_application::mese_commerciale(TMask_field& f, KEY k)
|
|
{
|
|
// setta mcomm e ricalcola le scadenze
|
|
// pag->set_mese_commerciale()
|
|
// if (k != K_ENTER) return FALSE;
|
|
|
|
sht* s = (sht*)get_app_data();
|
|
Pagamento* pag = s->_pag;
|
|
TSheet_field* shf = s->_sht;
|
|
TMask* msk = s->_msk;
|
|
TArray* rws = s->_rws;
|
|
|
|
if (!pag) return TRUE;
|
|
int ir = msk->get_int(F_INT_RATE);
|
|
if (ir == 0) ir = -1;
|
|
|
|
pag->set_mese_commerciale(msk->get_bool(F_MESECOMM),ir);
|
|
if (pag->dirty())
|
|
{
|
|
pag->set_sheet(*shf);
|
|
(*rws) = shf->rows_array();
|
|
msk->field(F_INT_RATE).set(format("%d",ir));
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
// qui viene il belloccio
|
|
bool BA3700_application::sheet_action(int r, KEY k)
|
|
{
|
|
bool doit = TRUE, m_perc = FALSE, m_pag = FALSE;
|
|
bool m_scad = FALSE, m_tipo = FALSE, mod = FALSE;
|
|
word ahiahi = P_OK;
|
|
|
|
sht* s = (sht*)get_app_data();
|
|
Pagamento* pag = s->_pag;
|
|
TSheet_field* shf = s->_sht;
|
|
TMask* msk = s->_msk;
|
|
TArray* rws = s->_rws;
|
|
|
|
if (!pag) return TRUE;
|
|
|
|
TString news(15), newp(15), newt(2);
|
|
TToken_string ts(36), ns(36);
|
|
bool recalc = TRUE;
|
|
|
|
|
|
switch (k)
|
|
{
|
|
case K_SPACE:
|
|
break;
|
|
case K_ENTER:
|
|
{
|
|
ns = shf->row(r);
|
|
ts = (TToken_string&)(*rws)[r];
|
|
|
|
news = ns.get(0);
|
|
newp = ns.get(1);
|
|
newt = ns.get(2);
|
|
|
|
// qui viene il bello, si fa per dire
|
|
if (ts.get_int(0) != atoi(news)) // modificata scadenza
|
|
{
|
|
mod = m_scad = TRUE;
|
|
}
|
|
const real p0(ts.get(1));
|
|
const real p1(newp);
|
|
|
|
if (p0 != p1) // modificata percentuale
|
|
{
|
|
mod = m_perc = TRUE;
|
|
}
|
|
if (strcmp(ts.get(2),newt) != 0) // modificato tipo pagamento
|
|
{
|
|
mod = m_tipo = TRUE;
|
|
}
|
|
}
|
|
break;
|
|
case K_DEL:
|
|
case K_INS:
|
|
doit = FALSE;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
|
|
// settato da recalc_rate se occorre ridefinire lo sheet
|
|
// aggiungendo o togliendo righe
|
|
bool need_recalc = FALSE;
|
|
|
|
if (k == K_ENTER)
|
|
{
|
|
if (mod && recalc)
|
|
{
|
|
// ricalcola sheet come sai fare tu
|
|
int rdiff = atoi(msk->get(F_RATE_DIFF));
|
|
ahiahi = pag->recalc_rate(r, m_perc,
|
|
(m_perc ? (const char*)newp : NULL),
|
|
(m_scad ? (const char*)news : NULL),
|
|
(m_tipo ? (const char*)newt : NULL),
|
|
rdiff,
|
|
pag->mese_commerciale(),
|
|
need_recalc);
|
|
// see if parameters changed
|
|
msk->field(F_RATE_DIFF).set(pag->rate_differenziate() ? "1" : "2");
|
|
msk->field(F_MESECOMM).set(pag->mese_commerciale() ? "X" : "");
|
|
}
|
|
if (!recalc)
|
|
{
|
|
ahiahi = P_OK;
|
|
// put data as they are
|
|
TToken_string& trw = pag->rata(r);
|
|
TToken_string srw = trw;
|
|
if (m_scad) trw.add(news,0);
|
|
if (m_perc) trw.add(newp,1);
|
|
if (m_tipo) trw.add(newt,2);
|
|
// validate the payment
|
|
if ((ahiahi = pag->validate()) != P_OK)
|
|
pag->rata(r) = srw;
|
|
}
|
|
if (ahiahi) // any error?
|
|
// rimetti le righe com'erano prima
|
|
{
|
|
beep();
|
|
|
|
// se gli errori sono voluti, spiegali
|
|
if (!recalc)
|
|
{
|
|
TString s(256);
|
|
pag->strerr(ahiahi,s);
|
|
warning_box(s);
|
|
}
|
|
|
|
shf->row(r) = (TToken_string&)(*rws)[r];
|
|
shf->force_update(r);
|
|
}
|
|
|
|
else if (recalc && mod && need_recalc)
|
|
{
|
|
// ridefinisci lo sheet sulla base delle nuove rate
|
|
pag->set_sheet(*shf);
|
|
shf->force_update(-1);
|
|
rws->destroy();
|
|
(*rws) = shf->rows_array();
|
|
}
|
|
|
|
msk->field(F_NUM_RATE).set(format("%d", pag->n_rate()));
|
|
}
|
|
|
|
return doit;
|
|
}
|
|
|
|
|
|
int BA3700_application::rewrite(const TMask& m)
|
|
{
|
|
TTable& tab_rpg = (TTable&)_rel->lfile(-ALIAS);
|
|
const int err = _pag->rewrite(tab_rpg);
|
|
if (err != NOERR) return err;
|
|
m.autosave(_rel);
|
|
return _rel->lfile().rewrite();
|
|
}
|
|
|
|
int BA3700_application::write(const TMask& m)
|
|
{
|
|
TTable& tab_rpg = (TTable&)_rel->lfile(-ALIAS);
|
|
const int err = _pag->write(tab_rpg);
|
|
if (err != NOERR) return err;
|
|
m.autosave(_rel);
|
|
return _rel->lfile().write();
|
|
}
|
|
|
|
bool BA3700_application::remove()
|
|
{
|
|
TTable& tab_rpg = (TTable&)_rel->lfile(-ALIAS);
|
|
return _pag->remove(tab_rpg) == NOERR && _rel->lfile().remove() == NOERR;
|
|
}
|
|
|
|
int ba3700(int argc, char* argv[])
|
|
{
|
|
BA3700_application a;
|
|
a.run(argc, argv, "Condizioni di pagamento");
|
|
return 0;
|
|
}
|