Migliorata gestione ammortamenti su parti eliminate

git-svn-id: svn://10.65.10.50/branches/R_10_00@23019 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
guy 2014-12-10 16:04:44 +00:00
parent b1c386d1db
commit 0d2e2d4bca
9 changed files with 69 additions and 62 deletions

View File

@ -140,25 +140,22 @@ class TCCC_mask : public TAutomask
public: public:
virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
TCCC_mask(); TCCC_mask();
virtual ~TCCC_mask() { }
}; };
//costruttore: se la chiave ha l'analitica fa comparire i campi per cms/cdc/fase //costruttore: se la chiave ha l'analitica fa comparire i campi per cms/cdc/fase
//se inoltre ha UsePdcc=false (ovvero usa pdc analitico puro) -> ci vogliono anche i conti! //se inoltre ha UsePdcc=false (ovvero usa pdc analitico puro) -> ci vogliono anche i conti!
TCCC_mask::TCCC_mask() TCCC_mask::TCCC_mask() : TAutomask("cetbccc")
: TAutomask("cetbccc")
{ {
//parte nascondendo i campi analitici //parte nascondendo i campi analitici
hide(-2); hide(-2);
//controllo analitica su chiave
_has_ca = dongle().active(CAAUT);
//inizializza i flag che servono un pò dappertutto //inizializza i flag che servono un pò dappertutto
//di base usa il pdcc //di base usa il pdcc
TConfig& cfg = ca_config(); TConfig& cfg = ca_config();
//controllo analitica su chiave e parametri
_has_ca = cfg.get_int("Authorizations") > 1;
_use_pdcc = cfg.get_bool("UsePdcc"); _use_pdcc = cfg.get_bool("UsePdcc");
//se la chiave ha CA -> campi cms/cdc/fase! //se la chiave ha CA -> campi cms/cdc/fase!
@ -345,6 +342,10 @@ bool TCCE_mask::is_leap(int year) const
} }
real TCCE_mask::calc_coeff(const TDate& ies, const TDate& fes) const real TCCE_mask::calc_coeff(const TDate& ies, const TDate& fes) const
{
const bool rip_by_day = get_int(F_TIPO_RIP) != 1;
real coeff = UNO;
if (rip_by_day) // ripartizione per giorno
{ {
const real tot_es = fes - ies + 1; const real tot_es = fes - ies + 1;
real max_es = 365; real max_es = 365;
@ -355,8 +356,14 @@ real TCCE_mask::calc_coeff(const TDate& ies, const TDate& fes) const
if ((im < 3 && (fm >= 3 || fy > iy) && is_leap(iy)) || if ((im < 3 && (fm >= 3 || fy > iy) && is_leap(iy)) ||
(fm >= 3 && (im < 3 || iy < fy) && is_leap(fy))) (fm >= 3 && (im < 3 || iy < fy) && is_leap(fy)))
max_es += 1.0; max_es += 1.0;
real coeff = tot_es / max_es; coeff = tot_es / max_es;
coeff.round(9); }
else // ripartizione mensile
{
const int fm = fes.year()*12 + fes.month();
const int sm = ies.year()*12 + ies.month();
coeff = real(fm - sm + 1) / real(12);
}
return coeff; return coeff;
} }
@ -379,13 +386,17 @@ bool TCCE_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
a.run(); a.run();
} }
break; break;
case F_DURATA: case F_TIPO_RIP:
if (e == fe_init && !field(F_CODESER).empty()) if (e == fe_modify || e == fe_init)
{ {
const TDate ies = get_date(F_DATAINI); const TDate ies = get_date(F_DATAINI);
const TDate fes = get_date(F_DATAFINE); const TDate fes = get_date(F_DATAFINE);
if (ies.ok() && fes >= ies)
{
set(F_DURATA, fes-ies+1); set(F_DURATA, fes-ies+1);
set(F_COEFF_DURATA, calc_coeff(ies, fes)); TReal_field& cd = (TReal_field&)efield(F_COEFF_DURATA);
cd.set(calc_coeff(ies, fes).string(0, cd.decimals()));
}
} }
break; break;
default: default:

