campo-sirio/pr/pr1500.cpp
alex 96f33c01ee Patch level : 4.0 979
Files correlati     : ve6.exe
Ricompilazione Demo : [ ]
Commento            :

Riportata la versione 3.1 patch 979


git-svn-id: svn://10.65.10.50/trunk@15623 c028cbd2-c16b-5b4b-a496-9718f37d4682
2007-09-17 15:33:04 +00:00

418 lines
10 KiB
C++
Executable File

#include <applicat.h>
#include <automask.h>
#include <defmask.h>
#include <form.h>
#include <printer.h>
#include <progind.h>
#include <recarray.h>
#include <clifo.h>
#include "provv.h"
#include "agenti.h"
#include "pr1500a.h"
///////////////////////////////////////////////////////////
// Maschera principale
///////////////////////////////////////////////////////////
class TFirr_mask : public TAutomask
{
protected:
virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
public:
void load_params();
void save_params();
TFirr_mask();
virtual ~TFirr_mask();
};
bool TFirr_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
{
switch (o.dlg())
{
case DLG_SAVEREC:
if (e == fe_button)
{
save_params();
return FALSE;
}
break;
default:
break;
}
return TRUE;
}
void TFirr_mask::load_params()
{
const bool in_euro = is_euro_value(NULL);
TConfig cfg(CONFIG_STUDIO, "pr");
set(F_PREVID, cfg.get("Previdenza", NULL, -1, "5.75"));
set(F_ASSIST, cfg.get("Assistenza", NULL, -1, "2.00"));
set(F_PREV_MIN, cfg.get("PrevMin", NULL, -1, in_euro ? "248" : "480000"));
set(F_PREV_MAX, cfg.get("PrevMax", NULL, -1, in_euro ? "2494" : "4830000"));
for (int i = 0; i < 3; i++)
{
set(F_FIRR_1+i, cfg.get_int("Firr", NULL, i, i+1));
const char* def;
if (i == 0)
def = in_euro ? "12395" : "24000000";
else
def = in_euro ? "18592" : "36000000";
set(F_LIMITE_1+i, cfg.get("FirrLimit", NULL, i, def));
}
}
void TFirr_mask::save_params()
{
TConfig cfg(CONFIG_STUDIO, "pr");
cfg.set("Previdenza", get(F_PREVID));
cfg.set("Assistenza", get(F_ASSIST));
cfg.set("PrevMin", get(F_PREV_MIN));
cfg.set("PrevMax", get(F_PREV_MAX));
for (int i = 0; i < 3; i++)
{
cfg.set("Firr", get(F_FIRR_1+i), NULL, TRUE, i);
cfg.set("FirrLimit", get(F_LIMITE_1+i), NULL, TRUE, i);
}
}
TFirr_mask::TFirr_mask() : TAutomask("pr1500a")
{
load_params();
}
TFirr_mask::~TFirr_mask()
{ }
///////////////////////////////////////////////////////////
// Dati Agente
///////////////////////////////////////////////////////////
class TDati_agente : public TObject
{
TString16 _codice;
TString16 _matricola;
TString16 _codfisc;
TString _ragsoc;
TDate _datacess;
bool _plurimandatario;
bool _massimale;
real _totale[5];
real _previdenza[5];
real _assistenza;
real _firr;
public:
const TString& codice() const { return _codice; }
const TString& matricola() const { return _matricola; }
const TString& ragsoc() const { return _ragsoc; }
const TString& codice_fiscale() const { return _codfisc; }
const TDate& data_cessazione() const { return _datacess; }
bool massimale() const { return _massimale; }
const real& previdenza(int index) const;
const real& assistenza() const { return _assistenza; }
const real& firr() const { return _firr; }
void add(const TRectype& provv, const TFirr_mask& m);
void crop(const TFirr_mask& m);
TDati_agente(const char* codage);
virtual ~TDati_agente() { }
};
void TDati_agente::add(const TRectype& prov, const TFirr_mask& m)
{
const TDate data = prov.get(PROV_DATASCAD);
const int index = (data.month()-1) / 3 + 1;
real imp = prov.get(PROV_PROVVPAG);
imp += prov.get_real(PROV_PROVVMAT);
_totale[0] += imp;
_totale[index] += imp;
}
void TDati_agente::crop(const TFirr_mask& m)
{
const real percprev = m.get(F_PREVID);
real prev_anno_min = m.get(F_PREV_MIN);
real prev_anno_max = m.get(F_PREV_MAX);
const real percassi = m.get(F_ASSIST);
const real firr1 = m.get(F_FIRR_1);
real limite1 = m.get(F_LIMITE_1);
const real firr2 = m.get(F_FIRR_2);
real limite2 = m.get(F_LIMITE_2);
const real firr3 = m.get(F_FIRR_3);
if (_plurimandatario)
{
prev_anno_min /= 2.0;
prev_anno_max /= 2.0;
limite1 /= 2.0;
limite2 /= 2.0;
}
// Calcolo previdenza
_previdenza[0] = ZERO;
_massimale = FALSE;
for (int t = 1; t <= 4; t++)
{
real prev = _totale[t] * percprev / 100.0;
const real sum = _previdenza[0] + prev;
if (sum > prev_anno_max)
{
const real extra = sum - prev_anno_max;
prev -= extra;
_massimale = TRUE;
}
_previdenza[t] = prev;
_previdenza[0] += prev;
}
if (_previdenza[0] > ZERO && _previdenza[0] < prev_anno_min)
{
const real extra = prev_anno_min - _previdenza[0];
_previdenza[4] += extra;
_previdenza[0] = prev_anno_min;
}
// Calcolo assistenza
_assistenza = _totale[0] * percassi / 100.0;
// Calcolo FIRR
real tot = _totale[0];
_firr = ZERO;
if (tot > limite2)
{
_firr += (tot-limite2) * firr3 / 100.0;
tot -= limite2;
}
if (tot > limite1)
{
_firr += (tot-limite1) * firr2 / 100.0;
tot -= limite1;
}
_firr += tot * firr1 / 100.0;
}
const real& TDati_agente::previdenza(int index) const
{
if (index >= 0 && index <= 4)
return _previdenza[index];
return _previdenza[0];
}
TDati_agente::TDati_agente(const char* codage)
{
_codice = codage;
const TRectype& rec = cache().get(LF_AGENTI, _codice);
_matricola = rec.get(AGE_MATRICOLA);
if (_matricola.empty())
_matricola = _codice;
_ragsoc = rec.get(AGE_RAGSOC);
_plurimandatario = rec.get_bool(AGE_PLURIMAND);
_datacess = rec.get(AGE_DATACESS);
_codfisc = rec.get(AGE_CODFISC);
if (_codfisc.empty())
{
TString16 forn = rec.get(AGE_CODFORN);
if (forn.not_empty())
{
forn.insert("F|");
_codfisc = cache().get(LF_CLIFO, forn).get(CLI_COFI);
}
}
}
///////////////////////////////////////////////////////////
// Form di stampa
///////////////////////////////////////////////////////////
class TFirr_form : public TForm
{
public:
void print_footer();
TFirr_form(const TFirr_mask& m);
virtual ~TFirr_form() { }
};
void TFirr_form::print_footer()
{
set_last_page(TRUE);
set_footer(0, TRUE);
printer().formfeed();
}
TFirr_form::TFirr_form(const TFirr_mask& m) : TForm("pr1500a")
{
TPrint_section& head = section('H');
TPrint_section& body = section('B');
TPrint_section& foot = section('F');
TString str;
str = TR("Stampa Contributi ");
const int periodo = m.get_int(F_PERIODO);
switch (periodo)
{
case 1 : str << TR("primo trimestre"); break;
case 2 : str << TR("secondo trimestre"); break;
case 3 : str << TR("terzo trimestre"); break;
case 4 : str << TR("quarto trimestre"); break;
default: str << TR("anno"); break;
}
str << ' ' << m.get_int(F_ANNO);
head.find_field(101).set(str);
const int first = head.height()-2;
const int last = printer().formlen();
const int horiz[] = { first+2, last-foot.height()+1, 0 };
genera_fincatura(odd_page, first, last, horiz);
genera_intestazioni(odd_page, first+1);
}
///////////////////////////////////////////////////////////
// Applicazione di stampa versamenti per agenti
///////////////////////////////////////////////////////////
class TStampa_firr : public TSkeleton_application
{
TArray _dati;
protected:
virtual void main_loop();
public:
void compute(const TFirr_mask& m);
void print(const TFirr_mask& m);
};
void TStampa_firr::compute(const TFirr_mask& m)
{
TRelation rel(LF_PROVV);
TRectype filter_fr(LF_PROVV), filter_to(LF_PROVV);
filter_fr.put(PROV_CODAGE, m.get(F_DA_AGENTE));
filter_to.put(PROV_CODAGE, m.get(F_AD_AGENTE));
const TDate data_fr( 1, 1, m.get_int(F_ANNO));
TDate data_to(31, 12, m.get_int(F_ANNO));
switch (m.get_int(F_PERIODO))
{
case 1:
data_to.set_month(3);
break;
case 2:
data_to.set_day(30);
data_to.set_month(6);
break;
case 3:
data_to.set_day(30);
data_to.set_month(9);
break;
default:
break;
}
TString filter;
filter << "(ANSI(" << PROV_DATASCAD << ")>=\"" << data_fr.string(ANSI);
filter << "\")&&(ANSI(" << PROV_DATASCAD << ")<=\"" << data_to.string(ANSI) << "\")";
TCursor cur(&rel, filter, 2, &filter_fr, &filter_to);
const long total = cur.items();
cur.freeze(TRUE);
const TRectype& cur_prov = cur.curr();
TProgind pi(total, TR("Elaborazione in corso..."), TRUE, TRUE);
for (cur = 0L; cur.pos() < total; ++cur)
{
pi.addstatus(1);
if (pi.iscancelled())
break;
const TString16 cod = cur_prov.get(PROV_CODAGE);
TDati_agente* agente = (TDati_agente*)_dati.objptr(_dati.last());
if (agente && cod != agente->codice())
agente = NULL;
if (agente == NULL)
{
agente = new TDati_agente(cod);
_dati.add(agente);
}
agente->add(cur_prov, m);
}
}
void TStampa_firr::print(const TFirr_mask& m)
{
TFirr_form form(m);
const int periodo = m.get_int(F_PERIODO);
TForm_item& matricola = form.find_field('B', odd_page, 101);
TForm_item& ragsoc = form.find_field('B', odd_page, 102);
TForm_item& codfisc = form.find_field('B', odd_page, 103);
TForm_item& datacess = form.find_field('B', odd_page, 104);
TForm_item& percprovv = form.find_field('B', odd_page, 105);
TForm_item& massimale = form.find_field('B', odd_page, 106);
TForm_item& previdenza = form.find_field('B', odd_page, 107);
TForm_item& assistenza = form.find_field('B', odd_page, 108);
TForm_item& firr = form.find_field('B', odd_page, 109);
printer().open();
for (int i = 0; i < _dati.items(); i++)
{
TDati_agente& agente = (TDati_agente&)_dati[i];
agente.crop(m); // Ricalcola rate trimestrali
matricola.set(agente.matricola());
ragsoc.set(agente.ragsoc());
codfisc.set(agente.codice_fiscale());
datacess.set(agente.data_cessazione().string());
percprovv.set(m.get(F_PREVID));
previdenza.set(agente.previdenza(periodo).string());
massimale.set(agente.massimale() ? "X" : "");
if (periodo == 0 || periodo == 4)
{
assistenza.set(agente.assistenza().string());
firr.set(agente.firr().string());
}
form.print(-1);
}
form.print_footer();
printer().close();
}
void TStampa_firr::main_loop()
{
open_files(LF_AGENTI, LF_PROVV, NULL);
TFirr_mask m;
while (m.run() == K_ENTER)
{
_dati.destroy();
compute(m);
if (_dati.items())
print(m);
}
}
int pr1500(int argc, char* argv[])
{
TStampa_firr a;
a.run(argc, argv, TR("Distinta Versamento"));
return 0;
}