96f33c01ee
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
418 lines
10 KiB
C++
Executable File
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;
|
|
}
|