campo-sirio/cg/cg4900.cpp
nik 2eecc558fd Corretto errore per rettifica
git-svn-id: svn://10.65.10.50/trunk@2010 c028cbd2-c16b-5b4b-a496-9718f37d4682
1995-10-25 15:17:46 +00:00

562 lines
13 KiB
C++
Executable File

//Visualizzazione liquidazione acconti
#include <applicat.h>
#include <mask.h>
#include <tabutil.h>
#include <relation.h>
#include <sheet.h>
#include <urldefid.h>
#include <prefix.h>
#include <printer.h>
#include <progind.h>
#include <utility.h>
#include <config.h>
#include "cg4900.h"
#define ACCONTO_MIN_DA_VERSARE real(200000.0)
class LiqAcc_app : public TApplication
{
TRelation* _nditte;
TArray_sheet* _ditte;
TArray _nomiditte;
TMask* _mask;
TTable* _lia,* _lam;
int _year;
long _ditta;
bool _registra;
TString16 _tipo_acc;
protected:
virtual bool create();
virtual bool destroy();
virtual bool menu(MENU_TAG);
// handlers
static bool set_ditta(TMask_field&, KEY);
static bool set_ragsoc(TMask_field&, KEY);
static bool ch_year_handler(TMask_field& f, KEY key);
static bool msk_risul(TMask_field& f, KEY key);
static bool msk_hide(TMask& m, KEY key);
public:
static LiqAcc_app& app() { return (LiqAcc_app&)main_app(); }
void build_ditte_sheet();
void build_nomiditte();
void reset_fields();
bool vis_acc();
bool video_vis();
bool select_butt(TMask& m);
LiqAcc_app() : _ditte(NULL), _nomiditte(100), _registra(FALSE) {}
};
bool LiqAcc_app::create()
{
TApplication::create();
TDate oggi(TODAY);
_year = oggi.year();
_nditte = new TRelation(LF_NDITTE);
_ditte = new TArray_sheet(-1, -1, 0, 0, "Selezione Ditte",
"Cod.@5|Ragione Sociale@50|Vers.");
_lia = new TTable("%LIA");
_lam = new TTable("LAM");
begin_wait();
build_nomiditte();
build_ditte_sheet();
end_wait();
dispatch_e_menu(BAR_ITEM(1));
return TRUE;
}
bool LiqAcc_app::destroy()
{
delete _lia;
delete _ditte;
delete _nditte;
return TApplication::destroy();
}
// handlers
bool LiqAcc_app::msk_hide(TMask& m,KEY k)
{
if (k == K_SHIFT+K_F7) //&& app()._registra)
{
TMask m1("cg4900d");
m1.field(F_TIPO).set(app()._tipo_acc);
for (bool stop1 = FALSE; !stop1;)
{
KEY k1 = m1.run();
switch(k1)
{
case K_ESC:
case K_QUIT:
if (m1.dirty())
{
KEY k = yesnocancel_box("Registrazione modifiche effettuate?");
if (k == K_YES)
{
TString16 tipo (m1.get(F_TIPO));
TTable lia ("%LIA");
TString16 y; y.format("%05ld%04d", app()._ditta, app()._year);
lia.zero();
lia.put("CODTAB", y);
if (lia.read() != NOERR)
return FALSE;
lia.put("S8", tipo);
lia.rewrite();
}
if (k == K_YES || k == K_NO)
stop1 = TRUE;
break;
}
else stop1 = TRUE;
break;
case K_SAVE:
if (m1.dirty())
{
TString16 tipo (m1.get(F_TIPO));
TTable lia ("%LIA");
TString16 y; y.format("%05ld%04d", app()._ditta, app()._year);
lia.zero();
lia.put("CODTAB", y);
if (lia.read() != NOERR)
return FALSE;
lia.put("S8", tipo);
lia.rewrite();
}
break;
} //switch
} //for
}
return TRUE;
}
bool LiqAcc_app::msk_risul(TMask_field& f, KEY k)
{
if (k == K_TAB && f.focusdirty())
{
real iva_ven(f.mask().get(F_IVAVEN));
real iva_red(f.mask().get(F_IVARED));
real iva_rim(f.mask().get(F_IVARIM));
real non_fat(f.mask().get(F_NONFAT));
real non_ann(f.mask().get(F_NONANN));
real risven = ZERO;
risven = iva_ven + iva_red + iva_rim + non_fat + non_ann;
real risacq (f.mask().get(F_RISACQ));
if (risacq - risven < ZERO)
{
f.mask().show(F_IVADEB);
f.mask().hide(F_IVACRE);
}
else if (risacq - risven > ZERO)
{
f.mask().hide(F_IVADEB);
f.mask().show(F_IVACRE);
}
else
{
f.mask().hide(F_IVADEB);
f.mask().hide(F_IVACRE);
}
}
return TRUE;
}
bool LiqAcc_app::set_ditta(TMask_field& f, KEY k)
{
bool found = TRUE;
if (k == K_F9)
return app().select_butt(f.mask());
if (k == K_TAB && f.focusdirty())
{
found = FALSE;
TString ditta = f.get();
for (int i = 0; i < app()._ditte->items(); i++)
{
TToken_string& row = app()._ditte->row(i);
if (ditta == row.get(0))
{
if (app()._ditte->enabled(i))
{
f.mask().field(F_CODDITTA).set(row.get(0));
f.mask().field(F_RAGSOC).set(row.get(1));
found = TRUE;
}
else
{
warning_box("Non sono definiti i parametri liquidazione per la ditta %ld",
atol(ditta));
f.reset();
}
break;
}
}
}
if (!found) f.reset();
return found;
}
bool LiqAcc_app::set_ragsoc(TMask_field& f, KEY k)
{
bool found = TRUE;
if (k == K_F9)
return app().select_butt(f.mask());
if (k == K_TAB && f.focusdirty())
{
found = FALSE;
TString ditta = f.get();
for (int i = 0; i < app()._ditte->items(); i++)
{
TToken_string& row = app()._ditte->row(i);
TString ts(row.get(1));
if (ts.find(ditta) != -1)
{
if (app()._ditte->enabled(i))
{
f.mask().field(F_CODDITTA).set(row.get(0));
f.mask().field(F_RAGSOC).set(row.get(1));
found = TRUE;
break;
}
}
}
}
if (!found) f.reset();
return found;
}
bool LiqAcc_app::ch_year_handler(TMask_field& f, KEY key)
{
if (key == K_TAB && f.focusdirty())
{
app().begin_wait();
app()._year = atoi(f.get());
app().build_nomiditte();
app().build_ditte_sheet();
app().reset_fields();
app().end_wait();
}
return TRUE;
}
void LiqAcc_app::build_ditte_sheet()
{
// build sheet
_ditte->destroy();
for (int i = 0; i < _nomiditte.items(); i++)
{
TToken_string* d = new TToken_string(64);
*d = (TToken_string&)_nomiditte[i];
const char vers = d->get_char(2);
bool selectable = vers == '?';
const long pos = _ditte->add(d);
if (selectable) _ditte->disable(pos);
}
}
void LiqAcc_app::reset_fields()
{
_mask->field(F_CODDITTA).set("");
_mask->field(F_RAGSOC).set("");
}
bool LiqAcc_app::select_butt(TMask& m)
{
if (_ditte->run() == K_ENTER)
{
TToken_string& row = _ditte->row(_ditte->selected());
m.field(F_CODDITTA).set(row.get(0));
m.field(F_RAGSOC).set(row.get(1));
return TRUE;
}
return FALSE;
}
void LiqAcc_app::build_nomiditte()
{
_nomiditte.destroy();
// ricostruire _nomiditte e rifare build_ditte_sheet
TLocalisamfile& dt = _nditte->lfile();
TString fr(2);
TTable lia("%LIA");
for (dt.first(); !dt.eof(); dt.next())
{
// check no archivi
fr = "??";
bool good = prefix().exist(dt.get_long("CODDITTA"));
if (good)
{
// check no parametri liquidazione
lia.put("CODTAB", format("%05ld%d",dt.get_long("CODDITTA"),_year));
if (lia.read() != NOERR) good = FALSE;
else fr = lia.get("S7");
}
else continue;
TToken_string* d = new TToken_string(64);
// add record
d->add(dt.get("CODDITTA"));
d->add(dt.get("RAGSOC"));
d->add(fr);
_nomiditte.add(d);
}
}
bool LiqAcc_app::menu(MENU_TAG m)
{
if (m == BAR_ITEM(1))
return vis_acc();
return TApplication::menu(m);
}
bool LiqAcc_app::vis_acc()
{
long ditta = get_firm();
TMask m("cg4900a");
KEY k;
_mask = &m;
m.set_handler(F_CODDITTA, set_ditta);
m.set_handler(F_RAGSOC, set_ragsoc);
m.set_handler(F_YEAR, ch_year_handler);
while ((k = m.run()) != K_ESC)
{
if (k == DLG_SELECT)
select_butt(m);
else if (k == K_ENTER)
{
if (m.get(F_CODDITTA).empty() || m.get(F_RAGSOC).empty())
{
beep();
continue;
}
_ditta = m.get_long(F_CODDITTA);
_year = m.get_int(F_YEAR);
set_firm(_ditta);
video_vis();
}
}
_mask = NULL;
set_firm(ditta);
return FALSE;
}
bool LiqAcc_app::video_vis()
{
TTable lia ("%LIA");
TString16 y; y.format("%05ld%04d", _ditta, _year);
lia.zero();
lia.put("CODTAB", y);
if (lia.read() != NOERR) //da verificare se e' giusto
return FALSE;
TConfig cnf(CONFIG_DITTA, "cg");
bool liqdiff = cnf.get_bool("GeLiDi");
_tipo_acc = lia.get("S8");
TString16 freqviva = lia.get("S7");
real acconto = ZERO;
real iva_ven = ZERO;
real iva_acq = ZERO;
real iva_ret = ZERO;
real iva_rim = ZERO;
real ult_det = ZERO;
real per_pro = ZERO;
real non_fat = ZERO;
real non_ann = ZERO;
real risven = ZERO;
real risacq = ZERO;
real diff = ZERO;
acconto = lia.get_real("R4");
iva_ven = lia.get_real("R7");
iva_acq = lia.get_real("R8");
iva_ret = lia.get_real("R9");
iva_rim = lia.get_real("R10");
ult_det = lia.get_real("R11");
per_pro = lia.get_real("R12");
non_fat = lia.get_real("R13");
non_ann = lia.get_real("R14");
TToken_string ff(lia.get("S1"));
real cre_pre (ff.get(0));
real acq_intr (ff.get(1));
// mask diverse per liq. differita oppure no
TMask m(liqdiff ? "cg4900c" : "cg4900b");
m.field(F_IVAVEN).set(iva_ven.string());
if (!liqdiff)
{
m.field(F_NONFAT).set(non_fat.string());
m.field(F_NONANN).set(non_ann.string());
}
if (iva_ret.sign() <= 0)
m.field(F_IVAREC).set(abs(iva_ret).string());
else m.field(F_IVARED).set(iva_ret.string());
m.field(F_IVARIM).set(iva_rim.string());
m.field(F_IVAACQ).set((iva_acq + acq_intr).string());
if (per_pro.is_zero())
m.hide(F_PERPRO);
else
{
m.show(F_PERPRO);
m.field(F_PERPRO).set(per_pro.string());
}
m.field(F_CREPRE).set(cre_pre.string());
m.field(F_ULTDET).set(ult_det.string());
//risven = iva_ven + non_fat + non_ann + iva_ret + iva_rim;
risven = iva_ven + non_fat + non_ann + iva_rim;
if (iva_ret.sign() > 0)
risven += iva_ret;
m.field(F_RISVEN).set(risven.string());
//risacq = iva_acq + acq_intr + cre_pre + ult_det + abs(iva_ret);
risacq = iva_acq + acq_intr + cre_pre + ult_det;
if (iva_ret.sign() < 0)
risacq += abs(iva_ret);
m.field(F_RISACQ).set(risacq.string());
diff = risacq - risven;
if (diff.sign() < 0)
{
m.show(F_IVADEB);
m.hide(F_IVACRE);
if (liqdiff) //se no e' gestito da maschera
m.field(F_IVADEB).set(abs(diff).string());
}
else if (diff.sign() > 0)
{
m.hide(F_IVADEB);
m.show(F_IVACRE);
if (liqdiff)
m.field(F_IVACRE).set(diff.string());
}
else
{
m.hide(F_IVADEB);
m.hide(F_IVACRE);
}
if (acconto.sign() < 0)
{
m.show(F_CREEVI);
m.field(F_CREEVI).set(abs(acconto).string());
m.hide(F_ACCVER);
m.hide(F_ACCNVER);
}
else if (acconto.sign() > 0 && acconto > ACCONTO_MIN_DA_VERSARE)
{
m.hide(F_CREEVI);
m.hide(F_ACCNVER);
m.show(F_ACCVER);
m.field(F_ACCVER).set(acconto.string());
}
else if (acconto.sign() > 0 && acconto <= ACCONTO_MIN_DA_VERSARE)
{
m.hide(F_CREEVI);
m.show(F_ACCNVER);
m.hide(F_ACCVER);
m.field(F_ACCNVER).set(acconto.string());
}
else //==0
{
m.hide(F_CREEVI);
m.hide(F_ACCNVER);
m.hide(F_ACCVER);
}
if (!liqdiff)
{
m.set_handler(F_NONFAT, msk_risul);
m.set_handler(F_NONANN, msk_risul);
}
m.set_handler(msk_hide);
for (bool stop = FALSE; !stop;)
{
KEY k = m.run();
switch(k)
{
case K_ESC:
case K_QUIT:
if (m.dirty())
{
KEY k = yesnocancel_box("Registrazione modifiche effettuate?");
if (k == K_YES)
{
if (!liqdiff)
{
real nf (m.get(F_NONFAT));
real na (m.get(F_NONANN));
if (nf != non_fat || na != non_ann)
message_box("Valori modificati: rieseguire il calcolo dell'acconto");
lia.put("R13", nf);
lia.put("R14", na);
lia.rewrite();
}
}
if (k == K_YES || k == K_NO)
stop = TRUE;
break;
}
else stop = TRUE;
break;
case K_SAVE:
_registra = TRUE;
if (m.dirty())
{
if (!liqdiff)
{
real nf (m.get(F_NONFAT));
real na (m.get(F_NONANN));
if (nf != non_fat || na != non_ann)
message_box("Valori modificati: rieseguire il calcolo dell'acconto");
lia.put("R13", nf);
lia.put("R14", na);
lia.rewrite();
}
}
break;
}
}
return TRUE;
}
int cg4900(int argc, char* argv[])
{
LiqAcc_app app;
app.run(argc, argv, "Visualizzazione liquidazione acconti");
return 0;
}