From 7abe6a531ac8c47f5b46f6178867326a1856a8b6 Mon Sep 17 00:00:00 2001 From: luca Date: Thu, 27 Aug 2009 09:07:09 +0000 Subject: [PATCH] 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 --- ca/ca0300a.h | 1 + ca/ca0300a.uml | 9 +++++++++ ca/ca0800.cpp | 36 ++++++++++++++++++++++++++++----- ca/ca0800a.uml | 2 +- ca/ca2200.cpp | 5 ++++- ca/calib01.cpp | 43 +++++++++++++++++++++++++++++----------- ca/calib01.h | 1 + ca/calib02.cpp | 54 +++++++++++++++++++++++++++++++++++++++----------- 8 files changed, 120 insertions(+), 31 deletions(-) diff --git a/ca/ca0300a.h b/ca/ca0300a.h index c6b7a37c2..0ab56e880 100755 --- a/ca/ca0300a.h +++ b/ca/ca0300a.h @@ -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 diff --git a/ca/ca0300a.uml b/ca/ca0300a.uml index d31712e01..ab104fe38 100755 --- a/ca/ca0300a.uml +++ b/ca/ca0300a.uml @@ -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 diff --git a/ca/ca0800.cpp b/ca/ca0800.cpp index 94f8bc51f..ca9248273 100755 --- a/ca/ca0800.cpp +++ b/ca/ca0800.cpp @@ -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: diff --git a/ca/ca0800a.uml b/ca/ca0800a.uml index fb5609b35..db4cd1f79 100755 --- a/ca/ca0800a.uml +++ b/ca/ca0800a.uml @@ -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 diff --git a/ca/ca2200.cpp b/ca/ca2200.cpp index 754f4f2cf..bfa634335 100755 --- a/ca/ca2200.cpp +++ b/ca/ca2200.cpp @@ -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++) { diff --git a/ca/calib01.cpp b/ca/calib01.cpp index 3e95ec384..d9f0cf499 100755 --- a/ca/calib01.cpp +++ b/ca/calib01.cpp @@ -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) { diff --git a/ca/calib01.h b/ca/calib01.h index 16e1c38e6..bf4f6939a 100755 --- a/ca/calib01.h +++ b/ca/calib01.h @@ -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); diff --git a/ca/calib02.cpp b/ca/calib02.cpp index a21f2ba95..f22607566 100755 --- a/ca/calib02.cpp +++ b/ca/calib02.cpp @@ -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)