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:
parent
d01fb5405e
commit
0cf8d61a82
108
ve/ve2700.cpp
108
ve/ve2700.cpp
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user