95f212f109
Files correlati : Ricompilazione Demo : [ ] Commento : git-svn-id: svn://10.65.10.50/trunk@19485 c028cbd2-c16b-5b4b-a496-9718f37d4682
1242 lines
35 KiB
C++
Executable File
1242 lines
35 KiB
C++
Executable File
#include <colors.h>
|
||
#include <urldefid.h>
|
||
|
||
#include "../ve/sconti.h"
|
||
#include "../ve/ve0100.h"
|
||
#include "../ve/veini.h"
|
||
#include "../ve/veuml.h"
|
||
#include "../ve/veuml3.h"
|
||
#include "../ve/verig.h"
|
||
#include "../ve/vepriv.h"
|
||
|
||
#include "../ve/velib.h"
|
||
#include "../ve/velib04.h"
|
||
|
||
#define F_K F_USERFLD
|
||
|
||
#define F_LIVELLO F_USERFLD+1
|
||
#define F_DETTAGLIO F_USERFLD+2
|
||
#define F_COPIA F_USERFLD+3
|
||
#define F_INCOLLA F_USERFLD+4
|
||
#define F_SHRINK_ALL F_USERFLD+5
|
||
#define F_ZOOM_ALL F_USERFLD+6
|
||
#define F_SHRINK_ROW F_USERFLD+7
|
||
#define F_ZOOM_ROW F_USERFLD+8
|
||
#define F_USEK F_USERFLD+9
|
||
#define F_REVISION F_USERFLD+10
|
||
#define F_LOAD_COSTS F_USERFLD+11
|
||
#define F_COPIA_TUTTO F_USERFLD+12
|
||
#define FOR_EACH_DOC_ROW_BACK(d, r, row) const TRiga_documento* row = NULL; for (int r = d.rows(); r > 0 && (row = &d[r]) != NULL; r--)
|
||
|
||
//////////////////////////////////////////
|
||
//// CLASSE TGestione_preventivo_msk ////
|
||
//////////////////////////////////////////
|
||
|
||
//Definizione della classe della maschera
|
||
class TGestione_preventivo_msk : public TDocumento_mask
|
||
{
|
||
int _rule;
|
||
int _clipboard_row;
|
||
long _clipboard_ndoc;
|
||
char _clipboard_provv;
|
||
TString8 _clipboard_codnum;
|
||
int _clipboard_anno;
|
||
TString16 _field_costo;
|
||
|
||
protected:
|
||
//hanlder di documento:
|
||
static bool pe_data_handler(TMask_field& f, KEY k);
|
||
//handler di riga:
|
||
static bool pe_ritirato_handler(TMask_field& f, KEY k);
|
||
static bool pe_codart_handler(TMask_field& f, KEY k);
|
||
static bool pe_qta_handler(TMask_field& f, KEY k);
|
||
static bool pe_k_handler(TMask_field& f, KEY k);
|
||
static bool pe_prezzo_handler(TMask_field& f, KEY k);
|
||
static bool pe_costo_handler(TMask_field& f, KEY k);
|
||
|
||
static bool ss_notify(TSheet_field& ss, int r, KEY key);
|
||
|
||
virtual void on_idle();
|
||
virtual void highlight_row(int row, COLOR back = COLOR_INVALID, COLOR fore = COLOR_INVALID, bool dirty = true, bool update = true);
|
||
const TString & build_tree_string(int level);
|
||
bool new_revision(const char* codnum, long& ndoc) const;
|
||
|
||
public:
|
||
static bool pe_espandi_handler(TMask_field& f, KEY k);
|
||
static bool pe_espandi_riga_handler(TMask_field& f, KEY k);
|
||
static bool pe_copia_handler(TMask_field& f, KEY k);
|
||
static bool pe_incolla_handler(TMask_field& f, KEY k);
|
||
static bool pe_new_revision_handler(TMask_field& f, KEY k);
|
||
static bool pe_update_costi_handler(TMask_field& f, KEY k);
|
||
virtual void user_set_handler( short fieldid, int index);
|
||
virtual void user_set_row_handler(TMask& rm, short field, int index);
|
||
|
||
void update_prezzo_vendita(TMask & row_mask);
|
||
void update_costi_ricavi(int row = -1, bool update_sheet = false);
|
||
|
||
virtual TVariable_mask * riga_mask(int numriga);
|
||
virtual void doc2mask(bool reload_clifo = true, bool force_load = false, bool update = true);
|
||
|
||
TGestione_preventivo_msk(const char* tipodoc);
|
||
};
|
||
|
||
|
||
//////////////////////////////////////////
|
||
//// CLASSE TGestione_preventivo_APP ////
|
||
//////////////////////////////////////////
|
||
|
||
// Definizione della classe dell'applicazione motore
|
||
class TGestione_preventivo_app : public TMotore_application
|
||
{
|
||
protected:
|
||
virtual TMask* get_mask( int mode );
|
||
virtual int write( const TMask& m );
|
||
virtual int rewrite( const TMask& m );
|
||
virtual int read ( TMask& m );
|
||
virtual void init_insert_mode( TMask& m );
|
||
virtual void init_modify_mode(TMask &m);
|
||
void elimina_vuote( const TMask& m);
|
||
virtual bool last_doc(char provv, int anno, const char* codnum, long& ndoc, TDate& datadoc) const;
|
||
|
||
public:
|
||
TGestione_preventivo_app() {}
|
||
};
|
||
|
||
inline TGestione_preventivo_app& peapp() { return (TGestione_preventivo_app &)main_app(); };
|
||
|
||
//////////////////////////////////////////
|
||
//// CLASSE TGestione_preventivo_MSK ////
|
||
|
||
//////////////////////////////////////////
|
||
|
||
const TString & TGestione_preventivo_msk::build_tree_string(int level)
|
||
{
|
||
TString & tree = get_tmp_string(30);
|
||
|
||
if (level < 10)
|
||
{
|
||
tree.fill(' ', level + 3);
|
||
tree << '+';
|
||
tree.rpad(13, '-');
|
||
}
|
||
else
|
||
tree = " +";
|
||
TString l; l.format("%02d", level + 1);
|
||
|
||
tree.overwrite(l, 0, 2);
|
||
return tree;
|
||
}
|
||
|
||
////////////////////////////
|
||
// HANDLER DI DOCUMENTO //
|
||
////////////////////////////
|
||
|
||
void TGestione_preventivo_msk:: on_idle()
|
||
{
|
||
TDocumento_mask::on_idle();
|
||
}
|
||
|
||
//magico metodo per settare, al cambio riga dello sheet, il focus sul campo desiderato (il campo in questione <20>..
|
||
//..definito nella on_idle(); ricordarsi la set_notify() nel costruttore della maschera senno' viene eseguito l'ss_notify()..
|
||
//..standard e non questo qui ridefinito. Allah!
|
||
|
||
void TGestione_preventivo_msk::update_costi_ricavi(int nrow, bool update_sheet)
|
||
{
|
||
TDocumento& d = doc();
|
||
const int rows = d.physical_rows();
|
||
TArray valori;
|
||
TArray costi;
|
||
TSheet_field & sh = sfield(F_SHEET);
|
||
|
||
const bool all = nrow < 0;
|
||
if (all)
|
||
nrow = rows;
|
||
else
|
||
d[nrow].autosave(sh);
|
||
|
||
const int cur_level = d[nrow].get_int(RDOC_LEVEL);
|
||
|
||
while (nrow < rows && cur_level < d[nrow + 1].get_int(RDOC_LEVEL))
|
||
nrow++;
|
||
for (int i = nrow; i > 0; i--)
|
||
{
|
||
TRiga_documento& row = d[i];
|
||
const int level = row.get_int(RDOC_LEVEL);
|
||
|
||
if (i == rows || level >= doc()[i + 1].get_int(RDOC_LEVEL))
|
||
{
|
||
const real importo = row.importo(true, false);
|
||
|
||
row.put(RDOC_VALV, importo);
|
||
for (int j = level - 1; j >= 0; j--)
|
||
{
|
||
real * r = (real *) valori.objptr(j);
|
||
|
||
if (r == NULL)
|
||
{
|
||
r = new real;
|
||
valori.add(r, j);
|
||
}
|
||
*r += importo;
|
||
}
|
||
|
||
const real costo = row.get_real(RDOC_QTA) * row.get_real(RDOC_COSTO);
|
||
|
||
row.put(RDOC_VALC, costo);
|
||
for (int j = level - 1; j >= 0; j--)
|
||
{
|
||
real * r = (real *) costi.objptr(j);
|
||
|
||
if (r == NULL)
|
||
{
|
||
r = new real;
|
||
costi.add(r, j);
|
||
}
|
||
*r += costo;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
real * r = (real *) valori.objptr(level);
|
||
|
||
if (r != NULL)
|
||
{
|
||
row.put(RDOC_VALV, *r);
|
||
*r = ZERO;
|
||
}
|
||
r = (real *) costi.objptr(level);
|
||
if (r != NULL)
|
||
{
|
||
row.put(RDOC_VALC, *r);
|
||
*r = ZERO;
|
||
}
|
||
}
|
||
if (update_sheet)
|
||
{
|
||
row.autoload(sh);
|
||
sh.check_row(i - 1);
|
||
sh.force_update(i - 1);
|
||
}
|
||
if (!all && level <= 0)
|
||
break;
|
||
}
|
||
}
|
||
|
||
bool TGestione_preventivo_msk::ss_notify(TSheet_field& ss, int r, KEY key)
|
||
{
|
||
TGestione_preventivo_msk& mask = (TGestione_preventivo_msk&) ss.mask();
|
||
TSheet_field & sh = mask.sfield(F_SHEET);
|
||
TDocumento& doc = mask.doc();
|
||
|
||
switch (key)
|
||
{
|
||
case K_TAB: // entrata
|
||
{
|
||
TRiga_documento& row = doc[r + 1];
|
||
TMask & row_mask = sh.sheet_row_mask(r);
|
||
const int level = row.get_int(RDOC_LEVEL);
|
||
const bool prodfin = level == 0;
|
||
const bool price_enabled = (r + 1 == doc.physical_rows()) || (level >= doc[r + 2].get_int(RDOC_LEVEL));
|
||
short id;
|
||
|
||
sh.enable_cell(r, sh.cid2index(FR_PREZZO), price_enabled);
|
||
sh.enable_cell(r, sh.cid2index(FR_JOLLY3), price_enabled);
|
||
for (id = FR_CDC1; id < FR_CDC12; id++)
|
||
sh.enable_cell(r, sh.cid2index(id), prodfin);
|
||
for (id = FR_DESCDC1; id < FR_DESCDC12; id++)
|
||
sh.enable_cell(r, sh.cid2index(id), prodfin);
|
||
sh.force_update(r);
|
||
}
|
||
break;
|
||
case K_CTRL + K_INS: // Inserimento
|
||
{
|
||
const int doc_row = r + 1;
|
||
int level = 0;
|
||
|
||
TRiga_documento & row = doc[doc_row];
|
||
|
||
if (r > 0 && row.is_merce())
|
||
{
|
||
const int father_sheet_row = r - 1;
|
||
TRiga_documento& father_row = doc[father_sheet_row + 1];
|
||
const int rows = doc.physical_rows();
|
||
|
||
level = father_row.get_int(RDOC_LEVEL);
|
||
const int next_level = mask.get_int(F_LIVELLO);
|
||
if ( next_level > 0 && (doc_row == rows || level > doc[doc_row + 1].get_int(RDOC_LEVEL)))
|
||
level = (doc_row == rows || next_level - 1 >= doc[doc_row + 1].get_int(RDOC_LEVEL)) ? next_level - 1 : doc[doc_row + 1].get_int(RDOC_LEVEL);
|
||
else
|
||
if (mask.get_bool(F_DETTAGLIO) || (doc_row < rows && level < doc[doc_row + 1].get_int(RDOC_LEVEL)))
|
||
level++;
|
||
if (level > 0)
|
||
{
|
||
row.put(RDOC_CODCOSTO, father_row.get(RDOC_CODCOSTO));
|
||
row.put(RDOC_CODCMS, father_row.get(RDOC_CODCMS));
|
||
row.put(RDOC_FASCMS, father_row.get(RDOC_FASCMS));
|
||
|
||
if (level > father_row.get_int(RDOC_LEVEL))
|
||
{
|
||
sh.disable_cell(father_sheet_row, sh.cid2index(FR_PREZZO));
|
||
sh.disable_cell(father_sheet_row, sh.cid2index(FR_JOLLY3));
|
||
father_row.zero(RDOC_COSTO);
|
||
father_row.zero(RDOC_PREZZO);
|
||
father_row.zero(RDOC_PPROV);
|
||
father_row.zero(RDOC_K);
|
||
father_row.autoload(sh);
|
||
sh.force_update(father_sheet_row);
|
||
}
|
||
short id;
|
||
|
||
for (id = FR_CDC1; id < FR_CDC12; id++)
|
||
sh.disable_cell(r, sh.cid2index(id));
|
||
}
|
||
}
|
||
row.put(RDOC_LEVEL, level);
|
||
row.put(RDOC_TREE, mask.build_tree_string(level));
|
||
row.autoload(sh);
|
||
mask.reset(F_LIVELLO);
|
||
mask.reset(F_DETTAGLIO);
|
||
}
|
||
break;
|
||
case K_DEL: // Cancellazione
|
||
{
|
||
const int doc_row = r + 1;
|
||
const int rows = doc.physical_rows();
|
||
|
||
if (doc_row < rows)
|
||
{
|
||
TRiga_documento & row = doc[doc_row];
|
||
const int level = row.get_int(RDOC_LEVEL);
|
||
int i;
|
||
int last_row = doc_row;
|
||
|
||
for (i = doc_row + 1; i <= rows; i++)
|
||
if (level < doc[i].get_int(RDOC_LEVEL))
|
||
last_row = i;
|
||
else
|
||
break;
|
||
for (i = last_row; i > doc_row; i--)
|
||
{
|
||
doc.destroy_row(i, true);
|
||
sh.destroy(i - 1);
|
||
}
|
||
sh.force_update();
|
||
}
|
||
}
|
||
break;
|
||
case K_CTRL + K_DEL: // Cancellazione
|
||
mask.update_costi_ricavi(-1, true);
|
||
break;
|
||
case K_ENTER: // Uscita con modifiche
|
||
mask.update_costi_ricavi(r + 1, true);
|
||
default:
|
||
break;
|
||
}
|
||
return TDocumento_mask::ss_notify(ss, r, key);
|
||
}
|
||
|
||
void TGestione_preventivo_msk::highlight_row(int row, COLOR back, COLOR fore, bool dirty, bool update)
|
||
{
|
||
TDocumento_mask::highlight_row(row, back, fore, dirty, false);
|
||
TRiga_documento& rigadoc = doc()[row + 1];
|
||
TSheet_field& sf = sfield(F_SHEET);
|
||
COLOR back1 = back, back2 = COLOR_BLUE;
|
||
const TColor_rule * c = (TColor_rule *) color_rules().objptr(_rule);
|
||
|
||
if (c != NULL)
|
||
c->colors(back2, fore);
|
||
back = blend_colors(back1, back2, 1.0 - (((double) rigadoc.get_int(RDOC_LEVEL)) / 10.0));
|
||
|
||
sf.set_back_and_fore_color(back, fore, row);
|
||
if (update)
|
||
sf.force_update(row);
|
||
}
|
||
|
||
TVariable_mask * TGestione_preventivo_msk::riga_mask(int numriga)
|
||
{
|
||
const bool is_new = new_mask(numriga);
|
||
TVariable_mask* m = TDocumento_mask::riga_mask(numriga);
|
||
|
||
if (is_new && m != NULL)
|
||
{
|
||
const TRiga_documento& riga = doc()[numriga + 1];
|
||
TEdit_field & tree = m->add_string(FR_JOLLY1, 0, "Albero ", 2, 20, 13, "D_");
|
||
TEdit_field & k = m->add_string(FR_JOLLY2, 0, "K ", 25, 20, 25);
|
||
TEdit_field & v = m->add_currency(FR_JOLLY3, 0, "Costo", 53, 20, 15, "U");
|
||
TEdit_field & p = m->add_string(FR_JOLLY4, 0, "", 75, 20, 1, "U");
|
||
|
||
m->set_handler(FR_CODART, pe_codart_handler);
|
||
m->set_handler(FR_QTA, pe_qta_handler);
|
||
m->set_handler(FR_PREZZO, pe_prezzo_handler);
|
||
m->set_handler(FR_JOLLY2, pe_k_handler);
|
||
m->set_handler(FR_JOLLY3, pe_costo_handler);
|
||
tree.set_field(RDOC_TREE);
|
||
k.set_field(RDOC_K);
|
||
v.set_field(RDOC_COSTO);
|
||
p.set_field(RDOC_PPROV);
|
||
|
||
}
|
||
return m;
|
||
|
||
}
|
||
|
||
void TGestione_preventivo_msk::doc2mask(bool reload_clifo, bool force_load, bool update)
|
||
{
|
||
TDocumento_mask::doc2mask(reload_clifo, force_load, false);
|
||
|
||
TSheet_field& s = sfield(F_SHEET);
|
||
const int righe = s.items();
|
||
const TDocumento & d = doc();
|
||
const bool has_k = get_bool(F_USEK);
|
||
|
||
for (int i = 0; i < righe; i++)
|
||
{
|
||
const TRiga_documento & row = d[i + 1];
|
||
const int level = row.get_int(RDOC_LEVEL);
|
||
const bool prodfin = level == 0;
|
||
const bool price_enabled = (i + 1 == d.physical_rows()) || (level >= d[i + 2].get_int(RDOC_LEVEL));
|
||
|
||
s.enable_cell(i, s.cid2index(FR_PREZZO), price_enabled);
|
||
s.enable_cell(i, s.cid2index(FR_JOLLY3), price_enabled);
|
||
for (short id = FR_CDC1; id < FR_CDC12; id++)
|
||
s.enable_cell(i, s.cid2index(id), prodfin);
|
||
}
|
||
//aggiorna i colori delle righe e forza l'update dello sheet
|
||
highlight();
|
||
}
|
||
|
||
//PE_TESTATA_HANDLER: handler che si occupa di decodificare i campi data in testata
|
||
bool TGestione_preventivo_msk::pe_data_handler(TMask_field& f, KEY k)
|
||
{
|
||
bool ok = true;
|
||
TGestione_preventivo_msk& mask = (TGestione_preventivo_msk&)f.mask();
|
||
|
||
return ok;
|
||
}
|
||
|
||
bool TGestione_preventivo_msk::pe_espandi_handler(TMask_field& f, KEY k)
|
||
{
|
||
if (k == K_SPACE)
|
||
{
|
||
TGestione_preventivo_msk& mask = (TGestione_preventivo_msk&)f.mask();
|
||
TSheet_field& sh = mask.sfield(F_SHEET);
|
||
const int r = sh.selected();
|
||
const bool shrink = f.dlg() == F_SHRINK_ALL;
|
||
const int size = shrink ? 1 : -1;
|
||
int row_to_select = 0;
|
||
|
||
FOR_EACH_SHEET_ROW(sh, i, row)
|
||
{
|
||
const int row_level = mask.doc()[i + 1].get_int(RDOC_LEVEL);
|
||
|
||
if (row_level > 0)
|
||
sh.set_row_height(i, size);
|
||
else
|
||
if (i <= r)
|
||
row_to_select = i;
|
||
}
|
||
if (size < 0)
|
||
sh.select(row_to_select);
|
||
sh.force_update();
|
||
}
|
||
return true;
|
||
}
|
||
|
||
bool TGestione_preventivo_msk::pe_espandi_riga_handler(TMask_field& f, KEY k)
|
||
{
|
||
if (k == K_SPACE)
|
||
{
|
||
TGestione_preventivo_msk& mask = (TGestione_preventivo_msk&)f.mask();
|
||
TSheet_field& sh = mask.sfield(F_SHEET);
|
||
const int r = sh.selected();
|
||
const int level = mask.doc()[r + 1].get_int(RDOC_LEVEL);
|
||
|
||
if (r >= 0 && r < sh.items())
|
||
{
|
||
const bool shrink = f.dlg() == F_SHRINK_ROW;
|
||
const int size = shrink ? 1 : -1;
|
||
|
||
for (int i = r + 1; i < sh.items(); i++)
|
||
{
|
||
const int child_level = mask.doc()[i + 1].get_int(RDOC_LEVEL);
|
||
|
||
if (child_level == level + 1)
|
||
sh.set_row_height(i, size);
|
||
else
|
||
if (child_level > level + 1)
|
||
sh.set_row_height(i, 1);
|
||
else
|
||
break;
|
||
}
|
||
}
|
||
sh.force_update();
|
||
}
|
||
return true;
|
||
}
|
||
|
||
bool TGestione_preventivo_msk::pe_copia_handler(TMask_field& f, KEY k)
|
||
{
|
||
bool ok = true;
|
||
if (k == K_SPACE)
|
||
{
|
||
TGestione_preventivo_msk& mask = (TGestione_preventivo_msk&)f.mask();
|
||
|
||
mask._clipboard_ndoc = mask.get_long(F_NDOC);
|
||
mask._clipboard_provv = mask.get(F_PROVV)[0];
|
||
mask._clipboard_codnum = mask.get(F_CODNUM);
|
||
mask._clipboard_anno = mask.get_int(F_ANNO);
|
||
mask._clipboard_row = f.dlg() == F_COPIA ? mask.sfield(F_SHEET).selected() + 1 : 0;
|
||
}
|
||
return ok;
|
||
}
|
||
|
||
bool TGestione_preventivo_msk::pe_incolla_handler(TMask_field& f, KEY k)
|
||
{
|
||
bool ok = true;
|
||
if (k == K_SPACE)
|
||
{
|
||
TGestione_preventivo_msk& mask = (TGestione_preventivo_msk&)f.mask();
|
||
const bool alldoc = mask._clipboard_row == 0;
|
||
const int cliprow = alldoc ? 1 : mask._clipboard_row;
|
||
|
||
if (cliprow > 0)
|
||
{
|
||
TDocumento & dest = mask.doc();
|
||
TDocumento * newdoc = &mask.doc();
|
||
bool different_doc = dest.get_char(DOC_PROVV) != mask._clipboard_provv ||
|
||
dest.get_int(DOC_ANNO) != mask._clipboard_anno ||
|
||
dest.get(DOC_CODNUM) != mask._clipboard_codnum ||
|
||
dest.get_long(DOC_NDOC) != mask._clipboard_ndoc;
|
||
|
||
if (different_doc)
|
||
newdoc = new TDocumento(mask._clipboard_provv, mask._clipboard_anno, mask._clipboard_codnum, mask._clipboard_ndoc);
|
||
|
||
TDocumento & orig = *newdoc;
|
||
TSheet_field & sh = mask.sfield(F_SHEET);
|
||
const int selected_row = sh.selected() + 1;
|
||
const int rows = dest.physical_rows();
|
||
const int next_level = mask.get_int(F_LIVELLO);
|
||
const int orig_level = orig[cliprow].get_int(RDOC_LEVEL);
|
||
const int level = next_level > 0 ? next_level - 1 : orig_level;
|
||
const int level_offset = level - orig_level;
|
||
int i;
|
||
int start_row = rows > 0 ? -1 : 1;
|
||
|
||
for (i = selected_row; start_row < 0 && i <= rows; i++)
|
||
{
|
||
const int row_level = dest[i].get_int(RDOC_LEVEL);
|
||
|
||
if (level == row_level)
|
||
start_row = i;
|
||
}
|
||
if (start_row > 0)
|
||
{
|
||
const bool shift_source_rows = (!different_doc) && start_row <= cliprow;
|
||
const int nrows = orig.physical_rows();
|
||
|
||
for (i = cliprow; i <= nrows; i++)
|
||
{
|
||
int row_level = orig[i].get_int(RDOC_LEVEL);
|
||
|
||
if (!alldoc && i > cliprow && orig_level >= row_level)
|
||
break;
|
||
const TRiga_documento & row = orig[i];
|
||
|
||
sh.insert(start_row - 1, false, true);
|
||
TRiga_documento & new_row = dest[start_row];
|
||
dest.copy_data(new_row, row);
|
||
row_level += level_offset;
|
||
new_row.put(RDOC_LEVEL, row_level);
|
||
new_row.put(RDOC_TREE, mask.build_tree_string(row_level));
|
||
|
||
new_row.autoload(sh);
|
||
start_row++;
|
||
if (shift_source_rows)
|
||
i++;
|
||
}
|
||
|
||
mask.highlight();
|
||
sh.force_update();
|
||
}
|
||
if (different_doc)
|
||
delete newdoc;
|
||
mask.reset(F_LIVELLO);
|
||
}
|
||
}
|
||
return ok;
|
||
}
|
||
|
||
bool TGestione_preventivo_msk::pe_new_revision_handler(TMask_field& f, KEY k)
|
||
{
|
||
bool ok = true;
|
||
|
||
if (k == K_SPACE)
|
||
{
|
||
TGestione_preventivo_msk& mask = (TGestione_preventivo_msk&)f.mask();
|
||
TDocumento& d = mask.doc();
|
||
|
||
if (d.bloccato())
|
||
return f.error_box(TR("Documento bloccato: non e' possibile farne una nuova revisione"));
|
||
|
||
TDocumento backup(d);
|
||
const TTipo_documento& td = d.tipo();
|
||
const char stato_iniziale = d.stato();
|
||
|
||
d.put(DOC_STATO, td.stato_bloccato());
|
||
if (d.rewrite() == NOERR)
|
||
{
|
||
long ndoc = d.get_long(DOC_NDOC);
|
||
|
||
if (mask.new_revision(d.get(DOC_CODNUM), ndoc))
|
||
{
|
||
d.renum_ndoc(ndoc);
|
||
d.put(DOC_STATO, td.stato_finale_inserimento());
|
||
|
||
ok = d.write() == NOERR;
|
||
if (ok)
|
||
{
|
||
/* Trucco demenziale che non aggiorna bene ne' la TMask ne' la TRelation_application
|
||
mask.doc2mask(false);
|
||
mask.load_checks();
|
||
mask.mask2doc();
|
||
const int err = app().get_relation()->lfile().read(mask.doc());
|
||
app().get_relation()->save_status();
|
||
*/
|
||
mask.enable(DLG_NEXTREC); // Mi assicuro che sia acceso il bottone Avanti
|
||
mask.stop_run(K_NEXT); // Passo al documento successivo appena creato
|
||
}
|
||
}
|
||
else
|
||
ok = false;
|
||
}
|
||
else
|
||
ok = false;
|
||
if (!ok)
|
||
{
|
||
backup.stato(stato_iniziale);
|
||
ok = backup.rewrite() == NOERR;
|
||
}
|
||
}
|
||
return ok;
|
||
}
|
||
|
||
bool TGestione_preventivo_msk::pe_update_costi_handler(TMask_field& f, KEY k)
|
||
{
|
||
if (k == K_SPACE)
|
||
{
|
||
TGestione_preventivo_msk & mask = (TGestione_preventivo_msk &) f.mask();
|
||
TDocumento & doc = mask.doc();
|
||
TSheet_field & sf = mask.sfield(F_SHEET);
|
||
|
||
mask.mask2doc();
|
||
|
||
const int rows = doc.physical_rows();
|
||
|
||
for (int i = 1; i <= rows; i++)
|
||
{
|
||
bool ok = i == rows;
|
||
TRiga_documento & row = doc[i];
|
||
const int level = row.get_int(RDOC_LEVEL);
|
||
|
||
if (!ok)
|
||
ok = (level >= doc[i + 1].get_int(RDOC_LEVEL));
|
||
|
||
if (ok)
|
||
{
|
||
const TString& codart = row.get(RDOC_CODARTMAG);
|
||
|
||
if (codart.full())
|
||
{
|
||
const TArticolo_giacenza & art = cached_article(codart);
|
||
const real costo = art.get_real(mask._field_costo);
|
||
|
||
row.put(RDOC_COSTO, costo);
|
||
row.autoload(sf);
|
||
}
|
||
}
|
||
}
|
||
sf.force_update();
|
||
}
|
||
return true;
|
||
}
|
||
|
||
///////////////////////
|
||
// HANDLER DI RIGA //
|
||
///////////////////////
|
||
|
||
bool TGestione_preventivo_msk::pe_codart_handler(TMask_field& f, KEY k)
|
||
{
|
||
TMask& row_mask = f.mask();
|
||
bool ok = codart_handler( f, k );
|
||
|
||
TSheet_field * sh = row_mask.get_sheet();
|
||
|
||
if (ok && sh != NULL && k == K_TAB && f.focusdirty())
|
||
{
|
||
TGestione_preventivo_msk & mask = (TGestione_preventivo_msk &) sh->mask();
|
||
const bool has_k = mask.get_bool(F_USEK);
|
||
bool update = false;
|
||
const int r = sh->selected();
|
||
|
||
const TString& codart = row_mask.get(FR_CODARTMAG);
|
||
|
||
if (codart.full())
|
||
{
|
||
const TArticolo_giacenza & art = cached_article(codart);
|
||
const real costo = art.get_real(mask._field_costo);
|
||
|
||
if (has_k)
|
||
{
|
||
const real ric = art.get(ANAMAG_PERCRIC);
|
||
TString80 k;
|
||
|
||
if (ric != ZERO)
|
||
k = ric.string();
|
||
|
||
if (k.blank())
|
||
{
|
||
const TString catmer = art.get(ANAMAG_GRMERC);
|
||
k = cache().get("GMC", catmer, "S5");
|
||
if (k.blank())
|
||
k = cache().get("GMC", catmer.left(3), "S5");
|
||
}
|
||
if (k.full())
|
||
row_mask.set(FR_JOLLY2, k);
|
||
}
|
||
row_mask.set(FR_JOLLY3, costo);
|
||
}
|
||
if (has_k || !row_mask.field(FR_PREZZO).enabled())
|
||
row_mask.set(FR_PREZZO, "");
|
||
|
||
row_mask.set(FR_JOLLY4, mask.condv().get_prov());
|
||
|
||
if (row_mask.field(FR_JOLLY3).enabled())
|
||
{
|
||
if (row_mask.get(FR_PREZZO).blank() &&
|
||
row_mask.get(FR_JOLLY3).full())
|
||
mask.update_prezzo_vendita(row_mask);
|
||
}
|
||
else
|
||
row_mask.set(FR_JOLLY3, "");
|
||
}
|
||
if (k == K_F8)
|
||
{
|
||
TSheet_field * sh = row_mask.get_sheet();
|
||
|
||
if (sh != NULL)
|
||
{
|
||
TGestione_preventivo_msk & mask = (TGestione_preventivo_msk &) sh->mask();
|
||
TDocumento & doc = mask.doc();
|
||
const int rows = doc.physical_rows();
|
||
const bool has_k = mask.get_bool(F_USEK);
|
||
const int start_level = doc[sh->selected() + 1].get_int(RDOC_LEVEL);
|
||
|
||
for (int i = sh->selected() + 2; i <= rows; i++)
|
||
{
|
||
TRiga_documento & row = doc[i];
|
||
const int level = row.get_int(RDOC_LEVEL);
|
||
if (level <= start_level)
|
||
break;
|
||
const bool prodfin = level == 0;
|
||
const bool price_enabled = (i == doc.physical_rows()) || (level >= doc[i + 1].get_int(RDOC_LEVEL));
|
||
short id;
|
||
|
||
sh->enable_cell(i - 1, sh->cid2index(FR_PREZZO), price_enabled);
|
||
// sh->enable_cell(i - 1, sh->cid2index(FR_JOLLY2), price_enabled && has_k);
|
||
sh->enable_cell(i - 1, sh->cid2index(FR_JOLLY3), price_enabled);
|
||
|
||
const TString& codart = row.get(RDOC_CODARTMAG);
|
||
const TArticolo_giacenza & art = cached_article(codart);
|
||
const bool has_k = mask.get_bool(F_USEK);
|
||
|
||
if (has_k || ! price_enabled)
|
||
row.zero(RDOC_PREZZO);
|
||
|
||
if (price_enabled && has_k)
|
||
{
|
||
const real ric = art.get(ANAMAG_PERCRIC);
|
||
TString80 k;
|
||
|
||
if (ric != ZERO)
|
||
k = ric.string();
|
||
|
||
if (k.blank())
|
||
{
|
||
const TString catmer = art.get(ANAMAG_GRMERC);
|
||
k = cache().get("GMC", catmer, "S5");
|
||
if (k.blank())
|
||
k = cache().get("GMC", catmer.left(3), "S5");
|
||
}
|
||
if (k.full())
|
||
row.put(RDOC_K, k);
|
||
}
|
||
if (price_enabled)
|
||
{
|
||
const real costo = art.get_real(mask._field_costo);
|
||
row.put(RDOC_COSTO, costo);
|
||
}
|
||
|
||
for (id = FR_CDC1; id < FR_CDC12; id++)
|
||
sh->enable_cell(i - 1, id, prodfin);
|
||
for (id = FR_DESCDC1; id < FR_DESCDC12; id++)
|
||
sh->enable_cell(i - 1, id, prodfin);
|
||
row.put(RDOC_TREE, mask.build_tree_string(level));
|
||
row.autoload(*sh);
|
||
mask.highlight_row(i -1, COLOR_INVALID, COLOR_INVALID, true, false);
|
||
}
|
||
sh->force_update();
|
||
}
|
||
}
|
||
return ok;
|
||
}
|
||
|
||
bool TGestione_preventivo_msk::pe_qta_handler(TMask_field& f, KEY k)
|
||
{
|
||
bool ok = qta_handler( f, k );
|
||
|
||
if (ok)
|
||
{
|
||
TMask& row_mask = f.mask();
|
||
TSheet_field * sh = row_mask.get_sheet();
|
||
if (sh != NULL)
|
||
{
|
||
TDocumento_mask & mask = (TDocumento_mask &) sh->mask();
|
||
TDocumento & doc = mask.doc();
|
||
|
||
if (k == K_F8)
|
||
{
|
||
const int r = sh->selected();
|
||
|
||
if (r > 0)
|
||
{
|
||
TRiga_documento & row = doc[r + 1];
|
||
const int level = row.get_int(RDOC_LEVEL);
|
||
|
||
if (level > 0)
|
||
{
|
||
int father_row = r;
|
||
while (r > 1 && level == doc[father_row].get_int(RDOC_LEVEL))
|
||
father_row--;
|
||
|
||
TRiga_documento & row = doc[father_row];
|
||
const real qta_prec = row.get_real(RDOC_QTA);
|
||
real qta(f.get());
|
||
TToken_string & shrow = sh->row(r);
|
||
|
||
qta *= qta_prec;
|
||
shrow.add(qta.string(), sh->cid2index(FR_QTA));
|
||
sh->force_update(r);
|
||
row.put(RDOC_QTA, qta);
|
||
f.focusdirty();
|
||
}
|
||
}
|
||
}
|
||
if (f.to_check(k, true))
|
||
{
|
||
const int r = sh->selected();
|
||
TRiga_documento & row = doc[r + 1];
|
||
const real old_qta = row.get_real(RDOC_QTA);
|
||
const real qta = row_mask.get_real(FR_QTA);
|
||
const int level = row.get_int(RDOC_LEVEL);
|
||
|
||
if (old_qta != qta)
|
||
{
|
||
const int rows = doc.physical_rows();
|
||
|
||
for (int i = r + 2; i <= rows && level < doc[i].get_int(RDOC_LEVEL); i++)
|
||
{
|
||
TToken_string & shrow = sh->row(i - 1);
|
||
real row_qta(shrow.get(sh->cid2index(FR_QTA)));
|
||
|
||
row_qta *= qta;
|
||
if (!old_qta.is_zero())
|
||
row_qta /= old_qta;
|
||
row_qta.round(5);
|
||
shrow.add(row_qta.string(), sh->cid2index(FR_QTA));
|
||
doc[i].put(RDOC_QTA, row_qta);
|
||
}
|
||
row.put(RDOC_QTA, qta);
|
||
sh->force_update();
|
||
}
|
||
}
|
||
}
|
||
}
|
||
return ok;
|
||
}
|
||
void TGestione_preventivo_msk::update_prezzo_vendita(TMask & row_mask)
|
||
{
|
||
real costo = row_mask.get(FR_JOLLY3);
|
||
TString k(row_mask.get(FR_JOLLY2));
|
||
TString ge;
|
||
real perc;
|
||
TSheet_field * sh = row_mask.get_sheet();
|
||
const int r = sh->selected();
|
||
|
||
if (k.blank())
|
||
k = get(F_K);
|
||
if (scontoexpr2perc(k, false, ge, perc))
|
||
costo *= (real(2.00) - perc);
|
||
|
||
TCurrency_documento prezzo(costo, doc(), true);
|
||
row_mask.set(FR_PREZZO, prezzo.get_num().string());
|
||
row_mask.set(FR_JOLLY4, "K");
|
||
}
|
||
|
||
bool TGestione_preventivo_msk::pe_k_handler(TMask_field& f, KEY k)
|
||
{
|
||
TMask& row_mask = f.mask();
|
||
TSheet_field * sh = row_mask.get_sheet();
|
||
|
||
if (sh == NULL)
|
||
return true;
|
||
|
||
TGestione_preventivo_msk& mask = (TGestione_preventivo_msk&)sh->mask();
|
||
|
||
const bool last_level = row_mask.field(FR_JOLLY3).enabled();
|
||
if (last_level)
|
||
{
|
||
if ((k == K_TAB && f.focusdirty()) || k == K_F8)
|
||
mask.update_prezzo_vendita(row_mask);
|
||
}
|
||
else
|
||
if (k == K_F8)
|
||
{
|
||
const TString k(row_mask.get(FR_JOLLY2));
|
||
const int r = sh->selected();
|
||
TDocumento & doc = mask.doc();
|
||
const int start_level = doc[r + 1].get_int(RDOC_LEVEL);
|
||
TString ge;
|
||
real perc;
|
||
|
||
// row_mask.reset(FR_JOLLY2);
|
||
sh->row(r).add("", sh->cid2index(FR_JOLLY2));
|
||
sh->force_update(r);
|
||
for (int i = r + 2; i <= doc.physical_rows(); i++)
|
||
{
|
||
TRiga_documento & row = doc[i];
|
||
const int level = row.get_int(RDOC_LEVEL);
|
||
|
||
if (level <= start_level)
|
||
break;
|
||
if (sh->cell_enabled(i -1, sh->cid2index(FR_PREZZO)))
|
||
{
|
||
TToken_string & shrow = sh->row(i - 1);
|
||
|
||
row.put(RDOC_K, k);
|
||
shrow.add(k, sh->cid2index(FR_JOLLY2));
|
||
TString row_k(k);
|
||
|
||
if (row_k.blank())
|
||
row_k = mask.get(F_K);
|
||
|
||
real val = row.get_real(RDOC_COSTO);
|
||
|
||
if (scontoexpr2perc(row_k, false, ge, perc))
|
||
val *= (2 - perc);
|
||
TCurrency_documento prezzo(val, doc, true);
|
||
row.put(RDOC_PREZZO, prezzo.get_num());
|
||
row.put(RDOC_PPROV, "K");
|
||
shrow.add(prezzo.get_num().string(), sh->cid2index(FR_PREZZO));
|
||
shrow.add("K", sh->cid2index(FR_JOLLY4));
|
||
}
|
||
}
|
||
mask.update_costi_ricavi(r + 1, true);
|
||
}
|
||
|
||
return true;
|
||
}
|
||
|
||
bool TGestione_preventivo_msk::pe_prezzo_handler(TMask_field& f, KEY k)
|
||
{
|
||
TMask& row_mask = f.mask();
|
||
const bool last_level = row_mask.field(FR_JOLLY3).enabled();
|
||
|
||
if (last_level)
|
||
{
|
||
if (k == K_F8)
|
||
{
|
||
TSheet_field * sh = row_mask.get_sheet();
|
||
|
||
if (sh != NULL)
|
||
{
|
||
TGestione_preventivo_msk & mask = (TGestione_preventivo_msk &) sh->mask();
|
||
TDocumento & doc = mask.doc();
|
||
const int row = sh->selected();
|
||
TCond_vendita & condv = mask.condv();
|
||
|
||
condv.set_testa(&mask);
|
||
condv.set_riga(&row_mask);
|
||
condv.ricerca();
|
||
doc[row + 1].put(RDOC_PREZZO, row_mask.get(FR_PREZZO));
|
||
doc[row + 1].put(RDOC_PPROV, condv.get_prov());
|
||
|
||
row_mask.reset(FR_JOLLY2);
|
||
row_mask.field(FR_JOLLY2).set_focusdirty(false);
|
||
}
|
||
}
|
||
if (k == K_TAB && f.focusdirty())
|
||
{
|
||
row_mask.reset(FR_JOLLY2);
|
||
row_mask.field(FR_JOLLY2).set_focusdirty(false);
|
||
}
|
||
}
|
||
return true;
|
||
}
|
||
|
||
bool TGestione_preventivo_msk::pe_costo_handler(TMask_field& f, KEY k)
|
||
{
|
||
TMask& row_mask = f.mask();
|
||
const bool last_level = row_mask.field(FR_JOLLY3).enabled();
|
||
|
||
if (last_level)
|
||
{
|
||
if (k == K_TAB && f.focusdirty())
|
||
{
|
||
row_mask.reset(FR_JOLLY2);
|
||
row_mask.field(FR_JOLLY2).set_focusdirty(false);
|
||
}
|
||
}
|
||
return true;
|
||
}
|
||
|
||
//metodo che setta gli handler sui campi di riga
|
||
void TGestione_preventivo_msk::user_set_row_handler(TMask& rm, short field, int index)
|
||
{
|
||
switch(index)
|
||
{
|
||
case 5101: rm.set_handler(field, pe_codart_handler); break;
|
||
case 5102: rm.set_handler(field, pe_qta_handler); break;
|
||
default : TDocumento_mask::user_set_row_handler(rm, field, index); break;
|
||
}
|
||
}
|
||
|
||
//metodo che setta l'handler di bolla
|
||
void TGestione_preventivo_msk::user_set_handler( short fieldid, int index)
|
||
{
|
||
switch(index)
|
||
{
|
||
case 5101: set_field_handler(fieldid, pe_data_handler); break;
|
||
default : TDocumento_mask::user_set_handler(fieldid, index); break;
|
||
}
|
||
}
|
||
|
||
bool TGestione_preventivo_msk::new_revision(const char* codnum, long& ndoc) const
|
||
{
|
||
const TCodice_numerazione& num = cached_numerazione(codnum);
|
||
const int revlen = num.revision_len();
|
||
|
||
if (revlen > 0)
|
||
{
|
||
real fattore = exp10(revlen); fattore.round(0);
|
||
const long divisore = fattore.integer();
|
||
const long newndoc = ndoc + 1;
|
||
|
||
// Obfuscated C contest: forse bastava scrivere questo
|
||
// if (newndoc/divisore != ndoc/divisore)
|
||
if (((newndoc / divisore) - (ndoc / divisore)) != 0)
|
||
return false;
|
||
else
|
||
{
|
||
ndoc = newndoc;
|
||
return true;
|
||
}
|
||
}
|
||
return false;
|
||
}
|
||
|
||
TGestione_preventivo_msk::TGestione_preventivo_msk(const char* tipodoc) : TDocumento_mask(tipodoc), _clipboard_row(-1)
|
||
{
|
||
//TConfig* configpe = new TConfig(CONFIG_DITTA, "pe"); // A cosa serve?
|
||
sfield(F_SHEET).set_notify( ss_notify );
|
||
_rule = color_rules().add(new TColor_rule("Livello", "", _numexpr, COLOR_BLUE, FOCUS_COLOR));
|
||
|
||
TFilename pn; doc().tipo().profile_name(pn);
|
||
TConfig prof(pn, "MAIN");
|
||
|
||
_field_costo = prof.get("FieldCosto", NULL, -1, ANAMAG_ULTCOS1);
|
||
}
|
||
|
||
//////////////////////////////////////////
|
||
//// CLASSE TGESTIONE_PREVENTIVO_APP ////
|
||
//////////////////////////////////////////
|
||
|
||
//ridefinisco il metodo get_mask delle TMotore_application
|
||
TMask* TGestione_preventivo_app::get_mask( int mode )
|
||
{
|
||
if (mode == MODE_INS || mode == MODE_MOD)
|
||
{
|
||
TString4 tipodoc;
|
||
if (mode == MODE_MOD)
|
||
tipodoc = get_relation()->curr().get(DOC_TIPODOC); // Lo prendo dalla relazione (Gelai)
|
||
else
|
||
tipodoc = TMotore_application::get_mask(MODE_QUERY)->get(F_TIPODOC);
|
||
if (_doc_masks.objptr(tipodoc) == NULL)
|
||
{
|
||
TGestione_preventivo_msk* m = new TGestione_preventivo_msk(tipodoc);
|
||
_doc_masks.add(tipodoc, m);
|
||
const TTipo_documento& tdoc = m->doc().tipo();
|
||
const TString_array& handlers = tdoc.handlers();
|
||
FOR_EACH_ARRAY_ROW(handlers, i, row)
|
||
{
|
||
m->user_set_handler( row->get_int( 0 ), row->get_int( 1 ) );
|
||
}
|
||
TSheet_field & sh = m->sfield(F_SHEET);
|
||
const int y = m->sh_y() - 1;
|
||
|
||
m->add_button(F_LOAD_COSTS, sh.page(), "Costi", 66, y - 2, 4, 1, "");
|
||
m->set_handler(F_LOAD_COSTS, TGestione_preventivo_msk::pe_update_costi_handler);
|
||
m->add_button(F_REVISION, sh.page(), "Rev.", 73, y - 2, 4, 1, "");
|
||
m->set_handler(F_REVISION, TGestione_preventivo_msk::pe_new_revision_handler);
|
||
|
||
m->add_button(F_SHRINK_ALL, sh.page(), "--", 61, y - 1, 1, 1, "", BMP_DARROWU);
|
||
m->set_handler(F_SHRINK_ALL, TGestione_preventivo_msk::pe_espandi_handler);
|
||
m->add_button(F_ZOOM_ALL, sh.page(), "++", 66, y -1, 1, 1, "", BMP_DARROWD);
|
||
m->set_handler(F_ZOOM_ALL, TGestione_preventivo_msk::pe_espandi_handler);
|
||
m->add_button(F_SHRINK_ROW, sh.page(), "-", 71, y - 1, 1, 1, "", BMP_SARROWU);
|
||
m->set_handler(F_SHRINK_ROW, TGestione_preventivo_msk::pe_espandi_riga_handler);
|
||
m->add_button(F_ZOOM_ROW, sh.page(), "+", 76, y -1, 1, 1, "", BMP_SARROWD);
|
||
m->set_handler(F_ZOOM_ROW, TGestione_preventivo_msk::pe_espandi_riga_handler);
|
||
|
||
TBoolean_field & fk = m->add_boolean(F_USEK, sh.page(), "", 2, y);
|
||
|
||
fk.set_field(DOC_USEK);
|
||
// m->set_handler(F_USEK, TGestione_preventivo_msk::pe_usek_handler);
|
||
|
||
TToken_string * fk_false = fk.message(0, true);
|
||
TToken_string * fk_true = fk.message(1, true);
|
||
|
||
*fk_false << "CLEAR," << F_K;
|
||
*fk_true << "ENABLE," << F_K;
|
||
|
||
TEdit_field & k = m->add_string(F_K, sh.page(), "K ", 5, y, 25);
|
||
|
||
k.set_field(DOC_K);
|
||
m->add_number(F_LIVELLO, sh.page(), "Livello Succ. ", 33, y, 1);
|
||
m->add_boolean(F_DETTAGLIO, sh.page(), "Dettaglia", 53, y);
|
||
m->add_button(F_COPIA_TUTTO, sh.page(), "~Tutto", 66, y, 1, 1, "", BMP_FILECHK);
|
||
m->set_handler(F_COPIA_TUTTO, TGestione_preventivo_msk::pe_copia_handler);
|
||
m->add_button(F_COPIA, sh.page(), "~Copia", 71, y, 1, 1, "", BMP_COPY);
|
||
m->set_handler(F_COPIA, TGestione_preventivo_msk::pe_copia_handler);
|
||
m->add_button(F_INCOLLA, sh.page(), "~Incolla", 76, y, 1, 1, "", BMP_PASTE);
|
||
m->set_handler(F_INCOLLA, TGestione_preventivo_msk::pe_incolla_handler);
|
||
sh.enable_column(sh.cid2index(FR_JOLLY1), false);
|
||
sh.enable_column(sh.cid2index(FR_JOLLY4), false);
|
||
}
|
||
}
|
||
return TMotore_application::get_mask(mode);
|
||
}
|
||
|
||
bool TGestione_preventivo_app::last_doc(char provv, int anno, const char* codnum,
|
||
long& ndoc, TDate& ddoc) const
|
||
{
|
||
bool ok = TMotore_application::last_doc(provv, anno, codnum, ndoc, ddoc);
|
||
const TCodice_numerazione& num = cached_numerazione(codnum);
|
||
const int revlen = num.revision_len();
|
||
|
||
if (revlen > 0)
|
||
{
|
||
real fattore = exp10(revlen); fattore.round(0);
|
||
const long divisore = fattore.integer();
|
||
|
||
if (ok)
|
||
ndoc /= divisore;
|
||
else
|
||
ndoc = 1;
|
||
ndoc++;
|
||
ndoc *= divisore;
|
||
return true;
|
||
}
|
||
return ok;
|
||
}
|
||
//ridefinisco il metodo write delle TMotore_application
|
||
int TGestione_preventivo_app::write( const TMask& m )
|
||
{
|
||
TGestione_preventivo_msk & mask = (TGestione_preventivo_msk &) m;
|
||
TDocumento& doc = mask.doc();
|
||
const int rows = doc.physical_rows();
|
||
const TString k = doc.get(DOC_K);
|
||
|
||
for (int i = rows ; i > 0; i--)
|
||
{
|
||
TRiga_documento & row = (TRiga_documento &)doc[i];
|
||
const int level = row.get_int(RDOC_LEVEL);
|
||
const TString & row_k = row.get(RDOC_K);
|
||
|
||
if ((row_k.blank()) && (i == rows || level >= doc[i + 1].get_int(RDOC_LEVEL)))
|
||
row.put(RDOC_K, k);
|
||
}
|
||
mask.update_costi_ricavi();
|
||
return TMotore_application::write(m);
|
||
}
|
||
|
||
//ridefinisco il metodo rewrite delle TMotore_application
|
||
int TGestione_preventivo_app::rewrite( const TMask& m )
|
||
{
|
||
TGestione_preventivo_msk & mask = (TGestione_preventivo_msk &) m;
|
||
TDocumento& doc = ((TDocumento_mask&) m).doc();
|
||
const int rows = doc.physical_rows();
|
||
const TString k = doc.get(DOC_K);
|
||
|
||
for (int i = rows ; i > 0; i--)
|
||
{
|
||
TRiga_documento & row = (TRiga_documento &)doc[i];
|
||
const int level = row.get_int(RDOC_LEVEL);
|
||
const TString & row_k = row.get(RDOC_K);
|
||
|
||
if ((row_k.blank()) && (i == rows || level >= doc[i + 1].get_int(RDOC_LEVEL)))
|
||
row.put(RDOC_K, k);
|
||
}
|
||
mask.update_costi_ricavi();
|
||
return TMotore_application::rewrite(m);
|
||
}
|
||
|
||
//ridefinisco il metodo read della TMotore_application
|
||
int TGestione_preventivo_app::read(TMask& m)
|
||
{
|
||
const int err = TMotore_application::read(m);
|
||
|
||
if (err == NOERR)
|
||
{
|
||
TDocumento_mask& mask = (TDocumento_mask&) m;
|
||
TDocumento& doc = mask.doc();
|
||
const TString k = doc.get(DOC_K);
|
||
TSheet_field & sh = mask.sfield(F_SHEET);
|
||
|
||
for (int i = 1 ; i <= doc.physical_rows(); i++)
|
||
if (k == doc[i].get(RDOC_K))
|
||
{
|
||
doc[i].zero(RDOC_K);
|
||
TToken_string & r = sh.row(i - 1);
|
||
r.add("", sh.cid2index(FR_JOLLY2));
|
||
}
|
||
}
|
||
return err;
|
||
}
|
||
|
||
//ridefinisco il metodo init_insert_mode della TMotore_application
|
||
void TGestione_preventivo_app::init_insert_mode(TMask &m)
|
||
{
|
||
m.disable(F_REVISION);
|
||
m.enable(F_LOAD_COSTS);
|
||
return TMotore_application::init_insert_mode(m);
|
||
}
|
||
|
||
void TGestione_preventivo_app::init_modify_mode(TMask &m)
|
||
{
|
||
TGestione_preventivo_msk& mask = (TGestione_preventivo_msk&) m;
|
||
const TDocumento& d = mask.doc();
|
||
const TCodice_numerazione& num = d.codice_numerazione();
|
||
mask.enable(F_REVISION, !d.bloccato() && num.revision_len() > 0);
|
||
mask.enable(F_LOAD_COSTS, !d.bloccato());
|
||
|
||
return TMotore_application::init_modify_mode(m);
|
||
}
|
||
|
||
int pe0400( int argc, char* argv[])
|
||
{
|
||
TGestione_preventivo_app a;
|
||
|
||
a.run( argc, argv, TR("Gestione Preventivi"));
|
||
return 0;
|
||
}
|