diff --git a/ca/ca3800.cpp b/ca/ca3800.cpp index ef12e4f3c..d1a7fa618 100755 --- a/ca/ca3800.cpp +++ b/ca/ca3800.cpp @@ -147,8 +147,9 @@ protected: virtual TObject* key2obj(const char* key); public: - int get_indbil(const TString& conto); + int get_indbil(const TString& conto, TString& conto_anale); void set_prefix(const char* prefix); + int get_prefix_length() const { return _prefix.len(); } TIndbil_cache(); }; @@ -201,15 +202,18 @@ TObject* TIndbil_cache::key2obj(const char* key) //conto analitico TAnal_bill bill(conto); int indbil = bill.indicatore_bilancio(); - TString* ib = new TString4; + TToken_string* ib = new TToken_string; *ib << indbil; + ib->add(conto); return ib; } -int TIndbil_cache::get_indbil(const TString& conto) +int TIndbil_cache::get_indbil(const TString& conto, TString& conto_anale) { - TString* ib = (TString*)objptr(conto); - return ib ? atoi(*ib) : 0; + TToken_string* ib = (TToken_string*)objptr(conto); + if (ib != NULL) + ib->get(1, conto_anale); + return ib ? ib->get_int(0) : 0; } void TIndbil_cache::set_prefix(const char* prefix) @@ -253,6 +257,10 @@ protected: virtual const TVariant& get(unsigned int column) const; virtual const TVariant& get(const char* column_name) const; + void parse_bill(const TString& bill, TString& gruppo, TString& conto) const; + void aggiorna_importo(TAssoc_array* riga_array, const TString& livello, + const int indbil, const TRecordset& saldana) const; + public: virtual void set_filter(const TPrint_bilancio_cms_mask& msk); }; @@ -264,6 +272,56 @@ bool TPrint_bilancio_cms_recordset::move_to(TRecnotype pos) return pos >= 0 && pos < items(); } + +void TPrint_bilancio_cms_recordset::parse_bill(const TString& bill, TString& gruppo, TString& conto) const +{ + TConfig& cfg = ca_config(); + const TMultilevel_code_info& pconana_info = ca_multilevel_code_info(LF_PCONANA); + const int pconana_levels = pconana_info.levels(); + const int prefix = cfg.get_int("PdcPrefix")-1; + + //lunghezza dell'eventuale prefisso di gruppo e conto + const int prefix_len = (prefix >= 0) ? pconana_info.total_len(prefix) : 0; + const int gruppo_len = pconana_info.len(prefix + 1); + const int conto_len = pconana_info.len(prefix + 2); + + //stringhe con gruppo e conto da mettere nel record dell'assoc_array + gruppo = bill.mid(prefix_len, gruppo_len); + conto = bill.mid(prefix_len, gruppo_len + conto_len); +} + +void TPrint_bilancio_cms_recordset::aggiorna_importo(TAssoc_array* riga_array, + const TString& livello, const int indbil, const TRecordset& saldana) const +{ + TString* str_imp = (TString*)riga_array->objptr(livello); + if (str_imp == NULL) + { + str_imp = new TString; + riga_array->add(livello, str_imp); + } + + //dare o avere? + const char sezione = indbil == 3 ? 'D' : 'A'; + TImporto imp(sezione, real(*str_imp)); + +/* + const TImporto imp_saldop(saldana.get(SALDANA_SEZIONEP).as_string()[0], + saldana.get(SALDANA_SALDOP).as_real()); + const TImporto imp_saldov(saldana.get(SALDANA_SEZIONEV).as_string()[0], + saldana.get(SALDANA_SALDOV).as_real()); + + imp += imp_saldop; + imp += imp_saldov; +*/ + const TImporto imp_saldo(saldana.get(SALDANA_SEZIONE).as_string()[0], + saldana.get(SALDANA_SALDO).as_real()); + imp += imp_saldo; + + imp.normalize(sezione); + *str_imp = imp.valore().string(); + +} + void TPrint_bilancio_cms_recordset::requery() { //prende le date di inizio e fine dell'eserizio selezionato sulla maschera @@ -284,51 +342,65 @@ void TPrint_bilancio_cms_recordset::requery() TISAM_recordset saldana(query); for (bool ok = saldana.move_first(); ok; ok = saldana.move_next()) { - const TString& conto = saldana.get(SALDANA_CONTO).as_string(); + const TString& codconto = saldana.get(SALDANA_CONTO).as_string(); //trova l'indicatore di bilancio - const int indbil = _indicatori.get_indbil(conto); - + TString80 conto_anale; + const int indbil = _indicatori.get_indbil(codconto, conto_anale); + //solo i Costi(3) ed i Ricavi(4) devono essere considerati per la stampa if (indbil == 3 || indbil == 4) { - const TString& codcms = saldana.get(SALDANA_COMMESSA).as_string(); - const TString& fase = saldana.get(SALDANA_FASE).as_string(); - - const TRectype& rec_commesse = cache().get(LF_COMMESSE, codcms); - - const TDate dataini = rec_commesse.get(COMMESSE_DATAINIZIO); - const TDate datafine = rec_commesse.get(COMMESSE_DATAFINE); - //e' inutile considerare le commesse terminate prima dell'esercizio selezionato.. - //..cioe' nel passato oppure che iniziano nel futuro! - if (datafine >= datainiesc && dataini <= datafinesc) + //solo i record di tipo Preventivo(P) o Variazione(V) devono essere considerati + const real saldop = saldana.get(SALDANA_SALDOP).as_real(); + const real saldov = saldana.get(SALDANA_SALDOV).as_real(); + //if (saldop != ZERO || saldov != ZERO) { - int indice = datafine <= datafinesc ? 0 : 2; - if (dataini >= datainiesc) - indice++; + const TString& codcms = saldana.get(SALDANA_COMMESSA).as_string(); + const TString& fase = saldana.get(SALDANA_FASE).as_string(); - TString80 chiave = codcms; - if (_use_fasi) - chiave << '|' << fase; + const TRectype& rec_commesse = cache().get(LF_COMMESSE, codcms); - //cerca se la commessa (e l'eventuale fase) esistono gia' nell'assocarray delle commesse - TAssoc_array* riga_array = (TAssoc_array*)cms[indice].objptr(chiave); - //se non esiste la crea! - if (riga_array == NULL) + const TDate dataini = rec_commesse.get(COMMESSE_DATAINIZIO); + const TDate datafine = rec_commesse.get(COMMESSE_DATAFINE); + //e' inutile considerare le commesse terminate prima dell'esercizio selezionato.. + //..cioe' nel passato oppure che iniziano nel futuro! + if (datafine >= datainiesc && dataini <= datafinesc) { - riga_array = new TAssoc_array; - - TString4 str_indice; //l'indice va stringato per l'assoc_array - str_indice << indice; - - riga_array->add("LEVEL", str_indice); - riga_array->add("CODCMS", codcms); - riga_array->add("FASE", fase); - riga_array->add("DESCRIZ", rec_commesse.get(COMMESSE_DESCRIZ)); - - //aggiunge la riga all'array-ino - cms[indice].add(chiave, riga_array); - } - } //if (datafine >= datainiesc &&... + int indice = datafine <= datafinesc ? 0 : 2; + if (dataini >= datainiesc) + indice++; + TString80 chiave = codcms; + if (_use_fasi) + chiave << '|' << fase; + + //cerca se la commessa (e l'eventuale fase) esistono gia' nell'assocarray delle commesse + TAssoc_array* riga_array = (TAssoc_array*)cms[indice].objptr(chiave); + //se non esiste la crea! + if (riga_array == NULL) + { + riga_array = new TAssoc_array; + + TString4 str_indice; //l'indice va stringato per l'assoc_array + str_indice << indice; + + riga_array->add("LEVEL", str_indice); + riga_array->add("CODCMS", codcms); + riga_array->add("FASE", fase); + riga_array->add("DESCRIZ", rec_commesse.get(COMMESSE_DESCRIZ)); + + //aggiunge la riga all'array-ino + cms[indice].add(chiave, riga_array); + } + //aggiunge gli importi e normalizza + TString80 gruppo, conto; + parse_bill(conto_anale, gruppo, conto); + + aggiorna_importo(riga_array, gruppo, indbil, saldana); + aggiorna_importo(riga_array, conto, indbil, saldana); + + + } //if (datafine >= datainiesc &&... + } //if (saldop != ZERO.. } //if (indbil == 3 ||... } diff --git a/ca/ca3800a.rep b/ca/ca3800a.rep index 763735479..c65fb949a 100755 --- a/ca/ca3800a.rep +++ b/ca/ca3800a.rep @@ -1,5 +1,5 @@ - + Bilancio commessa CA
@@ -13,11 +13,17 @@ #REPORT.PAGE - - + + + + + + + + - - +
@@ -33,11 +39,11 @@
-
+
LEVEL C; 2 - - - + + + LEVEL
  • @@ -46,23 +52,24 @@
  • - - + + ANNO - -
  • -
    +
    LEVEL - + + LEVEL @@ -72,21 +79,52 @@
  • - -
  • - HIDDEN!='X' - + CODCMS - + DESCRIZ + + FASE + + + 100 + + + #RIC + + + #COSC01 + + + #COSC02 + + + #COSC03 + + + #COSC04 + + + #COSC05 + + + #COSC06 + + + #COS + + +
    @@ -95,11 +133,11 @@
    -
    - +
    + - - + + F2.101
  • @@ -108,18 +146,18 @@
  • - - + + F2.102
  • -
    - - +
    + + F3.101 @@ -129,7 +167,7 @@
  • -
  • USE SALDANA \ No newline at end of file