campo-sirio/ef/ef0300.cpp
paola 98aaa44159 aggiunti file per la gestione delle distinte(ef03*.*)
git-svn-id: svn://10.65.10.50/trunk@3899 c028cbd2-c16b-5b4b-a496-9718f37d4682
1996-11-14 17:40:05 +00:00

442 lines
13 KiB
C++
Executable File
Raw Blame History

#include <relapp.h>
#include <msksheet.h>
#include <sheet.h>
#include <utility.h>
#include <lffiles.h>
#include <effetti.h>
#include <reffetti.h>
#include <cession.h>
#include "ef0.h"
#include "ef0300.h"
#include "ef0301.h"
//Classe per la gestione di distinte (inserimento, modifica, cancellazione)
// e per la creazione automatica di distinte per importi.
class TVariazione_distinte: public TRelation_application
{
TMask *_msk, *_m2;
TDistinta *_distinta;
TRelation *_rel;
TLocalisamfile *_reff, *_cession;
protected:
virtual void init_query_mode(TMask&);
virtual void init_insert_mode(TMask&);
virtual const char* get_next_key();
virtual int read(TMask& m);
virtual int rewrite(const TMask& m);
virtual int write(const TMask& m);
virtual bool remove(char tipodist, long ndist);
virtual TMask* get_mask(int mode) {return _msk;}
virtual bool changing_mask(int mode) {return FALSE;}
static bool aggiungi_handler(TMask_field& f, KEY k);
static bool elimina_handler(TMask_field& f, KEY k);
static bool impdist_notify(TSheet_field& s, int r, KEY key);
static bool m2_handler(TMask& m, KEY key);
static bool conferma_handler(TMask_field& f, KEY k);
static bool annulla_handler(TMask_field& f, KEY k);
static void calcola_totale();
static void carica_riba();
TSheet_field& righe_sheet() const;
TSheet_field& righe_sel_sheet() const;
bool cerca(long num);
bool user_create();
bool user_destroy();
void aggiorna();
void elimina(TString16 tipodist, long ndist) ;
TToken_string* common_f(const TMask& m);
public:
virtual TRelation* get_relation() const {return _rel;}
TVariazione_distinte() {};
virtual ~TVariazione_distinte() {};
};
inline TVariazione_distinte& app()
{
return (TVariazione_distinte&)main_app();
}
void TVariazione_distinte::init_query_mode(TMask&)
{
_msk->reset(F_TOTIMP);
_msk->reset(F_TOTIMPVAL);
}
void TVariazione_distinte::init_insert_mode(TMask&)
{
_msk->reset(F_TOTIMP);
_msk->reset(F_TOTIMPVAL);
TToken_string riga("|||||||||||");
righe_sheet().row(0)= riga;
righe_sheet().set_dirty();
righe_sel_sheet().row(0)= riga;
righe_sel_sheet().set_dirty();
}
//Ritorna il prossimo numero valido di chiave
const char* TVariazione_distinte::get_next_key()
{
TLocalisamfile& effetti = _rel->lfile();;
long ndist=1L;
if ( !effetti.empty() )
{
effetti.zero();
effetti.setkey(4);
effetti.last();
if ( effetti.good() )
ndist+=effetti.get_long(EFF_NDIST);
}
return format("%d|%ld",F_NUMBER,ndist);
}
//Ritorna un riferimento allo sheet degli effetti (righe) nella distinta
TSheet_field& TVariazione_distinte::righe_sheet() const
{
TSheet_field& r_sheet = (TSheet_field&)_msk->field(F_SHEET_RIBA);
return r_sheet;
}
//Ritorna un riferimento allo sheet delle righe
TSheet_field& TVariazione_distinte::righe_sel_sheet() const
{
TSheet_field& r_sheet = (TSheet_field&)_m2->field(F_SHEET);
return r_sheet;
}
//Ritorna TRUE se trovo nel'array delle righe distinta l'effetto passato
bool TVariazione_distinte::cerca(long num)
{
bool trovato = FALSE;
int items = _distinta->items();
TArray& righedist = _distinta->righe();
for (int i = 0; i < items; i++)//ciclo sugli elementi dell'array
{
TEffetto& eff = (TEffetto&)righedist[i];
long num_eff = eff.get_long("NPROGTR");
if (num_eff == num)
{
trovato = TRUE;
continue;
}
}
return trovato;
}
//Metodo che permette di scivere sull'array gli effetti presenti nello sheet
// comune a write e rewrite
void TVariazione_distinte::aggiorna()
{
TSheet_field& shrighe = righe_sheet();
int items = shrighe.items();
for (int i = 0; i < items; i++)
{
TToken_string& row = shrighe.row(i);
row.restart();
long num = row.get_long(1);
if (!cerca(num))
{
TLocalisamfile eff(LF_EFFETTI);
TRectype rec = eff.curr();
eff.setkey(1);
rec.zero();
rec.put(EFF_NPROGTR, num);
int err = eff.read();
TEffetto* effetto= new TEffetto(rec);
TArray& righedist = _distinta->righe();
righedist.add(effetto);
}
}
}
//Metodo che permette di eliminare il collegamento tra effetto e distinta per gli
//effetti che non fanno parte dell'array
void TVariazione_distinte::elimina(TString16 tipodist, long ndist)
{
TLocalisamfile eff(LF_EFFETTI);
eff.put("TIPODIST",tipodist);
eff.put("NDIST",ndist);
eff.read(_isgteq);
TString16 t = eff.get("TIPODIST");
long n = eff.get_long("NDIST");
long num =eff.get_long("NPROGTR");
while ((t==tipodist)&&(n==ndist))
{
if (!cerca(num))
{
eff.zero("TIPODIST");
eff.zero("NDIST");
eff.zero("DATADIST");
eff.zero("NRIGADIST");
eff.zero("CODABIP");
eff.zero("CODCABP");
eff.rewrite();
}
eff.next();
t = eff.get_char("TIPODIST");
n = eff.get_long("NDIST");
}
}
//Metodo che permette di scivere su file i dati inseriti nella maschera;
// comune a write e rewrite
TToken_string* TVariazione_distinte::common_f(const TMask& m)
{
TString16 tipodist = m.get(F_TIPODIST);
long ndist = m.get_long(F_NUMBER);
TDate datadist = (TDate)m.get(F_DATA);
long codabi = m.get_long(F_CODABIP);
long codcab = m.get_long(F_CODCABP);
elimina(tipodist, ndist);
m.autosave(*_rel);
TToken_string* datidist= new TToken_string;
datidist->cut(0);
datidist->add(tipodist);
datidist->add(ndist);
datidist->add(datadist);
datidist->add(codabi);
datidist->add(codcab);
return datidist;
}
int TVariazione_distinte::read(TMask& m)
{
m.autoload(*_rel);
int err = _rel->status();
if (err == NOERR)
{
err = _distinta->reset();
err = _distinta->read(_rel->curr());
if (err == NOERR)
{
TToken_string riga(80);
TSheet_field& shrighe = righe_sheet();
shrighe.reset();
int items = _distinta->items();
TArray& righedist = _distinta->righe();
for (int i = 0; i < items; i++)
{
TEffetto& eff = (TEffetto&)righedist[i];
riga.cut(0);
riga.add(FALSE);
riga.add(eff.get(EFF_NPROGTR));
riga.add(eff.get(EFF_DATASCAD));
riga.add(eff.get(EFF_CODCF));
if (eff.rows_r() == 1) //se l'effetto contiene solo una riga metto i
{ //riferimenti al documento ed al numero di rata
const TRectype& rec_r = eff.row_r(1);
riga.add(rec_r.get(REFF_NFATT));
riga.add(rec_r.get(REFF_DATAFATT));
riga.add(rec_r.get(REFF_NRATA));
}
else //se l'effetto contiene pi<70> di una riga non metto i
{ //riferimenti al documento ed al numero di rata
riga.add(("Varie"));
riga.add(("Varie"));
riga.add(("Varie"));
}
TString codval(3); //gestisco il controllo sulla presenza o meno di una valuta
codval = eff.get(EFF_CODVAL);
const bool condition = (codval.empty());
m.enable(F_CODVAL, !condition);
m.enable(F_TOTIMPVAL, !condition);
if (!condition)
m.set(F_CODVAL, codval);
riga.add(codval);
riga.add(eff.get(EFF_IMPORTO));
riga.add(eff.get(EFF_IMPORTOVAL));
shrighe.row(i) = riga;
}
}
}
return err;
}
int TVariazione_distinte::rewrite(const TMask& m)
{
aggiorna();
return _distinta->rewrite(common_f(m));
}
int TVariazione_distinte::write(const TMask& m)
{
aggiorna();
return _distinta->write(TRUE, common_f(m));
}
bool TVariazione_distinte::remove(char tipodist, long ndist)
{
return _distinta->remove(tipodist, ndist) == NOERR;
}
bool TVariazione_distinte::user_create()
{
_msk = new TMask("ef0300a");
_m2 = new TMask("ef0300c");
_rel = new TRelation(LF_EFFETTI);
_reff = new TLocalisamfile(LF_REFFETTI);
_cession = new TLocalisamfile(LF_CESS);
_distinta = new TDistinta;
set_search_field(F_NUMBER);
_msk->set_handler(B_AGGIUNGI, aggiungi_handler);
_msk->set_handler(B_ELIMINA, elimina_handler);
_m2->set_handler(DLG_OK, conferma_handler);
_m2->set_handler(DLG_CANCEL, annulla_handler);
_m2->set_handler(m2_handler);
righe_sheet().set_notify(impdist_notify);
return TRUE;
}
bool TVariazione_distinte::user_destroy()
{
delete _msk;
delete _m2;
delete _rel;
delete _reff;
delete _cession;
delete _distinta;
return TRUE;
}
//Permette di gestire lo sheet per la selezione delle riba da aggiungere alla distinta
void TVariazione_distinte::carica_riba()
{
TLocalisamfile f(LF_EFFETTI);
TRectype rec = f.curr();
f.setkey(4);
f.put("TIPODIST","");
f.put("NDIST",0);
f.put("NRIGADIST",0);
f.read(_isgteq);
TString16 t = rec.get("TIPODIST");
long n = rec.get_long("NDIST");
int i = 0;
while ((t.empty())&&(n==0))
{
TToken_string riga(80);
TMask* m2 = app()._m2;
TSheet_field& sf = (TSheet_field&)m2->field(F_SHEET);
sf.reset();
riga.cut(0);
riga.add(FALSE);
riga.add(rec.get(EFF_NPROGTR));
riga.add(rec.get(EFF_DATASCAD));
riga.add(rec.get(EFF_CODCF));
TEffetto eff(rec);
if (eff.rows_r() == 1) //se l'effetto contiene solo una riga metto i
{ //riferimenti al documento ed al numero di rata
const TRectype& rec_r = eff.row_r(1);
riga.add(rec_r.get(REFF_NFATT));
riga.add(rec_r.get(REFF_DATAFATT));
riga.add(rec_r.get(REFF_NRATA));
}
else //se l'effetto contiene pi<70> di una riga non metto i
{ //riferimenti al documento ed al numero di rata
riga.add(("Varie"));
riga.add(("Varie"));
riga.add(("Varie"));
}
riga.add(rec.get(EFF_CODVAL));
riga.add(rec.get(EFF_IMPORTO));
riga.add(rec.get(EFF_IMPORTOVAL));
sf.row(i) = riga;
f.next();
t = rec.get("TIPODIST");
n = rec.get_long("NDIST");
i++;
}
}
//handler per gestire la pressione del bottone aggiungi della maschera principale(ef0300a)
bool TVariazione_distinte::aggiungi_handler(TMask_field& f, KEY k)
{
if (k==K_SPACE)
{
TMask &m = f.mask();
m.close();
TMask* m2 = app()._m2;
m2->open();
}
return TRUE;
}
//handler per gestire la pressione del bottone elimina della maschera principale(ef0300a)
bool TVariazione_distinte::elimina_handler(TMask_field& f, KEY k)
{
if (k==K_SPACE)
f.yesno_box("Vuoi veramente eliminare gli effetti");
// SE SI ELIMINARE DALLO SHEET GLI EFFETTI SELEZIONATI (LA RIMOZIONE FISICA SARA' FATTA AL
// MOMENTO DELLA REGISTRAZIONE, SE NO NON FACCIO NULLA
return TRUE;
}
//handler per gestire la pressione del bottone conferma della maschera per l'aggiunta delle riba(ef0300c)
bool TVariazione_distinte::conferma_handler(TMask_field& f, KEY k)
{
if (k==K_ENTER)
{
TMask &m = f.mask();
TMask* m2 = app()._msk;
m.close();
m2->open();
}
return TRUE;
}
//handler della maschera per l'aggiunta delle riba(ef0300c)
bool TVariazione_distinte::m2_handler(TMask& m, KEY k)
{
if (k==K_ENTER)
carica_riba();
return TRUE;
}
//handler per gestire la pressione del bottone annulla della maschera per l'aggiunta delle riba(ef0300c)
bool TVariazione_distinte::annulla_handler(TMask_field& f, KEY k)
{
TMask &m = f.mask();
TMask* m2 = app()._msk;
m.close();
m2->open();
return TRUE;
}
//Calcola i totali relativi alla distinta (totale in lire e totale in valuta(se presente))
void TVariazione_distinte::calcola_totale()
{
TMask* m = app()._msk;
TSheet_field& sf = (TSheet_field&)m->field(F_SHEET_RIBA);
int items = sf.items();
real imp, impval, impdist, impdistval;
for (int i = 0; i < items; i++)
{
TToken_string& row = sf.row(i);
imp = row.get(8);
impdist += imp;
impval = row.get(9);
impdistval += impval;
}
m->set(F_TOTIMP, impdist);
m->set(F_TOTIMPVAL, impdistval);
}
//Notify per il calcolo dei totali relativi alla distinta
bool TVariazione_distinte::impdist_notify(TSheet_field& s, int r, KEY key)
{
if (s.to_check(key, TRUE))
calcola_totale();
if (key == K_DEL && s.items()==1)
{
error_box("IMPOSSIBILE CANCELLARE: La distinta deve contenere almeno un effetto!");
return FALSE;
}
return TRUE;
}
int ef0300(int argc, char* argv[])
{
TVariazione_distinte a ;
a.run(argc, argv, "Gestione Distinte");
return 0;
}