View File

@ -57,6 +57,8 @@ int TForce_mov_qmask::calcola_stato_attivita()
const TRectype& curr_ccb = cache().get("CCB", str); const TRectype& curr_ccb = cache().get("CCB", str);
if (curr_ccb.get_bool("B1")) // Bollato stampato if (curr_ccb.get_bool("B1")) // Bollato stampato
_staat = 1; _staat = 1;
else
_staat = 0;
TDitta_cespiti& dc = ditta_cespiti(); TDitta_cespiti& dc = ditta_cespiti();
dc.set_attivita(ese, gru, spe); dc.set_attivita(ese, gru, spe);
@ -67,13 +69,12 @@ int TForce_mov_qmask::calcola_stato_attivita()
int TForce_mov_qmask::calcola_ammo_eliminate() int TForce_mov_qmask::calcola_ammo_eliminate()
{ {
const int ese = get_int(F_ESERCIZIO); const int ese = get_int(F_ESERCIZIO);
TString4 str; str.format("%04d", ese); TString4 str; str.format("%04d", ese);
const TRectype& curr_cce = cache().get("CCE", str); const TRectype& curr_cce = cache().get("CCE", str);
if (curr_cce.get_bool("B3")) //possibilitá ammortamenti su parti eliminate (si prosegue solo se TRUE) if (curr_cce.get_bool("B3")) //possibilitá ammortamenti su parti eliminate (si prosegue solo se TRUE)
_ammoelim = 1; _ammoelim = 1;
else
_ammoelim = 0;
return _ammoelim; return _ammoelim;
} }
@ -117,7 +118,7 @@ bool TForce_mov_qmask::on_field_event(TOperable_field& o, TField_event e, long j
calcola_stato_attivita(); calcola_stato_attivita();
calcola_ammo_eliminate(); calcola_ammo_eliminate();
if (_ammoelim != 1) if (_ammoelim != 1)
return error_box(TR("Non previsti ammortamenti sulle parti eliminate")); return error_box(FR("Non è previsto l'ammortamento sulle parti parti eliminate nell'esercizio %s"), (const char*)o.get());
} }
break; break;
@ -125,23 +126,21 @@ bool TForce_mov_qmask::on_field_event(TOperable_field& o, TField_event e, long j
if (e == fe_init || e == fe_modify) //seleziona il filtro da applicare alla maschera nel campo del movimento if (e == fe_init || e == fe_modify) //seleziona il filtro da applicare alla maschera nel campo del movimento
{ {
const TString& ces = get(F_IDCESPITE); const TString& ces = get(F_IDCESPITE);
const bool cesok = !real::is_null(ces);
TString filter; TString filter;
filter << "(IDRET=\"\")&&(ANSI(DTMOV)>=ANSI(#" << F_INIZIO_ES filter << "(IDRET=\"\")&&(BETWEEN(DTMOV,#" << F_INIZIO_ES
<< "))&&(ANSI(DTMOV)<=ANSI(#" << F_FINE_ES << "))"; << ",#" << F_FINE_ES << "))";
if (cesok) // se viene selezionato un particolare cespite al filtro si aggiunge il suo codice if (ces.full()) // se viene selezionato un particolare cespite al filtro si aggiunge il suo codice
filter << "&&(IDCESPITE==\"" << ces << "\")"; filter << "&&(IDCESPITE==\"" << ces << "\")";
TEdit_field& m = efield(F_IDMOV); // setta il filtro della ricerca sulla maschera TEdit_field& m = efield(F_IDMOV); // setta il filtro della ricerca sulla maschera
m.browse()->set_filter(filter); m.browse()->set_filter(filter);
} }
if (e == fe_close) if (e == fe_close)
{ {
if (stato_attivita() == 1) if (stato_attivita() == 1)
warning_box(TR("E' stato stampato il bollato dell'anno:\nnon sono permesse forzature")); warning_box(TR("E' stato stampato il bollato dell'anno:\nnon sono permesse forzature"));
if (ammo_eliminate() == 0) if (ammo_eliminate() == 0)
warning_box(TR("Non é previsto l'ammortamento sulle parti eliminate nell'esercizio selezionato")); warning_box(TR("Non è previsto l'ammortamento sulle parti eliminate nell'esercizio selezionato"));
} }
break; break;
@ -169,7 +168,7 @@ bool TForce_mov_qmask::on_field_event(TOperable_field& o, TField_event e, long j
const TRectype& categoria = ces.categoria(); const TRectype& categoria = ces.categoria();
bool non_ammortizzabile = categoria.get_bool("B0"); bool non_ammortizzabile = categoria.get_bool("B0");
if (non_ammortizzabile) if (non_ammortizzabile)
return error_box(TR("Ammortamenti non effettuabili perché la categoria del cespite non é ammortizzabile")); return error_box(TR("Ammortamenti non effettuabili perché la categoria del cespite non è ammortizzabile"));
if (!curr_movce.empty()) if (!curr_movce.empty())
{ {
@ -183,7 +182,7 @@ bool TForce_mov_qmask::on_field_event(TOperable_field& o, TField_event e, long j
const TDate dataini(get(F_INIZIO_ES)); const TDate dataini(get(F_INIZIO_ES));
const TDate datafine(get(F_FINE_ES)); const TDate datafine(get(F_FINE_ES));
if ( dtmov < dataini || dtmov > datafine) if ( dtmov < dataini || dtmov > datafine)
return error_box(TR("Il movimento selezionato non é di competenza dell'esercizio selezionato")); return error_box(TR("Il movimento selezionato non è di competenza dell'esercizio selezionato"));
} }
key.format("%s|%s|1", (const char *) idcespite, (const char *) get(F_IDMOV)); key.format("%s|%s|1", (const char *) idcespite, (const char *) get(F_IDMOV));
@ -209,8 +208,8 @@ bool TForce_mov_qmask::on_field_event(TOperable_field& o, TField_event e, long j
if (ammmv.empty()) if (ammmv.empty())
return error_box(TR("Ammortamenti fiscali sui movimenti incoerenti per il movimento selezionato")); return error_box(TR("Ammortamenti fiscali sui movimenti incoerenti per il movimento selezionato"));
calc_res_mov(ces, curr_movce, ammmv); //calcolo del residuo fiscale in uscita maschera di selezione calc_res_mov(ces, curr_movce, ammmv); //calcolo del residuo fiscale in uscita maschera di selezione
if (_residuof==ZERO) if (_residuof.is_zero())
return error_box(TR("Impossibile forzare ammortamento perché non esiste residuo fiscale\nda ammortizzare per le parti eliminate del cespite")); warning_box(TR("Non esiste residuo fiscale\nda ammortizzare per le parti eliminate del cespite"));
} }
key.format("%s|%s|2", (const char *) idcespite, (const char *) get(F_IDMOV)); key.format("%s|%s|2", (const char *) idcespite, (const char *) get(F_IDMOV));
@ -220,8 +219,8 @@ bool TForce_mov_qmask::on_field_event(TOperable_field& o, TField_event e, long j
if (ammmv.empty()) if (ammmv.empty())
return error_box(TR("Ammortamenti civilistici sui movimenti incoerenti per il movimento selezionato")); return error_box(TR("Ammortamenti civilistici sui movimenti incoerenti per il movimento selezionato"));
calc_res_mov(ces, curr_movce, ammmv); //calcolo del residuo civilistico in uscita maschera di selezione calc_res_mov(ces, curr_movce, ammmv); //calcolo del residuo civilistico in uscita maschera di selezione
if (_residuoc==ZERO) if (_residuoc.is_zero())
return error_box(TR("Impossibile forzare ammortamento perché non esiste residuo civilistico\nda ammortizzare per le parti eliminate del cespite")); warning_box(TR("Non esiste residuo civilistico\nda ammortizzare per le parti eliminate del cespite"));
} }
} }

