Patch level :10.0 306

Files correlati     :ca3.exe
Ricompilazione Demo : [ ]
Commento            :
gestione conti non riclassificati nella esportazione rendiconto


git-svn-id: svn://10.65.10.50/trunk@18889 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
luca 2009-05-20 11:36:38 +00:00
parent 798a82df2a
commit 273fe07c1d

View File

@ -243,6 +243,71 @@ TPrint_rendiconto_ca_mask::TPrint_rendiconto_ca_mask()
set_handlers();
}
///////////////////////////////////////////////////////////////
// TRiclass
///////////////////////////////////////////////////////////////
class TRiclass : public TCache
{
TString16 _prefix;
protected:
TObject* key2obj(const char* key);
public:
void set_prefix(const TString& p) { _prefix = p; }
bool is_riclassificato(const TString& str_conto) const;
TRiclass() : TCache(883) {}
};
TObject* TRiclass::key2obj(const char* key)
{
CHECK(_prefix.full(), "Empty pconana prefix");
const TFixed_string str_conto(key);
TRelation panarel(LF_PANAPDC);
TString filter;
filter << '(' << PANAPDC_CODCONTO << "[1," << _prefix.len() << "]==\"" << _prefix << "\")";
TRectype& fromto = panarel.curr();
if (str_conto.len() >= 3)
fromto.put(PANAPDC_GRUPPO, str_conto.left(3));
if (str_conto.len() >= 6)
fromto.put(PANAPDC_CONTO, str_conto.mid(3,3));
else
filter << "&&(" << PANAPDC_CONTO << "=\"\")";
if (str_conto.len() >= 12)
fromto.put(PANAPDC_SOTTOCONTO, str_conto.mid(6,6));
else
filter << "&&(" << PANAPDC_SOTTOCONTO << "=\"\")";
TCursor panacur(&panarel, filter, 2, &fromto, &fromto);
bool ok = panacur.items() > 0;
return new real(ok ? UNO : ZERO);
}
//cerca se str_conto è riclassificato
bool TRiclass::is_riclassificato(const TString& str_conto) const
{
TString80 codice = str_conto;
const real* o = (const real*)((TRiclass*)this)->objptr(codice); //Allah!!!
if (o->is_zero() && codice.len() == 12)
{
codice.cut(6);
o = (const real*)((TRiclass*)this)->objptr(codice); //Budda!!!
}
if (o->is_zero() && codice.len() == 6)
{
codice.cut(3);
o = (const real*)((TRiclass*)this)->objptr(codice); //Jeowah!!!
}
return !o->is_zero();
}
///////////////////////////////////////////////////////////////
// RECORDSET
@ -258,6 +323,7 @@ class TPrint_rendiconto_ca_recordset : public TISAM_recordset
bool _implode_rows;
TString _prefix;
TAssoc_array _ratrisc;
TRiclass _ricl;
protected:
int _anno;
@ -289,8 +355,8 @@ public: //da libreria
public:
void set_filter(const TPrint_rendiconto_ca_mask& msk, int cms_row, TLog_report& log);
void set_cms_cdc_fase(const char* cdc, const char* cms, const char* fase);
real get_budget(const TString& conto, char tipo) const; //per la stampa
void get_budget(const TString& codcdc, const TString& codcms, const TString& codfase,
real get_budget_print(const TString& conto, char tipo) const; //per la stampa
void get_budget_export(const TString& codcdc, const TString& codcms, const TString& codfase,
TImporto& att, TImporto& pas, TImporto& cos, TImporto& ric) const; //per l'esportazione
@ -372,8 +438,8 @@ void TPrint_rendiconto_ca_recordset::set_cms_cdc_fase(const char* cdc, const cha
_codfas = fase;
}
void TPrint_rendiconto_ca_recordset::get_budget(const TString& codcdc, const TString& codcms, const TString& codfase,
TImporto& att, TImporto& pas, TImporto& cos, TImporto& ric) const
void TPrint_rendiconto_ca_recordset::get_budget_export(const TString& codcdc, const TString& codcms, const TString& codfase,
TImporto& att, TImporto& pas, TImporto& cos, TImporto& ric) const
{
TString query;
query << "USE SALDANA\nSELECT ";
@ -388,7 +454,11 @@ void TPrint_rendiconto_ca_recordset::get_budget(const TString& codcdc, const TSt
TISAM_recordset saldana(query);
for (bool ok = saldana.move_first(); ok; ok = saldana.move_next())
{
const TAnal_bill zio(saldana.get("CONTO").as_string());
const TString80 str_conto = saldana.get("CONTO").as_string();
if (_riclassificato && !_ricl.is_riclassificato(str_conto))
continue;
const TAnal_bill zio(str_conto);
const int indbil = zio.indicatore_bilancio();
TImporto saldo = ca_get_imp(saldana, SALDANA_SEZIONEP, SALDANA_SALDOP);
@ -412,7 +482,7 @@ void TPrint_rendiconto_ca_recordset::get_budget(const TString& codcdc, const TSt
}
//sconvolgente metodo per la normalizzazione dei conti
real TPrint_rendiconto_ca_recordset::get_budget(const TString& conto, char tipo) const
real TPrint_rendiconto_ca_recordset::get_budget_print(const TString& conto, char tipo) const
{
//data del cazzo che però serve per costruire il conto analitico
const TDate null_date;
@ -507,13 +577,13 @@ const TVariant& TPrint_rendiconto_ca_recordset::get(const char* column_name) con
{
//stessa cosa del precedente ma per movimenti di tipo variazione preventivo
const TString& conto = TISAM_recordset::get("CONTO").as_string();
return get_tmp_var() = get_budget(conto, 'P');
return get_tmp_var() = get_budget_print(conto, 'P');
}
if (strcmp(column_name, "#VARIAZIONE") == 0)
{
//prende il conto
const TString& conto = TISAM_recordset::get("CONTO").as_string();
return get_tmp_var() = get_budget(conto, 'V');
return get_tmp_var() = get_budget_print(conto, 'V');
}
}
return TISAM_recordset::get(column_name);
@ -541,7 +611,7 @@ const TString& TPrint_rendiconto_ca_recordset::riclassifica(const TBill& zio, TR
da_panapdc.put(PANAPDC_GRUPPO, zio.gruppo());
TString filtro;
if (_prefix.not_empty())
if (_prefix.full())
filtro << "(CODCONTO[1," << _prefix.len() << "]=='" << _prefix << "')";
TCursor cur_panapdc(&rel_panapdc, filtro, 2, &da_panapdc, &da_panapdc);
@ -1586,11 +1656,12 @@ void TPrint_rendiconto_ca_recordset::set_filter(const TPrint_rendiconto_ca_mask&
for (short id = F_PRE1; id <= F_PRE3 && msk.id2pos(id) > 0; id++)
{
const TString& pr = msk.get(id);
if (pr.not_empty())
if (pr.full())
_prefix << pr;
else
break;
}
_ricl.set_prefix(_prefix);
}
//c'e' un range di conti da considerare?
@ -1814,9 +1885,9 @@ void TPrint_rendiconto_ca::esporta_csv(TPrint_rendiconto_ca_recordset& rendy, co
//calcolatore dei saldi: va fatta attraverso i saldi!!! perchè i budget sono multianno
TImporto att, pas, ric, cos;
if (first_level == LF_CDC)
rendy.get_budget(curr_codice, codcms, codfas, att, pas, cos, ric);
rendy.get_budget_export(curr_codice, codcms, codfas, att, pas, cos, ric);
else
rendy.get_budget(codcdc, curr_codice, codfas, att, pas, cos, ric);
rendy.get_budget_export(codcdc, curr_codice, codfas, att, pas, cos, ric);
//aggiunge i valori dei saldi all'array con gli importi; li mette nella colonna [0] che è quella dei budget..
//..e nella riga corrispondente all'indicatore bilancio