campo-sirio/ba/ba3700.cpp
alex cb6165f09b Corretti errori sulle anagrafiche da MI :
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
1994-11-29 17:49:19 +00:00

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;
}