Patch level :10.0 4.0 882

Files correlati     :
Ricompilazione Demo : [ ]
Commento            :aggiunta trattazione dei movimenti con conti non riclassificati (FDE/FDR). Heil Magnavakken!


git-svn-id: svn://10.65.10.50/trunk@16158 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
luca 2008-02-13 12:09:52 +00:00
parent 43109efeaf
commit dd9c23801a

@ -69,6 +69,7 @@ bool TPrint_rendiconto_ca_mask::on_field_event(TOperable_field& o, TField_event
{
switch (o.dlg())
{
#ifndef DBG
case F_RIGHE:
if (e == fe_init) //azzera le righe dello sheet con le commesse ad inizio programma
{ //esplicita e bizzarra richiesta del CRPA
@ -77,6 +78,7 @@ bool TPrint_rendiconto_ca_mask::on_field_event(TOperable_field& o, TField_event
s.force_update();
}
break;
#endif
case F_DATAINI:
case F_DATAFIN:
if (e == fe_close)
@ -260,7 +262,8 @@ protected:
void scrive_riga(const TRectype& rmovana, const TRectype& movana, const TDocumento* doc);
void scrive_riga_speciale(const TDocumento* doc, const TString_array& special_docs);
int sort_indbil(int indbil) const;
TString riclassifica(const int gruppo, const int conto, const long sottoconto, TRectype& tmpcurr);
const TString& riclassifica(const TBill& zio, TRectype& tmpcurr) const;
const TString& riclassifica(const TString& contone, TRectype& tmpcurr) const;
real get_budget(const TString& conto, char tipo) const;
bool is_causale_rateo_risconto(const char* codcaus);
@ -467,8 +470,7 @@ int TPrint_rendiconto_ca_recordset::sort_indbil(int indbil) const
}
TString TPrint_rendiconto_ca_recordset::riclassifica(const int gruppo, const int conto,
const long sottoconto, TRectype& tmpcurr)
const TString& TPrint_rendiconto_ca_recordset::riclassifica(const TBill& zio, TRectype& tmpcurr) const
{
TString conto_riclassificato;
//relazione e cursore su panapdc alla ricerca del conto riclassificato corrispondente
@ -476,7 +478,7 @@ TString TPrint_rendiconto_ca_recordset::riclassifica(const int gruppo, const int
TRelation rel_panapdc(LF_PANAPDC);
//servono solamente i record con il gruppo = al gruppo di rmovana
TRectype da_panapdc(LF_PANAPDC);
da_panapdc.put(PANAPDC_GRUPPO, gruppo);
da_panapdc.put(PANAPDC_GRUPPO, zio.gruppo());
TString filtro;
if (_prefix.not_empty())
@ -499,13 +501,13 @@ TString TPrint_rendiconto_ca_recordset::riclassifica(const int gruppo, const int
tmpcurr.put("CONTO", conto_riclassificato);
break; //esce dal casino e passa ai campi successivi
}
else if (conto == current_conto && current_sottoconto == 0)
else if (zio.conto() == current_conto && current_sottoconto == 0)
{
conto_riclassificato = rec_panapdc.get(PANAPDC_CODCONTO);
tmpcurr.put("CONTO", conto_riclassificato);
break; //esce dal casino e passa ai campi successivi
}
else if (conto == current_conto && sottoconto == current_sottoconto)
else if (zio.conto() == current_conto && zio.sottoconto() == current_sottoconto)
{
conto_riclassificato = rec_panapdc.get(PANAPDC_CODCONTO);
tmpcurr.put("CONTO", conto_riclassificato);
@ -522,7 +524,18 @@ TString TPrint_rendiconto_ca_recordset::riclassifica(const int gruppo, const int
(_aconto.not_empty() && conto_riclassificato.compare(_aconto, _aconto.len()) > 0))
return EMPTY_STRING;
return conto_riclassificato;
return get_tmp_string() = conto_riclassificato;
}
const TString& TPrint_rendiconto_ca_recordset::riclassifica(const TString& contone, TRectype& tmpcurr) const
{
CHECK(contone.len() == 12, "Conto di lunghezza assurda");
const int gruppo = atoi(contone.left(3));
const int conto = atoi(contone.mid(3,3));
const long sottoconto = atol(contone.mid(6,6));
const TBill zio(gruppo, conto, sottoconto);
return riclassifica(zio, tmpcurr);
}
static int bill2indbil(const TString& codconto, bool is_anal)
@ -563,49 +576,44 @@ void TPrint_rendiconto_ca_recordset::scrive_riga(const TRectype& rmovana, const
TString codconto = rmovana.get(RMOVANA_CODCONTO);
TString codcontocg;
int indbil = 0;
bool conto_non_riclass = false; //indicatore che serve per tener conto di specialissimi conti del CRPA...
//E' una lampante dimostrazione di quanto sia generico questo programma...
// il conto puo' essere analitico o contabile...
//se è compilato l'archivio di collegamento PANAPDC..
//..si deve usare come conto il campo codconto del panapdc!!!...
//Ricordare ch SOLO se si ha un conto contabile e' possibile riclassificare in analitico!!!
//Ricordare che SOLO se si ha un conto contabile e' possibile riclassificare in analitico!!!
if (_riclassificato) //traduzione:sei il CRPA/CSA
{
//prende il gr/co/so dalla riga rmovana in esame
const int gruppo = atoi(codconto.left(3));
const int conto = atoi(codconto.mid(3,3));
const long sottoconto = atol(codconto.mid(6,6));
//stringa che conterrà il conto riclassificato (se sara' trovato)
const TString conto_riclassificato = riclassifica(gruppo, conto, sottoconto, tmpcurr);
const TString conto_riclassificato = riclassifica(codconto, tmpcurr);
//se il conto viene ritornato vuoto significa che non ricade nell'intervallo dei conti..
//..riclassificati selezionato dall'utente..
if (conto_riclassificato.empty())
return;
//..senno' lo scrive come conto riclassificato
codcontocg = codconto;
codconto = conto_riclassificato;
indbil = bill2indbil(codcontocg, false);
//..riclassificati selezionato dall'utente...non puo' essere scartato a priori perche' puo'..
//..essere un conto speciale del CRPA
codcontocg = codconto;
indbil = bill2indbil(codcontocg, false);
} //if(_riclassificato)
if (conto_riclassificato.empty())
{
conto_non_riclass = true;
codconto.cut(0);
}
else //..senno' lo scrive come conto riclassificato
codconto = conto_riclassificato;
} //if(_riclassificato) Se non e' un conto riclassificato -> analitico puro o contabile puro
else //...sennò si usano..
{
if (_piano == "A") //..il normale piano dei conti analitico..
if (_piano == "A") //..il normale piano dei conti analitico.. Conto analitico puro
indbil = bill2indbil(codconto, true);
else //..o il normale piano dei conti contabile
else //..o il normale piano dei conti contabile Conto contabile puro
{
codcontocg = codconto;
indbil = bill2indbil(codcontocg, false);
}
}
//mette i conti nel file (se piano dei conti puramente contabile i valori coincidono)
tmpcurr.put("CONTO", codconto); //conto
tmpcurr.put("CONTOCG", codcontocg); //conto_cg
//fa il sort l'indicatore di bilancio del conto e lo utilizza per ordinare i record nel file..
//..di appoggio;se sei del CRPA/CSA vuoi i costi dopo i ricavi!
const int ordcont = sort_indbil(indbil);
tmpcurr.put("ORDCONT", ordcont);
//La scrittura dei conti su tmpcurr e' rinviata in fondo al metodo...
//---- FINE CONTI ----//
//---- DOC D'ORIGINE DELL' ANALMOV ----//
@ -700,6 +708,46 @@ void TPrint_rendiconto_ca_recordset::scrive_riga(const TRectype& rmovana, const
const long ndoc = babbo->get_long(RDOC_NDOC);
rif.cut(0) << babbo_codnum << '-' << anno << '-' << ndoc;
//caso particolare dei conti del CRPA. Se il conto non e' riclassificato (ma siamo in presenza..
//.di un piano dei conti riclassificato)...
if (conto_non_riclass)
{
//Controlla se il documento di origine (padre del documento da cui deriva l'attuale riga..
//..di analitica) era una FDR/FDE...
const TCodice_numerazione& kodice_num = TDocumento::codice_numerazione(babbo_codnum);
//Se lo era...
if (kodice_num.fattura_emettere_ricevere())
{
//Ricrea il documento origine
TDocumento doc_babbo('D', anno, babbo_codnum, ndoc);
//elaborazione analitica del documento originale
TContabilizzazione_analitica cont_anal;
TAnal_mov mov_babbo;
//se riesce a contabilizzare il documento origine (si spera, senno' so' cazzi!)..
cont_anal.elabora(doc_babbo, 0, NULL, false, mov_babbo);
if (mov_babbo.rows() > 0)
{
const int anal_rows = mov_babbo.rows();
for (int k = 1; k <= anal_rows; k++)
{
//cerca la riga con il conto che gli serve e lo assegna a codconto, attualmente vuoto..
//..in quanto non e' stato riclassificato
const TRectype& mov_babbo_riga = mov_babbo.body()[k];
const TString& conto_babbo = mov_babbo_riga.get(RMOVANA_CODCONTO);
if (conto_babbo != codcontocg)
{
//ovviamente deve riclassificare il conto_babbo!
codconto = riclassifica(conto_babbo, tmpcurr);
indbil = bill2indbil(codconto, true);
break;
}
}
} //if (mov_babbo.rows() > 0)
}
else
continue;
}
if (riferimento.get_pos(rif) < 0) //il doc originale va aggiunto solo se non esiste gia'!
{
riferimento.add(rif);
@ -707,11 +755,21 @@ void TPrint_rendiconto_ca_recordset::scrive_riga(const TRectype& rmovana, const
tipo_babbo = doc_babbo.tipo_riclassificato(); //..il tipo documento..
}
} //if (babbo != NULL)..
}
} //if (codcms_rigadoc == codcms_rmovana..
} //for (int i..
tmpcurr.put("DOCORIG", riferimento); //documento di riferimento (mitologico documento originale)
//Scrittura dei conti (i valori delle variabili sono stati settati nella parte iniziale del metodo)
//mette i conti nel file (se piano dei conti puramente contabile i valori coincidono)
tmpcurr.put("CONTO", codconto); //conto
tmpcurr.put("CONTOCG", codcontocg); //conto_cg
//fa il sort l'indicatore di bilancio del conto e lo utilizza per ordinare i record nel file..
//..di appoggio;se sei del CRPA/CSA vuoi i costi dopo i ricavi!
const int ordcont = sort_indbil(indbil);
tmpcurr.put("ORDCONT", ordcont);
//---- FINE DOC ORIG DELL'ANALMOV ----//
/*[Tipo documento] //schema divino per destinare gli importi nei campi corretti
O=I**
@ -893,7 +951,7 @@ void TPrint_rendiconto_ca_recordset::scrive_riga_speciale(const TDocumento* doc,
if (contab.search_costo_ricavo(rigadoc, conto))
{
//stringa che conterrà il conto riclassificato (se sara' trovato)
codconto = riclassifica(conto.gruppo(), conto.conto(), conto.sottoconto(), tmpcurr);
codconto = riclassifica(conto, tmpcurr);
codcontocg = conto.string(0x8);
}
} //if(_riclassificato)
@ -1299,9 +1357,11 @@ void TPrint_rendiconto_ca_recordset::crea_righe_da_rdoc(const TPrint_rendiconto_
scrive_riga(rmov, mov, &doc); //documenti "normali"
} //for int j...
}
else
{
//righe di documento configurate come da emettere/ricevere (documenti speciali)
if (is_special_doc)
scrive_riga_speciale(&doc, num_fdr);
}
} //if (numregca==0...
} //if !curr_doc.empty()