Patch level :10.0

Files correlati     :
Ricompilazione Demo : [ ]
Commento            :
aggiunta la trattazione degli arrotondamenti


git-svn-id: svn://10.65.10.50/trunk@19471 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
luca 2009-10-19 15:43:15 +00:00
parent d01fb5405e
commit 0cf8d61a82

View File

@ -44,8 +44,10 @@ protected:
void add_art(); //aggiunge un articolo ai listini (on_field)
void save_listini(); //salva tutte le righe listini (padre e figli) così come sono sullo sheet (on_field)
real get_price(TSheet_field& sf, const int row, const int col) const;
void set_price(TSheet_field& sf, const int row, const int col, real& price);
real get_price(TSheet_field& sf, const int row, const short dlg_id) const;
void set_price(TSheet_field& sf, const int row, const short dlg_id, real& price);
void set_price(const short fld_id, real& price);
bool arrotonda(const short dlg_id, real& price);
void get_correct_grmerc(TString& grmerc, const bool asterisk) const;
virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
@ -201,9 +203,11 @@ void TAggiorna_listini_edit_mask::save_children_list()
//metodi F_MULTILISTINI
real TAggiorna_listini_edit_mask::get_price(TSheet_field& sf, const int row, const int col) const
//prende il prezzo del padre e sostituisce i '.' con le ','
real TAggiorna_listini_edit_mask::get_price(TSheet_field& sf, const int row, const short dlg_id) const
{
if (col == sf.cid2index(S2_PREZZO))
const int col = sf.cid2index(dlg_id);
if (dlg_id == S2_PREZZO)
{
TString16 str_prezzo = sf.cell(row, col);
str_prezzo.strip(".");
@ -213,9 +217,59 @@ real TAggiorna_listini_edit_mask::get_price(TSheet_field& sf, const int row, con
return real(sf.cell(row, col));
}
void TAggiorna_listini_edit_mask::set_price(TSheet_field& sf, const int row, const int col, real& price)
bool TAggiorna_listini_edit_mask::arrotonda(const short dlg_id, real& price)
{
TString str_arr;
const bool is_father_list = dlg_id == S2_PREZZO;
if (is_father_list)
{
str_arr = get(F_ARROTONDA);
}
else
{
TSheet_field& figli = sfield(F_LISTINI_FIGLI);
str_arr = figli.cell(dlg_id - S2_LIST1, figli.cid2index(S1_ARROTONDA));
}
str_arr.replace(',', '.');
const real num_arr = abs(real(str_arr));
if (!num_arr.is_zero())
{
price /= num_arr;
switch (str_arr[0])
{
case '+': price.ceil(); break;
case '-': price.floor(); break;
default : price.round(); break;
}
price *= num_arr;
}
else //se non specificato alcun arrotondamento usa quello standard dei prezzi
{
const TPrice p(price);
price = p.get_num();
}
return is_father_list;
}
void TAggiorna_listini_edit_mask::set_price(TSheet_field& sf, const int row, const short dlg_id, real& price)
{
const bool is_father_list = arrotonda(dlg_id, price);
const int prezzo_pos = sf.cid2index(dlg_id);
if (is_father_list)
sf.row(row).add(price.stringa(), prezzo_pos);
else
sf.row(row).add(price.string(), prezzo_pos);
}
void TAggiorna_listini_edit_mask::set_price(const short fld_id, real& price)
{
const bool is_father_list = arrotonda(fld_id, price);
if (is_father_list)
set(fld_id, price.stringa());
else
set(fld_id, price.string());
}
@ -354,7 +408,7 @@ void TAggiorna_listini_edit_mask::fill_multilistini_sheet()
//dati riga corrente
const TString& codart = recset_rows.get(RCONDV_CODRIGA).as_string();
const TString& um = recset_rows.get(RCONDV_UM).as_string();
const real prezzo = recset_rows.get(RCONDV_PREZZO).as_real();
real prezzo = recset_rows.get(RCONDV_PREZZO).as_real();
//cerca se esiste o se deve aggiungerla: la find_cor_add_odart restituisce il numero della riga alta..
//..(descrizione/um) del codart in questione (che starà la riga sotto, ovvero riga_alta+1)
const int riga_alta = find_or_add_codart(sf_multilistini, codart, um);
@ -363,21 +417,23 @@ void TAggiorna_listini_edit_mask::fill_multilistini_sheet()
//mette il prezzo al posto giusto (padre e figlio)
if (pos <= 0) //padre
{
const TPrice prezzo_base(prezzo);
sf_multilistini.row(riga_bassa).add(prezzo_base.string(true), prezzo_pos);
set_price(sf_multilistini, riga_bassa, S2_PREZZO, prezzo);
//il padre viene arrotondato al suo arrotondamento (se c'e')
//sf_multilistini.row(riga_bassa).add(prezzo.stringa(), prezzo_pos + pos);
}
else
{
//nella riga alta visualizza prezzo originale (no arrotondamento)
sf_multilistini.row(riga_alta).add(prezzo.string(), prezzo_pos + pos);
sf_multilistini.row(riga_bassa).add(prezzo.string(), prezzo_pos + pos);
real fath_prezzo = get_price(sf_multilistini, riga_bassa, prezzo_pos);
set_price(sf_multilistini, riga_bassa, S2_PREZZO + pos, prezzo);
real fath_prezzo = get_price(sf_multilistini, riga_bassa, S2_PREZZO);
//se il figlio ha un prezzo ma il padre no, ricalcola il valore dell'articolo nel padre usando il ricarico
if (fath_prezzo.is_zero())
{
TSheet_field& listini_figli = sfield(F_LISTINI_FIGLI);
const real ricarico = listini_figli.cell(pos - 1, listini_figli.cid2index(S1_RICARICO));
const TPrice prezzo_base(prezzo * CENTO / (CENTO + ricarico));
sf_multilistini.row(riga_bassa).add(prezzo_base.string(true), prezzo_pos);
real prezzo_base(prezzo * CENTO / (CENTO + ricarico));
set_price(sf_multilistini, riga_bassa, S2_PREZZO, prezzo_base);
}
}
} //for(bool ok..
@ -395,20 +451,18 @@ void TAggiorna_listini_edit_mask::update_sons_prices()
//PrezzoNuovoFiglio = Ricaricofiglio * PrezzoPadre (questo vale per ogni articolo)
TSheet_field& sf_figli = sfield(F_LISTINI_FIGLI);
TSheet_field& sf_listini = sfield(F_MULTILISTINI);
const int fath_prezzo_pos = sf_listini.cid2index(S2_PREZZO);
FOR_EACH_SHEET_ROW(sf_figli, r, riga_figlio)
{
const real ricarico = riga_figlio->get(2);
const int son_prezzo_pos = fath_prezzo_pos + 1 + r;
FOR_EACH_SHEET_ROW(sf_listini, i, riga) if (riga->get_char(0) > ' ') //è come dire checked (ignoranti!)
{
const real old_son_prezzo = sf_listini.cell(i - 1, son_prezzo_pos);
const real old_son_prezzo = get_price(sf_listini, i - 1, S2_LIST1 + r);
if (old_son_prezzo > ZERO)
{
const real fath_prezzo = get_price(sf_listini, i, fath_prezzo_pos);
const TPrice son_prezzo = fath_prezzo * (CENTO + ricarico) / CENTO;
riga->add(son_prezzo.get_num().string(), son_prezzo_pos);
const real fath_prezzo = get_price(sf_listini, i, S2_PREZZO);
real son_prezzo = fath_prezzo * (CENTO + ricarico) / CENTO;
set_price(sf_listini, i, S2_LIST1 + r, son_prezzo);
}
}
}
@ -587,7 +641,7 @@ void TAggiorna_listini_edit_mask::save_listini()
const TString& um = recset_rows.get(RCONDV_UM).as_string();
//cerca sullo sheet la coppia codart+um
const int riga_alta = find_codart(sf_listini, codart, um);
const real prezzo = get_price(sf_listini, riga_alta + 1, prezzo_pos + pos);
const real prezzo = get_price(sf_listini, riga_alta + 1, S2_PREZZO + pos);
//se non la trova o se il prezzo è 0 elimina la riga dal file
if (riga_alta < 0 || prezzo == ZERO)
file.remove();
@ -598,7 +652,7 @@ void TAggiorna_listini_edit_mask::save_listini()
//alla fine della storia registra tutto lo sheet sul file
FOR_EACH_SHEET_ROW(sf_listini, r, riga) if ((r & 1) && (riga->get_char(0) > ' ')) //è come dire riga dispari e checked (ignoranti!)
{
const real prezzo = get_price(sf_listini, r, prezzo_pos + pos);
const real prezzo = get_price(sf_listini, r, S2_PREZZO + pos);
if (prezzo > ZERO)
{
const TString codart = riga->get(1);
@ -696,6 +750,11 @@ bool TAggiorna_listini_edit_mask::on_field_event(TOperable_field& o, TField_even
else //se invece viene cambiato il prezzo del padre ed i figli hanno tutti i prezzi nulli..
//..(articolo nuovo o resettato), sui prezzi figli viene messo il prezzo del padre
{
//per prima cosa sistema se stesso (è un padre ignobile!)
real father_price = o.get();
set_price(o.dlg(), father_price);
//poi i figli
TMask& rowmask = o.mask(); //serve la maschera di riga! (sennò funziona solo sullo sheet)
real somma_prezzi_figli = ZERO;
for (int i = S2_LIST1; i <= S2_LIST10; i++)
@ -706,16 +765,15 @@ bool TAggiorna_listini_edit_mask::on_field_event(TOperable_field& o, TField_even
TSheet_field& sf_listini = sfield(F_LISTINI_FIGLI);
const int col_ricarichi = sf_listini.cid2index(S1_RICARICO);
for (int i = S2_LIST1; i <= S2_LIST10; i++)
for (short i = S2_LIST1; i <= S2_LIST10; i++)
{
TMask_field& campo = rowmask.efield(i);
//se il campo è visibile, allora il listino figlio è tra quelli attivi e lo aggiorna
if (campo.shown())
{
const real ricarico = sf_listini.cell(i - S2_LIST1, col_ricarichi);
real prezzo_figlio = o.get();
prezzo_figlio = prezzo_figlio * (CENTO + ricarico) / CENTO;
campo.set(prezzo_figlio.string());
real prezzo_figlio = father_price * (CENTO + ricarico) / CENTO;
set_price(i, prezzo_figlio);
}
}
}
@ -735,6 +793,8 @@ bool TAggiorna_listini_edit_mask::on_field_event(TOperable_field& o, TField_even
case S2_LIST10:
if (e == fe_modify)
{
real price = o.get();
set_price(o.dlg(), price);
_ask_save = true;
}
break;