Files correlati : ce3.exe Commento: Il registro cespiti sintetico non arrotondava bene le percentuali di ammortamento
446 lines
12 KiB
C++
Executable File
446 lines
12 KiB
C++
Executable File
#include <applicat.h>
|
||
#include <automask.h>
|
||
#include <defmask.h>
|
||
#include <dongle.h>
|
||
#include <execp.h>
|
||
#include <modaut.h>
|
||
#include <progind.h>
|
||
#include <recarray.h>
|
||
#include <reprint.h>
|
||
|
||
#include "celib.h"
|
||
|
||
#include "ce2101.h"
|
||
#include "ce3.h"
|
||
#include "ce3900.h"
|
||
|
||
#include "../cg/cglib01.h"
|
||
|
||
#include "ammce.h"
|
||
#include "ammmv.h"
|
||
#include "cespi.h"
|
||
#include "movam.h"
|
||
#include "movce.h"
|
||
#include "salce.h"
|
||
|
||
#define SORT_DATACOMP 0x1
|
||
#define SORT_CAT 0x2
|
||
|
||
////////////////////////////////////////////////////////
|
||
// MASCHERA
|
||
////////////////////////////////////////////////////////
|
||
class TStampa_sintetica_mask : public TAutomask
|
||
{
|
||
// bool _preview;
|
||
bool _excel;
|
||
|
||
protected:
|
||
bool on_field_event(TOperable_field& o, TField_event e, long jolly);
|
||
public:
|
||
// bool preview() const { return _preview; }
|
||
bool excel() const { return _excel; }
|
||
void set_excel(bool on) { _excel = on; }
|
||
TStampa_sintetica_mask();
|
||
};
|
||
|
||
|
||
bool TStampa_sintetica_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
|
||
{
|
||
bool ok = true;
|
||
switch (o.dlg())
|
||
{
|
||
case F_FROM_CAT:
|
||
case F_D_FROM_CAT:
|
||
case F_TO_CAT:
|
||
case F_D_TO_CAT:
|
||
{
|
||
TDitta_cespiti& dc = ditta_cespiti();
|
||
ok = dc.on_category_event(o, e, jolly);
|
||
}
|
||
break;
|
||
case F_ESERCIZIO:
|
||
case F_GRUPPO:
|
||
case F_SPECIE:
|
||
if ((e == fe_init && o.dlg() == F_ESERCIZIO)|| e == fe_modify)
|
||
{
|
||
TRelation ccb("CCB");
|
||
int err = NOERR;
|
||
const TString& esercizio = get(F_ESERCIZIO);
|
||
if (esercizio.full())
|
||
{
|
||
const TString& gruppo = get(F_GRUPPO);
|
||
const TString& specie = get(F_SPECIE);
|
||
TString16 key; key << esercizio << gruppo << specie;
|
||
ccb.curr().put("CODTAB", key);
|
||
err = ccb.read();
|
||
}
|
||
else
|
||
err = ccb.last();
|
||
if (err == NOERR)
|
||
{
|
||
autoload(ccb);
|
||
o.check();
|
||
}
|
||
}
|
||
break;
|
||
/* case DLG_PRINT:
|
||
if (e == fe_button)
|
||
{
|
||
// _preview = false;
|
||
// _excel = false;
|
||
}
|
||
break;
|
||
case DLG_PREVIEW:
|
||
if (e == fe_button)
|
||
{
|
||
// _preview = true;
|
||
// _excel = false;
|
||
// stop_run(K_ENTER);
|
||
}
|
||
break;
|
||
case DLG_EXPORT_EXCEL:
|
||
if (e == fe_button)
|
||
{
|
||
_excel = true;
|
||
stop_run(K_ENTER);
|
||
}
|
||
break; */
|
||
default: break;
|
||
}
|
||
return ok;
|
||
}
|
||
|
||
TStampa_sintetica_mask::TStampa_sintetica_mask() : TAutomask("ce3900"), _excel(false) //, _preview(false)
|
||
{
|
||
}
|
||
|
||
///////////////////////////////////////////////////////////////
|
||
// RECORDSET
|
||
///////////////////////////////////////////////////////////////
|
||
class TStampa_sintetica_recordset : public TISAM_recordset
|
||
{
|
||
protected:
|
||
|
||
public:
|
||
void set_filter(const TStampa_sintetica_mask& msk);
|
||
TStampa_sintetica_recordset(const TString& sql) : TISAM_recordset(sql) { }
|
||
};
|
||
|
||
static const TStampa_sintetica_recordset* myself = NULL;
|
||
|
||
//metodo per caricare i valori nel recordset dalla maschera...fighissimo!!
|
||
void TStampa_sintetica_recordset::set_filter(const TStampa_sintetica_mask& msk)
|
||
{
|
||
//parametri per costruzione query
|
||
const bool exclude_aliens = msk.get_bool(F_EXCLUDE_ALIENS);
|
||
|
||
TString query = "USE CESPI\nSELECT ";
|
||
query << "(ANSI(DTCOMP)<=#DATAFINE)";
|
||
//cespiti alienati esclusi?
|
||
if (exclude_aliens)
|
||
query << "&&((DTALIEN='')||(ANSI(DTALIEN)>=#DATAINIZIO))";
|
||
|
||
//categorie
|
||
const TString& dacat = msk.get(F_FROM_CAT);
|
||
const TString& acat = msk.get(F_TO_CAT);
|
||
if (dacat.full() || acat.full())
|
||
{
|
||
if (dacat == acat)
|
||
query << "&&(STR(CODCAT==#DACAT))";
|
||
else
|
||
query << "&&(STR(BETWEEN(CODCAT,#DACAT,#ACAT)))";
|
||
}
|
||
//ordinamenti
|
||
|
||
|
||
TToken_string order("", '|');
|
||
|
||
query << "\nBY ";
|
||
if (msk.get_bool(F_SORTCAT))
|
||
order.add("CODCAT");
|
||
if (msk.get_bool(F_SORTIMP))
|
||
order.add("CODIMP");
|
||
if (msk.get_bool(F_SORTLOC))
|
||
order.add("CODLOC");
|
||
if (msk.get_bool(F_SORTCOMP))
|
||
order.add("DTCOMP");
|
||
order.add("IDCESPITE");
|
||
query << order;
|
||
//setta la nuova complicata query nel report (che avrebbe solo USE CESPI)
|
||
set(query);
|
||
|
||
set_var("#DATAFINE", msk.get_date(F_DATAFINE).date2ansi());
|
||
if (exclude_aliens)
|
||
set_var("#DATAINIZIO", msk.get_date(F_DATAINIZIO).date2ansi());
|
||
|
||
const int codes = msk.get_int(F_ESERCIZIO);
|
||
set_var("#CODES", long(codes), true);
|
||
set_var("#DACAT", dacat, true);
|
||
set_var("#ACAT", acat, true);
|
||
}
|
||
|
||
////////////////////////////////////////////////////////
|
||
// REPORT
|
||
////////////////////////////////////////////////////////
|
||
class TStampa_sintetica_rep : public TReport
|
||
{
|
||
int _anno;
|
||
int _tpamm;
|
||
TCespite _cespite;
|
||
|
||
protected:
|
||
real val_amm(const TRectype& rec_saldi) const;
|
||
virtual bool get_usr_val(const TString& name, TVariant& var) const;
|
||
|
||
public:
|
||
void set_filter(const TStampa_sintetica_mask& msk);
|
||
};
|
||
|
||
void TStampa_sintetica_rep::set_filter(const TStampa_sintetica_mask& msk)
|
||
{
|
||
const bool shcat = (!msk.excel()) && msk.get_bool(F_TOTCAT);
|
||
const bool shimp = (!msk.excel()) && msk.get_bool(F_TOTIMP);
|
||
const bool shloc = (!msk.excel()) && msk.get_bool(F_TOTLOC);
|
||
|
||
section('H', 3).show(shimp);
|
||
section('H', 4).show(shloc);
|
||
section('F', 2).show(shcat);
|
||
section('H', 2).show(shcat);
|
||
section('F', 3).show(shimp);
|
||
section('F', 4).show(shloc);
|
||
|
||
section('H', 2).group_by(shcat ? section('H', 2).grouped_by() : "");
|
||
section('H', 3).group_by(shimp ? section('H', 3).grouped_by() : "");
|
||
section('H', 4).group_by(shloc ? section('H', 4).grouped_by() : "");
|
||
|
||
|
||
section('H', 2).force_page_break(msk.get_bool(F_BREAK));
|
||
_anno = msk.get_int(F_ESERCIZIO);
|
||
_tpamm = msk.get_int(F_SITUAZIONE);
|
||
|
||
TStampa_sintetica_recordset* rs = new TStampa_sintetica_recordset(EMPTY_STRING);
|
||
|
||
set_recordset(rs);
|
||
rs->set_filter(msk);
|
||
}
|
||
|
||
real TStampa_sintetica_rep::val_amm(const TRectype& rec_saldi) const
|
||
{
|
||
real valore = rec_saldi.get_real(SALCE_CSTO);
|
||
|
||
if (_tpamm == 1) //solo fiscale
|
||
valore -= rec_saldi.get_real(SALCE_VNONAMM06);
|
||
|
||
if ( _tpamm == 2) //solo civilistico
|
||
{
|
||
valore -= rec_saldi.get_real(SALCE_VNONAMMC);
|
||
valore += rec_saldi.get_real(SALCE_RIVGC);
|
||
}
|
||
else //fiscale e/o gestionale
|
||
{
|
||
valore -= rec_saldi.get_real(SALCE_VNONAMM);
|
||
valore += rec_saldi.get_real(SALCE_RIVGF);
|
||
}
|
||
|
||
valore += rec_saldi.get_real(SALCE_RIV75);
|
||
valore += rec_saldi.get_real(SALCE_RIV83);
|
||
valore += rec_saldi.get_real(SALCE_RIV90);
|
||
valore += rec_saldi.get_real(SALCE_RIV91);
|
||
|
||
if (valore < ZERO)
|
||
valore = ZERO;
|
||
|
||
return valore;
|
||
}
|
||
|
||
//metodo per il calcolo dei campi da calcolare (ma va'!) nel report
|
||
bool TStampa_sintetica_rep::get_usr_val(const TString& name, TVariant& var) const
|
||
{
|
||
const TRecordset& recset = *recordset();
|
||
const TString& idcespite = recset.get(CESPI_IDCESPITE).as_string();
|
||
|
||
|
||
if (idcespite != _cespite.get(CESPI_IDCESPITE))
|
||
{
|
||
TCespite& c = (TCespite&)_cespite;
|
||
c.read(idcespite);
|
||
c.load_saldi(_tpamm, _anno);
|
||
}
|
||
if (name == "#DESCAT") //categoria (descrizione della categoria corrente)
|
||
{
|
||
const int gruppo = recset.get("CODCGRA").as_int();
|
||
const TString& specie = recset.get("CODSPA").as_string();
|
||
const int categoria = recset.get("CODCAT").as_int();
|
||
const TRectype& rec_cac = ditta_cespiti().categoria(gruppo, specie, categoria);
|
||
var = rec_cac.get("S0");
|
||
return true;
|
||
}
|
||
if (name.starts_with("#COSTO")) //valore dell'anno (iniziale e finale, comprese rivalutazioni e non ammortizz.)
|
||
{
|
||
if (name.ends_with("FIN")) //tiposaldo finale
|
||
{
|
||
var = val_amm(_cespite.sal_pro());
|
||
}
|
||
else //tiposaldo iniziale
|
||
{
|
||
var = val_amm(_cespite.sal_ini());
|
||
}
|
||
return true;
|
||
}
|
||
if (name == "#QAMMMV") //quote ammortamento su movimento esercizio corrente
|
||
{
|
||
real quote_ammmv;
|
||
const TArray& array_ammmv = _cespite.ammmv();
|
||
for (int i = 0; i < array_ammmv.items(); i++)
|
||
{
|
||
const TRectype& rec_ammmv = (const TRectype&)array_ammmv[i];
|
||
|
||
quote_ammmv += rec_ammmv.get_real(AMMMV_QNOR) + rec_ammmv.get_real(AMMMV_QACC) +
|
||
rec_ammmv.get_real(AMMMV_QANT) + rec_ammmv.get_real(AMMMV_QPERSE) +
|
||
rec_ammmv.get_real(AMMMV_QPPRIVATE) + rec_ammmv.get_real(AMMMV_FPRIVATO);
|
||
}
|
||
|
||
var = quote_ammmv;
|
||
return true;
|
||
}
|
||
if (name == "#QAMM") //quote ammortamento esercizio corrente
|
||
{
|
||
const TRectype& rec_ammce = _cespite.amm_pro();
|
||
|
||
const real quote_amm = rec_ammce.get_real(AMMCE_QNOR) + rec_ammce.get_real(AMMCE_QACC) +
|
||
rec_ammce.get_real(AMMCE_QANT) + rec_ammce.get_real(AMMCE_QPERSE) +
|
||
rec_ammce.get_real(AMMCE_QPPRIVATE); // +rec_ammce.get_real(AMMCE_FPRIVATO);
|
||
|
||
var = quote_amm;
|
||
return true;
|
||
}
|
||
if (name == "#QAMM_FPRIVATO") //fondo ammortamento privato corrente
|
||
{
|
||
const TRectype& rec_ammce = _cespite.amm_pro();
|
||
|
||
real famm = rec_ammce.get_real(AMMCE_FPRIVATO);
|
||
var = famm;
|
||
return true;
|
||
}
|
||
|
||
if (name == "#PERCAMM") // percentuale ammortamento
|
||
{
|
||
const TRectype& rec_ammce = _cespite.amm_pro();
|
||
real percamm = real(rec_ammce.get_real(AMMCE_PNOR) + rec_ammce.get_real(AMMCE_PACC) +
|
||
rec_ammce.get_real(AMMCE_PANT));
|
||
percamm.round(2);
|
||
var = percamm;
|
||
return true;
|
||
}
|
||
|
||
|
||
if (name == "#FAMM") //fondo ammortamento alla fine dell'esercizio precedente
|
||
{
|
||
const TRectype& rec_ammce = _cespite.amm_ini();
|
||
const real fondo = rec_ammce.get_real(AMMCE_QNOR) + rec_ammce.get_real(AMMCE_QACC) +
|
||
rec_ammce.get_real(AMMCE_QANT) + rec_ammce.get_real(AMMCE_QPERSE) +
|
||
rec_ammce.get_real(AMMCE_QPPRIVATE) + rec_ammce.get_real(AMMCE_FPRIVATO);
|
||
var = fondo;
|
||
return true;
|
||
}
|
||
if (name == "#FAMM_FPRIVATO") //fondo ammortamento privato alla fine dell'esercizio precedente
|
||
{
|
||
const TRectype& rec_ammce = _cespite.amm_ini();
|
||
var = rec_ammce.get_real(AMMCE_FPRIVATO);
|
||
return true;
|
||
}
|
||
|
||
|
||
if (name == "#CESSELIM") //cessioni elminiazioni
|
||
{
|
||
real cesselim;
|
||
const TArray& array_movam = _cespite.movam();
|
||
for (int i = 0; i < array_movam.items(); i++)
|
||
{
|
||
const TRectype& rec_movam = (const TRectype&)array_movam[i];
|
||
cesselim += rec_movam.get_real(MOVAM_QNOR) + rec_movam.get_real(MOVAM_QACC) +
|
||
rec_movam.get_real(MOVAM_QANT) + rec_movam.get_real(MOVAM_QPERSE) +
|
||
rec_movam.get_real(MOVAM_QPPRIVATE) + rec_movam.get_real(MOVAM_FPRIVATO);
|
||
}
|
||
var = cesselim;
|
||
return true;
|
||
}
|
||
if (name == "#RESAMM") //residuo da ammortizzare
|
||
{
|
||
var = _cespite.res_amm();
|
||
return true;
|
||
}
|
||
|
||
//campi di testata del report
|
||
if (name == "#SITUAZIONE") //tipo situazione da stampare in testata
|
||
{
|
||
var.set(_tpamm);
|
||
return true;
|
||
}
|
||
if (name == "#ANNO")
|
||
{
|
||
var.set(_anno);
|
||
return true;
|
||
}
|
||
return TReport::get_usr_val(name, var);
|
||
}
|
||
|
||
////////////////////////////////////////////////////////
|
||
// APPLICAZIONE
|
||
////////////////////////////////////////////////////////
|
||
class TStampa_sintetica : public TSkeleton_application
|
||
{
|
||
protected:
|
||
virtual void main_loop();
|
||
};
|
||
|
||
|
||
void TStampa_sintetica::main_loop()
|
||
{
|
||
TStampa_sintetica_mask mask;
|
||
KEY k;
|
||
|
||
// mask.set(F_CALCOLO, "X");
|
||
while ((k = mask.run()) != K_QUIT)
|
||
{
|
||
mask.set_excel(k == K_EXCEL);
|
||
// Esecuzione calcolo globale
|
||
if (mask.get_bool(F_CALCOLO))
|
||
{
|
||
const int es = mask.get_int(F_ESERCIZIO);
|
||
const int gr = mask.get_int(F_GRUPPO);
|
||
const TString& sp = mask.get(F_SPECIE);
|
||
ditta_cespiti().set_attivita(es, gr, sp); // Fissa attivit<69> per calcolo
|
||
TExternal_app cal("ce2 -0 A");
|
||
cal.run(); // Esegue programma di calcolo in batch
|
||
}
|
||
//report e book dei report
|
||
TReport_book book;
|
||
TStampa_sintetica_rep rep;
|
||
|
||
rep.load("ce3900a");
|
||
rep.set_filter(mask);
|
||
book.add(rep);
|
||
|
||
//stampa il book dei report
|
||
if (mask.excel())
|
||
{
|
||
TFilename out;
|
||
|
||
out.tempdir(); out.add("cespsint.xls");
|
||
book.export_excel(out, false, true, true);
|
||
}
|
||
else
|
||
if (k == K_VISUALIZE)
|
||
book.preview();
|
||
else
|
||
book.print();
|
||
}
|
||
}
|
||
|
||
int ce3900(int argc, char* argv[])
|
||
{
|
||
TStampa_sintetica a;
|
||
a.run(argc, argv, TR("Registro cespiti sintetico"));
|
||
return 0;
|
||
} |