View File

@ -47,6 +47,7 @@ BEGIN
DISPLAY "Codice esercizio" CODTAB DISPLAY "Codice esercizio" CODTAB
DISPLAY "Inizio esercizio" 104@->D0 DISPLAY "Inizio esercizio" 104@->D0
DISPLAY "Fine esercizio" 104@->D1 DISPLAY "Fine esercizio" 104@->D1
DISPLAY "Ammortamento\nparti vendute@12C" B3
OUTPUT F_ESERCIZIO CODTAB OUTPUT F_ESERCIZIO CODTAB
OUTPUT F_INIZIO_ES 104@->D0 OUTPUT F_INIZIO_ES 104@->D0
OUTPUT F_FINE_ES 104@->D1 OUTPUT F_FINE_ES 104@->D1
@ -136,12 +137,14 @@ NUMBER F_IDMOV 11
BEGIN BEGIN
PROMPT 1 10 "Movimento " PROMPT 1 10 "Movimento "
FLAGS "Z" FLAGS "Z"
USE LF_MOVCE SELECT (IDRET="")&&(ANSI(DTMOV)>=ANSI(#F_INIZIO_ES))&&(ANSI(DTMOV)<=ANSI(#F_FINE_ES)) USE LF_MOVCE SELECT (IDRET="")&&(BETWEEN(DTMOV,#F_INIZIO_ES,#F_FINE_ES))
JOIN LF_CESPI INTO IDCESPITE==IDCESPITE JOIN LF_CESPI INTO IDCESPITE==IDCESPITE
JOIN %TMC INTO CODTAB==CODMOV
INPUT IDMOV F_IDMOV INPUT IDMOV F_IDMOV
DISPLAY "Movimento@11" IDMOV DISPLAY "Movimento@11" IDMOV
DISPLAY "Data mov.@10" DTMOV DISPLAY "Data mov.@10" DTMOV
DISPLAY "Cod. tipo mov." CODMOV DISPLAY "Tipo\nmov.@4" CODMOV
DISPLAY "Ammesso\nAmmort.@7C" 4->B4
DISPLAY "Data doc.@10" DTDOC DISPLAY "Data doc.@10" DTDOC
DISPLAY "Tipo doc." TPDOC DISPLAY "Tipo doc." TPDOC
DISPLAY "Numero doc." NDOC DISPLAY "Numero doc." NDOC

View File

@ -7,14 +7,10 @@ int main(int argc,char** argv)
const int r = (argc > 1) ? (argv[1][1]-'0') : 0; const int r = (argc > 1) ? (argv[1][1]-'0') : 0;
switch (r) switch (r)
{ {
case 1: case 1: ce4200(argc,argv); break; //calcolo cespiti per commessa
ce4200(argc,argv); break; //calcolo cespiti per commessa case 2: ce4300(argc,argv); break; //stampa proiezione ammortamenti cespiti
case 2: case 3: ce4400(argc,argv); break; //contabilizzazione cespiti
ce4300(argc,argv); break; //stampa proiezione ammortamenti cespiti case 4: ce4500(argc,argv); break; //stampa cespiti in contabilitŕ analitica
case 3:
ce4400(argc,argv); break; //contabilizzazione cespiti
case 4:
ce4500(argc,argv); break; //stampa cespiti in contabilitŕ analitica
case 0: case 0:
default: ce4100(argc,argv); break; // ripartizione analitica cespiti default: ce4100(argc,argv); break; // ripartizione analitica cespiti
} }

View File

@ -110,7 +110,7 @@ public:
// //
real TCalc_cesp_cms::calc_perc_util_cesp(const TRectype& salcecms_rec, const TDate& dtinices, const TDate& dtfineces) real TCalc_cesp_cms::calc_perc_util_cesp(const TRectype& salcecms_rec, const TDate& dtinices, const TDate& dtfineces)
{ {
//adeesso prende la percentuale di utilizzo del cespite nella commessa.. //adesso prende la percentuale di utilizzo del cespite nella commessa..
real percutil = salcecms_rec.get_real(SALCECMS_PERCUTIL); real percutil = salcecms_rec.get_real(SALCECMS_PERCUTIL);
//normalizza la percentuale... //normalizza la percentuale...
percutil = percutil / CENTO; percutil = percutil / CENTO;
@ -130,7 +130,6 @@ real TCalc_cesp_cms::calc_perc_util_cesp(const TRectype& salcecms_rec, const TDa
if (!dtfinecms.ok()) if (!dtfinecms.ok())
dtfinecms = cms.get_date(COMMESSE_DATAFINE); dtfinecms = cms.get_date(COMMESSE_DATAFINE);
if (dtfinecms.ok() && (dtfinecms < dtfineces)) if (dtfinecms.ok() && (dtfinecms < dtfineces))
dtfine = dtfinecms; dtfine = dtfinecms;
TDate dtini = dtinices; TDate dtini = dtinices;

View File

@ -229,7 +229,7 @@ void TStampa_proiez_ammo_rep::set_filter(const TStampa_proiez_ammo_mask& msk)
const TString idcespite = rel_cespi.curr().get(CESPI_IDCESPITE); const TString idcespite = rel_cespi.curr().get(CESPI_IDCESPITE);
const int codcat = rel_cespi.curr().get_int(CESPI_CODCAT); const int codcat = rel_cespi.curr().get_int(CESPI_CODCAT);
//NOVITA'! usa l'ggetto TCespite per completezza di calcoli //NOVITA'! usa l'oggetto TCespite per completezza di calcoli
TCespite cespite(idcespite); TCespite cespite(idcespite);
cespite.load_saldi(1, _anno); cespite.load_saldi(1, _anno);

View File

@ -242,7 +242,7 @@ bool TSaldo_per_codice::use_pdcc() const
static char _use_pdcc = ' '; static char _use_pdcc = ' ';
if (_use_pdcc == ' ') if (_use_pdcc == ' ')
{ {
TConfig cfg = ca_config(); TConfig& cfg = ca_config();
_use_pdcc = cfg.get_bool("UsePdcc"); _use_pdcc = cfg.get_bool("UsePdcc");
} }
return _use_pdcc != '\0'; return _use_pdcc != '\0';
@ -478,7 +478,7 @@ int TSaldo_per_codice::compila_rmov_CG(const int tipo, const int riga_nor, TArra
if (!ok) if (!ok)
{ {
TString msg; TString msg;
msg.format(FR("Il codice cespite %s non e' un sottoconto valido"), (const char*)_idcespite); msg.format(FR("Il codice cespite %s non è un sottoconto valido"), (const char*)_idcespite);
log.log(2, msg); log.log(2, msg);
} }
} }

View File

@ -123,8 +123,7 @@ Picture = <ce00>
Module = 11 Module = 11
Flags = "" Flags = ""
Item_01 = "Cambio esercizio", "ce2 -1", "F" Item_01 = "Cambio esercizio", "ce2 -1", "F"
Item_02 = "Riattribuzione percentuali", "", "" Item_02 = "Rispristino stampa bollato", "ce2 -4", "F"
Item_03 = "Rispristino stampa bollato", "ce2 -4", "F"
[CEMENU_013] [CEMENU_013]
Caption = "Cespiti per contabilità analitica" Caption = "Cespiti per contabilità analitica"

View File

@ -515,17 +515,17 @@ PAGE "Conti CA" 0 2 0 0
GROUPBOX DLG_NULL 76 6 GROUPBOX DLG_NULL 76 6
BEGIN BEGIN
PROMPT 1 0 "@bAmm. Normali" PROMPT 1 0 "@bAmmortamenti Normali"
END END
GROUPBOX DLG_NULL 76 6 GROUPBOX DLG_NULL 76 6
BEGIN BEGIN
PROMPT 1 6 "@bAmm. Accelerati" PROMPT 1 6 "@bAmmortamenti Accelerati"
END END
GROUPBOX DLG_NULL 76 6 GROUPBOX DLG_NULL 76 6
BEGIN BEGIN
PROMPT 1 12 "@bAmm. Anticipati" PROMPT 1 12 "@bAmmortamenti Anticipati"
END END
ENDPAGE ENDPAGE