From 4eb316df665967e3b25b5a0a8f3d9fb82964777d Mon Sep 17 00:00:00 2001 From: guy Date: Wed, 10 Dec 2014 16:16:57 +0000 Subject: [PATCH] Aggiunto modulo SAL git-svn-id: svn://10.65.10.50/branches/R_10_00@23025 c028cbd2-c16b-5b4b-a496-9718f37d4682 --- sl/sl0.cpp | 18 + sl/sl0.h | 7 + sl/sl0100.cpp | 1547 ++++++++++++++++++++++++++++++++++++++++++++++++ sl/sl0100a.h | 102 ++++ sl/sl0100a.uml | 233 ++++++++ sl/sl0100b.uml | 971 ++++++++++++++++++++++++++++++ sl/sl0101.cpp | 593 +++++++++++++++++++ sl/sl0101.h | 69 +++ sl/sl0200.cpp | 322 ++++++++++ sl/sl0200.h | 16 + sl/sl1400.rep | 313 ++++++++++ sl/sl1500.rep | 344 +++++++++++ sl/sl1600.rep | 457 ++++++++++++++ 13 files changed, 4992 insertions(+) create mode 100644 sl/sl0.cpp create mode 100644 sl/sl0.h create mode 100644 sl/sl0100.cpp create mode 100644 sl/sl0100a.h create mode 100644 sl/sl0100a.uml create mode 100644 sl/sl0100b.uml create mode 100644 sl/sl0101.cpp create mode 100644 sl/sl0101.h create mode 100644 sl/sl0200.cpp create mode 100644 sl/sl0200.h create mode 100644 sl/sl1400.rep create mode 100644 sl/sl1500.rep create mode 100644 sl/sl1600.rep diff --git a/sl/sl0.cpp b/sl/sl0.cpp new file mode 100644 index 000000000..8d1433944 --- /dev/null +++ b/sl/sl0.cpp @@ -0,0 +1,18 @@ +#include +#include "sl0.h" + +int main(int argc, char** argv) +{ + int rt = -1; + const int r = (argc > 1) ? atoi( &argv[1][1] ) : 0; + + switch (r) + { + case 0: + default: + rt = sl0100(argc, argv); + break; + } + return rt; +} + diff --git a/sl/sl0.h b/sl/sl0.h new file mode 100644 index 000000000..d839bd924 --- /dev/null +++ b/sl/sl0.h @@ -0,0 +1,7 @@ +#ifndef __SL0_H +#define __SL0_H + +int sl0100(int argc, char* argv[]); // SAL + +#endif // __SL0_H + diff --git a/sl/sl0100.cpp b/sl/sl0100.cpp new file mode 100644 index 000000000..2ca18be82 --- /dev/null +++ b/sl/sl0100.cpp @@ -0,0 +1,1547 @@ +#include +#include +#include +#include +#include +#include +#include + +#include "sl0100a.h" +#include "sl0101.h" +#include "sl0200.h" + +#include "../ca/calib01.h" +#include "../ve/velib.h" + +#include "../db/rdist.h" +#include "../mg/anamag.h" +#include "../ca/commesse.h" + +/////////////////////////////////////////////////////////// +// TSAL_app +/////////////////////////////////////////////////////////// + +class TSAL_app : public TRelation_application +{ + TMask* _qmsk; + TMask* _emsk; + TRelation* _rel; + +protected: + int save_rows(const TMask& m); + virtual const char* extra_modules() const { return "ci"; } + const char* record_description(const TRelation& r) const; + bool save_and_print(TPrtype mode); + +public: + virtual bool user_create(); + virtual bool user_destroy(); + virtual bool changing_mask(int mode) { return true; } + virtual TMask* get_mask(int mode) { return mode == MODE_QUERY ? _qmsk : _emsk; } + virtual TRelation* get_relation() const { return _rel; } + virtual bool has_filtered_cursor() const { return true; } + virtual TCursor& get_filtered_cursor() const; + + virtual bool get_next_key(TToken_string& key); + virtual void init_insert_mode(TMask& m); + virtual void init_modify_mode(TMask& m); + + virtual int read(TMask& m); + virtual int write(const TMask& m); + virtual int rewrite(const TMask& m); + virtual bool remove(); + + virtual void print(); + bool report(const char* name); + + void update_tools(TMask& m); +}; + +inline TSAL_app& app() { return (TSAL_app&)main_app(); } + +/////////////////////////////////////////////////////////// +// TSAL_msk +/////////////////////////////////////////////////////////// + +// Classe di base per maschere preventivi (query ed edit) +class TSAL_msk : public TAutomask +{ +protected: + virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); + virtual TMask_field* parse_field(TScanner& s); + +public: + const TString& fget(const char* fld) const; + void fset(const char* fld, const TString& val, int hit=0x0); + + TSAL_msk(const char* name) { read_mask(name, 0, 8); set_handlers(); } +}; + +TMask_field* TSAL_msk::parse_field(TScanner& s) +{ + if (s.key() == "TL") + set_full_screen_interface(page_win(1), true); + return TAutomask::parse_field(s); +} + +// Legge il valore di un campo multiplo (commessa, fase, ...) da maschera e lo restituisce come unico valore +const TString& TSAL_msk::fget(const char* fld) const +{ + TString& val = get_tmp_string(); + FOR_EACH_MASK_FIELD(*this, i, f) + { + const TFieldref* fr = f->field(); + if (fr != NULL && fr->name() == fld) + { + if (fr->from() > 0 || fr->to() > 0) + val.overwrite(f->get(), fr->from()); + else + { + val = f->get(); + break; + } + } + } + return val; +} + +// Spezza un valore unico su più sottocampi (commessa, fase, ...) +void TSAL_msk::fset(const char* fld, const TString& val, int hit) +{ + FOR_EACH_MASK_FIELD(*this, i, f) + { + const TFieldref* fr = f->field(); + if (fr != NULL && fr->name() == fld) + { + if (fr->from() > 0 || fr->to() > 0) + { + const TString& str = val.sub(fr->from(), fr->to()); + f->set(str); + } + else + f->set(val); + if ((f->active() || f->ghost())) + { + f->set_dirty(); + if (hit & 0x2) + f->check(); + if (hit & 0x1) + f->on_hit(); + } + } + } +} + + +bool TSAL_msk::on_field_event(TOperable_field& o, TField_event e, long jolly) +{ +// switch (o.dlg()) +// { +// default: + if ((e == fe_modify || e == fe_close) && (!o.empty() && o.is_edit())) + { + const TFieldref* fr = o.field(); + if (fr != NULL && fr->name() == RDOC_CODCMS) + { + const TString& cms = fget(RDOC_CODCMS); + const TRectype& rec = cache().get(LF_COMMESSE, cms); + if (rec.get_bool(COMMESSE_CHIUSA)) + return error_box(FR("Impossibile utilizzare la commessa chiusa %s"), (const char*)cms); + } + } +// break; +// } + return true; +} + +/////////////////////////////////////////////////////////// +// TSAL_qmsk +/////////////////////////////////////////////////////////// + +class TSAL_qmsk : public TSAL_msk +{ +protected: + virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); + bool choose_best(TCursor& cur, const char* codtab); + +public: + TSAL_qmsk(); +}; + +// Inizialmente seleziona solo i documenti cliente +static const char* m_tipocf = "C"; + +static bool tipoc_filter(const TRelation* rel) +{ + const TCodice_numerazione& codnum = cached_numerazione(rel->curr().get("CODTAB")); + for (int i = 0; ; i++) + { + const TString& td = codnum.tipo_doc(i); + if (td.blank()) + break; + const TTipo_documento& tipodoc = cached_tipodoc(td); + TFilename ini; tipodoc.profile_name(ini); + if (ini.custom_path()) + { + const TString& tipocf = ini_get_string(ini, "MAIN", "TIPOCF"); + if (tipocf == m_tipocf) + return true; + } + } + return false; +} + +// Seleziona solo gli ordini +static bool ord_filter(const TRelation* rel) +{ return rel->curr().get_int("I1") == 3 && tipoc_filter(rel); } + +// Seleziona solo le bolle +static bool sal_filter(const TRelation* rel) +{ return rel->curr().get_int("I1") == 1 && tipoc_filter(rel); } + +bool TSAL_qmsk::choose_best(TCursor& cur, const char* codtab) +{ + const TRecnotype recs = cur.items(); + if (recs > 0) + { + cur.freeze(); + TRecnotype best = 0; + double score = 0; + for (cur = 0L; cur.pos() < recs; ++cur) + { + const TString& cod = cur.curr().get("CODTAB"); + const double s = xvt_str_fuzzy_compare(cod, codtab); + if (s > score) + { + score = s; + best = cur.pos(); + } + } + cur = best; + cur.freeze(false); + } + return recs > 0; +} + +bool TSAL_qmsk::on_field_event(TOperable_field& o, TField_event e, long jolly) +{ + switch (o.dlg()) + { + case F_TIPOCF: + if (e == fe_modify) + { + m_tipocf = get(F_TIPOCF); // Seleziona Clienti o Fornitori + on_field_event(efield(F_CODNUM_ORD), fe_init, 0); + on_field_event(efield(F_CODNUM), fe_init, 0); + } + break; + case F_CODNUM_ORD: + if (e == fe_init) + { + TEdit_field& codnum_ord = (TEdit_field&)o; + TCursor& cur_ord = *codnum_ord.browse()->cursor(); + cur_ord.set_filterfunction(ord_filter); + if (choose_best(cur_ord, "ORC")) + codnum_ord.browse()->do_output(STARTING_CHECK); + } + break; + case F_CODNUM: + if (e == fe_init) + { + TEdit_field& codnum_sal = (TEdit_field&)o; + TCursor& cur_sal = *codnum_sal.browse()->cursor(); + cur_sal.set_filterfunction(sal_filter); + if (choose_best(cur_sal, "SAL")) + { + codnum_sal.browse()->do_output(RUNNING_CHECK); + e = fe_modify; + } + } + if (e == fe_modify && !o.empty()) + { + const TString& sal = o.get(); + const TCodice_numerazione& codnum = cached_numerazione(sal); + int best = 0; + double score = 0; + for (int i = 0; ; i++) + { + const TString& td = codnum.tipo_doc(i); + if (td.blank()) + break; + const double s = xvt_str_fuzzy_compare(td, sal); + if (s > score) + { + score = s; + best = i; + } + } + set(F_TIPODOC, codnum.tipo_doc(best), 0x2); + } + break; + case F_NSAL: + if (e == fe_modify && !o.empty()) + { + static bool blocked = false; + if (!blocked) + { + blocked = true; + const int nsal = atoi(o.get()); + TEdit_field& fld_nsal = efield(F_NDOC); + TCursor& cur_nsal = *fld_nsal.browse()->cursor(); + int n = 0; + for (cur_nsal = 0L; cur_nsal.ok(); ++cur_nsal) + { + n = cur_nsal.curr().get_int(DOC_NUMANT); + if (n == nsal) + break; + } + + if (nsal > n) + { + o.reset(); + send_key(K_SPACE, DLG_NEWREC, &o); + } + else + { + fld_nsal.browse()->do_output(); + stop_run(K_AUTO_ENTER); + } + blocked = false; + } + } + break; + default: + if (e == fe_modify && o.is_edit() && o.dlg() > F_CDC0) // Probabile commessa? + { + const TFieldref* fr = o.field(); + if (fr != NULL && fr->name() == DOC_CODCMS) // Campo commessa + { + const TRectype& cur = ((TEdit_field&)o).browse()->cursor()->curr(); + const long codcf = cur.get_long(COMMESSE_CODCF); + if (codcf > 0) set(F_CLIFO, codcf); + const int anno = cur.get_int(COMMESSE_ANNO); + if (anno > 0) set(F_ANNO_ORD, anno); + } + } + break; + } + return TSAL_msk::on_field_event(o, e, jolly); +} + +TSAL_qmsk::TSAL_qmsk() : TSAL_msk("sl0100a") +{ + TMask_field& cdc0 = field(F_CDC0); + RCT rct0; cdc0.get_rect(rct0); + const int yca = rct0.top / ROWY + 1; // Riga del primo campo di analitica + short idcdc, idcms, idfase, idconto; + ca_create_fields_ext(*this, 0, 2, yca, F_CDC0+1, idcdc, idcms, idfase, idconto, + DOC_CODCOSTO, DOC_CODCMS /*, DOC_FASCMS */); // Niente fasi qui! + set_handlers(); +} + +/////////////////////////////////////////////////////////// +// TSAL_emsk +/////////////////////////////////////////////////////////// + +class TSAL_emsk : public TSAL_msk +{ + TSAL_tree* _tree; + TString80 _idfase, _iddist, _edit_fase; + int _edit_dist, _edit_misu; + int _curr_dist, _curr_misu; + bool _locked; + +private: + // bool on_fasi_button(TOperable_field& btn, TField_event e, long jolly); + bool on_fasi_event(TTree_field& s, TField_event e, long jolly); + bool set_fase(const TString& idf); + bool set_dist(const TString& idd); + bool set_dist(int row); + + void update_dist(const real& val, const TDate& dt); + void update_dist_qta(); + + bool on_misu_event(TOperable_field& o, TField_event e, long jolly); + bool on_dist_event(TOperable_field& o, TField_event e, long jolly); + +protected: + virtual bool on_key(KEY k); + virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); + void set_sheet_color(short id, COLOR col); + bool sync_totdoc(); + bool sync_tree(); + bool msk2rec(const TMask& msk, TRectype& rec) const; + +public: + TSAL_tree& tree(bool reset = false); + + TSAL_emsk(); +}; + +TSAL_tree& TSAL_emsk::tree(bool reset) +{ + if (_tree == NULL) + { + _tree = new TSAL_tree(tfield(F_FASI)); + reset = true; + } + if (reset) + { + TRectype doc(LF_DOC); + doc.put(DOC_PROVV, 'D'); + doc.put(DOC_ANNO, get(F_ANNO)); + doc.put(DOC_CODNUM, get(F_CODNUM)); + doc.put(DOC_NDOC, get(F_NDOC)); + _tree->append_row(doc); + TTree_field& tf = tfield(F_FASI); + tf.set_tree(_tree); + tf.hide_leaves(); + } + return *_tree; +} + +static bool set_and_check(TMask_field& f, const TRectype& rec) +{ + const TFieldref* fr = f.field(); + if (fr == NULL) + { + if (f.ghost()) + return f.on_hit(); + return false; + } + + if (fr->name() == RDOC_DESCR) + { + TString descr(255); + descr = rec.get(RDOC_DESCR); + if (rec.get_bool(RDOC_DESCLUNGA)) + descr << rec.get(RDOC_DESCEST); + f.set(descr); + } + else + { + f.set(fr->read(rec)); + if (!f.empty() && f.is_edit() && f.shown()) + { + const TBrowse* b = ((TEdit_field&)f).browse(); + if (b != NULL) + { + const TFixed_string of = b->get_output_fields(); + if (of.find('|') > 0) // C'è un pipe nell'output, per cui ci sono almeno due campi di output + f.check(STARTING_CHECK); + } + } + } + return true; +} + + +// Riempie gli sheet di articoli e misure della distinta selezionata +bool TSAL_emsk::set_dist(const TString& idd) +{ + TSAL_tree& t = tree(); + + bool ok = idd.full(); + if (_iddist != idd) + { + _iddist = idd; + + // Svuota sheet misure + TSheet_field& s = sfield(F_MISURE); + s.hide(); + s.destroy(); + + // Scandisce i figli della distinta e li smista tra i due sheet + ok = idd.full() && t.goto_node(idd); + if (ok) + { + _locked = true; // Diabilita ricalcolo prezzi + int n = 0; + for (bool ok = t.goto_firstson(); ok; ok = t.goto_rbrother()) + { + const TRectype& rec = *t.curr_row(); + TMask& m = s.sheet_row_mask(n); + FOR_EACH_MASK_FIELD(m, i, f) + set_and_check(*f, rec); + s.update_row(n++); + } + _locked = false; + } + + // Visualizza nuovamente lo sheet eventualemente riempito + s.force_update(); s.show(); + } + + _curr_dist = -1; + if (ok && t.goto_node(idd)) + { + _curr_dist = 0; + while(t.goto_lbrother()) + _curr_dist++; + } + + return ok; +} + +bool TSAL_emsk::set_dist(int row) +{ + TSAL_tree& t = tree(); + bool ok = _idfase.full() && t.dist(_idfase, row) != NULL; + if (ok) + { + TString16 idd; t.curr_id(idd); + ok = set_dist(idd); + CHECK(ok && row == _curr_dist, "Distinta sospetta"); + } + return ok; +} + +// Riempie lo sheet delle distinte della fase selezionata +bool TSAL_emsk::set_fase(const TString& idfase) +{ + _idfase = idfase; + + // Svuota lo sheet delle distinte + TSheet_field& d = sfield(F_DISTINTE); + d.destroy(); + + TString idd; + TSAL_tree& t = tree(); + bool ok = idfase.full() && t.goto_node(idfase); + if (ok) + { + // Scandisce le distinte della fase corrente + if (t.goto_firstson()) + { + t.curr_id(idd); // Memorizza la prima distinta per dopo... + int n = 0; + do + { + const TRectype& rec = *t.curr_row(); + TMask& m = d.sheet_row_mask(n); + FOR_EACH_MASK_FIELD(m, i, f) + set_and_check(*f, rec); + d.update_row(n++); + } while (t.goto_rbrother()); + } + } + d.force_update(); + set_dist(idd); + + return ok; +} + +bool TSAL_emsk::msk2rec(const TMask& msk, TRectype& rec) const +{ + TRelation rel(rec.num()); + rel.curr() = rec; + msk.autosave(rel); + rec = rel.curr(); + const TString& desc = msk.get(RDOC_DESCR); + const int maxlen = rec.length(RDOC_DESCR); + int spc = desc.find('\n'); + if (spc >= 0 || desc.len() > maxlen) + { + if (spc < 0 || spc > maxlen) + { + spc = desc.left(maxlen).rfind(' '); + if (spc < maxlen/2) + spc = maxlen; + } + rec.put(RDOC_DESCR, desc.left(spc)); + rec.put(RDOC_DESCLUNGA, "X"); + rec.put(RDOC_DESCEST, desc.mid(spc)); + } + else + { + rec.put(RDOC_DESCR, desc); + rec.zero(RDOC_DESCLUNGA); + rec.put(RDOC_DESCEST, ""); + } + return !rec.empty(); +} + +bool TSAL_emsk::on_key(KEY k) +{ + if (k == K_SHIFT + K_F12) + { + enable(F_STATO); + return true; + } + return TAutomask::on_key(k); +} + +/* +bool TSAL_emsk::on_fasi_button(TOperable_field& o, TField_event e, long jolly) +{ + TSAL_tree& t = tree(); + TTree_field& fasi = t.owner(); + + TSAL_level pl = sl_documento; + if (fasi.goto_selected()) + pl = t.level(); + else + return false; + + if (pl == sl_documento && o.dlg() == F_FASENEW) + pl = sl_fase1; + + if (pl < sl_fase1 || pl > sl_distinta) + return false; + + o.disable(); + switch (o.dlg()) + { + case F_FASENEW: + { + TMask m("Nuovo", 1, 46, 7); + m.add_string(S_CODART, 0, "Codice ", 1, 1, 20).check_type(CHECK_REQUIRED); + m.add_string(S_DESCR, 0, "Descrizione ", 1, 2, 50, "", 30).check_type(CHECK_REQUIRED); + m.add_button(DLG_OK, 0, "", -12, -1, 10, 2); + m.add_button(DLG_CANCEL, 0, "", -22, -1, 10, 2); + if (m.run() == K_ENTER) + { + TRectype* rec = t.new_row(pl); + rec->put(RDOC_CODART, m.get(S_CODART)); + rec->put(RDOC_DESCR, m.get(S_DESCR)); + if (tree().level() == pl) + t.add_rbrother(rec); + else + { + t.append_row(*rec); + delete rec; + } + } + } + break; + case F_FASEDIT: + { + TRectype& rec = *t.curr_row(); + TMask m("Modifica", 1, 46, 7); + m.add_string(S_CODART, 0, "Codice ", 1, 1, 20).check_type(CHECK_REQUIRED); + m.add_string(S_DESCR, 0, "Descrizione ", 1, 2, 50, "", 30).check_type(CHECK_REQUIRED); + m.add_button(DLG_OK, 0, "", -13, -1, 10, 2); + m.add_button(DLG_DELREC, 0, "", -23, -1, 10, 2); + m.add_button(DLG_CANCEL, 0, "", -33, -1, 10, 2); + m.set(S_CODART, rec.get(RDOC_CODART)); + m.set(S_DESCR, rec.get(RDOC_DESCR)); + switch (m.run()) + { + case K_ENTER: + rec.put(RDOC_CODART, m.get(S_CODART)); + rec.put(RDOC_DESCR, m.get(S_DESCR)); + break; + case K_DEL: + t.kill_node(); + break; + default: + break; + } + } + break; + default: + break; + } + o.enable(); + fasi.select_current(); + fasi.force_update(); + return true; +} +*/ + +bool TSAL_emsk::on_fasi_event(TTree_field& fasi, TField_event e, long jolly) +{ + bool modified = false; + bool can_edit = false; + bool can_goup = false; + bool can_godn = false; + + switch (e) + { + case fe_modify: + if (fasi.goto_selected()) + { + modified = true; + TSAL_tree& t = tree(); + TSAL_level td = t.level(); + if (td > sl_documento) + { + can_edit = true; + can_goup = t.has_lbrother(); + can_godn = t.has_rbrother(); + if (td < sl_distinta) // Cambio fase + { + TString16 id; + t.curr_id(id); + set_fase(id); + } + else + { + while (td > sl_distinta) + { + t.goto_father(); + td = t.level(); + } + TString idd; t.curr_id(idd); + if (t.goto_father()) + { + TString idf; t.curr_id(idf); + if (idf != _idfase) + set_fase(idf); + } + set_dist(idd); + } + } + } + break; + default: + break; + } + + // if (modified) enable(F_FASEDIT, can_edit); + + return true; +} + +bool TSAL_emsk::on_dist_event(TOperable_field& o, TField_event e, long jolly) +{ + switch (o.dlg()) + { + case S_CODART: + if (e == fe_modify && !o.empty()) + { + const TString& codart = o.get(); + TMask& m = o.mask(); + + TToken_string tok; tok << codart << "|1"; + const TString& um = cache().get(LF_UMART, tok, "UM"); + if (um.full()) + m.set(S_UMART, um); + + TEdit_field& iva = m.efield(S_CODIVA); + if (iva.empty()) + on_dist_event(iva, fe_init, jolly); + } + break; + case S_CODIVA: + if ((e == fe_init || e == fe_close) && o.empty()) + { + const TString& codcms = fget(DOC_CODCMS); + TString4 codiva = cache().get(LF_COMMESSE, codcms, COMMESSE_CODIVA); + if (codiva.blank()) + { + const TString& codart = o.mask().get(S_CODART); + codiva = cache().get(LF_ANAMAG, codart, ANAMAG_CODIVA); + } + o.set(codiva); + } + break; + case F_DISTINTE: + switch (e) + { + case se_enter: + _edit_dist = -1; + set_dist(_curr_dist = jolly); + break; + case se_query_add: + return _idfase.full(); + case se_notify_add: + { + TSAL_tree& t = tree(); + TRectype* rec = t.dist(_idfase, _curr_dist = jolly, true); + if (rec != NULL) + sync_tree(); + } + break; + case se_query_modify: + if (jolly != _curr_dist) + set_dist(jolly); + _edit_fase = _idfase; + _edit_dist = _curr_dist = jolly; + break; + case se_leave: + case se_notify_modify: + if (_edit_dist >= 0) + { + const int r = _edit_dist; // Memorizza numero riga corrente + _edit_dist = -1; // Annulla numero riga corrente + TRectype* rec = tree().dist(_edit_fase, r, false); + if (rec != NULL) + { + const TSheet_field& sheet = (TSheet_field&)o; + const TMask& m = sheet.sheet_row_mask(r); + msk2rec(m, *rec); + sync_tree(); + } + } + break; + case se_notify_del: + if (_curr_dist >= 0) + { + TSAL_tree& t = tree(); + TRectype* rec = t.dist(_idfase, _curr_dist); + if (rec != NULL) + { + t.kill_node(); + sync_tree(); + } + } + break; + default: break; + } + break; + default: break; + } + return true; +} + +bool TSAL_emsk::on_misu_event(TOperable_field& o, TField_event e, long jolly) +{ + switch (o.dlg()) + { + case 102: + case 103: + case 104: + case 105: + if (e == fe_modify && _curr_misu >= 0 && _curr_dist >= 0) + { + TSheet_field& misure = sfield(F_MISURE); + TEdit_field& tot = o.mask().efield(106); + tot.validate(K_TAB); + misure.row(_curr_misu).add(tot.get(), 5); + update_dist_qta(); + } + break; + case F_MISURE: + switch (e) + { + case se_query_add: + return _iddist.full(); + case se_notify_add: + tree().misu(_iddist, _edit_misu = jolly, true); + break; + case se_enter: + _edit_misu = -1; + _curr_misu = jolly; + break; + case se_query_modify: + _edit_fase = _idfase; + _edit_dist = _curr_dist; + _edit_misu = _curr_misu = jolly; + break; + case se_leave: + case se_notify_modify: + if (_edit_dist >= 0 && _edit_misu >= 0) + { + TSAL_tree& t = tree(); + t.dist(_edit_fase, _edit_dist, false); + TString idd; t.curr_id(idd); + TRectype* rec = t.misu(idd, _edit_misu, false); + if (rec != NULL) + { + TSheet_field& sheet = (TSheet_field&)o; + const TMask& m = sheet.sheet_row_mask(_edit_misu); + msk2rec(m, *rec); + update_dist_qta(); + } + _edit_misu = -1; + } + break; + case se_notify_del: + if (_curr_misu >= 0) + { + TSAL_tree& t = tree(); + TRectype* rec = t.misu(_iddist, _curr_misu); + if (rec != NULL) + { + t.kill_node(); + update_dist_qta(); + } + } + break; + default: break; + } + default: + break; + } + return true; +} + +void TSAL_emsk::update_dist(const real& val, const TDate& dt_new) +{ + TSheet_field& dist = sfield(F_DISTINTE); + TToken_string& row = dist.row(_curr_dist); + row.add(val.string(), dist.cid2index(S_QTA)); + if (dt_new.ok()) + { + TDate dt_old; row.get(dist.cid2index(S_DATALAV), dt_old); + if (dt_new > dt_old) + row.add(dt_new.string(), dist.cid2index(S_DATALAV)); + } + dist.update_mask(_curr_dist); + TOperable_field& o = dist.sheet_row_mask(_curr_dist).efield(S_QTA); + on_dist_event(o, fe_modify, 1); + dist.force_update(_curr_dist); + TRectype* rec = tree().dist(_idfase, _curr_dist); + if (rec) + msk2rec(dist.sheet_row_mask(_curr_dist), *rec); +} + +void TSAL_emsk::update_dist_qta() +{ + if (_curr_dist >= 0) + { + TSheet_field& sheet = sfield(F_MISURE); + real tot; + TDate data_lavori; + FOR_EACH_SHEET_ROW(sheet, i, row) + { + tot += real(row->get(sheet.cid2index(106))); // 106 = totale + const TDate data = row->get(); + if (data > data_lavori) + data_lavori = data; + } + update_dist(tot, data_lavori); + sync_tree(); + } +} + +struct SAL_tot : public TObject +{ + real _totdoc; + real _sicurezza; + real _esclusi; + + real _t_totdoc; + real _t_sicurezza; + real _t_esclusi; + +}; + +static bool calc_totdoc(TTree& tree, void* jolly, word) +{ + const TSAL_tree& t = (const TSAL_tree&)tree; + const TRectype& rec = *t.curr_row(); + if (t.level(rec) == sl_distinta) + { + const real qta = rec.get(RDOC_QTA); // da 3 a 5 decimali + const real prz = rec.get(RDOC_PREZZO); // da 0 a 3 decimali + if (!qta.is_zero() && !prz.is_zero()) + { + const int tipo = rec.get_int(RDOC_TIPODET); // 0=lavori, ..., 3=Sicurezza, 4=esclusi + + const TCurrency parziale(real(qta * prz)); // arrotonda all'euro + const real& imp = parziale.get_num(); + SAL_tot& tot = *(SAL_tot*)jolly; + tot._totdoc += imp; + + switch (tipo) + { + case 3: tot._sicurezza += imp; break; + case 4: tot._esclusi += imp; break; + default: break; + } + } + } + return false; +} + +bool TSAL_emsk::sync_totdoc() +{ + TSAL_tree& t = tree(); + + if (!t.goto_root()) + return false; + + const bool attivo = get(F_TIPOCF)[0] != 'F'; + const TRectype& doc = *t.curr_row(); + + real importo_base, sicurezza_cantiere; + TString4 codiva; + + SAL_tot tot; + t.scan_depth_first(calc_totdoc, &tot); + + if (t.goto_firstson()) + { + const TRiga_documento* row = (TRiga_documento*)t.curr_row(); + const TRectype* ord = row->find_original_doc(); + if (ord != NULL) + { + const TVariable_rectype ordine(*ord); + importo_base = ordine.get_real("TOTDOC"); + + if (!attivo) + { + TDocumento orig(*ord); + FOR_EACH_PHYSICAL_RDOC(orig, r, rdoc) + { + codiva = rdoc->get(RDOC_CODIVA); + if (codiva.full()) + break; + } + } + } + } + + const TRectype& cantiere = cache().get(LF_COMMESSE, doc.get(DOC_CODCMS)); + + const real& lor = tot._totdoc; + const real& esc = tot._esclusi; + real sic = tot._sicurezza; + real prib; + + if (attivo) + { + if (importo_base.is_zero()) + importo_base = cantiere.get_real(COMMESSE_IMPORTOB); + sicurezza_cantiere = cantiere.get_real(COMMESSE_SICUREZZA); + prib = cantiere.get_real(COMMESSE_RIBASSO); + if (codiva.blank()) + codiva = cantiere.get(COMMESSE_CODIVA); + } + + set(F_SAL_LOR, lor); + + if (sic.is_zero() && !importo_base.is_zero()) + { + sic = lor * sicurezza_cantiere / importo_base; + sic.round(2); + } + set(F_SAL_SIC, sic); + set(F_SAL_ESC, esc); + const real sicesc = sic + esc; + set(F_SAL_SIC2, sicesc); + + const real idr = lor - sicesc; + set(F_SAL_IDR, idr); + + set(F_SAL_PRIB, prib); + real rib = idr * prib / CENTO; rib.round(2); + set(F_SAL_RIB, rib); + + const real irb = idr - rib; + set(F_SAL_IRB, irb); + + const real sal = irb + sicesc; + set(F_SAL_SAL, sal); + + real pgar = ZERO; + const TString& exp_gar = get(F_PGARANZIA); + if (exp_gar.full()) + { + TString80 dummy; + if (scontoexpr2perc(exp_gar, false, dummy, pgar)) + pgar = (UNO-pgar)*CENTO; + } + set(F_SAL_PGAR, pgar); + real gar = sal * pgar / CENTO; gar.round(2); + set(F_SAL_GAR, gar); + + real ant = ZERO; + real pant = ZERO; + const TString& exp_ant = get(F_PANTICIPO); + if (exp_ant.full()) + { + TString80 dummy; + real eant = ZERO; + if (scontoexpr2perc(exp_ant, false, dummy, eant)) + { + pant = (UNO-eant)*CENTO; + ant = sal * pant / CENTO; + ant.round(2); + } + } + set(F_SAL_PANT, pant); + set(F_SAL_ANT, ant); + + const real net = sal - ant - gar; + set(F_SAL_NET, net); + + real piva = ZERO; + if (codiva.full()) + piva = real(cache().get("%IVA", codiva, "R0")); + real iva = net * piva / CENTO; iva.round(2); + set(F_SAL_PIVA, piva); + set(F_SAL_IVA, iva); + set(F_SAL_TOT, real(net + iva)); + + return !sal.is_zero(); +} + +bool TSAL_emsk::sync_tree() +{ + TSAL_tree& t = tree(); + TTree_field& tf = t.owner(); + tf.force_update(); + return sync_totdoc(); +} + +bool TSAL_emsk::on_field_event(TOperable_field& o, TField_event e, long jolly) +{ + switch (o.dlg()) + { + case F_STATO: + if ((e == fe_init || e == fe_close) && o.empty()) + o.set("1"); + if (e == fe_modify && !o.empty()) + app().update_tools(*this); + break; + case F_FASI: + return on_fasi_event((TTree_field&)o, e, jolly); +/* + case F_FASENEW: + case F_FASEDIT: + if (e == fe_button) + return on_fasi_button(o, e, jolly); + break; +*/ + case F_DISTINTE: + return on_dist_event(o, e, jolly); + case F_MISURE: + return on_misu_event(o, e, jolly); + case DLG_PRINT: + if (e == fe_button) + app().report("sl1600"); + break; + case B_PRINT_LIB: + if (e == fe_button) + app().report("sl1400"); + break; + case B_PRINT_REG: + if (e == fe_button) + app().report("sl1500"); + break; + case DLG_ELABORA: + if (e == fe_button) + { + const TString16 cod = sl_trova_elaborazione(*this); + if (cod.full()) + { + app().rewrite(*this); + sl_genera_documento(app().get_relation()->curr(), cod); + } + } + break; + case DLG_ARCHIVE: + if (e == fe_button) + { + } + break; + case F_SAL_TOT: + if (e == fe_init && o.empty()) + sync_totdoc(); + break; + default: + if (jolly > 0 && o.dlg() >= DLG_USER && o.dlg() < 2*DLG_USER) // Sheet mask events + { + if (e == fe_modify) + { + switch (jolly) + { + case 1: return on_dist_event(o, e, jolly); + case 2: return on_misu_event(o, e, jolly); + default: CHECK(false, "Unknown sheet field event"); break; + } + } + } + break; + } + return TSAL_msk::on_field_event(o, e, jolly); +} + +void TSAL_emsk::set_sheet_color(short id, COLOR col) +{ + const COLOR rgb = blend_colors(NORMAL_BACK_COLOR, col, 0.75); + TSheet_field& s = sfield(id); + s.set_back_and_fore_color(rgb, NORMAL_COLOR, -1); +} + +TSAL_emsk::TSAL_emsk() : TSAL_msk("sl0100b"), _tree(NULL), _locked(false) +{ + TMask_field& cdc0 = field(F_CDC0); + RCT rct0; cdc0.get_rect(rct0); + const int yca = rct0.top / ROWY + 1; // Riga del primo campo di analitica + short idcdc, idcms, idfase, idconto; + ca_create_fields_ext(*this, 0, 2, yca, F_CDC0+1, idcdc, idcms, idfase, idconto, + DOC_CODCOSTO, DOC_CODCMS /*, DOC_FASCMS */); // Niente fasi qui! + + set_sheet_color(F_DISTINTE, COLOR_YELLOW); + set_sheet_color(F_MISURE, COLOR_GRAY); +} + + +/////////////////////////////////////////////////////////// +// TSAL_app +/////////////////////////////////////////////////////////// + +bool TSAL_app::user_create() +{ + open_files(LF_TAB, LF_TABCOM, LF_CLIFO, LF_ANAMAG, LF_UMART, + LF_DOC, LF_RIGHEDOC, LF_COMMESSE, LF_FASI, 0); + _rel = new TRelation(LF_DOC); + _qmsk = new TSAL_qmsk; + _emsk = new TSAL_emsk; + return true; +} + +bool TSAL_app::user_destroy() +{ + delete _emsk; + delete _qmsk; + delete _rel; + return true; +} + +const char* TSAL_app::record_description(const TRelation& r) const +{ + TString& tmp = get_tmp_string(); + tmp << title() << " n." << r.curr().get(DOC_NUMANT); + return tmp; +} + +TCursor& TSAL_app::get_filtered_cursor() const +{ + TEdit_field& f = _qmsk->efield(F_NDOC); + TCursor& cur = *f.browse()->cursor(); + if (cur.items() == 0) // A volte deve scantarsi ... + f.check(); // ... forzo ricalcolo elementi + return cur; +} + +int TSAL_app::read(TMask& m) +{ + int err = TRelation_application::read(m); + if (err == NOERR) + { + const TRectype& doc = get_relation()->curr(); + TSAL_tree& t = ((TSAL_emsk&)m).tree(); + t.load(doc); + } + return err; +} + +static bool tree_save_row(TTree& tree, void* jolly, word /*flags*/) +{ + TSAL_tree& t = (TSAL_tree&)tree; + const TRectype* rec = t.curr_row(); + if (rec && !rec->empty() && rec->num() == LF_RIGHEDOC) + { + const char* full_field[] = { RDOC_DESCR, RDOC_QTA, RDOC_PREZZO, + RDOC_QTAGG1, RDOC_QTAGG2, RDOC_QTAGG3, + RDOC_QTAGG4, RDOC_QTAGG5, RDOC_DATACONS, + NULL } ; + bool one_full = false; + for (int f = 0; full_field[f] && !one_full; f++) + { + if (f == 0) + one_full = rec->get(full_field[f]).full(); + else + one_full = !rec->get_real(full_field[f]).is_zero(); + } + if (one_full) + { + TDocumento& doc = *(TDocumento*)jolly; + const TString4 tiporiga = rec->get(RDOC_TIPORIGA); + TRectype& row = doc.new_row(tiporiga); + + const TString80 codart = rec->get(RDOC_CODART); + TString80 codartmag; + if (codart.full()) + codartmag = cache().get(LF_ANAMAG, codart, ANAMAG_CODART); + + for (int f = rec->items()-1; f > 5; f--) + { + const char* fld = rec->fieldname(f); + if (rec->type(fld) == _memofld) + break; + const TString& src = rec->get(fld); + if (src.full()) + { + const TString& dst = row.get(fld); + if (dst.blank()) + row.put(fld, src); + } + } + + row.put(RDOC_IDRIGA, row.get(RDOC_NRIGA)); + row.put(RDOC_TIPORIGA, rec->get(RDOC_TIPORIGA)); + row.put(RDOC_QTA, rec->get(RDOC_QTA)); + row.put(RDOC_QTAEVASA, rec->get(RDOC_QTAEVASA)); + row.put(RDOC_DESCR, rec->get(RDOC_DESCR)); + row.put(RDOC_DESCLUNGA, rec->get(RDOC_DESCLUNGA)); + row.put(RDOC_DESCEST, rec->get(RDOC_DESCEST)); + row.put(RDOC_CODART, codart); + row.put(RDOC_CODARTMAG, codartmag); + row.put(RDOC_CHECKED, codartmag.full()); + row.put(RDOC_UMQTA, rec->get(RDOC_UMQTA)); + row.put(RDOC_QTAGG1, rec->get(RDOC_QTAGG1)); + row.put(RDOC_QTAGG2, rec->get(RDOC_QTAGG2)); + row.put(RDOC_QTAGG3, rec->get(RDOC_QTAGG3)); + row.put(RDOC_QTAGG4, rec->get(RDOC_QTAGG4)); + row.put(RDOC_QTAGG5, rec->get(RDOC_QTAGG5)); + row.put(RDOC_PREZZO, rec->get(RDOC_PREZZO)); + row.put(RDOC_DATACONS, rec->get(RDOC_DATACONS)); + row.put(RDOC_TIPOCOLL, rec->get(RDOC_TIPOCOLL)); + row.put(RDOC_IDRIGACOLL,rec->get(RDOC_IDRIGACOLL)); + row.put(RDOC_TIPODET, rec->get(RDOC_TIPODET)); + row.put(RDOC_CODCMS, doc.get(RDOC_CODCMS)); // Commessa/cantiere da DOC + row.put(RDOC_FASCMS, rec->get(RDOC_FASCMS)); // Fase specifica da riga + } + } + return false; // Don't stop scan +} + +int TSAL_app::save_rows(const TMask& m) +{ + TSAL_emsk& sm = (TSAL_emsk&)m; + TSAL_tree& tree = sm.tree(); + + TDocumento doc(get_relation()->curr()); + + doc.destroy_rows(); + if (tree.goto_root() && tree.goto_firstson()) + tree.scan_depth_first(tree_save_row, &doc); + + // Estrae campi analitica da maschera principale e li riporta sulle righe + const TString80 cdc = sm.fget(DOC_CODCOSTO); + const TString80 cms = sm.fget(DOC_CODCMS); + TRecord_array& rdoc = doc.body(); + rdoc.renum_key(RDOC_CODCOSTO, cdc); + rdoc.renum_key(RDOC_CODCMS, cms); + rdoc.renum_key(RDOC_DAPROVV, "D"); + rdoc.renum_key(RDOC_DAANNO, _qmsk->get(F_ANNO_ORD)); + rdoc.renum_key(RDOC_DACODNUM, _qmsk->get(F_CODNUM_ORD)); + rdoc.renum_key(RDOC_DANDOC, _qmsk->get(F_NDOC_ORD)); + + FOR_EACH_MASK_FIELD(sm, i, f) + { + const TFieldref* fr = f->field(); + if (fr != NULL) + { + const TString& value = f->get(); + if (fr->name().starts_with("G1:")) + { + const TString& fname = fr->name().mid(3); + doc.put(fname, value); + } + else + fr->write(value, doc.head()); + } + } + + const int err = doc.rewrite(get_relation()->file()); + + return err; +} + +int TSAL_app::write(const TMask& m) +{ + get_relation()->curr().zero("G1"); + int err = TRelation_application::write(m); + if (err == NOERR) + err = save_rows(m); + return err; +} + +int TSAL_app::rewrite(const TMask& m) +{ + get_relation()->curr().zero("G1"); + int err = TRelation_application::rewrite(m); + if (err == NOERR) + err = save_rows(m); + return err; +} + +bool TSAL_app::remove() +{ + bool done = TRelation_application::remove(); + if (done) + { + const TRectype& rec = get_relation()->curr(); + TToken_string keytok; + keytok.add(rec.get(DOC_CODNUM)); + keytok.add(rec.get(DOC_ANNO)); + keytok.add(rec.get(DOC_PROVV)); + keytok.add(rec.get(DOC_NDOC)); + TRecord_array rdoc(keytok, LF_RIGHEDOC); + rdoc.remove(); + } + return done; +} + +void TSAL_app::update_tools(TMask& m) +{ + const bool is_edit = m.edit_mode(); + bool can_print = is_edit; + if (can_print) + { + TFilename rep = "sl1400.rep"; // Libretto delle misure + can_print = rep.custom_path(); + } + + m.enable(DLG_NEWREC, is_edit); + m.enable(DLG_PRINT, can_print); + m.enable(DLG_ELABORA, sl_trova_elaborazione(m).full()); + m.enable(B_PRINT_LIB, can_print); + m.enable(B_PRINT_REG, can_print); + + m.disable(F_STATO); // Enable with F12 +} + +bool TSAL_app::get_next_key(TToken_string& key) +{ + const char provv = _qmsk->get(F_PROVV)[0]; + const int anno = _qmsk->get_int(F_ANNO); + const TString& codnum = _qmsk->get(F_CODNUM); + if (anno < 2000 || codnum.blank()) + return false; // Rinumera con anno e numerazione validi + + long newdoc = 1L; + TLocalisamfile doc(LF_DOC); + doc.put(DOC_PROVV, provv); + doc.put(DOC_ANNO, anno); + doc.put(DOC_CODNUM, codnum); + doc.put(DOC_NDOC, 9999999); + int err = doc.read(_isgreat); + if (err == NOERR) + err = doc.prev(); + else + err = doc.last(); + if (err == NOERR && doc.get(DOC_CODNUM) == codnum) + newdoc += doc.get_long(DOC_NDOC); + + key.cut(0); + key.add(F_PROVV); key.add(provv); + key.add(F_ANNO); key.add(anno); + key.add(F_CODNUM); key.add(codnum); + key.add(F_NDOC); key.add(newdoc); + + return true; +} + +void TSAL_app::init_insert_mode(TMask& m) +{ + TRelation_application::init_insert_mode(m); + m.set(F_DATADOC, TDate(TODAY)); + + long nsal = 1; + + const char ord_provv = _qmsk->get(F_PROVV)[0]; + const int ord_anno = _qmsk->get_int(F_ANNO_ORD); + const TString& ord_codnum = _qmsk->get(F_CODNUM_ORD); + const long ord_ndoc = _qmsk->get_long(F_NDOC_ORD); + TString filter; + filter.format("DAPROVV=%c DAANNO=%d DACODNUM=%s DANDOC=%ld", + ord_provv, ord_anno, (const char*)ord_codnum, ord_ndoc); + TString query; + query << "USE 34 KEY 4\nJOIN 33 INTO PROVV=PROVV ANNO=ANNO CODNUM==CODNUM NDOC==NDOC\n" + << "FROM " << filter << "\nTO " << filter; + TISAM_recordset rsal(query); + if (rsal.move_last()) + nsal += rsal.cursor()->curr(LF_DOC).get_int(DOC_NUMANT); + m.set(F_NSAL, nsal); + + TSAL_tree& t = ((TSAL_emsk&)m).tree(); + const TRectype* model = &rsal.cursor()->curr(LF_DOC); // Usa come modello l'ultimo SAL + if (nsal <= 1) // Primo SAL + { + const TEdit_field& fld_ord = _qmsk->efield(F_NDOC_ORD); + model = &fld_ord.browse()->cursor()->curr(LF_DOC); // Usa come modello l'ordine + // Copia anticipo e granzia cliente + if (model->get_char(DOC_TIPOCF) != 'F') + { + const TRectype& cms = cache().get(LF_COMMESSE, model->get(DOC_CODCMS)); + m.set(F_PANTICIPO, cms.get(COMMESSE_ANTICIPO)); + m.set(F_PGARANZIA, cms.get(COMMESSE_GARANZIA)); + } + } + + TSAL_msk& sm = (TSAL_msk&)m; + FOR_EACH_MASK_FIELD(sm, i, f) + { + if (f->empty() && f->active() && f->field() != NULL) + { + const TString& name = f->field()->name(); + sm.fset(name, model->get(name), 0x2); + } + } + t.load(*model, nsal); + + update_tools(m); +} + +void TSAL_app::init_modify_mode(TMask& m) +{ + TRelation_application::init_modify_mode(m); + update_tools(m); +} + +void TSAL_app::print() +{ + app().report("sl1400"); +} + +bool TSAL_app::report(const char* name) +{ + static bool already_printing = false; + if (already_printing) + return false; + already_printing = true; + + TFilename rep = name; rep.ext("rep"); + if (!rep.custom_path()) + return cantread_box(rep.name()); + + if (rewrite(*_emsk) != NOERR) + return cantwrite_box("SAL"); + + TFilename ini; ini.tempdir(); ini.add(name); ini.ext("ini"); + if (ini.full()) + { + TConfig cfg(ini, "Transaction"); + cfg.set("Action", printer().printtype() == screenvis ? "Preview" : "Print"); + cfg.set_paragraph("Vars"); + cfg.remove_all(); + + TSAL_msk& sm = *(TSAL_msk*)_emsk; + FOR_EACH_MASK_FIELD(sm, i, f) if (f->is_edit() && !f->empty()) + { + const TFieldref* field = f->field(); + if (field != NULL && field->from() == 0) + { + const TString& name = field->name(); + cfg.set(name, sm.fget(name)); + } + } + + cfg.set(RDOC_DAPROVV, _qmsk->get(F_PROVV)); + cfg.set(RDOC_DAANNO, _qmsk->get(F_ANNO_ORD)); + cfg.set(RDOC_DACODNUM, _qmsk->get(F_CODNUM_ORD)); + cfg.set(RDOC_DANDOC, _qmsk->get(F_NDOC_ORD)); + } + + TString cmd; + cmd << "ba8 -4 " << rep; + if (ini.exist()) + cmd << " -i" << ini; + TExternal_app a(cmd); + a.run(); + + already_printing = false; + return true; +} + +int sl0100(int argc, char* argv[]) +{ + TSAL_app a; + a.run(argc, argv, TR("S.A.L.")); + return 0; +} + + + + + + + diff --git a/sl/sl0100a.h b/sl/sl0100a.h new file mode 100644 index 000000000..83b3c6dad --- /dev/null +++ b/sl/sl0100a.h @@ -0,0 +1,102 @@ +#define F_PROVV 201 +#define F_ANNO 202 +#define F_CODNUM 203 +#define F_DESNUM 204 +#define F_TIPODOC 205 +#define F_DESTIPO 206 +#define F_NDOC 207 +#define F_STATO 208 +#define F_DATADOC 209 +#define F_CLIFO 210 +#define F_RAGSOC 211 +#define F_RICALT 212 +#define F_STATOPAIV 213 +#define F_PAIV 214 +#define F_COFI 215 +#define F_NSAL 216 +#define F_TIPOCF 217 +#define F_DATACONS 218 + +#define F_ANNO_ORD 220 +#define F_CODNUM_ORD 221 +#define F_DESNUM_ORD 222 +#define F_NDOC_ORD 223 +#define F_DATA_ORD 224 +#define F_CODRESP 228 +#define F_DESRESP 229 +#define F_PANTICIPO 230 +#define F_PGARANZIA 231 +#define F_CODPAG 232 +#define F_DESPAG 233 +#define F_CODLIS 234 +#define F_DESLIS 235 + +#define F_SAL_LOR 311 +#define F_SAL_SIC 312 +#define F_SAL_IDR 313 +#define F_SAL_RIB 314 +#define F_SAL_IRB 315 +#define F_SAL_SIC2 316 +#define F_SAL_SAL 317 +#define F_SAL_GAR 318 +#define F_SAL_ANT 319 +#define F_SAL_NET 320 +#define F_SAL_IVA 321 +#define F_SAL_TOT 322 +#define F_SAL_ESC 323 +#define F_SAL_PRIB 324 +#define F_SAL_PGAR 328 +#define F_SAL_PANT 329 +#define F_SAL_PIVA 331 + +#define F_P_SAL_LOR 411 +#define F_P_SAL_SIC 412 +#define F_P_SAL_IDR 413 +#define F_P_SAL_RIB 414 +#define F_P_SAL_IRB 415 +#define F_P_SAL_SIC2 416 +#define F_P_SAL_SAL 417 +#define F_P_SAL_GAR 418 +#define F_P_SAL_ANT 419 +#define F_P_SAL_NET 420 +#define F_P_SAL_IVA 421 +#define F_P_SAL_TOT 422 +#define F_P_SAL_ESC 423 +#define F_P_SAL_PRIB 424 +#define F_P_SAL_PGAR 428 +#define F_P_SAL_PANT 429 +#define F_P_SAL_PIVA 431 + + +//#define F_FASENEW 240 +//#define F_FASEDIT 241 +#define B_PRINT_LIB 242 +#define B_PRINT_REG 243 + +#define F_CDC0 250 + +#define F_FASI 400 +#define F_DISTINTE 401 +#define F_MISURE 403 + +#define S_CODART 101 +#define S_DESCR 102 +#define S_UMART 103 +#define S_QTA 104 +#define S_QTAORD 105 +#define S_QTAPRG 106 +#define S_QTARES 107 +#define S_PREZZO 108 +#define S_CODIVA 109 +#define S_TOTALE 110 +#define S_INIATT 111 +#define S_FINATT 112 +#define S_ID 113 +#define S_DATALAV 114 +#define S_LEGAME 115 +#define S_TIPOLEG 116 +#define S_TIPOLAV 117 + + +#define RSAL_COSTO "QTAGG5" + diff --git a/sl/sl0100a.uml b/sl/sl0100a.uml new file mode 100644 index 000000000..ad57487ac --- /dev/null +++ b/sl/sl0100a.uml @@ -0,0 +1,233 @@ +#include "sl0100a.h" + +TOOLBAR "topbar" 0 0 0 2 +#include +ENDPAGE + +PAGE "S.A.L." 0 0 0 0 + +GROUPBOX F_CDC0 78 6 +BEGIN + PROMPT 1 1 "@bCommessa" +END + +LIST F_TIPOCF 1 10 +BEGIN + PROMPT 2 5 "" + ITEM "C|Cliente" + ITEM "F|Fornitore" +END + +NUMBER F_CLIFO 6 +BEGIN + PROMPT 16 5 "" + USE LF_CLIFO + INPUT TIPOCF F_TIPOCF SELECT + INPUT CODCF F_CLIFO + DISPLAY "Codice" CODCF + DISPLAY "Ragione Sociale@50" RAGSOC + DISPLAY "Partita IVA" PAIV + DISPLAY "Codice Fiscale@16" COFI + OUTPUT F_CLIFO CODCF + OUTPUT F_RAGSOC RAGSOC + CHECKTYPE NORMAL + ADD RUN cg0 -1 +END + +STRING F_RAGSOC 50 47 +BEGIN + PROMPT 27 5 "" + USE LF_CLIFO KEY 2 + INPUT TIPOCF F_TIPOCF SELECT + INPUT RAGSOC F_RAGSOC + DISPLAY "Ragione Sociale@50" RAGSOC + DISPLAY "Codice" CODCF + DISPLAY "Partita IVA" PAIV + DISPLAY "Codice Fiscale@16" COFI + COPY OUTPUT F_CLIFO + CHECKTYPE NORMAL +END + +GROUPBOX DLG_NULL 78 5 +BEGIN + PROMPT 1 7 "@bOrdine di riferimento" +END + +NUMBER F_ANNO_ORD 4 +BEGIN + PROMPT 2 8 "Anno " + FLAGS "AU" + CHECKTYPE REQUIRED +END + +STRING F_CODNUM_ORD 4 +BEGIN + PROMPT 2 9 "Numerazione " + USE %NUM SELECT I1=3 + FLAGS "UP" + INPUT CODTAB F_CODNUM_ORD + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_CODNUM_ORD CODTAB + OUTPUT F_DESNUM_ORD S0 + CHECKTYPE REQUIRED +END + +STRING F_DESNUM_ORD 50 +BEGIN + PROMPT 24 9 "" + USE %NUM KEY 2 SELECT I0>0 + INPUT S0 F_DESNUM + DISPLAY "Descrizione@50" S0 + DISPLAY "Codice Num." CODTAB + COPY OUTPUT F_CODNUM_ORD + CHECKTYPE REQUIRED +END + +NUMBER F_NDOC_ORD 7 +BEGIN + PROMPT 2 10 "Numero " + USE LF_DOC SELECT (BETWEEN(CODCF,#F_CLIFO,#F_CLIFO)) + JOIN LF_CLIFO INTO TIPOCF=TIPOCF CODCF==CODCF + INPUT PROVV "D" + INPUT ANNO F_ANNO_ORD SELECT + INPUT CODNUM F_CODNUM_ORD SELECT + INPUT NDOC F_NDOC_ORD + DISPLAY "Anno" ANNO + DISPLAY "Numerazione" CODNUM + DISPLAY "Numero" NDOC + DISPLAY "Stato" STATO + DISPLAY "Codice" CODCF + DISPLAY "Ragione Sociale@50" LF_CLIFO->RAGSOC + OUTPUT F_NDOC_ORD NDOC + OUTPUT F_CLIFO CODCF + OUTPUT F_DATA_ORD DATADOC + CHECKTYPE FORCED + NUM_EXPR #THIS_FIELD>0 + WARNING "Inserire un numero d'ordine" + FIELD NUMDOCRIF + ADD RUN ve0 -0 +END + +DATE F_DATA_ORD +BEGIN + PROMPT 25 10 "del " + FIELD DATADOCRIF + FLAGS "D" +END + + +GROUPBOX DLG_NULL 78 6 +BEGIN + PROMPT 1 12 "@bStato Avanzamento Lavori" +END + +LIST F_PROVV 1 12 +BEGIN + PROMPT 69 69 "" + ITEM "D|Definitivi" + ITEM "P|Provvisori" + FIELD PROVV + FLAGS "D" + KEY 1 +END + +NUMBER F_ANNO 4 +BEGIN + PROMPT 2 13 "Anno " + FLAGS "AU" + CHECKTYPE REQUIRED + KEY 1 + FIELD ANNO +END + +STRING F_CODNUM 4 +BEGIN + PROMPT 2 14 "Numerazione " + USE %NUM SELECT I1=1 + FLAGS "UP" + INPUT CODTAB F_CODNUM + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_CODNUM CODTAB + OUTPUT F_DESNUM S0 + CHECKTYPE FORCED + FIELD CODNUM + KEY 1 + STR_EXPR #THIS_FIELD!="" + WARNING "Inserire un una numerazione di tipo SAL" +END + +STRING F_DESNUM 50 +BEGIN + PROMPT 24 14 "" + USE %NUM KEY 2 SELECT I1=1 + INPUT S0 F_DESNUM + DISPLAY "Descrizione@50" S0 + DISPLAY "Codice Num." CODTAB + COPY OUTPUT F_CODNUM + CHECKTYPE REQUIRED +END + +STRING F_TIPODOC 4 +BEGIN + PROMPT 2 15 "Tipo docum. " + USE %TIP SELECT I1=1 + FLAGS "UP" + INPUT CODTAB F_TIPODOC + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_TIPODOC CODTAB + OUTPUT F_DESTIPO S0 + CHECKTYPE FORCED + FIELD CODNUM + STR_EXPR #THIS_FIELD!="" + WARNING "Inserire un tipo documento SAL" +END + +STRING F_DESTIPO 50 +BEGIN + PROMPT 24 15 "" + USE %TIP KEY 2 SELECT I1=1 + INPUT S0 F_DESNUM + DISPLAY "Descrizione@50" S0 + DISPLAY "Codice Num." CODTAB + COPY OUTPUT F_TIPODOC + CHECKTYPE REQUIRED +END + +NUMBER F_NSAL 3 +BEGIN + PROMPT 2 16 "S.A.L. " + USE LF_DOC KEY 4 SELECT NUMDOCRIF=#F_NDOC_ORD + JOIN LF_CLIFO INTO TIPOCF=TIPOCF CODCF==CODCF + INPUT TIPOCF F_TIPOCF SELECT + INPUT CODCF F_CLIFO SELECT + INPUT PROVV F_PROVV SELECT + INPUT ANNO F_ANNO SELECT + INPUT CODNUM F_CODNUM SELECT + INPUT NDOC F_NDOC + DISPLAY "Anno" ANNO + DISPLAY "Num." CODNUM + DISPLAY "SAL" NUMANT + DISPLAY "Stato" STATO + DISPLAY "Num. int. " NDOC + DISPLAY "Codice" CODCF + DISPLAY "Ragione Sociale@50" LF_CLIFO->RAGSOC + OUTPUT F_NSAL NUMANT + OUTPUT F_NDOC NDOC + CHECKTYPE REQUIRED +END + +NUMBER F_NDOC 7 +BEGIN + PROMPT 52 16 "Numero interno " + COPY ALL F_NSAL + CHECKTYPE REQUIRED + FIELD NDOC + KEY 1 +END + +ENDPAGE + +ENDMASK diff --git a/sl/sl0100b.uml b/sl/sl0100b.uml new file mode 100644 index 000000000..1054a714c --- /dev/null +++ b/sl/sl0100b.uml @@ -0,0 +1,971 @@ +#include "sl0100a.h" + +TOOLBAR "topbar" 0 0 0 2 + +BUTTON DLG_NEWREC 2 2 +BEGIN + PROMPT 1 1 "~Nuovo" + MESSAGE EXIT,K_INS + PICTURE TOOL_NEWREC +END + +BUTTON DLG_SAVEREC 2 2 +BEGIN + PROMPT 2 1 "~Registra" + MESSAGE EXIT,K_SAVE + PICTURE TOOL_SAVEREC +END + +BUTTON DLG_DELREC 2 2 +BEGIN + PROMPT 3 1 "~Elimina" + MESSAGE EXIT,K_DEL + PICTURE TOOL_DELREC +END + +BUTTON DLG_NULL 2 2 +BEGIN + PROMPT -1 1 "" + PICTURE 0 +END + +BUTTON B_PRINT_LIB 2 2 +BEGIN + PROMPT 1 3 "Misure" + PICTURE TOOL_PRINT +END + +BUTTON DLG_PRINT 2 2 +BEGIN + PROMPT 1 3 "S.A.L." + PICTURE TOOL_PRINT +END + +BUTTON B_PRINT_REG 2 2 +BEGIN + PROMPT 1 3 "Registro" + PICTURE TOOL_PRINT +END + +BUTTON DLG_ELABORA 2 2 +BEGIN + PROMPT 1 4 "Certificato" + PICTURE TOOL_ELABORA +END + +BUTTON DLG_NULL 2 2 +BEGIN + PROMPT -1 1 "" + PICTURE 0 +END + +#include +#include + +ENDPAGE + +PAGE "S.A.L." 0 2 0 0 + +GROUPBOX -1 78 6 +BEGIN + PROMPT 1 0 "@bS.A.L." +END + +LIST F_PROVV 1 12 + BEGIN + PROMPT 69 69 "" + ITEM "D|Definitivi" + ITEM "P|Provvisori" + FIELD PROVV + FLAGS "D" + KEY 1 +END + +NUMBER F_NDOC_ORD 7 +BEGIN + PROMPT 2 1 "Ordine numero " + FIELD NUMDOCRIF + FLAGS "D" +END + +DATE F_DATA_ORD +BEGIN + PROMPT 26 1 "del " + FIELD DATADOCRIF + FLAGS "D" +END + +NUMBER F_NDOC 7 +BEGIN + PROMPT 2 2 "Numero int. " + FLAGS "DG" + CHECKTYPE REQUIRED + FIELD NDOC + KEY 1 +END + +NUMBER F_ANNO 4 +BEGIN + PROMPT 26 2 "Anno " + FLAGS "D" + CHECKTYPE REQUIRED + FIELD ANNO + KEY 1 +END + +STRING F_CODNUM 4 +BEGIN + PROMPT 2 3 "Numerazione " + USE %NUM + FLAGS "DGU" + INPUT CODTAB F_CODNUM + OUTPUT F_CODNUM CODTAB + OUTPUT F_DESNUM S0 + CHECKTYPE REQUIRED + FIELD CODNUM + KEY 1 +END + +STRING F_DESNUM 50 +BEGIN + PROMPT 24 3 "" + FLAGS "D" +END + +STRING F_STATO 1 +BEGIN + PROMPT 53 2 "Stato " + USE %STD + INPUT CODTAB F_STATO + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_STATO CODTAB + CHECKTYPE NORMAL + FIELD STATO + FLAGS "DG" +END + +NUMBER F_NSAL 3 +BEGIN + PROMPT 2 4 "Numero S.A.L. " + FLAGS "D" + FIELD NUMANT +END + +STRING 205 4 +BEGIN + PROMPT 2 4 "Tipo " + FLAGS "H" + FIELD TIPODOC + USE %TIP + INPUT CODTAB 205 + OUTPUT 206 S0 + CHEKCTYPE NORMAL +END + +STRING 206 50 +BEGIN + PROMPT 24 4 "" + FLAGS "H" +END + +DATE F_DATADOC +BEGIN + PROMPT 23 4 "Data " + FLAGS "A" + FIELD DATADOC + CHECKTYPE REQUIRED + MESSAGE COPY,F_DATACONS +END + +DATE F_DATACONS +BEGIN + PROMPT 42 4 "Competenza " + FLAGS "D" + FIELD DATACONS +END + +GOLEM 238 10 2 +BEGIN + PROMPT 64 1 "" + FIELD COLL_GOLEM + FLAGS "M" +END + +GR -1 78 7 +BEGIN + PROMPT 1 6 "@bCliente/Fornitore" +END + +LISTBOX F_TIPOCF 1 10 +BEGIN + PROMPT 2 7 "" + ITEM "C|Cliente" + ITEM "F|Fornitore" + FLAGS "D" + FIELD TIPOCF +END + +NUMBER F_CLIFO 7 +BEGIN + PROMPT 16 7 "" + USE LF_CLIFO + INPUT TIPOCF F_TIPOCF + INPUT CODCF F_CLIFO + DISPLAY "Codice" CODCF + DISPLAY "Ragione Sociale@50" RAGSOC + DISPLAY "Partita IVA@12" PAIV + DISPLAY "Codice Fiscale@16" COFI + DISPLAY "Sospeso@C" SOSPESO + OUTPUT F_CLIFO CODCF + OUTPUT F_RAGSOC RAGSOC + OUTPUT F_PAIV PAIV + OUTPUT F_COFI COFI + CHECKTYPE NORMAL + ADD RU cg0 -1 C + MESSAGE COPY,10@ + FIELD CODCF + FLAGS "DG" +END + +STRING F_RAGSOC 50 49 +BEGIN + PROMPT 25 7 "" + FLAGS "D" +END + +STRING F_COFI 16 +BEGIN + PROMPT 2 8 "Codice fiscale " + FLAGS "DU" +END + +STRING F_PAIV 12 +BEGIN + PROMPT 50 8 "Partita IVA " + FLAGS "D" +END + +STRING F_CODRESP 5 +BEGIN + PROMPT 2 11 "Responsabile" + FLAGS "UZ" + CHECKTYPE NORMAL + FIELD CODAG + USE 122 + INPUT CODAGE F_CODRESP + DISPLAY "Codice" CODAGE + DISPLAY "Descrizione@50" RAGSOC + OUTPUT F_CODRESP CODAGE + OUTPUT F_DESRESP RAGSOC + CHECKTYPE NORMAL + ADD RU pr0 -4 +END + +STRING F_DESRESP 50 +BEGIN + PROMPT 24 11 "" + FLAGS "" + CHECKTYPE NORMAL + USE 122 KEY 2 + INPUT RAGSOC F_DESRESP + DISPLAY "Descrizione@50" RAGSOC + DISPLAY "Codice" CODAGE + COPY OUTPUT F_CODRESP + ADD RUN pr0 -4 +END + +GROUPBOX -1 78 7 +BEGIN + PROMPT 1 13 "@bDati Commerciali" +END + +ZOOM 226 62 +BEGIN + PROMPT 2 14 "Oggetto " + FIELD NOTE +END + +STRING F_CODPAG 4 +BEGIN + PROMPT 2 15 "Pagamento " + USE %CPG + INPUT CODTAB F_CODPAG + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_CODPAG CODTAB + OUTPUT F_DESPAG S0 + CHECKTYPE NORMAL + FIELD CODPAG +END + +STRING F_DESPAG 50 + BEGIN + PROMPT 24 15 "" + USE %CPG KEY 2 + INPUT S0 F_DESPAG + DISPLAY "Descrizione@50" S0 + DISPLAY "Codice" CODTAB + CO OUTPUT F_CODPAG + CHECKTYPE NORMAL +END + +STRING F_CODLIS 4 +BEGIN + PROMPT 2 16 "Listino " + FLAGS "U" + USE 52 + INPUT TIPO "L" + INPUT CATVEN "" + INPUT COD F_CODLIS + DISPLAY "Codice" COD + DISPLAY "Descrizione@50" DESCR + DISPLAY "Inizio@10" VALIN + DISPLAY "Fine@10" VALFIN + OUTPUT F_CODLIS COD + OUTPUT F_DESLIS DESCR + ADD RUN ve2 -1 L + CHECKTYPE NORMAL + FIELD CODLIST +END + +STRING F_DESLIS 50 +BEGIN + PROMPT 24 16 "" + USE 52 KEY 2 + INPUT TIPO "L" + INPUT CATVEN "" + INPUT DESCR F_DESLIS + DISPLAY "Descrizione@50" DESCR + DISPLAY "Codice" COD + DISPLAY "Inizio@10" VALIN + DISPLAY "Fine@10" VALFIN + COPY OUTPUT F_CODLIS + CHECKTYPE NORMAL + ADD RU ve2 -1 L +END + +STRING F_PGARANZIA 10 25 +BEGIN + PROMPT 2 17 "% Ritenuta a garanzia " + FIELD SCONTOPERC +END + +NUMBER F_PANTICIPO 6 2 +BEGIN + PROMPT 57 17 "% Anticipo " + FIELD PERCSPINC +END + +GROUPBOX F_CDC0 78 3 +BEGIN + PROMPT 1 20 "@bIndutriale" +END + +ENDPAGE + +PAGE "Righe" 0 2 0 0 + +TLIST F_FASI 50 -1 +BEGIN + PROMPT 0 0 "" + DISPLAY "Fasi@15" CODART + DISPLAY "Prezzo@10R" PREZZO + DISPLAY "Descrizione@35" DESCR +END + +/* +BUTTON F_FASENEW 8 2 +BEGIN + PROMPT 1 0 "Nuovo" + PICTURE BMP_NEWREC + PICTURE BMP_NEWRECDN +END + +BUTTON F_FASEDIT 8 2 +BEGIN + PROMPT 12 0 "Modifica" + PICTURE BMP_EDIT + FLAGS "D" +END +*/ + +SPREADSHEET F_DISTINTE 0 16 +BEGIN + PROMPT 53 0 "" + IT "Voce Elenco Prezzi@20" + IT "Descrizione@50" + IT "U.M." + IT "Quantità@10" + IT "Qtà Ord.@10" + IT "Qtà Progr.@9" + IT "Residuo@10" + IT "Prezzo@16R" + IT "IVA" + IT "Totale@16" + IT "Data inizio@10" + IT "Data fine@10" + IT "ID@6" + IT "Data\nlavori@10" + IT "Legame@6" + IT "Tipo\nlegame@6" + IT "Tipo\nlavoro@6" +END + +SPREADSHEET F_MISURE +BEGIN + PROMPT 53 17 "" + ITEM "Descrizione@50" + ITEM "Numero@9" + ITEM "Lunghezza@9" + ITEM "Larghezza@9" + ITEM "Altezza@9" + ITEM "Totale@9" + ITEM "Data@10" +END + +ENDPAGE + +PAGE "Totali" 0 2 0 0 + +GROUPBOX DLG_NULL 60 18 +BEGIN + PROMPT 1 0 "@bCalcolo totali" +END + +TEXT DLG_NULL +BEGIN + PROMPT 25 1 "@bParziale" +END + +TEXT DLG_NULL +BEGIN + PROMPT 43 1 "@bProgressivo" +END + +TEXT DLG_NULL +BEGIN + PROMPT 2 2 "SAL Lordo" +END + +CURRENCY F_SAL_LOR 15 +BEGIN + PROMPT 24 2 " " + FLAGS "D" + FIELD G1:SAL_LOR +END + +CURRENCY F_P_SAL_LOR 15 +BEGIN + PROMPT 42 2 " " + FLAGS "D" + FIELD G1:P_SAL_LOR +END + +TEXT DLG_NULL +BEGIN + PROMPT 2 3 "Sicurezza" +END + +CURRENCY F_SAL_SIC 15 +BEGIN + PROMPT 24 3 "-" + FLAGS "D" + FIELD G1:SAL_SIC +END + +CURRENCY F_P_SAL_SIC 15 +BEGIN + PROMPT 42 3 " " + FLAGS "D" + FIELD G1:P_SAL_SIC +END + +TEXT DLG_NULL +BEGIN + PROMPT 2 4 "Esclusi da ribasso" +END + +CURRENCY F_SAL_ESC 15 +BEGIN + PROMPT 24 4 "-" + FLAGS "D" + FIELD G1:SAL_ESC +END + +CURRENCY F_P_SAL_ESC 15 +BEGIN + PROMPT 42 4 " " + FLAGS "D" + FIELD G1:P_SAL_ESC +END + + +TEXT DLG_NULL +BEGIN + PROMPT 2 5 "Importo da ribassare" +END + +CURRENCY F_SAL_IDR 15 +BEGIN + PROMPT 24 5 "=" + FLAGS "D" + FIELD G1:SAL_IDR +END + +CURRENCY F_P_SAL_IDR 15 +BEGIN + PROMPT 42 5 " " + FLAGS "D" + FIELD G1:P_SAL_IDR +END + + +NUMBER F_SAL_PRIB 6 2 +BEGIN + PROMPT 2 6 "Ribasso %" + FLAGS "D" + FIELD G1:SAL_PRIB +END + +CURRENCY F_SAL_RIB 15 +BEGIN + PROMPT 24 6 "-" + FLAGS "D" + FIELD G1:SAL_RIB +END + +CURRENCY F_P_SAL_RIB 15 +BEGIN + PROMPT 42 6 " " + FLAGS "D" + FIELD G1:P_SAL_RIB +END + +TEXT DLG_NULL +BEGIN + PROMPT 2 7 "Importo ribassato" +END + +CURRENCY F_SAL_IRB 15 +BEGIN + PROMPT 24 7 "=" + FLAGS "D" + FIELD G1:SAL_IRB +END + +CURRENCY F_P_SAL_IRB 15 +BEGIN + PROMPT 42 7 " " + FLAGS "D" + FIELD G1:P_SAL_IRB +END + +TEXT DLG_NULL +BEGIN + PROMPT 2 8 "Sicurezza ed Esclusi" +END + +CURRENCY F_SAL_SIC2 15 +BEGIN + PROMPT 24 8 "+" + FLAGS "DG" +END + +CURRENCY F_P_SAL_SIC2 15 +BEGIN + PROMPT 42 8 " " + FLAGS "D" +END + +TEXT DLG_NULL +BEGIN + PROMPT 2 10 "@bImporto SAL" +END + +CURRENCY F_SAL_SAL 15 +BEGIN + PROMPT 24 10 "=" + FLAGS "D" + FIELD G1:SAL_SAL +END + +CURRENCY F_P_SAL_SAL 15 +BEGIN + PROMPT 42 10 " " + FLAGS "D" + FIELD G1:P_SAL_SAL +END + +NUMBER F_SAL_PGAR 6 2 +BEGIN + PROMPT 2 11 "Garanzia %" + FLAGS "D" + FIELD G1:SAL_PGAR +END + +CURRENCY F_SAL_GAR 15 +BEGIN + PROMPT 24 11 "-" + FIELD G1:SAL_GAR + FLAGS "D" +END + +CURRENCY F_P_SAL_GAR 15 +BEGIN + PROMPT 42 11 " " + FLAGS "D" + FIELD G1:P_SAL_GAR +END + +NUMBER F_SAL_PANT 6 2 +BEGIN + PROMPT 2 12 "Anticipo %" + FLAGS "D" + FIELD G1:SAL_PANT +END + +CURRENCY F_SAL_ANT 15 +BEGIN + PROMPT 24 12 "-" + FIELD G1:SAL_ANT + FLAGS "D" +END + +CURRENCY F_P_SAL_ANT 15 +BEGIN + PROMPT 42 12 " " + FLAGS "D" + FIELD G1:P_SAL_ANT +END + +TEXT DLG_NULL +BEGIN + PROMPT 2 14 "@bImporto netto" +END + +CURRENCY F_SAL_NET 15 +BEGIN + PROMPT 24 14 "=" + FLAGS "D" + FIELD G1:SAL_NET +END + +CURRENCY F_P_SAL_NET 15 +BEGIN + PROMPT 42 14 " " + FLAGS "D" + FIELD G1:P_SAL_NET +END + +NUMBER F_SAL_PIVA 6 2 +BEGIN + PROMPT 2 15 "Imposta %" + FLAGS "D" + FIELD G1:SAL_PIVA +END + +CURRENCY F_SAL_IVA 15 +BEGIN + PROMPT 24 15 "+" + FLAGS "D" + FIELD G1:SAL_IVA +END + +CURRENCY F_P_SAL_IVA 15 +BEGIN + PROMPT 42 15 " " + FLAGS "D" + FIELD G1:P_SAL_IVA +END + +TEXT DLG_NULL +BEGIN + PROMPT 2 16 "@bTotale SAL" +END + +CURRENCY F_SAL_TOT 15 +BEGIN + PROMPT 24 16 "=" + FLAGS "DG" + FIELD G1:SAL_TOT +END + +CURRENCY F_P_SAL_TOT 15 +BEGIN + PROMPT 42 16 " " + FLAGS "D" + FIELD G1:P_SAL_TOT +END + +ENDPAGE + +ENDMASK + +PAGE "Distinta" -1 -1 78 10 + +STRING S_CODART 20 +BEGIN + PROMPT 1 0 "Distinta " + USE LF_DIST + INPUT CODDIST S_CODART + DISPLAY "Codice@20" CODDIST + DISPLAY "Descrizione@50" DESCR + DISPLAY "U.M." UM + DISPLAY "Prezzo@14V" PREZZO + OUTPUT S_CODART CODDIST + OUTPUT S_DESCR DESCR + OUTPUT S_UMART UM + CHEKTYPE SEARCH + ADD RUN db0 -4 + FLAGS "U" + FIELD CODART +END + +ZOOM S_DESCR 50 39 +BEGIN + PROMPT 35 0 "" + USE LF_DIST KEY 2 + INPUT DESCR S_DESCR + DISPLAY "Descrizione@50" DESCR + DISPLAY "Codice@20" CODDIST + DISPLAY "U.M." UM + DISPLAY "Prezzo@14V" PREZZO + COPY OUTPUT S_CODART + CHEKTYPE SEARCH + FIELD DESCR +END + +STRING S_UMART 2 +BEGIN + PROMPT 1 1 "U.M. " + USE %UMS + INPUT CODTAB S_UMART + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT S_UMART CODTAB + CHECKTYPE NORMAL + FIELD UMQTA +END + +STRING S_CODIVA 4 +BEGIN + PROMPT 13 1 "IVA " + USE %IVA + INPUT CODTAB S_CODIVA + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT S_CODIVA CODTAB + CHECKTYPE NORMAL + FIELD CODIVA +END + +CURRENCY S_PREZZO 16 +BEGIN + PROMPT 26 1 "Prezzo " + FIELD PREZZO +END + +NUMBER S_TOTALE 16 2 +BEGIN + PROMPT 51 1 "Totale " + PICTURE ".2" + FLAGS "DG" + VALIDATE 14 1 #S_QTA*#S_PREZZO + DRIVENBY S_QTA S_PREZZO +END + +TEXT DLG_NULL +BEGIN + PROMPT 1 2 "Qtà SAL" +END + +NUMBER S_QTA 12 3 +BEGIN + PROMPT 1 3 "" + PICTURE ".3" + FIELD QTA +END + +TEXT DLG_NULL +BEGIN + PROMPT 16 2 "Qtà Ord." +END + +NUMBER S_QTAORD 12 3 +BEGIN + PROMPT 16 3 "" + PICTURE ".3" + FIELD QTAGG1 + FLAGS "D" +END + +TEXT DLG_NULL +BEGIN + PROMPT 31 2 "Qtà Progr." +END + +NUMBER S_QTAPRG 12 3 +BEGIN + PROMPT 31 3 "" + PICTURE ".3" + FIELD QTAGG2 + FLAGS "D" +END + +TEXT DLG_NULL +BEGIN + PROMPT 46 2 "Qtà residua" +END + +NUMBER S_QTARES 12 3 +BEGIN + PROMPT 46 3 "" + PICTURE ".3" + FIELD QTAGG3 + FLAGS "D" +END + +DATE S_INIATT +BEGIN + PROMPT 1 6 "Inizio attività " + FIELD DATAINIATT +END + +DATE S_FINATT +BEGIN + PROMPT 35 6 "Fine attività " + FIELD DATAFINATT +END + +DATE S_DATALAV +BEGIN + PROMPT 35 7 "Data lavori " + FIELD DATACONS +END + +NUMBER S_ID 6 +BEGIN + PROMPT 1 7 "ID " + FIELD IDRIGA + FLAGS "D" +END + +NUMBER S_LEGAME 6 +BEGIN + PROMPT 1 8 "Legame " + FIELD IDRIGACOLL +END + +LIST S_TIPOLEG 1 15 +BEGIN + PROMPT 35 8 "Tipo legame " + ITEM "0|Nessuno" + ITEM "1|Fine-Inizio" + ITEM "2|Fine-Fine" + ITEM "3|Inizio-Inizio" + ITEM "4|Inizio-Fine" + FIELD TIPOCOLL +END + +LIST S_TIPOLAV 1 30 +BEGIN + PROMPT 1 9 "Tipo lavoro " + ITEM "0|Lavori e somministrazioni" + ITEM "1|Lavori aggiuntivi" + ITEM "2|Economie" + ITEM "3|Sicurezza" + ITEM "4|Escluso da ribasso" + FIELD TIPODET +END + +ENDPAGE + +TOOLBAR "" 0 0 0 2 + +BUTTON DLG_OK 2 2 +BEGIN + PROMPT 1 1 "" +END + +BUTTON DLG_DELREC 2 2 +BEGIN + PROMPT 2 1 "" +END + +BUTTON DLG_CANCEL 2 2 +BEGIN + PROMPT 3 1 "" +END + +ENDPAGE +ENDMASK + +PAGE "Misura" -1 -1 60 8 + +STRING 101 50 45 +BEGIN + PROMPT 1 1 "Descriz. " + FIELD DESCR +END + +NUMBER 102 9 3 +BEGIN + PROMPT 1 2 "Numero " + FIELD QTAGG1 +END + +NUMBER 103 9 3 +BEGIN + PROMPT 1 3 "Lunghezza " + FIELD QTAGG2 +END + +NUMBER 104 9 3 +BEGIN + PROMPT 1 4 "Larghezza " + FIELD QTAGG3 +END + +NUMBER 105 9 3 +BEGIN + PROMPT 1 5 "Altezza " + FIELD QTAGG4 +END + +NUMBER 106 9 3 +BEGIN + PROMPT 1 6 "Totale " + FLAGS "DG" + DRIVENBY 102 103 104 105 + NUM_CALC IF(#102,#102,1)*IF(#103,#103,1)*IF(#104,#104,1)*IF(#105,#105,1) + FIELD QTA +END + +DATE 107 +BEGIN + PROMPT 1 7 "Data " + FIELD DATACONS +END + +ENDPAGE + +TOOLBAR "" 0 0 0 2 + +BUTTON DLG_OK 2 2 +BEGIN + PROMPT 1 1 "" +END + +BUTTON DLG_DELREC 2 2 +BEGIN + PROMPT 2 1 "" +END + +BUTTON DLG_CANCEL 2 2 +BEGIN + PROMPT 3 1 "" +END + +ENDPAGE +ENDMASK \ No newline at end of file diff --git a/sl/sl0101.cpp b/sl/sl0101.cpp new file mode 100644 index 000000000..f4f2efe4e --- /dev/null +++ b/sl/sl0101.cpp @@ -0,0 +1,593 @@ +#include "sl0100a.h" +#include "sl0101.h" + +#include +#include +#include +#include + +#include "../ca/calib01.h" +#include "../ca/fasi.h" +#include "../ve/velib.h" + +//#include +//#include + +static bool cmscpy(TRectype& dst, const TRectype& src) +{ + const TString& cms_in = src.get(RDOC_CODCMS); + if (cms_in.blank()) + { + NFCHECK("Commessa nulla"); + return false; + } + const TString& cms_out = dst.get(RDOC_CODCMS); + if (cms_in == cms_out) + return true; + + if (!cms_out.blank()) + NFCHECK("Commessa incoerente"); + + dst.put(RDOC_CODCMS, cms_in); + return true; +} + +bool TSAL_tree::add_lastson(TObject* obj) +{ + CHECK(obj != NULL && obj->is_kind_of(CLASS_RECTYPE), "Record non valido per SAL"); + TRectype& rec = *(TRectype*)obj; + CHECK(rec.get(RDOC_TIPORIGA).full(), "TIPORIGA vuoto"); + cmscpy(rec, *curr_row()); + bool done = false; + if (goto_firstson()) // Se ha almeno un figlio ... + { + while (goto_rbrother()); // ... allora vai all'ultimo fratello + done = add_rbrother(obj); // ed aggiungi ultimo fratello + } + else + done = add_son(obj); // Aggiungi primogenito + return done; +} + +TSAL_level TSAL_tree::last_fase_level() const +{ + return (TSAL_level)_picture_fasi.items(); +} + +bool TSAL_tree::goto_last_fase(TSAL_level sublevel) +{ + bool ok = goto_root() && goto_firstson(); + if (ok) + { + while (goto_rbrother()); // goto last son + + if (sublevel > sl_fase1) + { + //TSAL_level max_lev = last_fase_level(); + //if (sublevel < max_lev) + // max_lev = sublevel; + + while (level() < sublevel) + { + if (goto_firstson()) + while (goto_rbrother()); + else + break; + } + + ok = level() == sublevel; + } + } + return ok; +} + +bool TSAL_tree::goto_last_dist() +{ + bool ok = goto_last_fase(sl_distinta); // sl_distinta = dummy value for maximum depth + if (ok) + while (goto_rbrother()); + return ok; +} + +TRectype* TSAL_tree::new_row(TSAL_level level) const +{ + const TMask& m = owner().mask(); + TRectype* rec = new TRectype(level == sl_documento ? LF_DOC : LF_RIGHEDOC); + rec->put(RDOC_PROVV, 'D'); + rec->put(RDOC_ANNO, m.get(F_ANNO)); + rec->put(RDOC_CODNUM, m.get(F_CODNUM)); + rec->put(RDOC_NDOC, m.get(F_NDOC)); + TString cantiere; + for (short id = F_CDC0+1; m.id2pos(id) > 0; id++) + cantiere << m.get(id); + rec->put(RDOC_CODCMS, cantiere); + switch (level) + { + case sl_documento: + rec->put(DOC_NUMANT, m.get(F_NSAL)); + break; + case sl_distinta: + rec->put(RDOC_TIPORIGA, tipo_dist()); + rec->put(RDOC_DESCR, TR("Nuova distinta")); + cmscpy(*rec, *curr_row()); + break; + case sl_misura: + rec->put(RDOC_TIPORIGA, tipo_misu()); + rec->put(RDOC_DESCR, TR("Nuova misura")); + cmscpy(*rec, *curr_row()); + break; + default: + rec->put(RDOC_TIPORIGA, tipo_fasi()); + rec->put(RDOC_DESCR, TR("Nuova fase")); + rec->put(RSAL_LEVEL, level-sl_fase1); + break; + } + + return rec; +} + +static bool find_fase_cb(TTree& node, void* jolly, word /*when*/) +{ + const TSAL_tree& tree = (TSAL_tree&)node; + const TSAL_level lev = tree.level(); + if (lev < sl_fase1 || lev >= sl_distinta) + return false; + + const TString& fascms = *((TString*)jolly); + const TRectype& rec = *tree.curr_row(); + const TString& fase = rec.get(RDOC_FASCMS); + return fase == fascms; +} + + +TRectype* TSAL_tree::fase(const TString& fase, bool create) +{ + TRectype* rec = NULL; + if (goto_root() && scan_breadth_first(find_fase_cb, (void*)&fase)) + rec = curr_row(); + else if (create) + { + if (goto_root()) + { + rec = new_row(sl_fase1); + rec->put(RDOC_FASCMS, fase); + TToken_string key; key = rec->get(RDOC_CODCMS); key.add(fase); + TString80 descr = cache().get(LF_FASI, key, FASI_DESCRIZ); + if (descr.empty()) + { + key.add(" ", 0); + descr = cache().get(LF_FASI, key, FASI_DESCRIZ); + } + if (descr.full()) + rec->put(RDOC_DESCR, descr); + add_lastson(rec); + } + } + return rec; +} + +TRectype* TSAL_tree::dist(const TString& fase, int n, bool create) +{ + TRectype* rec = NULL; + if (goto_node(fase)) + { + if (goto_firstson()) + { + int i = 0; + for (; i < n && goto_rbrother(); i++); + if (i < n) + { + if (create) + add_rbrother(rec = new_row(sl_distinta)); + } + else + rec = curr_row(); + } + else + { + if (create) + add_son(rec = new_row(sl_distinta)); + } + } + return rec; +} + +TRectype* TSAL_tree::misu(const TString& dist, int n, bool create) +{ + TRectype* rec = NULL; + if (goto_node(dist)) + { + CHECKS(level() == sl_distinta, "Distinta non valida", (const char*)dist); + if (goto_firstson()) + { + int i = level() == sl_misura ? 0 : -1; + while (i < n && goto_rbrother()) + if (level() == sl_misura) i++; + if (i < n) + { + if (create) + add_rbrother(rec = new_row(sl_misura)); + } + else + rec = curr_row(); + } + else + { + if (create && n == 0) + add_son(rec = new_row(sl_misura)); + } + } + return rec; +} + +TSAL_level TSAL_tree::level(const TRectype& rec) const +{ + TSAL_level lev = sl_documento; + if (rec.num() == LF_RIGHEDOC) + { + const TString& t = rec.get(RDOC_TIPORIGA); + if (t.full()) + { + lev = sl_fase1; + if (t == _strFasi) + lev = TSAL_level(lev + rec.get_int(RSAL_LEVEL)); else + if (t == _strDist) + lev = sl_distinta; else + if (t == _strMisu) + lev = sl_misura; + } + } + return lev; +} + +TSAL_level TSAL_tree::level() const +{ + TSAL_level lev = sl_documento; + TRectype* rec = curr_row(); + if (rec != NULL) + lev = level(*rec); + return lev; +} + +bool TSAL_tree::could_have_son() const +{ return level() < sl_distinta; } + +bool TSAL_tree::get_description(TString& str) const +{ + const TRectype* rec = curr_row(); + bool ok = rec != NULL && !rec->empty(); + if (ok) + { + if (rec->num() == LF_DOC) + { + const TMask& m = owner().mask(); + str.cut(0) << TR("SAL ") << m.get(F_NSAL) << TR(" del ") << m.get(F_DATADOC); + } else + if (rec->num() == LF_RIGHEDOC) + { + str = rec->get(RDOC_DESCR); + if (str.blank()) + str = rec->get(RDOC_CODCMS); + } + else + NFCHECK("Bad tree record"); + } + else + NFCHECK("NULL tree record"); + return ok; +} + +TFieldtypes TSAL_tree::get_var(const TString& name, TVariant& var) const +{ + TFieldtypes ft = _nullfld; + const TRectype* rec = curr_row(); + if (rec != NULL && !rec->empty()) + { + if (rec->num() == LF_DOC) + { + const TMask& m = owner().mask(); + if (name == RDOC_CODART) + { + var = m.get(F_NDOC); + ft = _alfafld; + } else + if (name == RDOC_DESCR) + { + TString str; get_description(str); + const int spc = str.find('\n'); + if (spc > 0) str.cut(spc); + var = str; + ft = _alfafld; + } else + if (name == RDOC_PREZZO || name == RSAL_COSTO) + { + real c, p; ((TSAL_tree*)this)->ricalcola(c, p); + if (name == RDOC_PREZZO ) + var = p.stringa(0,2); + else + var = c.stringa(0,2); + ft = _realfld; + } + } + else + { + ft = rec->type(name); + if (ft > _nullfld) + { + const TSAL_level livello = level(*rec); + if (ft == _realfld) + { + if ((name == RDOC_PREZZO || name == RSAL_COSTO) && livello == sl_distinta) + { + real c, p; ((TSAL_tree*)this)->ricalcola(c, p); + if (name == RDOC_PREZZO ) + var = p.stringa(0,2); + else + var = c.stringa(0,2); + } + else + var = rec->get_real(name).stringa(0, 2); + } + else + { + if (name == RDOC_CODART && livello < sl_distinta) + { + TString16 fase = rec->get(RDOC_FASCMS); + if (fase.blank()) + { + fase = rec->get(RDOC_CODART); + if (livello < _picture_fasi.items()) + { + const TString& pic = _picture_fasi.row(livello-1); + const int len = pic.len(); + if (pic[0] == '0') + fase.right_just(len, '0'); + else + fase.left_just(len, ' '); + } + ((TRectype*)rec)->put(RDOC_FASCMS, fase); + } + var = fase; + } + else + var = rec->get(name); + } + } + } + } + return ft; +} + + +TImage* TSAL_tree::image(bool sel) const +{ + const TSAL_level pl = level(); + if (pl <= sl_distinta) + { + const bool ex = expanded(); + if (has_son()) + return get_res_image(ex ? BMP_DIRDNSEL : BMP_DIRSEL); + else + return get_res_image(ex ? BMP_DIRDN : BMP_DIR); + } + return TObject_tree::image(sel); +} + +// Aggiunge un record alla fine dell'albero in base al tipo della riga (usato solo in lettura iniziale) +bool TSAL_tree::append_row(const TRectype& rec) +{ + const TSAL_level pl = level(rec); + if (pl == sl_documento) + { + // Se aggiungo un documento allora svuoto albero e ricreo radice + if (goto_root()) + kill_node(); + return add_son(rec); + } else + if (pl == sl_distinta) + { + const TString16 fascms = rec.get(RDOC_FASCMS); + bool ok = false; + if (fascms.full()) + ok = fase(fascms, true) != NULL; + else + ok = goto_last_dist(); + return ok && add_lastson(rec); + } else + if (pl == sl_misura) + { + if (goto_last_dist()) + return add_lastson(rec); + } + else + { + goto_root(); + while (level() < pl) + { + if (goto_firstson()) + while (goto_rbrother()); + else + break; + } + if (level() < pl) + return add_lastson(rec); + else + return add_rbrother(rec); + } + + return false; +} + +bool TSAL_tree::ricalcola(real& costo, real& prezzo) +{ + bool ok = false; + const TSAL_level lev = level(); + costo = prezzo = ZERO; + if (lev < sl_distinta && has_son()) + { + TString16 id; curr_id(id); + for (bool go = goto_firstson(); go; go = goto_rbrother()) + { + real c, p; + if (ricalcola(c, p)) + { + costo += c; + prezzo += p; + } + } + ok = goto_node(id); + if (lev >= sl_fase1) + { + TRectype& rec = *curr_row(); + rec.put(RDOC_QTA, 1); + rec.put(RSAL_COSTO, costo); + rec.put(RDOC_PREZZO, prezzo); + } + } + else + { + ok = lev == sl_distinta; + if (ok) + { + const TRectype& rec = *curr_row(); + const real qta = rec.get_real(RDOC_QTA); + if (!qta.is_zero()) + { + costo = qta * rec.get_real(RSAL_COSTO); + prezzo = qta * rec.get_real(RDOC_PREZZO); + } + } + } + return ok; +} + +bool TSAL_tree::load(const TRectype& doc, int nsal) +{ + TLog_report log; + + // Lettura righe documento + TToken_string keytok; + keytok.add(doc.get(DOC_CODNUM)); + keytok.add(doc.get(DOC_ANNO)); + keytok.add(doc.get(DOC_PROVV)); + keytok.add(doc.get(DOC_NDOC)); + TRecord_array rdoc(keytok, LF_RIGHEDOC); + + // Svuota automaticamente albero e crea documento radice + bool done = append_row(doc); + if (done) + { + // Caricamento righe nell'albero + const int last_row = rdoc.last_row(); + TString16 curr_fase; + for (int r = rdoc.first_row(); r > 0 && r <= last_row; r = rdoc.succ_row(r)) + { + TRectype& rr = rdoc[r]; + const TSAL_level sl = level(rr); + + const TString& fase = rr.get(RDOC_FASCMS); + if (fase.blank()) + { + if (sl < sl_distinta) + curr_fase = rr.get(RDOC_CODART); + rr.put(RDOC_FASCMS, curr_fase); + } + else + curr_fase = fase; + + // Gestione copia da ordine o SAL precedente + if (nsal > 0 && sl >= sl_distinta) + { + if (sl >= sl_misura) + continue; // Non copiare le misure! + + const real qta = rr.get(RDOC_QTA); + if (nsal == 1) // nsal=1 -> copia da ordine + { + rr.put(RDOC_DAIDRIGA, rr.get(RDOC_IDRIGA)); + rr.put(RDOC_QTAGG1, qta); // Inizializza totale riga ordine + rr.put(RDOC_QTAGG2, ZERO); // Totale SAL precedenti (nessuno nel primo SAL) + rr.put(RDOC_QTAGG3, qta); // Residuo (nel primo SAL è uguale alla qta) + + const TString& sconto = rr.get(RDOC_SCONTO); + if (sconto.full()) + { + const real impns = prezzo_scontato(rr.get_real(RDOC_PREZZO), sconto); + if (!impns.is_zero()) + rr.put(RDOC_PREZZO, impns); + } + } + else + { + rr.add(RDOC_QTAGG2, qta); // Aggiorna totale precedente quando copi da SAL + rr.add(RDOC_QTAGG3,-qta); // Aggiorna residuo quando copi da SAL + } + rr.zero(RDOC_QTA); // Azzera quantità sempre + } + if (!append_row(rr)) + { + TString msg; + msg.format("Impossibile caricare la riga %d di tipo %s:\n%s", + rr.get_int(RDOC_NRIGA), (const char*)rr.get(RDOC_TIPORIGA), + (const char*)rr.get(RDOC_DESCR)); + log.log(2, msg); + done = false; + } + } // fine caricamento riga + + TMask& m = owner().mask(); + if (nsal > 1) // A partire dal secondo sal aggiorno i progressivi di testata P_SAL_* + { + const TDocumento prec(doc); + FOR_EACH_MASK_FIELD(m, i, f) + { + const TFieldref* ref = f->field(); + if (ref != NULL && ref->name().starts_with("G1:P_SAL_")) + { + const real p_val = ref->read(prec); + + TString16 name = ref->name(); name.ltrim(5); + const real val = prec.get(name); + const real progr = p_val + val; + f->set(progr.string()); + } + } + } + const real p_sic2 = m.get_real(F_P_SAL_SIC) + m.get_real(F_P_SAL_ESC); + m.set(F_P_SAL_SIC2, p_sic2); + } + else + { + TString msg; msg.format("Impossibile caricare il documento %s", (const char*)keytok); + log.log(2, msg); + } + + // Espansione della sola radice + shrink_all(); goto_root(); expand(); + owner().force_update(); + + if (!done) + log.preview(); + + return done; +} + + +TSAL_tree::TSAL_tree(TTree_field& owner) : _owner(owner) +{ + // Legge i tipi riga standard per determinare i nodi dell'albero + _strFasi = ini_get_string(CONFIG_DITTA, "pe", "TipoRigaFase", "05"); + _strDist = ini_get_string(CONFIG_DITTA, "pe", "TipoRigaDist", "P1"); + _strMisu = ini_get_string(CONFIG_DITTA, "pe", "TipoRigaMisu", "P2"); + + TConfig& cfg = ca_config(); + for (int i = 1; i <= 4; i++) + { + const TString& pic = cfg.get("Fsc", "ca", i); + if (pic.full()) + _picture_fasi.add(pic); + else + break; + } +} + diff --git a/sl/sl0101.h b/sl/sl0101.h new file mode 100644 index 000000000..29004e2a3 --- /dev/null +++ b/sl/sl0101.h @@ -0,0 +1,69 @@ +#ifndef __SL0101_H +#define __SL0101_H + +#ifndef __ISAM_H +#include +#endif + +#ifndef __TREE_H +#include +#endif + +#ifndef __TREECTRL_H +#include +#endif + +/////////////////////////////////////////////////////////// +// TSAL_tree +/////////////////////////////////////////////////////////// + +enum TSAL_level { sl_documento, sl_fase1, sl_fase2, sl_fase3, sl_fase4, sl_distinta, sl_misura }; + +class TSAL_tree : public TObject_tree +{ + TTree_field& _owner; + TString4 _strFasi, _strDist, _strMisu; + TString_array _picture_fasi; + +private: + bool add_lastson(TObject* obj); + bool add_lastson(const TObject& obj) { return add_lastson(obj.dup()); } + +protected: + bool goto_last_fase(); + bool goto_last_dist(); + + TSAL_level last_fase_level() const; + bool goto_last_fase(TSAL_level sublevel); + +public: + virtual bool could_have_son() const; + virtual bool get_description(TString& str) const; + virtual TFieldtypes get_var(const TString& name, TVariant& var) const; + + virtual TImage* image(bool sel) const; + + const TString& tipo_fasi() const { return _strFasi; } + const TString& tipo_dist() const { return _strDist; } + const TString& tipo_misu() const { return _strMisu; } + + TSAL_level level(const TRectype& rec) const; + TSAL_level level() const; + + TRectype* new_row(TSAL_level level) const; + TRectype* curr_row() const { return (TRectype*)curr_node(); } + TTree_field& owner() const { return _owner; } + TRectype* fase(const TString& fase, bool create = false); + TRectype* dist(const TString& fase, int n, bool create = false); + TRectype* misu(const TString& dist, int n, bool create = false); + bool ricalcola(real& costo, real& prezzo); + + bool load(const TRectype& doc, int nsal = 0); + + TSAL_tree(TTree_field& owner); + bool append_row(const TRectype& rec); +}; + +#define RSAL_LEVEL RDOC_PRIORITY + +#endif diff --git a/sl/sl0200.cpp b/sl/sl0200.cpp new file mode 100644 index 000000000..5287d8f80 --- /dev/null +++ b/sl/sl0200.cpp @@ -0,0 +1,322 @@ +#include "sl0200.h" + +#include "../ve/velib04.h" +#include "../ca/commesse.h" + +/////////////////////////////////////////////////////////// +// TCertificazione +/////////////////////////////////////////////////////////// + +class TCertificazione : public TElaborazione_esterna +{ +protected: + const TRectype& find_cert(const TDocumento& doc); + void set_codiva(TRiga_documento& rdoc) const; + +public: + virtual bool elabora(TLista_documenti& doc_in, TLista_documenti& doc_out, + const TDate& data_elab, bool interattivo = false); + TCertificazione(const TString& cod); +}; + +const TRectype& TCertificazione::find_cert(const TDocumento& doc) +{ + const TString& codnum = codice_numerazione_finale(); + TString query, limit; + limit << RDOC_DAPROVV << '=' << doc.get(DOC_PROVV) << ' ' + << RDOC_DAANNO << '=' << doc.get_int(DOC_ANNO) << ' ' + << RDOC_DACODNUM << '=' << doc.get(DOC_CODNUM) << ' ' + << RDOC_DANDOC << '=' << doc.get_long(DOC_NDOC); + query << "USE 34 KEY 4" + << "\nSELECT CODNUM=\"" << codnum << '"' + << "\nFROM " << limit << "\nTO " << limit; + + TISAM_recordset recset(query); + const TRectype& rdoc = recset.cursor()->curr(); + TToken_string key; + if (recset.move_first()) + { + key = rdoc.get(RDOC_PROVV); + key.add(rdoc.get(RDOC_ANNO)); + key.add(rdoc.get(RDOC_CODNUM)); + key.add(rdoc.get(RDOC_NDOC)); + } + + return cache().get(LF_DOC, key); +} + +void TCertificazione::set_codiva(TRiga_documento& rdoc) const +{ + TString4 codiva; + + const TString80 codcms = rdoc.doc().get(DOC_CODCMS); + if (codcms.full()) + { + const TRectype& cms = cache().get(LF_COMMESSE, codcms); + if (!cms.empty()) + { + rdoc.put(RDOC_CODCMS, codcms); + codiva = cms.get(COMMESSE_CODIVA); + } + } + + const TString80 codart = rdoc.get(RDOC_CODART); + if (codart.full()) + { + const TRectype& ana = cache().get(LF_ANAMAG, codart); + if (!ana.empty()) + { + rdoc.put(RDOC_CODARTMAG, codart); + rdoc.put(RDOC_CHECKED, true); + + TToken_string key; key.add(codart); key.add(1); + const TString& um = cache().get(LF_UMART, key, UMART_UM); + rdoc.put(RDOC_UMQTA, um); + + if (codiva.blank()) + codiva = ana.get(ANAMAG_CODIVA); + } + } + + rdoc.put(RDOC_CODIVA, codiva); + rdoc.importo(true, false); // Ricalcola IMPNS +} + +bool TCertificazione::elabora(TLista_documenti& doc_in, TLista_documenti& doc_out, + const TDate& data_elab, bool interattivo) +{ + for (int i = 0; i < doc_in.items(); i++) + { + TDocumento& din = doc_in[i]; + + // Mi assicuro che ad ogni documento in ingresso ne corrisponda uno in uscita + if (i >= doc_out.items()) + { + const TRectype& cert = find_cert(din); + if (!cert.empty()) + { + if (interattivo) + warning_box("Il documento S.A.L. aggiornerà il certificato %s %d/%ld", + (const char*)cert.get(DOC_CODNUM), cert.get_int(DOC_ANNO), cert.get_long(DOC_NDOC)); + } + + TDocumento* doc = NULL; + if (cert.empty()) + { + doc = new TDocumento('D', data_elab.year(), codice_numerazione_finale(), 0L); + doc->put(DOC_TIPODOC, tipo_finale()); + } + else + { + doc = new TDocumento(cert); + doc->destroy_rows(); + } + doc_out.add(doc); + } + + TDocumento& don = doc_out[i]; + + din.put(DOC_STATO, stato_finale_doc_iniziale()); + + don.put(DOC_NUMANT, din.get(DOC_NUMANT)); + don.put(DOC_TIPOCF, din.get(DOC_TIPOCF)); + don.put(DOC_CODCF, din.get(DOC_CODCF)); + don.put(DOC_DATADOC, data_elab); + don.put(DOC_NOTE, din.get(DOC_NOTE)); + don.put(DOC_CODCMS, din.get(DOC_CODCMS)); + don.put(DOC_STATO, stato_finale()); + don.put(DOC_NUMDOCRIF, din.get(DOC_NDOC)); + don.put(DOC_DATADOCRIF, din.get(DOC_DATADOC)); + + // don.put(DOC_G1, din.get(DOC_G1)); + TToken_string g1(din.get(DOC_G1), '\n'); + FOR_EACH_TOKEN(g1, tok) + { + TToken_string fld(tok, '='); + const char* name = fld.get(0); + const char* value = fld.get(); + don.put(name, value); + } + + const bool is_cli = don.get_char(DOC_TIPOCF) != 'F'; + const real sal_sal = din.get("SAL_SAL"); + if (sal_sal > ZERO) + { + TRiga_documento& rdoc = don.new_row("01"); + rdoc.put(RDOC_CODART, ini_get_string(CONFIG_DITTA, "ci", is_cli ? "CODARTLC" : "CODARTLF")); + rdoc.put(RDOC_QTA, UNO); + rdoc.put(RDOC_DESCR, TR("Lavori eseguiti")); + rdoc.put(RDOC_PREZZO, sal_sal); + rdoc.set_original_rdoc_key(din[1]); + set_codiva(rdoc); + } + + const real sal_gar = din.get("SAL_GAR"); + if (sal_gar > ZERO) + { + TRiga_documento& rdoc = don.new_row("01"); + rdoc.put(RDOC_CODART, ini_get_string(CONFIG_DITTA, "ci", is_cli ? "CODARTGC" : "CODARTGF")); + rdoc.put(RDOC_QTA, -UNO); + rdoc.put(RDOC_DESCR, TR("Ritenuta a garanzia")); + rdoc.put(RDOC_PREZZO, sal_gar); + rdoc.set_original_rdoc_key(din[1]); + set_codiva(rdoc); + } + + const real sal_ant = din.get("SAL_ANT"); + if (sal_ant > ZERO) + { + TRiga_documento& rdoc = don.new_row("01"); + rdoc.put(RDOC_CODART, ini_get_string(CONFIG_DITTA, "ci", is_cli ? "CODARTAC" : "CODARTAF")); + rdoc.put(RDOC_QTA, -UNO); + rdoc.put(RDOC_DESCR, TR("Anticipi")); + rdoc.put(RDOC_PREZZO, sal_ant); + rdoc.set_original_rdoc_key(din[1]); + set_codiva(rdoc); + } + + din.rewrite(); // Aggiorna codici fase nelle righe + don.write(); // Salva ordine + } + + return true; +} + +TCertificazione::TCertificazione(const TString& cod) : TElaborazione_esterna(cod) +{ +} + +/////////////////////////////////////////////////////////// +// Utility pubbliche +/////////////////////////////////////////////////////////// + +const TString& sl_trova_elaborazione(const TRectype& doc) +{ + const TString& codnum = doc.get(DOC_CODNUM); // SAL + TString str; + str << "USE %ELD SELECT (STR(I0=\"0\"))&&(S3=\"sl0 -1\")&&(S5=\"" << codnum << "\")"; + + TRecordset* eld = create_recordset(str); + if (eld != NULL) + { + TString16 cod; + for (bool ok = eld->move_first(); ok; ok = eld->move_next()) + { + const TString& c = eld->get("CODTAB").as_string(); + const TElaborazione e(c); + if (e.is_document_ok(doc)) + { + cod = c; + break; + } + } + delete eld; + return get_tmp_string() = cod; + } + return EMPTY_STRING; +} + +const TString& sl_trova_elaborazione(const TMask& m) +{ + TRectype doc(LF_DOC); + doc.put(DOC_PROVV, 'D'); + doc.put(DOC_ANNO, m.get(DOC_ANNO)); + doc.put(DOC_CODNUM, m.get(DOC_CODNUM)); + doc.put(DOC_NDOC, m.get(DOC_NDOC)); + doc.put(DOC_TIPODOC, m.get(DOC_TIPODOC)); + doc.put(DOC_STATO, m.get(DOC_STATO)); + return sl_trova_elaborazione(doc); +} + +bool sl_genera_documento(TRectype& doc, const TString& cod) +{ + TString16 codelab = cod; + if (codelab.blank()) + codelab = sl_trova_elaborazione(doc); + + TCertificazione e(codelab); + + const TDate oggi(TODAY); + TLista_documenti doc_in, doc_out; + doc_in.add(new TDocumento(doc)); + + bool ok = e.elabora(doc_in, doc_out, oggi, true); + if (ok) + { + int err = doc_in.rewrite(); + if (err == NOERR) + { + const TRectype& idoc = doc_in[0]; + for (int i = 0; i < idoc.items(); i++) + { + const char* fld = idoc.fieldname(i); + const TString& val = idoc.get(fld); + if (val.full()) + doc.put(fld, val); + } + + err = doc_out.write(); + if (err == NOERR) + message_box(FR("E' stato generato il certificato %ld"), doc.get_long(DOC_NUMANT)); + else + error_box(TR("Errore %d in scrittura del certificato"), err); + } + } + + return ok; +} + +/////////////////////////////////////////////////////////// +// TCertificazione_app +/////////////////////////////////////////////////////////// + +class TCertificazione_app : public TSkeleton_application +{ +protected: + virtual void main_loop(); +}; + +void TCertificazione_app::main_loop() +{ + TFilename ininame; + if (argc() >= 2) + { + const TFixed_string arg = argv(2); + ininame = arg.starts_with("-i", true) ? arg.mid(2) : arg; + } + + TConfig ini(ininame, "Transaction"); + const TString8 codelab = ini.get("Action"); + + ini.set_paragraph("33"); + TRectype doc(LF_DOC); + doc.put(DOC_PROVV, ini.get(DOC_PROVV)); + doc.put(DOC_ANNO, ini.get(DOC_ANNO)); + doc.put(DOC_CODNUM, ini.get(DOC_CODNUM)); + doc.put(DOC_NDOC, ini.get(DOC_NDOC)); + + if (sl_genera_documento(doc, codelab)) + { + ini.set_paragraph("Transaction"); + ini.set("Result", "OK"); + ini.set("Error", "0"); + + ini.set_paragraph("33"); + for (int i = 0; i < doc.items(); i++) + { + const char* fld = doc.fieldname(i); + const TString& val = doc.get(fld); + if (val.full()) + ini.set(fld, val); + } + } +} + +int sl0200(int argc, char* argv[]) +{ + TCertificazione_app a; + a.run(argc, argv, TR("Certificazione di pagamento")); + return 0; +} + + diff --git a/sl/sl0200.h b/sl/sl0200.h new file mode 100644 index 000000000..451a6adb3 --- /dev/null +++ b/sl/sl0200.h @@ -0,0 +1,16 @@ +#ifndef __SL1100_H +#define __SL1100_H + +#ifndef __ISAM_H +#include +#endif + +#ifndef __MASK_H +#include +#endif + +const TString& sl_trova_elaborazione(const TRectype& sal); +const TString& sl_trova_elaborazione(const TMask& sal_msk); +bool sl_genera_documento(TRectype& sal, const TString& codelab); + +#endif diff --git a/sl/sl1400.rep b/sl/sl1400.rep new file mode 100644 index 000000000..14f006521 --- /dev/null +++ b/sl/sl1400.rep @@ -0,0 +1,313 @@ + + + Libretto delle misure + +
+ + + 33.NUMANT + + + 214@.DESCRAGG + + + 210@.S0 + +
+
+ + "omnia1_logo.jpg" + + + + + + + + + + + + + + + + + + + + + + 20.PAIV + + + + 20.PAIV + + + + 20.REFERENTE + + + + 33.NOTE + + + + 33.NOTE + + + + 214@.DESCRAGG + + + + + + 33.NOTE + + + MESSAGE ISAMREAD,122,CODAGE=#10,RAGSOC + + + + 20.RAGSOC + + + + + + 20.LOCALITACF + + + 20.CAPCF + + + + 33.NUMANT + + + 13.PROVCOM + + + + 33.DATADOC + + + 33.CODAG + + + 13.DENCOM + + + + 210@.S0 + + + 20.STATOPAIV + +
+
+ #REPORT.PAGE @ 1 = IF + "B0" HIDE +ELSE + "B0" SHOW +THEN + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ 34.TIPORIGA='P1' + + + + 34.CODART + + + + 33.DATADOC + + + + 34.DESCR + 34.DESCEST + + + + 34.UMQTA + MESSAGE _ALIGN,#52,BOTTOM + + + + 30 + 34.QTA + MESSAGE _ALIGN,#52,BOTTOM + + + + + + +
+
+ (34.TIPORIGA='05')(STR(34.PREZZO!=0)) + + + + + 34.CODART + 1 "34.PRIORITY" @ ++ +2 * +0 +#THIS_FIELD SET_POS + + + + 34.DESCR + +
+
+ 34.TIPORIGA='P2' + + + 34.DESCR + + + + 34.QTAGG1 + MESSAGE _ALIGN,#52,BOTTOM + + + + 34.QTAGG2 + MESSAGE _ALIGN,#52,BOTTOM + + + + 34.QTAGG3 + MESSAGE _ALIGN,#52,BOTTOM + + + + 34.QTAGG4 + MESSAGE _ALIGN,#52,BOTTOM + +
+
+ + + + + + + + #PAGE + + + + + + + #BOOKPAGES + + + + 210@.S0 + + + + 210@.S0 + +
+
+ + + + + 33.NUMANT + + + + 33.DATADOC + +
+ USE 34 KEY 4 SELECT (QTA!=0) +JOIN 33 INTO CODNUM==CODNUM ANNO==ANNO PROVV==PROVV NDOC==NDOC +JOIN 17 TO 33 INTO TIPOCF==TIPOCF CODCF==CODCF +JOIN 20 TO 33 INTO TIPOCF==TIPOCF CODCF==CODCF +JOIN 13 TO 20 INTO STATO=STATOCF COM=COMCF +JOIN 16 TO 33 INTO TIPOCF==TIPOCF CODCF==CODCF CODIND==CODINDSP +JOIN 16 TO 17 ALIAS 116 INTO TIPOCF==TIPOCF CODCF==CODCF CODIND==CODINDSP +JOIN 47 TO 34 INTO CODART==CODART +JOIN 147 TO 33 ALIAS 214 INTO CODCMS==CODCMS +FROM DAPROVV=#DAPROVV DAANNO=#DAANNO DACODNUM=#DACODNUM DANDOC=#DANDOC +TO DAPROVV=#DAPROVV DAANNO=#DAANNO DACODNUM=#DACODNUM DANDOC=#DANDOC + +
\ No newline at end of file diff --git a/sl/sl1500.rep b/sl/sl1500.rep new file mode 100644 index 000000000..f199d472e --- /dev/null +++ b/sl/sl1500.rep @@ -0,0 +1,344 @@ + + + Registro di Contabilit&#E0; + +
+ + + 33.NUMANT + + + 214@.DESCRAGG + + + 210@.S0 + +
+
+ + "omnia1_logo.jpg" + + + + + + + + + + + + + + + + + + + + + + 20.PAIV + + + + 20.PAIV + + + + 20.REFERENTE + + + + 33.NOTE + + + + 33.NOTE + + + + 214@.DESCRAGG + + + + + + 33.NOTE + + + MESSAGE ISAMREAD,122,CODAGE=#10,RAGSOC + + + + 20.RAGSOC + + + + + + 20.LOCALITACF + + + 20.CAPCF + + + + 33.NUMANT + + + 13.PROVCOM + + + + 33.DATADOC + + + 33.CODAG + + + 13.DENCOM + + + + 210@.S0 + + + 20.STATOPAIV + +
+
+ 34.FASCMS + MESSAGE RESET,F2 + + + + 148.CODFASE + 1 "34.PRIORITY" @ ++ +2 * +0 +#THIS_FIELD SET_POS + + + + 148.DESCRIZ + +
+
+ 34.CODART + MESSAGE RESET,F3 + + + 34.DATACONS + + + + + + + + +
+
+ #REPORT.PAGE @ 1 = IF + "B0" HIDE +ELSE + "B0" SHOW +THEN + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + #PAGE + + + + + + + #BOOKPAGES + + + + 210@.S0 + + + + 210@.S0 + +
+
+ + + + + + 33.DATADOC + + + + +
+
+
+ + + H3.51 + + + + H3.52 + + + + H3.53 + MESSAGE _ALIGN,#52,BOTTOM + + + + + MESSAGE _ALIGN,#52,BOTTOM + + + + + H3.55 + MESSAGE _ALIGN,#52,BOTTOM + + + + + MESSAGE _ALIGN,#52,BOTTOM +MESSAGE ADD,F1.1000 + +
+ USE 34 KEY 4 SELECT (((DAPROVV=#DAPROVV)(DAANNO=#DAANNO)(DACODNUM=#DACODNUM)(DANDOC=#DANDOC))(33.NUMANTC;=#NUMANT)(STR(34.QTA!=0))(34.TIPORIGA='P1')) +BY 34.FASCMS 34.CODART +JOIN 33 INTO CODNUM==CODNUM ANNO==ANNO PROVV==PROVV NDOC==NDOC +JOIN 17 TO 33 INTO TIPOCF==TIPOCF CODCF==CODCF +JOIN 20 TO 33 INTO TIPOCF==TIPOCF CODCF==CODCF +JOIN 13 TO 20 INTO STATO=STATOCF COM=COMCF +JOIN 16 TO 33 INTO TIPOCF==TIPOCF CODCF==CODCF CODIND==CODINDSP +JOIN 16 TO 17 ALIAS 116 INTO TIPOCF==TIPOCF CODCF==CODCF CODIND==CODINDSP +JOIN 47 TO 34 INTO CODART==CODART +JOIN 147 TO 33 ALIAS 214 INTO CODCMS==CODCMS +JOIN 148 TO 34 ALIAS 215 INTO CODCMSFAS==CODCMS CODFASE==FASCMS + \ No newline at end of file diff --git a/sl/sl1600.rep b/sl/sl1600.rep new file mode 100644 index 000000000..51e24a1c0 --- /dev/null +++ b/sl/sl1600.rep @@ -0,0 +1,457 @@ + + + Stato Avanzamento Lavori + +
+ + + #NUMANT + + + 214@.DESCRAGG + +
+
+ + + + + + + + + + + + + + + + + + + + + 20.PAIV + + + + + + + 20.PAIV + + + + + + + + + + 20.REFERENTE + + + + 33.NOTE + + + + 214@.DESCRAGG + + + + #NUMANT + + + + #DATADOC + + + 33.NOTE + + + 33.NOTE + + + 214@.IMPORTOB + + + 214@.DATAFINE + + + 33.NOTE + + + 33.NOTE + + + 214@.RIBASSO + + + 214@.DATAINIZIO + + + 33.NOTE + + + 33.NOTE + + + 214@.IMPORTOB + + + 214@.DATAPREV + + + 33.NOTE + + + 214@.SICUREZZA + + + 33.NOTE + + + 33.NOTE + + + 214@.IMPORTOB + + + 214@.PROROGA + + + 33.NOTE + + + 214@.DATAPROR + + + + 33.NOTE + + + + 214@.IMPORTOB + + + + 20.RAGSOC + + + + + + + + + 20.LOCALITACF + + + + 20.CAPCF + + + + 13.DENCOM+" ("+13.PROVCOM+")" + + + + 20.STATOPAIV + +
+
+ 34.FASCMS + MESSAGE RESET,F2 + + + + 148.CODFASE + 1 "34.PRIORITY" @ ++ +2 * +0 +#THIS_FIELD SET_POS + + + + 148.DESCRIZ + +
+ +
+ #REPORT.PAGE @ 1 = IF + "B0" HIDE +ELSE + "B0" SHOW +THEN + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ #REPORT.PAGE @ +1 = IF + "F0" HIDE +ELSE + "F0" SHOW +THEN + + + + + + + + #PAGE + + + + + + + #BOOKPAGES + + + + 210@.S0 + + + + 210@.S0 + +
+
+ + + + + + + + + + + + + + + + 214@.GARANZIA+" %" + + + 214@.ANTICIPO+" %" + + + + + #DATADOC + + + + + + + #NUMANT + + + + + + + + + #1000F;100*#1003 + + + + #1000-#1005 + + + #1000F;100*#1003 + + + + ((#1000-(#1000F;100*#1003))-((#1000-(#1000F;100*#1003))F;100*214@.RIBASSO))+(#1000F;100*#1003) + + + (((#1000-(#1000F;100*#1003))-((#1000-(#1000F;100*#1003))F;100*214@.RIBASSO))+(#1000F;100*#1003))*(214@.GARANZIAF;100) + + + (((#1000-(#1000F;100*#1003))-((#1000-(#1000F;100*#1003))F;100*214@.RIBASSO))+(#1000F;100*#1003))*(214@.ANTICIPOF;100) + + + 214@.RIBASSO+" % pari ad P. " + + + ((#1000-(#1000F;100*#1003))F;100*214@.RIBASSO) + + + + (#1000-(#1000F;100*#1003))-((#1000-(#1000F;100*#1003))F;100*214@.RIBASSO) + + + + #1009-#1011-#1013 + + + + #G1:SAL_NET + + + + #2020-#2021 + +
+
+
+ + + H3.51 + + + + H3.52 + + + + H3.53 + MESSAGE _ALIGN,#52,BOTTOM + + + + + MESSAGE _ALIGN,#52,BOTTOM + + + + + H3.55 + MESSAGE _ALIGN,#52,BOTTOM + + + + + MESSAGE _ALIGN,#52,BOTTOM +MESSAGE ADD,F1.1000 + +
+ USE 34 KEY 4 SELECT (((DAPROVV=#DAPROVV)(DAANNO=#DAANNO)(DACODNUM=#DACODNUM)(DANDOC=#DANDOC))(33.NUMANTC;=#NUMANT)(STR(34.QTA!=0))(34.TIPORIGA='P1')) +BY 34.FASCMS 34.CODART +JOIN 33 INTO CODNUM==CODNUM ANNO==ANNO PROVV==PROVV NDOC==NDOC +JOIN 17 TO 33 INTO TIPOCF==TIPOCF CODCF==CODCF +JOIN 20 TO 33 INTO TIPOCF==TIPOCF CODCF==CODCF +JOIN 13 TO 20 INTO STATO=STATOCF COM=COMCF +JOIN 16 TO 33 INTO TIPOCF==TIPOCF CODCF==CODCF CODIND==CODINDSP +JOIN 16 TO 17 ALIAS 116 INTO TIPOCF==TIPOCF CODCF==CODCF CODIND==CODINDSP +JOIN 47 TO 34 INTO CODART==CODART +JOIN 147 TO 33 ALIAS 214 INTO CODCMS==CODCMS +JOIN 148 TO 34 ALIAS 215 INTO CODCMSFAS==CODCMS CODFASE==FASCMS + \ No newline at end of file