Patch level :10.0 426

Files correlati     :
Ricompilazione Demo : [ ]
Commento            :prima implementazione ripartizioni costo/ricavo a saldi (da provare del tutto!)


git-svn-id: svn://10.65.10.50/trunk@19232 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
luca 2009-08-27 09:07:09 +00:00
parent 32a18ed56c
commit 7abe6a531a
8 changed files with 120 additions and 31 deletions

View File

@ -47,6 +47,7 @@
#define F_CMSREQ 141
#define F_FSCREQ 142
#define F_PDCREQ 143
#define F_SEZRIF 144
#define F_RIGHE_NUM 170
#define F_RIGHE_FDR 171

View File

@ -394,6 +394,15 @@ BEGIN
FIELD PdciRequired
END
RADIOBUTTON F_SEZRIF 60
BEGIN
PROMPT 1 19 "Sezione di riferimento per le ripartizioni Costo/Ricavo"
ITEM "C|Costo"
ITEM "R|Ricavo"
FLAGS "Z"
FIELD SezRif
END
ENDPAGE
PAGE "Regole rendiconto" -1 -1 78 20

View File

@ -57,16 +57,42 @@ bool TRiparti_msk::on_field_event(TOperable_field& o, TField_event e, long jolly
{
switch (o.dlg())
{
//gestione tipo di ripartizioni possibili
//0 = percentuale; 1 = in base al peso economico della commessa; 2 = per parti (modello cocktail)
case F_TIPORIP:
if (e == fe_init || e == fe_modify)
{
TSheet_field& sf = sfield(F_SHEET);
TMask& sm = sf.sheet_mask();
const int t = atoi(o.get());
sm.show(101, t < 2); // Percentuale
sm.show(201, t == 2); // Parti
sm.enable(101, t != 1);
sf.enable_column(0, t != 1);
switch (t)
{
case 0: //percentuale
{
sm.hide(201);
sm.show(101);
sm.enable(101);
sf.enable_column(0);
}
break;
case 1: //peso economico della commessa (non viene specificato nulla, la ripartizione avviene in base ai saldi)
{
sm.show(101);
sm.disable(101); //necessario per non avere 2 campi abilitati e nascosti nella stessa posizione (dà errore)
sm.hide(201);
sf.enable_column(0, false);
}
break;
case 2: //parti
{
sm.hide(101);
sm.show(201);
sm.enable(201);
sf.enable_column(0);
}
break;
}
sf.force_update();
}
if (e == fe_close && atoi(o.get()) == 0)
@ -77,7 +103,7 @@ bool TRiparti_msk::on_field_event(TOperable_field& o, TField_event e, long jolly
tot += real(row->get(0));
tot.round(2);
if (tot != CENTO)
return error_box(TR("Il totale delle percentuali di riparto deve essere 100"));
return error_box(TR("Il totale delle percentuali di ripartizione deve essere 100"));
}
break;
case F_GENFASI:

View File

@ -200,7 +200,7 @@ BEGIN
PROMPT 1 0 "Ripartizione"
FLAGS "Z"
ITEM "0|Percentuale"
ITEM "1|Perc. su costo"
ITEM "1|Costo\Ricavo"
ITEM "2|Parti"
FIELD TIPORIP
END

View File

@ -121,7 +121,10 @@ bool TRib_movanal_app::ripartizione(const TAnal_ripartizioni_batch& rrip, const
int i;
const int righe_ripartizione = rrip.rows();
for (i = 1; i <= rrip.rows(); i++)
distrib.add(rrip[i].get_real(RRIP_RIPARTO));
{
const real importanza_riga = rrip[i].get_real(RRIP_RIPARTO);
distrib.add(importanza_riga);
}
for (i = 1; i <= righe_ripartizione; i++)
{

View File

@ -1628,6 +1628,11 @@ char TAnal_ripartizioni_batch::tiporip() const
return head().get_char(RIP_TIPO);
}
int TAnal_ripartizioni_batch::modorip() const
{
return head().get_int(RIP_TIPORIP);
}
int TAnal_ripartizioni_batch::read (const char tiporip, const char* codice)
{
TLocalisamfile rip(LF_RIP);
@ -1847,27 +1852,41 @@ TObject* TCache_ripartizioni::key2obj(const char* key)
}
break;
}
if (rip->head().get_int(RIP_TIPORIP) == 1)
//ripartizioni costo/ricavo (quelle bonazziche sui saldi)
//stabilisce i coefficienti di ripartizione al volo in base al peso economico della commessa/cdc/fase/conto che trova..
//..sulla riga di ripartizione; ovviamente tali valori sono soggetti a cambiamento tutte le volte che ci sono righe..
//..analitiche che interessano tali paramtri (cms/cdc ecc.); sono ripartizioni dinamiche per il controllo dei costi/ricavi..
//..ad una data
if (rip->modorip() == 1) //modorip=1 -> costo/ricavo
{
bool some_value = false;
const int items = rip->rows();
//deve sapere se usare i saldi in Dare o Avere in base al fatto che l'utente voglia un analisi proporzionata..
//..sui Costi o sui Ricavi; lo legge dalla configurazione della CA; se non lo trova settato lo mette in automatico..
//..a Costi
const char sezione_di_riferimento = ca_config().get_char("SezRif");
for (int i = 1; i <= items; i++)
{
TRectype & rec = (*rip)[i];
TAnal_bill bill;
bill.set_conto(rec.get(RRIP_CODCONTO));
bill.set_costo(rec.get(RRIP_CODCOSTO));
bill.set_commessa(rec.get(RRIP_CODCMS));
bill.set_fase(rec.get(RRIP_CODFASE));
const TAnal_bill bill(rec);
//calcola il saldo usando come parametri (cms/cdc/fsc/conto) quelli che trova sulla riga di ripartizione
const TSaldanal& s = ca_saldo(bill, _dal, _al, _saldanal_consuntivo);
TImporto val = s._ini;
//in base a C/R stabilisce quali saldi considerare e in quale sezione normalizzare
real val;
if (sezione_di_riferimento == 'R') //in Ricavi normalizza in Avere
val = s._avere.valore();
else //in Costi normalizza in Dare
val = s._dare.valore();
//saldi nulli non contano
if (val < ZERO)
val = ZERO;
val.normalize('D');
some_value |= !val.valore().is_zero();
rec.put(RRIP_RIPARTO, val.valore());
//usa il valore del saldo non nullo per stabilire il "peso" della riga di ripartizione
some_value |= !val.is_zero();
rec.put(RRIP_RIPARTO, val);
}
if (!some_value)
{

View File

@ -181,6 +181,7 @@ public:
const TRectype& head() const { return _rip; }
int indbil() const;
char tiporip() const;
int modorip() const;
int read(const char tiporip, const char* codice);
int read(const char* codcosto, const char* commessa, const char* fase, const int annoes, const int indbil, const int classe_mov);
int read(const char tiporip, const int gr, const int co, const long sot, const int annoes, const int indbil, const int classe_mov);

View File

@ -8,6 +8,7 @@
#include "movana.h"
#include "pconana.h"
#include "rmovana.h"
#include "rrip.h"
#include "saldana.h"
///////////////////////////////////////////////////////////
@ -596,6 +597,12 @@ bool TAnal_bill::get(const TRectype& rec)
set_commessa(rec.get(SALDANA_COMMESSA));
set_fase(rec.get(SALDANA_FASE));
break;
case LF_RRIP:
set_costo(rec.get(RRIP_CODCOSTO));
set_commessa(rec.get(RRIP_CODCMS));
set_fase(rec.get(RRIP_CODFASE));
set_conto(rec.get(RRIP_CODCONTO));
break;
default:
ok = false;
break;
@ -838,12 +845,20 @@ bool TSaldi_cache::int_saldo_movimenti(const TAnal_bill& b,
const TDate& dal, const TDate& al,
word tipo, TSaldanal& s) const
{
TDate dataini;
TDate dataini; //data da cui iniziare la scansione dei movimenti analitici (!=dal)
if (dal.ok())
{
const int annoprec = _esc.date2prevesc(dal);
if (annoprec > 0)
dataini = _esc[annoprec].fine()+1L;
else
{
const int curr_eser = _esc.date2esc(dal);
if (curr_eser > 0)
dataini = _esc[curr_eser].inizio();
else
dataini = TDate(1,1,dal.year());
}
}
TString query, select;
@ -866,6 +881,18 @@ bool TSaldi_cache::int_saldo_movimenti(const TAnal_bill& b,
select << "&&";
select << "(CODFASE==\"" << b.fase() << "\")";
}
//se il conto dovesse essere vuoto (dio ce ne scampi, ma qualche utonto lo ha fatto nelle tabelle di ripartizione!)..
//..l'eventuale filtro sulle date va fatto nella SELECT
if (b.conto().blank())
{
if (dataini.ok() || al.ok())
{
if (select.full())
select << "&&";
select << "(BETWEEN(DATACOMP," << dataini.date2ansi() << "," << al.date2ansi() << "))";
}
}
query << "USE RMOVANA KEY 2\n";
if (select.full())
@ -877,16 +904,19 @@ bool TSaldi_cache::int_saldo_movimenti(const TAnal_bill& b,
if (filtra_tipo)
query << "JOIN MOVANA INTO NUMREG==NUMREG\n";
query << "FROM CODCONTO=" << b.conto();
if (dataini.ok())
query << " DATACOMP=" << dataini;
query << "\n";
//se il conto è buono, anzichè passare per la SELECT usa la chiave 2 con il FROM/TO
if (b.conto().full())
{
query << "FROM CODCONTO=\"" << b.conto() << '"';
if (dataini.ok())
query << " DATACOMP=" << dataini;
query << "\n";
query << "TO CODCONTO=" << b.conto();
if (al.ok())
query << " DATACOMP=" << al;
query << "\n";
query << "TO CODCONTO=\"" << b.conto() << '"';
if (al.ok())
query << " DATACOMP=" << al;
query << "\n";
}
TISAM_recordset rmovana(query);
for (TRecnotype i = 0; rmovana.move_to(i); i++)
@ -957,7 +987,7 @@ bool TSaldi_cache::saldi(const TAnal_bill& bill, const TDate& dal, const TDate&
// Calcolo i saldi fino all'anno scorso.
// In assemza di data iniziale mi torna 0
const int anno_prec = _esc.date2prevesc(dal);
if (anno_prec > 0)
if (anno_prec > 0 && bill.conto().full())
{
// Calcolo il saldo precedente solo per attivita' e passivita'
const TIndbil indbil = bill.indicatore_bilancio();
@ -970,7 +1000,7 @@ bool TSaldi_cache::saldi(const TAnal_bill& bill, const TDate& dal, const TDate&
}
}
if ((tipo & _saldanal_ultima_imm)!=0)
if ((tipo & _saldanal_ultima_imm) != 0)
{
// Calcolo i saldi di quest'anno
// In assemza di data iniziale somma tutti gli anni (fino al 9999)