diff --git a/pe/pe0400.cpp b/pe/pe0400.cpp index de9ca65dc..39deec78a 100755 --- a/pe/pe0400.cpp +++ b/pe/pe0400.cpp @@ -23,6 +23,7 @@ #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 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--) ////////////////////////////////////////// @@ -52,12 +53,14 @@ protected: 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); virtual void user_set_handler( short fieldid, int index); virtual void user_set_row_handler(TMask& rm, short field, int index); @@ -85,7 +88,9 @@ class TGestione_preventivo_app : public TMotore_application 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() {} @@ -210,6 +215,7 @@ void TGestione_preventivo_msk::update_costi_ricavi(int nrow, bool update_sheet) break; } } + bool TGestione_preventivo_msk::ss_notify(TSheet_field& ss, int r, KEY key) { TGestione_preventivo_msk& mask = (TGestione_preventivo_msk&) ss.mask(); @@ -322,7 +328,6 @@ bool TGestione_preventivo_msk::ss_notify(TSheet_field& ss, int r, KEY key) 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); @@ -365,7 +370,6 @@ TVariable_mask * TGestione_preventivo_msk::riga_mask(int numriga) } - void TGestione_preventivo_msk::doc2mask(bool reload_clifo, bool force_load, bool update) { TDocumento_mask::doc2mask(reload_clifo, force_load, false); @@ -534,29 +538,49 @@ bool TGestione_preventivo_msk::pe_incolla_handler(TMask_field& f, KEY k) return ok; } -/*bool TGestione_preventivo_msk::pe_usek_handler(TMask_field& f, KEY k) +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(); - const bool has_k = mask.get_bool(F_USEK); - const TDocumento & d = mask.doc(); - const int righe = d.physical_rows(); - TSheet_field & sh = mask.sfield(F_SHEET); + TDocumento & d = mask.doc(); + TDocumento backup(d); + const TTipo_documento & td = cached_tipodoc(d.get(DOC_TIPODOC)); + const char stato_iniziale = d.stato(); - for (int i = 0; i < righe; i++) + d.put(DOC_STATO, td.stato_bloccato()); + if (d.rewrite() == NOERR) { - 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)); + long ndoc = d.get_long(DOC_NDOC); - sh.enable_cell(i, sh.cid2index(FR_JOLLY2), price_enabled && has_k); + 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) + { + mask.doc2mask(false); + mask.load_checks(); + mask.mask2doc(); + } + } + else + ok = false; + } + else + ok = false; + if (!ok) + { + backup.stato(stato_iniziale); + ok = backup.rewrite() == NOERR; } - sh.force_update(); } - return true; -} */ + return ok; +} /////////////////////// // HANDLER DI RIGA // @@ -908,6 +932,28 @@ void TGestione_preventivo_msk::user_set_handler( short fieldid, int index) } } +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; + + if (((newndoc - 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"); @@ -947,6 +993,9 @@ TMask* TGestione_preventivo_app::get_mask( int mode ) TSheet_field & sh = m->sfield(F_SHEET); const int y = m->sh_y() - 1; + m->add_button(F_REVISION, sh.page(), "Rev.", 76, y - 2, 1, 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); @@ -982,6 +1031,28 @@ TMask* TGestione_preventivo_app::get_mask( int mode ) 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 ) { @@ -1051,9 +1122,22 @@ int TGestione_preventivo_app::read(TMask& m) void TGestione_preventivo_app::init_insert_mode(TMask &m) { TGestione_preventivo_msk & mask = (TGestione_preventivo_msk&) m; - TDocumento& d = mask.doc(); - return TMotore_application::init_insert_mode(m); + mask.disable(F_REVISION); + + return TMotore_application::init_insert_mode(m); +} + +void TGestione_preventivo_app::init_modify_mode(TMask &m) +{ + TGestione_preventivo_msk & mask = (TGestione_preventivo_msk&) m; + TDocumento& d = mask.doc(); + const TCodice_numerazione& num = cached_numerazione(d.get(DOC_CODNUM)); + + mask.enable(F_REVISION, num.revision_len() > 0); + + + return TMotore_application::init_modify_mode(m); } int pe0400( int argc, char* argv[])