Patch level :

Files correlati     :
Ricompilazione Demo : [ ]
Commento            :


git-svn-id: svn://10.65.10.50/branches/R_10_00@20768 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
luca 2010-08-05 16:26:10 +00:00
parent 6f878ccd48
commit 2b90198db0
3 changed files with 174 additions and 105 deletions

View File

@ -108,6 +108,7 @@ static int compare_by_fase(TSheet_field & s, int r1, int r2)
class TVariazione_budget_mask : public TAutomask
{
bool _dirty;
bool _exclude_fasi;
//posizioni dei vari campi dello sheet: vengono assegnati nel costruttore
int _pos_cms, _pos_check, _pos_cdc, _pos_fase, _pos_conto, _pos_datacomp, _pos_autofcomp, _pos_datafcomp,
_pos_cosric, _pos_imp, _pos_prev, _pos_mat, _pos_ipg, _pos_descr, _pos_numreg, _pos_numrig, _pos_tipomov;
@ -124,6 +125,7 @@ protected:
void calcola_impegnato(const TString& cms, const bool include_cms_supp, TSheet_field& sf_righe); //(load()) aggiunge il valore dell'impegnato nella colonna corrispondente
TToken_string& add_rmovana(const TRectype& movana, const TRectype& rmovana, TSheet_field& sf_righe); //(load_rmovana()) metodo di basso livello..
//..per caricare fisicamente le righe sullo sheet
bool find_conto_rigadoc(const TRiga_documento& rigadoc, const char tipocf, TBill& zio) const; //trova il conto collegato ad una rigadoc e lo sbatte in zio (calcola_impegnato())
bool one_checked() const; //(on_field) controlla se nella colonna dei check ce ne è almeno 1 checkato
void check_all(const bool checked); //(on_field) checka-dechecka la colonna dei check
@ -136,7 +138,7 @@ protected:
void trova_cms_supporto(const TString& codcms); //(load(),on_field()) riempie la lista con le commesse di supporto valide
int trova_riga_sullo_sheet(TSheet_field& sf_righe, const TString& cms, const TString& cdc,
const TString& conto, const TString& fase, const bool exclude_fasi);
const TString& conto, const TString& fase);
void aggiorna_saldi_preventivi(TSheet_field& sf_righe, const int curr_riga); //(load()) crea i saldi preventivi in base agli importi
bool save_commessa(); //(save()) salva i cambiamenti di date della commessa esaminata
@ -156,14 +158,25 @@ TVariazione_budget_mask::TVariazione_budget_mask() : TAutomask ("ps1001300a")
TConfig ditta_ini(CONFIG_DITTA, "ps1001");
set(F_CODCAUS, ditta_ini.get("CodCaus"), 0x3);
set(F_INCLUDESUPP, ditta_ini.get_bool("InclSupp"));
set(F_EXCLUDEFASI, ditta_ini.get_bool("ExclFasi"));
//controlla se può usare le fasi o no, in base alla configurazione analitica di ditta
//le fasi devono essere escluse se non sono obbligatorie nella configurazione dei movimenti di analitica!
TConfig& caconfig = ca_config();
_exclude_fasi = !caconfig.get_bool("FscRequired");
//se le fasi non vanno considerate -> deve sparire la colonna corrispondente sullo sheet!
TSheet_field& sf_righe = sfield(F_RIGHE);
_pos_fase = sf_righe.cid2index(S_FASE);
if (_exclude_fasi)
{
sf_righe.delete_column(_pos_fase);
_pos_fase = -1;
}
//setta le posizioni dei campi dello sheet
TSheet_field& sf_righe = sfield(F_RIGHE);
_pos_check = sf_righe.cid2index(S_CHECK);
_pos_cms = sf_righe.cid2index(S_CMS);
_pos_cdc = sf_righe.cid2index(S_CDC);
_pos_fase = sf_righe.cid2index(S_FASE);
_pos_conto = sf_righe.cid2index(S_CONTO);
_pos_datacomp = sf_righe.cid2index(S_DATACOMP);
_pos_autofcomp = sf_righe.cid2index(S_AUTOFCOMP);
@ -177,6 +190,8 @@ TVariazione_budget_mask::TVariazione_budget_mask() : TAutomask ("ps1001300a")
_pos_numreg = sf_righe.cid2index(S_NUMREG);
_pos_numrig = sf_righe.cid2index(S_NUMRIG);
_pos_tipomov = sf_righe.cid2index(S_TIPOMOV);
}
TVariazione_budget_mask::~TVariazione_budget_mask()
@ -185,7 +200,6 @@ TVariazione_budget_mask::~TVariazione_budget_mask()
TConfig ditta_ini(CONFIG_DITTA, "ps1001");
ditta_ini.set("CodCaus", get(F_CODCAUS));
ditta_ini.set("InclSupp", get_bool(F_INCLUDESUPP));
ditta_ini.set("ExclFasi", get_bool(F_EXCLUDEFASI));
}
//crea la chiave cdc/fase/conto
@ -858,7 +872,7 @@ void TVariazione_budget_mask::trova_cms_supporto(const TString& codcms)
int TVariazione_budget_mask::trova_riga_sullo_sheet(TSheet_field& sf_righe, const TString& cms, const TString& cdc,
const TString& conto, const TString& fase, const bool exclude_fasi)
const TString& conto, const TString& fase)
{
int index = -1;
//cerca una riga con la medesima chiave sullo sheet
@ -879,7 +893,7 @@ int TVariazione_budget_mask::trova_riga_sullo_sheet(TSheet_field& sf_righe, cons
if (conto != cod_row)
continue;
if (!exclude_fasi)
if (!_exclude_fasi)
{
cod_row = row.get(_pos_fase);
cod_row.trim();
@ -901,11 +915,10 @@ TToken_string& TVariazione_budget_mask::add_rmovana(const TRectype& movana, cons
TString80 fase = rmovana.get(RMOVANA_CODFASE);
int index = -1;
const bool exclude_fasi = get_bool(F_EXCLUDEFASI);
if (exclude_fasi)
if (_exclude_fasi)
{
fase.cut(0);
index = trova_riga_sullo_sheet(sf_righe, cms, cdc, conto, fase, exclude_fasi);
index = trova_riga_sullo_sheet(sf_righe, cms, cdc, conto, fase);
}
TToken_string& row = sf_righe.row(index);
@ -1066,7 +1079,6 @@ int TVariazione_budget_mask::load_saldana(const TString& cms, const long max_num
TAssoc_array chiavi_saldana;
TToken_string chiave;
const bool exclude_fasi = get_bool(F_EXCLUDEFASI); //si vogliono escludere le fasi dalle chiavi di riga?
//riempie l'assoc_array conto/cdc/cms/fase/saldo
for (bool ok = saldana.move_first(); ok; ok = saldana.move_next())
@ -1084,7 +1096,7 @@ int TVariazione_budget_mask::load_saldana(const TString& cms, const long max_num
chiave.add(cdc);
chiave.add(cms);
//le fasi vanno aggiunte alla chiave solo se specificato (Adolf rikiesten 20/07/2010)
if (!exclude_fasi)
if (!_exclude_fasi)
chiave.add(fase);
//se non trova la chiave la aggiunge
@ -1136,14 +1148,14 @@ int TVariazione_budget_mask::load_saldana(const TString& cms, const long max_num
const TString80 cdc = key_bill.get(1);
const TString80 cms = key_bill.get(2);
TString16 fase;
if (!exclude_fasi)
if (!_exclude_fasi)
fase << key_bill.get(3);
TToken_string& row = sf_righe.row(-1);
row.add(cms, _pos_cms);
row.add(cdc, _pos_cdc);
if (!exclude_fasi)
if (!_exclude_fasi)
row.add(fase, _pos_fase);
row.add(conto, _pos_conto);
@ -1180,10 +1192,79 @@ int TVariazione_budget_mask::load_saldana(const TString& cms, const long max_num
}
bool TVariazione_budget_mask::find_conto_rigadoc(const TRiga_documento& rigadoc, const char tipocf, TBill& zio) const
{
int gr = 0, co = 0;
long so = 0L;
TString80 codart = rigadoc.get(RDOC_CODARTMAG);
if (codart.empty())
codart = rigadoc.get(RDOC_CODART);
if (rigadoc.is_merce())
{
//deve ricavare anche il conto attraverso il codart, sennò non riesce a completare la chiave dello sheet
const TRectype& rec_anamag = cache().get(LF_ANAMAG, codart);
if (!rec_anamag.empty())
{
if (tipocf == 'F')
{
gr = rec_anamag.get_int(ANAMAG_GRUPPOA);
co = rec_anamag.get_int(ANAMAG_CONTOA);
so = rec_anamag.get_long(ANAMAG_SOTTOCA);
}
else
{
gr = rec_anamag.get_int(ANAMAG_GRUPPOV);
co = rec_anamag.get_int(ANAMAG_CONTOV);
so = rec_anamag.get_long(ANAMAG_SOTTOCV);
}
}
} else
if (rigadoc.is_prestazione())
{
const TRectype& rec_tab_prs = cache().get("PRS", codart);
if (!rec_tab_prs.empty())
{
if (tipocf == 'F')
{
gr = rec_tab_prs.get_int("I3");
co = rec_tab_prs.get_int("I4");
so = rec_tab_prs.get_long("I5");
}
else
{
gr = rec_tab_prs.get_int("I0");
co = rec_tab_prs.get_int("I1");
so = rec_tab_prs.get_long("I2");
}
}
}
if (so <= 0 && codart.find('*') > 0)
{
TToken_string cazzo_codart(codart, '*');
gr = cazzo_codart.get_int(0);
co = cazzo_codart.get_int(1);
so = cazzo_codart.get_long(2);
}
//se il conto non è completo non può riuscire a piazzare il valore dell'impegnato in una riga dello sheet..
//..in quanto la chiave di riga risulta comunque incompleta nel conto! Quindi prosegue con la riga dopo
if (so <= 0)
return false;
else
{
zio.set(gr, co, so);
return true;
}
}
void TVariazione_budget_mask::calcola_impegnato(const TString& cms, const bool include_cms_supp, TSheet_field& sf_righe)
{
const bool exclude_fasi = get_bool(F_EXCLUDEFASI);
//trova tutte le numerazioni di tipo ordine valide in base ai tipi documento ordine (metodo di velib01 preso da ca3883)
//solo le numerazioni con almeno un tipo documento ordine interessano
TString_array num_ordini, tip_ordini;
@ -1199,14 +1280,22 @@ void TVariazione_budget_mask::calcola_impegnato(const TString& cms, const bool i
const TDate data_fine_cms = get_date(F_DATAFINECMS);
const int a_anno = data_fine_cms.year();
//simpatica progind per intrattenere l'utonto
TProgind pi(numerazioni_tipo_ordine, "Calcolo dell'impegnato...", true, true);
for (int n = 0; n < numerazioni_tipo_ordine; n++)
{
//aggiornamento progind intrattenitiva
if (!pi.addstatus(1))
break;
const TString4 codnum = num_ordini.row(n);
//cerca tutte le righe documento che soddisfano i numerosi parametri
TString query;
query << "USE RDOC";
query << "\nSELECT (RIGAEVASA!=\"X\")&&(";
query << "\nSELECT (";
//query << "\nSELECT (RIGAEVASA!=\"X\")&&("; originale con solo righe inevase
FOR_EACH_TOKEN(_cms_supporto, codcms)
query << "(CODCMS==\"" << codcms << "\")||";
query.rtrim(2);
@ -1221,20 +1310,17 @@ void TVariazione_budget_mask::calcola_impegnato(const TString& cms, const bool i
recset.set_var("#AANNO", (long)a_anno);
const TRecnotype recset_items = recset.items();
//simpatica progind per intrattenere l'utonto
TProgind pi(recset_items, "Calcolo dell'impegnato...", true, true);
//memorizza l'ultimo doc per evitare doppioni in caso di doc con più righe (rielaborerebbe..
//..lo stesso documento tante volte quante sono le sue righe!)
TString old_key;
TString16 last_conto, last_fase; //contatori interni ad un documento che serve per legare le righe spese% con le righe prestazioni..
TString80 last_cdc; //..distruggono la supersimmetria del programma ma le righe spese% non hanno in genere conti associati
//deve controllare che le righe appartengano a documenti di TIPO valido (il filtro è stato sulle numerazioni,..
//..quindi ci potrebbero essere finiti dentro tipi non desiderati)
for (bool ok = recset.move_first(); ok; ok = recset.move_next()) //giro sulle varie rdoc...
{
//aggiornamento progind intrattenitiva
if (!pi.addstatus(1))
break;
const TRectype& curr_doc = recset.cursor()->curr(LF_DOC);
//controlla se il documento contenente la riga è davvero un ordine ricontrollando il suo tipo nell'array..
@ -1243,9 +1329,9 @@ void TVariazione_budget_mask::calcola_impegnato(const TString& cms, const bool i
if (tip_ordini.find(tipodoc) < 0)
continue;
//ovviamente non è finita qui...
//la riga documento non deve risultare contabilizzata! infatti, se lo fosse, i suoi valori apparirebbero..
//..nella sezione delle rmovana
//..nella sezione delle rmovana (è pressochè impossibile che un ordine venga contabilizzato, ma le vie di..
//..Dinamica sono infinite..
const long numregca = curr_doc.get_long(DOC_NUMREGCA);
//se la rigadoc non è stata contabilizzata..
if (numregca == 0)
@ -1255,93 +1341,82 @@ void TVariazione_budget_mask::calcola_impegnato(const TString& cms, const bool i
if (curr_key == old_key)
continue;
else
{
old_key = curr_key;
last_conto.cut(0);
last_cdc.cut(0);
last_fase.cut(0);
}
//crea il documento virtuale in memoria; se non è ordine oppure lo è ma è già evaso, lo saltiamo!!! ole'!
//crea il documento virtuale in memoria; se non è ordine lo saltiamo!!! ole'!
TDocumento doc(curr_doc);
if (!doc.is_ordine() || doc.is_evaso())
if (!doc.is_ordine())
continue;
const char tipocf = doc.tipocf();
//il documento virtuale è adesso un ordine non evaso
//tarocchiamo il documento prendendo solo le righe non evase (almeno una ci sarà, perchè la query del recordset..
//..richiedeva che la rigadoc fosse non evasa, quindi quella riga nel doc esiste, magari in compagnia di altre)
for (int r = doc.body().last_row(); r > 0; r = doc.body().pred_row(r))
FOR_EACH_PHYSICAL_RDOC(doc, r, rigadoc_ptr)
{
TRiga_documento& rigadoc = doc[r];
TRiga_documento& rigadoc = *rigadoc_ptr;
//trattamento delle righe non evase di tipo merce o prestazione
if (rigadoc.is_merce() || rigadoc.is_prestazione())
if (rigadoc.is_merce() || rigadoc.is_prestazione() || rigadoc.is_spese())
{
if (!rigadoc.is_evasa())
const TString80 rigadoc_cms = rigadoc.codice_commessa();
if (_cms_supporto.get_pos(rigadoc_cms) >= 0) //deve avere commessa valida!!!
{
const TString80 rigadoc_cms = rigadoc.codice_commessa();
if (_cms_supporto.get_pos(rigadoc_cms) >= 0) //deve avere commessa valida!!!
//è inutile fare un sacco di conti su una riga senza valore!
const real valore = rigadoc.importo(true, true, AUTO_DECIMALS);
if ((rigadoc.is_merce() || rigadoc.is_prestazione()) && valore.is_zero())
continue;
TString16 rigadoc_conto, rigadoc_fase;
TString80 rigadoc_cdc;
//se la riga è di tipo spese (quindi non ha un conto associabile che ci permetta di posizionarne l'importo sullo..
//..sheet, in quanto la chiave sarebbe incompleta del conto) si provvede ad associarla all'ultima riga buona del documento..
//..in esame
if (rigadoc.is_spese())
{
rigadoc_conto = last_conto;
rigadoc_cdc = last_cdc;
if (!_exclude_fasi)
rigadoc_fase = last_fase;
}
else
{
//deve ricavare anche il conto attraverso il codart, sennò non riesce a completare la chiave dello sheet
int gr = 0, co = 0;
long so = 0L;
TString80 codart = rigadoc.get(RDOC_CODARTMAG);
if (codart.empty())
codart = rigadoc.get(RDOC_CODART);
const TRectype& rec_anamag = cache().get(LF_ANAMAG, codart);
if (rec_anamag.empty())
TBill zio;
if (find_conto_rigadoc(rigadoc, tipocf, zio))
{
TToken_string cazzo_codart(codart, '*');
gr = cazzo_codart.get_int(0);
co = cazzo_codart.get_int(1);
so = cazzo_codart.get_long(2);
rigadoc_conto.format("%03d%03d%06ld", zio.gruppo(), zio.conto(), zio.sottoconto());
if (rigadoc_conto == "004001000073")
int cazzone = 1;
//cdc
rigadoc_cdc = rigadoc.codice_costo();
//eventuale fase
if (!_exclude_fasi)
rigadoc_fase = rigadoc.fase_commessa();
}
else
{
if (tipocf == 'F')
{
gr = rec_anamag.get_int(ANAMAG_GRUPPOA);
co = rec_anamag.get_int(ANAMAG_CONTOA);
so = rec_anamag.get_long(ANAMAG_SOTTOCA);
}
else
{
gr = rec_anamag.get_int(ANAMAG_GRUPPOV);
co = rec_anamag.get_int(ANAMAG_CONTOV);
so = rec_anamag.get_long(ANAMAG_SOTTOCV);
}
}
//se il conto non è completo non può riuscire a piazzare il valore dell'impegnato in una riga dello sheet..
//..in quanto la chiave di riga risulta comunque incompleta nel conto! Quindi prosegue con la riga dopo
if (so <= 0)
continue;
//conto
TString16 rigadoc_conto;
rigadoc_conto.format("%03d%03d%06ld", gr, co, so);
//cdc
const TString80 rigadoc_cdc = rigadoc.codice_costo();
//eventuale fase
TString16 rigadoc_fase;
if (!exclude_fasi)
rigadoc_fase = rigadoc.fase_commessa();
}
//cerca una riga con la medesima chiave sullo sheet
const int index = trova_riga_sullo_sheet(sf_righe, rigadoc_cms, rigadoc_cdc, rigadoc_conto, rigadoc_fase);
if (index >= 0)
{
TToken_string& row = sf_righe.row(index);
real row_valore_impegnato = row.get(_pos_ipg);
row_valore_impegnato += valore;
row.add(row_valore_impegnato.string(), _pos_ipg);
last_conto = rigadoc_conto;
last_cdc = rigadoc_cdc;
last_fase = rigadoc_fase;
}
//cerca una riga con la medesima chiave sullo sheet
int index = trova_riga_sullo_sheet(sf_righe, rigadoc_cms, rigadoc_cdc, rigadoc_conto, rigadoc_fase, exclude_fasi);
if (index >= 0)
{
//trasforma tutte le righe a valore, assegnando al prezzo il valore del residuo
//const real valore = rigadoc.valore(true, false, AUTO_DECIMALS);
const real residuo = rigadoc.valore(false, false, AUTO_DECIMALS);
} //if (rigadoc.codice_commessa()...
if (!residuo.is_zero())
{
TToken_string& row = sf_righe.row(index);
real row_valore_impegnato = row.get(_pos_ipg);
row_valore_impegnato += residuo;
row.add(row_valore_impegnato.string(), _pos_ipg);
}
}
} //if (rigadoc.codice_commessa()...
} //if (!rigadoc.is_evasa())..
} //if (rigadoc.is_merce()
} //for (int r = doc.body().last_row()
} //if (numregca == 0)...

View File

@ -6,7 +6,6 @@
#define F_PROROGATA 205
#define F_DATAPRORCMS 206
#define F_INCLUDESUPP 207
#define F_EXCLUDEFASI 208
#define F_DATAREG 209
#define F_CODCAUS 210
#define F_DESCAUS 211

View File

@ -55,7 +55,7 @@ ENDPAGE
PAGE "Gestione Budget" 0 2 0 0
GROUPBOX DLG_NULL 78 6
GROUPBOX DLG_NULL 78 5
BEGIN
PROMPT 0 0 "@bCommessa"
END
@ -119,26 +119,21 @@ BEGIN
PROMPT 1 3 "Includere le righe con commesse di supporto"
END
BOOLEAN F_EXCLUDEFASI
BEGIN
PROMPT 1 4 "Non considerare le fasi nei consuntivi"
END
GROUPBOX DLG_NULL 78 3
BEGIN
PROMPT 0 6 "@bParametri movimenti analitici da generare"
PROMPT 0 5 "@bParametri movimenti analitici da generare"
END
DATE F_DATAREG
BEGIN
PROMPT 1 7 "Data reg. "
PROMPT 1 6 "Data reg. "
CHECKTYPE REQUIRED
FLAGS "A"
END
STRINGA F_CODCAUS 3
BEGIN
PROMPT 24 7 "Causale "
PROMPT 24 6 "Causale "
USE LF_CAUSALI SELECT MOVIND!=""
INPUT CODCAUS F_CODCAUS
DISPLAY "Codice" CODCAUS
@ -151,7 +146,7 @@ END
STRINGA F_DESCAUS 50 37
BEGIN
PROMPT 38 7 ""
PROMPT 38 6 ""
USE LF_CAUSALI KEY 2 SELECT MOVIND!=''
INPUT DESCR F_DESCAUS
DISPLAY "Descrizione@50" DESCR
@ -162,7 +157,7 @@ END
TEXT DLG_NULL
BEGIN
PROMPT -11 9 "@bRighe movimenti di budget e saldi consuntivi"
PROMPT -11 8 "@bRighe movimenti di budget e saldi consuntivi"
END
SPREADSHEET F_RIGHE