diff --git a/ba/ba0.cpp b/ba/ba0.cpp index b8899c624..9a1fd437f 100755 --- a/ba/ba0.cpp +++ b/ba/ba0.cpp @@ -4,6 +4,7 @@ #include #include #include +#include #include #include #include @@ -77,9 +78,13 @@ TPicture_mask::TPicture_mask(const char* name, int dx, int dy, void TPicture_mask::set_image(TImage* image) { if (image && image->ok()) - { - _image = image; - _image->set_palette(win()); + { + if (image != _image) + { + _image = image; + _image->set_palette(win()); + force_update(); + } } else _image = NULL; @@ -162,13 +167,14 @@ bool TPicture_mask::on_key(KEY k) // Color Mask /////////////////////////////////////////////////////////// -class TColor_mask : public TMask +class TColor_mask : public TAutomask { TAssoc_array _color; protected: // TMask virtual void update(); virtual bool stop_run(KEY key) { return TWindow::stop_run(key); } + virtual bool on_field_event(TOperable_field& f, TField_event e, long jolly); // @cmember Converte le coordinate logiche (caratteri) in coordinate fisiche (pixel) virtual PNT log2dev(long x, long y) const; @@ -191,25 +197,78 @@ public: virtual ~TColor_mask() { } }; +bool TColor_mask::on_field_event(TOperable_field& f, TField_event e, long jolly) +{ + const short id = f.dlg(); + bool ok = TRUE; + + switch (id) + { + case DLG_USER: + if (e == fe_button) + { + for (int i = fields()-1; i >= 0; i--) + { + TMask_field& mf = fld(i); + const short bid = mf.dlg(); + if (bid >= 101 && bid <= 112 && mf.is_kind_of(CLASS_BUTTON_FIELD)) + { + const char* name = cid2name(bid); + const COLOR color = cid2color(bid); + set_color_entry(name, color); + } + } + update(); + } + break; + case 114: + if (e == fe_button) + { + xvt_dm_post_font_sel(TASK_WIN, xvt_default_font(), NULL, 0); + force_update(); + } + break; + default: + if (id >= 101 && id <= 112 && e == fe_button) + { + TColor_mask& m = (TColor_mask&)f.mask(); + const char* name = m.cid2name(f.dlg()); + COLOR col = m.get_color_entry(name); + col = choose_color(col, m.win()); + ok = col != COLOR_INVALID; + if (ok) + { + m.set_color_entry(name, col); + XVT_PALETTE wp = xvt_vobj_get_palet(m.win()); + if (wp != NULL) + { + XVT_PALETTE up = xvt_palet_create(XVT_PALETTE_USER, 0); + if (up != NULL) + { + const int MAXPAL = 256; + COLOR color[MAXPAL]; + const int n = xvt_palet_get_colors(wp, color, MAXPAL); + if (n < MAXPAL) color[n] = col; + xvt_palet_set_tolerance(up, xvt_palet_get_tolerance(wp)); + xvt_palet_add_colors(up, color, n+1); + xvt_vobj_set_palet(m.win(), up); + xvt_palet_destroy(wp); + } + } + m.stop_run(K_CTRL + 'R'); + } + } + break; + } + return ok; +} + TColor_mask::TColor_mask() - : TMask("ba0200a") + : TAutomask("ba0200a") { TConfig color(CONFIG_USER, "Colors"); _color = color.list_variables(); set(113, color.get_bool("Campi3D") ? "X" : ""); - - for (int f = fields()-1; f >= 0; f--) - { - TMask_field& mf = fld(f); - if (mf.is_kind_of(CLASS_BUTTON_FIELD)) - { - if (mf.dlg() > DLG_USER) - mf.set_handler(color_handler); - else - if (mf.dlg() == DLG_USER) - mf.set_handler(azzera_handler); - } - } } PNT TColor_mask::log2dev(long x, long y) const @@ -344,63 +403,6 @@ COLOR TColor_mask::cid2color(short cid) const return color[i]; } -bool TColor_mask::color_handler(TMask_field& f, KEY k) -{ - bool ok = TRUE; - - if (k == K_SPACE) - { - TColor_mask& m = (TColor_mask&)f.mask(); - const char* name = m.cid2name(f.dlg()); - COLOR col = m.get_color_entry(name); - col = choose_color(col, m.win()); - ok = col != COLOR_INVALID; - if (ok) - { - m.set_color_entry(name, col); - XVT_PALETTE wp = xvt_vobj_get_palet(m.win()); - if (wp != NULL) - { - XVT_PALETTE up = xvt_palet_create(XVT_PALETTE_USER, 0); - if (up != NULL) - { - const int MAXPAL = 256; - COLOR color[MAXPAL]; - const int n = xvt_palet_get_colors(wp, color, MAXPAL); - if (n < MAXPAL) color[n] = col; - xvt_palet_set_tolerance(up, xvt_palet_get_tolerance(wp)); - xvt_palet_add_colors(up, color, n+1); - xvt_vobj_set_palet(m.win(), up); - xvt_palet_destroy(wp); - } - } - m.stop_run(K_CTRL + 'R'); - } - } - - return ok; -} - -bool TColor_mask::azzera_handler(TMask_field& f, KEY k) -{ - if (k == K_SPACE) - { - TColor_mask& cm = (TColor_mask&)f.mask(); - for (int i = cm.fields()-1; i >= 0; i--) - { - TMask_field& mf = cm.fld(i); - if (mf.dlg() > DLG_USER && mf.is_kind_of(CLASS_BUTTON_FIELD)) - { - const char* name = cm.cid2name(mf.dlg()); - const COLOR color = cm.cid2color(mf.dlg()); - cm.set_color_entry(name, color); - } - } - cm.update(); - } - return TRUE; -} - /////////////////////////////////////////////////////////// // Menu mamnagement /////////////////////////////////////////////////////////// @@ -1335,7 +1337,9 @@ bool TMenu_application::check_user() users.put("PASSWORD", encode(pwd)); users.write(); err = users.read(_isequal); - } + } + else + pwd = ""; } ok = utente.not_empty() && pwd.not_empty() && pwd == m.get(F_PASSWORD); @@ -1897,7 +1901,11 @@ const TSubmenu& TMenu_tree::curr_submenu() const const TMenuitem& TMenu_tree::curr_item() const { const TSubmenu& sm = curr_submenu(); - CHECKD(_menuitem >= 0 && _menuitem < sm.items(), "Invalid submenu item ", _menuitem); + if (_menuitem < 0 || _menuitem >= sm.items()) + { + NFCHECK("Invalid submenu item %d in %s", _menuitem, (const char*)sm.name()); + return sm.item(0); + } return sm.item(_menuitem); } @@ -2139,7 +2147,6 @@ bool TMenu_application::tree_handler(TMask_field& f, KEY k) TImage& image = menu.image(menu.current().picture()); TPicture_mask& pm = (TPicture_mask&)f.mask(); pm.set_image(&image); - pm.force_update(); } } diff --git a/ba/ba0.url b/ba/ba0.url index 175953546..4683f502d 100755 --- a/ba/ba0.url +++ b/ba/ba0.url @@ -11,8 +11,11 @@ MENU MENU_BAR(0) SUBMENU M_HELP "~Help" MENU M_FONT +/* ITEM M_FONT_SELECT "~Font" ITEM MENU_ITEM(2) "~Colori" +*/ + ITEM MENU_ITEM(2) "~Font e Colori" ITEM MENU_ITEM(3) "~Editors" ITEM MENU_ITEM(4) "~Studio" diff --git a/ba/ba1100.cpp b/ba/ba1100.cpp index 3071eaf12..aa6c42146 100755 --- a/ba/ba1100.cpp +++ b/ba/ba1100.cpp @@ -613,7 +613,6 @@ void TManutenzione_app::edit_riga (long riga_sel, TToken_string& riga) _browse->dir()->set(dep.SysName, dep.EOD, dep.Flags, dep.Des, dep.FCalc); _browse->dir()->put(logicnum, _nordir, _sysdirop); - if (eox != oldeox) { TSystemisamfile f(logicnum); @@ -796,7 +795,7 @@ void TManutenzione_app::update_dir() } - if (!fexist(fs)) + if (!fs.exist()) { if (d.eox() > 0L) { @@ -820,6 +819,15 @@ void TManutenzione_app::update_dir() { TSystemisamfile b(i); int err = b.is_valid(); + if (err == _istrcerr && d.eod() == 0 && + yesno_box("Il tracciato record del file %d e' incoerente:\n" + "Si desidera eliminare il file vuoto %s?", i, d.filename())) + { + TFilename n(d.filename()); remove(n); + n.ext("cdx"); remove(n); + n.ext("fpt"); remove(n); + err = NOERR; + } if (err != NOERR && flags < 10000L) { KEY k = yesnocancel_box("Il file %d non puo' essere aperto: errore %d\n" @@ -837,7 +845,7 @@ void TManutenzione_app::update_dir() } else { - if (flags < 10000L && to_create ) + if (flags < 10000L && to_create) { remove(d.filename()); TToken_string idx_names; @@ -1042,6 +1050,15 @@ void TManutenzione_app::convert_dir() TSystemisamfile b(i); const int module = abs((int)ds.flags()); int err = b.is_valid(); + if (err == _istrcerr && d.eod() == 0 && + yesno_box("Il tracciato record del file %d e' incoerente:\n" + "Si desidera eliminare il file vuoto %s?", i, d.filename())) + { + TFilename n(d.filename()); remove(n); + n.ext("cdx"); remove(n); + n.ext("fpt"); remove(n); + err = NOERR; + } if (err == -60 || err == -64) err=NOERR; // verif. d.get(i, _nolock, _nordir, _sysdirop); if (i > 2 && err != NOERR && ((is_com && d.is_com()) || (!is_com && d.is_firm()))) diff --git a/ba/ba1400.cpp b/ba/ba1400.cpp index 8f8beac3b..27e007af8 100755 --- a/ba/ba1400.cpp +++ b/ba/ba1400.cpp @@ -614,6 +614,7 @@ bool TSet_user_passwd::user_create() _im = new TInformazione_moduli; _msk = new TMask("ba1400a") ; + _msk->first_focus(F_USER); _msk->set_handler(F_PASSWORD, password_handler); sheet_field().enable(superuser); diff --git a/ba/ba1400a.uml b/ba/ba1400a.uml index 360e655f2..ebdea0607 100755 --- a/ba/ba1400a.uml +++ b/ba/ba1400a.uml @@ -6,6 +6,18 @@ ENDPAGE PAGE "Gestione utenti" -1 -1 35 7 +LIST F_GROUP 1 8 +BEGIN + PROMPT 1 1 "" + ITEM " |Utente" + MESSAGE SHOW,3@ + ITEM "X|Gruppo" + MESSAGE HIDE,3@ + FIELD ISGROUP + GROUP G_SUPERUSER + KEY 1 +END + STRING F_USER 8 BEGIN PROMPT 15 1 "" @@ -21,19 +33,6 @@ BEGIN FIELD USERNAME END -LIST F_GROUP 1 8 -BEGIN - PROMPT 1 1 "" - ITEM " |Utente" - MESSAGE SHOW,3@ - ITEM "X|Gruppo" - MESSAGE HIDE,3@ - FIELD ISGROUP - GROUP G_SUPERUSER - KEY 1 -END - - STRING F_GROUPNAME 8 BEGIN PROMPT 32 1 "Gruppo di appartenenza " diff --git a/ba/ba2100f.uml b/ba/ba2100f.uml index 9b3c1ed9c..0f4a2ff11 100755 --- a/ba/ba2100f.uml +++ b/ba/ba2100f.uml @@ -25,14 +25,15 @@ LIST F_CLASS 10 BEGIN PROMPT 1 1 "Tipo " FLAGS "G" -ITEM "STRINGA|Testo" MESSAGE HIDE,F_DECIMALS|SHOW,F_HEIGHT|SHOW,F_ITEMS|HIDE,8@ -ITEM "NUMERO|Numero" MESSAGE SHOW,F_DECIMALS|HIDE,F_HEIGHT|SHOW,F_ITEMS|HIDE,8@ -ITEM "DATA|Data" MESSAGE HIDE,F_DECIMALS|HIDE,F_HEIGHT|SHOW,F_ITEMS|SHOW,8@ -ITEM "LISTA|Lista" MESSAGE HIDE,F_DECIMALS|HIDE,F_HEIGHT|SHOW,F_ITEMS|HIDE,8@ -ITEM "GRUPPO|Gruppo" MESSAGE HIDE,F_DECIMALS|HIDE,F_HEIGHT|HIDE,F_ITEMS|HIDE,8@ -ITEM "LINEA|Linea" MESSAGE HIDE,F_DECIMALS|SHOW,F_HEIGHT|HIDE,F_ITEMS|HIDE,8@ -ITEM "BOX|Box" MESSAGE HIDE,F_DECIMALS|SHOW,F_HEIGHT|HIDE,F_ITEMS|HIDE,8@ -ITEM "FIGURA|Figura" MESSAGE HIDE,F_DECIMALS|SHOW,F_HEIGHT|HIDE,F_ITEMS|HIDE,8@ +ITEM "STRINGA|Testo" MESSAGE HIDE,F_DECIMALS|SHOW,F_HEIGHT|SHOW,F_ITEMS|HIDE,8@ +ITEM "NUMERO|Numero" MESSAGE SHOW,F_DECIMALS|HIDE,F_HEIGHT|SHOW,F_ITEMS|HIDE,8@ +ITEM "VALUTA|Importo" MESSAGE HIDE,F_DECIMALS|HIDE,F_HEIGHT|SHOW,F_ITEMS|HIDE,8@ +ITEM "DATA|Data" MESSAGE HIDE,F_DECIMALS|HIDE,F_HEIGHT|SHOW,F_ITEMS|SHOW,8@ +ITEM "LISTA|Lista" MESSAGE HIDE,F_DECIMALS|HIDE,F_HEIGHT|SHOW,F_ITEMS|HIDE,8@ +ITEM "GRUPPO|Gruppo" MESSAGE HIDE,F_DECIMALS|HIDE,F_HEIGHT|HIDE,F_ITEMS|HIDE,8@ +ITEM "LINEA|Linea" MESSAGE HIDE,F_DECIMALS|SHOW,F_HEIGHT|HIDE,F_ITEMS|HIDE,8@ +ITEM "BOX|Box" MESSAGE HIDE,F_DECIMALS|SHOW,F_HEIGHT|HIDE,F_ITEMS|HIDE,8@ +ITEM "FIGURA|Figura" MESSAGE HIDE,F_DECIMALS|SHOW,F_HEIGHT|HIDE,F_ITEMS|HIDE,8@ END NUMBER F_ID 4 diff --git a/ba/ba3100.cpp b/ba/ba3100.cpp index a0b7b5267..de7e74491 100755 --- a/ba/ba3100.cpp +++ b/ba/ba3100.cpp @@ -1,5 +1,7 @@ #include +#include #include +#include #include #include "../cg/cglib03.h" @@ -256,6 +258,16 @@ char TGeneric_table_app::frequenza_versamenti(long firm, int year) const return freq; } +HIDDEN bool ditta_handler(TMask_field& f, KEY k) +{ + if (f.to_check(k)) + { + TFirm firm(atol(f.get())); + f.mask().set(F_CODVAL, firm.codice_valuta()); + } + return TRUE; +} + HIDDEN bool coddel_handler(TMask_field& f, KEY k) { TMask& m = f.mask(); @@ -343,6 +355,15 @@ HIDDEN bool intdel_handler(TMask_field& f, KEY k) HIDDEN bool impdel_handler(TMask_field& f, KEY k) { const TMask& m = f.mask(); + + if (f.to_check(k)) + { + real r(f.get()); + TCurrency cur(r, f.mask().get(F_CODVAL)); + const int ndec = cur.decimals(); + r.round(ndec == 0 ? -3 : ndec); + f.set(r.string()); + } if (!m.query_mode() && k == K_ENTER) { @@ -494,6 +515,7 @@ bool TGeneric_table_app::user_create() if (name == TAB_DELEGHE) { + mask.set_handler(F_DITTA, ditta_handler); mask.set_handler(F_MESEDEL, mese_handler); mask.set_handler(F_IMPORTO, impdel_handler); mask.set_handler(F_INTERESSI, intdel_handler); diff --git a/ba/ba3300.cpp b/ba/ba3300.cpp index 5224aea17..d516dad15 100755 --- a/ba/ba3300.cpp +++ b/ba/ba3300.cpp @@ -163,7 +163,18 @@ void Libribollati_print::set_page(int , int counter) } bool Libribollati_print::set_print(int) -{ +{ + _msk->reset(F_TIPOREG); + _msk->reset(F_TIPOREGCOM); + _msk->reset(F_ANNO); + _msk->reset(F_CODICE); + _msk->reset(F_ANNOREG); + _msk->reset(F_CODICEREG); + _msk->reset(F_REGISTRO); + _msk->reset(F_NPAGINI); + _msk->reset(F_NPAGFI); + _msk->reset(F_PRIMO); + _msk->reset(F_ANNOSTAMPA); if (_msk->run() == K_ENTER) { TPrinter& pr = printer(); diff --git a/ba/ba3700a.uml b/ba/ba3700a.uml index 2b9f5e5a9..e6ec3b6c1 100755 --- a/ba/ba3700a.uml +++ b/ba/ba3700a.uml @@ -90,28 +90,27 @@ BEGIN ITEM "6|Imposte + spese" END - -NUMBER F_NUM_RATE 3 +NUMBER F_INT_RATE 3 BEGIN - PROMPT 57 5 "Numero rate " - HELP "Numero delle rate" + PROMPT 53 5 "Intervallo rate " + HELP "Giorni di intervallo tra una data e l'altra" + FIELD I3 FLAGS "R" END LIST F_RATE_DIFF 1 30 BEGIN PROMPT 5 6 "Rate " - ITEM "1|Differenziate" MESSAGE "X",909|DISABLE,F_NUM_RATE - ITEM "2|Uguali (obbligate dalla 2a)" MESSAGE "",909|ENABLE,F_NUM_RATE - ITEM "3|Uguali dalla prossima modif." MESSAGE "X",909|DISABLE,F_NUM_RATE - ITEM "4|Uguali finche' possibile" MESSAGE "X",909|DISABLE,F_NUM_RATE + ITEM "1|Differenziate" MESSAGE "X",909|DISABLE,F_NUM_RATE|CLEAR,F_ULT_CLASS + ITEM "2|Uguali (obbligate dalla 2a)" MESSAGE "",909|ENABLE,F_NUM_RATE|ENABLE,F_ULT_CLASS + ITEM "3|Uguali dalla prossima modif." MESSAGE "X",909|DISABLE,F_NUM_RATE|ENABLE,F_ULT_CLASS + ITEM "4|Uguali finche' possibile" MESSAGE "X",909|DISABLE,F_NUM_RATE|ENABLE,F_ULT_CLASS END -NUMBER F_INT_RATE 3 +NUMBER F_NUM_RATE 3 BEGIN - PROMPT 53 6 "Intervallo rate " - HELP "Giorni di intervallo tra una data e l'altra" - FIELD I3 + PROMPT 57 6 "Numero rate " + HELP "Numero delle rate" FLAGS "R" END diff --git a/ba/ba4100a.uml b/ba/ba4100a.uml index a89860220..ef999d540 100755 --- a/ba/ba4100a.uml +++ b/ba/ba4100a.uml @@ -126,7 +126,11 @@ END STRING FLD_CM1_DUFIIDD1 50 BEGIN PROMPT 20 6 "" - FLAGS "D" + USE %UID KEY 2 + INPUT S0 FLD_CM1_DUFIIDD1 + DISPLAY "Denominazione@50" S0 + DISPLAY "Codice" CODTAB + COPY OUTPUT FLD_CM1_UFIIDD1 END NUMBER FLD_CM1_UFIIDD2 3 @@ -147,7 +151,10 @@ END STRING FLD_CM1_DUFIIDD2 50 BEGIN PROMPT 20 7 "" - FLAGS "D" + COPY USE FLD_CM1_DUFIIDD1 + INPUT S0 FLD_CM1_DUFIIDD2 + COPY DISPLAY FLD_CM1_DUFIIDD1 + COPY OUTPUT FLD_CM1_UFIIDD2 END NUMBER FLD_CM1_UFIIDD3 3 @@ -168,7 +175,10 @@ END STRING FLD_CM1_DUFIIDD3 50 BEGIN PROMPT 20 8 "" - FLAGS "D" + COPY USE FLD_CM1_DUFIIDD1 + INPUT S0 FLD_CM1_DUFIIDD3 + COPY DISPLAY FLD_CM1_DUFIIDD1 + COPY OUTPUT FLD_CM1_UFIIDD3 END GROUPBOX DLG_NULL 75 5 @@ -195,7 +205,11 @@ END STRING FLD_CM1_DUFFIVA1 50 BEGIN PROMPT 20 11 "" - FLAGS "D" + USE %UIV KEY 2 + INPUT S0 FLD_CM1_DUFFIVA1 + DISPLAY "Denominazione@50" S0 + DISPLAY "Codice" CODTAB + COPY OUTPUT FLD_CM1_UFFIVA1 END NUMBER FLD_CM1_UFFIVA2 3 @@ -216,7 +230,10 @@ END STRING FLD_CM1_DUFFIVA2 50 BEGIN PROMPT 20 12 "" - FLAGS "D" + COPY USE FLD_CM1_DUFFIVA1 + INPUT S0 FLD_CM1_DUFFIVA2 + COPY DISPLAY FLD_CM1_DUFFIVA1 + COPY OUTPUT FLD_CM1_UFFIVA2 END NUMBER FLD_CM1_UFFIVA3 3 @@ -237,7 +254,10 @@ END STRING FLD_CM1_DUFFIVA3 50 BEGIN PROMPT 20 13 "" - FLAGS "D" + COPY USE FLD_CM1_DUFFIVA1 + INPUT S0 FLD_CM1_DUFFIVA3 + COPY DISPLAY FLD_CM1_DUFFIVA1 + COPY OUTPUT FLD_CM1_UFFIVA3 END ENDPAGE @@ -302,7 +322,11 @@ END STRING FLD_CM2_DUFFREG 50 BEGIN PROMPT 23 5 "" - FLAGS "D" + USE %URE KEY 2 + INPUT S0 FLD_CM2_DUFFREG + DISPLAY "Denominazione@50" S0 + DISPLAY "Codice" CODTAB + COPY OUTPUT FLD_CM2_UFFREG END NUMBER FLD_CM2_UFFCONC 3 @@ -324,7 +348,11 @@ END STRING FLD_CM2_DUFFCONC 50 BEGIN PROMPT 23 6 "" - FLAGS "D" + USE %UCC KEY 2 + INPUT S0 FLD_CM2_DUFFCONC + DISPLAY "Denominazione@50" S0 + DISPLAY "Codice" CODTAB + COPY OUTPUT FLD_CM2_UFFCONC END NUMBER FLD_CM2_UFFCSERV 3 @@ -346,7 +374,11 @@ END STRING FLD_CM2_DUFFCSERV 50 BEGIN PROMPT 23 7 "" - FLAGS "D" + USE %UCS KEY 2 + INPUT S0 FLD_CM2_DUFFCSERV + DISPLAY "Denominazione@50" S0 + DISPLAY "Codice" CODTAB + COPY OUTPUT FLD_CM2_UFFCSERV END GROUPBOX DLG_NULL 23 4 diff --git a/ba/ba4300.cpp b/ba/ba4300.cpp index a8e2ce66b..b279af7bc 100755 --- a/ba/ba4300.cpp +++ b/ba/ba4300.cpp @@ -210,7 +210,8 @@ bool TDitte_application::user_create() // initvar e arrmask _msk->set_handler(DLG_FAX, fax_handler); _msk->set_handler(ba4300_handler); set_search_field(FLD_GD1_CODDITTA); - + +/* if (argc() > 2) { get_mask(MODE_QUERY); @@ -219,6 +220,7 @@ bool TDitte_application::user_create() // initvar e arrmask s << argv(2) << "|" << argv(2); set_link(*_msk, s); } +*/ return TRUE; } diff --git a/ba/ba4300a.uml b/ba/ba4300a.uml index fe0cd9f0d..552cad275 100755 --- a/ba/ba4300a.uml +++ b/ba/ba4300a.uml @@ -22,7 +22,7 @@ END BUTTON DLG_REG 10 2 BEGIN - PROMPT -46 -3 "R~egistri" + PROMPT -46 -3 "Re~gistri" MESSAGE K_F8 END diff --git a/ba/ba5200a.uml b/ba/ba5200a.uml index 34db50a57..e3303324b 100755 --- a/ba/ba5200a.uml +++ b/ba/ba5200a.uml @@ -122,15 +122,16 @@ BEGIN // ITEM "4|4) Libro Incassi e pagamenti" // MESSAGE HIDE,2@|HIDE,3@|HIDE,4@|HIDE,6@|HIDE,7@|HIDE,8@|HIDE,9@|HIDE,10@|SHOW,5@|SHOW,F_PRINTER|SHOW,F_CONFIG // ITEM "5|5) Libro Giornale" -// MESSAGE HIDE,2@|HIDE,4@|HIDE,5@|HIDE,7@|HIDE,8@|HIDE,9@|HIDE,10@|SHOW,6@|SHOW,F_PRINTER|SHOW,F_CONFIG +// MESSAGE HIDE,2@|HIDE,4@|HIDE,5@|HIDE,7@|HIDE,8@|HIDE,9@|HIDE,10@|SHOW,6@|SHOW,F_PRINTER|SHOW,F_CONFIG|"",F_ATTIVITA // ITEM "6|6) Libri Sociali" -// MESSAGE HIDE,2@|HIDE,3@|HIDE,4@|HIDE,5@|HIDE,6@|HIDE,8@|HIDE,9@|HIDE,10@|SHOW,7@|SHOW,F_PRINTER|SHOW,F_CONFIG +// MESSAGE HIDE,2@|HIDE,3@|HIDE,4@|HIDE,5@|HIDE,6@|HIDE,8@|HIDE,9@|HIDE,10@|SHOW,7@|SHOW,F_PRINTER|SHOW,F_CONFIG|"",F_ATTIVITA ITEM "7|7) Libro Cespiti" - MESSAGE HIDE,2@|HIDE,3@|HIDE,4@|HIDE,5@|HIDE,6@|HIDE,7@|HIDE,9@|HIDE,10@|SHOW,8@|HIDE,F_PRINTER|SHOW,F_CODLBU|HIDE,F_CONFIG + MESSAGE HIDE,2@|HIDE,3@|HIDE,4@|HIDE,5@|HIDE,6@|HIDE,7@|HIDE,9@|HIDE,10@|SHOW,8@|HIDE,F_PRINTER|SHOW,F_CODLBU|HIDE,F_CONFIG|"",F_ATTIVITA ITEM "8|8) Libro Inventari" - MESSAGE HIDE,2@|HIDE,3@|HIDE,4@|HIDE,5@|HIDE,6@|HIDE,7@|HIDE,8@|HIDE,10@|SHOW,9@|SHOW,F_PRINTER|SHOW,F_CONFIG -// ITEM "9|9) Libro delle Procedure" -// MESSAGE HIDE,2@|HIDE,3@|HIDE,4@|HIDE,5@|HIDE,6@|HIDE,7@|HIDE,8@|HIDE,9@|SHOW,10@|SHOW,F_PRINTER|SHOW,F_CONFIG + MESSAGE HIDE,2@|HIDE,3@|HIDE,4@|HIDE,5@|HIDE,6@|HIDE,7@|HIDE,8@|HIDE,10@|SHOW,9@|SHOW,F_PRINTER|SHOW,F_CONFIG|"",F_ATTIVITA +// ITEM "9|9) Giornale di magazzino" +// MESSAGE HIDE,GRP_VENDITE@|HIDE,GRP_ACQUISTI@|HIDE,GRP_RIEPIVA@|HIDE,GRP_INCASSI@|HIDE,GRP_GIORNALE@|HIDE,GRP_LSOCIALI@|HIDE,GRP_CESPITI@|HIDE,GRP_INVENTARI@|SHOW,GRP_GIORNMAG@ +// MESSAGE "",GRP_NOGIORNMAG@|"",F_ATTIVITA END STRING F_CONSPRESSO 50 diff --git a/ba/ba6100a.uml b/ba/ba6100a.uml index eb5d08f13..36dae8bc1 100755 --- a/ba/ba6100a.uml +++ b/ba/ba6100a.uml @@ -222,31 +222,31 @@ BEGIN PROMPT 3 13 "Stampa" END -BUTTON BUT_BA6_ELENCO 9 2 +BUTTON BUT_BA6_ELENCO 10 2 BEGIN - PROMPT 4 14 "Elenco" + PROMPT 4 14 "~Elenco" MESSAGE EXIT,BUT_BA6_ELENCO END - -BUTTON BUT_BA6_SCHEDE 9 2 + +BUTTON BUT_BA6_SCHEDE 10 2 BEGIN - PROMPT 16 14 "Schede" + PROMPT 16 14 "S~chede" MESSAGE EXIT,BUT_BA6_SCHEDE END -BUTTON BUT_BA6_RUBRICHE 9 2 +BUTTON BUT_BA6_RUBRICHE 10 2 BEGIN - PROMPT 28 14 "Rubriche" + PROMPT 28 14 "~Rubriche" MESSAGE EXIT,BUT_BA6_RUBRICHE END -BUTTON BUT_BA6_ETICHETTE 9 2 +BUTTON BUT_BA6_ETICHETTE 10 2 BEGIN - PROMPT 40 14 "Etichette" + PROMPT 40 14 "E~tichette" MESSAGE EXIT,BUT_BA6_ETICHETTE END -BUTTON DLG_QUIT 9 2 +BUTTON DLG_QUIT 10 2 BEGIN PROMPT 56 14 "" END diff --git a/ba/ba6100b.uml b/ba/ba6100b.uml index e6e46a7a3..bd41c1709 100755 --- a/ba/ba6100b.uml +++ b/ba/ba6100b.uml @@ -96,7 +96,7 @@ END BUTTON DLG_OK 10 2 BEGIN - PROMPT -13 -1 "Conferma" + PROMPT -13 -1 "" END BUTTON DLG_CANCEL 10 2 diff --git a/ba/ba6200a.uml b/ba/ba6200a.uml index 13ed7d34e..1b1fc7682 100755 --- a/ba/ba6200a.uml +++ b/ba/ba6200a.uml @@ -35,15 +35,12 @@ STRING F_STATOINI 3 BEGIN PROMPT 2 6 "Da codice " HELP "Codice del comune da cui iniziare la stampa. Vuoto = inizio archivio" - USE LF_COMUNI KEY 1 - INPUT STATO F_STATOINI - INPUT COM F_CODICEINI - DISPLAY "Stato" STATO - DISPLAY "Comune" COM - DISPLAY "Denominazione@50" DENCOM - OUTPUT F_STATOINI STATO - OUTPUT F_CODICEINI COM - CHECKTYPE NORMAL + USE %STA + INPUT CODTAB F_STATOINI + DISPLAY "Stato" CODTAB + DISPLAY "Denominazione@50" S0 + OUTPUT F_STATOINI CODTAB + FLAG "Z" END STRING F_CODICEINI 4 @@ -51,13 +48,14 @@ BEGIN PROMPT 20 6 "" FLAGS "U" HELP "Codice del comune da cui iniziare la stampa. Vuoto = inizio archivio" - COPY USE F_STATOINI + USE LF_COMUNI INPUT STATO F_STATOINI INPUT COM F_CODICEINI - COPY DISPLAY F_STATOINI + DISPLAY "Stato" STATO + DISPLAY "Codice" COM + DISPLAY "Denominazione@50" DENCOM OUTPUT F_STATOINI STATO OUTPUT F_CODICEINI COM - CHECKTYPE NORMAL END STRING F_STATOFINE 3 @@ -65,12 +63,10 @@ BEGIN PROMPT 37 6 "A codice " HELP "Codice del comune a cui terminare la stampa. Vuoto = fine archivio" COPY USE F_STATOINI - INPUT STATO F_STATOFINE - INPUT COM F_CODICEFINE + INPUT CODTAB F_STATOFINE COPY DISPLAY F_STATOINI - OUTPUT F_STATOFINE STATO - OUTPUT F_CODICEFINE COM - CHECKTYPE NORMAL + OUTPUT F_STATOFINE CODTAB + FLAG "Z" END STRING F_CODICEFINE 4 @@ -78,13 +74,12 @@ BEGIN PROMPT 54 6 "" HELP "Codice del comune a cui terminare la stampa. Vuoto = fine archivio" FLAGS "U" - COPY USE F_STATOINI + COPY USE F_CODICEINI INPUT STATO F_STATOFINE INPUT COM F_CODICEFINE - COPY DISPLAY F_STATOINI + COPY DISPLAY F_CODICEINI OUTPUT F_STATOFINE STATO OUTPUT F_CODICEFINE COM - CHECKTYPE NORMAL END GROUPBOX F_NOME 63 4 diff --git a/ba/ba883.cpp b/ba/ba883.cpp index b3f7db1f9..04cd59624 100755 --- a/ba/ba883.cpp +++ b/ba/ba883.cpp @@ -503,7 +503,6 @@ void TTest_application::fill_trees(TMask& msk) tf.set_handler(tree_handler); } } -} void TTest_application::main_loop() { @@ -662,6 +661,9 @@ void TBenchmark_application::test_cursor_scan() start_test("Scansione cursore COMUNI"); + const TRecnotype tot = cur.items(); + cur.freeze(); + cur = 0L; for (TRecnotype c = 0; c < tot; c++) { diff --git a/ba/bainst.cpp b/ba/bainst.cpp index aae83b950..463d662eb 100755 --- a/ba/bainst.cpp +++ b/ba/bainst.cpp @@ -534,6 +534,13 @@ void TInstallmodule_app::run(int argc, char* argv[]) } +void TInstallmodule_app::set_tab_app(const char * appname) +{ + TConfig ditta(CONFIG_DITTA); + ditta.set_paragraph(module_code()); + ditta.set("TabApp",appname); +} + int main(int argc,char** argv) { TApplication::check_parameters(argc, argv); @@ -553,6 +560,10 @@ int main(int argc,char** argv) r=bainst32(argc, argv);// pre/post installazione magazzino: else if (mod == "sv") r=bainst38(argc, argv);// pre/post installazione statistiche: + else if (mod == "db") + r=bainst35(argc, argv);// pre/post installazione DI.BA. + else if (mod == "mr") + r=bainst39(argc, argv);// pre/post installazione MRP else r=bainst00(argc, argv);// pre/post installazione base exit(r); diff --git a/ba/bainst.h b/ba/bainst.h index 2b5737cfd..69da44263 100755 --- a/ba/bainst.h +++ b/ba/bainst.h @@ -8,8 +8,9 @@ int bainst07(int argc, char** argv); int bainst17(int argc, char** argv); int bainst31(int argc, char** argv); int bainst32(int argc, char** argv); +int bainst35(int argc, char** argv); int bainst38(int argc, char** argv); - +int bainst39(int argc, char** argv); // classe provvisoria per i system file temporanei, ovvero file temporanei con // caricamento/scaricamento @@ -47,6 +48,7 @@ protected: TString _modcode,_modname; protected: + void set_tab_app(const char * appname); bool test_database() {return _test_database;} const char * module_name() const {return _modname;} const char * module_code() const {return _modcode;} diff --git a/ba/bainst00.cpp b/ba/bainst00.cpp index f5fe08794..2f1630536 100755 --- a/ba/bainst00.cpp +++ b/ba/bainst00.cpp @@ -13,7 +13,6 @@ private: protected: virtual bool modal() const {return FALSE;} - virtual int module_number() const {return 0;} virtual bool install_firm() {return TRUE;} // no firm installation virtual bool install_com() {return TRUE;} // no com installation diff --git a/ba/bainst32.cpp b/ba/bainst32.cpp index fcb7b8254..eeb92094f 100755 --- a/ba/bainst32.cpp +++ b/ba/bainst32.cpp @@ -12,12 +12,25 @@ class TInstall_MG : public TInstallmodule_app TMask * _m; protected: virtual int module_number() const {return 32;} - virtual bool install_firm() {return TRUE;} // no firm installation + virtual bool post_installer(); public: virtual ~TInstall_MG () {} }; +bool TInstall_MG::post_installer() +{ + set_tab_app("mg0 -0"); + return TRUE; +} +bool TInstall_MG::load_default_data() const +{ + TTable cau("%CAU"); + const bool empty = cau.first() != NOERR; + + return empty; +} + int bainst32(int argc, char** argv) { TInstall_MG app; diff --git a/ba/bainst35.cpp b/ba/bainst35.cpp new file mode 100755 index 000000000..c8a7e4386 --- /dev/null +++ b/ba/bainst35.cpp @@ -0,0 +1,27 @@ +#include + +#include "bainst.h" + +class TInstall_DB : public TInstallmodule_app +{ +protected: + virtual bool modal() const {return FALSE;} + virtual int module_number() const {return 35;} + virtual bool post_installer(); + +public: + virtual ~TInstall_DB () {} +}; + +bool TInstall_DB::post_installer() +{ + set_tab_app("db0 -0"); + return TRUE; +} + +int bainst35(int argc, char** argv) +{ + TInstall_DB app; + app.run(argc, argv); + return 0; +} \ No newline at end of file diff --git a/ba/bainst39.cpp b/ba/bainst39.cpp new file mode 100755 index 000000000..cf04d8d7a --- /dev/null +++ b/ba/bainst39.cpp @@ -0,0 +1,27 @@ +#include + +#include "bainst.h" + +class TInstall_MR : public TInstallmodule_app +{ +protected: + virtual bool modal() const {return FALSE;} + virtual int module_number() const {return 39;} + virtual bool post_installer(); + +public: + virtual ~TInstall_MR () {} +}; + +bool TInstall_MR::post_installer() +{ + set_tab_app("mr0 -0"); + return TRUE; +} + +int bainst39(int argc, char** argv) +{ + TInstall_MR app; + app.run(argc, argv); + return 0; +} \ No newline at end of file diff --git a/ba/baprassi.men b/ba/baprassi.men index 179a646aa..3a91f3c71 100755 --- a/ba/baprassi.men +++ b/ba/baprassi.men @@ -42,7 +42,6 @@ Item_08 = "Cariche sociali", "ba3 -0 %crs", "" Item_09 = "Vecchi cod.Attivita'", "ba3 -0 %ois", "" Item_10 = "Stati esteri", "ba3 -0 %sta", "" Item_11 = "Gestione profili deleghe e distinte", "ba2 -0", "" -Item_12 = "Nomenclatura combinata", "ba3 -0 %noc", "" [PRASSI_003] Caption = "Stampa tabelle" diff --git a/ba/bastcam.uml b/ba/bastcam.uml index e90ead291..6de0681da 100755 --- a/ba/bastcam.uml +++ b/ba/bastcam.uml @@ -6,7 +6,7 @@ STRING F_INIZIO1 3 BEGIN PROMPT 2 1 "Da valuta " HELP "Inserire la valuta iniziale " - FIELD LF_TABCOM->CODTAB[1,3] + FIELD CODTAB[1,3] USE CAM JOIN %VAL ALIAS 200 INTO CODTAB=CODTAB[1,3] INPUT CODTAB[1,3] F_INIZIO1 @@ -16,6 +16,7 @@ BEGIN DISPLAY "Descrizione@50" -200->S0 OUTPUT F_INIZIO1 CODTAB[1,3] OUTPUT F_INIZIO2 CODTAB[4,14] + FLAGS "UZ" GROUP 1 END @@ -23,7 +24,7 @@ DATE F_INIZIO2 BEGIN PROMPT 28 1 "Da data " HELP "Inserire la data iniziale" - FIELD LF_TABCOM->CODTAB[4,11] + FIELD CODTAB[4,11] COPY ALL F_INIZIO1 FLAGS "R" GROUP 1 @@ -33,7 +34,7 @@ STRING F_FINE1 3 BEGIN PROMPT 2 3 "A valuta " HELP "Inserire la valuta finale " - FIELD LF_TABCOM->CODTAB[1,3] + FIELD CODTAB[1,3] COPY USE F_INIZIO1 INPUT CODTAB[1,3] F_FINE1 INPUT CODTAB[4,11] F_FINE2 @@ -42,6 +43,7 @@ BEGIN DISPLAY "Descrizione@50" -200->S0 OUTPUT F_FINE1 CODTAB[1,3] OUTPUT F_FINE2 CODTAB[4,11] + FLAGS "UZ" GROUP 2 END @@ -50,7 +52,7 @@ DATE F_FINE2 BEGIN PROMPT 28 3 "A data " HELP "Inserire la data finale " - FIELD LF_TABCOM->CODTAB[4,11] + FIELD CODTAB[4,11] FLAGS "R" COPY ALL F_FINE1 GROUP 2 diff --git a/ba/batbban.uml b/ba/batbban.uml index 8b607ef6b..5bdeb0eab 100755 --- a/ba/batbban.uml +++ b/ba/batbban.uml @@ -20,7 +20,8 @@ BEGIN OUTPUT F_CODICEABI CODTAB[1,5] OUTPUT H_DENOMABI S0 MESSAGE COPY,H_CODICEABI - CHECKTYPE REQUIRED + WARNING "Istituto assente" + CHECKTYPE FORCED END NUMBER F_CODICECAB 5 diff --git a/ba/batbcam.rpt b/ba/batbcam.rpt index d878efbc3..7ae6f0ef3 100755 --- a/ba/batbcam.rpt +++ b/ba/batbcam.rpt @@ -1,5 +1,5 @@ [Relations] -%VAL;CODTAB=CODTAB[1,3];1;0;200 +%VAL;CODTAB==(TRIM(CODTAB[1,3]));1;0;200 [Headers] 132 diff --git a/ba/batbclr.uml b/ba/batbclr.uml index 75a2b304e..4d132548d 100755 --- a/ba/batbclr.uml +++ b/ba/batbclr.uml @@ -8,20 +8,18 @@ ENDPAGE PAGE "Ulteriore classificazione" -1 -1 78 13 -GROUPBOX DLG_NULL 75 7 +GROUPBOX DLG_NULL 75 9 BEGIN PROMPT 1 0 "Ulteriore classificazione" FLAGS "R" END -NUMBER F_CODICERATA 1 +LISTBOX F_CODICERATA 1 35 BEGIN - PROMPT 2 2 "Codice " + PROMPT 2 2 "Codice " FIELD CODTAB[1,1] - SHEET "Codice|Descrizione@50" - INPUT F_CODICERATA - OUTPUT F_CODICERATA - OUTPUT F_DESCR +// SHEET "Codice|Descrizione@50" +// INPUT F_CODICERATA ITEM "1|Rimessa diretta o contanti" ITEM "2|Tratta" ITEM "3|Ricevuta Bancaria" @@ -32,12 +30,13 @@ BEGIN ITEM "8|Rapporti Interbancari Diretti" ITEM "9|Bonifici" KEY 1 -// CHECKTYPE REQUIRED +// OUTPUT F_CODICERATA +// OUTPUT F_DESRATA END STRING F_CODICEALFA 1 BEGIN - PROMPT 20 2 "Classificazione " + PROMPT 2 4 "Classificazione " FLAGS "U" FIELD CODTAB[2,2] USE %CLR @@ -55,7 +54,7 @@ END STRING F_DESCR 50 BEGIN - PROMPT 2 4 "Descrizione " + PROMPT 2 6 "Descrizione " FIELD S0 USE %CLR KEY 2 INPUT S0 F_DESCR diff --git a/ba/batbdel.h b/ba/batbdel.h index 334f243e2..d52fb5d87 100755 --- a/ba/batbdel.h +++ b/ba/batbdel.h @@ -12,6 +12,7 @@ #define F_STAMPATO 142 #define F_DITTA 143 #define F_RSOC 144 +#define F_CODVAL 145 diff --git a/ba/batbdel.uml b/ba/batbdel.uml index 290a0e405..426a1df60 100755 --- a/ba/batbdel.uml +++ b/ba/batbdel.uml @@ -25,6 +25,12 @@ BEGIN WARNING "Ditta assente" END +STRING F_CODVAL 3 +BEGIN + PROMPT 0 0 "" + FLAGS "HD" +END + STRING F_RSOC 50 BEGIN PROMPT 4 2 "Ragione sociale " @@ -151,23 +157,22 @@ BEGIN WARNING "Concessione assente" END -NUMBER F_IMPORTO 15 +CURRENCY F_IMPORTO 15 BEGIN PROMPT 4 10 "Importo versato " FIELD R0 FLAGS "R" - PICTURE "." + DRIVENBY F_CODVAL HELP "Importo versato" - NUM_CALC {ROUND(#THIS_FIELD, -3)} END -NUMBER F_INTERESSI 15 +CURRENCY F_INTERESSI 15 BEGIN PROMPT 4 11 "Di cui interessi " FIELD R1 FLAGS "R" - PICTURE "." HELP "Interessi da pagare" + DRIVENBY F_CODVAL END BOOLEAN F_STAMPATO diff --git a/ba/batbiva.h b/ba/batbiva.h index c1f3d7d83..ddeb9bfb9 100755 --- a/ba/batbiva.h +++ b/ba/batbiva.h @@ -19,3 +19,6 @@ #define DLG_DEL 120 #define FLD_SOSPESO_B2 118 #define CHK_TABIVA_B4 119 +#define FLD_TABIVA_S10 120 +#define FLD_TABIVA_S11 121 + diff --git a/ba/batbiva.rpt b/ba/batbiva.rpt index 076e85a2a..e9c4591fd 100755 --- a/ba/batbiva.rpt +++ b/ba/batbiva.rpt @@ -1,41 +1,46 @@ [Headers] 132 Tabella codici IVA -1|@64g%s|Tipo -1|@69g%s|C.IVA -1|@76g%s|%IVA -1|@83g%s|Riga IVA11 -1|@94g%s|Rimb. -1|@108g%s|Reg. -1|@115g%s|Ag. -1|@121g%s|Esc. +1|@54g%s|Tipo +1|@59g%s|C.IVA +1|@66g%s|%IVA +1|@73g%s|Riga IVA11 +1|@84g%s|Riga prosp. +1|@96g%s|Rimb. +1|@110g%s|Reg. +1|@117g%s|Ag. +1|@123g%s|Esc. 2|%s|Cod. 2|@6g%s|Descrizione -2|@57g%s|Aliq. -2|@64g%s|Cod. -2|@69g%s|Vent. -2|@75g%s|Teorica -2|@83g%s|Vend. -2|@89g%s|Acq. -2|@94g%s|Infr. -2|@100g%s|Plafond -2|@108g%s|Agr. -2|@113g%s|Viaggio -2|@121g%s|Rimb. -2|@127g%s|Sosp. +2|@47g%s|Aliq. +2|@54g%s|Cod. +2|@59g%s|Vent. +2|@65g%s|Teorica +2|@73g%s|Vend. +2|@79g%s|Acq. +2|@84g%s|Vend. +2|@90g%s|Acq. +2|@96g%s|Infr. +2|@102g%s|Plafond +2|@110g%s|Agr. +2|@115g%s|Viaggio +2|@123g%s|Rim. +2|@128g%s|Sos. [Rows] 1|CODTAB|@g@4,cs -1|S0|@6g@50,ls -1|R0|@57g@6n -1|S1|@65g@2s -1|S6|@69g@4s -1|I0|@77g@2n -1|S2|@83g@3s -1|S9|@89g@3s -1|B3|@95g@f -1|S3|@103g@1s -1|S4|@109g@1s -1|S5|@116g@1s -1|B4|@121g@f +1|S0|@6g@40,ls +1|R0|@47g@6n +1|S1|@55g@2s +1|S6|@59g@4s +1|I0|@67g@2n +1|S2|@73g@3s +1|S9|@79g@3s +1|S10|@85g@3s +1|S11|@90g@3s +1|B3|@97g@f +1|S3|@105g@1s +1|S4|@111g@1s +1|S5|@118g@1s +1|B4|@123g@f 1|B2|@128g@f [Footers] diff --git a/ba/batbiva.uml b/ba/batbiva.uml index b0382cd63..79c4946f6 100755 --- a/ba/batbiva.uml +++ b/ba/batbiva.uml @@ -86,6 +86,7 @@ BEGIN CHECKTYPE NORMAL VALIDATE ZEROFILL_FUNC 2 HELP "Inserire il codice iva a cui ventilare l'imposta" + ADD NONE END NUMBER FLD_TABIVA_R0 6 2 @@ -187,9 +188,37 @@ BEGIN ITEM "16|Acquisti non soggetti all'imposta effettuati dai terremotati" END +STRING FLD_TABIVA_S10 3 +BEGIN + PROMPT 3 12 "Riga vendite prospetto IVA periodica " + FIELD S10 + FLAGS "U" + SHEET "Riga|Descrizione@60" + INPUT FLD_TABIVA_S10 + OUTPUT FLD_TABIVA_S10 + ITEM " |Nessuno" + ITEM "VP1|VP1" + ITEM "VP2|VP2" + CHECKTYPE NORMAL +END + +STRING FLD_TABIVA_S11 3 +BEGIN + PROMPT 3 13 "Riga acquisti prospetto IVA periodica " + FIELD S11 + FLAGS "U" + SHEET "Riga|Descrizione@60" + INPUT FLD_TABIVA_S11 + OUTPUT FLD_TABIVA_S11 + ITEM " |Nessuno" + ITEM "VP3|VP3" + ITEM "VP4|VP4" + CHECKTYPE NORMAL +END + LIST LST_TABIVA_S3 1 31 BEGIN - PROMPT 3 12 "Gestione plafond " + PROMPT 3 14 "Gestione plafond " FIELD S3 HELP "Indicare il tipo di gestione di plafond" ITEM " |Regime normale" @@ -200,7 +229,7 @@ END LIST LST_TABIVA_S4 1 43 BEGIN - PROMPT 3 13 "Regime agricolo " + PROMPT 3 15 "Regime agricolo " FIELD S4 HELP "Indicare il tipo di gestione per regime agricolo" ITEM " |Regime normale" @@ -211,7 +240,7 @@ END LIST LST_TABIVA_S5 1 31 BEGIN - PROMPT 3 14 "Ag. viaggio/turismo " + PROMPT 3 16 "Ag. viaggio/turismo " FIELD S5 HELP "Indicare il tipo di gestione per agenzie viaggio/turismo" ITEM " |Regime normale" @@ -224,21 +253,21 @@ END BOOLEAN CHK_TABIVA_B4 BEGIN - PROMPT 3 15 "Escluso dal calcolo rimborso per aliquota media" + PROMPT 3 17 "Escluso dal calcolo rimborso per aliquota media" FIELD B4 HELP "Indicare se il codice NON vale per il calcolo del rimborso per aliquota media" END BOOLEAN CHK_TABIVA_S9 BEGIN - PROMPT 3 16 "Codice per calcolo rimborso infrannuale" + PROMPT 3 18 "Codice per calcolo rimborso infrannuale" FIELD B3 HELP "Indicare se il codice vale per il calcolo del rimborso infrannuale" END BOOLEAN FLD_SOSPESO_B2 BEGIN - PROMPT 3 17 "Codice IVA sospeso" + PROMPT 3 19 "Codice IVA sospeso" FIELD B2 HELP "Indicare se il codice iva e' sospeso" END @@ -247,96 +276,3 @@ ENDPAGE ENDMASK - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ba/batbreg.uml b/ba/batbreg.uml index fc64037a5..44a9c00d7 100755 --- a/ba/batbreg.uml +++ b/ba/batbreg.uml @@ -135,17 +135,17 @@ BEGIN // MESSAGE HIDE,GRP_VENDITE@|HIDE,GRP_ACQUISTI@|HIDE,GRP_RIEPIVA@|HIDE,GRP_GIORNALE@|HIDE,GRP_LSOCIALI@|HIDE,GRP_CESPITI@|HIDE,GRP_INVENTARI@|HIDE,GRP_GIORNMAG@|SHOW,GRP_INCASSI@ ITEM "5|5) Libro Giornale" MESSAGE HIDE,GRP_VENDITE@|HIDE,GRP_RIEPIVA@|HIDE,GRP_INCASSI@|HIDE,GRP_LSOCIALI@|HIDE,GRP_CESPITI@|HIDE,GRP_INVENTARI@|HIDE,GRP_GIORNMAG@|SHOW,GRP_GIORNALE@ - MESSAGE "",GRP_SOLOGIORNMAG@ + MESSAGE "",GRP_SOLOGIORNMAG@|"",F_ATTIVITA ITEM "6|6) Libri Sociali" MESSAGE HIDE,GRP_VENDITE@|HIDE,GRP_ACQUISTI@|HIDE,GRP_RIEPIVA@|HIDE,GRP_INCASSI@|HIDE,GRP_GIORNALE@|HIDE,GRP_CESPITI@|HIDE,GRP_INVENTARI@|HIDE,GRP_GIORNMAG@|SHOW,GRP_LSOCIALI@ - MESSAGE "",GRP_SOLOGIORNMAG@ + MESSAGE "",GRP_SOLOGIORNMAG@|"",F_ATTIVITA // ITEM "7|7) Libro Cespiti" -// MESSAGE HIDE,GRP_VENDITE@|HIDE,GRP_ACQUISTI@|HIDE,GRP_RIEPIVA@|HIDE,GRP_INCASSI@|HIDE,GRP_GIORNALE@|HIDE,GRP_LSOCIALI@|HIDE,GRP_INVENTARI@|HIDE,GRP_GIORNMAG@|SHOW,GRP_CESPITI@ +// MESSAGE HIDE,GRP_VENDITE@|HIDE,GRP_ACQUISTI@|HIDE,GRP_RIEPIVA@|HIDE,GRP_INCASSI@|HIDE,GRP_GIORNALE@|HIDE,GRP_LSOCIALI@|HIDE,GRP_INVENTARI@|HIDE,GRP_GIORNMAG@|SHOW,GRP_CESPITI@|"",F_ATTIVITA // ITEM "8|8) Libro Inventari" -// MESSAGE HIDE,GRP_VENDITE@|HIDE,GRP_ACQUISTI@|HIDE,GRP_RIEPIVA@|HIDE,GRP_INCASSI@|HIDE,GRP_GIORNALE@|HIDE,GRP_LSOCIALI@|HIDE,GRP_CESPITI@|HIDE,GRP_GIORNMAG@|SHOW,GRP_INVENTARI@ +// MESSAGE HIDE,GRP_VENDITE@|HIDE,GRP_ACQUISTI@|HIDE,GRP_RIEPIVA@|HIDE,GRP_INCASSI@|HIDE,GRP_GIORNALE@|HIDE,GRP_LSOCIALI@|HIDE,GRP_CESPITI@|HIDE,GRP_GIORNMAG@|SHOW,GRP_INVENTARI@|"",F_ATTIVITA ITEM "9|9) Giornale di magazzino" MESSAGE HIDE,GRP_VENDITE@|HIDE,GRP_ACQUISTI@|HIDE,GRP_RIEPIVA@|HIDE,GRP_INCASSI@|HIDE,GRP_GIORNALE@|HIDE,GRP_LSOCIALI@|HIDE,GRP_CESPITI@|HIDE,GRP_INVENTARI@|SHOW,GRP_GIORNMAG@ - MESSAGE "",GRP_NOGIORNMAG@ + MESSAGE "",GRP_NOGIORNMAG@|"",F_ATTIVITA END STRING F_CONSPRESSO 50 diff --git a/ba/batbsta.uml b/ba/batbsta.uml index c4754770f..af2a0a739 100755 --- a/ba/batbsta.uml +++ b/ba/batbsta.uml @@ -37,7 +37,7 @@ BEGIN KEY 2 USE %STA KEY 2 INPUT S0 FLD_TABSTA_S0 - DISPLAY "Denominazione@50" S0 + DISPLAY "Denominazione@60" S0 DISPLAY "Codice" CODTAB OUTPUT FLD_TABSTA_CODTAB CODTAB OUTPUT FLD_TABSTA_S0 S0 diff --git a/ba/batbtra.uml b/ba/batbtra.uml index 2697560aa..403574d22 100755 --- a/ba/batbtra.uml +++ b/ba/batbtra.uml @@ -12,7 +12,7 @@ STRING F_NOMEID 10 BEGIN PROMPT 1 1 "Nome simbolico sistema inviante " FIELD %TRA->CODTAB[1,10] - FLAGS "U" + FLAGS "UZ" KEY 1 USE %TRA INPUT CODTAB[1,10] F_NOMEID diff --git a/ba/batbucc.uml b/ba/batbucc.uml index 0e3d3f029..99c997228 100755 --- a/ba/batbucc.uml +++ b/ba/batbucc.uml @@ -74,7 +74,10 @@ END STRING FLD_TABUCC_S6_COMUNI_DENCOM 50 BEGIN PROMPT 3 9 "Denominazione " - FLAGS "D" + USE LF_COMUNI KEY 2 + INPUT DENCOM FLD_TABUCC_S6_COMUNI_DENCOM +#include + COPY OUTPUT FLD_TABUCC_S6 END STRING FLD_TABUCC_S6_COMUNI_PROVCOM 2 diff --git a/ba/batbucs.uml b/ba/batbucs.uml index 7ec3d5cee..34e530e34 100755 --- a/ba/batbucs.uml +++ b/ba/batbucs.uml @@ -19,6 +19,7 @@ BEGIN DISPLAY "Codice" CODTAB DISPLAY "Descrizione@40" S0 OUTPUT FLD_TABUCS_CODTAB CODTAB + OUTPUT FLD_TABUCS_S0 S0 HELP "Codice del centro servizio" CHECKTYPE REQUIRED END @@ -30,7 +31,7 @@ BEGIN KEY 2 USE %UCS KEY 2 INPUT S0 FLD_TABUCS_S0 - DISPLAY "Descrizione@40" S0 + DISPLAY "Descrizione@50" S0 DISPLAY "Codice" CODTAB OUTPUT FLD_TABUCS_CODTAB CODTAB OUTPUT FLD_TABUCS_S0 S0 @@ -74,7 +75,10 @@ END STRING FLD_TABUCS_S6_COMUNI_DENCOM 50 BEGIN PROMPT 1 9 "Nome " - FLAGS "D" + USE LF_COMUNI KEY 2 + INPUT DENCOM FLD_TABUCS_S6_COMUNI_DENCOM +#include + COPY OUTPUT FLD_TABUCS_S6 HELP "" END diff --git a/ba/batbure.uml b/ba/batbure.uml index b9db42c0c..137c9ab2b 100755 --- a/ba/batbure.uml +++ b/ba/batbure.uml @@ -31,7 +31,7 @@ BEGIN KEY 2 USE %URE KEY 2 INPUT S0 FLD_TABURE_S0 - DISPLAY "Descrizione@40" S0 + DISPLAY "Descrizione@50" S0 DISPLAY "Codice" CODTAB OUTPUT FLD_TABURE_CODTAB CODTAB OUTPUT FLD_TABURE_S0 S0 @@ -73,7 +73,10 @@ END STRING FLD_TABURE_S6_COMUNI_DENCOM 50 BEGIN PROMPT 3 9 "Nome " - FLAGS "D" + USE LF_COMUNI KEY 2 + INPUT DENCOM FLD_TABURE_S6_COMUNI_DENCOM +#include + COPY OUTPUT FLD_TABURE_S6 END STRING FLD_TABURE_S6_COMUNI_PROVCOM 2 diff --git a/ba/lf0005.txt b/ba/lf0005.txt index 2fb7a0471..b7ad6e43e 100755 --- a/ba/lf0005.txt +++ b/ba/lf0005.txt @@ -9,7 +9,7 @@ Fields=B3,1|B4,1|B5,1|B6,1|B7,1|B8,1|B9,1|FPC,1 [Data] ESC|%yr%|||||||||||||||||||||||||||||||||||||||||01-01-%yr%|31-12-%yr%|||||||||||||| -REG|%yr%VEN|REGISTRO DELLE VENDITE|||||||2|%att%|M|1|||1||||1||||||||||||||||||||||||||||||||||X|X||| -REG|%yr%ACQ|REGISTRO DEGLI ACQUISTI|||||||1|%att%|M|2|||1||||1|||||||||||||||||||||||||||||||||||||| +REG|%yr%VEN|REGISTRO DELLE VENDITE|||||||1|%att%|M|1|||1||||1||||||||||||||||||||||||||||||||||X|X||| +REG|%yr%ACQ|REGISTRO DEGLI ACQUISTI|||||||2|%att%|M|2|||1||||1|||||||||||||||||||||||||||||||||||||| REG|%yr%GIO|LIBRO GIORNALE|||||||5|%att%|M|5|||1|1|||1|||||||||||||||||||||||||||||||||||||| REG|%yr%COR|REGISTRO DEI CORRISPETTIVI|||||||3|%att%|M|1|||1||||1||||||||||||||||||||||||||||X|||||||||| diff --git a/ba/lfiva.txt b/ba/lfiva.txt index 48454e564..51d955f18 100755 --- a/ba/lfiva.txt +++ b/ba/lfiva.txt @@ -33,7 +33,7 @@ IVA|NI08|NI ART 3 c 4 lett e|NI||||||3|4|||||||||||||||||||||||||||||||||||||X|X IVA|NI09|NI ART 4 ult c. 2 P|NI||||||3|4|||||||||||||||||||||||||||||||||||||X|X||||||||| IVA|NI10|NI ART 8 c 1 lett a|NI||1||||3|4|||||||||||||||||||||||||||||||||||||X|X||X||||||| IVA|NI11|NI ART 8 c 1 lett b|NI||1||||3|4|||||||||||||||||||||||||||||||||||||X|X||||||||| -IVA|NI12|NI ART 8is c 1|NI||2||||3|4|||||||||||||||||||||||||||||||||||||X|X||||||||| +IVA|NI12|NI ART 8Bis c 1|NI||2||||3|4|||||||||||||||||||||||||||||||||||||X|X||||||||| IVA|NI13|NI ART 9 c 1|NI||3||||3|4|||||||||||||||||||||||||||||||||||||X|X||X||||||| IVA|NI14|NI ART 8 c 2|NI||1||||3|4|||||||||||||||||||||||||||||||||||||X|X||X||||||| IVA|NI15|NI ART 8bis c 2|NI||2||||3|4|||||||||||||||||||||||||||||||||||||X|X||X||||||| diff --git a/cg/CGP3.URL b/cg/CGP3.URL index 356ae4964..d5ad6b499 100755 --- a/cg/CGP3.URL +++ b/cg/CGP3.URL @@ -1,71 +1,4 @@ #include -/* ---------------------------------------------------- - * cg3 -0 - * ---------------------------------------------------- */ MENU TASK_MENUBAR SUBMENU MENU_FILE "~File" - -/* ---------------------------------------------------- - * cg3 -1 - * ---------------------------------------------------- */ -MENUBAR MENU_BAR(1) - -MENU MENU_BAR(1) - SUBMENU MENU_FILE "~File" - - -/* ---------------------------------------------------- - * cg3 -2 - * ---------------------------------------------------- */ - -MENUBAR MENU_BAR(2) - -MENU MENU_BAR(2) - SUBMENU MENU_FILE "~File" - ITEM BAR_ITEM(1) "~Scelta parametri" - ITEM BAR_ITEM(2) "~Ricalcolo" - ITEM BAR_ITEM(3) "~Disco" - -/* ---------------------------------------------------- - * cg3 -3 - * - * cg3400.cpp Stampa libro giornale - * ----------------------------------------------------*/ - -MENUBAR MENU_BAR(3) - -MENU MENU_BAR(3) - SUBMENU MENU_FILE "~File" - -/* ---------------------------------------------------- - * cg3 -4 - * ---------------------------------------------------- */ -MENUBAR MENU_BAR(4) - -MENU MENU_BAR(4) - SUBMENU MENU_FILE "~File" - -/* ---------------------------------------------------- - * cg3 -5 - * - * cg3600.cpp Mastrini a video - * ---------------------------------------------------- */ -MENUBAR MENU_BAR(5) - -MENU MENU_BAR(5) - SUBMENU MENU_FILE "~File" - SUBMENU M_FONT "~Opzioni" - -MENU M_FONT - ITEM MENU_ITEM(1) "~Colori righe" - -/* ---------------------------------------------------- - * cg3 -6 - * ---------------------------------------------------- */ -MENUBAR MENU_BAR(6) - -MENU MENU_BAR(6) - SUBMENU MENU_FILE "~File" - - diff --git a/cg/cg0100.h b/cg/cg0100.h index 9b41fb20e..98e1a9dfc 100755 --- a/cg/cg0100.h +++ b/cg/cg0100.h @@ -19,11 +19,11 @@ #define FLD_CM1_INDBIL 110 #define FLD_CM1_TMCF 111 #define FLD_CM1_TIPOSPRIC 112 -#define FLD_CM1_DTIPOSPRIC 117 #define FLD_CM1_SEZIVDOPP 113 #define FLD_CM1_LETTIVDOPP 114 #define FLD_CM1_NUMRIVDOPP 115 #define FLD_CM1_NUMIVDOPP 116 +#define FLD_CM1_DTIPOSPRIC 117 #define FLD_CM1_SEZIVDH 119 #define FLD_CM1_LETTIVDH 120 #define FLD_CM1_NUMRIVDH 121 @@ -31,6 +31,8 @@ #define FLD_CM1_RICSER 123 #define FLD_CM1_DESCRANALISI 124 #define FLD_CM1_IVACOMP 125 +#define FLD_CM1_DESCIVD 126 +#define FLD_CM1_DESCIVDOPP 127 #define FLD_CM2_STSOTTBIL 200 #define FLD_CM2_STSOTTAB 201 diff --git a/cg/cg0100a.uml b/cg/cg0100a.uml index 5b69ac005..9f5ecb1ad 100755 --- a/cg/cg0100a.uml +++ b/cg/cg0100a.uml @@ -32,7 +32,7 @@ END STRING FLD_CM1_DESCG 50 BEGIN - PROMPT 23 1 "" + PROMPT 24 1 "" FLAGS "D" END @@ -59,7 +59,7 @@ END STRING FLD_CM1_DESCC 50 BEGIN - PROMPT 23 2 "" + PROMPT 24 2 "" FLAGS "D" END @@ -97,7 +97,7 @@ END STRING FLD_CM1_DESC 50 BEGIN - PROMPT 23 3 "" + PROMPT 24 3 "" FIELD LF_PCON->DESCR KEY 2 USE LF_PCON KEY 2 @@ -176,7 +176,7 @@ END STRING FLD_CM1_LETTIVD 1 1 BEGIN - PROMPT 56 7 "" + PROMPT 57 7 "" HELP "Codice del conto secondo la IV direttiva CEE" FIELD LF_PCON->LETTIVD GROUP 1 5 @@ -185,14 +185,14 @@ END STRING FLD_CM1_LETTIVDH 1 BEGIN - PROMPT 56 7 "" + PROMPT 57 7 "" FLAGS "HDU" GROUP 1 5 END NUMBER FLD_CM1_NUMRIVD 8 4 BEGIN - PROMPT 60 7 "" + PROMPT 61 7 "" HELP "Codice del conto secondo la IV direttiva CEE" FIELD LF_PCON->NUMRIVD GROUP 1 5 @@ -201,15 +201,14 @@ END NUMBER FLD_CM1_NUMRIVDH 8 4 BEGIN - PROMPT 60 7 "" + PROMPT 61 7 "" FLAGS "HDMZ" GROUP 1 5 END NUMBER FLD_CM1_NUMIVD 2 BEGIN - PROMPT 71 7 "" - HELP "Codice del conto secondo la IV direttiva CEE" + PROMPT 72 7 "" FIELD LF_PCON->NUMIVD FLAGS "Z" GROUP 1 5 @@ -227,20 +226,36 @@ BEGIN OUTPUT FLD_CM1_LETTIVD CODTAB[2,2] OUTPUT FLD_CM1_NUMRIVD CODTAB[3,6] OUTPUT FLD_CM1_NUMIVD CODTAB[7,8] + OUTPUT FLD_CM1_DESCIVD S0 CHECKTYPE NORMAL WARNING "Codice non presente" END NUMBER FLD_CM1_NUMIVDH 2 BEGIN - PROMPT 71 7 "" + PROMPT 72 7 "" FLAGS "HDZ" GROUP 1 5 END +STRING FLD_CM1_DESCIVD 70 50 +BEGIN + PROMPT 24 8 "" + GROUP 1 5 + USE %IVD KEY 2 + INPUT S0 FLD_CM1_DESCIVD + DISPLAY "Descrizione@50" S0 + DISPLAY "Sezione" CODTAB[1,1] + DISPLAY "Lettera" CODTAB[2,2] + DISPLAY "Classe @M" CODTAB[3,6] + DISPLAY "Numero" CODTAB[7,8] + COPY OUTPUT FLD_CM1_NUMIVD + CHECKTYPE NORMAL +END + LIST FLD_CM1_SEZIVDOPP 1 22 BEGIN - PROMPT 1 8 "Classe segno opposto " + PROMPT 1 9 "Classe segno opposto " FIELD LF_PCON->SEZIVDOPP GROUP 1 2 4 6 ITEM "0|0. Nessuna" MESSAGE CLEAR,7@ @@ -255,7 +270,7 @@ END STRING FLD_CM1_LETTIVDOPP 1 BEGIN - PROMPT 56 8 "" + PROMPT 57 9 "" HELP "Codice del conto di sezione opposta secondo la IV direttiva CEE" FIELD LF_PCON->LETTIVDOPP FLAGS "U" @@ -264,7 +279,7 @@ END NUMBER FLD_CM1_NUMRIVDOPP 8 4 BEGIN - PROMPT 60 8 "" + PROMPT 61 9 "" HELP "Codice del conto di sezione opposta secondo la IV direttiva CEE" FIELD LF_PCON->NUMRIVDOPP FLAGS "MZ" @@ -273,7 +288,7 @@ END NUMBER FLD_CM1_NUMIVDOPP 2 BEGIN - PROMPT 71 8 "" + PROMPT 72 9 "" HELP "Codice del conto di sezione opposta secondo la IV direttiva CEE" FIELD LF_PCON->NUMIVDOPP FLAGS "RZ" @@ -288,13 +303,29 @@ BEGIN OUTPUT FLD_CM1_LETTIVDOPP CODTAB[2,2] OUTPUT FLD_CM1_NUMRIVDOPP CODTAB[3,6] OUTPUT FLD_CM1_NUMIVDOPP CODTAB[7,8] + OUTPUT FLD_CM1_DESCIVDOPP S0 CHECKTYPE NORMAL WARNING "Codice non presente" END -LIST FLD_CM1_TIPOSPRIC 1 49 +STRING FLD_CM1_DESCIVDOPP 70 50 BEGIN - PROMPT 1 9 "Tipo Spesa/Ricavo " + PROMPT 24 10 "" + GROUP 1 2 4 7 + USE %IVD KEY 2 + INPUT S0 FLD_CM1_DESCIVDOPP + DISPLAY "Descrizione@50" S0 + DISPLAY "Sezione" CODTAB[1,1] + DISPLAY "Lettera" CODTAB[2,2] + DISPLAY "Classe @M" CODTAB[3,6] + DISPLAY "Numero" CODTAB[7,8] + COPY OUTPUT FLD_CM1_NUMIVDOPP + CHECKTYPE NORMAL +END + +LIST FLD_CM1_TIPOSPRIC 1 50 +BEGIN + PROMPT 1 11 "Tipo Spesa/Ricavo " FIELD LF_PCON->TIPOSPRIC GROUP 1 2 HELP "Specificare il tipo do conto" @@ -310,7 +341,7 @@ END LIST FLD_CM1_RICSER 1 18 BEGIN - PROMPT 1 10 "Ricavi per servizi " + PROMPT 1 12 "Ricavi per servizi " FIELD RICSER FLAGS "H" ITEM "0|Altre attivita'" @@ -319,7 +350,7 @@ END STRING FLD_CM1_IVACOMP 4 BEGIN - PROMPT 1 11 "Cod. IVA compensazione " + PROMPT 1 13 "Cod. IVA compensazione " FIELD IVACOMP GROUP 1 2 USE %IVA @@ -338,7 +369,7 @@ END LIST FLD_CM1_TMCF 1 13 BEGIN - PROMPT 1 11 "Tipo sottoconti " + PROMPT 1 13 "Tipo sottoconti " FIELD LF_PCON->TMCF GROUP 1 3 HELP "Tipo dei sottoconti (Normale o clienti/fornitori)" @@ -349,7 +380,7 @@ END LIST FLD_CM2_SEZSALDI 1 10 BEGIN - PROMPT 1 12 "Controllo saldo primanota " + PROMPT 1 14 "Controllo saldo primanota " HELP "Tipo di controllo del saldo in prima nota" FIELD LF_PCON->SEZSALDI GROUP 1 @@ -360,7 +391,7 @@ END BOOLEAN FLD_CM2_STSOTTBIL BEGIN - PROMPT 1 14 "Non stampare dett.sottoc. su bilanci a sezioni" + PROMPT 1 16 "Non stampare dett.sottoc. su bilanci a sezioni" HELP "Indicare se stampare il dettaglio dei sottoconti nei bilanci a sezioni contrapposte" FIELD LF_PCON->STSOTTBIL GROUP 1 3 @@ -368,7 +399,7 @@ END BOOLEAN FLD_CM2_COMPENS BEGIN - PROMPT 56 14 "Compensazione saldi" + PROMPT 56 16 "Compensazione saldi" HELP "Indicare se e' ammessa la compensazione dei saldi" FIELD LF_PCON->COMPENS GROUP 1 3 @@ -376,7 +407,7 @@ END BOOLEAN FLD_CM2_STSOTTAB BEGIN - PROMPT 1 15 "Stampa dettaglio sottoconti su analisi" + PROMPT 1 17 "Stampa dettaglio sottoconti su analisi" HELP "Indicare se stampare il dettaglio dei sottoconti nell'analisi di bilancio" FIELD LF_PCON->STSOTTAB // FLAGS "H" @@ -386,7 +417,7 @@ END BOOLEAN FLD_CM2_STSOTTABS BEGIN - PROMPT 1 15 "Stampa dettaglio movimenti su analisi " + PROMPT 1 17 "Stampa dettaglio movimenti su analisi " FIELD LF_PCON->STSOTTAB // FLAGS "H" GROUP 1 2 @@ -395,7 +426,7 @@ END BOOLEAN FLD_CM2_SOSPESO BEGIN - PROMPT 56 15 "Conto sospeso" + PROMPT 56 17 "Conto sospeso" HELP "Indicare se sospendere il conto in prima nota" FIELD LF_PCON->SOSPESO GROUP 1 2 diff --git a/cg/cg0200.h b/cg/cg0200.h index 4e7d9a4ac..a7ee91d68 100755 --- a/cg/cg0200.h +++ b/cg/cg0200.h @@ -144,6 +144,9 @@ #define F_ADDCONAI 241 #define F_CONAIASS 242 #define F_REFERENTE 243 +#define F_DESBANPR 244 +#define F_TIPODOCFAT 245 +#define F_CODCAUS 246 #define DLG_RIC 300 #define DLG_CST 301 diff --git a/cg/cg0200a.uml b/cg/cg0200a.uml index db190416b..0bfd4f2e1 100755 --- a/cg/cg0200a.uml +++ b/cg/cg0200a.uml @@ -920,7 +920,6 @@ BEGIN INPUT CODTAB F_CODABIPR COPY DISPLAY F_CODABI OUTPUT F_CODABIPR CODTAB[1,5] -// OUTPUT F_CODBANPR CODTAB[6,10] HELP "Codice ABI della banca presentazione effetti" CHECKTYPE NORMAL END @@ -933,56 +932,66 @@ BEGIN COPY USE F_CODBAN INPUT CODTAB[1,5] F_CODABIPR INPUT CODTAB[6,10] F_CODBANPR - COPY DISPLAY F_CODABI + COPY DISPLAY F_CODBAN OUTPUT F_CODABIPR CODTAB[1,5] OUTPUT F_CODBANPR CODTAB[6,10] + OUTPUT F_DESBANPR S0 HELP "Codice CAB della banca presentazione effetti" CHECKTYPE NORMAL END +STRING F_DESBANPR 50 47 +BEGIN + PROMPT 2 5 "Denominazione " + COPY USE F_DESBAN + INPUT S0 F_DESBANPR + COPY DISPLAY F_DESBAN + COPY OUTPUT F_CODBANPR +END + NUMBER F_IMPMINEFF 10 BEGIN - PROMPT 2 5 "Importo minimo effetti " + PROMPT 2 6 "Importo minimo effetti " PICTURE "." FIELD LF_CFVEN->IMPMINEFF END BOOLEAN F_EMEFFRICH BEGIN - PROMPT 43 5 "Emissione effetti" + PROMPT 43 6 "Emissione effetti" FIELD LF_CFVEN->EMEFFRICH END BOOLEAN F_RAGGEFF BEGIN - PROMPT 43 6 "Raggruppamento effetti" + PROMPT 43 7 "Raggruppamento effetti" FIELD LF_CFVEN->RAGGEFF END NUMBER F_NUMESC 5 BEGIN - PROMPT 2 7 "Ultimo Nr. estratto conto " + PROMPT 2 8 "Ultimo Nr. estratto conto " FIELD LF_CFVEN->NUMESC GROUP 9 END NUMBER F_MAXSOLL 2 BEGIN - PROMPT 43 7 "Numero max solleciti " + PROMPT 43 8 "Numero max solleciti " FIELD LF_CFVEN->MAXSOLL GROUP 7 9 END DATE F_DATAESC BEGIN - PROMPT 2 8 "Data ultimo estratto conto " + PROMPT 2 9 "Data ultimo estratto conto " FIELD LF_CFVEN->DATAESC GROUP 9 END DATE F_DATASOLL BEGIN - PROMPT 43 8 "Data ultimo sollecito " + PROMPT 43 9 "Data ultimo sollecito " FIELD LF_CFVEN->DATASOLL GROUP 7 9 END @@ -990,7 +999,7 @@ END /* Campo non ancora utilizzato STRING F_PROFSOLL 5 BEGIN - PROMPT 45 9 "Codice profilo " + PROMPT 45 10 "Codice profilo " FIELD LF_CFVEN->PROFSOLL GROUP 7 END @@ -998,12 +1007,12 @@ END TEXT DLG_NULL BEGIN - PROMPT 1 9 "@bPeriodi di non accettazione effetti" + PROMPT 1 10 "@bPeriodi di non accettazione effetti" END SPREADSHEET F_NONACCEFF 76 BEGIN - PROMPT 1 10 "Periodi effetti" + PROMPT 1 11 "Periodi effetti" ITEM "Dal\nGiorno@8" ITEM "Dal\nMese" ITEM "Al\nGiorno@8" @@ -1075,7 +1084,7 @@ NUMBER F_CODINDDOC 3 BEGIN PROMPT 2 -3 "Codice indirizzo documento " FIELD LF_CFVEN->CODINDDOC - GROUP 7 +// GROUP 7 SHEET "Codice|Ragione sociale@50|Indirizzo@35|Nr.@10|Localita@35" ITEM " |**Nessuno**| | | " INPUT F_CODINDDOC @@ -1086,7 +1095,7 @@ NUMBER F_CODINDSP 3 BEGIN PROMPT 2 -2 "Codice indirizzo spedizione " FIELD LF_CFVEN->CODINDSP - GROUP 7 +// GROUP 7 SHEET "Codice|Ragione sociale@50|Indirizzo@35|Nr.@10|Localita@35" INPUT F_CODINDSP OUTPUT F_CODINDSP @@ -1097,7 +1106,7 @@ NUMBER F_CODINDEFF 3 BEGIN PROMPT 2 -1 "Codice indirizzo effetti " FIELD LF_CFVEN->CODINDEFF - GROUP 7 +// GROUP 7 SHEET "Codice|Ragione sociale@50|Indirizzo@35|Nr.@10|Localita@35" INPUT F_CODINDEFF OUTPUT F_CODINDEFF @@ -1393,7 +1402,7 @@ BEGIN CHECKTYPE NORMAL END - GROUPBOX DLG_NULL 20 5 +GROUPBOX DLG_NULL 20 5 BEGIN PROMPT 1 5 "Vettori" END @@ -1485,7 +1494,7 @@ END STRING F_ASSFIS 4 BEGIN - PROMPT 2 11 "Codice Assoggettamento fiscale " + PROMPT 2 10 "Codice Assoggettamento fiscale " FIELD LF_CFVEN->ASSFIS HELP "Codice d'assoggettamento fiscale" USE %IVA @@ -1503,12 +1512,39 @@ END BOOLEAN F_FATTSOSP BEGIN - PROMPT 51 11 "Fatture in sospensione" + PROMPT 51 10 "Fatture in sospensione" FIELD LF_CFVEN->FATTSOSP HELP "Indicase se si tartta di fatture in sospensione d'imposta" END - GROUPBOX DLG_NULL 76 4 +STRING F_TIPODOCFAT 4 +BEGIN + PROMPT 2 11 "Tipo " + FIELD LF_CFVEN->TIPODOCFAT + HELP "Codice tipo documento" + USE %TIP + INPUT CODTAB F_TIPODOCFAT + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_TIPODOCFAT CODTAB + CHECKTYPE NORMAL + FLAG "UP" +END + +STRING F_CODCAUS 3 +BEGIN + PROMPT 51 11 "Causale contabile " + FIELD LF_CFVEN->CODCAUS + USE LF_CAUSALI + INPUT CODCAUS F_CODCAUS + DISPLAY "Codice" CODCAUS + DISPLAY "Descrizione@50" DESCR + OUTPUT F_CODCAUS CODCAUS + CHECKTYPE NORMAL + FLAG "U" +END + +GROUPBOX DLG_NULL 76 4 BEGIN PROMPT 1 13 "Dati lettera esenzione" END diff --git a/cg/cg1200.cpp b/cg/cg1200.cpp index b01241b8e..fb346fe1c 100755 --- a/cg/cg1200.cpp +++ b/cg/cg1200.cpp @@ -644,7 +644,7 @@ void TPrintclifo_app::set_elenco() set_row(3,"@9g#t@90g#t@115g#t", &_telefono, &_fax, &_telex); set_row(4,"@9g#t", &_email); set_row(5,"@9g#t@45g#t@56g#t@69g#t",&_comnasc, &_datanas, &_piva,&_cofi); - set_row(6,"@9g@3n @3n @6n #t@56g@n #t@90g#t",FLD(LF_CLIFO,CLI_GRUPPORIC), + set_row(6,"@9g@3n @3n @6n #t@56g@t #t@90g#t",FLD(LF_CLIFO,CLI_GRUPPORIC), FLD(LF_CLIFO,CLI_CONTORIC), FLD(LF_CLIFO, CLI_SOTTOCRIC),&_d_c_ric, FLD(LF_CLIFO, CLI_CODALLEG), &_d_alleg, &_cpercip); diff --git a/cg/cg1200a.uml b/cg/cg1200a.uml index 255beeea4..851e33ad2 100755 --- a/cg/cg1200a.uml +++ b/cg/cg1200a.uml @@ -214,31 +214,31 @@ BEGIN PROMPT 2 16 "Stampa" END -BUTTON BUT_CG12_ELENCO 9 2 +BUTTON BUT_CG12_ELENCO 10 2 BEGIN PROMPT 4 17 "~Elenco" MESSAGE EXIT,BUT_CG12_ELENCO END -BUTTON BUT_CG12_RUBRICHE 9 2 +BUTTON BUT_CG12_RUBRICHE 10 2 BEGIN PROMPT 16 17 "~Rubriche" MESSAGE EXIT,BUT_CG12_RUBRICHE END -BUTTON BUT_CG12_ETICHETTE 9 2 +BUTTON BUT_CG12_ETICHETTE 10 2 BEGIN PROMPT 28 17 "E~tichette" MESSAGE EXIT,BUT_CG12_ETICHETTE END -BUTTON BUT_CG12_VENDITE 9 2 +BUTTON BUT_CG12_VENDITE 10 2 BEGIN PROMPT 40 17 "~Vendite" MESSAGE EXIT,BUT_CG12_VENDITE END -BUTTON DLG_QUIT 9 2 +BUTTON DLG_QUIT 10 2 BEGIN PROMPT 55 17 "" END diff --git a/cg/cg1200b.uml b/cg/cg1200b.uml index 9758632d3..28607e1f7 100755 --- a/cg/cg1200b.uml +++ b/cg/cg1200b.uml @@ -29,17 +29,17 @@ BEGIN HELP "Numero totale di colonne per etichetta (larghezza)" END -BUTTON DLG_OK 9 2 +BUTTON DLG_OK 10 2 BEGIN - PROMPT -13 -1 "Conferma" + PROMPT -13 -1 "" END -BUTTON BUT_CGB_RESET 9 2 +BUTTON BUT_CGB_RESET 10 2 BEGIN PROMPT -23 -1 "~Reset" END -BUTTON DLG_CANCEL 9 2 +BUTTON DLG_CANCEL 10 2 BEGIN PROMPT -33 -1 "Annulla" END diff --git a/cg/cg1300e.uml b/cg/cg1300e.uml index 4ed0b2fcd..b2c1b8a91 100755 --- a/cg/cg1300e.uml +++ b/cg/cg1300e.uml @@ -4,7 +4,7 @@ PAGE "Impostazione mese liquidazione" -1 -1 78 10 GROUPBOX DLG_NULL 77 4 BEGIN - PROMPT 1 1 "Registro" + PROMPT 1 1 "@bRegistro" END NUMBER F_ANNO 4 diff --git a/cg/cg1500.cpp b/cg/cg1500.cpp index b9a760475..8624ba0e1 100755 --- a/cg/cg1500.cpp +++ b/cg/cg1500.cpp @@ -1660,7 +1660,7 @@ bool TStampa_bilanci::calcola(int g, int c, long s) real importo; int annoe; long num_reg; - TDate data_reg, data, datacomp; + TDate data_reg, data, datacomp, data_start; bool conto_mov = FALSE; TLocalisamfile rmov(LF_RMOV); TLocalisamfile mov(LF_MOV); @@ -1675,6 +1675,17 @@ bool TStampa_bilanci::calcola(int g, int c, long s) _saldo_ini_avere = ZERO; _u_max = 0l; + data_start = _dataini; + + // Calcolo progressivi precedenti: + // e non è indicato l'anno esercizio, prende il primo giorno dell'anno indicato da _datada + if (_annoes == 0) + { + data_start = _datada; + data_start.set_day(1); + data_start.set_month(1); + } + rmov.setkey(2); rmov.zero(); rmov.put(RMV_GRUPPO,g); @@ -1756,7 +1767,7 @@ bool TStampa_bilanci::calcola(int g, int c, long s) } } else if (_datada > _dataini) //calcolo i progressivi precedenti - if ( (data_reg >= _dataini) && (data_reg < _datada) ) + if ( (data_reg >= data_start) && (data_reg < _datada) ) { if (sezione == 'D') _prg_prec_dare += importo; diff --git a/cg/cg2100.cpp b/cg/cg2100.cpp index b5933287a..ddb032a45 100755 --- a/cg/cg2100.cpp +++ b/cg/cg2100.cpp @@ -187,7 +187,7 @@ bool TPrimanota_application::user_create() { open_files(LF_TABCOM, LF_TAB, LF_CAUSALI, LF_RCAUSALI, LF_CLIFO, LF_PCON, 0); open_files(LF_ATTIV, LF_SALDI, LF_COMUNI, LF_OCCAS, LF_NDITTE, 0); - open_files(LF_PARTITE, LF_SCADENZE, LF_PAGSCA, 0); + open_files(LF_PARTITE, LF_SCADENZE, LF_PAGSCA, LF_AGENTI, 0); _incasso = new TDati_incasso; @@ -484,8 +484,11 @@ void TPrimanota_application::init_mask(TMask& m) // Show/Hide campi valuta: F_VALUTAINTRA, F_CAMBIOINTRA, F_CORRLIRE, F_CORRVAL (GROUP 4) m.show(-4, causale().valintra()); - if (m.insert_mode() && causale().valintra() && !causale().intra()) - m.set(F_SOLAIVA, "X", TRUE); // Propone movimento di sola iva + if (god_mode("IntraAutoIva")) + { + if (m.insert_mode() && causale().valintra() && !causale().intra()) + m.set(F_SOLAIVA, "X", TRUE); // Propone movimento di sola iva + } m.show(F_CODIVA, m.insert_mode()); // Codice IVA standard diff --git a/cg/cg2100b.uml b/cg/cg2100b.uml index 30d196caa..4faedf301 100755 --- a/cg/cg2100b.uml +++ b/cg/cg2100b.uml @@ -160,7 +160,7 @@ BEGIN FIELD DESCR USE %DPN KEY 2 INPUT S0 F_DESCR - DISPLAY "Descrizione@50" S0 + DISPLAY "Descrizione@60" S0 DISPLAY "Codice" CODTAB COPY OUTPUT F_DESCAGG END diff --git a/cg/cg2100c.uml b/cg/cg2100c.uml index c54b5a8a1..311829057 100755 --- a/cg/cg2100c.uml +++ b/cg/cg2100c.uml @@ -196,7 +196,7 @@ BEGIN FIELD DESCR USE %DPN KEY 2 INPUT S0 F_DESCR - DISPLAY "Descrizione@50" S0 + DISPLAY "Descrizione@60" S0 DISPLAY "Codice" CODTAB COPY OUTPUT F_DESCAGG END @@ -444,13 +444,13 @@ BEGIN CHECKTYPE SEARCH END -NUMBER SK_CAMBIO 15 5 +NUMBER SK_CAMBIO 15 6 BEGIN PROMPT 44 13 "Cambio " FIELD CAMBIO FLAGS "RU" GROUP 3 - PICTURE ".5" + PICTURE ".6" CHECKTYPE REQUIRED WARNING "Inserire il cambio o eliminare il codice valuta" END @@ -547,13 +547,13 @@ BEGIN VALIDATE REQIF_FUNC 1 F_CORRVALUTA END -NUMBER F_CAMBIOINTRA 15 5 +NUMBER F_CAMBIOINTRA 15 6 BEGIN PROMPT 39 17 "Cambio intracomun. " FIELD CAMBIOI FLAGS "U" GROUP 4 - PICTURE ".5" + PICTURE ".6" END CURRENCY F_CORRLIRE 18 @@ -611,7 +611,7 @@ BEGIN FLAGS "D" END -SPREADSHEET F_SHEETIVA 0 6 +SPREADSHEET F_SHEETIVA 0 5 BEGIN PROMPT 0 4 "" ITEM "Imponibile@15" @@ -628,19 +628,19 @@ END CURRENCY F_IMPONIBILI 18 BEGIN - PROMPT 1 11 "Totale imponibili " + PROMPT 1 10 "Totale imponibili " FLAGS "D" END CURRENCY F_IMPOSTE 18 BEGIN - PROMPT 41 11 "Totale imposte " + PROMPT 41 10 "Totale imposte " FLAGS "D" END SPREADSHEET F_SHEETCG 0 -2 BEGIN - PROMPT 0 12 "" + PROMPT 0 11 "" ITEM "Dare@15F" ITEM "Avere@15F" ITEM "C/F@1" diff --git a/cg/cg2100p.uml b/cg/cg2100p.uml index 9b1aed291..b7f3b158c 100755 --- a/cg/cg2100p.uml +++ b/cg/cg2100p.uml @@ -49,12 +49,12 @@ BEGIN GROUP 3 END -NUMBER P_CAMBIO 15 5 +NUMBER P_CAMBIO 15 6 BEGIN PROMPT 43 2 "Cambio " FLAGS "DU" GROUP 3 - PICTURE ".5" + PICTURE ".6" FIELD ANTIOUTPUT CHECKTYPE REQUIRED END @@ -115,7 +115,7 @@ BEGIN ITEM "Data doc.@10" ITEM "Data scad." ITEM "Descrizione@20" - ITEM "Importo Lire@16" + ITEM "Importo@16" ITEM "Importo Valuta@16" ITEM "Num. op. " ITEM "Data op.@10" @@ -237,6 +237,11 @@ BEGIN PROMPT 1 4 "Numero doc. " END +DATE 104 +BEGIN + PROMPT 41 4 "Data scad. " +END + LIST 112 1 20 BEGIN PROMPT 1 5 "Tipo movimento " @@ -253,11 +258,6 @@ BEGIN PROMPT 41 5 "Protocollo IVA " END -DATE 104 -BEGIN - PROMPT 41 4 "Data scad. " -END - STRING 105 50 BEGIN PROMPT 1 6 "Descrizione " @@ -265,7 +265,7 @@ END STRING 106 14 BEGIN - PROMPT 1 7 "Importo Lire " + PROMPT 1 7 "Importo " FLAGS "R" END diff --git a/cg/cg2102.cpp b/cg/cg2102.cpp index 399b12518..86bd12b75 100755 --- a/cg/cg2102.cpp +++ b/cg/cg2102.cpp @@ -550,7 +550,13 @@ HIDDEN bool imptot_error(const TImporto& imptot, const TImporto& impsal, bool va { TPrimanota_application& a = app(); const TMask& m = a.curr_mask(); - TString16 codval; if (val) codval = m.get(SK_VALUTA); + const char* pic = "."; + TString16 codval; + if (val) + { + codval = m.get(SK_VALUTA); + pic = ".3"; + } TCurrency euro(imptot.valore(), codval); TString msg(255); @@ -559,14 +565,14 @@ HIDDEN bool imptot_error(const TImporto& imptot, const TImporto& impsal, bool va msg << "in valuta " << codval; else msg << "inserito"; - msg << " e' " << euro.string(TRUE) << ' ' << imptot.sezione() << ",\n"; + msg << " e' " << euro.get_num().string(pic) << ' ' << imptot.sezione() << ",\n"; euro.set_num(cassa.valore()); msg << "i pagamenti e le spese ammontano a " - << euro.string(TRUE) << ' ' << cassa.sezione() << ",\n"; + << euro.get_num().string(pic) << ' ' << cassa.sezione() << ",\n"; euro.set_num(residuo.valore()); - msg << "per cui il residuo e' " << euro.string(TRUE) << '.'; + msg << "per cui il residuo e' " << euro.string(TRUE); if (m.edit_mode() && impsal.is_zero()) { @@ -1076,7 +1082,7 @@ TSheet_field& TPrimanota_application::pags() const // Certified 100% TSheet_field& TPrimanota_application::ivas() const { - TSheet_field& s = (TSheet_field&)_msk[2]->field(F_SHEETIVA); + TSheet_field& s = _msk[2]->sfield(F_SHEETIVA); return s; } @@ -1207,7 +1213,7 @@ bool TPrimanota_application::imposta_handler(TMask_field& f, KEY key) } return TRUE; -} +} // Calcola il totale degli imponibili e delle imposte e aggiorna @@ -1604,11 +1610,12 @@ bool TPrimanota_application::sheet_clifo_handler(TMask_field& f, KEY k) const short gid = cid-1; const int conto = m.get_int(cid); const int gruppo = m.get_int(gid); - if (gruppo == 0 && conto == 0) + if ((k == K_TAB && f.focusdirty()) || (gruppo == 0 && conto == 0)) { TBill c(0, 0, codice, f.dlg() > 300 ? 'F' : 'C'); - m.set(f.dlg()+1, c.descrizione()); // Carica gruppo e conto - if (c.ok()) + c.find(); // Carica descrizione, gruppo e conto + m.set(f.dlg()+1, c.descrizione()); + if (c.ok()) { m.set(gid-1, c.tipo() == 'C' ? "C" : "F"); m.set(gid, c.gruppo()); @@ -2092,8 +2099,6 @@ bool TPrimanota_application::clifo_handler(TMask_field& f, KEY key) if (f.focusdirty() && a.is_nota_credito()) { TPartite_array& p = a.partite(); -// if (m.edit_mode()) -// p.add_numreg(m.get_long(F_NUMREG)); // Gia' fatto dalla read! const TPartita* game = p.first(); if (game != NULL && atol(f.get()) != game->conto().codclifo()) @@ -2138,11 +2143,12 @@ bool TPrimanota_application::clifo_handler(TMask_field& f, KEY key) const int alleg = clifo.get_int(CLI_ALLEG); TEdit_field& upi = m.efield(F_RIEPILOGO); upi.check_type(alleg == 3 ? CHECK_REQUIRED : CHECK_NORMAL); - - if (m.insert_mode() && m.get(F_CODPAG).empty()) + + const TString& oldpag = m.get(F_CODPAG); + if (m.is_running() /* m.insert_mode() && oldpag.empty() */) { const TString& s = clifo.get(CLI_CODPAG); - if (s.not_empty()) + if (s.not_empty() && s != oldpag) { TEdit_field& cp = m.efield(F_CODPAG); if (cp.active()) // Se il campo F_CODPAG e' attivo @@ -2221,14 +2227,14 @@ bool TPrimanota_application::IVA2bill(const TCodiceIVA& iva, TBill& bill) // Certified 99% bool TPrimanota_application::main_codiva_handler(TMask_field& f, KEY key) { - if (key == K_TAB && f.get().not_empty()) + if (key == K_TAB && !f.empty()) { if (!suspended_handler(f, key)) return FALSE; TPrimanota_application& a = app(); - const real imp(a.ivas().row(1).get(0)); // Se il totale non e' stato spezzato - if (imp.is_zero()) + const real imp(a.ivas().row(1).get(0)); + if (imp.is_zero()) // Se il totale documento non e' stato spezzato { TToken_string& row = a.ivas().row(0); @@ -2239,7 +2245,7 @@ bool TPrimanota_application::main_codiva_handler(TMask_field& f, KEY key) const bool corr = a.causale().corrispettivi(); const bool acq3 = (a.iva() == iva_acquisti) && (row.get_int(2) == 3); - real tot = a.totale_documento(); // Calcola totale documento + real tot = a.totale_documento(); // Calcola totale documento real imposta; // Calcola imposta if (!corr && !acq3) imposta = iva.scorpora(tot); @@ -2299,9 +2305,9 @@ void TPrimanota_application::gioca_cambi(int force) if (m.id2pos(SK_CONTROEURO) >= 0) m.reset(SK_CONTROEURO); - bool dummy_contro_euro; + exchange_type dummy_contro_euro; const real& fc = TCurrency::get_firm_change(dummy_contro_euro); - if (fc > ZERO && fc != 1.0) + if (fc > ZERO) new_cambio *= fc; new_cambio.round(6); diff --git a/cg/cg2104.cpp b/cg/cg2104.cpp index b302fcef0..ddeb48f2a 100755 --- a/cg/cg2104.cpp +++ b/cg/cg2104.cpp @@ -169,7 +169,7 @@ bool TPrimanota_application::pag_notify(TSheet_field& ps, int r, KEY k) TDate d(news); int scd = (int)(d - pag.data_rata(r-1)); if (pag.mese_commerciale() && (scd % 30) != 0) - scd = 30 * ((scd/30)+1); + scd = 30 * ((scd/30)+1); trw.add(scd, 0); } trs.add(news, 0); diff --git a/cg/cg2105.cpp b/cg/cg2105.cpp index 312b6cb6c..0023fbd19 100755 --- a/cg/cg2105.cpp +++ b/cg/cg2105.cpp @@ -31,6 +31,7 @@ class TGame_mask : public TMask int _riga_partite; // Riga corrente delle partite bool _changed; // Flag di modifica partite bool _valfirst; // La colonna della valuta precede le lire + bool _ignore_next_select; // Flag per ignorare la select(0) iniziale sulle partite protected: static bool annopart_handler(TMask_field& f, KEY k); @@ -74,11 +75,10 @@ protected: const TRiga_partite* cerca_prima_riga() const; void aggiorna_valuta(const TValuta& val); -// void aggiorna_sorelle(const TRiga_partite& part) const; public: - TSheet_field& partite() const { return (TSheet_field&)field(P_PARTITE); } - TSheet_field& scadenze() const { return (TSheet_field&)field(P_SCADENZE); } + TSheet_field& partite() const { return sfield(P_PARTITE); } + TSheet_field& scadenze() const { return sfield(P_SCADENZE); } const TBill& conto() const { return _conto; } const TImporto& residuo(bool val) const { return val ? _resval : _residuo; } @@ -230,7 +230,7 @@ void TPay_mask::set_pag(const TRectype& oldpag, const TRiga_scadenze& scad, const TRiga_partite& fatt = _assigned ? scad.riga() : sum; TRelation rel(LF_PAGSCA); // Working relation - rel.add(LF_PARTITE, "ANNO=ANNO|NUMPART=NUMPART"); + rel.add(LF_PARTITE, "ANNO==ANNO|NUMPART==NUMPART"); rel.curr() = oldpag; rel.curr(LF_PARTITE) = sum; autoload(rel); // Load current record on mask @@ -292,10 +292,13 @@ void TPay_mask::set_pag(const TRectype& oldpag, const TRiga_scadenze& scad, res_rat.normalize(sez_fat); _da_pagare = res_rat.valore(); // Calcola residuo in valuta - TReal_field& res = (TReal_field&)field(S_RESIDUORATA); - res.set_decimals(in_valuta ? 3 : 0); + TEdit_field& resrat = efield(S_RESIDUORATA); + resrat.reset_driver(); + if (in_valuta) + resrat.add_driver(S_CODVAL); + if (get(S_SALDOACC)[0] != 'S') - res.set(_da_pagare.string()); + resrat.set(_da_pagare.string()); } else { @@ -315,9 +318,11 @@ void TPay_mask::set_pag(const TRectype& oldpag, const TRiga_scadenze& scad, #ifndef __EXTRA__ _pagabile = _parent->residuo(in_valuta).valore(); - TReal_field& resp = (TReal_field&)field(S_RESIDUOPAG); - resp.set_decimals(in_valuta ? 3 : 0); - resp.set(_pagabile.string()); + TEdit_field& respag = efield(S_RESIDUOPAG); + respag.reset_driver(); + if (in_valuta) + respag.add_driver(S_CODVAL); + respag.set(_pagabile.string()); _pagabile += oldimp; #endif @@ -572,6 +577,7 @@ void TNew_mask::init(char tipocf, bool fatt, bool edit) tipomov.set(_allow_fatt ? "1" : "3"); if (!_allow_fatt) set_caption("Nuovo pagamento"); + reset(P_NUMERO); #else tipomov.disable(); #endif @@ -665,7 +671,7 @@ void TGame_mask::init(const TBill& bill, long numreg, int riga) } TGame_mask::TGame_mask(const TBill& bill, long numreg, int riga) -: TMask("cg2100p"), _valfirst(FALSE) +: TMask("cg2100p"), _valfirst(FALSE), _ignore_next_select(FALSE) { init(bill, numreg, riga); } @@ -822,26 +828,6 @@ void TGame_mask::aggiorna_valuta(const TValuta& val) fill_partite(); } -/* -void TGame_mask::aggiorna_sorelle(const TRiga_partite& part) const -{ - TPartite_array& pa = app().partite(); - for (TPartita* game = pa.first(); game; game = pa.next()) - { - for (int r = game->last(); r > 0; r = game->pred(r)) - { - TRiga_partite& row = game->riga(r); - if (row.get_long(PART_NREG) == _numreg && row.get_int(PART_NUMRIG) == _numrig) - { - row.put(PART_DESCR, part.get(PART_DESCR)); - row.put(PART_DATAPAG, part.get(PART_DATAPAG)); - row.put(PART_TIPOPAG, part.get(PART_TIPOPAG)); - } - } - } -} -*/ - TToken_string& TGame_mask::add_colored_row(TSheet_field& sheet, char type) const { int r = sheet.insert(-1, FALSE, FALSE); @@ -856,10 +842,19 @@ bool TGame_mask::partite_notify(TSheet_field& partite, int r, KEY k) TGame_mask& gm = (TGame_mask&)partite.mask(); if (k == K_TAB) - { + { + if (gm._ignore_next_select) + { + gm._ignore_next_select = FALSE; + return TRUE; + } + const bool changing_row = gm._riga_partite != r; if (!changing_row) return TRUE; + + TWait_cursor hourglass; + gm._riga_partite = r; TWait_cursor hourglass; @@ -939,9 +934,11 @@ bool TGame_mask::partite_notify(TSheet_field& partite, int r, KEY k) { const TRectype& pag = scad.row(pa); const TRiga_partite& sum = game->riga(pa); - const char sez = sum.sezione(); - - TToken_string& row = gm.add_colored_row(sheet, ' '); + const char sez = sum.sezione(); + const long nreg = sum.get_long(PART_NREG); + const int nrig = sum.get_int(PART_NUMRIG); + const bool linked = nreg == gm._numreg && nrig == gm._numrig; + TToken_string& row = gm.add_colored_row(sheet, linked ? 'X' : ' '); row.add(ri); row.add(ra); row.add(sum.get(PART_DATADOC)); @@ -958,7 +955,7 @@ bool TGame_mask::partite_notify(TSheet_field& partite, int r, KEY k) gm.add_importo(row, imp); row.add(""); } - row.add(sum.get(PART_NREG)); + row.add(nreg); row.add(sum.get(PART_DATAREG)); row.add(sum.get(PART_NUMDOC)); row.add(""); @@ -1044,8 +1041,10 @@ bool TGame_mask::partite_notify(TSheet_field& partite, int r, KEY k) const TRectype& pag = unas.row(pa); const TRiga_partite& sum = game->riga(pa); const char sez = sum.sezione(); - - TToken_string& row = gm.add_colored_row(sheet, ' '); + const long nreg = sum.get_long(PART_NREG); + const int nrig = sum.get_int(PART_NUMRIG); + const bool linked = nreg == gm._numreg && nrig == gm._numrig; + TToken_string& row = gm.add_colored_row(sheet, linked ? 'X' : ' '); row.add(pag.get(PAGSCA_NRIGA)); row.add(pag.get(PAGSCA_NRATA)); row.add(sum.get(PART_DATADOC)); @@ -1066,7 +1065,7 @@ bool TGame_mask::partite_notify(TSheet_field& partite, int r, KEY k) } else row.add(""); - row.add(sum.get(PART_NREG)); + row.add(nreg); row.add(sum.get(PART_DATAREG)); row.add(sum.get(PART_NUMDOC)); row.add(""); @@ -1118,10 +1117,11 @@ bool TGame_mask::partite_notify(TSheet_field& partite, int r, KEY k) header << "valuta"; sheet.set_column_header(107, header); + sheet.force_update(); if (sheet.items() > 0) sheet.select(0, TRUE); else - sheet.force_update(); + sheet.force_update(); } if (k == K_INS) @@ -1309,7 +1309,7 @@ bool TGame_mask::edit_scadenza_handler(TMask_field& f, KEY k) const TBill& bill = gm.conto(); // Clifo TSheet_field& sp = gm.partite(); - TToken_string& spr = sp.row(sp.selected()); + TToken_string& spr = sp.row(gm._riga_partite); const int anno = spr.get_int(0); // Anno const TString numero = spr.get(); // Numero @@ -1343,21 +1343,20 @@ bool TGame_mask::edit_scadenza_handler(TMask_field& f, KEY k) #endif tipo_movimento tm; - #ifdef __EXTRA__ TMask* nm = new TNew_mask(gm.conto().tipo(), FALSE, FALSE); nm->set(P_ANNO, game.anno()); nm->set(P_NUMERO, game.numero()); const KEY k = nm->run(); + tm = (tipo_movimento)nm->get_int(P_NUOVO); + delete nm; nm = NULL; - if (k == K_ENTER) - tm = (tipo_movimento)nm->get_int(P_NUOVO); - else + if (k != K_ENTER) { - if (was == NULL) giochi.destroy(game); + if (was == NULL) + giochi.destroy(game); return FALSE; } - delete nm; #else tm = (tipo_movimento)app().causale().tipomov(); #endif @@ -1454,7 +1453,7 @@ bool TGame_mask::nuovo_handler(TMask_field& f, KEY k) static TNew_mask* new_game = NULL; if (new_game == NULL) new_game = new TNew_mask(gm.conto().tipo(), allow_fatt, TRUE); - else + else new_game->init(gm.conto().tipo(), allow_fatt, TRUE); tipo_movimento tm; @@ -1563,7 +1562,8 @@ TImporto TGame_mask::get_importo(TToken_string& s, int pos) const int TGame_mask::update_partita(const TRectype& riga, const TImporto& saldo, const TImporto& doc, - const TImporto& pag, const TImporto& imp, int prow) + const TImporto& pag, const TImporto& imp, + int prow) { TSheet_field& games = partite(); TToken_string &r = games.row(prow); // Stringa di lavoro per lo sheet @@ -1589,7 +1589,7 @@ int TGame_mask::update_partita(const TRectype& riga, } if (prow >= 0) - { + { games.force_update(prow); update_saldo_clifo(); games.force_update(games.items()-1); @@ -1614,7 +1614,9 @@ int TGame_mask::update_partita(const TPartita& part, int prow) TImporto saldo, doc, pag, imp; part.calcola_saldo(saldo, doc, pag, imp); - return update_partita(part.riga(r), saldo, doc, pag, imp, prow); + prow = update_partita(part.riga(r), saldo, doc, pag, imp, prow); + + return prow; } int TGame_mask::update_partita(const TRectype& riga, int prow) @@ -1695,9 +1697,9 @@ void TGame_mask::fill_partite() const int annorif = get_int(P_ANNO); // Anno corrente const TString numrif = get(P_NUMERO); // Partita corrente const bool all = get(P_SHOWALL).not_empty(); // Visualizza anche partite chiuse - + + partite().destroy(); TString_array& a = partite().rows_array(); - a.destroy(); TPartite_array& giochi = app().partite(); for (TPartita* gioco = giochi.first(); gioco != NULL; gioco = giochi.next()) @@ -1750,13 +1752,7 @@ void TGame_mask::fill_partite() } a.sort(); - for (int r = a.last(); r > 0; r--) - { - TToken_string& row = a.row(r); - if (annorif == row.get_int(0) && same_number(numrif, row.get(1))) - break; - } - + update_saldo_clifo(); partite().force_update(); aggiorna_residuo(); @@ -1764,7 +1760,28 @@ void TGame_mask::fill_partite() if (a.items() > 1) { _riga_partite = -1; - partite().select(r, TRUE); + + int found = -1; + for (int r = a.last(); r >= 0; r--) + { + TToken_string& row = a.row(r); + const int anno = row.get_int(0); + const TString16 numero = row.get(1); + + if (found < 0 && annorif == anno && same_number(numrif, numero)) + found = r; + + TPartita* gioco = app().partite().exist(conto(), anno, numero); + if (gioco != NULL && gioco->mov2rig(_numreg, _numrig) > 0) + { + COLOR back, fore; + app().type2colors('X', back, fore); + partite().set_back_and_fore_color(back, fore, r); + } + } + if (found < 0) found = 0; + partite().select(found, TRUE); + _ignore_next_select = !is_running(); } else { @@ -1791,7 +1808,7 @@ bool TGame_mask::edit_pagamento(TPartita& p, int nriga, int nrata, int nrigp) co else pm->init(this, nuovo ? MODE_INS : MODE_MOD); TPay_mask& m = *pm; - + if (nriga == TPartita::UNASSIGNED) { TRiga_scadenze& scaden = somma.new_row(); // Crea una rata falsa @@ -1810,7 +1827,7 @@ bool TGame_mask::edit_pagamento(TPartita& p, int nriga, int nrata, int nrigp) co imp.set_dirty(); imp.on_key(K_F8); } - + KEY key = m.run(); if (key == K_DEL) @@ -1849,7 +1866,8 @@ bool TGame_mask::edit_pagamento(TPartita& p, int nriga, int nrata, int nrigp) co #endif } -// delete pm; // commentata in quanto statica +// delete pm; pm = NULL; // commentata in quanto statica + #ifdef __EXTRA__ xvt_statbar_set("Estratto conto", TRUE); #endif diff --git a/cg/cg2106.cpp b/cg/cg2106.cpp index adaaa6625..15fbbbc89 100755 --- a/cg/cg2106.cpp +++ b/cg/cg2106.cpp @@ -145,7 +145,7 @@ TColor_mask::TColor_mask() TVariable_sheet_field& s = (TVariable_sheet_field&)fld(0); s.set_getmask(get_mask); - const char* const tipi = "TFSIDNAPRCGLK"; + const char* const tipi = "TFSIDNAPRCGLKX"; const char* const desc[] = { "Tot. doc./sdo partite", @@ -161,6 +161,7 @@ TColor_mask::TColor_mask() "Spese", "Contropartita spese", "Riga Cliente/Fornitore", + "Riga Collegata", }; TPrimanota_application& a = app(); @@ -237,7 +238,10 @@ COLOR TPrimanota_application::type2color(char tipor, char tipoc) if (colstr == NULL) { colstr = new TString(8); - colstr->format("%ld", tipoc == 'B' ? NORMAL_BACK_COLOR : NORMAL_COLOR); + if (tipor == 'X') + colstr->format("%ld", tipoc == 'B' ? FOCUS_BACK_COLOR : FOCUS_COLOR); + else + colstr->format("%ld", tipoc == 'B' ? NORMAL_BACK_COLOR : NORMAL_COLOR); _colori.add(key, colstr); } col = atol(*colstr); diff --git a/cg/cg21cg.uml b/cg/cg21cg.uml index bb6ee096d..433ad593d 100755 --- a/cg/cg21cg.uml +++ b/cg/cg21cg.uml @@ -24,7 +24,7 @@ BEGIN USE %DPN KEY 2 INPUT S0 109 DISPLAY "Descrizione@50" S0 - DISPLAY "Codice" CODTAB + DISPLAY "Codice@10" CODTAB COPY OUTPUT 108 FIELD DESCR END diff --git a/cg/cg21rata.uml b/cg/cg21rata.uml index 3b18d93b9..0830f5a74 100755 --- a/cg/cg21rata.uml +++ b/cg/cg21rata.uml @@ -7,6 +7,13 @@ BEGIN WARNING "La data di scadenza e' obbligatoria" END +NUMBER 104 6 2 +BEGIN + PROMPT 1 2 "Percentuale " + PICTURE ".2" + FLAGS "U" +END + CURRENCY 102 18 BEGIN PROMPT 1 3 "Importo " @@ -23,13 +30,6 @@ BEGIN DRIVENBY -FS_VALUTA END -NUMBER 104 6 2 -BEGIN - PROMPT 1 2 "Percentuale " - PICTURE ".2" - FLAGS "U" -END - NUMBER 105 1 BEGIN PROMPT 1 5 "Tipo pagamento " @@ -71,6 +71,19 @@ NUMBER 108 5 BEGIN PROMPT 1 7 "Ns. Banca ABI " FLAGS "Z" + USE %BAN SELECT CODTAB?="?????" + INPUT CODTAB[1,5] 108 + INPUT CODTAB[6,10] 109 + DISPLAY "ABI@5" CODTAB[1,5] + DISPLAY "Denominazione@50" S0 + OUTPUT 108 CODTAB[1,5] + CHECKTYPE NORMAL +END + +NUMBER 109 5 +BEGIN + PROMPT 27 7 "Ns. Banca CAB " + FLAGS "Z" USE %BAN INPUT CODTAB[1,5] 108 INPUT CODTAB[6,10] 109 @@ -83,14 +96,6 @@ BEGIN CHECKTYPE NORMAL END -NUMBER 109 5 -BEGIN - PROMPT 27 7 "Ns. Banca CAB " - FLAGS "Z" - COPY ALL 108 - CHECKTYPE NORMAL -END - STRING 126 50 45 BEGIN PROMPT 1 8 "" @@ -99,7 +104,7 @@ BEGIN DISPLAY "Denominazione@50" S0 DISPLAY "ABI@5" CODTAB[1,5] DISPLAY "CAB@5" CODTAB[6,10] - COPY OUTPUT 108 + COPY OUTPUT 109 CHECKTYPE NORMAL END @@ -109,11 +114,8 @@ BEGIN FLAGS "Z" COPY USE 108 INPUT CODTAB[1,5] 110 - INPUT CODTAB[6,10] 111 COPY DISPLAY 108 OUTPUT 110 CODTAB[1,5] - OUTPUT 111 CODTAB[6,10] - OUTPUT 128 S0 CHECKTYPE NORMAL END @@ -121,17 +123,23 @@ NUMBER 111 5 BEGIN PROMPT 27 9 "Vs. Banca CAB " FLAGS "Z" - COPY ALL 110 + COPY USE 109 + INPUT CODTAB[1,5] 110 + INPUT CODTAB[6,10] 111 + COPY DISPLAY 109 + OUTPUT 110 CODTAB[1,5] + OUTPUT 111 CODTAB[6,10] + OUTPUT 128 S0 CHECKTYPE NORMAL END STRING 128 50 45 BEGIN PROMPT 1 10 "" - COPY USE 110 + COPY USE 126 INPUT S0 128 COPY DISPLAY 126 - COPY OUTPUT 110 + COPY OUTPUT 111 CHECKTYPE NORMAL END diff --git a/cg/cg21sld.uml b/cg/cg21sld.uml index ab58216ac..f9ce36a27 100755 --- a/cg/cg21sld.uml +++ b/cg/cg21sld.uml @@ -105,11 +105,11 @@ BEGIN GROUP 3 END -NUMBER FS_CAMBIO 15 5 +NUMBER FS_CAMBIO 15 6 BEGIN PROMPT 62 7 "" FLAGS "DU" - PICTURE ".5" + PICTURE ".6" VALIDATE REQIF_FUNC 1 FS_VALUTA WARNING "E' stata specificata una valuta ma non il cambio relativo" GROUP 3 @@ -119,6 +119,18 @@ NUMBER FS_NSABI 5 BEGIN PROMPT 2 8 "Ns. Banca ABI " FLAGS "Z" + USE %BAN SELECT CODTAB?="?????" + INPUT CODTAB[1,5] FS_NSABI + DISPLAY "ABI@5" CODTAB[1,5] + DISPLAY "Denominazione@50" S0 + OUTPUT FS_NSABI CODTAB[1,5] + CHECKTYPE NORMAL +END + +NUMBER FS_NSCAB 5 +BEGIN + PROMPT 25 8 "CAB " + FLAGS "Z" USE %BAN INPUT CODTAB[1,5] FS_NSABI INPUT CODTAB[6,10] FS_NSCAB @@ -131,14 +143,6 @@ BEGIN CHECKTYPE NORMAL END -NUMBER FS_NSCAB 5 -BEGIN - PROMPT 25 8 "CAB " - FLAGS "Z" - COPY ALL FS_NSABI - CHECKTYPE NORMAL -END - STRING FS_DESCNSABI 50 37 BEGIN PROMPT 38 8 "" @@ -169,7 +173,13 @@ NUMBER FS_VSCAB 5 BEGIN PROMPT 25 9 "CAB " FLAGS "Z" - COPY ALL FS_VSABI + COPY USE FS_NSCAB + INPUT CODTAB[1,5] FS_VSABI + INPUT CODTAB[6,10] FS_VSCAB + COPY DISPLAY FS_NSCAB + OUTPUT FS_VSABI CODTAB[1,5] + OUTPUT FS_VSCAB CODTAB[6,10] + OUTPUT FS_DESCVSABI S0 CHECKTYPE NORMAL END @@ -179,7 +189,7 @@ BEGIN COPY USE FS_DESCNSABI INPUT S0 FS_DESCVSABI COPY DISPLAY FS_DESCNSABI - COPY OUTPUT FS_VSABI + COPY OUTPUT FS_VSCAB CHECKTYPE NORMAL END diff --git a/cg/cg2200.cpp b/cg/cg2200.cpp index 92c9ec672..94493e036 100755 --- a/cg/cg2200.cpp +++ b/cg/cg2200.cpp @@ -347,7 +347,8 @@ bool TProvvisori_app::menu(MENU_TAG) cur.set_filterfunction(filter); const TRecnotype total = cur.items(); - + + TString action(key == K_ENTER ? "conferma" : "cancellazione"); action << " di "; add_plural(action, total, "movimento"); @@ -361,7 +362,7 @@ bool TProvvisori_app::menu(MENU_TAG) } else { - warning_box(caption); + warning_box("Nessun movimento nella selezione effettuata"); continue; } diff --git a/cg/cg3200.cpp b/cg/cg3200.cpp index c51e43dff..6d1257dc2 100755 --- a/cg/cg3200.cpp +++ b/cg/cg3200.cpp @@ -470,7 +470,7 @@ bool TMastrini_application::gruppo_hnd (TMask_field& f, KEY k) bool TMastrini_application::contoi_hnd (TMask_field& f, KEY k) { - if (k == K_TAB && f.focusdirty()) + if (k == K_TAB && f.focusdirty() && f.mask().is_running()) { TMask& m = f.mask(); TLocalisamfile pconti (LF_PCON); @@ -655,7 +655,7 @@ bool TMastrini_application::scelte_notify(TSheet_field& s, int r, KEY k) { bool ok = TRUE; if (k == K_INS) - return ok = FALSE; + ok = FALSE; return ok; } diff --git a/cg/cg3200a.uml b/cg/cg3200a.uml index e6825ca70..0fb0016b3 100755 --- a/cg/cg3200a.uml +++ b/cg/cg3200a.uml @@ -116,7 +116,7 @@ END NUMBER F_CONTOINI_CLIENTE 3 BEGIN PROMPT 41 5 "" - USE LF_PCON SELECT (TMCF="C") // && (CONTO!="") && (SOTTOCONTO="") + USE LF_PCON SELECT TMCF="C" INPUT GRUPPO F_GRUPPOINI INPUT CONTO F_CONTOINI_CLIENTE DISPLAY "Gruppo" GRUPPO @@ -136,7 +136,7 @@ END NUMBER F_CONTOINI_FORN 3 BEGIN PROMPT 41 5 "" - USE LF_PCON SELECT (TMCF="F") // && (CONTO!="") && (SOTTOCONTO="") + USE LF_PCON SELECT TMCF="F" INPUT GRUPPO F_GRUPPOINI INPUT CONTO F_CONTOINI_FORN DISPLAY "Gruppo" GRUPPO @@ -149,7 +149,7 @@ BEGIN WARNING "Conto inesistente o mancante" MESSAGE DIRTY,F_SOTTOCINI_FORN MESSAGE COPY,F_CONTOINI_CONTO - GROUP 3 9 + GROUP 3 9 END NUMBER F_SOTTOCINI_CONTO 6 @@ -214,7 +214,6 @@ BEGIN DISPLAY "Conto" CONTO DISPLAY "Codice" CODCF COPY OUTPUT F_SOTTOCINI_CLIENTE - MESSAGE COPY,F_DESCRINI_CONTO CHECKTYPE NORMAL GROUP 2 9 END @@ -248,7 +247,6 @@ BEGIN DISPLAY "Conto" CONTO DISPLAY "Codice" CODCF COPY OUTPUT F_SOTTOCINI_FORN - MESSAGE COPY,F_DESCRINI_CONTO CHECKTYPE NORMAL GROUP 3 9 END @@ -291,7 +289,7 @@ END NUMBER F_CONTOFINE_CLIENTE 3 BEGIN PROMPT 41 8 "" - USE LF_PCON SELECT (TMCF="C") // && (CONTO!="") && (SOTTOCONTO="") + USE LF_PCON SELECT TMCF="C" INPUT GRUPPO F_GRUPPOFINE INPUT CONTO F_CONTOFINE_CLIENTE DISPLAY "Gruppo" GRUPPO @@ -310,7 +308,7 @@ END NUMBER F_CONTOFINE_FORN 3 BEGIN PROMPT 41 8 "" - USE LF_PCON SELECT (TMCF="F") // && (CONTO!="") && (SOTTOCONTO="") + USE LF_PCON SELECT TMCF="F" INPUT GRUPPO F_GRUPPOFINE INPUT CONTO F_CONTOFINE_FORN DISPLAY "Gruppo" GRUPPO @@ -638,7 +636,6 @@ BEGIN DISPLAY "Descrizione@50" DESCR OUTPUT F_GRUPPOINI GRUPPO OUTPUT F_CONTOINI_CONTO CONTO -// OUTPUT F_DESCRINI_CONTO DESCR CHECKTYPE NORMAL WARNING "Conto inesistente o mancante" MESSAGE DIRTY,F_SOTTOCINI_CONTO @@ -674,7 +671,6 @@ BEGIN DISPLAY "Conto" CONTO DISPLAY "Codice" CODCF COPY OUTPUT F_SOTTOCINI_CLIENTE - MESSAGE COPY,F_DESCRINI_CONTO CHECKTYPE NORMAL GROUP 2 END @@ -707,7 +703,6 @@ BEGIN DISPLAY "Conto" CONTO DISPLAY "Codice" CODCF COPY OUTPUT F_SOTTOCINI_FORN - MESSAGE COPY,F_DESCRINI_CONTO CHECKTYPE NORMAL GROUP 3 END @@ -832,7 +827,6 @@ BEGIN DISPLAY "Conto" CONTO OUTPUT F_SOTTOCFINE_CLIENTE CODCF OUTPUT F_DESCRFINE_CLIENTE RAGSOC - FLAGS "R" GROUP 5 MESSAGE COPY,F_SOTTOCFINE_CONTO END @@ -904,7 +898,6 @@ BEGIN OUTPUT F_CONTOFINE_CONTO CONTO OUTPUT F_DESCRFINE_CONTO DESCR CHECKTYPE NORMAL - FLAGS "R" WARNING "Sottoconto inesistente o mancante" GROUP 4 END @@ -914,7 +907,7 @@ BEGIN PROMPT 1 5 "Descrizione " // FIELD LF_PCON->DESCR USE LF_PCON KEY 2 - INPUT DESCR F_DESCRINI_CONTO + INPUT DESCR F_DESCRFINE_CONTO DISPLAY "Descrizione@50" DESCR DISPLAY "Gruppo" GRUPPO DISPLAY "Conto" CONTO diff --git a/cg/cg4100a.uml b/cg/cg4100a.uml index 19e91741d..21469bf44 100755 --- a/cg/cg4100a.uml +++ b/cg/cg4100a.uml @@ -15,12 +15,12 @@ BEGIN PROMPT 3 4 "tempo. Siate certi di voler proseguire." END -BUTTON DLG_OK 9 2 +BUTTON DLG_OK 10 2 BEGIN - PROMPT -12 -1 "Conferma" + PROMPT -12 -1 "" END -BUTTON DLG_QUIT 9 2 +BUTTON DLG_QUIT 10 2 BEGIN PROMPT -22 -1 "" END diff --git a/cg/cg4100b.uml b/cg/cg4100b.uml index ba0ea9ebe..bda9b6fc3 100755 --- a/cg/cg4100b.uml +++ b/cg/cg4100b.uml @@ -9,7 +9,7 @@ END TEXT DLG_NULL BEGIN - PROMPT 2 3 "Il ricalcolo degli saldi puo' richiedere" + PROMPT 2 3 "Il ricalcolo dei saldi puo' richiedere" END TEXT DLG_NULL @@ -34,12 +34,12 @@ BEGIN END -BUTTON DLG_OK 9 2 +BUTTON DLG_OK 10 2 BEGIN - PROMPT -12 -1 "Conferma" + PROMPT -12 -1 "" END -BUTTON DLG_QUIT 9 2 +BUTTON DLG_QUIT 10 2 BEGIN PROMPT -22 -1 "" END diff --git a/cg/cg4301.cpp b/cg/cg4301.cpp index 14495dbf4..25d98a10c 100755 --- a/cg/cg4301.cpp +++ b/cg/cg4301.cpp @@ -556,7 +556,11 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt) real esenti_b2 = 0.0; real esenti_b3 = 0.0; real esenti_b4 = 0.0; - real esenti_b14 = 0.0; + real esenti_b14 = 0.0; + real vendite_vp1 = 0.0; + real vendite_vp2 = 0.0; + real acquisti_vp3 = 0.0; + real acquisti_vp4 = 0.0; real esni_rimb = 0.0; // ci sommo tutti esenti e ni validi per rimborso real corr_CEE = 0.0; real corr_noCEE = 0.0; @@ -712,6 +716,8 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt) const tipo_sospensione sosp_imp = _reg->get_bool("B1") ? (tipo_sospensione) _reg->get_int("I9") : nessuna; const TRectype& rcs = _cur->curr(LF_CAUSALI); const bool fattrit = rcs.get_bool("RITFATT"); + const bool cau_intra = rcs.get_bool("INTRACOM"); + const bool cau_valintra = rcs.get_bool("VALINTRA"); if (dok || sreg || rs8 || cmt) continue; @@ -756,10 +762,11 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt) real nin_imp = 0.0; // imponibile non incassati real nin_iva = 0.0; // imposta non incassati - TString codiva = _iva->get("CODTAB"); - TString tipoiva = _iva->get("S1"); - TString tipoes_v = _iva->get("S2"); - TString tipoes_a = _iva->get("S9"); + TString16 codiva = _iva->get("CODTAB"); + TString16 tipoiva = _iva->get("S1"); + TString16 tipoes_v = _iva->get("S2"); + TString16 tipoes_a = _iva->get("S9"); + TString16 iva_vpn = _iva->get(tipomov == vendita ? "S10" : "S11"); int tipoagr = atoi(_iva->get("S4")); int tipoag = atoi(_iva->get("S5")); int tipopla = atoi(_iva->get("S3")); @@ -798,6 +805,28 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt) // Filling dell'array per IVA11 if (_is_interactive && month == 13) iva11_set_arr_phase_1(trueatt); + + // Cumula l'ammontare delle operazioni attive/passive + // per la dichiarazione periodica + if (iva_vpn.not_empty() && !fattrit) + switch (tipomov) + { + case vendita: // VP1 o VP2 + if (!corrisp) + { + vendite_vp1 += imponibile; + if (cau_valintra && iva_vpn == "VP2") + vendite_vp2 += imponibile; + } + break; + case acquisto: // VP3 o VP4 + acquisti_vp3 += imponibile; + if (cau_intra && iva_vpn == "VP4") + acquisti_vp4 += imponibile; + break; + default: + break; + } if (noninc) // non incassati: non devono entrare in nessun altro calcolo { @@ -1686,6 +1715,10 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt) _pum->put("R13", esenti_b4); _pum->put("R7", esenti_b14); _pum->put("R12", esni_rimb); + _pum->put("R14", vendite_vp1); + _pum->put("R15", vendite_vp2); + _pum->put("R16", acquisti_vp3); + _pum->put("R17", acquisti_vp4); _pam->put("R0", acquisti); _pam->put("R1", vendite); _pam->put("R6", assp_imp); diff --git a/cg/cg4303.cpp b/cg/cg4303.cpp index 4c23c96e6..62a4c27ad 100755 --- a/cg/cg4303.cpp +++ b/cg/cg4303.cpp @@ -104,6 +104,17 @@ void TLiquidazione_app::recalc_corrispettivi(int month, const char* codatt) vaf += imponibile; _pam->put("R1", vaf); _pam->rewrite(); + // Aggiorna il totale IVA periodica VP1 + if (look_iva(ci->_codiva)) + { + if (_iva->get("S10").not_empty()) // Solo VP1 ha senso coi corrispettivi... se c'è VP2 lo consideriamo in VP1 + { + real vp1 = _pum->get_real("R14"); + vp1 += imponibile; + _pum->put("R14", vp1); + _pum->rewrite(); + } + } } } @@ -333,6 +344,18 @@ void TLiquidazione_app::recalc_ventilation(int month, const char* codatt) vaf += imponibile; _pam->put("R1", vaf); _pam->rewrite(); + + // Aggiorna il totale IVA periodica VP1 + if (look_iva(vv->_codiva)) + { + if (_iva->get("S10").not_empty()) // Solo VP1 ha senso coi corrispettivi... se c'è VP2 lo consideriamo in VP1 + { + real vp1 = _pum->get_real("R14"); + vp1 += imponibile; + _pum->put("R14", vp1); + _pum->rewrite(); + } + } // Aggiorno i luridi pim bool was = look_pim(month, codatt, vi->_codreg, "0", vv->_codiva, vi->_tipodet, TRUE); diff --git a/cg/cg4304.cpp b/cg/cg4304.cpp index 6f9bfe46d..9265de434 100755 --- a/cg/cg4304.cpp +++ b/cg/cg4304.cpp @@ -2134,7 +2134,7 @@ void TLiquidazione_app::set_ventila(_DescrItem& d) _vDesc& vd = (_vDesc&)d._arr[i]; look_iva(vd._codiva); TString s0 = _iva->get("S0"); - set_row(row+i,"@8g%5s@17g%s@41g%r@68g%r@89g%r", + set_row(row+i,"@8g%5s@17g%-23s@41g%r@68g%r@89g%r", (const char*)vd._codiva, (const char*)s0, &(vd._acq), diff --git a/cg/cg4400.cpp b/cg/cg4400.cpp index 34fb7a1cf..cfeda854a 100755 --- a/cg/cg4400.cpp +++ b/cg/cg4400.cpp @@ -3,6 +3,7 @@ // Usurpatore di Liberta'... // Nemico ed Oscuro Messo di Malvagita'... #include +#include #include "cg4.h" #include "cg4400.h" @@ -35,6 +36,7 @@ inline TStampa_registri_app& app() { return (TStampa_registri_app&)main_app(); } #define RIGHE_FOOTER 1 // Righe da saltare nel footer per evitare di scrivere sulla perforazione + bool TStampa_registri_app::filter_func (const TRelation * r) { TLocalisamfile& mov = r->lfile(LF_MOV); @@ -3251,6 +3253,8 @@ void TStampa_registri_app::send_message(char tipo, const TFilename& nome, int me TExternal_app pn(app); pn.run(); + + os_sleep(1000); } bool TStampa_registri_app::set_print(int n) diff --git a/cg/cg4500.cpp b/cg/cg4500.cpp index a5299404d..f9b73bcaf 100755 --- a/cg/cg4500.cpp +++ b/cg/cg4500.cpp @@ -58,7 +58,7 @@ public: bool TAp_eser::mask_newanno (TMask_field& f, KEY k) { - if ( (k == K_ENTER) && f.to_check(k) ) + if (k == K_ENTER) { int newanno = f.mask().get_int(F_NUOVOANNO); int anno = f.mask().get_int(F_ANNO); @@ -67,7 +67,8 @@ bool TAp_eser::mask_newanno (TMask_field& f, KEY k) TabEs.put ("CODTAB", codtab); if (TabEs.read() == NOERR) { - f.warning_box ("Il codice inserito e' gia' presente nella tabella degli esercizi!"); + f.warning_box ("Il codice %s e' gia' presente nella tabella degli esercizi!", + (const char*)codtab); return FALSE; } } diff --git a/cg/cg4501.cpp b/cg/cg4501.cpp index 010674dbc..8e3a56fc6 100755 --- a/cg/cg4501.cpp +++ b/cg/cg4501.cpp @@ -10,12 +10,9 @@ bool TAp_iva::mask_annoiva (TMask_field& f, KEY k) { int annoiva = f.mask().get_int(F_ANNOIVA); TConfig conf(CONFIG_DITTA); - int annoivap = atoi(conf.get("AnLiIv")); - if (annoiva != annoivap + 1) - { - f.warning_box("Il nuovo anno esercizio IVA deve essere successivo all'anno esercizio IVA precedente"); - return FALSE; - } + int annoivap = conf.get_int("AnLiIv"); + if (annoivap > 0 && annoiva != annoivap + 1) + return f.error_box("Il nuovo anno esercizio IVA deve essere %d", (annoivap+1)); } return TRUE; } @@ -51,7 +48,7 @@ bool TAp_iva::apertura_iva() TDate data; bool ok = FALSE; - int annop = atoi(_annop); + int annop = _annop; annoiva.format("%04d", _annoiva); //viene aggiornata la tabella LIA (liquidazione iva annuale) @@ -223,8 +220,10 @@ void TAp_iva::main_loop() TMask msk ("cg4500b"); TConfig conf(CONFIG_DITTA); - _annop = conf.get("AnLiIv"); - int aivap = atoi(_annop); + _annop = conf.get_int("AnLiIv"); + if (_annop <= 0) + _annop = TDate(TODAY).year() - 1; + int aivap = _annop; int anno = aivap+1; _is_minagr = FALSE; @@ -256,7 +255,7 @@ void TAp_iva::main_loop() } } - msk.set(F_ANNOIVA, aivap+1); + msk.set(F_ANNOIVA, anno); msk.set_handler (F_ANNOIVA, mask_annoiva); diff --git a/cg/cg4501.h b/cg/cg4501.h index e49e81837..5e98b647a 100755 --- a/cg/cg4501.h +++ b/cg/cg4501.h @@ -15,7 +15,7 @@ class TAp_iva : public TSkeleton_application TTable* _reg, * _lia, * _lbu; TLocalisamfile* _nditte; int _annoiva; - TString _annop; + int _annop; long _ditta; char _frequenza; bool _is_minagr; diff --git a/cg/cg5.cpp b/cg/cg5.cpp index 75cc382dc..914677e68 100755 --- a/cg/cg5.cpp +++ b/cg/cg5.cpp @@ -9,19 +9,21 @@ int main(int argc,char** argv) switch (n) { case 1: - cg5100(argc,argv) ; break; + cg5100(argc,argv); break; // Parametri ditta case 2: - cg5200(argc,argv) ; break; + cg5200(argc,argv); break; // Visualizzazione saldi case 3: - cg5300(argc,argv) ; break; + cg5300(argc,argv); break; // Parametri liquidazione case 4: - cg5400(argc,argv) ; break; + cg5400(argc,argv); break; // Ripristino stampe case 5: - cg5500(argc,argv) ; break; + cg5500(argc,argv); break; // Visualizzazione Liquidazione case 6: - cg5600(argc,argv) ; break; + cg5600(argc,argv); break; // Ripristino liquidazione + case 7: + cg5700(argc,argv); break; // Dichiarazione periodica default: - cg5000(argc,argv) ; break; + cg5000(argc,argv); break; // Parametri Studio } exit(0); return 0; diff --git a/cg/cg5.h b/cg/cg5.h index 7813f478d..eecce4c65 100755 --- a/cg/cg5.h +++ b/cg/cg5.h @@ -5,3 +5,4 @@ int cg5300 (int argc, char* argv[]); int cg5400 (int argc, char* argv[]); int cg5500 (int argc, char* argv[]); int cg5600 (int argc, char* argv[]); +int cg5700 (int argc, char* argv[]); diff --git a/cg/cg5500.cpp b/cg/cg5500.cpp index d8265b30d..8d29d5ae2 100755 --- a/cg/cg5500.cpp +++ b/cg/cg5500.cpp @@ -1,4 +1,5 @@ #include +#include #include #include #include @@ -12,6 +13,16 @@ #include "cg5500.h" #include "cg5500a.h" +static const TString& print_value(const real& r) +{ + static TString s; + const TCurrency c(r); + s = c.string(TRUE); + s.right_just(15); + + return s; +} + const char* Visliq_app::itoname(int m) { const char* mn; @@ -913,21 +924,22 @@ void Visliq_app::recalc_liq_data(TViswin & vsw, real& rimb, real& rett, real& ve lvers = lrisc+1l; // ... seguita da una sburlata di replace - vsw.replace(lrimb, rimb.string("###.###.###.###"), 75); - vsw.replace(lrisd, risdb.string("###.###.###.###"), 75); - vsw.replace(lrisc, riscr.string("###.###.###.###"), 58); - vsw.replace(lacct, acc.string("###.###.###.###"), 58); + + vsw->replace(lrimb, print_value(rimb), 75); + vsw->replace(lrisd, print_value(risdb), 75); + vsw->replace(lrisc, print_value(riscr), 58); + vsw->replace(lacct, print_value(acc), 58); if (rett.sign() > 0) { - vsw.replace(lrettd, rett.string("###.###.###.###"), 75); - vsw.replace(lrettc, " ", 58); + vsw->replace(lrettd, print_value(rett), 75); + vsw->replace(lrettc, " ", 58); } else if (rett.sign() < 0) { real rabs = abs(rett); - vsw.replace(lrettc, rabs.string("###.###.###.###"), 58); - vsw.replace(lrettd, " ", 75); + vsw->replace(lrettc, print_value(rabs), 58); + vsw->replace(lrettd, " ", 75); } else { @@ -939,7 +951,7 @@ void Visliq_app::recalc_liq_data(TViswin & vsw, real& rimb, real& rett, real& ve { real rabs = abs(risul); ln.overwrite("CREDITO ATTUALE", 23); - ln.overwrite(rabs.string("###.###.###.###"), 58); + ln.overwrite(print_value(rabs), 58); if (lintr > 0) // Quindi niente riga "Interessi " ... { vsw.replace(lintr," ",23); @@ -971,18 +983,20 @@ void Visliq_app::recalc_liq_data(TViswin & vsw, real& rimb, real& rett, real& ve vsw.replace(livdv, "IVA DOVUTA", 23); } if (lintr > 0) - vsw.replace(lintr, intr.string("###.###.###.###"), 75); + { + vsw->replace(lintr, print_value(intr), 75); + } if (livdv > 0) { - vsw.replace(livdv, risul.string("###.###.###.###"), 75); + vsw->replace(livdv, print_value(risul), 75); risul += intr; } } ln.overwrite("IVA DA VERSARE", 23); - ln.overwrite(risul.string("###.###.###.###"), 75); + ln.overwrite(print_value(risul), 75); } - vsw.replace(lvers, ln, 0); - vsw.replace(lrivr, vers.string("###.###.###.###"), 58); + vsw->replace(lvers, ln, 0); + vsw->replace(lrivr, print_value(vers), 58); vsw.refresh(); } diff --git a/cg/cg5500.h b/cg/cg5500.h index 0104fb6f8..50071dc3d 100755 --- a/cg/cg5500.h +++ b/cg/cg5500.h @@ -65,6 +65,7 @@ protected: static bool vers_action(TSheet_field& s, int r, KEY k); public: + virtual bool firm_change_enabled() const { return FALSE; } static Visliq_app& app() { return (Visliq_app&)main_app(); } TArray_sheet* get_ditte_sheet() { return _ditte; } diff --git a/cg/cg5700.cpp b/cg/cg5700.cpp new file mode 100755 index 000000000..fca5acf1a --- /dev/null +++ b/cg/cg5700.cpp @@ -0,0 +1,559 @@ +// Programma per la gestione e la stampa della dichiarazione periodica IVA +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "cg5700.h" + +class TDich_periodica_selfirm_mask : public TAutomask +{ + TArray_sheet * _ditte; + TString_array _nomiditte; + TString16 _freq; + int _year; + +protected: + bool select_button(); + void build_nomiditte(); + void build_ditte_sheet(); + void set_mask_freq(); +public: + const TString& get_freq() const { return _freq;} + const int get_year() const { return _year;} + const int get_period() const { return atoi(get(_freq == "M" ? F_MONTHS : F_TRIMS)); } + virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); + TDich_periodica_selfirm_mask(); + virtual ~TDich_periodica_selfirm_mask(); +}; + +TDich_periodica_selfirm_mask::TDich_periodica_selfirm_mask() : TAutomask("cg5700a") +{ + _ditte = new TArray_sheet(-1, -1, -4, -4, "Selezione Ditte", + "Cod.@5|Ragione Sociale@50|Vers."); + TDate oggi(TODAY); + + _year = oggi.year(); + _freq = "M"; + + set_mask_freq(); + + build_nomiditte(); + build_ditte_sheet(); +} + +TDich_periodica_selfirm_mask::~TDich_periodica_selfirm_mask() +{ + delete _ditte; +} + +void TDich_periodica_selfirm_mask::build_nomiditte() +{ + TString fr(2); + TLocalisamfile dt(LF_NDITTE); + TTable lia("%LIA"); + + _nomiditte.destroy(); + + for (dt.first(); !dt.eof(); dt.next()) + { + fr = "??"; + bool good = prefix().exist(dt.get_long("CODDITTA")); + + if (good) + { + lia.put("CODTAB", format("%05ld%d",dt.get_long("CODDITTA"),_year)); + if (lia.read() != NOERR) + good = FALSE; + else + fr = lia.get("S7"); + } + else continue; + + TToken_string* d = new TToken_string(64); + + d->add(dt.get("CODDITTA")); + d->add(dt.get("RAGSOC")); + d->add(fr); + + _nomiditte.add(d); + } +} + +void TDich_periodica_selfirm_mask::build_ditte_sheet() +{ + _ditte->destroy(); + long prima = -1; + + for (int i = 0; i < _nomiditte.items(); i++) + { + TToken_string* d = new TToken_string(_nomiditte.row(i)); + const long pos = _ditte->add(d); + const char vers = d->get_char(2); + const bool selectable = vers != '?'; + _ditte->enable_row(pos, selectable); + if (selectable && prima < 0) + _ditte->select(prima = pos); + } +} + +void TDich_periodica_selfirm_mask::set_mask_freq() +{ + if (_freq == "M") + { + show(F_MONTHS); + hide(F_TRIMS); + } + else + { + hide(F_MONTHS); + show(F_TRIMS); + } +} + +bool TDich_periodica_selfirm_mask::select_button() +{ + if (_ditte->run() == K_ENTER) + { + TToken_string& row = _ditte->row(_ditte->selected()); + set(F_CODDITTA, row.get(0)); + set(F_RAGSOC, row.get(1)); + _freq = row.get(2); + set_mask_freq(); + return TRUE; + } + return FALSE; +} + +bool TDich_periodica_selfirm_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) +{ + switch (o.dlg()) + { + case F_CODDITTA: + if (e == fe_button) + return select_button(); + + if (e == fe_modify) + { + bool found = FALSE; + TString16 ditta = o.get(); + for (int i = 0; i < _ditte->items(); i++) + { + TToken_string& row = _ditte->row(i); + if (ditta == row.get(0)) + { + if (_ditte->row_enabled(i)) + { + set(F_CODDITTA, row.get(0)); + set(F_RAGSOC, row.get(1)); + _freq = row.get(2); + set_mask_freq(); + found = TRUE; + } + else + { + warning_box("Non sono definiti i parametri liquidazione per la ditta %ld", + atol(ditta)); + o.reset(); + } + break; + } + } + if (!found) + o.reset(); + return found; + } + break; + case F_RAGSOC: + if (e == fe_button) + return select_button(); + if (e == fe_modify) + { + bool found = FALSE; + TString16 ditta = o.get(); + for (int i = 0; i < _ditte->items(); i++) + { + TToken_string& row = _ditte->row(i); + TString ts(row.get(1)); + if (ts.find(ditta) != -1) + { + if (_ditte->row_enabled(i)) + { + set(F_CODDITTA, row.get(0)); + set(F_RAGSOC, row.get(1)); + _freq = row.get(2); + set_mask_freq(); + found = TRUE; + break; + } + } + } + if (!found) o.reset(); + return found; + } + break; + case F_YEAR: + if (e == fe_modify) + { + _year = atoi(o.get()); + build_nomiditte(); + build_ditte_sheet(); + set(F_CODDITTA, ""); + set(F_RAGSOC, ""); + } + break; + default: + break; + } + + return TRUE; +} + +class TDich_periodica_iva_mask : public TAutomask +{ + TDich_periodica_selfirm_mask * _sf; + bool _dirty_versament, // Sporco versamento... + _is_euro; // importi in euro +protected: + void search_versament(); + void write_versament(); + void read_iva_data(); + +public: + void set_prospect(); + void print_prospect(); + virtual bool on_key(KEY k); + virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); + TDich_periodica_iva_mask(TDich_periodica_selfirm_mask *m); + virtual ~TDich_periodica_iva_mask() {}; +}; + +TDich_periodica_iva_mask::TDich_periodica_iva_mask(TDich_periodica_selfirm_mask *m) : TAutomask("cg5700b") +{ + _sf = m; +} + +void TDich_periodica_iva_mask::search_versament() +{ + TTable del("%DEL"); + TString key; + key.format("%05ld%4d%02d1", _sf->get_long(F_CODDITTA), _sf->get_year(), _sf->get_period()); + + del.put("CODTAB", key); + // Se esiste il versamento la visualizza, mantenendola disabilitata (eventuale SHIFT+F12) + if (del.read() == NOERR) + { + set(F_VP12_IMPORTO, del.get_real("R0")); + set(F_VP12_DATA, del.get_date("D0")); + set(F_VP12_ABI, del.get("S7")); + set(F_VP12_CAB, del.get("S8")); + set(F_VP12_CONCESSIONE, del.get("S9")); + set(F_VP12_STAMPATO, del.get_bool("B0")); + } + else + enable(-G_VP12); +} + +void TDich_periodica_iva_mask::write_versament() +{ + TTable del("%DEL"); + TString key; + key.format("%05ld%4d%02d1", _sf->get_long(F_CODDITTA), _sf->get_year(), _sf->get_period()); + + del.put("CODTAB", key); + + const bool good = del.read() == NOERR; + + del.put("R0", get(F_VP12_IMPORTO)); + del.put("D0", get(F_VP12_DATA)); + del.put("S7", get(F_VP12_ABI)); + del.put("S8", get(F_VP12_CAB)); + del.put("S9", get(F_VP12_CONCESSIONE)); + del.put("B0", TRUE); + + if (good) + del.rewrite(); + else + del.write(); +} + +void TDich_periodica_iva_mask::read_iva_data() +{ + TTable lim("LIM"); + TTable lam("LAM"); + + TString16 key; + key.format("%4d%02d", _sf->get_year(), _sf->get_period()); + lim.put("CODTAB", key); + lam.put("CODTAB", key); + + const bool good = lim.read() == NOERR; + + if (good && lim.get_bool("B0")) + { + lam.read(); + + TString descrizione(lim.get("S0")); + descrizione << lim.get("S1"); + const bool exclude_sign = descrizione.find("$$") >= 0 || descrizione.find(">>") >= 0; + + real vp1 = ZERO; + real vp2 = ZERO; + real vp3 = ZERO; + real vp4 = ZERO; + + TTable pum("PUM"); + key.format("%4d",_sf->get_year()); + pum.put("CODTAB", key); + + for (pum.first(); !pum.eof(); pum.next()) + { + key = pum.get("CODTAB"); + const int anno = atoi(key.mid(0,4)); + const int perd = atoi(key.mid(10,2)); + + if (anno != _sf->get_year() || perd != _sf->get_period()) + continue; + vp1 += pum.get_real("R14"); + vp2 += pum.get_real("R15"); + vp3 += pum.get_real("R16"); + vp4 += pum.get_real("R17"); + } + + // Se espressi in lire o una valuta con 0 decimali, arrotonda alle 1000 + TCurrency cur(vp1, get(F_CODVAL)); + const int ndec = cur.decimals() == 0 ? -3 : cur.decimals(); + + real rettifica = lim.get_real("R5"); + + real vp5 = lam.get_real("R0"); + if (rettifica > ZERO) + vp5 += rettifica; + + real vp6 = lam.get_real("R1"); + if (rettifica < ZERO && !exclude_sign) + vp6 += abs(rettifica); + + real vp7 = lam.get_real("R2") + lim.get_real("R1"); + + real vp8 = ZERO; + if (rettifica < ZERO && exclude_sign) + vp8 = abs(rettifica); + + real vp9 = lim.get_real("R14"); + + vp1.round(ndec); vp2.round(ndec); vp3.round(ndec); vp4.round(ndec); + vp5.round(ndec); vp6.round(ndec); vp7.round(ndec); vp8.round(ndec); + vp9.round(ndec); + + // I seguenti vengono giusti ed arrotondati bene di conseguenza + real vp10 = vp5 - (vp6+vp7+vp8) + vp9; + real vp11 = (vp6+vp7) - vp5; + + if (vp10 < ZERO) + vp10 = ZERO; + + if (vp11 < ZERO) + vp11 = ZERO; + + set(F_VP1, vp1);set(F_VP2, vp2);set(F_VP3, vp3);set(F_VP4, vp4); + set(F_VP5, vp5);set(F_VP6, vp6);set(F_VP7, vp7);set(F_VP8, vp8); + set(F_VP9, vp9);set(F_VP10, vp10);set(F_VP11, vp11); + } + else + error_box("Risultati liquidazione non presenti o da ricalcolare per il periodo richiesto."); +} + +void TDich_periodica_iva_mask::print_prospect() +{ + if (_dirty_versament) + write_versament(); + + TForm frm("cg5700a"); + + frm.find_field('B', odd_page, FF_CODVAL).set(get(F_CODVAL)); + frm.find_field('B', odd_page, FF_YEAR).set(get(F_YEAR)); + const bool mens = _sf->get_freq() == "M"; + + TForm_item& sf1 = frm.find_field('B', odd_page, FF_MONTHS); + TForm_item& sf2 = frm.find_field('B', odd_page, FF_TRIMS); + + sf1.set(get(F_MONTHS)); + sf2.set(get(F_TRIMS)); + sf1.show(mens); + sf2.show(!mens); + + frm.find_field('B', odd_page, FF_IMPORTI).set(_is_euro ? "1" : " "); + frm.find_field('B', odd_page, FF_VP1).set(get(F_VP1)); + frm.find_field('B', odd_page, FF_VP2).set(get(F_VP2)); + frm.find_field('B', odd_page, FF_VP3).set(get(F_VP3)); + frm.find_field('B', odd_page, FF_VP4).set(get(F_VP4)); + frm.find_field('B', odd_page, FF_VP5).set(get(F_VP5)); + frm.find_field('B', odd_page, FF_VP6).set(get(F_VP6)); + frm.find_field('B', odd_page, FF_VP7).set(get(F_VP7)); + frm.find_field('B', odd_page, FF_VP8).set(get(F_VP8)); + frm.find_field('B', odd_page, FF_VP9).set(get(F_VP9)); + frm.find_field('B', odd_page, FF_VP10).set(get(F_VP10)); + frm.find_field('B', odd_page, FF_VP11).set(get(F_VP11)); + + // Se è stato creato il versamento ora o se è stato giò stampato + // allora lo stampa, altrimenti lo nasconde. + + const bool b = _dirty_versament || get_bool(F_VP12_STAMPATO); + frm.find_field('B', odd_page, FF_VP12_STAMPATO).set(b ? "X" : " "); //Mostra nasconde il gruppo 12 + if (b) + { + frm.find_field('B', odd_page, FF_VP12_IMPORTO).set(get(F_VP12_IMPORTO)); + frm.find_field('B', odd_page, FF_VP12_DATA).set(get(F_VP12_DATA)); + frm.find_field('B', odd_page, FF_VP12_CONCESSIONE).set(get(F_VP12_CONCESSIONE)); + frm.find_field('B', odd_page, FF_VP12_ABI).set(get(F_VP12_ABI)); + frm.find_field('B', odd_page, FF_VP12_CAB).set(get(F_VP12_CAB)); + } + + TRectype f(LF_NDITTE); + f.put(NDT_CODDITTA, get(F_CODDITTA)); + TRectype t(f); + + frm.cursor()->setregion(f,t); + frm.print(); +} + +void TDich_periodica_iva_mask::set_prospect() +{ + CHECK(_sf, "Invalid mask"); + + _dirty_versament = FALSE; + + set(F_YEAR, _sf->get_year()); + set(F_CODDITTA, _sf->get(F_CODDITTA)); + set(F_RAGSOC, _sf->get(F_RAGSOC)); + + const TString& f = _sf->get_freq(); + + show(F_MONTHS, f == "M"); + show(F_TRIMS, f == "T"); + + set(F_MONTHS, _sf->get(F_MONTHS)); + set(F_TRIMS, _sf->get(F_TRIMS)); + + TFirm frm(_sf->get_long(F_CODDITTA)); + + const TString& cv = frm.codice_valuta(); + _is_euro = cv == TCurrency::get_euro_val(); + + set(F_CODVAL, cv); + + search_versament(); + + read_iva_data(); +} + +bool TDich_periodica_iva_mask::on_key(KEY k) +{ + if (k == K_SHIFT + K_F12) // Abilita i campi relativi al versamento + enable(-G_VP12); + + return TAutomask::on_key(k); +} + +bool TDich_periodica_iva_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) +{ + switch (o.dlg()) + { + case F_VP12_DATA: + case F_VP12_CONCESSIONE: + case F_VP12_ABI: + case F_VP12_CAB: + if (e == fe_modify) + _dirty_versament = TRUE; + break; + case F_VP12_IMPORTO: + if (e == fe_modify) + { + _dirty_versament = TRUE; + real r(o.get()); + TCurrency cur(r, get(F_CODVAL)); + const int ndec = cur.decimals(); // Decimali di questa valuta per gli importi + + // Arrotondamento alle migliaia nel caso il numero + // di decimali della ditta sia zero (come per le lire) + // altrimenti al numero di decimali impostato + r.round(ndec == 0 ? -3 : ndec); + o.set(r.string()); + } + break; + default: + break; + } + return TRUE; +} + +class TDich_periodica_iva_app : public TSkeleton_application +{ + TDich_periodica_selfirm_mask * _m1; + TDich_periodica_iva_mask * _m2; + +protected: + virtual bool create(); + virtual bool destroy(); + virtual void main_loop(); +public: + virtual bool firm_change_enabled() const { return FALSE; } + TDich_periodica_iva_app () {}; + virtual ~TDich_periodica_iva_app () {}; +}; + +bool TDich_periodica_iva_app::create() +{ + _m1 = new TDich_periodica_selfirm_mask(); + _m2 = new TDich_periodica_iva_mask(_m1); + open_files(LF_NDITTE, 0); + return TSkeleton_application::create(); +} + +bool TDich_periodica_iva_app::destroy() +{ + delete _m2; + delete _m1; + return TSkeleton_application::destroy(); +} + +void TDich_periodica_iva_app::main_loop() +{ + long ditta = get_firm(); + + while (_m1->run() != K_QUIT) + { + if (_m1->get(F_CODDITTA).empty() || _m1->get(F_RAGSOC).empty()) + { + beep(); + continue; + } + + set_firm(_m1->get_long(F_CODDITTA)); + + _m2->reset(); + _m2->enable_default(); + + _m2->set_prospect(); + + if (_m2->run() == K_ENTER) + _m2->print_prospect(); + } + + set_firm(ditta); +} + +int cg5700 (int argc, char* argv[]) +{ + TDich_periodica_iva_app a; + a.run(argc, argv, "Dichiarazione periodica"); + return 0; +} diff --git a/cg/cg5700.h b/cg/cg5700.h new file mode 100755 index 000000000..523d38859 --- /dev/null +++ b/cg/cg5700.h @@ -0,0 +1,55 @@ +#define F_YEAR 101 +#define F_CODDITTA 102 +#define F_RAGSOC 103 +#define F_MONTHS 104 +#define F_TRIMS 105 +#define F_CODVAL 106 +#define F_VP1 107 +#define F_VP2 108 +#define F_VP3 109 +#define F_VP4 110 +#define F_VP5 111 +#define F_VP6 112 +#define F_VP7 113 +#define F_VP8 114 +#define F_VP9 115 +#define F_VP10 116 +#define F_VP11 117 +#define F_VP12_DATA 118 +#define F_VP12_IMPORTO 119 +#define F_VP12_ABI 120 +#define F_VP12_CAB 121 +#define F_VP12_CONCESSIONE 122 +#define F_VP12_STAMPATO 123 + +#define G_VP12 1 + +#define FF_YEAR 101 +#define FF_CODDITTA 102 +#define FF_RAGSOC 103 +#define FF_MONTHS 104 +#define FF_TRIMS 105 +#define FF_CODVAL 106 +#define FF_VP1 107 +#define FF_VP2 108 +#define FF_VP3 109 +#define FF_VP4 110 +#define FF_VP5 111 +#define FF_VP6 112 +#define FF_VP7 113 +#define FF_VP8 114 +#define FF_VP9 115 +#define FF_VP10 116 +#define FF_VP11 117 +#define FF_VP12_DATA 118 +#define FF_VP12_IMPORTO 119 +#define FF_VP12_ABI 120 +#define FF_VP12_CAB 121 +#define FF_VP12_CONCESSIONE 122 +#define FF_VP12_STAMPATO 123 +#define FF_COFI 124 +#define FF_PAIVA 125 +#define FF_IMPORTI 126 + +#define GF_VP12 1 + diff --git a/cg/cg5700a.frm b/cg/cg5700a.frm new file mode 100755 index 000000000..14956594b --- /dev/null +++ b/cg/cg5700a.frm @@ -0,0 +1,317 @@ +#include "cg5700.h" + +USE LF_NDITTE +JOIN LF_ANAG TO LF_NDITTE INTO TIPOA=TIPOA CODANAGR=CODANAGR +JOIN LF_ANAGFIS TO LF_ANAG ALIAS 18 INTO CODANAGR=CODANAGR +JOIN LF_ANAGGIU TO LF_ANAG INTO CODANAGR=CODANAGR +END + +DESCRIPTION +BEGIN + 9->* "Ditte" + 6->* "Anagrafica persone fisiche e giuridiche" + 8->* "Anagrafica persone fisiche" + 7->* "Anagrafica persone giuridiche" +END + +GENERAL +BEGIN + OFFSET 0 0 +END + +SECTION BODY ODD 50 + +STRINGA 1 40 +BEGIN + KEY "Titolo" + PROMPT 30 1 "@BDICHIARAZIONE IVA PERIODICA" +END + +STRINGA 2 10 +BEGIN + KEY "Data" + PROMPT 65 1 "Data " + MESSAGE _TODAY +END + +NUMERO FF_CODDITTA 6 +BEGIN + KEY "Codice ditta" + PROMPT 2 3 "Ditta " + FIELD LF_NDITTE->CODDITTA + PICTURE "@@@@@" +END + +STRINGA FF_RAGSOC 50 +BEGIN + KEY "Ragione sociale" + PROMPT 18 3 "" + FIELD LF_NDITTE->RAGSOC +END + +STRINGA 3 +BEGIN + KEY "Codice fiscale - descrizione" + PROMPT 2 4 "Codice fiscale:" +END + +STRINGA FF_COFI +BEGIN + KEY "Codice fiscale - valore" + PROMPT 18 4 "" + FIELD LF_ANAG->COFI +END + +STRINGA 4 +BEGIN + KEY "Partita IVA - descrizione" + PROMPT 2 5 "Partita IVA: " +END + +STRINGA FF_PAIVA +BEGIN + KEY "Partita IVA - valore" + PROMPT 18 5 "" + FIELD LF_ANAG->PAIV +END + +NUMERO FF_YEAR 6 +BEGIN + KEY "Anno" + PROMPT 2 6 "Anno: " +END + +LISTA FF_MONTHS 15 +BEGIN + KEY "Mesi" + PROMPT 18 6 "Periodo: " + ITEM "1|Gennaio" + ITEM "2|Febbraio" + ITEM "3|Marzo" + ITEM "4|Aprile" + ITEM "5|Maggio" + ITEM "6|Giugno" + ITEM "7|Luglio" + ITEM "8|Agosto" + ITEM "9|Settembre" + ITEM "10|Ottobre" + ITEM "11|Novembre" + ITEM "12|Dicembre" +END + +LISTA FF_TRIMS 15 +BEGIN + KEY "Trimestri" + PROMPT 18 6 "Periodo: " + ITEM "3|1° Trimestre" + ITEM "6|2° Trimestre" + ITEM "9|3° Trimestre" + ITEM "12|4° Trimestre" +END + +STRING FF_CODVAL 3 +BEGIN + KEY "Codice valuta" + PROMPT 60 4 "" + FLAGS "H" +END + +LISTA FF_IMPORTI 21 +BEGIN + KEY "Importi espressi in" + PROMPT 2 8 "Importi espressi in " + ITEM " |lire" + ITEM "1|euro" +END + +STRINGA 5 +BEGIN + KEY "VP1 - Descrizione" + PROMPT 2 10 "VP1 - Ammontare complessivo delle operazioni attive" +END + +VALUTA FF_VP1 18 +BEGIN + KEY "VP1 - Valore" + PROMPT 60 10 "" + DRIVENBY FF_CODVAL +END + +STRINGA 6 +BEGIN + KEY "VP2 - Descrizione" + PROMPT 2 11 "VP2 - di cui cessioni intracomunitarie" +END + +VALUTA FF_VP2 18 +BEGIN + KEY "VP2 - Valore" + PROMPT 60 11 "" + DRIVENBY FF_CODVAL +END + +STRINGA 7 +BEGIN + KEY "VP3 - Descrizione" + PROMPT 2 12 "VP3 - Ammontare complessivo delle operazioni passive" +END + +VALUTA FF_VP3 18 +BEGIN + KEY "VP3 - Valore" + PROMPT 60 12 "" + DRIVENBY FF_CODVAL +END + +STRINGA 8 +BEGIN + KEY "VP4 - Descrizione" + PROMPT 2 13 "VP4 - di cui acquisti intracomunitari" +END + +VALUTA FF_VP4 18 +BEGIN + KEY "VP4 - Valore" + PROMPT 60 13 "" + DRIVENBY FF_CODVAL +END + +STRINGA 9 +BEGIN + KEY "VP5 - Descrizione" + PROMPT 2 14 "VP5 - Ammontare complessivo dell'IVA a debito" +END + +VALUTA FF_VP5 18 +BEGIN + KEY "VP5 - Valore" + PROMPT 60 14 "" + DRIVENBY FF_CODVAL +END + +STRINGA 10 +BEGIN + KEY "VP6 - Descrizione" + PROMPT 2 15 "VP6 - Ammontare complessivo dell'IVA che si detrae" +END + +VALUTA FF_VP6 18 +BEGIN + KEY "VP6 - Valore" + PROMPT 60 15 "" + DRIVENBY FF_CODVAL +END + +STRINGA 11 +BEGIN + KEY "VP7 - Descrizione" + PROMPT 2 16 "VP7 - IVA a credito del periodo precedente" +END + +VALUTA FF_VP7 18 +BEGIN + KEY "VP7 - Valore" + PROMPT 60 16 "" + DRIVENBY FF_CODVAL +END + +STRINGA 12 +BEGIN + KEY "VP8 - Descrizione" + PROMPT 2 17 "VP8 - Crediti d'imposta utilizzati" +END + +VALUTA FF_VP8 18 +BEGIN + KEY "VP8 - Valore" + PROMPT 60 17 "" + DRIVENBY FF_CODVAL +END + +STRINGA 13 +BEGIN + KEY "VP9 - Descrizione" + PROMPT 2 18 "VP9 - Interessi dovuti per le liquidazioni trimestrali" +END + +VALUTA FF_VP9 18 +BEGIN + KEY "VP9 - Valore" + PROMPT 60 18 "" + DRIVENBY FF_CODVAL +END + +STRINGA 14 +BEGIN + KEY "VP10 - Descrizione" + PROMPT 2 19 "@bVP10 - IVA da versare" +END + +VALUTA FF_VP10 18 +BEGIN + KEY "VP10 - Valore" + PROMPT 60 19 "" + DRIVENBY FF_CODVAL +END + +STRINGA 15 +BEGIN + KEY "VP11 - Descrizione" + PROMPT 2 20 "@bVP11 - IVA a credito" +END + +VALUTA FF_VP11 18 +BEGIN + KEY "VP11 - Valore" + PROMPT 60 20 "" + DRIVENBY FF_CODVAL +END + +LISTA FF_VP12_STAMPATO +BEGIN + KEY "Stampato" + PROMPT 0 0 "" + FLAGS "H" + ITEM " | " MESSAGE HIDE,GF_VP12@ + ITEM "X| " MESSAGE SHOW,GF_VP12@ +END + +VALUTA FF_VP12_IMPORTO 18 +BEGIN + KEY "Importo" + PROMPT 2 22 "Importo versato " + DRIVENBY FF_CODVAL + GROUP GF_VP12 +END + +DATA FF_VP12_DATA +BEGIN + KEY "Data versamento" + PROMPT 40 22 "Data versamento " + GROUP GF_VP12 +END + +STRINGA FF_VP12_CONCESSIONE 17 +BEGIN + KEY "Cod. Concessione" + PROMPT 2 23 "Cod. Concessione " + GROUP GF_VP12 +END + +STRINGA FF_VP12_ABI 10 +BEGIN + KEY "Cod. ABI" + PROMPT 40 23 "Cod. ABI " + GROUP GF_VP12 +END + +STRINGA FF_VP12_CAB 10 +BEGIN + KEY "Cod. CAB" + PROMPT 40 24 "Cod. CAB " + GROUP GF_VP12 +END + +END + +END diff --git a/cg/cg5700a.uml b/cg/cg5700a.uml new file mode 100755 index 000000000..8060aca23 --- /dev/null +++ b/cg/cg5700a.uml @@ -0,0 +1,61 @@ +#include "cg5700.h" + +PAGE "Dichiarazione periodica" -1 -1 72 8 + +NUMBER F_YEAR 4 +BEGIN + PROMPT 1 1 "Anno liquidazione " + FLAGS "AR" +END + +NUMBER F_CODDITTA 5 +BEGIN + PROMPT 1 3 "Codice ditta " + FLAGS "B" +END + +STRING F_RAGSOC 50 30 +BEGIN + PROMPT 28 3 "Rag.soc. " + FLAGS "B" +END + +LIST F_MONTHS 30 +BEGIN + PROMPT 1 5 "Mese liquidazione " + ITEM "1|Gennaio" + ITEM "2|Febbraio" + ITEM "3|Marzo" + ITEM "4|Aprile" + ITEM "5|Maggio" + ITEM "6|Giugno" + ITEM "7|Luglio" + ITEM "8|Agosto" + ITEM "9|Settembre" + ITEM "10|Ottobre" + ITEM "11|Novembre" + ITEM "12|Dicembre" +END + +LIST F_TRIMS 30 +BEGIN + PROMPT 1 5 "Trim. liq. " + ITEM "3|1° Trimestre" + ITEM "6|2° Trimestre" + ITEM "9|3° Trimestre" + ITEM "12|4° Trimestre" + FLAGS "H" +END + +BUTTON DLG_OK 10 2 +BEGIN + PROMPT -12 -1 "" +END + +BUTTON DLG_QUIT 10 2 +BEGIN + PROMPT -22 -1 "" +END + +ENDPAGE +ENDMASK diff --git a/cg/cg5700b.uml b/cg/cg5700b.uml new file mode 100755 index 000000000..8ccbbfbcd --- /dev/null +++ b/cg/cg5700b.uml @@ -0,0 +1,223 @@ +#include "cg5700.h" + +TOOLBAR "" 0 20 0 2 + +BUTTON DLG_PRINT 10 2 +BEGIN + PROMPT -12 -1 "" + MESSAGE EXIT, K_ENTER +END + +BUTTON DLG_QUIT 10 2 +BEGIN + PROMPT -22 -1 "" +END + +ENDPAGE + +PAGE "Dichiarazione periodica" -1 -1 78 20 + +GROUPBOX DLG_NULL 79 4 +BEGIN + PROMPT 0 1 "@bDitta corrente" +END + +NUMBER F_CODDITTA 5 +BEGIN + PROMPT 2 2 "Codice " + FLAGS "D" +END + +STRING F_RAGSOC 50 +BEGIN + PROMPT 16 2 "Rag. Soc. " + FLAGS "D" +END + +NUMBER F_YEAR 4 +BEGIN + PROMPT 2 3 "Anno " + FLAGS "D" +END + +LIST F_MONTHS 30 +BEGIN + PROMPT 16 3 "Periodo " + ITEM "1|Gennaio" + ITEM "2|Febbraio" + ITEM "3|Marzo" + ITEM "4|Aprile" + ITEM "5|Maggio" + ITEM "6|Giugno" + ITEM "7|Luglio" + ITEM "8|Agosto" + ITEM "9|Settembre" + ITEM "10|Ottobre" + ITEM "11|Novembre" + ITEM "12|Dicembre" + FLAGS "D" +END + +LIST F_TRIMS 30 +BEGIN + PROMPT 16 3 "Periodo " + ITEM "3|1° Trimestre" + ITEM "6|2° Trimestre" + ITEM "9|3° Trimestre" + ITEM "12|4° Trimestre" + FLAGS "H" +END + +STRING F_CODVAL 3 +BEGIN + PROMPT 0 0 "" + FLAGS "H" +END + +CURRENCY F_VP1 18 +BEGIN + PROMPT 1 5 "VP1 - Ammontare complessivo operazioni attive " + DRIVENBY F_CODVAL + FLAGS "D" +END + +CURRENCY F_VP2 18 +BEGIN + PROMPT 1 6 "VP2 - Di cui cessioni intracomunitarie " + DRIVENBY F_CODVAL + FLAGS "D" +END + +CURRENCY F_VP3 18 +BEGIN + PROMPT 1 7 "VP3 - Ammontare complessivo delle operazioni passive " + DRIVENBY F_CODVAL + FLAGS "D" +END + +CURRENCY F_VP4 18 +BEGIN + PROMPT 1 8 "VP4 - Di cui acquisti intracomunitari " + DRIVENBY F_CODVAL + FLAGS "D" +END + +CURRENCY F_VP5 18 +BEGIN + PROMPT 1 9 "VP5 - Iva a debito del periodo " + DRIVENBY F_CODVAL + FLAGS "D" +END + +CURRENCY F_VP6 18 +BEGIN + PROMPT 1 10 "VP6 - Iva a credito del periodo " + DRIVENBY F_CODVAL + FLAGS "D" +END + +CURRENCY F_VP7 18 +BEGIN + PROMPT 1 11 "VP7 - Iva credito periodo precedente " + DRIVENBY F_CODVAL + FLAGS "D" +END + +CURRENCY F_VP8 18 +BEGIN + PROMPT 1 12 "VP8 - Crediti d'imposta utilizzati " + DRIVENBY F_CODVAL + FLAGS "D" +END + +CURRENCY F_VP9 18 +BEGIN + PROMPT 1 13 "VP9 - Interessi " + DRIVENBY F_CODVAL + FLAGS "D" +END + +CURRENCY F_VP10 18 +BEGIN + PROMPT 1 14 "VP10 - Iva da versare " + DRIVENBY F_CODVAL + FLAGS "D" +END + +CURRENCY F_VP11 18 +BEGIN + PROMPT 1 15 "VP11 - Iva a credito " + DRIVENBY F_CODVAL + FLAGS "D" +END + +GROUPBOX DLG_NULL 79 5 +BEGIN + PROMPT 0 16 "@bVP12 - Estremi del versamento" +END + +DATE F_VP12_DATA +BEGIN + PROMPT 1 17 "Data " + FLAGS "D" + GROUP G_VP12 +END + +CURRENCY F_VP12_IMPORTO 18 +BEGIN + PROMPT 38 17 "Importo versato " + FLAGS "DR" + DRIVENBY F_CODVAL + GROUP G_VP12 +END + +NUMBER F_VP12_ABI 5 +BEGIN + PROMPT 1 18 "Codice ABI " + FIELD S7 + FLAGS "DRZ" + USE %BAN + INPUT CODTAB[1,5] F_VP12_ABI + INPUT CODTAB[6,10] F_VP12_CAB + DISPLAY "Codice ABI" CODTAB[1,5] + DISPLAY "Codice CAB" CODTAB[6,10] + DISPLAY "Descrizione @50" S0 + OUTPUT F_VP12_ABI CODTAB[1,5] + OUTPUT F_VP12_CAB CODTAB[6,10] + CHECKTYPE NORMAL + WARNING "Banca assente" + GROUP G_VP12 +END + +NUMBER F_VP12_CAB 5 +BEGIN + PROMPT 38 18 "Codice CAB " + FLAGS "DRZ" + COPY ALL F_VP12_ABI + CHECKTYPE NORMAL + WARNING "Banca assente" + GROUP G_VP12 +END + +NUMBER F_VP12_CONCESSIONE 3 +BEGIN + PROMPT 1 19 "Concessione " + FLAGS "DRZ" + USE %UCC + INPUT CODTAB F_VP12_CONCESSIONE + DISPLAY "Concessione " CODTAB[1,5] + DISPLAY "Descrizione @50" S0 + OUTPUT F_VP12_CONCESSIONE CODTAB + CHECKTYPE NORMAL + WARNING "Concessione assente" + GROUP G_VP12 +END + +BOOLEAN F_VP12_STAMPATO +BEGIN + PROMPT 38 19 "Stampato" + FLAGS "D" +END + +ENDPAGE +ENDMASK diff --git a/cg/cg6400.cpp b/cg/cg6400.cpp index 1f57f182f..3905faefd 100755 --- a/cg/cg6400.cpp +++ b/cg/cg6400.cpp @@ -9,7 +9,6 @@ #include #include #include -#include #include #include @@ -92,8 +91,6 @@ _scelta(toupper(ric_trasfer)), _ric_auto(toupper(ric_auto)) bool TRic_archivi::create() { - TApplication::create(); - //_tab_tra = new TTable ("%TRA"); _tras_file = new TTransfer_file(_scelta); @@ -116,9 +113,7 @@ bool TRic_archivi::create() _nultras_tab = 0; _baipassa = FALSE; - dispatch_e_menu (BAR_ITEM(1)); - - return TRUE; + return TSkeleton_application::create(); } bool TRic_archivi::destroy() @@ -161,7 +156,7 @@ void TRic_archivi::componi_path(TMask* msk) if (pos) path = path.mid(pos+1); - if (path != "") + if (path.not_empty()) { _marker << drive << "\\" << path << "\\marker"; _trasfer << drive << "\\" << path << "\\trasfer"; diff --git a/cg/cg6804c.uml b/cg/cg6804c.uml index 73289eed7..c5bf33b37 100755 --- a/cg/cg6804c.uml +++ b/cg/cg6804c.uml @@ -203,10 +203,10 @@ BEGIN PROMPT 1 16 "Data cambio " END -NUMBER 126 15 5 +NUMBER 126 15 6 BEGIN PROMPT 53 16 "Cambio " - PICTURE ".5" + PICTURE ".6" END ENDPAGE diff --git a/cg/cg6902.cpp b/cg/cg6902.cpp index 3a40160cb..efbb523d2 100755 --- a/cg/cg6902.cpp +++ b/cg/cg6902.cpp @@ -1411,7 +1411,7 @@ bool TInv_cont::invio_mov_IVA() record.overwrite(_codvali,146); //Codice valuta - dec2integer(_cambioi,100000); + dec2integer(_cambioi,100000L); TString cambioi = _cambioi.string(); if (_cambioi.sign() < 0) negPC2negAS(cambioi); @@ -1666,7 +1666,7 @@ void TInv_cont::partita2trasfer(TString& record, bool crea_record_riferimento) record.overwrite(str,82); //Importo in valuta tot documento _cambio = _tpart->get_real(PART_CAMBIO); - dec2integer(_cambio,100000); + dec2integer(_cambio,100000L); TString cambioi = _cambio.string(); if (_cambio.sign() < 0) negPC2negAS(cambioi); @@ -2025,4 +2025,5 @@ void TInv_cont::negPC2negAS(TString& numero) void TInv_cont::dec2integer(real& val, long dec) { val = val * dec; + val.round(); } diff --git a/cg/cgp3100.cpp b/cg/cgp3100.cpp index 76de4dfd4..2686ed197 100755 --- a/cg/cgp3100.cpp +++ b/cg/cgp3100.cpp @@ -2,6 +2,7 @@ #include #include #include +#include #include #include @@ -302,23 +303,22 @@ int TMastrini_application::date2esc(const TDate& d) bool TMastrini_application::almeno_un_record() { bool trovato=FALSE; - long record; -// long sottoc; int gruppo,conto; TDate datareg, datacomp; TLocalisamfile& rmov = current_cursor()->file(LF_RMOV); - + if (current_cursor()->is_first_match(LF_RMOV)) { - record = rmov.recno(); + long record = rmov.recno(); rmov.zero(); rmov.put(RMV_GRUPPO, _gruppo); rmov.put(RMV_CONTO, _conto); // rmov.put(RMV_SOTTOCONTO, _sottoc); - for (rmov.read(_isgteq); !rmov.eof() ;rmov.next()) + + for (int err = rmov.read(_isgteq); err == NOERR; err = rmov.next()) { - int annoes = rmov.get_int (RMV_ANNOES); - long numreg = rmov.get_long(RMV_NUMREG); + const int annoes = rmov.get_int (RMV_ANNOES); + const long numreg = rmov.get_long(RMV_NUMREG); _mov->setkey(1); _mov->curr().zero(); @@ -3673,19 +3673,19 @@ bool TMastrini_application::sheet2mask() bool TMastrini_application::user_create() { - TToken_string exp; - _rel = new TRelation (LF_SALDI); - - exp.add("GRUPPO=GRUPPO"); - exp.add("CONTO=CONTO"); -// exp.add("SOTTOCONTO=SOTTOCONTO"); - -// _rel->add(LF_RMOV,exp,2,LF_SALDI); - TLocalisamfile* rmov = new TSortedfile(LF_RMOV, NULL, "GRUPPO|CONTO|DATAREG|SOTTOCONTO", "", 2); - _rel->add(rmov,exp,2,LF_SALDI); + TSortedfile* rmov = new TSortedfile(LF_RMOV, NULL, "GRUPPO|CONTO|DATAREG|SOTTOCONTO", "", 2); + _rel->add(rmov,"GRUPPO==GRUPPO|CONTO==CONTO",2,LF_SALDI); + +/* Debugging purpose + TCursor_sheet dbgsht(&rmov->cursor(), "GRUPPO|CONTO|DATAREG|SOTTOCONTO|NUMREG|NUMRIG", + "Test sorter", "Gruppo|Conto|Data@10|Sottoconto|Numreg|Numrig"); + dbgsht.run(); +*/ +// rmov->cursor() = 0L; _cur1=add_cursor(new TCursor(_rel,"FLSCA=\" \"",2)); + _nditte = new TLocalisamfile (LF_NDITTE); _unloc = new TLocalisamfile (LF_UNLOC); _comuni = new TLocalisamfile (LF_COMUNI); diff --git a/cg/cgp3100a.uml b/cg/cgp3100a.uml index 49f477de9..3832a61d8 100755 --- a/cg/cgp3100a.uml +++ b/cg/cgp3100a.uml @@ -90,7 +90,8 @@ BEGIN INPUT GRUPPO F_GRUPPOINI INPUT CONTO F_CONTOINI_CONTO DISPLAY "Gruppo" GRUPPO - DISPLAY "Conto" CONTO + DISPLAY "Conto" CONTO + DISPLAY "C/F" TMCF DISPLAY "Descrizione@50" DESCR OUTPUT F_GRUPPOINI GRUPPO OUTPUT F_CONTOINI_CONTO CONTO @@ -110,6 +111,7 @@ BEGIN DISPLAY "Descrizione@50" DESCR DISPLAY "Gruppo" GRUPPO DISPLAY "Conto" CONTO + DISPLAY "C/F" TMCF COPY OUTPUT F_CONTOINI_CONTO GROUP 9 END @@ -128,6 +130,7 @@ BEGIN INPUT CONTO F_CONTOFINE_CONTO DISPLAY "Gruppo" GRUPPO DISPLAY "Conto" CONTO + DISPLAY "C/F" TMCF DISPLAY "Descrizione@50" DESCR OUTPUT F_GRUPPOFINE GRUPPO OUTPUT F_CONTOFINE_CONTO CONTO @@ -146,6 +149,7 @@ BEGIN DISPLAY "Descrizione@50" DESCR DISPLAY "Gruppo" GRUPPO DISPLAY "Conto" CONTO + DISPLAY "C/F" TMCF COPY OUTPUT F_CONTOFINE_CONTO GROUP 4 9 END diff --git a/cg/cgpagame.cpp b/cg/cgpagame.cpp index b1733e76a..7e86021ea 100755 --- a/cg/cgpagame.cpp +++ b/cg/cgpagame.cpp @@ -1682,7 +1682,7 @@ const real& TPagamento::importo_da_non_dividere(bool v) const void TPagamento::set_total(const real& ib, const real& im, const real& sp) { _in_valuta = FALSE; - _cambio = 1.0; +// _cambio = 1.0; _firstr = _secndr = ZERO; // Azzera importi in valuta init_total(ib, im, sp, NULL); // setta regolarmente totali in lire @@ -1695,10 +1695,11 @@ void TPagamento::set_total_valuta(const real& ib, const real& im, const real& const bool era_valuta = _in_valuta; _in_valuta = TRUE; +/* _cambio = c; if (_cambio.sign() <= 0) _cambio = real(1.0); - +*/ // setta regolarmente totali in lire init_total(ibl, iml, spl, NULL); // ripeti tutto con la valuta @@ -1960,7 +1961,7 @@ void TPagamento::adjust_refused_scad() TPagamento::TPagamento(const char* codtab, const char* data) : _new(FALSE), _mcomm(FALSE), _imponlit(0.0), _imposlit(0.0), - _speselit(0.0), _cambio(1.0), _in_valuta(FALSE), + _speselit(0.0), _in_valuta(FALSE), // _cambio(1.0), _code(codtab), _dirty(FALSE), _inited(FALSE), _def_tpr(1), _def_ulc(""), _roundval(3), _int_rate(30), _tpr(0), _rdiff(FALSE), _was_tpr4(FALSE), _roundlit(0), _imponval(0.0), _imposval(0.0), _speseval(0.0), diff --git a/cg/cgpagame.h b/cg/cgpagame.h index 484610382..38d2d08d3 100755 --- a/cg/cgpagame.h +++ b/cg/cgpagame.h @@ -45,7 +45,7 @@ class TPagamento : public TObject real _imponlit; // imponibile da affettare in lire (se imp. in valuta) real _imposlit; // imposta da affettare in lire real _speselit; // spese da affettare in lire - real _cambio; // cambio valuta (TBZ?) +// real _cambio; // cambio valuta (TBZ?) bool _new; // non letto da database TString_array _rate; // rate medesime @@ -175,7 +175,7 @@ public: void set_roundval(int n) { _roundval = n; } bool in_valuta() const { return _in_valuta; } - const real& cambio() const { return _cambio; } +// const real& cambio() const { return _cambio; } // check consistency: returns word with errors flagged, 0 if ok word validate() const; diff --git a/cg/cgprassi.men b/cg/cgprassi.men index 76b190304..86181a955 100755 --- a/cg/cgprassi.men +++ b/cg/cgprassi.men @@ -106,11 +106,12 @@ Item_01 = "Parametri liquidazione", "cg5 -3", "F" Item_02 = "Liquidazione", "cg4 -2", "F" Item_03 = "Visualizzazione liquidazione", "cg5 -5", "F" Item_04 = "Riepilogo progressivi", "cg0 -3", "F" -Item_05 = "Stampa registri", "cg4 -3", "F" -Item_06 = "Liste fatture", [PRASSICG_026] -Item_07 = "Gestione acconti IVA", [PRASSICG_027] -Item_08 = "Gestione versamenti IVA", [PRASSICG_022] -Item_09 = "Gestione autotrasportatori", "cg4 -9", "F" +Item_05 = "Prospetto dich. IVA periodica", "cg5 -7", "F" +Item_06 = "Stampa registri", "cg4 -3", "F" +Item_07 = "Liste fatture", [PRASSICG_026] +Item_08 = "Gestione acconti IVA", [PRASSICG_027] +Item_09 = "Gestione versamenti IVA", [PRASSICG_022] +Item_10 = "Gestione autotrasportatori", "cg4 -9", "F" [PRASSICG_011] Caption = "Tabelle ministeriali" diff --git a/cg/cgsaldac.cpp b/cg/cgsaldac.cpp index db03f500c..7c12e4e9c 100755 --- a/cg/cgsaldac.cpp +++ b/cg/cgsaldac.cpp @@ -109,26 +109,25 @@ int TTree_rectype::remove(TBaseisamfile& f) const // Valuta /////////////////////////////////////////////////////////// -TValuta::TValuta(const char* cod, const TDate& dat, const real& cam, bool eur) -: _cod(cod), _dat(dat), _cam(cam), _eur(eur) +TValuta::TValuta(const char* cod, const TDate& dat, const real& cam, exchange_type eur) +: _cod(cod), _dat(dat), _cam(cam), _et(eur) { adjust(); } -TValuta::TValuta() : _cod(""), _dat(TODAY), _cam(ZERO), _eur(FALSE) +TValuta::TValuta() : _cod(""), _dat(TODAY), _cam(ZERO), _et(_exchange_undefined) { adjust(); } void TValuta::adjust() { - const TCurrency firm_cur(ZERO, "_FIRM"); - const TCurrency this_cur(ZERO, _cod, _eur); - if (this_cur.same_value_as(firm_cur)) + const TCurrency this_cur(ZERO, _cod, _cam, _et); + if (this_cur.is_firm_value()) { _cod.cut(0); _cam = ZERO; - _eur = FALSE; + _et = _exchange_undefined; } else { @@ -136,6 +135,8 @@ void TValuta::adjust() _cam = ZERO; _cod = this_cur.get_value(); } + if (_et == _exchange_undefined) + this_cur.get_change(_et); } int TValuta::compare(const TSortable& s) const @@ -150,9 +151,9 @@ void TValuta::get(const TRectype& rec) _dat = rec.get("DATACAM"); _cam = rec.get_real("CAMBIO"); if (rec.exist("CONTROEURO")) - _eur = rec.get_bool("CONTROEURO"); + _et = rec.get_bool("CONTROEURO") ? _exchange_contro : _exchange_base; else - _eur = FALSE; + _et = _exchange_undefined; adjust(); } @@ -163,6 +164,8 @@ void TValuta::put(TRectype& rec) const rec.zero("CODVAL"); rec.zero("DATACAM"); rec.zero("CAMBIO"); + if (rec.exist("CONTROEURO")) + rec.zero("CONTROEURO"); } else { @@ -170,7 +173,7 @@ void TValuta::put(TRectype& rec) const rec.put("DATACAM", _dat); rec.put("CAMBIO", _cam); if (rec.exist("CONTROEURO")) - rec.put("CONTROEURO", _eur); + rec.put("CONTROEURO", _et == _exchange_contro ? "X" : ""); } } @@ -190,7 +193,7 @@ void TValuta::set(TMask& m, short v, short d, short c, short e) const m.set(d, _dat.string()); m.set(c, _cam.string()); if (e && m.id2pos(e) >= 0) - m.set(e, _eur ? "X" : ""); + m.set(e, _et == _exchange_contro ? "X" : ""); } } @@ -200,9 +203,9 @@ void TValuta::get(const TMask& m, short v, short d, short c, short e) _dat = m.get(d); _cam = m.get_real(c); if (e && m.id2pos(e) >= 0) - _eur = m.get_bool(e); + _et = m.get_bool(e) ? _exchange_contro : _exchange_base; else - _eur = FALSE; + _et = _exchange_undefined; adjust(); } @@ -211,34 +214,34 @@ void TValuta::set(const TValuta& v) _cod = v._cod; _dat = v._dat; _cam = v._cam; - _eur = v._eur; + _et = v._et; } real TValuta::lit2val(const real& lit) const { - TCurrency cur(lit, "_FIRM"); - cur.change_value(_cod, _cam, _eur); + TCurrency cur(lit); + cur.change_value(_cod, _cam, _et); return cur.get_num(); } real TValuta::val2lit(const real& val) const { - TCurrency cur(val, _cod, _cam, _eur); + TCurrency cur(val, _cod, _cam, _et); cur.change_to_firm_val(); return cur.get_num(); } void TValuta::val2lit(real& val) const { - TCurrency cur(val, _cod, _cam, _eur); + TCurrency cur(val, _cod, _cam, _et); cur.change_to_firm_val(); val = cur.get_num(); } void TValuta::lit2val(real& lit) const { - TCurrency cur(lit, "_FIRM"); - cur.change_value(_cod, _cam, _eur); + TCurrency cur(lit); + cur.change_value(_cod, _cam, _et); lit = cur.get_num(); } @@ -314,7 +317,7 @@ bool TRiga_scadenze::chiusa(bool update) const // Calcola il totale dei pagamenti (eventualmente in valuta) TImporto TRiga_scadenze::importo_pagato(bool val, int mode) const { - CHECKD(mode > 0x0 && mode <= 0xF, "Bad importo_pagato mode ", mode); + CHECKD(mode > 0x0 && mode <= 0xFF, "Bad importo_pagato mode ", mode); const TPartita& game = partita(); const bool in_val = in_valuta(); const char* imp_field = (val && in_val) ? PAGSCA_IMPORTOVAL : PAGSCA_IMPORTO; @@ -333,16 +336,18 @@ TImporto TRiga_scadenze::importo_pagato(bool val, int mode) const if (mode & 0x2) // Voglio anche gli abbuoni { - real abb(pag.get_real(PAGSCA_ABBUONI)); - if (in_val && !val) // Gli abbuoni sono sempre in valuta e quindi - { // devono essere convertiti opportunamente -// abb *= sum.get_real(PART_CAMBIO); -// abb.round(); - TCurrency cur(abb, "_FIRM"); - cur *= sum.get_real(PART_CAMBIO); - abb = cur.get_num(); - } - totale += TImporto(sez, abb); + real abb = pag.get_real(PAGSCA_ABBUONI); + if (!abb.is_zero()) + { + if (in_val && !val) // Gli abbuoni sono sempre in valuta e quindi + { // devono essere convertiti opportunamente + const TExchange cmb(sum); + TCurrency cur(abb, cmb); + cur.change_to_firm_val(); + abb = cur.get_num(); + } + totale += TImporto(sez, abb); + } } if (in_val && !val && (mode & 0x4)) // Voglio anche le differenze cambio @@ -474,9 +479,10 @@ bool TRiga_scadenze::modifica_pagamento(const TRectype& new_pag, const TValuta& if (in_val) { const TString4 codval = sum.codice_valuta(); - const bool contro = ((TRectype&)sum).exist(PART_CONTROEURO) && sum.get_bool(PART_CONTROEURO); - TCurrency cur(old_abb.valore(), codval, - sum.get_real(PART_CAMBIO), contro); + exchange_type et = _exchange_undefined; + if (((TRectype&)sum).exist(PART_CONTROEURO)) + et = sum.get_bool(PART_CONTROEURO) ? _exchange_contro : _exchange_base; + TCurrency cur(old_abb.valore(), codval, sum.get_real(PART_CAMBIO), et); cur.change_to_firm_val(); old_abb.valore() = cur.get_num(); } @@ -495,9 +501,10 @@ bool TRiga_scadenze::modifica_pagamento(const TRectype& new_pag, const TValuta& if (in_valuta()) { const TString4 codval = sum.codice_valuta(); - const bool contro = ((TRectype&)sum).exist(PART_CONTROEURO) && sum.get_bool(PART_CONTROEURO); - TCurrency cur(new_abb.valore(), codval, - sum.get_real(PART_CAMBIO), contro); + exchange_type et = _exchange_undefined; + if (((TRectype&)sum).exist(PART_CONTROEURO)) + et = sum.get_bool(PART_CONTROEURO) ? _exchange_contro : _exchange_base; + TCurrency cur(new_abb.valore(), codval, sum.get_real(PART_CAMBIO), et); cur.change_to_firm_val(); new_abb.valore() = cur.get_num(); } @@ -940,7 +947,7 @@ char TPartita::allineamento_richiesto(char tipocf) { case 'C': all = _cli_align; break; case 'F': all = _for_align; break; - default : all = ' '; break; + default : all = 'L'; break; } return all; } diff --git a/cg/cgsaldac.h b/cg/cgsaldac.h index 213d4000d..eb6b032fa 100755 --- a/cg/cgsaldac.h +++ b/cg/cgsaldac.h @@ -1,6 +1,10 @@ #ifndef __CGSALDAC_H #define __CGSALDAC_H +#ifndef __CURRENCY_H +#include +#endif + #ifndef __RECARRAY_H #include #endif @@ -70,7 +74,7 @@ class TValuta : public TSortable TString4 _cod; TDate _dat; real _cam; - bool _eur; + exchange_type _et; protected: // TSortable virtual int compare(const TSortable& s) const; @@ -83,6 +87,7 @@ public: const TString& codice() const { return _cod; } const TDate& data() const { return _dat; } const real& cambio() const { return _cam; } + exchange_type tipo_cambio() const { return _et; } real lit2val(const real& lit) const; real val2lit(const real& val) const; @@ -103,7 +108,7 @@ public: const TValuta& operator =(const TValuta& v) { set(v); return *this; } TValuta(); - TValuta(const char* cod, const TDate& dat, const real& cam, bool eur = FALSE); + TValuta(const char* cod, const TDate& dat, const real& cam, exchange_type et = _exchange_undefined); TValuta(const TRectype& rec) { get(rec); } TValuta(const TMask& m, short v, short d, short c, short e = 0) { get(m, v, d, c, e); } TValuta(const TValuta& v) { set(v); } diff --git a/cg/f17.dir b/cg/f17.dir index d66d1703e..9a053c89d 100755 --- a/cg/f17.dir +++ b/cg/f17.dir @@ -1,3 +1,3 @@ 17 0 -$cfven|0|0|404|0|Clienti/Fornitori per vendite||| +$cfven|0|0|411|0|Clienti/Fornitori per vendite||| diff --git a/cg/f17.trr b/cg/f17.trr index 9c26be87f..0a6b3f751 100755 --- a/cg/f17.trr +++ b/cg/f17.trr @@ -1,5 +1,5 @@ 17 -70 +72 TIPOCF|1|1|0|Tipo liente, ornitore CODCF|3|6|0|Codice CODINDDOC|2|3|0|Codice indirizzo documenti @@ -70,5 +70,7 @@ ESPLA|4|6|2|Percentuale di esenzione CONAI plastica ESLEG|4|6|2|Percentuale di esenzione CONAI legno ESVET|4|6|2|Percentuale di esenzione CONAI vetro CONAIASS|8|1|0|Stampa contributo CONAI assolto +TIPODOCFAT|1|4|0|Tipo documento +CODCAUS|1|3|0|Causale Contabile 1 TIPOCF+CODCF| diff --git a/cg/f23.dir b/cg/f23.dir index 271186749..504315ba1 100755 --- a/cg/f23.dir +++ b/cg/f23.dir @@ -1,3 +1,3 @@ 23 0 -$mov|0|0|341|0|Movimenti di prima nota|NMOV|| +$mov|91|91|341|0|Movimenti di prima nota||| diff --git a/cg/f23.trr b/cg/f23.trr index 9dc9f526d..6c29b566b 100755 --- a/cg/f23.trr +++ b/cg/f23.trr @@ -18,20 +18,20 @@ PROTIVA|3|5|0|Numero di protocollo IVA UPROTIVA|3|5|0|Ultimo numero di protocollo IVA se diverso da PROTIVA CODVAL|1|3|0|Codice valuta DATACAM|5|8|0|Data del cambio -CAMBIO|4|15|5|Cambio della valuta +CAMBIO|4|15|6|Cambio della valuta REGST|8|1|0|Stampato su registro IVA STAMPATO|8|1|0|Stampato su giornale NUMGIO|3|7|0|Numero operazione sul giornale TIPO|1|1|0|Tipo liente o ornitore CODCF|3|6|0|Codice -TOTDOC|4|18|2|Totale documento +TOTDOC|4|18|3|Totale documento TOTDOCVAL|4|18|3|Totale documento in valuta -RITFIS|4|18|2|Ritenute fiscali -RITSOC|4|18|2|Ritenute sociali +RITFIS|4|18|3|Ritenute fiscali +RITSOC|4|18|3|Ritenute sociali PROVVIS|1|1|0|Tipo movimento (0 Normali, 1 Provvisori cancellabili, 2 Provvisori non cancellabili CODVALI|1|3|0|Codice valuta intra-comunitaria -CAMBIOI|4|15|5|Cambio della valuta intra-comunitaria -CORRLIRE|4|18|2|Corrispettivo in lire intra-comunitario +CAMBIOI|4|15|6|Cambio della valuta intra-comunitaria +CORRLIRE|4|18|3|Corrispettivo in lire intra-comunitario CORRVALUTA|4|18|3|Corrispettivo in valuta intra-comunitario OCFPI|1|16|0|Codice cliente / fornitore occasionale CODPAG|1|4|0|Codice pagamento diff --git a/cg/f24.trr b/cg/f24.trr index e3d5f71f4..e05ec49dd 100755 --- a/cg/f24.trr +++ b/cg/f24.trr @@ -15,7 +15,7 @@ TIPOCC|1|1|0|Tipo contropartita liente ornitore GRUPPOC|2|3|0|Gruppo contropartita CONTOC|2|3|0|Conto cotropartita SOTTOCONTC|3|6|0|Sottoconto o codice cliente /fornitore contropartita -IMPORTO|4|18|2| +IMPORTO|4|18|3| ROWTYPE|1|1|0| NUMGIO|3|7|0| 2 diff --git a/cg/f25.trr b/cg/f25.trr index c941df158..b6c86a071 100755 --- a/cg/f25.trr +++ b/cg/f25.trr @@ -4,8 +4,8 @@ ANNOES|2|4|0|Codice esercizio NUMREG|3|7|0|Numero operazione NUMRIG|2|3|0|Numero riga CODIVA|1|4|0|Codice IVA -IMPONIBILE|4|18|2|Imponibile -IMPOSTA|4|18|2|Imposta +IMPONIBILE|4|18|3|Imponibile +IMPOSTA|4|18|3|Imposta TIPODET|2|1|0|Tipo detrazione TIPOCR|2|1|0|Tipo costo ricavo INTRA|8|1|0|Riga intra-comunitaria diff --git a/cg/f28.trr b/cg/f28.trr index 0f0634f20..36f826cb6 100755 --- a/cg/f28.trr +++ b/cg/f28.trr @@ -17,24 +17,24 @@ REG|1|3|0|Codice Registro PROTIVA|3|5|0|Numero protocollo IVA CODCAUS|1|3|0|Codice causale SEZ|1|1|0|Sezione are vere -IMPORTO|4|18|2|Importo -IMPOSTA|4|18|2|IVA -SPESE|4|18|2|Spese +IMPORTO|4|18|3|Importo +IMPOSTA|4|18|3|IVA +SPESE|4|18|3|Spese CODVAL|1|3|0|Codice valuta -CAMBIO|4|15|5|Cambio della valuta +CAMBIO|4|15|6|Cambio della valuta IMPORTOVAL|4|18|3|Importo in valuta DATACAM|5|8|0|Data del cambio TIPOC|1|1|0|Tipo liente ornitore GRUPPO|2|3|0|Gruppo CONTO|2|3|0|Conto SOTTOCONTO|3|6|0|Sottoconto o codice cliente / fornitore -IMPTOTDOC|4|18|2|Importo totale documento +IMPTOTDOC|4|18|3|Importo totale documento IMPTOTVAL|4|18|3|Importo totale documento in valuta -RITENUTE|4|18|2|Ritenute fiscali sul pagamento +RITENUTE|4|18|3|Ritenute fiscali sul pagamento SEZABB|1|1|0|Sezione degli abbuoni ABBUONI|4|18|3|Abbuoni SEZDIFCAM|1|1|0|Sezione delle differenze cambi -DIFFCAM|4|18|2|Differenze cambi +DIFFCAM|4|18|3|Differenze cambi CHIUSA|8|1|0|Partita pareggiata (chiusa) RICARICATA|8|1|0|Partita ricaricata INVIATA|8|1|0|Partita inviata diff --git a/cg/f29.trr b/cg/f29.trr index 8e82dab3f..631c92107 100755 --- a/cg/f29.trr +++ b/cg/f29.trr @@ -8,7 +8,7 @@ DESCR|1|50|0|Descrizione CODPAG|1|4|0|Codice Pagamento TIPOPAG|2|1|0|Tipo pagamento ULTCLASS|1|1|0|Ulteriore classificazione -IMPORTO|4|18|2|Importo in lire +IMPORTO|4|18|3|Importo in lire IMPORTOVAL|4|18|3|Importo valuta DATASCAD|5|8|0|Data scadenza TIPOC|1|1|0|Tipo liente ornitore @@ -19,7 +19,7 @@ NSOLL|2|2|0|Numero sollecito DATASOLL|5|8|0|Data sollecito GGRIT|2|4|0|Giorni di ritardo PAGATA|8|1|0|Scadenza pagata -IMPORTOPAG|4|18|2|Importo pagato +IMPORTOPAG|4|18|3|Importo pagato CODABIPR|10|5|0|Codice ABI banca di presentazione CODCABPR|10|5|0|Codice CAB banca di presentazione CODABI|10|5|0|Codice ABI diff --git a/cg/f30.trr b/cg/f30.trr index 0824ea826..bd8cfdf0a 100755 --- a/cg/f30.trr +++ b/cg/f30.trr @@ -10,12 +10,12 @@ NRIGA|2|4|0|Numero riga fattura NRATA|2|4|0|Numero rata fattura NRIGP|2|4|0|Numero riga pagamento ACCSAL|1|1|0|cconto o aldo -IMPORTO|4|18|2|Importo pagato +IMPORTO|4|18|3|Importo pagato IMPORTOVAL|4|18|3|Importo in valuta PASSATT|1|1|0|Abbuono passivo o attivo ABBUONI|4|18|3|Abbuoni -DIFFCAM|4|18|2|Differenza cambio -RITENUTE|4|18|2|Ritenute +DIFFCAM|4|18|3|Differenza cambio +RITENUTE|4|18|3|Ritenute TIPOCC|1|1|0|Tipo conto di contropartita GRUPPOC|2|3|0|Gruppo di contropartita CONTOC|2|3|0|Conto di contropartita diff --git a/db/db0500.cpp b/db/db0500.cpp index 8f27e2d2e..6120760c9 100755 --- a/db/db0500.cpp +++ b/db/db0500.cpp @@ -54,7 +54,7 @@ class TDistinta_app : public TRelation_application TDistinta_mask* _themask; int _mode; - void parms2rel(const TMask& m); + bool parms2rel(const TMask& m); protected: virtual void init_insert_mode(TMask &); @@ -143,30 +143,48 @@ protected: public: const TToken_string& curr() const { return _curr; } - void restart_tree(); + bool restart_tree(); TQuery_mask(TDistinta_tree& tree); virtual ~TQuery_mask() { } }; -void TQuery_mask::restart_tree() +bool TQuery_mask::restart_tree() { - _tree.restart(); + if (!_tree.restart()) + return FALSE; int d =get_int(F_MIN_DEPTH); - d = (d == 0 ? 3 : d); - while (!_tree.is_leaf()) - { - if (_tree.is_cyclic()) - break; - _tree.expand(); - _tree.goto_firstson(); - if (_tree.has_rbrother() && _tree.curr_depth() >= d) - break; - } + int dir=1; // direzione di scorrimento albero + do { + while (dir == 1 && !_tree.is_leaf()) + { + if (_tree.is_cyclic()) + break; + _tree.expand(); + _tree.goto_firstson(); + if ((_tree.has_rbrother() || d != 0) && _tree.curr_depth() >= d) + { + _tree.goto_father(); + dir = -1; + break; + } + } + if (_tree.has_rbrother()) + { + _tree.goto_rbrother(); + dir = 1 ; + } + else + { + _tree.goto_father(); + dir = -1; + } + } while (_tree.curr_depth() > 0); TTree_field& tf = tfield(F_TREE); tf.win().update_thumb(0, 0); tf.win().force_update(); + return TRUE; } bool TQuery_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) @@ -253,6 +271,8 @@ bool TQuery_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) if (e == fe_button) { const TString oldcode = get(F_CODICE); + if (oldcode.blank()) + error_box("Selezionare un codice"); TLocalisamfile dist(LF_DIST); dist.put("CODDIST", oldcode); if (dist.read() == NOERR) @@ -263,6 +283,16 @@ bool TQuery_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) if (newcode.not_empty() && newcode != oldcode) { dist.put("CODDIST", newcode); + const TRectype & artrec = cache().get(LF_ANAMAG,newcode); + if (!artrec.empty()) + { + dist.put("DESCR",artrec.get("DESCR")); + } else { + dist.put("ARTPROD", " "); + const TRectype & lavrec = cache().get("LAV",newcode); + if (!lavrec.empty()) + dist.put("DESCR",lavrec.get("S0")); + } TString environment=dist.get("PARAMETRI"); const int err = dist.write(); if (err == NOERR) @@ -356,6 +386,8 @@ bool TQuery_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) } } break; + case F_VAR_CODMAG: + case F_VAR_CODDEP: case F_VAR_IMPIANTO: case F_VAR_LINEA: if (e == fe_modify || e == fe_init) @@ -365,14 +397,24 @@ bool TQuery_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) _tree.set_global("_IMPIANTO",o.get()); break; case F_VAR_LINEA: _tree.set_global("_LINEA",o.get()); break; + case F_VAR_CODMAG: + case F_VAR_CODDEP: + { + TString8 codmagdep; + add_magcode(codmagdep, get(F_VAR_CODMAG)); + add_depcode(codmagdep, get(F_VAR_CODDEP)); + _tree.set_global("_MAGDEP",codmagdep); + } + break; } redraw_tree(e); } break; + case F_MIN_DEPTH: case F_HIDE_GHOST: if (e == fe_modify || e == fe_init) { - const char ig=*o.get(); + const char ig=*get(F_HIDE_GHOST); _tree.set_ignore_ghost(ig > ' '); redraw_tree(e); } @@ -770,13 +812,15 @@ bool TDistinta_mask::on_distsheet_event(TOperable_field& o, TField_event e, long { if (expr.numvar() > 0) { - TDecoder var("VAR"); for (int v = expr.numvar()-1; v >= 0; v--) { const char* name = expr.varname(v); - if (var.decode(name).empty()) - if (!_tree.is_global(name)) + if (!_tree.is_global(name)) + { + const TRectype& var = cache().get("VAR", name); + if (var.empty()) return m.error_box("La variabile %s non e' definita in tabella", name); + } } } else @@ -815,19 +859,38 @@ bool TDistinta_mask::on_distsheet_event(TOperable_field& o, TField_event e, long bool TDistinta_mask::on_parmsheet_event(TOperable_field& o, TField_event e, long jolly) { + TSheet_field &sf = sfield(F_PARAMS); const short id = o.dlg(); switch (id) { case FV_PARAM: + if (sf.row(sf.selected())[0] == 'G' && (e == fe_modify || e == fe_close)) + { + const TString& var = o.get(); + if (!_tree.is_global(var)) + return error_box("La variabile %s non e' una delle variabili globali. Consultare la documentazione del modulo Distinta Base",(const char *)var); + } + break; + case FV_VALUE: if (e == fe_modify || e == fe_close) { - const TString& str = o.get(); - if (!isalpha(str[0]) && str[0] != '_') - return error_box("Il nome del parametro deve iniziare con un carattere alfabetico o con _"); - for (const char* s = str; *s; s++) + TString var; + sf.row(sf.selected()).get(1,var); + const TString& expr = o.get(); + TDistinta_expr e; + const TTypeexp exprtype = _tree.get_var_type(var); + if (!e.set(expr, exprtype)) + return FALSE; + + for (int v = e.numvar()-1; v >= 0; v--) { - if (!isalnum(*s) && *s != '_') - return error_box("Il nome del parametro puo' contenere solo caratteri alfanumerici o _"); + const char* name = e.varname(v); + if (!_tree.is_global(name)) + { + const TRectype& var = cache().get("VAR", name); + if (var.empty()) + return error_box("La variabile %s non e' definita in tabella", name); + } } } break; @@ -940,7 +1003,7 @@ bool TDistinta_mask::on_field_event(TOperable_field& o, TField_event e, long jol switch (jolly) { case 1 : return on_distsheet_event(o, e, jolly); - case 2 : return on_parmsheet_event(o, e, jolly); + case 3 : return on_parmsheet_event(o, e, jolly); default: break; } } @@ -1119,11 +1182,11 @@ int TDistinta_app::read(TMask& m) return err; } -void TDistinta_app::parms2rel(const TMask& m) +bool TDistinta_app::parms2rel(const TMask& m) { TToken_string memo(1024, '\n'); TSheet_field& parms = m.sfield(F_PARAMS); - TString var; + TString var,expr; FOR_EACH_SHEET_ROW(parms, r, row) { var = row->get(0); @@ -1131,20 +1194,22 @@ void TDistinta_app::parms2rel(const TMask& m) var = row->get(); if (!var.blank()) { - if (typ == 'G') - if (!_tree.is_global(var)) - error_box("La variabile %s non e' una delle variabili globali. Consultare la documentazione del modulo Distinta Base",(const char *)var); + expr = row->get(); + if (typ == 'G' && !_tree.is_global(var)) + error_box("La variabile %s non e' una delle variabili globali. Consultare la documentazione del modulo Distinta Base",(const char *)var); memo.add(var); memo << '='; - memo << row->get(); + memo << expr; } } _therel->curr().put("PARAMETRI", memo); // Azzera albero per rispecchiare eventuali modifiche _querymask->restart_tree(); + return TRUE; } + int TDistinta_app::write(const TMask& m) { parms2rel(m); diff --git a/db/db0500a.h b/db/db0500a.h index 347785623..d23226500 100755 --- a/db/db0500a.h +++ b/db/db0500a.h @@ -44,6 +44,8 @@ #define F_VAR_LIV3 556 #define F_VAR_LIV4 557 #define F_VAR_DATA 558 +#define F_VAR_CODMAG 559 +#define F_VAR_CODDEP 560 #define F_TIPOCOMP 101 diff --git a/db/db0500a.uml b/db/db0500a.uml index c30afb11b..c703177a0 100755 --- a/db/db0500a.uml +++ b/db/db0500a.uml @@ -126,10 +126,36 @@ BEGIN DEFAULT NONE END +STRING F_VAR_CODMAG 3 +BEGIN + FLAGS "U" + PROMPT 2 4 "Magazzino " + USE MAG SELECT CODTAB[4,5]="" + INPUT CODTAB F_VAR_CODMAG + DISPLAY "Magazzino" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_VAR_CODMAG CODTAB + CHECKTYPE FORCED +END +STRING F_VAR_CODDEP 2 +BEGIN + FLAGS "U" + PROMPT 22 4 "Deposito " + USE MAG + INPUT CODTAB[1,3] F_VAR_CODMAG + INPUT CODTAB[4,5] F_VAR_CODDEP + DISPLAY "Magazzino" CODTAB[1,3] + DISPLAY "Deposito" CODTAB[4,5] + DISPLAY "Descrizione@50" S0 + OUTPUT F_VAR_CODMAG CODTAB[1,3] + OUTPUT F_VAR_CODDEP CODTAB[4,5] + CHECKTYPE FORCED +END + STRING F_VAR_IMPIANTO 5 BEGIN FLAGS "UF" - PROMPT 2 4 "Impianto " + PROMPT 2 5 "Impianto " USE IMP INPUT CODTAB F_VAR_IMPIANTO DISPLAY "Codice " CODTAB @@ -142,7 +168,7 @@ END STRING F_VAR_LINEA 5 BEGIN FLAGS "UF" - PROMPT 20 4 "Linea " + PROMPT 22 5 "Linea " USE LNP INPUT CODTAB F_VAR_LINEA DISPLAY "Codice " CODTAB @@ -157,7 +183,7 @@ END STRING F_VAR_LIV1 10 BEGIN FLAGS "U" - PROMPT 2 5 "Livello 1" + PROMPT 2 6 "Livello 1 " USE GCG INPUT CODTAB[1] "1" INPUT CODTAB[2,20] F_VAR_LIV1 @@ -169,8 +195,8 @@ END STRING F_VAR_LIV2 6 BEGIN - FLAGS "U" - PROMPT 24 5 "Livello 2" + FLAGS "U" + PROMPT 25 6 "Livello 2" USE GCG INPUT CODTAB[1] "2" INPUT CODTAB[2,20] F_VAR_LIV2 @@ -183,7 +209,7 @@ END STRING F_VAR_LIV3 6 BEGIN FLAGS "U" - PROMPT 44 5 "Livello 3" + PROMPT 44 6 "Livello 3" USE GCG INPUT CODTAB[1] "3" INPUT CODTAB[2,20] F_VAR_LIV3 @@ -196,7 +222,7 @@ END STRING F_VAR_LIV4 6 BEGIN FLAGS "U" - PROMPT 64 5 "Livello 4" + PROMPT 64 6 "Livello 4" USE GCG INPUT CODTAB[1] "4" INPUT CODTAB[2,20] F_VAR_LIV4 @@ -208,7 +234,7 @@ END TREE F_TREE -3 -1 BEGIN - PROMPT 0 5 "" + PROMPT 0 7 "" END ENDPAGE diff --git a/db/db0500b.uml b/db/db0500b.uml index db2d94dff..b6c0b104c 100755 --- a/db/db0500b.uml +++ b/db/db0500b.uml @@ -308,7 +308,7 @@ END STRING F_CODLAV 20 BEGIN - PROMPT 2 2 "Codice " + PROMPT 2 2 "Codice " USE LAV INPUT CODTAB F_CODLAV DISPLAY "Codice@20" CODTAB @@ -321,7 +321,7 @@ END STRING F_CODDIS 20 BEGIN - PROMPT 2 2 "Codice " + PROMPT 2 2 "Codice " USE LF_DIST SELECT VIRTUALE=="X" INPUT CODDIST F_CODDIS DISPLAY "Codice@20" CODDIST @@ -334,7 +334,7 @@ END STRING F_CODVAR 20 BEGIN - PROMPT 2 2 "Codice " + PROMPT 2 2 "Codice " USE VAR INPUT CODTAB F_CODVAR DISPLAY "Codice@20" CODTAB @@ -614,28 +614,29 @@ LIST FV_TYPE 7 BEGIN PROMPT 1 1 "Variabile " ITEM " |utente" - MESSAGE SHOW,FV_USERVAR|HIDE,FV_PARAM + MESSAGE SHOW,FV_USERVAR|HIDE,FV_PARAM|"",FV_PARAM ITEM "G|globale" - MESSAGE HIDE,FV_USERVAR|SHOW,FV_PARAM + MESSAGE HIDE,FV_USERVAR|SHOW,FV_PARAM|"",FV_USERVAR END STRING FV_USERVAR 20 BEGIN PROMPT 22 1 "" USE VAR - INPUT CODTAB FV_PARAM + INPUT CODTAB FV_USERVAR DISPLAY "Codice@20" CODTAB DISPLAY "Numerico@B" B0 DISPLAY "Descrizione@50" S0 - OUTPUT FV_PARAM CODTAB OUTPUT FV_USERVAR CODTAB CHECKTYPE REQUIRED FLAGS "U" + WARNING "Variabile utente inesistente" END STRING FV_PARAM 20 BEGIN PROMPT 22 1 "" FLAGS "U" + WARNING "Variabile globale inesistente" END STRING FV_VALUE 120 55 diff --git a/db/db1100.cpp b/db/db1100.cpp index a04b70d0e..285c9f253 100755 --- a/db/db1100.cpp +++ b/db/db1100.cpp @@ -34,7 +34,7 @@ enum seltype { by_num, by_date }; enum expltype { mat_base, scalare}; -enum valtype { no_val, last_cost, average_cost, pond_cost, last2cost, std_cost, LIFO_annuale, LIFO_storico, FIFO_annuale, FIFO_storico }; +enum valtype { no_val, last_cost, average_cost, pond_cost, last2cost, std_cost, LIFO_annuale, LIFO_storico, FIFO_annuale, FIFO_storico ,prezzo_listino}; struct _ParmStruct { @@ -43,12 +43,16 @@ struct _ParmStruct valtype _valorization; TExplosion_grouping _group_by; TString_array _numerazioni; - TString16 _anno_es, _from_num, _to_num, _sl_mag, _mb_mag; // Ma perche'... + TString16 _anno_es, _catven, _codlist, _from_num, _to_num, _sl_mag, _mb_mag; // Ma perche'... TDate _from_date, _to_date, _obs_date; long _from_doc, _to_doc; int _year, _periods, _det_lev, _ordering; - bool _last_qta, _vis_art, _vis_lav, _vis_vir, _vis_gho, _fabbisogno, - _val_magmb, _val_depmb, _cfr_scmin, _separate_dists, _det_ord_for; + bool _last_qta, + _vis_art, _vis_lav, _vis_vir, _vis_gho, + _fabbisogno, _no_fabbis_fin, + _val_magmb, _val_depmb, _newpage, _det_ord_for, + _separate_dist, _separate_giac; + char _liv_attenzione; }; struct _CallBackStruct @@ -58,7 +62,9 @@ struct _CallBackStruct }; static TString __key; +static TDate __last_period; static TDate __current_period; +static TString __current_art; /////////////////////////////////////////////////////////// // TArticolo_giacenza_static @@ -127,39 +133,46 @@ class TRiga_esplosione2print : public TRiga_esplosione { real _fabbisogno; real _disponibilita; - real _qta2order; real _value; + real _qta2order; real _residuo; real _ordfor; real _totordfor; + TDate _dtacons; + TString _codmag; public: + const TString &mag() { return _codmag ;} + void set_datacons(const TDate& d) { _dtacons = d; } + const TDate & datacons() { return _dtacons; } const real& fabbisogno() { return _fabbisogno; } const real& disponibilita() { return _disponibilita; } - const real& qta2order() { return _qta2order; } const real& value() { return _value; } + const real& qta2order() { return _qta2order; } const real& residuo() { return _residuo; } const real& ordfor() { return _ordfor; } const real& totordfor() { return _totordfor; } - void set_fabbisogno(const real& r) { _fabbisogno = r; } - void set_disponibilita(const real& r) { _disponibilita = r; } - void set_qta2order(const real& r) { _qta2order = r; } + void set_mag(const char *s) { _codmag = s; } + void set_fabbisogno(const real& r) { _fabbisogno = r; } + void set_disponibilita(const real& r) { _disponibilita = r; } void set_value(const real& r) { _value = r; } - void set_residuo(const real& r) { _residuo = r; } + void set_residuo(const real& r) { _residuo = r; } + void set_qta2order(const real& r) { _qta2order = r; } void set_ordfor(const real& r) { _ordfor = r; } void set_totordfor(const real& r) { _totordfor = r; } TRiga_esplosione2print() {}; - TRiga_esplosione2print(const TDistinta_tree& tree); - TRiga_esplosione2print(const TRiga_esplosione& re); + TRiga_esplosione2print(const TDistinta_tree& tree, const char *codmag); + TRiga_esplosione2print(const TRiga_esplosione& re, const char *codmag); ~TRiga_esplosione2print() {}; }; -TRiga_esplosione2print::TRiga_esplosione2print(const TDistinta_tree& tree) - : TRiga_esplosione(tree) + +TRiga_esplosione2print::TRiga_esplosione2print(const TDistinta_tree& tree, const char *codmag) + : TRiga_esplosione(tree), _codmag(codmag) { } -TRiga_esplosione2print::TRiga_esplosione2print(const TRiga_esplosione& re) - : TRiga_esplosione(re) +TRiga_esplosione2print::TRiga_esplosione2print(const TRiga_esplosione& re, const char *codmag) + : TRiga_esplosione(re), _codmag(codmag) { } @@ -211,7 +224,8 @@ class TExplode_distinta_form : public TForm TArticolo_cache _art_cache; // Cache di articoli con disponibilita TArray _exploded_tree; // Righe di eplosione TAssoc_array _valori; // Righe dei valori dei nodi e delle foglie - TAssoc_array _residui; // Righe dei residui (solo semilavorati/nodi) + TAssoc_array _prodorder; // Righe dei residui (solo semilavorati/nodi) + TAssoc_array _disponib; // Righe dei residui (solo semilavorati/nodi) _Dist2Explode *_d; // Distinta corrente da esplodere _ParmStruct *_p; // Struttura dei parametri int _curr_row; // Riga corrente della distinta esplosa da stampare @@ -226,9 +240,11 @@ protected: real res2produce_by_father(TRiga_esplosione& re); public: + void print_explosion_rows(); + void reset_rows(); void set_distinta(_Dist2Explode* dd) { _d = dd; } void set_parameters(_ParmStruct* ps); - void print(); + void explode_and_print(); void reset_cache() { _art_cache.destroy(); } TExplode_distinta_form(const char *); virtual ~TExplode_distinta_form(); @@ -301,7 +317,9 @@ static real valorizza(const TRiga_esplosione& re, const _CallBackStruct* c) case 'A': { TArticolo_giacenza art(dis); - TString& annoes = pp->_anno_es; + TString& annoes = pp->_anno_es; + TString& catven = pp->_catven; + TString& codlist = pp->_codlist; TString16 codmag; if (pp->_val_magmb) // Se non c'e' _val_magmb non c'e' nemmeno _val_depmb @@ -322,6 +340,7 @@ static real valorizza(const TRiga_esplosione& re, const _CallBackStruct* c) case FIFO_annuale: total = art.FIFO_annuale(annoes, codmag, liv); break; case LIFO_storico: total = art.LIFO(annoes, codmag, liv); break; case FIFO_storico: total = art.FIFO(annoes, codmag, liv); break; + case prezzo_listino: total = art.prezzo_listino(annoes, catven, codlist); break; default: NFCHECK("Tipo valorizzazione errato: %d", pp->_valorization); } } @@ -658,7 +677,7 @@ bool TExplode_distinta_form::validate(TForm_item &f, TToken_string &t) if (code == "_COD") { - if (_curr_row == DIST_HEAD) + if (re.livello() == 0) valore = "@B"; valore << re.articolo(); } @@ -696,18 +715,25 @@ bool TExplode_distinta_form::validate(TForm_item &f, TToken_string &t) default: break; } + if (livelli_giacenza().enabled()) + { + TString lv = re.giacenza(); + for (int l = livelli_giacenza().last_level(); l > 0 ; l--) + lv.insert(" ",livelli_giacenza().packed_length(l)); + valore.insert(lv); + } } else if (code == "_LIV") { - if (re.livello() > 0) + if (_p->_separate_dist && re.livello() > 0) valore << re.livello(); } else if (code == "_DCO") { - if (_curr_row == DIST_HEAD) - valore = _d->datacons(); + //if (re.articolo() == _d->cod()) + valore = re.datacons(); } else if (code == "_UM") @@ -761,17 +787,35 @@ real TExplode_distinta_form::res2produce_by_father(TRiga_esplosione& re) r = _d->qta(); // ritorna la qta della distinta come residuo da produrre else { - // Se sta esaminando la riga della "radice" - // ritorna la qta richiesta, altrimenti se si tratta di esplosione ai mat.base - // ritorna il residuo da produrre per la distinta "radice". - // Se l'esplosione e' scalare ritorna il residuo del padre di questo nodo. + // Se sta esaminando la riga della "radice"ritorna la qta richiesta, altrimenti : + // per esplosione ai mat.base, ritorna il residuo da produrre per la distinta "radice"; + // per l'esplosione e' scalare ritorna il residuo del padre di questo nodo. if (re.livello() == 0) r = _d->qta(); else { - TToken_string& tt = (TToken_string&) re.path(); - real * rs = (real*) _residui.objptr(_p->_explosion == mat_base ? tt.get(0) : re.father()); + TString fi; + if (_p->_vis_art) fi << 'A'; + if (_p->_vis_lav) fi << 'L'; + if (_p->_vis_vir) fi << 'V'; + if (_p->_vis_gho) fi << 'G'; + TToken_string pstr; + if (_p->_explosion == mat_base) + re.path().get(0, pstr); + else + pstr = re.father(fi); + + TString codmag = _distinta.path_depth(pstr) < 1 ? (TString &)_d->mag() : (TString &)_p->_sl_mag; + if (codmag.blank()) codmag = _d->mag(); + + TString g; + TCodice_articolo a; + _distinta.path_code(a, pstr); + _distinta.path_giaclev(g, 0, pstr); + TToken_string key; + key.format("%-20s|%-15s|%-5s", (const char*)a, (const char*)g, (const char*)codmag); + real * rs = (real*) _prodorder.objptr(key); r = rs != NULL ? *rs : ZERO; // Se er padre non ha residui... smette de fatica' } } @@ -783,12 +827,22 @@ void TExplode_distinta_form::set_explosion_rows(TArray& exp_array) const int rows = exp_array.items(); real r; TString k; - for (int i = 0; i < rows; i++) { TRiga_esplosione& re = (TRiga_esplosione&) exp_array[i]; const char tipo = re.tipo(); const bool is_head = i == DIST_HEAD; + + // Se si tratta dell'articolo distinta da esplodere, calcola la disponibilita' + // prendendo il magazzino indicato sulla riga stessa + // Se invece e' un componente, prende cio' che e' stato indicato dall'utente per quanto + // riguarda se e' materiale di base o semilavorato + // Il livello di giacenza lo si prende dall'articolo distinta da esplodere + // oppure dalla riga esplosione se non stiamo stampando la testata della distinta + // il cod. esercizio e' calc. come sempre + TString codmag = is_head ? _d->mag() : re.mat_base() ? (const TString&)_p->_mb_mag : (const TString&)_p->_sl_mag; + if (codmag.blank()) codmag = _d->mag(); + const TString& liv = is_head ? _d->liv() : re.giacenza(); // Il fabbisogno e': nr. componenti di questo articolo per residuo da produrre del padre //r = re.val() * _d->qta(); // In UM locale... @@ -797,25 +851,28 @@ void TExplode_distinta_form::set_explosion_rows(TArray& exp_array) if (r == ZERO) continue; // Don't store in _exploded_tree if there's no need - TRiga_esplosione2print* r2p = new TRiga_esplosione2print(re); - r2p->set_fabbisogno(r); - - if (tipo != 'A') // Distinte Virtuali e Lavorazioni non hanno disponibilita', quindi sono sempre da produrre - { - r2p->set_qta2order(r); - if (tipo == 'V') - _residui.add(re.path(), r); // Memorizza nei residui... + TRiga_esplosione2print* r2p = NULL; + int pos = -1; + if (!_p->_separate_dist) + { + for (pos = _exploded_tree.items()-1; pos>=0; pos--) + { + r2p = (TRiga_esplosione2print *)_exploded_tree.objptr(pos); + if (re.articolo() == r2p->articolo() && + re.um() == r2p->um() && + (re.giacenza() == r2p->giacenza()) && + codmag == r2p->mag()) + break; + } } - - // Se si tratta dell'articolo distinta da esplodere, calcola la disponibilita' - // prendendo il magazzino indicato sulla riga stessa - // Se invece e' un componente, prende cio' che e' stato indicato dall'utente per quanto - // riguarda se e' materiale di base o semilavorato - // Il livello di giacenza lo si prende dall'articolo distinta da esplodere - // oppure dalla riga esplosione se non stiamo stampando la testata della distinta - // il cod. esercizio e' calc. come sempre - const TString& codmag = is_head ? _d->mag() : re.mat_base() ? (const TString&)_p->_mb_mag : (const TString&)_p->_sl_mag; - const TString& liv = is_head ? _d->liv() : re.giacenza(); + + if (pos <0) + { + r2p = new TRiga_esplosione2print(re, codmag); + _exploded_tree.add(r2p,pos); + } + + r2p->set_fabbisogno(r + r2p->fabbisogno()); // Compone la chiave da cercare nella cache: CODART|CODMAG|LIVELLO // ovvio che tutti i campi debbono essre paddati alla loro massima lunghezza @@ -824,48 +881,67 @@ void TExplode_distinta_form::set_explosion_rows(TArray& exp_array) __key.format("%-20s|%-15s|%-5s", (const char*)re.articolo(), (const char*) liv, (const char*) codmag); TArticolo_giacenza_static& aaa = _art_cache.art(__key); - if (tipo == 'A') // Disponibilita, qta da ordinare e residuo vengono calcolati solo per le righe Articolo - { - // Si ricorda che la disponibilita' e' calcolata in UM base!! - // Quindi e' opportuno effettuare la conversione nell'unita' di misura - // del presente articolo.... - - const real zero_ref = _p->_cfr_scmin ? aaa.get_scmin(_p->_anno_es, codmag, liv) : ZERO; - real& disp = aaa.static_disp(_p, codmag, liv); - - // Converte in UM della riga corrente - r = aaa.convert_to_um(disp, re.um()); - r2p->set_disponibilita(r); - - // Riconverto la qta di fabbisogno in UM base per aggiornare - // la disponibilita. - // cfr. _d->_acq_ven - - //r = re.convert_in_base() * _d->qta(); // Fabbisogno unitario in UM base - - r = r2p->fabbisogno() * re.conv(); // Sempre in UM base... - - // Mmmmmmmhhhhhhh... - if (_d->acqven()) - disp += r; - else - disp -= r; + // Si ricorda che la disponibilita' e' calcolata in UM base!! + // Quindi e' opportuno effettuare la conversione nell'unita' di misura + // del presente articolo.... + const bool is_new = _prodorder.objptr(__key)==NULL; + real sottostock = is_new ? ZERO : (real &)_prodorder[__key] ; + if (tipo != 'A') + { + // Distinte Virtuali e Lavorazioni non hanno disponibilita', quindi sono sempre da produrre - if (disp < zero_ref) + r2p->set_disponibilita(ZERO); + r2p->set_residuo(ZERO); + if (tipo == 'V') { - r = zero_ref - disp; - const real cv = aaa.convert_to_um(r, re.um()); // In UM locale... - r2p->set_qta2order(cv); - if (!re.mat_base()) - _residui.add(re.path(), cv); + TQuantita q (r2p->articolo(), r2p->um(), r2p->fabbisogno()); + q.convert2umbase(); + q += sottostock; + _prodorder.add(__key, q.val(), TRUE); // Memorizza nei residui... } - - if (disp > zero_ref) + } else { + // Disponibilita, qta da ordinare e residuo vengono calcolati solo per le righe Articolo + + real zero_ref(_p->_liv_attenzione == 'S' ? aaa.get_scmin(_p->_anno_es, codmag, liv) : ZERO); + zero_ref = aaa.convert_to_um(zero_ref, re.um()); + + real qta2order,disponib; + if (is_new) { - r = disp - zero_ref; - r2p->set_residuo(aaa.convert_to_um(r, re.um())); // In UM locale... - } + if (re.livello()==0 && _p->_no_fabbis_fin) + disponib = ZERO; + else + disponib = aaa.static_disp(_p, codmag, liv); + r2p->set_disponibilita(disponib); + } else + disponib = (real &)_disponib[__key]; + disponib -= sottostock; + // Converte in UM della riga attuale + disponib = aaa.convert_to_um(disponib, re.um()); + + if (_d->acqven()) + disponib += r; + else + disponib -= r; + if (disponib > zero_ref) + { + disponib -= zero_ref; + qta2order = ZERO; + } else { + qta2order = zero_ref - disponib; + disponib = ZERO; + } + r2p->set_residuo(disponib); + r2p->set_qta2order(qta2order); + + // Ri-Converte in UM base per aggiornare gli Assocarray + disponib = aaa.convert_to_um(disponib, ""); + qta2order = aaa.convert_to_um(qta2order, ""); + _disponib.add (__key, disponib, TRUE); + _prodorder.add(__key, qta2order, TRUE); + + if (_p->_det_ord_for) { real of; @@ -878,9 +954,6 @@ void TExplode_distinta_form::set_explosion_rows(TArray& exp_array) of = aaa.convert_to_um(of, re.um()); r2p->set_totordfor(of); // Ordinato fornitori totale espresso in UM esplicitata dalla riga esplosione } - - if (disp < zero_ref) // Se la disponibilita' va sotto il riferimento... azzera - disp = zero_ref; } // Il valore lo calcola per qualsiasi tipo riga @@ -910,17 +983,29 @@ void TExplode_distinta_form::set_explosion_rows(TArray& exp_array) r *= qta; r2p->set_value(r); } - _exploded_tree.add(r2p); + + if (is_head) + r2p->set_datacons(_d->datacons()); } } -void TExplode_distinta_form::print() +void TExplode_distinta_form::reset_rows() +{ + _exploded_tree.destroy(); + _valori.destroy(); + _prodorder.destroy(); + _disponib.destroy(); +} + +void TExplode_distinta_form::explode_and_print() { // Explode & deflagrate... - if (!_distinta.set_root(_d->cod(), _d->um())) + if (!_distinta.set_root(_d->cod(), _d->um(), 1.0, _d->liv())) return; + TWait_cursor clepsy; + // Inizializza lo sfondo delle pagine normali se no col piffero che stampa la fincatura... set_background(3, TRUE); _distinta.restart(); @@ -930,10 +1015,14 @@ void TExplode_distinta_form::print() TPrintrow p; TString16 fi; - // Reset... - _exploded_tree.destroy(); - _valori.destroy(); - _residui.destroy(); + // Reset delle righe in caso di dist separate o cambio periodo + if (_p->_separate_dist + || (_p->_separate_giac && _d->cod() != __current_art) + || (__current_period.ok() && _d->data_per() > __current_period)) + print_explosion_rows(); + + __current_art = _d->cod(); + __current_period = _d->data_per(); if (_p->_vis_art) fi << 'A'; if (_p->_vis_lav) fi << 'L'; @@ -955,7 +1044,7 @@ void TExplode_distinta_form::print() // Dog programming on... setter._p = _p; // setter._a = &_valori; // - _distinta.set_root(_d->cod()); + _distinta.set_root(_d->cod(), "", 1.0, _d->liv()); _distinta.scan_depth_first(valorizza_nodo, &setter); } @@ -963,50 +1052,82 @@ void TExplode_distinta_form::print() // vero (_exploded_tree) con le TRiga_esplosione2print necessarie // ed i valori corretti (fabbisogno, disponibilita, residuo, da ordinare e valore) set_explosion_rows(explosion_array); - - const int righe = _exploded_tree.items(); - - TPrint_section& body = section('B'); - TPrinter& pr = printer(); - - // Setta pure la data sul form item di testa... - // Se e' cambiato il periodo effettua un form feed di separazione - TPrint_section& head = section('H'); - head.find_field(4).set(_d->data_per()); - - // Ad ogni cambio periodo effettua un formfeed... - // Be careful: evitare di stampare doppio form feed di separazione in caso - // di Separa distinte e cambio periodo contemporaneamente - if (!_p->_separate_dists && __current_period.ok() && _d->data_per() > __current_period) - pr.formfeed(); - - __current_period = _d->data_per(); - - set_last_page(FALSE); - - // This is GoodStuff... browse all rows & print'em - for (_curr_row=0; _curr_row_separate_dists) - pr.formfeed(); - else // Altrimenti aggiunge una riga mezza ciucciata... - pr.print(p); } else - error_box("Impossibile leggere l'albero relativo alla distinta %s. Controllarne la definizione.", (const char*) _d->cod()); + error_box("Impossibile posizionare l'albero"); +} + +compare_print_rows(const TObject** o1, const TObject** o2) +{ + TRiga_esplosione2print & r1 =(TRiga_esplosione2print &)(**o1); + TRiga_esplosione2print & r2 =(TRiga_esplosione2print &)(**o2); + const int l1 = r1.livello(); + const int l2 = r2.livello(); + int diff = 0; + if (l1 == 0 || l2 == 0) + diff = l1 - l2; + if (diff == 0) + diff = r1.articolo().compare(r2.articolo()); + if (diff == 0) + diff = r1.giacenza().compare(r2.giacenza()); + return diff ; +} + +void TExplode_distinta_form::print_explosion_rows() +{ + const int righe = _exploded_tree.items(); + if (righe <= 0) + return; + if (!_p->_separate_dist) + _exploded_tree.sort(compare_print_rows); + // Inizializza lo sfondo delle pagine normali se no col piffero che stampa la fincatura... + set_background(3, TRUE); + + TArray explosion_array; + TPrintrow p; + TString16 fi; + + TPrint_section& body = section('B'); + TPrinter& pr = printer(); + + // Setta pure la data sul form item di testa... + // Se e' cambiato il periodo effettua un form feed di separazione + TPrint_section& head = section('H'); + head.find_field(4).set(_d->data_per()); + + // Ad ogni cambio periodo effettua un formfeed... + // Be careful: evitare di stampare doppio form feed di separazione in caso + // di Separa distinte e cambio periodo contemporaneamente + if (!_p->_newpage && __last_period.ok() && __last_period < __current_period) + pr.formfeed(); + + __last_period = __current_period; + + set_last_page(FALSE); + + // This is GoodStuff... browse all rows & print'em + for (_curr_row=0; _curr_row_newpage) + pr.formfeed(); + else // Altrimenti aggiunge una riga mezza ciucciata... + pr.print(p); + + // Reset delle righe in caso di dist separate o cambio periodo + reset_rows(); return ; } @@ -1020,16 +1141,17 @@ void TExplode_distinta_form::print() TRiga_esplosione * _Dist2Explode::head_obj() { - TQuantita qta(_cod, _um, 1.00); + TQuantita qta(_cod, _um, real(1.00)); TDistinta_tree tree; - tree.set_root(qta); + tree.set_root(qta, liv()); TRiga_esplosione * re = new TRiga_esplosione(tree); - re->set(_cod, _um, real(1.00)); - re->set_tipo('A'); // La testata e' cmq un articolo... - re->set_path(_cod); + //re->set(_cod, _um, real(1.00)); + //re->set_tipo('A'); // La testata e' cmq un articolo... + //re->set_path(_cod); + //re->set_giacenza(liv()); return re; } @@ -1094,7 +1216,8 @@ const int TEsplosione_distinta_app::date2period(const TDate& d) const int items = _date_array.items(); for (int i = 0; ifield(F_SHEETART); sa.sheet_mask().set_handler(F_QTA, check_articoli); @@ -1171,6 +1295,9 @@ bool TEsplosione_distinta_app::create() _mask->set(F_ARTICOLI, "X"); _mask->set(F_LAVORAZIONI, "X"); _mask->set(F_VIRTUALI, "X"); + if (!livelli_giacenza().enabled()) //TBI + _mask->hide(F_SEPARATE_GIAC); + _form = new TExplode_distinta_form("db1100a"); _liv_giac = new TCodgiac_livelli; _liv_giac->set_sheetcolumn(sa, F_LIV1, 1); @@ -1180,7 +1307,11 @@ bool TEsplosione_distinta_app::create() TConfig conf(CONFIG_DITTA, "mg"); const bool depositi = conf.get_bool("GESDEPOSITI"); sa.enable_column(F_DEP-F_CODDIS,depositi); - _mask->show(-5, depositi); + _mask->show(-G_DEPOSITI, depositi); + const bool listini = conf.get_bool("GES", "ve", 1); + _mask->enable(-G_LISTINO, listini); + _mask->enable(F_CATVEN_LIST, listini && conf.get_bool("GESLISCV", "ve")); + _doc = new TDocumento; //Compila la lista di codici numerazione validi per la ricerca dell'ordinato fornitori @@ -1360,7 +1491,7 @@ void TEsplosione_distinta_app::print() TString chiave; TString_array chiavi; _dist_list.get_keys(chiavi); - chiavi.sort(); + chiavi.sort(); // sort by : period+codart+livgiac+... const int items = chiavi.items(); if (items == 0) @@ -1390,17 +1521,19 @@ void TEsplosione_distinta_app::print() // Ciclo per distinta: tutte quelle dei documenti indicati // E tutte quelle indicate singolarmente nello spreadsheet dell'articolo // Stampa esplosione distinta, nell'ordine specificato: periodo+codice+livello+um+mag - __current_period = 0L; + __current_period = __last_period = 0L; + _form->reset_rows(); for (int i = 0 ; iset_distinta((_Dist2Explode*)_dist_list.objptr(chiave)); // Setta la distinta corrente - _form->print(); // Esplode & Stampa sta distinta + _form->explode_and_print(); // Esplode & Stampa sta distinta } - // Formfeed finale solo in caso non sia stata indicata la - // separazione delle esplosioni (altrimenti ne fa 2...) - if (!_parameters._separate_dists) + _form->print_explosion_rows(); + // Formfeed finale solo in caso non sia stata indicata la + // separazione delle esplosioni (altrimenti ne fa 2...) + if (!_parameters._newpage) pr.formfeed(); pr.close(); } @@ -1443,13 +1576,16 @@ void TEsplosione_distinta_app::main_loop() _parameters._vis_lav = _mask->get_bool(F_LAVORAZIONI); _parameters._vis_gho = _mask->get_bool(F_GHOST); _parameters._fabbisogno= _mask->get_bool(F_FABBISOGNO); + _parameters._no_fabbis_fin= _mask->get_bool(F_FABBISOGNO_FIN); _parameters._sl_mag = _mask->get(F_SLMAG); _parameters._sl_mag << _mask->get(F_SLDEP); _parameters._mb_mag = _mask->get(F_MBMAG); _parameters._mb_mag << _mask->get(F_MBDEP); _parameters._val_magmb = _mask->get_bool(F_VALMAGMB); _parameters._val_depmb = _mask->get_bool(F_VALDEPMB); - _parameters._cfr_scmin = _mask->get_bool(F_SCMIN); - _parameters._separate_dists = _mask->get_bool(F_SEPARATE); + _parameters._liv_attenzione = _mask->get(F_LIVATTENZ)[0]; + _parameters._newpage = _mask->get_bool(F_NEWPAGE); _parameters._det_ord_for = _mask->get_bool(F_DETORDFOR); + _parameters._separate_dist = _mask->get_bool(F_SEPARATE_DIST); + _parameters._separate_giac = _mask->get_bool(F_SEPARATE_GIAC); // Credo che il seguente anno esercizio sia calcolato // in modo abbastanza schifoso, visto che si e' in possesso del solo anno solare @@ -1458,6 +1594,8 @@ void TEsplosione_distinta_app::main_loop() d.set_year(_parameters._year); TEsercizi_contabili esc; _parameters._anno_es.format("%04d",esc.date2esc(d)); + _parameters._catven=_mask->get(F_CATVEN_LIST); + _parameters._codlist=_mask->get(F_CODLIST); // Compila la lista di testate termo-nucleare-globale // delle distinte da esplodere nell'universo conosciuto diff --git a/db/db1100a.frm b/db/db1100a.frm index 36a02051c..7f5c86d08 100755 --- a/db/db1100a.frm +++ b/db/db1100a.frm @@ -48,7 +48,7 @@ END END //HEADER -SECTION BODY ODD 2 COLUMNWISE +SECTION BODY ODD 1 COLUMNWISE STRING 1 20 BEGIN @@ -67,7 +67,7 @@ BEGIN SPECIAL STRINGA FINCATURA " X" "Fincatura sinistra e destra" KEY "Descrizione" MESSAGE _DISTINTA,_DES - PROMPT 2 1 "" + PROMPT 6 1 "" END DATA 3 10 @@ -77,7 +77,7 @@ BEGIN SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" KEY "Data consegna" MESSAGE _DISTINTA,_DCO - PROMPT 3 1 "" + PROMPT 7 1 "" END NUMERO 4 4 @@ -86,7 +86,7 @@ BEGIN SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" KEY "Livello riga distinta" - PROMPT 4 1 "" + PROMPT 8 1 "" MESSAGE _DISTINTA,_LIV END @@ -96,7 +96,7 @@ BEGIN SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" KEY "Unita' di misura" - PROMPT 5 1 "" + PROMPT 9 1 "" MESSAGE _DISTINTA,_UM END @@ -106,7 +106,7 @@ BEGIN SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" KEY "Fabbisogno" - PROMPT 6 1 "" + PROMPT 10 1 "" MESSAGE _DISTINTA,_FAB PICTURE "########,@@@@@" END @@ -117,7 +117,7 @@ BEGIN SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" KEY "Disponibilita'" - PROMPT 7 1 "" + PROMPT 11 1 "" MESSAGE _DISTINTA,_DIS PICTURE "########,@@@@@" END @@ -128,7 +128,7 @@ BEGIN SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" KEY "Fabbisogno da ordinare/produrre" - PROMPT 8 1 "" + PROMPT 12 1 "" MESSAGE _DISTINTA,_ORDPROD PICTURE "########,@@@@@" END @@ -139,7 +139,7 @@ BEGIN SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" KEY "Disponibilita' residua" - PROMPT 9 1 "" + PROMPT 13 1 "" MESSAGE _DISTINTA,_RESIDUO PICTURE "########,@@@@@" END @@ -150,7 +150,7 @@ BEGIN SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" KEY "Valore" - PROMPT 10 1 "" + PROMPT 14 1 "" MESSAGE _DISTINTA,_VALORE PICTURE "." END @@ -161,7 +161,7 @@ BEGIN SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" KEY "Ordinato fornitori alla data" - PROMPT 11 1 "" + PROMPT 15 1 "" MESSAGE _DISTINTA,_ORDFOR PICTURE "########,@@@@@" END @@ -172,7 +172,7 @@ BEGIN SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" KEY "Totale ordinato fornitori" - PROMPT 12 1 "" + PROMPT 16 1 "" MESSAGE _DISTINTA,_TOTORDFOR PICTURE "########,@@@@@" END diff --git a/db/db1100a.h b/db/db1100a.h index b6bde7b6e..00ac52740 100755 --- a/db/db1100a.h +++ b/db/db1100a.h @@ -28,10 +28,19 @@ #define F_MBDEP 126 #define F_VALMAGMB 127 #define F_VALDEPMB 128 -#define F_SCMIN 129 -#define F_SEPARATE 130 +#define F_LIVATTENZ 129 +#define F_NEWPAGE 130 #define F_SHEETART 131 #define F_DETORDFOR 132 +#define F_SEPARATE_DIST 133 +#define F_SEPARATE_GIAC 134 +#define F_FABBISOGNO_FIN 135 +#define F_ORCLI4DISP 136 +#define F_ORFOR4DISP 137 +#define F_INPRF4DISP 138 +#define F_INPRC4DISP 139 +#define F_CATVEN_LIST 140 +#define F_CODLIST 141 #define F_CODDIS 101 #define F_LIV1 102 @@ -48,3 +57,7 @@ #define GR_NUMDOC 1 #define GR_DATADOC 2 +#define G_DISPONIB 4 +#define G_DEPOSITI 5 +#define G_VALORIZZ 7 +#define G_LISTINO 8 diff --git a/db/db1100a.uml b/db/db1100a.uml index 3915649c3..14de95da1 100755 --- a/db/db1100a.uml +++ b/db/db1100a.uml @@ -1,6 +1,12 @@ #include "db1100a.h" -TOOLBAR "" 0 20 0 3 +TOOLBAR "" 0 -3 -1 3 +STRING DLG_PROFILE 70 50 +BEGIN + FLAGS "G" + PROMPT 10 -3 "Profilo " + PSELECT +END BUTTON DLG_PRINT 10 2 BEGIN @@ -14,39 +20,30 @@ END ENDPAGE -PAGE "Stampa esplosione" -1 -1 78 20 +PAGE "Esplosione" -1 -1 78 20 -GROUPBOX DLG_NULL 76 8 +GROUPBOX DLG_NULL 76 6 BEGIN PROMPT 1 1 "Selezione documenti" END NUMBER F_ANNO 4 BEGIN - PROMPT 2 2 "Anno " + PROMPT 2 2 "Anno " FLAGS "A" END LIST F_PROVV 12 BEGIN - PROMPT 2 3 "Tipo numerazione " + PROMPT 2 3 "Tipo numerazione " ITEM "D|Definitiva" ITEM "P|Provvisoria" FLAGS "D" END -RADIOBUTTON F_TIPOSEL 30 -BEGIN - PROMPT 2 4 "Tipo selezione" - ITEM "0|Per numero" - MESSAGE SHOW,GR_NUMDOC@|HIDE,GR_DATADOC@ - ITEM "1|Per data" - MESSAGE HIDE,GR_NUMDOC@|SHOW,GR_DATADOC@ -END - STRING F_NUMFROM 4 BEGIN - PROMPT 37 2 "Da numerazione " + PROMPT 37 3 "Da numerazione " FLAG "U" USE %NUM INPUT CODTAB F_NUMFROM @@ -56,9 +53,30 @@ BEGIN CHECKTYPE NORMAL END +STRING F_NUMTO 4 +BEGIN + PROMPT 64 3 "a " + FLAG "U" + USE %NUM + INPUT CODTAB F_NUMTO + DISPLAY "Cod. Num." CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_NUMTO CODTAB + CHECKTYPE NORMAL +END + +LIST F_TIPOSEL 12 +BEGIN + PROMPT 2 4 "Tipo selezione " + ITEM "0|Per numero" + MESSAGE SHOW,GR_NUMDOC@|HIDE,GR_DATADOC@ + ITEM "1|Per data" + MESSAGE HIDE,GR_NUMDOC@|SHOW,GR_DATADOC@ +END + NUMBER F_NDOCFROM 7 BEGIN - PROMPT 60 2 "Dal " + PROMPT 37 4 "Dal numero " USE 33 JOIN 20 INTO CODCF=CODCF TIPOCF=TIPOCF JOIN 13 TO 20 INTO COM=COMCF @@ -77,25 +95,14 @@ END DATE F_EMISFROM BEGIN - PROMPT 60 2 "Dal " + PROMPT 37 4 "Dalla data " GROUP GR_DATADOC END -STRING F_NUMTO 4 -BEGIN - PROMPT 37 3 "A numerazione " - FLAG "U" - USE %NUM - INPUT CODTAB F_NUMTO - DISPLAY "Cod. Num." CODTAB - DISPLAY "Descrizione@50" S0 - OUTPUT F_NUMTO CODTAB - CHECKTYPE NORMAL -END NUMBER F_NDOCTO 7 BEGIN - PROMPT 60 3 "Al " + PROMPT 64 4 "a " USE 33 JOIN 20 INTO CODCF=CODCF TIPOCF=TIPOCF JOIN 13 TO 20 INTO COM=COMCF @@ -114,19 +121,19 @@ END DATE F_EMISTO BEGIN - PROMPT 60 3 "Al " + PROMPT 64 4 "a " GROUP GR_DATADOC END DATE F_DATAOBS BEGIN - PROMPT 37 5 "Data osservazione " + PROMPT 2 5 "Data osservazione " CHECKTYPE REQUIRED END LISTBOX F_PERIODS 1 BEGIN - PROMPT 37 6 "Numero periodi " + PROMPT 37 5 "Numero periodi " ITEM "1|1" ITEM "2|2" ITEM "3|3" @@ -135,6 +142,24 @@ BEGIN ITEM "6|6" END +BOOLEAN F_SEPARATE_DIST +BEGIN + PROMPT 2 7 "Separa le distinte" + MESSAGE TRUE ENABLE,F_NEWPAGE|CLEAR,F_SEPARATE_GIAC + MESSAGE FALSE CLEAR,F_NEWPAGE|ENABLE,F_SEPARATE_GIAC +END + +BOOLEAN F_SEPARATE_GIAC +BEGIN + PROMPT 39 7 "Separa le giacenze" +END + +BOOLEAN F_NEWPAGE +BEGIN + PROMPT 2 8 "Salto pagina al cambio distinta" +END + + LISTBOX F_STAMPA 18 BEGIN PROMPT 2 9 "Esplosione " @@ -146,158 +171,38 @@ END NUMBER F_DETTAGLIO 3 BEGIN - PROMPT 37 9 "Livello dettaglio " + PROMPT 39 9 "Livello dettaglio " FLAGS "U" END -BOOLEAN F_FABBISOGNO -BEGIN - PROMPT 2 10 "Calcola disponibilita'" - MESSAGE TRUE ENABLE,4@ - MESSAGE FALSE CLEAR,4@|CLEAR,6@ -END - -BOOLEAN F_SEPARATE -BEGIN - PROMPT 2 11 "Separa distinte" -END - -BOOLEAN F_SCMIN -BEGIN - PROMPT 37 10 "Confronta su scorta minima" - GROUP 4 -END - -LISTBOX F_VALORIZZAZIONE 22 -BEGIN - PROMPT 37 11 "Valorizzazione " -// FLAGS "D" - ITEM "0|Nessuna" - ITEM "1|Ultimo costo" - ITEM "2|Costo medio" - ITEM "3|Costo medio ponderato" - ITEM "4|Media ultimi 2 costi" - ITEM "5|Costo standard" - ITEM "6|LIFO annuale" - ITEM "7|LIFO storico" - ITEM "8|FIFO annuale" - ITEM "9|FIFO storico" -// GROUP 4 -END - -BOOLEAN F_DETORDFOR -BEGIN - PROMPT 37 12 "Dettaglia ordinato fornitori" -END - -GROUPBOX DLG_NULL 40 6 -BEGIN - PROMPT 37 13 "Disponibilita' & Valorizzazione" -END - -STRING F_SLMAG 3 -BEGIN - PROMPT 38 14 "Mag. semilavorati " - FLAGS "U" - USE MAG SELECT CODTAB[4,5]=="" - INPUT CODTAB F_SLMAG - DISPLAY "Codice " CODTAB[1,3] - DISPLAY "Denominazione mag.@50 " S0 - OUTPUT F_SLMAG CODTAB[1,3] - CHECKTYPE NORMAL - GROUP 4 -END - -STRING F_SLDEP 2 -BEGIN - PROMPT 69 14 "" - FLAGS "U" - USE MAG SELECT (IF(#F_SLMAG!="";((CODTAB[1,3]==#F_SLMAG)&&(CODTAB[4,5]!=""));(CODTAB[4,5]!=""))) - INPUT CODTAB[1,3] F_SLMAG - INPUT CODTAB[4,5] F_SLDEP - DISPLAY "Cod. magazzino" CODTAB[1,3] - DISPLAY "Cod. deposito" CODTAB[4,5] - DISPLAY "Denominazione dep.@50" S0 - OUTPUT F_SLDEP CODTAB[4,5] - OUTPUT F_SLMAG CODTAB[1,3] - CHECKTYPE NORMAL - GROUP 4 5 -END - -STRING F_MBMAG 3 -BEGIN - PROMPT 38 15 "Mag. materiali base " - FLAGS "U" - USE MAG SELECT CODTAB[4,5]=="" - INPUT CODTAB F_MBMAG - DISPLAY "Codice " CODTAB[1,3] - DISPLAY "Denominazione mag.@50 " S0 - OUTPUT F_MBMAG CODTAB[1,3] - CHECKTYPE NORMAL - MESSAGE EMPTY CLEAR,6@ - MESSAGE ENABLE, F_VALMAGMB - GROUP 4 -END - -STRING F_MBDEP 2 -BEGIN - PROMPT 69 15 "" - FLAGS "U" - USE MAG SELECT (IF(#F_MBMAG!="";((CODTAB[1,3]==#F_MBMAG)&&(CODTAB[4,5]!=""));(CODTAB[4,5]!=""))) - INPUT CODTAB[1,3] F_MBMAG - INPUT CODTAB[4,5] F_MBDEP - DISPLAY "Cod. magazzino" CODTAB[1,3] - DISPLAY "Cod. deposito" CODTAB[4,5] - DISPLAY "Denominazione dep.@50" S0 - OUTPUT F_MBDEP CODTAB[4,5] - OUTPUT F_MBMAG CODTAB[1,3] - CHECKTYPE NORMAL - GROUP 4 5 - MESSAGE EMPTY CLEAR, F_VALDEPMB - MESSAGE ENABLE, F_VALDEPMB -END - -BOOLEAN F_VALMAGMB -BEGIN - PROMPT 38 16 "Usa magazzino in valorizzazione" - GROUP 6 -END - -BOOLEAN F_VALDEPMB -BEGIN - PROMPT 38 17 "Usa deposito in valorizzazione" - GROUP 6 -END - GROUPBOX DLG_NULL 30 6 BEGIN - PROMPT 1 12 "Visualizza" + PROMPT 1 11 "Esplodi" END BOOLEAN F_ARTICOLI BEGIN - PROMPT 2 13 "Articoli" + PROMPT 2 12 "Articoli" END BOOLEAN F_LAVORAZIONI BEGIN - PROMPT 2 14 "Lavorazioni" + PROMPT 2 13 "Lavorazioni" END BOOLEAN F_VIRTUALI BEGIN - PROMPT 2 15 "Distinte virtuali" + PROMPT 2 14 "Distinte virtuali" END BOOLEAN F_GHOST BEGIN - PROMPT 2 16 "Distinte non di produzione" + PROMPT 2 15 "Distinte non di produzione" END - NUMBER F_SORT 1 BEGIN - PROMPT 2 19 "Ordina " + PROMPT 2 17 "Ordina " USE ORD INPUT CODTAB F_SORT DISPLAY "Codice ordinamento" CODTAB @@ -311,13 +216,13 @@ END STRING F_SORTDESC 50 BEGIN - PROMPT 17 19 "" + PROMPT 17 17 "" FLAGS "D" END LIST F_GROUPMODE 1 53 BEGIN - PROMPT 2 20 "Raggruppa " + PROMPT 2 18 "Raggruppa " ITEM "0|Nessun raggruppamento" ITEM "1|Raggruppa per unita' di misura" ITEM "2|Converti nell'unita' principale" @@ -326,6 +231,208 @@ BEGIN ITEM "5|Raggruppa all'unita' di misura di distinta" END +ENDPAGE + +PAGE "Disponibilita'" -1 -1 78 20 +BOOLEAN F_FABBISOGNO +BEGIN + PROMPT 2 2 "Calcola disponibilita'" + MESSAGE TRUE ENABLE,G_DISPONIB@|"X",F_ORCLI4DISP|"X",F_ORFOR4DISP|"X",F_INPRF4DISP|"X",F_INPRC4DISP + MESSAGE FALSE CLEAR,G_DISPONIB@|CLEAR,6@ +END + +GROUPBOX DLG_NULL 50 8 +BEGIN + PROMPT 2 2 "" +END +LIST F_LIVATTENZ 26 +BEGIN + PROMPT 3 3 "Segnala giacenza " + ITEM " |sotto zero" + ITEM "S|sotto scorta minima" +// ITEM "R|sotto livello di riordino" + GROUP G_DISPONIB +END + +BOOLEAN F_FABBISOGNO_FIN +BEGIN + PROMPT 3 4 "Non calcolare disp. sui finiti" + GROUP G_DISPONIB +END + +BOOLEAN F_ORCLI4DISP +BEGIN + PROMPT 3 5 "Sottrai l'ordinato clienti" +// GROUP G_DISPONIB + FLAGS "D" +END + +BOOLEAN F_ORFOR4DISP +BEGIN + PROMPT 3 6 "Aggiungi l'ordinato fornitori" +// GROUP G_DISPONIB + FLAGS "D" +END + +BOOLEAN F_INPRF4DISP +BEGIN + PROMPT 3 7 "Aggiungi i finiti in produzione" +// GROUP G_DISPONIB + FLAGS "D" +END + +BOOLEAN F_INPRC4DISP +BEGIN + PROMPT 3 8 "Sottrai i componenti in produzione" +// GROUP G_DISPONIB + FLAGS "D" +END + +LISTBOX F_VALORIZZAZIONE 32 +BEGIN + PROMPT 3 10 "" + ITEM "0|Non valorizzare" + MESSAGE HIDE,G_LISTINO@ + ITEM "1|Valorizza Ultimo costo" + MESSAGE HIDE,G_LISTINO@ + ITEM "2|Valorizza Costo medio" + MESSAGE HIDE,G_LISTINO@ + ITEM "10|Prezzo listino" + MESSAGE SHOW,G_LISTINO@ + ITEM "3|Valorizza Costo medio ponderato" + MESSAGE HIDE,G_LISTINO@ + ITEM "4|Valorizza Media ultimi 2 costi" + MESSAGE HIDE,G_LISTINO@ + ITEM "5|Valorizza Costo standard" + MESSAGE HIDE,G_LISTINO@ + ITEM "6|Valorizza LIFO annuale" + MESSAGE HIDE,G_LISTINO@ + ITEM "7|Valorizza LIFO storico" + MESSAGE HIDE,G_LISTINO@ + ITEM "8|Valorizza FIFO annuale" + MESSAGE HIDE,G_LISTINO@ + ITEM "9|Valorizza FIFO storico" + MESSAGE HIDE,G_LISTINO@ +END + +STRING F_CATVEN_LIST 2 +BEGIN + PROMPT 3 11 "Cat.vendita " + USE CVE + INPUT CODTAB F_CATVEN_LIST + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione @50" S0 + DISPLAY "Provvigione" R0 + DISPLAY "Gruppo" I1 + DISPLAY "Conto" I2 + OUTPUT F_CATVEN_LIST CODTAB + GROUP G_LISTINO +END + +STRING F_CODLIST 3 +BEGIN + PROMPT 25 11 "Cod.listino " + USE LF_CONDV SELECT TIPO=="L" + INPUT TIPO "L" + INPUT CATVEN F_CATVEN_LIST + INPUT COD F_CODLIST + DISPLAY "Cat. vendita" CATVEN + DISPLAY "Listino"COD + DISPLAY "Descrizione @50" DESCR + DISPLAY "Inizio validita" VALIN + DISPLAY "Fine validita" VALFIN + OUTPUT F_CATVEN_LIST CATVEN + OUTPUT F_CODLIST COD + GROUP G_LISTINO +END + +GROUPBOX DLG_NULL 50 6 +BEGIN + PROMPT 2 12 "Disponibilita' & Valorizzazione" +END + +STRING F_SLMAG 3 +BEGIN + PROMPT 3 13 "Mag. semilavorati " + FLAGS "U" + USE MAG SELECT CODTAB[4,5]=="" + INPUT CODTAB F_SLMAG + DISPLAY "Codice " CODTAB[1,3] + DISPLAY "Denominazione mag.@50 " S0 + OUTPUT F_SLMAG CODTAB[1,3] + CHECKTYPE NORMAL +// GROUP G_DISPONIB +END + +STRING F_SLDEP 2 +BEGIN + PROMPT 32 13 "" + FLAGS "U" + USE MAG SELECT (IF(#F_SLMAG!="";((CODTAB[1,3]==#F_SLMAG)&&(CODTAB[4,5]!=""));(CODTAB[4,5]!=""))) + INPUT CODTAB[1,3] F_SLMAG SELECT + INPUT CODTAB[4,5] F_SLDEP + DISPLAY "Cod. magazzino" CODTAB[1,3] + DISPLAY "Cod. deposito" CODTAB[4,5] + DISPLAY "Denominazione dep.@50" S0 + OUTPUT F_SLDEP CODTAB[4,5] + OUTPUT F_SLMAG CODTAB[1,3] + CHECKTYPE NORMAL + GROUP G_DEPOSITI //G_DISPONIB +END + +STRING F_MBMAG 3 +BEGIN + PROMPT 3 14 "Mag. materiali base " + FLAGS "U" + USE MAG SELECT CODTAB[4,5]=="" + INPUT CODTAB F_MBMAG + DISPLAY "Codice " CODTAB[1,3] + DISPLAY "Denominazione mag.@50 " S0 + OUTPUT F_MBMAG CODTAB[1,3] + CHECKTYPE NORMAL + MESSAGE EMPTY CLEAR,6@ + MESSAGE ENABLE, F_VALMAGMB +// GROUP G_DISPONIB +END + +STRING F_MBDEP 2 +BEGIN + PROMPT 32 14 "" + FLAGS "U" + USE MAG SELECT (IF(#F_MBMAG!="";((CODTAB[1,3]==#F_MBMAG)&&(CODTAB[4,5]!=""));(CODTAB[4,5]!=""))) + INPUT CODTAB[1,3] F_MBMAG SELECT + INPUT CODTAB[4,5] F_MBDEP + DISPLAY "Cod. magazzino" CODTAB[1,3] + DISPLAY "Cod. deposito" CODTAB[4,5] + DISPLAY "Denominazione dep.@50" S0 + OUTPUT F_MBDEP CODTAB[4,5] + OUTPUT F_MBMAG CODTAB[1,3] + CHECKTYPE NORMAL + MESSAGE EMPTY CLEAR, F_VALDEPMB + MESSAGE ENABLE, F_VALDEPMB + GROUP G_DEPOSITI //G_DISPONIB +END + +BOOLEAN F_VALMAGMB +BEGIN + PROMPT 3 15 "Usa magazzino in valorizzazione" + MESSAGE TRUE ENABLE,F_VALDEPMB + MESSAGE FALSE CLEAR,F_VALDEPMB + GROUP G_VALORIZZ +END + +BOOLEAN F_VALDEPMB +BEGIN + PROMPT 3 16 "Usa deposito in valorizzazione" + GROUP G_DEPOSITI G_VALORIZZ +END + +BOOLEAN F_DETORDFOR +BEGIN + PROMPT 2 18 "Dettaglia ordinato fornitori" +END + + ENDPAGE PAGE "Articoli" -1 -1 78 20 @@ -445,7 +552,7 @@ BEGIN PROMPT 20 6 "" FLAGS "U" USE MAG SELECT (IF(#F_MAG!="";((CODTAB[1,3]==#F_MAG)&&(CODTAB[4,5]!=""));(CODTAB[4,5]!=""))) - INPUT CODTAB[1,3] F_MAG + INPUT CODTAB[1,3] F_MAG SELECT INPUT CODTAB[4,5] F_DEP DISPLAY "Cod. magazzino" CODTAB[1,3] DISPLAY "Cod. deposito" CODTAB[4,5] diff --git a/db/db1300.cpp b/db/db1300.cpp index 9a4cb54fb..5fe4a3116 100755 --- a/db/db1300.cpp +++ b/db/db1300.cpp @@ -15,8 +15,8 @@ class TXmas_tree : public TDistinta_tree { - TIsamtempfile _dist, _rdist; -// TAssoc_array _ass_dist, _ass_rdist; + TIsamtempfile *_dist, *_rdist; + TRecord_cache *_cache_dist, *_cache_rdist; protected: virtual const TRectype& find_head(const TCodice_articolo& art) const; @@ -26,43 +26,40 @@ public: void add_branch(TDistinta_tree& dt); TXmas_tree(); - virtual ~TXmas_tree() { } + virtual ~TXmas_tree(); }; const TRectype& TXmas_tree::find_head(const TCodice_articolo& art) const { - TRectype& rec = _dist.curr(); - rec.put("CODDIST", art); - const int err = ((TXmas_tree*)this)->_dist.read(); + const TRectype& rec = _cache_dist->get(art); + return rec; +/* + if (!rec.empty()) + return rec; + TRectype& recd = _dist->curr(); + recd.put("CODDIST", art); + const int err = _dist->read(); if (err != NOERR) - rec.zero(); - return rec; + recd.zero(); + return recd; +*/ } const TRectype* TXmas_tree::find_child(const TCodice_articolo& art, int child) const { -/* - TString80 key; key << art << '|' << child; - TRectype* rec = (TRectype*)_ass_rdist.objptr(key); - if (rec == NULL) - { - TLocalisamfile& righe = (TLocalisamfile&)_rdist; - righe.put("CODDIST", art); - righe.put("NRIG", child); - const int err = righe.read(); - if (err == NOERR) - { - rec = new TRectype(righe.curr()); - ((TXmas_tree*)this)->_ass_rdist.add(key, rec); - } - } - return rec; -*/ - TLocalisamfile& righe = (TLocalisamfile&)_rdist; + TString80 key; key.format("%s|%d", (const char*)art, child); + const TRectype& rec = _cache_rdist->get(key); + return rec.empty() ? NULL : &rec; +/* + if (!rec.empty()) + return &rec; + + TLocalisamfile& righe = (TLocalisamfile&)*_rdist; righe.put("CODDIST", art); righe.put("NRIG", child); const int err = righe.read(); return err == NOERR ? &righe.curr() : NULL; +*/ } void TXmas_tree::add_branch(TDistinta_tree& dt) @@ -78,13 +75,12 @@ void TXmas_tree::add_branch(TDistinta_tree& dt) TCodice_articolo art; dt.curr_code(art); if (find_head(art).empty()) { - TRectype& rec = _dist.curr(); + TRectype& rec = _dist->curr(); rec = cache().get(LF_DIST, art); if (rec.empty()) - { rec.put("CODDIST", art); - } - rec.write(_dist); + int err = rec.write(*_dist); + CHECKD(err == NOERR, "Dist write error ", err); } dt.goto_father(); @@ -105,7 +101,7 @@ void TXmas_tree::add_branch(TDistinta_tree& dt) } if (child == NULL) { - TRectype& curr = _rdist.curr(); + TRectype& curr = _rdist->curr(); curr.put("CODDIST", art); curr.put("NRIG", c); curr.put("TIPO", "A"); @@ -113,7 +109,8 @@ void TXmas_tree::add_branch(TDistinta_tree& dt) curr.put("LIVELLO", level); curr.put("UM", um); curr.put("EXPR", qta); - curr.write(_rdist); + int err = curr.write(*_rdist); + CHECKD(err == NOERR, "Rdist write error ", err); } } @@ -121,10 +118,25 @@ void TXmas_tree::add_branch(TDistinta_tree& dt) } TXmas_tree::TXmas_tree() - : _dist(LF_DIST, NULL, TRUE, TRUE), _rdist(LF_RDIST, NULL, TRUE, TRUE) { + _dist = new TIsamtempfile(LF_DIST, NULL, TRUE, TRUE); + _cache_dist = new TRecord_cache(_dist); + _cache_dist->test_file_changes(TRUE); + + _rdist = new TIsamtempfile(LF_RDIST, NULL, TRUE, TRUE); + _cache_rdist = new TRecord_cache(_rdist); + _cache_rdist->test_file_changes(TRUE); } +TXmas_tree::~TXmas_tree() +{ + // I file temporanei vengono cancellati dai distruttori + // delle record cache che li contengono + delete _cache_dist; + delete _cache_rdist; +} + + /////////////////////////////////////////////////////////// // TDistinta_sheet /////////////////////////////////////////////////////////// @@ -259,23 +271,6 @@ public: bool TImplosion_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) { - switch (o.dlg()) - { - case F_RESETVARS: - if (e == fe_button) - { - TSheet_field& vars = sfield(F_VARS); - if (vars.items() > 0) - { - vars.destroy(); - delete _xmas; - _xmas = new TXmas_tree; - } - } - break; - default: - break; - } return TRUE; } @@ -320,13 +315,20 @@ void TImplosion_mask::implode() if (get_bool(F_USECATMER)) { rel.add(LF_ANAMAG, "CODART==CODDIST"); - const TString& cm = get(F_CATMER); - const int cmlen = cm.len(); TString filter; - filter << LF_ANAMAG << "->GRMERC"; - if (cmlen > 0 && cmlen < 5) - filter << "[1," << cmlen << ']'; - filter << "=\"" << cm << '"'; + for (int f = 0; f < 2; f++) + { + const TString& cm = get(F_DA_CATMER+f); + const int cmlen = cm.len(); + if (cmlen > 0) + { + if (filter.not_empty()) filter << "&&"; + filter << '(' << LF_ANAMAG << "->" << ANAMAG_GRMERC; + if (cmlen < 5) + filter << "[1," << cmlen << ']'; + filter << (f ? '<' : '>') << "=\"" << cm << "\")"; + } + } cur.setfilter(filter, TRUE); TIndwin iw(0, "Creazione lista articoli da esplodere...", FALSE, FALSE); items = cur.items(); @@ -351,6 +353,10 @@ void TImplosion_mask::implode() TDistinta_tree dt; + if (_xmas != NULL) + delete _xmas; + _xmas = new TXmas_tree; + TImplosion_parameters ip; ip._art = get(F_ARTICOLO); ip._xmas = _xmas; @@ -361,7 +367,7 @@ void TImplosion_mask::implode() if (pi.iscancelled()) break; if (vars.items() == 0) vars.row(-1); // Crea almeno una riga vuota // Scansione di tutte le righe abilitate - FOR_EACH_SHEET_ROW(vars, r, row) if (vars.cell_enabled(r, 0)) + FOR_EACH_SHEET_ROW(vars, r, row) { dt.clear_globals(); dt.set_global("_IMPIANTO", row->get(0)); @@ -374,9 +380,6 @@ void TImplosion_mask::implode() dt.scan_depth_first(implode_callback, &ip); } } - FOR_EACH_SHEET_ROW(vars, r, row) - vars.disable_cell(r, -1); - vars.force_update(); pi.set_text("Espansione dell'albero di implosione..."); do_events(); @@ -387,6 +390,7 @@ void TImplosion_mask::implode() void TImplosion_mask::display() { + CHECK(_xmas, "Null tree"); TDisplay_mask* m = new TDisplay_mask; TTree_field& tf = m->tfield(F_TREE); tf.set_tree(_xmas); @@ -394,16 +398,17 @@ void TImplosion_mask::display() delete m; } -TImplosion_mask::TImplosion_mask() : TAutomask("db1300a") +TImplosion_mask::TImplosion_mask() : TAutomask("db1300a"), _xmas(NULL) { - _xmas = new TXmas_tree; - TCodgiac_livelli liv; liv.set_sheet_columns(sfield(F_VARS), 105); } TImplosion_mask::~TImplosion_mask() -{ delete _xmas; } +{ + if (_xmas) + delete _xmas; +} /////////////////////////////////////////////////////////// // Implosion Application diff --git a/db/db1300a.h b/db/db1300a.h index 5d5905f30..aa88e2f1e 100755 --- a/db/db1300a.h +++ b/db/db1300a.h @@ -18,6 +18,7 @@ #define F_DEPOSITO 104 #define F_USECATMER 220 -#define F_CATMER 221 -#define F_DA_ARTICOLO 222 -#define F_AD_ARTICOLO 223 +#define F_DA_CATMER 221 +#define F_A_CATMER 222 +#define F_DA_ARTICOLO 225 +#define F_AD_ARTICOLO 226 diff --git a/db/db1300a.uml b/db/db1300a.uml index 5b8e3d05a..213e90907 100755 --- a/db/db1300a.uml +++ b/db/db1300a.uml @@ -4,17 +4,12 @@ TOOLBAR "" 0 -3 0 3 BUTTON DLG_OK 10 2 BEGIN - PROMPT -13 -11 "" -END - -BUTTON F_RESETVARS 10 2 -BEGIN - PROMPT -23 -11 "~Azzera" + PROMPT -12 -11 "" END BUTTON DLG_QUIT 10 2 BEGIN - PROMPT -33 -11 "" + PROMPT -22 -11 "" END ENDPAGE @@ -178,19 +173,30 @@ END BOOLEAN F_USECATMER BEGIN PROMPT 2 16 "Per categoria merceologica" - MESSAGE FALSE HIDE,F_CATMER - MESSAGE TRUE SHOW,F_CATMER + MESSAGE FALSE HIDE,F_DA_CATMER|HIDE,F_A_CATMER + MESSAGE TRUE SHOW,F_DA_CATMER|SHOW,F_A_CATMER END -STRING F_CATMER 5 +STRING F_DA_CATMER 5 BEGIN - PROMPT 34 16 "" + PROMPT 42 16 "Da " FLAG "U" USE GMC - INPUT CODTAB F_CATMER + INPUT CODTAB F_DA_CATMER DISPLAY "Codice" CODTAB DISPLAY "Descrizione@50" S0 - OUTPUT F_CATMER CODTAB + OUTPUT F_DA_CATMER CODTAB + CHECKTYPE NORMAL +END + +STRING F_A_CATMER 5 +BEGIN + PROMPT 58 16 "A " + FLAG "U" + COPY USE F_DA_CATMER + INPUT CODTAB F_A_CATMER + COPY DISPLAY F_DA_CATMER + OUTPUT F_A_CATMER CODTAB CHECKTYPE NORMAL END @@ -264,7 +270,7 @@ END STRING F_DEPOSITO 2 BEGIN - PROMPT 36 2 "Deposito " + PROMPT 36 2 "Deposito " USE MAG SELECT CODTAB[4,5]!="" INPUT CODTAB[1,3] F_MAGAZZINO INPUT CODTAB[4,5] F_DEPOSITO diff --git a/db/db2400.cpp b/db/db2400.cpp index d274243fa..4c0d574ba 100755 --- a/db/db2400.cpp +++ b/db/db2400.cpp @@ -26,7 +26,8 @@ class TValorizzazione_mask : public TAutomask TDistinta_tree _tree; int _tipoval; - TString16 _annoes, _catven, _codlist, _codmag; + TString4 _annoes,_catven, _codlist ; + TString8 _codmag; protected: virtual bool on_field_event(TOperable_field& f, TField_event e, long jolly); @@ -123,6 +124,8 @@ void TValorizzazione_mask::elabora() _annoes = get(F_ANNOES); _tipoval = get_int(F_TIPO); + _catven = get(F_CATVEN_LIST); + _codlist = get(F_CODLIST); TRelation rel(LF_DIST); TCursor cur(&rel, "", 1, &rec_from, &rec_to); @@ -266,9 +269,9 @@ static const char* link_handler(TMask&, int id, const char* str, bool) const char* app = NULL; switch(id) { - case 0: app = "ve2 -2"; break; + case 0: app = "ve2 -3"; break; case 1: app = "ba3 -0 LAV"; break; - case 2: app = "db0 -0"; break; + case 2: app = "db0 -4"; break; default: break; } @@ -318,6 +321,11 @@ bool TValorizzazione::create() void TValorizzazione::main_loop() { TValorizzazione_mask m; + TConfig conf(CONFIG_DITTA, "mg"); + const bool listini = conf.get_bool("GES", "ve", 1); + m.enable(-G_LISTINO, listini); + m.enable(F_CATVEN_LIST, listini && conf.get_bool("GESLISCV", "ve")); + m.run(); } diff --git a/db/db2400a.h b/db/db2400a.h index 609e70b58..df5aefd0c 100755 --- a/db/db2400a.h +++ b/db/db2400a.h @@ -5,4 +5,8 @@ #define F_ANNOES 104 #define F_VALORIZZA 105 #define F_DATA 106 -#define F_PREVIEW 110 \ No newline at end of file +#define F_PREVIEW 110 +#define F_CATVEN_LIST 120 +#define F_CODLIST 121 + +#define G_LISTINO 1 diff --git a/db/db2400a.uml b/db/db2400a.uml index 83d8eb2b8..40ab7984e 100755 --- a/db/db2400a.uml +++ b/db/db2400a.uml @@ -1,6 +1,6 @@ #include "db2400a.h" -TOOLBAR "" 0 19 0 0 +TOOLBAR "" 0 -2 0 2 BUTTON DLG_ELABORA 10 2 BEGIN @@ -43,7 +43,7 @@ BEGIN DISPLAY "Descrizione@50" LF_ANAMAG->DESCR OUTPUT F_DIST_FROM CODDIST CHECKTYPE SEARCH - ADD RUN DB0 -0 + ADD RUN DB0 -4 END STRING F_DIST_TO 20 @@ -57,10 +57,10 @@ BEGIN DISPLAY "Descrizione@50" LF_ANAMAG->DESCR OUTPUT F_DIST_TO CODDIST CHECKTYPE SEARCH - ADD RUN DB0 -0 + ADD RUN DB0 -4 END -GROUPBOX DLG_NULL 34 4 +GROUPBOX DLG_NULL 34 5 BEGIN PROMPT 1 6 "@bParametri in ingresso" END @@ -69,17 +69,59 @@ LIST F_TIPO 1 22 BEGIN PROMPT 2 7 "Tipo " ITEM "0|Ultimo costo" + MESSAGE HIDE,G_LISTINO@ ITEM "1|Media costi" + MESSAGE HIDE,G_LISTINO@ ITEM "2|Prezzo listino" + MESSAGE SHOW,G_LISTINO@ ITEM "3|Costo standard" + MESSAGE HIDE,G_LISTINO@ ITEM "4|Costo medio" + MESSAGE HIDE,G_LISTINO@ ITEM "5|Costo medio ponderato" + MESSAGE HIDE,G_LISTINO@ ITEM "6|LIFO annuale" + MESSAGE HIDE,G_LISTINO@ ITEM "7|FIFO annuale" + MESSAGE HIDE,G_LISTINO@ ITEM "8|LIFO" + MESSAGE HIDE,G_LISTINO@ ITEM "9|FIFO" + MESSAGE HIDE,G_LISTINO@ END +STRING F_CATVEN_LIST 2 +BEGIN + PROMPT 2 9 "Cat.ven. " + USE CVE + INPUT CODTAB F_CATVEN_LIST + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione @50" S0 + DISPLAY "Provvigione" R0 + DISPLAY "Gruppo" I1 + DISPLAY "Conto" I2 + OUTPUT F_CATVEN_LIST CODTAB + GROUP G_LISTINO +END + +STRING F_CODLIST 3 +BEGIN + PROMPT 16 9 "Cod. Listino " + USE LF_CONDV SELECT TIPO=="L" + INPUT TIPO "L" + INPUT CATVEN F_CATVEN_LIST + INPUT COD F_CODLIST + DISPLAY "Cat. vendita" CATVEN + DISPLAY "Listino"COD + DISPLAY "Descrizione @50" DESCR + DISPLAY "Inizio validita" VALIN + DISPLAY "Fine validita" VALFIN + OUTPUT F_CATVEN_LIST CATVEN + OUTPUT F_CODLIST COD + GROUP G_LISTINO +END + + NUMBER F_ANNOES 4 BEGIN PROMPT 2 8 "Anno esercizio " diff --git a/db/dblib.cpp b/db/dblib.cpp index bff4e81a3..a0de7cc6b 100755 --- a/db/dblib.cpp +++ b/db/dblib.cpp @@ -61,8 +61,8 @@ real TQuantita::find_umdist(TCodice_um& um) return um.blank() ? find_umbase(um) : get_factor(um); } -void TQuantita::set_articolo(const TCodice_articolo& art, - const TCodice_um& um) +void TQuantita::set_articolo(const TString& art, + const TString& um) { _articolo = art; @@ -210,7 +210,7 @@ TQuantita::TQuantita() : _conv(1.0) { } -TQuantita::TQuantita(const TCodice_articolo& art, const TCodice_um& um, const real& val) +TQuantita::TQuantita(const TString& art, const TString& um, const real& val) { set(art, um, val); } @@ -463,17 +463,17 @@ bool TDistinta_tree::father_giaclev(TString& code, int levnum) const return code.not_empty(); } -bool TDistinta_tree::curr_code(TCodice_articolo& code) const +bool TDistinta_tree::path_code(TCodice_articolo& code, const TToken_string &path) const { - _path.get(-2, _tmp); + path.get(-2, _tmp); isola_codice(_tmp); code = _tmp; return code.not_empty(); } -bool TDistinta_tree::curr_giaclev(TString& code, int levnum) const +bool TDistinta_tree::path_giaclev(TString& code, int levnum, const TToken_string &path) const { - _path.get(-2, _tmp); + path.get(-2, _tmp); _tmp.get(1, code); if (levnum>0) code = livgiac().unpack_grpcode(code, levnum).trim(); @@ -534,21 +534,21 @@ real TDistinta_tree::curr_qta() const return tot; } -char TDistinta_tree::curr_type() const +char TDistinta_tree::path_type(const TToken_string & path) const { - _path.get(-2, _tmp); + path.get(-2, _tmp); char ap = _tmp.get_char(6); return ap; } -int TDistinta_tree::curr_depth() const +int TDistinta_tree::path_depth(const TToken_string & path) const { - int depth = _path.items()-1; + int depth = path.items()-1; if (_ignore_ghost) { for (int i = depth; i > 0; i--) { - _path.get(i, _tmp); + path.get(i, _tmp); char ap = _tmp.get_char(6); if (ap == 'G') depth--; } @@ -563,11 +563,13 @@ bool TDistinta_tree::goto_node(const TString &id) _stack.destroy(); TToken_string str = id; _path = str.get(0); - push_vars(); + if (!push_vars()) + return FALSE; for (const char* t = str.get(); t; t = str.get()) { _path.add(t); - push_vars(); + if (!push_vars()) + return FALSE; } } return TRUE; @@ -700,7 +702,7 @@ TImage* TDistinta_tree::image(bool selected) const return img; } -void TDistinta_tree::restart() +bool TDistinta_tree::restart() { /* _vars.destroy(); @@ -708,12 +710,12 @@ void TDistinta_tree::restart() _lav.destroy(); rec_cache(LF_RDIST).destroy(); */ - shrink_all(); + return shrink_all(); } bool TDistinta_tree::set_root(const TQuantita& qta, const char* livgiac) { - const bool ok = find_child(qta.articolo(), 1) != NULL; + bool ok = find_child(qta.articolo(), 1) != NULL; if (ok) { _tmp = qta.articolo(); // codice @@ -725,7 +727,7 @@ bool TDistinta_tree::set_root(const TQuantita& qta, const char* livgiac) _tmp.add(get_type(qta.articolo())); _root = _tmp; - restart(); + ok = restart(); } return ok; } @@ -762,7 +764,7 @@ bool TDistinta_tree::set_root(const TRectype & rec) umart = rec.get(RDOC_UMQTA); qta = rec.get_real(RDOC_QTA); livgiac = rec.get(RDOC_LIVELLO); - set_global("_MAGAZZINO", rec.get(RDOC_CODMAG)); + set_global("_MAGDEP", rec.get(RDOC_CODMAG)); set_global("_LINEA", rec.get(RDOC_LINEA)); set_global("_IMPIANTO", rec.get(RDOC_IMPIANTO)); break; @@ -771,7 +773,7 @@ bool TDistinta_tree::set_root(const TRectype & rec) umart = rec.get(RMOVMAG_UM); qta = rec.get_real(RMOVMAG_QUANT); livgiac = rec.get(RMOVMAG_LIVGIAC); - set_global("_MAGAZZINO", rec.get(RMOVMAG_CODMAG)); + set_global("_MAGDEP", rec.get(RMOVMAG_CODMAG)); set_global("_LINEA", rec.get(RMOVMAG_LINEA)); set_global("_IMPIANTO", rec.get(RMOVMAG_IMPIANTO)); break; @@ -789,12 +791,12 @@ bool TDistinta_tree::has_root() const bool TDistinta_tree::goto_root() { - const bool ok = has_root(); + bool ok = has_root(); if (ok) { _path = _root; _stack.destroy(); - push_vars(); + ok = push_vars(); } return ok; } @@ -948,7 +950,7 @@ bool TDistinta_tree::has_son() const return _curr != NULL; } -void TDistinta_tree::add_child() +bool TDistinta_tree::add_child() { TCodice_articolo comp = _curr->get("CODCOMP"); TString tmp,tmp2; @@ -965,23 +967,15 @@ void TDistinta_tree::add_child() tmp = _curr->get("LIVELLO"); if (livgiac().enabled()) { - TString fgiaclev; father_giaclev(fgiaclev); - //const bool ghost = find_head(comp).get_bool("VIRTUALE") && !find_head(comp).get_bool("ARTPROD"); - /*if (//ghost || // eredita sempre con i ghost - _curr->get("TIPO_LIV")[0]!=' ' || - _curr->get("TIPO_LIV")[1]!=' ' || - _curr->get("TIPO_LIV")[2]!=' ' || - _curr->get("TIPO_LIV")[3]!=' ' )*/ + TString fgiaclev; father_giaclev(fgiaclev); + // ereditarieta' + for (int l= 0 ; l < 4; l++) if (livgiac().enabled(l+1)) { - // ereditarieta' - for (int l= 0 ; l < 4; l++) if (livgiac().enabled(l+1)) + tmp2 = livgiac().unpack_grpcode(tmp, l+1); + if (_curr->get("TIPO_LIV")[l]=='E') { - tmp2 = livgiac().unpack_grpcode(tmp, l+1); - if (_curr->get("TIPO_LIV")[l]=='E' /*|| ghost && tmp2.empty() */) - { - tmp2 = livgiac().unpack_grpcode(fgiaclev, l+1); - livgiac().pack_grpcode(tmp, tmp2 , l+1); - } + tmp2 = livgiac().unpack_grpcode(fgiaclev, l+1); + livgiac().pack_grpcode(tmp, tmp2 , l+1); } } } @@ -1004,6 +998,7 @@ void TDistinta_tree::add_child() _path << TREE_SEPARATOR << get_type(comp); // 6 - Articolo, Lavorazione, Virtuale, Ghost push_vars(); + return TRUE; } void TDistinta_tree::kill_child() @@ -1020,7 +1015,7 @@ bool TDistinta_tree::goto_firstson() { const bool ok = has_son(); if (ok) - add_child(); + return add_child(); return ok; } @@ -1071,7 +1066,7 @@ bool TDistinta_tree::goto_rbrother() if (ok) { kill_child(); - add_child(); + return add_child(); } return ok; } @@ -1126,7 +1121,7 @@ bool TDistinta_tree::goto_lbrother() if (ok) { kill_child(); - add_child(); + return add_child(); } return ok; } @@ -1226,15 +1221,18 @@ void TDistinta_tree::pop_vars() bool TDistinta_tree::is_global(const char* var) { - const char * gvars[] = {"_IMPIANTO","_LINEA","_MAGAZZINO","_DISTINTA", - "_RADICE", "_LIVELLO","_LIV1","_LIV2","_LIV3", - "_LIV4",NULL}; + const char * gvars[] = {"_IMPIANTO","_LINEA", + "_MAGDEP","_MAGAZZINO","_DEPOSITO", + "_DISTINTA", "_RADICE", + "_LIVELLO","_LIV1","_LIV2","_LIV3", "_LIV4", + NULL}; const char ** gvar=gvars; for (; *gvar; gvar++) if (strcmp(*gvar, var)==0) return TRUE; return FALSE; } + void TDistinta_tree::clear_globals() { _globals.destroy(); @@ -1296,7 +1294,7 @@ TObject * TDistinta_tree::global_default_str(const char* name) { ini.set_paragraph("mg"); // - //if (strcmp("_MAGAZZINO",name)) + //if (strcmp("_MAGDEP",name)) // val= new TString(ini.get("DEFAULT_CODMAGDEP")); } } @@ -1353,15 +1351,30 @@ const TString& TDistinta_tree::get_string(const char* var) } if (strncmp(var, "_LIV",4)==0) { - switch (var[4]) { - case 'E': curr_giaclev(_varvalue); break; - case '1': curr_giaclev(_varvalue,1);break; - case '2': curr_giaclev(_varvalue,2);break; - case '3': curr_giaclev(_varvalue,3);break; - case '4': curr_giaclev(_varvalue,4);break; + switch (var[4]) + { + case 'E': curr_giaclev(_varvalue); break; + case '1': curr_giaclev(_varvalue,1);break; + case '2': curr_giaclev(_varvalue,2);break; + case '3': curr_giaclev(_varvalue,3);break; + case '4': curr_giaclev(_varvalue,4);break; } return _varvalue; } + if (strcmp(var, "_MAGAZZINO")==0 || strcmp(var, "_DEPOSITO")==0) + { + TString* val = (TString*)get_global("_MAGDEP", CLASS_STRING); + if (val) + { + _varvalue =* val; + switch (var[1]) + { + case 'M': _varvalue.cut(3); break; // cod magazzino + case 'D': _varvalue = _varvalue.mid(3);break; // cod deposito + } + return _varvalue; + } + } TObject* val = get_global(var, CLASS_STRING); if (val) return (const TString&)*val; @@ -1427,8 +1440,9 @@ void TDistinta_tree::evaluate_strexpr(const char* str, TString& res) } -void TDistinta_tree::push_vars() +bool TDistinta_tree::push_vars() { + bool ok = TRUE; TAssoc_array* vars = new TAssoc_array; _stack.push(vars); @@ -1454,16 +1468,21 @@ void TDistinta_tree::push_vars() var = str; var.trim(); expr = equal + 1; const TTypeexp exprtype = get_var_type(var); - e.set(expr, exprtype); - evaluate(e); - - if (exprtype == _numexpr) - vars->add(var, e.as_real()); - else - vars->add(var, e.as_string()); + if (e.set(expr, exprtype)) + { + evaluate(e); + if (exprtype == _numexpr) + vars->add(var, e.as_real()); + else + vars->add(var, e.as_string()); + } else { + error_box("Errore nella distinta '%s'",(const char *)art); + ok = FALSE; + } } } } + return ok; } struct TExplosion_params @@ -1666,7 +1685,7 @@ TLavorazione *TDistinta_tree::find_labor(TRiga_esplosione *l) void TRiga_esplosione::init(const TDistinta_tree& tree) { - TCodice_articolo art; tree.curr_code(art); + TCodice_articolo art; tree.curr_code(art); art.trim(); TCodice_um um; tree.curr_um(um); real val = tree.curr_qta(); set(art, um, val); @@ -1678,13 +1697,24 @@ void TRiga_esplosione::init(const TDistinta_tree& tree) tree.curr_id(_path); // path } -static TString _tmp_path; - -const char * TRiga_esplosione::father() +const char * TRiga_esplosione::father(const char * types) { + static TString _tmp_path; + _tmp_path = _path; - const int index = _tmp_path.rfind('|'); - _tmp_path.cut(index == -1 ? 0 : index); + while (TRUE) + { + const int index = _tmp_path.rfind('|'); + if (index == -1) + return ""; + else + { + _tmp_path.cut(index); + char type = _tmp_path[index-1]; + if (types == NULL || strchr(types, type)) + break; + } + } return _tmp_path; } diff --git a/db/dblib.h b/db/dblib.h index a91709297..7ec71488c 100755 --- a/db/dblib.h +++ b/db/dblib.h @@ -179,9 +179,9 @@ public: const real& val() const { return _val; } real base_val() const; - void set_articolo(const TCodice_articolo& art, const TCodice_um& um); + void set_articolo(const TString& art, const TString& um); void set_val(const real& val) {_val=val;} - void set(const TCodice_articolo& art, const TCodice_um& um, const real& val) + void set(const TString& art, const TString& um, const real& val) { set_articolo(art, um); _val = val; } void convert2umbase(); @@ -189,7 +189,7 @@ public: TQuantita(); TQuantita(const TQuantita& q); - TQuantita(const TCodice_articolo& art, const TCodice_um& um, const real& val); + TQuantita(const TString& art, const TString& um, const real& val); virtual ~TQuantita(); }; @@ -255,7 +255,7 @@ private: protected: bool isola_codice(TString& code) const; - void add_child(); + bool add_child(); void kill_child(); virtual const TRectype& find_head(const TCodice_articolo& art) const; @@ -264,7 +264,6 @@ protected: int build_children_pointers(const TCodice_articolo& father, TPointer_array& children) const; // int build_children_list(const TCodice_articolo& father, TArray& children) const; - TTypeexp get_var_type(const char* var); const TString& get_string(const char* var); const real& get_real(const char* var); @@ -272,7 +271,7 @@ protected: real evaluate_numexpr(const char* str); void evaluate_strexpr(const char* str, TString& res); - void push_vars(); + bool push_vars(); void pop_vars(); int raggruppa(TArray& boom, TExplosion_grouping mode) const; @@ -283,10 +282,8 @@ protected: // TTree TObject * global_default_str(const char* name); TObject * global_default_real(const char* name); - const TString& describe(const TCodice_articolo& codart) const; - bool describe(const TCodice_articolo& codart, TString& descr) const; - public: + TTypeexp get_var_type(const char* var); static TLavorazione * find_labor(TRiga_esplosione *l); virtual bool goto_root(); virtual bool goto_firstson(); @@ -303,6 +300,9 @@ public: virtual TImage* image(bool selected) const; virtual TObject* curr_node() const; + const TString& describe(const TCodice_articolo& codart) const; + bool describe(const TCodice_articolo& codart, TString& descr) const; + bool set_root(const TQuantita& qta, const char * livgiac =""); bool set_root(const TCodice_articolo& art, const char* um = "", real qta = 1.0, const char*livgiac=""); bool set_root(const TRectype & rec); @@ -323,23 +323,29 @@ public: bool set_qta_on_descr(bool on) {return _qta_on_descr=on;} char set_descr_separator(char on) {return _descr_sep=on;} - void restart(); // reset all and go to root + bool restart(); // reset all and go to root int explode(TArray& boom, bool mat_base = FALSE, TExplosion_grouping raggr = RAGGR_EXP_NONE, int max_depth = 0, const char* filter = NULL, int sort_key = 0); + bool path_code(TCodice_articolo& code, const TToken_string &path) const; + bool path_giaclev(TString& code, int levnum, const TToken_string &path) const; + bool father_code(TCodice_articolo& code) const; bool father_giaclev(TString& code, int levnum=0) const; - bool curr_code(TCodice_articolo& code) const; - bool curr_giaclev(TString& code, int levnum=0) const; + bool curr_code(TCodice_articolo& code) const {return path_code(code, _path);} + bool curr_giaclev(TString& code, int levnum=0) const {return path_giaclev(code, levnum, _path);} int curr_comp(TString& code) const; long curr_sort() const; const char* curr_um(TCodice_um& code) const; - real curr_qta() const; real last_qta() const; - int curr_depth() const; - char curr_type() const; + real curr_qta() const; + int curr_depth() const { return path_depth(_path);} + char curr_type() const { return path_type(_path);} + + int path_depth(const TToken_string & path) const; + char path_type(const TToken_string & path) const; TRiga_esplosione *first_labor(TArray & labors, TExplosion_grouping raggum=RAGGR_EXP_UMBASE); TRiga_esplosione *next_labor(TArray & labors); @@ -393,7 +399,9 @@ public: void set_tipo(char c) { _tipo = c; } void set_mat_base(bool b) { _mat_base = b; } void set_path(const char* p) { _path = p;} - const char * father(); + void set_giacenza(const char* g) { _giac = g; } + // cerca un padre o nonno di uno dei tipi passati + const char * father(const char * types=NULL); TRiga_esplosione(); TRiga_esplosione(const TDistinta_tree& tree); diff --git a/db/dbprassi.men b/db/dbprassi.men index c17d861e3..d4a2f9719 100755 --- a/db/dbprassi.men +++ b/db/dbprassi.men @@ -25,9 +25,9 @@ Picture = Module = 35 Flags = "" Item_01 = "Anagrafica distinte", "db1 -1", "F" -Item_01 = "Tabella lavorazioni", "ba3 -1 LAV", "F" -Item_01 = "Tabella ordinamenti", "ba3 -1 ORD", "F" -Item_01 = "Tabella variabili", "ba3 -1 VAR", "F" +Item_02 = "Tabella lavorazioni", "ba3 -1 LAV", "F" +Item_03 = "Tabella ordinamenti", "ba3 -1 ORD", "F" +Item_04 = "Tabella variabili", "ba3 -1 VAR", "F" [PRASSIDB_040] @@ -36,7 +36,7 @@ Picture = Module = 35 Flags = "" Item_01 = "Esplosione distinte", "db1 -0", "F" -Item_02 = "Implosione", disabled +Item_02 = "Implosione", "db1 -2", "F" [PRASSIDB_030] Caption = "Servizi" diff --git a/ef/dse.frm b/ef/dse.frm index 8a114b0f4..dbf48bf4d 100755 --- a/ef/dse.frm +++ b/ef/dse.frm @@ -1,7 +1,10 @@ USE 31 JOIN 14 INTO NPROGTR==NPROGTR -JOIN 20 INTO TIPOCF=="C" CODCF==CODCF -JOIN 13 TO 20 INTO COM==COMCF +JOIN 20 INTO TIPOCF=="C" CODCF==CODCF +JOIN 17 TO 20 INTO TIPOCF==TIPOCF CODCF==CODCF +JOIN 16 TO 17 INTO TIPOCF==TIPOCF CODCF==CODCF CODIND==CODINDEFF +JOIN 13 TO 20 INTO COM==COMCF +JOIN 13 TO 16 ALIAS 213 INTO COM==COM JOIN %BAN ALIAS 201 INTO CODTAB[1,5]==CODABI JOIN %BAN ALIAS 203 INTO CODTAB==CODABI+CODCAB JOIN %BAN ALIAS 202 INTO CODTAB==CODABIP+CODCABP @@ -32,7 +35,7 @@ SECTION GRAPHICS ODD 4 END END -SECTION HEADER ODD 9 +SECTION HEADER ODD 8 STRING 1 50 BEGIN @@ -41,6 +44,7 @@ BEGIN MESSAGE _BANCAP END + STRING 2 20 BEGIN KEY "scritta elenco riba" @@ -71,43 +75,43 @@ END STRING 6 20 BEGIN KEY "scritta titolo righe del body" - PROMPT 2 7 "DEBITORE O TRASSATO" + PROMPT 2 6 "DEBITORE O TRASSATO" END STRING 7 10 BEGIN KEY "scritta titolo righe del body" - PROMPT 32 7 "INDIRIZZO" + PROMPT 32 6 "INDIRIZZO" END STRING 8 17 BEGIN KEY "scritta titolo righe del body" - PROMPT 62 7 "BANCA D'APPOGGIO" + PROMPT 62 6 "BANCA D'APPOGGIO" END STRING 9 11 BEGIN KEY "scritta titolo righe del body" - PROMPT 94 7 "FATTURA DEL" + PROMPT 94 6 "FATTURA DEL" END STRING 10 8 BEGIN KEY "scritta titolo righe del body" - PROMPT 111 7 "SCADENZA" + PROMPT 111 6 "SCADENZA" END STRING 11 7 BEGIN KEY "scritta titolo righe del body" - PROMPT 129 7 "IMPORTO" + PROMPT 129 6 "IMPORTO" END STRING 12 BEGIN KEY "riga separazione dalle righe del body" - PROMPT 2 8 "---------------------------------------------------------------------------------------------------------------------------------------------" + PROMPT 2 7 "---------------------------------------------------------------------------------------------------------------------------------------------" END END @@ -118,8 +122,7 @@ STRING 16 25 2 BEGIN KEY "debitore" PROMPT 2 1 "" - FIELD 20->RAGSOC - MESSAGE INC,FL->2 + MESSAGE _CLI,!RAGSOC|INC,FL->2 END STRING 27 16 @@ -194,19 +197,27 @@ BEGIN PROMPT 112 1 "" FIELD 31->DATASCAD END - -NUMERO 26 18 + +STRINGA 28 3 +BEGIN + KEY "Codice valuta" + PROMPT 0 0 "" + FIELD 31->CODVAL + FLAGS "H" +END + +VALUTA 26 18 BEGIN KEY "importo" PROMPT 122 1 "" MESSAGE _IMPORTO MESSAGE ADD,FL->3 - PICTURE "###.###.###.###" + DRIVENBY 28 END END -SECTION FOOTER LAST 2 +SECTION FOOTER LAST 3 STRINGA 1 BEGIN diff --git a/ef/ef0100.cpp b/ef/ef0100.cpp index fc50e4fdd..8db46834e 100755 --- a/ef/ef0100.cpp +++ b/ef/ef0100.cpp @@ -1,3 +1,4 @@ +#include #include #include #include @@ -11,6 +12,7 @@ #include "ef0101.h" #include +#include /////////////////////////////////////////////////////////////// // Classe per la gestione di effetti con metodi standard di: // @@ -80,6 +82,7 @@ void TVariazione_effetti::init_modify_mode(TMask&) { _msk->disable(F_TIPOCF); } + // ritorna il prossimo numero valido di chiave bool TVariazione_effetti::get_next_key(TToken_string& key) { @@ -372,13 +375,18 @@ bool TVariazione_effetti::fatt_handler(TMask_field& f, KEY k) m.enable(F_IMPFATTVAL, !ok && app().get_mask(MODE_MOD)->get(F_CODVAL).not_empty()); if (app().get_mask(MODE_MOD)->is_running() && ok && k == K_TAB && f.focusdirty()) { - TDocumento d(e.browse()->cursor()->curr()); + const TDocumento d(e.browse()->cursor()->curr()); m.set(F_DATAFATT, d.get("DATADOC")); const real imp = d.totale_doc(); if (d.in_valuta()) { - real lit = imp * d.get_real("CAMBIO"); - lit.round(0); +// real lit = imp * d.get_real("CAMBIO"); +// lit.round(0); + const TString16 codval = d.get(DOC_CODVAL); + TCurrency val(imp, codval, d.get_real(DOC_CAMBIO)); + val.change_to_firm_val(); + const real& lit = val.get_num(); + m.set(F_IMPFATT, lit); m.set(F_IMPFATTVAL, imp); } diff --git a/ef/ef0100b.uml b/ef/ef0100b.uml index ed79b7f1a..7ba5df010 100755 --- a/ef/ef0100b.uml +++ b/ef/ef0100b.uml @@ -61,20 +61,20 @@ BEGIN ADD MASK ba4100a END -BUTTON DLG_OK 9 2 +BUTTON DLG_OK 10 2 BEGIN PROMPT -13 -1 "" END -BUTTON DLG_CANCEL 9 2 +BUTTON DLG_CANCEL 10 2 BEGIN PROMPT -23 -1 "" END -BUTTON DLG_DELREC 9 2 +BUTTON DLG_DELREC 10 2 BEGIN - PROMPT -33 -1 "Elimina" - MESSAGE EXIT, K_DEL + PROMPT -33 -1 "" + MESSAGE EXIT,K_DEL END ENDPAGE diff --git a/ef/ef0100c.uml b/ef/ef0100c.uml index af1d14d4b..e2c7091b3 100755 --- a/ef/ef0100c.uml +++ b/ef/ef0100c.uml @@ -109,19 +109,19 @@ BEGIN PROMPT 2 13 "Nr. rata " END -BUTTON DLG_OK 9 2 +BUTTON DLG_OK 10 2 BEGIN PROMPT -13 -1 "" END -BUTTON DLG_CANCEL 9 2 +BUTTON DLG_CANCEL 10 2 BEGIN PROMPT -23 -1 "" END -BUTTON DLG_DELREC 9 2 +BUTTON DLG_DELREC 10 2 BEGIN - PROMPT -33 -1 "Elimina" + PROMPT -33 -1 "" MESSAGE EXIT, K_DEL END diff --git a/ef/ef0101.cpp b/ef/ef0101.cpp index 449f29de8..8741088af 100755 --- a/ef/ef0101.cpp +++ b/ef/ef0101.cpp @@ -1,3 +1,5 @@ +#include + #include "ef0101.h" ////////////////////////////////////////////////// @@ -234,11 +236,10 @@ TToken_string* TEffetto::dati_fatt(long num, const bool valuta) return dati; } -const bool TEffetto::in_valuta() +const bool TEffetto::in_valuta() const { - TString val = get(EFF_CODVAL); - val.upper(); - return val.not_empty() && val != "LIT"; + const TString16 val = get(EFF_CODVAL); + return val.not_empty() && val != TCurrency::get_firm_val(); } const char TEffetto::get_tipo() const diff --git a/ef/ef0101.h b/ef/ef0101.h index 8622d19d5..384b9085e 100755 --- a/ef/ef0101.h +++ b/ef/ef0101.h @@ -1,15 +1,10 @@ #ifndef __EF0101_H #define __EF0101_H -#ifndef __RELATION_H -#include -#endif -#ifndef __RECTYPES_H -#include -#endif #ifndef __RECARRAY_H #include #endif + #include #include #include @@ -21,6 +16,7 @@ class TEffetto:public TRectype { TRecord_array _righe;// righe dell'effetto TRecord_array _cess;// cessionari dell'effetto + protected: // ritorna la prossima chiave long get_next_key(const long codcf) const; @@ -83,7 +79,7 @@ public: int nrgdist() const { return get_int(EFF_NRIGADIST); } // restituisce l'importo dell'effetto real importo(const bool valuta = FALSE) const { return get_real(valuta ? EFF_IMPORTOVAL : EFF_IMPORTO); } - const bool in_valuta() ; + const bool in_valuta() const; const char get_tipo() const ; // setta i campi per la quarta chiave del file void put_key(TRectype& rec,char tipodist, long ndist, int nrigadist = 0); diff --git a/ef/ef0200.cpp b/ef/ef0200.cpp index f237d72ca..a1443b5aa 100755 --- a/ef/ef0200.cpp +++ b/ef/ef0200.cpp @@ -105,12 +105,13 @@ void Creazione_Effetti_da_EC::Load_Partite_Aperte(const long cli) bool Creazione_Effetti_da_EC::Gen_Handler(TMask_field& f, KEY k) { - if (k==K_TAB && f.focusdirty()) - { - real importo=(real)(const char*)f.mask().get(F_RATA); - importo+=(real)(const char*)f.mask().get(F_SPESE); - importo+=(real)(const char*)f.mask().get(F_BOLLI); - f.mask().set(F_IMPEFF,importo.string(".")); + if (k == K_TAB && f.focusdirty()) + { + TMask& m = f.mask(); + real importo = m.get(F_RATA); + importo += m.get_real(F_SPESE); + importo += m.get_real(F_BOLLI); + m.set(F_IMPEFF, importo); f.set_focusdirty(FALSE); } return TRUE; @@ -164,7 +165,6 @@ bool Creazione_Effetti_da_EC::Gen_Notify(TSheet_field& sheet, int r, KEY k) else app().set_res(new_res); real totale = importo; - totale+= real(row.get(2)); totale+= real(row.get(3)); row.add(totale.string(),4); @@ -173,7 +173,7 @@ bool Creazione_Effetti_da_EC::Gen_Notify(TSheet_field& sheet, int r, KEY k) default: break; } - sheet.mask().set(F_RESIDUO,app().get_res().string(".")); + sheet.mask().set(F_RESIDUO,app().get_res()); return TRUE; } @@ -191,7 +191,7 @@ bool Creazione_Effetti_da_EC::Cli_Handler(TMask_field&f, KEY k) bool Creazione_Effetti_da_EC::create() { _msk = new TMask("ef0200a"); - TSheet_field& sheet = (TSheet_field&) _msk->field(F_SHEET_EFF); + TSheet_field& sheet = _msk->sfield(F_SHEET_EFF); sheet.set_notify(Gen_Notify); sheet.enable_column(4,FALSE); TMask& mask= sheet.sheet_mask(); @@ -226,17 +226,19 @@ void Creazione_Effetti_da_EC::main_loop() } case K_F6: //Selects opened counts from E.C. { - _residuo=0.0; - _Partite_aperte = new TArray_sheet(-1,-1,0,0,"Selezione partite aperte","@1|Anno|Numero|Data documento|Saldo@15"); + _Partite_aperte = new TArray_sheet(-1,1,0,-1,"Selezione partite aperte","@1|Anno|Numero|Data documento|Saldo@15", 0, 1); Load_Partite_Aperte(get_msk()->get_long(F_CODCF)); - _Partite_aperte->run(); - for (int i=0; i<_Partite_aperte->items(); i++) - if (_Partite_aperte->checked(i)) - _residuo+=(real)_Partite_aperte->row(i).get(4); + if (_Partite_aperte->run() == K_ENTER) + { + _residuo = ZERO; + for (int i = 0; i < _Partite_aperte->items(); i++) + if (_Partite_aperte->checked(i)) + _residuo += real(_Partite_aperte->row(i).get(4)); + get_msk()->set(F_RESIDUO,_residuo); + TSheet_field& sheet = (TSheet_field&)get_msk()->field(F_SHEET_EFF); + sheet.reset(); + } delete _Partite_aperte; - get_msk()->set(F_RESIDUO,_residuo.string(".")); - TSheet_field& sheet = (TSheet_field&)get_msk()->field(F_SHEET_EFF); - sheet.reset(); break; } default: diff --git a/ef/ef0200a.uml b/ef/ef0200a.uml index db6dc852a..60de33e24 100755 --- a/ef/ef0200a.uml +++ b/ef/ef0200a.uml @@ -1,6 +1,6 @@ #include "ef0200.h" -PAGE "Selezione dati" -1 1 78 21 +PAGE "Selezione dati" -1 -1 78 19 GROUPBOX DLG_NULL 76 5 BEGIN @@ -147,13 +147,13 @@ BEGIN PROMPT 65 8 "" END -STRING F_RESIDUO 15 +CURRENCY F_RESIDUO 15 BEGIN PROMPT 2 10 "Residuo da ripartire " FLAGS "RD" END -SPREADSHEET F_SHEET_EFF 74 8 +SPREADSHEET F_SHEET_EFF 74 BEGIN PROMPT 2 12 "Immissione effetti" ITEM "Data scad." diff --git a/ef/ef0200b.uml b/ef/ef0200b.uml index 504806c1c..61bfb8e52 100755 --- a/ef/ef0200b.uml +++ b/ef/ef0200b.uml @@ -4,55 +4,48 @@ PAGE "Immissione effetti" -1 -1 60 10 DATE F_DATASCAD BEGIN - PROMPT 2 1 "Data scadenza " - HELP "Inserire la data di scadenza dell'effetto" - MESSAGE DISABLE,F_IMPEFF + PROMPT 2 1 "Data scadenza " + HELP "Inserire la data di scadenza dell'effetto" + MESSAGE DISABLE,F_IMPEFF END -NUMBER F_RATA 15 +CURRENCY F_RATA 15 BEGIN - PROMPT 2 3 "Importo rata " - PICTURE "." - FLAGS "R" - HELP "Inserire l'importo della rata" + PROMPT 2 3 "Importo rata " + HELP "Inserire l'importo della rata" END -NUMBER F_SPESE 15 +CURRENCY F_SPESE 15 BEGIN - PROMPT 2 5 "Spese incasso " - PICTURE "." - FLAGS "R" - HELP "Inserire l'importo delle spese d'incasso" + PROMPT 2 5 "Spese incasso " + HELP "Inserire l'importo delle spese d'incasso" END -NUMBER F_BOLLI 15 +CURRENCY F_BOLLI 15 BEGIN - PROMPT 2 7 "Importo bolli " - PICTURE "." - FLAGS "R" - HELP "Inserire l'importo dei bolli" + PROMPT 2 7 "Importo bolli " + HELP "Inserire l'importo dei bolli" END -STRING F_IMPEFF 15 +CURRENCY F_IMPEFF 15 BEGIN - PROMPT 2 9 "Importo effetto " - FLAGS "R" + PROMPT 2 9 "Importo effetto " END -BUTTON DLG_OK 9 2 +BUTTON DLG_OK 10 2 BEGIN - PROMPT 45 3 "" + PROMPT 45 3 "" END -BUTTON DLG_CANCEL 9 2 +BUTTON DLG_CANCEL 10 2 BEGIN - PROMPT 45 5 "" + PROMPT 45 5 "" END -BUTTON DLG_DELREC 9 2 +BUTTON DLG_DELREC 10 2 BEGIN - PROMPT 45 7 "Elimina" - MESSAGE EXIT,K_DEL + PROMPT 45 7 "" + MESSAGE EXIT,K_DEL END ENDPAGE diff --git a/ef/ef0300.cpp b/ef/ef0300.cpp index 25f00982d..acbaef87b 100755 --- a/ef/ef0300.cpp +++ b/ef/ef0300.cpp @@ -247,16 +247,16 @@ int TVariazione_distinte::read(TMask& m) const TString16 codval(eff.get(EFF_CODVAL)); if (i == 0) { - const bool valuta = (codval.not_empty() && codval != "LIT"); + const bool valuta = codval.not_empty() && codval != TCurrency::get_firm_val(); m.set(F_CODVAL, codval); m.enable(F_CODVAL, valuta); } riga.add(codval); - TCurrency soldi(eff.get_real(EFF_IMPORTO), "_FIRM"); - riga.add(soldi.string(TRUE)); + TCurrency soldi(eff.get_real(EFF_IMPORTO)); + riga.add(soldi.string()); TCurrency soldival(eff.get_real(EFF_IMPORTOVAL), codval); if (!soldival.get_num().is_zero()) - riga.add(soldival.string(TRUE)); + riga.add(soldival.string()); shrighe.row(i) = riga; } @@ -510,11 +510,11 @@ void TVariazione_distinte::carica_riba(int tipopag, const bool reset) riga.add(valuta); TCurrency soldi(eff.get_real(EFF_IMPORTO), "_FIRM"); - riga.add(soldi.string(TRUE)); + riga.add(soldi.string()); TCurrency soldival(eff.get_real(EFF_IMPORTOVAL), codval); if (!soldival.get_num().is_zero()) - riga.add(soldival.string(TRUE)); + riga.add(soldival.string()); sf.row(i) = riga; i++; diff --git a/ef/ef0300b.uml b/ef/ef0300b.uml index 67a9efbdc..d714c5b4e 100755 --- a/ef/ef0300b.uml +++ b/ef/ef0300b.uml @@ -62,18 +62,19 @@ BEGIN FLAGS "D" END -STRING F_IMPORTO 18 +CURRENCY F_IMPORTO 18 BEGIN PROMPT 2 10 "Importo " FIELD LF_EFFETTI->IMPORTO FLAGS "DR" END -STRING F_IMPORTOVAL 18 +CURRENCY F_IMPORTOVAL 18 BEGIN PROMPT 2 11 "Importo Val. " FIELD LF_EFFETTI->IMPORTOVAL FLAGS "DR" + DRIVENBY F_VALUTA END BUTTON DLG_OK 10 2 @@ -88,9 +89,7 @@ END BUTTON DLG_DELREC 10 2 BEGIN - PROMPT -33 -1 "Elimina" - PICTURE BMP_DELREC - PICTURE BMP_DELRECDN + PROMPT -33 -1 "" MESSAGE "X",F_CHECK END diff --git a/ef/ef0400.cpp b/ef/ef0400.cpp index ff49ddd70..831729061 100755 --- a/ef/ef0400.cpp +++ b/ef/ef0400.cpp @@ -1,6 +1,6 @@ #include -#include //per definizione BAR_ITEM #include +#include #include #include @@ -11,7 +11,7 @@ ///////////////////////////////////////////////////////////////////////////// //Classe per l'eliminazione di effetti di effetti con selezione per gruppi // ///////////////////////////////////////////////////////////////////////////// -class TEliminazione_effetti: public TApplication +class TEliminazione_effetti: public TSkeleton_application { TMask *_msk; TRelation *_rel; @@ -19,7 +19,7 @@ class TEliminazione_effetti: public TApplication TRectype *_from, *_to; virtual bool create() ; virtual bool destroy() ; - virtual bool menu(MENU_TAG); + virtual void main_loop(); protected: static bool from_numero_handler(TMask_field& f, KEY k); static bool to_numero_handler(TMask_field& f, KEY k); @@ -53,8 +53,7 @@ bool TEliminazione_effetti::create() _msk->set_handler(F_A_DATA, to_data_handler); _msk->set_handler(DLG_OK, conferma_handler); _msk->set_handler(DLG_CANCEL, annulla_handler); - dispatch_e_menu(BAR_ITEM(1)); - return TRUE; + return TSkeleton_application::create(); } // distrugge l'applicazione @@ -70,7 +69,7 @@ bool TEliminazione_effetti::destroy() } //Carica maschera eliminazione effetti -bool TEliminazione_effetti::menu(MENU_TAG) +void TEliminazione_effetti::main_loop() { KEY key = K_ENTER; while (key != K_QUIT)//finchè non si chiude la maschera @@ -78,7 +77,6 @@ bool TEliminazione_effetti::menu(MENU_TAG) _msk->reset(); key = _msk->run(); } - return FALSE; } //Handler per la gestione della prima chiave (from) del cursore per numero @@ -173,7 +171,9 @@ void TEliminazione_effetti::elimina() break; } //scelgo il filtro per il cursore - filter << "(TIPOCF=\")" << op2 << "\")"; + filter << "(TIPOCF=\"" << op2 << "\")"; + if (op2 == 'C') + filter << "||(TIPOCF=\"\")"; switch (op3) { case 'S': //cancello effetti stampati diff --git a/ef/ef0400a.uml b/ef/ef0400a.uml index d038b9bdd..a6cfe688a 100755 --- a/ef/ef0400a.uml +++ b/ef/ef0400a.uml @@ -40,7 +40,7 @@ BEGIN PROMPT 2 6 "Dalla Riba " GROUP 1 FIELD LF_EFFETTI->NPROGTR - USE LF_EFFETTI SELECT TIPOCF=#F_TIPODIST + USE LF_EFFETTI SELECT (TIPOCF=#F_TIPODIST)||((TIPOCF="")&&(#F_TIPODIST="C")) INPUT NPROGTR F_DA_RIBA DISPLAY "Nr. progressivo" NPROGTR DISPLAY "Data scadenza" DATASCAD @@ -53,7 +53,7 @@ BEGIN PROMPT 30 6 "Alla Riba " GROUP 1 FIELD LF_EFFETTI->NPROGTR - USE LF_EFFETTI SELECT TIPOCF=#F_TIPODIST + USE LF_EFFETTI SELECT (TIPOCF=#F_TIPODIST)||((TIPOCF="")&&(#F_TIPODIST="C")) INPUT NPROGTR F_A_RIBA DISPLAY "Nr. progressivo" NPROGTR DISPLAY "Data scadenza" DATASCAD @@ -74,7 +74,7 @@ BEGIN PROMPT 2 10 "Dalla Data " GROUP 2 FIELD LF_EFFETTI->DATASCAD - USE LF_EFFETTI KEY 3 SELECT TIPOCF=#F_TIPODIST + USE LF_EFFETTI KEY 3 SELECT (TIPOCF=#F_TIPODIST)||((TIPOCF="")&&(#F_TIPODIST="C")) INPUT DATASCAD F_DA_DATA DISPLAY "Data scadenza" DATASCAD DISPLAY "Nr. progressivo" NPROGTR @@ -88,7 +88,7 @@ BEGIN PROMPT 30 10 "Alla Data " GROUP 2 FIELD LF_EFFETTI->DATASCAD - USE LF_EFFETTI KEY 3 SELECT TIPOCF=#F_TIPODIST + USE LF_EFFETTI KEY 3 SELECT (TIPOCF=#F_TIPODIST)||((TIPOCF="")&&(#F_TIPODIST="C")) INPUT DATASCAD F_A_DATA DISPLAY "Data scadenza" DATASCAD DISPLAY "Nr. progressivo" NPROGTR diff --git a/ef/ef0500.cpp b/ef/ef0500.cpp index ce806b185..6d2b8261d 100755 --- a/ef/ef0500.cpp +++ b/ef/ef0500.cpp @@ -1,9 +1,9 @@ #include +#include #include #include #include #include -#include #include #include @@ -13,6 +13,8 @@ #include #include +#include +#include class TRiba_form; class TDistinta_form; @@ -20,9 +22,11 @@ class TRiba_file; enum fo { kb360 = 1, kb720 = 2, kb1200 = 3, kb1440 = 4 }; #define RIBAFILENAME "ribael.dat" + /////////////////////////////////////////////////////////////////////// // Classe per l'emissione di effetti e distinte su carta o su floppy // /////////////////////////////////////////////////////////////////////// + class TEmissione: public TSkeleton_application { fo _foutput; @@ -34,6 +38,7 @@ class TEmissione: public TSkeleton_application TDistinta_form* _formdse; TRiba_file* _trasfile; int _base_page_no; + protected: virtual bool create(void); virtual void main_loop(); @@ -56,10 +61,13 @@ protected: void aggiorna_dist(TCursor*); static bool annulla_handler(TMask_field& f, KEY k); public: - int base_no() { return _base_page_no;} - const TMask& msk() const {return *_msk;} - TEmissione() {}; - virtual ~TEmissione() {}; + + int base_no() { return _base_page_no; } + const TMask& msk() const { return *_msk; } + const TRelation& firm_rel() const { return *_firmrel; } + + TEmissione() {} + virtual ~TEmissione() {} }; // restituisce un riferimento all' applicazione @@ -72,20 +80,24 @@ class TRiba_form: public TForm { protected: virtual bool validate(TForm_item &, TToken_string &); + public: TRiba_form(const char *); - virtual ~TRiba_form(){}; + virtual ~TRiba_form() { } }; /////////////////////////////////////////////////////////////////// // Classe TDistinta_form customizzata dalla Form per le Distinte // /////////////////////////////////////////////////////////////////// + class TDistinta_form: public TForm { TRelation *_firmrel; TSorted_cursor *_cursor;// cursore che permette l'ordinamento degli effetti + protected: // nella distinta per data scadenza o per dati fattura virtual bool validate(TForm_item &, TToken_string &); + public: void set_order(const char tipo); virtual TCursor* cursor() const { return (TCursor*)_cursor;} @@ -98,20 +110,27 @@ public: ///////////////////////////////////////////////////// class TRiba_file: public TFile_text { - long _nditta; real _tot_importi; + char _codice_moneta; + protected: virtual void validate(TCursor& cur,TRecord_text &rec, TToken_string &val, TString& str); + public: - TRiba_file(const TString& file_name, const TString& config_name):TFile_text(file_name, config_name){} - virtual ~TRiba_file(){} - void set_ditta(long nditta){_nditta = nditta;} - const long ditta(void) const {return _nditta;} - void set_tot_importi(real importo){_tot_importi = importo;} - void add_tot_importi(real importo){_tot_importi += importo;} - const real tot_importi(void) const {return _tot_importi;} + void set_tot_importi(const real& importo) { _tot_importi = importo; } + void add_tot_importi(const real& importo) { _tot_importi += importo; } + const real tot_importi() const { return _tot_importi; } + + TRiba_file(const TString& file_name, const TString& config_name); + virtual ~TRiba_file() { } }; +TRiba_file::TRiba_file(const TString& file_name, const TString& config_name) + : TFile_text(file_name, config_name) +{ + _codice_moneta = TCurrency::get_firm_dec() == 0 ? ' ' : 'E'; +} + // creazione dell'applicazione bool TEmissione::create() { @@ -125,9 +144,12 @@ bool TEmissione::create() _rel->add(LF_REFFETTI, "NPROGTR=NPROGTR"); _rel->add(LF_CESS, "NPROGTR=NPROGTR"); _rel->add(LF_CLIFO, "TIPOCF=TIPOCF|CODCF=CODCF"); + _rel->add(LF_CFVEN, "TIPOCF==TIPOCF|CODCF==CODCF", 1, LF_CLIFO); + _rel->add(LF_INDSP, "TIPOCF==TIPOCF|CODCF==CODCF|CODIND==CODINDEFF", 1, LF_CFVEN); _rel->add("%BAN", "CODTAB[1,5]=CODABI", 1, 0, 401); _rel->add("%BAN", "CODTAB=CODABI+CODCAB", 1, 0, 402); _rel->add(LF_COMUNI, "STATO=STATOCF|COM=COMCF",1,LF_CLIFO); + _rel->add(LF_COMUNI, "STATO=STATO|COM=COM", 1, LF_INDSP, 213); _cur = NULL; _msk->set(F_NOMEFILE,RIBAFILENAME); // _trasfile = new TRiba_file(RIBAFILENAME, "riba.ini"); @@ -215,7 +237,6 @@ void TEmissione::floppy() ribaini = "riba.ini"; // utilizzo quello generico _trasfile = new TRiba_file(RIBAFILENAME, ribaini); - _trasfile->set_ditta(get_firm()); inizializza_file(); long n_eff = _cur->items(); @@ -290,7 +311,7 @@ void TEmissione::inizializza_cur() { const int ndist = _msk->get_int(F_NUMBER); const char tipodist = _msk->get(F_TIPODIST)[0]; - TRectype from(_rel->lfile().curr()); + TRectype from(_rel->curr()); from.zero(); from.put(EFF_TIPODIST, tipodist); from.put(EFF_NDIST, ndist); @@ -305,22 +326,23 @@ void TEmissione::inizializza_file() fileriba << ":\\" << _msk->get(F_NOMEFILE); _trasfile->open(fileriba,'w'); _trasfile->set_tot_importi(ZERO); + _trasfile->force_record_separator(_msk->get_bool(F_FORCESEP)); _foutput = (fo)_msk->get_int(F_FOR_OUT); } //emetto un record del flusso di effetti void TEmissione::record(THash_object& lavoro) { - TString chiave = lavoro.key(); - if (chiave !="EF" && chiave !="RB") - { - TTracciato_record& oggetto = (TTracciato_record&)lavoro.obj(); - const TString& tipo = oggetto.type(); - TRecord_text rec(tipo); - //carico il record da emettere - _trasfile->autoload(rec, *_cur, &tipo); - _trasfile->write(rec);//emetto i dati su file - } + const TString& chiave = lavoro.key(); + if (chiave != "EF" && chiave !="RB") + { + TTracciato_record& oggetto = (TTracciato_record&)lavoro.obj(); + const TString& tipo = oggetto.type(); + TRecord_text rec(tipo); + //carico il record da emettere + _trasfile->autoload(rec, *_cur, &tipo); + _trasfile->write(rec);//emetto i dati su file + } } //controllo che ci sia spazio a sufficenza per emettere il flusso @@ -331,7 +353,7 @@ bool TEmissione::ok_write() int dim = _trasfile->recordsize(); unsigned long nbyte = (elem*7+2)*dim; - TString16 unita; unita << _msk->get(F_UNITA)[0] << ":\\"; + TString16 unita; unita << _msk->get(F_UNITA)[0] << ":/"; return os_test_disk_free_space(unita, nbyte); } @@ -398,20 +420,19 @@ void TEmissione::print_rb(char tipost, int ndist, char tipodist, int ncopie, con fcur->freeze(); // se la stampa non si fa a video istanzia puntatore per la gestione // della barra di attesa + TProgind* pi = is_vis ? NULL : new TProgind(ncopie,"Stampa Effetti...",FALSE,TRUE); for (int j=0; j < ncopie; j++) { - TProgind* pi = NULL; - if (!is_vis) - pi = new TProgind(n,"Stampa Effetti...",FALSE,TRUE,10); + if (pi) pi->addstatus(1L); // aggiorna la barra d'attesa // ciclo sugli elementi del cursore di stampa //for (*fcur = 0; fcur->pos() < n; ++(*fcur)) { - if (pi) pi->addstatus(1L); // aggiorna la barra d'attesa _formrb->print(); // stampa il form } } if (tipost == 'D') // se emetto riba in definitiva devo aggiornare aggiorna_rb(fcur);// data, numero emissione e flag di stampa effetto + if (pi) delete pi; } // gestione emissione su moduli cartacei delle distinte @@ -442,14 +463,11 @@ void TEmissione::print_dse(char tipost, int ndist, char tipodist, int ncopie, co fcur->freeze(); // se la stampa non si fa a video istanzia puntatore per la gestione // della barra di attesa + TProgind* pi = is_vis ? NULL : new TProgind(ncopie,"Stampa Distinta...",FALSE,TRUE); for (int j=0; j < ncopie; j++) { - TProgind* pi; - if (!is_vis) - pi = new TProgind(n,"Stampa Distinta...",FALSE,TRUE,10); _base_page_no = 0; - if (!is_vis) - pi->addstatus(1L); // aggiorna la barra d'attesa + if (pi) pi->addstatus(1L); // aggiorna la barra d'attesa _formdse->find_field('F',last_page,2).set(""); // Azzera nr documenti _formdse->find_field('F',last_page,3).set(""); // Azzera tot documenti _formdse->print(); // stampa il form @@ -458,6 +476,7 @@ void TEmissione::print_dse(char tipost, int ndist, char tipodist, int ncopie, co } if (tipost == 'D') // se emetto distinta in definitiva ... aggiorna_dist(fcur);// ... devo aggiornare flag di stampa distinta + if (pi) delete pi; } void TEmissione::enable_dettaglio(TForm& form) const @@ -550,8 +569,8 @@ TRiba_form::TRiba_form(const char* name): TForm() // gestione dei messaggi estesi nei campi bool TRiba_form::validate(TForm_item &cf, TToken_string &s) { - const TString code(s.get(0)); - TString valore; + const TString16 code(s.get(0)); + TString80 valore; if (code == "_IMPORTO") { @@ -559,14 +578,9 @@ bool TRiba_form::validate(TForm_item &cf, TToken_string &s) // solo se e' in valuta (cambia anche la picture) // sintassi: _IMPORTO TEffetto effetto(cursor()->file().curr()); - TString picture(cf.picture()); const bool in_valuta = effetto.in_valuta(); real importo = effetto.importo(in_valuta); - if (in_valuta) - picture << ",@@@"; - valore = importo.string(picture); - cf.set(valore); - cf.put_paragraph(valore); + cf.set(importo.string()); } else if (code == "_BANCAP") { @@ -620,11 +634,11 @@ bool TRiba_form::validate(TForm_item &cf, TToken_string &s) TString descfatt; for (int i = 0; i < elem; i+=3) { - descfatt << dati->get(i); - descfatt << " "; - descfatt << dati->get(i+1); - descfatt << " "; - cf.set(descfatt); + descfatt << dati->get(i); + descfatt << " "; + descfatt << dati->get(i+1); + descfatt << " "; + cf.set(descfatt); } } // "!IMPFATT" se 1 sola fattura ne stampa l' importo @@ -632,11 +646,8 @@ bool TRiba_form::validate(TForm_item &cf, TToken_string &s) { if (condition) { - TString picture(cf.picture()); - if (in_valuta) - picture << ",@@@"; real importo(dati->get(2)); - cf.set(importo.string(picture)); + cf.set(importo.string()); } } } @@ -652,26 +663,39 @@ bool TRiba_form::validate(TForm_item &cf, TToken_string &s) // dove: è uno delle macro seguenti: // "!IND" INDIRIZZO + NR. CIVICO // "!PIAZZA" COMUNE + PROVINCIA + // "!CAP" CAP + // "!RAGSOC" Ragione sociale + // Queste macro sono state implementate per permettere di utilizzare + // L'indirizzo di spedizione effetti memorizzato in LF_CFVEN->CODINDEFF TString in(s.get()); if (in[0]=='!') { in.ltrim(1); TRelation* rel = relation(); + + const bool pick_normal = rel->lfile(LF_CFVEN).get_int(CFV_CODINDEFF) == 0; + if (in=="IND") { - valore = rel->lfile(LF_CLIFO).get(CLI_INDCF); - in = rel->lfile(LF_CLIFO).get(CLI_CIVCF); + valore = rel->lfile(pick_normal ? LF_CLIFO : LF_INDSP).get(pick_normal ? CLI_INDCF : IND_INDIR); + in = rel->lfile(pick_normal ? LF_CLIFO : LF_INDSP).get(pick_normal ? CLI_CIVCF : IND_CIV); if (in.not_empty()) valore << ", " << in; } else if (in=="PIAZZA") { - valore = rel->lfile(LF_COMUNI).get(COM_DENCOM); - in = rel->lfile(LF_COMUNI).get(COM_PROVCOM); + valore = rel->lfile(pick_normal ? LF_COMUNI : -213).get(COM_DENCOM); + in = rel->lfile(pick_normal ? LF_COMUNI : -213).get(COM_PROVCOM); if (in.not_empty()) valore << " (" << in << ")"; } + else + if (in=="RAGSOC") + valore = rel->lfile(pick_normal ? LF_CLIFO : LF_INDSP).get(pick_normal ? CLI_RAGSOC : IND_RAGSOC); + else + if (in=="CAPCF") + valore = rel->lfile(pick_normal ? LF_CLIFO : LF_INDSP).get(pick_normal ? CLI_CAPCF : IND_CAP); } cf.put_paragraph(valore); return (TRUE); @@ -716,14 +740,9 @@ bool TDistinta_form::validate(TForm_item &cf, TToken_string &s) // solo se e' in valuta (cambia anche la picture) // sintassi: _IMPORTO TEffetto effetto(cursor()->file().curr()); - TString picture(cf.picture()); const bool in_valuta = effetto.in_valuta(); real importo = effetto.importo(in_valuta); - if (in_valuta) - picture << ",@@@"; - valore = importo.string(picture); - cf.set(real::ita2eng(valore)); - cf.put_paragraph(valore); + cf.set(importo.string()); return (TRUE); } if (code == "_BANCAP") @@ -755,7 +774,7 @@ bool TDistinta_form::validate(TForm_item &cf, TToken_string &s) // "!RAGSOC" prende la ragione sociale della ditta corrente if (in=="RAGSOC") { - valore = _firmrel->lfile().get("RAGSOC"); + valore = _firmrel->curr().get("RAGSOC"); valore.strip_d_spaces(); cf.set(valore); } @@ -772,26 +791,38 @@ bool TDistinta_form::validate(TForm_item &cf, TToken_string &s) // dove: è uno delle macro seguenti: // "!IND" INDIRIZZO + NR. CIVICO // "!PIAZZA" COMUNE + PROVINCIA + // "!CAP" CAP + // "!RAGSOC" Ragione sociale + // Queste macro sono state implementate per permettere di utilizzare + // L'indirizzo di spedizione effetti memorizzato in LF_CFVEN->CODINDEFF TString in(s.get()); if (in[0]=='!') { in.ltrim(1); TRelation* rel = relation(); + + const bool pick_normal = rel->lfile(LF_CFVEN).get_int(CFV_CODINDEFF) == 0; + if (in=="IND") { - valore = rel->lfile(LF_CLIFO).get(CLI_INDCF); - in = rel->lfile(LF_CLIFO).get(CLI_CIVCF); + valore = rel->lfile(pick_normal ? LF_CLIFO : LF_INDSP).get(pick_normal ? CLI_INDCF : IND_INDIR); + in = rel->lfile(pick_normal ? LF_CLIFO : LF_INDSP).get(pick_normal ? CLI_CIVCF : IND_CIV); if (in.not_empty()) valore << ", " << in; } else if (in=="PIAZZA") { - valore = rel->lfile(LF_COMUNI).get(COM_DENCOM); - in = rel->lfile(LF_COMUNI).get(COM_PROVCOM); + valore = rel->lfile(pick_normal ? LF_COMUNI : -213).get(COM_DENCOM); + in = rel->lfile(pick_normal ? LF_COMUNI : -213).get(COM_PROVCOM); if (in.not_empty()) valore << " (" << in << ")"; } + if (in=="RAGSOC") + valore = rel->lfile(pick_normal ? LF_CLIFO : LF_INDSP).get(pick_normal ? CLI_RAGSOC : IND_RAGSOC); + else + if (in=="CAPCF") + valore = rel->lfile(pick_normal ? LF_CLIFO : LF_INDSP).get(pick_normal ? CLI_CAPCF : IND_CAP); } cf.set(valore); cf.put_paragraph(valore); @@ -844,7 +875,7 @@ bool TDistinta_form::validate(TForm_item &cf, TToken_string &s) } // gestione dei messaggi estesi nei campi -void TRiba_file:: validate(TCursor& cur,TRecord_text &rec, TToken_string &s, TString& str) +void TRiba_file::validate(TCursor& cur,TRecord_text &rec, TToken_string &s, TString& str) { const TString code(s.get(0)); TString valore; @@ -909,14 +940,13 @@ void TRiba_file:: validate(TCursor& cur,TRecord_text &rec, TToken_string &s, TSt // "2" la ragione sociale andrà ad occupare più campi, secondo segmento // "3" la ragione sociale andrà ad occupare più campi, terzo segmento // "4" la ragione sociale andrà ad occupare più campi, quarto segmento - TLocalisamfile ditte(LF_NDITTE); - ditte.put("CODDITTA",ditta()); - ditte.read(); + TString in(s.get()); CHECK(in[0]=='!',"Macro _DITTA senza carattere '!'"); in.ltrim(1); if (in=="RAGSOC") { + const TRectype& ditte = app().firm_rel().curr(); const TString ragsoc = ditte.get("RAGSOC"); in = s.get(); if (in == "0") @@ -930,13 +960,9 @@ void TRiba_file:: validate(TCursor& cur,TRecord_text &rec, TToken_string &s, TSt } else { - TParagraph_string string(ragsoc,24); - string.restart(); - int indice = atoi(in); - if (in == "1") valore = string.get(indice-1); - if (in == "2") valore = string.get(indice-1); - if (in == "3") valore = string.get(indice-1); - if (in == "4") valore = string.get(indice-1); + TParagraph_string string(ragsoc,24); + const int indice = atoi(in); + valore = string.get(indice-1); } } else @@ -954,14 +980,18 @@ void TRiba_file:: validate(TCursor& cur,TRecord_text &rec, TToken_string &s, TSt // dove: è uno delle opzioni seguenti: // "1" la ragione sociale andrà ad occupare più campi, primo segmento // "2" la ragione sociale andrà ad occupare più campi, secondo segmento - TRectype& clifo = cur.curr(LF_CLIFO); - TRectype& comuni = cur.curr(LF_COMUNI); + const bool pick_normal = cur.relation()->lfile(LF_CFVEN).get_int(CFV_CODINDEFF) == 0; + + TRectype& clifo_1 = cur.curr(LF_CLIFO); + TRectype& clifo_2 = cur.curr(pick_normal ? LF_CLIFO : LF_INDSP); + TRectype& comuni = cur.curr(pick_normal ? LF_COMUNI: -213); + TString in(s.get()); CHECK(in[0]=='!',"Macro _DEBITORE senza carattere '!'"); in.ltrim(1); if (in=="RAGSOC") { - TString ragsoc = clifo.get("RAGSOC"); + TString ragsoc = clifo_2.get(pick_normal ? CLI_RAGSOC : IND_RAGSOC); in = s.get(); TParagraph_string string(ragsoc,30); string.restart(); @@ -972,11 +1002,11 @@ void TRiba_file:: validate(TCursor& cur,TRecord_text &rec, TToken_string &s, TSt else if (in=="INDIRIZZO") { valore.cut(0); - valore << clifo.get("INDCF"); + valore << clifo_2.get(pick_normal ? CLI_INDCF : IND_INDIR); valore.trim(); - valore << " " << clifo.get_int("CIVCF"); + valore << " " << clifo_2.get_int(pick_normal ? CLI_CIVCF : IND_CIV); valore.trim(); - valore << " " << clifo.get("LOCALITACF"); + valore << " " << clifo_2.get(pick_normal ? CLI_LOCCF : IND_LOCALITA); valore.trim(); } else if (in=="COMUNE") @@ -992,10 +1022,10 @@ void TRiba_file:: validate(TCursor& cur,TRecord_text &rec, TToken_string &s, TSt } else if (in=="CFPI") { - valore = clifo.get("PAIV"); + valore = clifo_1.get("PAIV"); valore.trim(); if (valore.empty()) - valore = clifo.get("COFI"); + valore = clifo_1.get("COFI"); valore.trim(); } else @@ -1060,26 +1090,34 @@ void TRiba_file:: validate(TCursor& cur,TRecord_text &rec, TToken_string &s, TSt CHECK(in[0]=='!',"Macro _IMPORTO senza carattere '!'"); if (in=="!ADD") { - real importo(str); + // real importo(str); + real importo = cur.curr(LF_REFFETTI).get(REFF_IMPORTO); + if (_codice_moneta == 'E') + importo *= 100.0; + importo.round(0); add_tot_importi(importo); valore = importo.string(13,0); } else if (in=="!TOT") { - real importo = tot_importi(); + const real& importo = tot_importi(); valore = importo.string("##############@"); set_tot_importi(ZERO); } else CHECKS (TRUE,"Sotto-Macro _IMPORTO non definita",(const char *)in); - } else - if (code == "_CODSIA") - { - TConfig cnf(CONFIG_DITTA, "ef"); - valore = cnf.get("CODSIA"); - } - else - CHECKS (TRUE,"Macro non definita",(const char *)code); + } + else if (code == "_CODSIA") + { + TConfig cnf(CONFIG_DITTA, "ef"); + valore = cnf.get("CODSIA"); + } + else if (code == "_CODMON") + { + valore.format("%c", _codice_moneta); + } + else NFCHECK("Macro non definita: %s", (const char *)code); + str = valore; } diff --git a/ef/ef0500.h b/ef/ef0500.h index 8cefcbc3e..f445a44da 100755 --- a/ef/ef0500.h +++ b/ef/ef0500.h @@ -19,5 +19,6 @@ #define F_NOMEFILE 113 #define F_TIPOCF 114 #define F_DETTAGLIO 115 +#define F_FORCESEP 116 #endif //__EF0500_H diff --git a/ef/ef0500a.uml b/ef/ef0500a.uml index 69d0b09ce..5d8ef10d7 100755 --- a/ef/ef0500a.uml +++ b/ef/ef0500a.uml @@ -20,6 +20,12 @@ BEGIN FLAGS "D" END +BOOLEAN F_FORCESEP +BEGIN + PROMPT 43 4 "Forza la separazione record" + GROUP 1 +END + LIST F_TIPODIST 18 BEGIN PROMPT 2 5 "Tipo Distinta " @@ -31,17 +37,17 @@ END LIST F_TIPOCF 1 8 BEGIN - PROMPT 43 4 "Tipo Effetti " + PROMPT 43 5 "Tipo Effetti " ITEM "C|Attivi" ITEM "F|Passivi" END NUMBER F_NUMBER 5 BEGIN - PROMPT 43 5 "Numero Distinta " + PROMPT 43 6 "Numero Distinta " FLAGS "R" KEY 4 - USE LF_EFFETTI KEY 4 SELECT (NRIGADIST=1)&&(TIPOCF=#F_TIPOCF) + USE LF_EFFETTI KEY 4 SELECT (NRIGADIST=1)&&((TIPOCF=#F_TIPOCF)||((TIPOCF="")&&(#F_TIPOCF="C"))) INPUT NDIST F_NUMBER INPUT TIPODIST F_TIPODIST INPUT NRIGADIST F_NUMBERRIGA @@ -137,7 +143,7 @@ BEGIN GROUP 2 END -BUTTON DLG_OK 9 2 +BUTTON DLG_OK 10 2 BEGIN PROMPT -13 -1 "" END @@ -147,7 +153,7 @@ BEGIN PROMPT -23 -1 "" END -BUTTON DLG_QUIT 9 2 +BUTTON DLG_QUIT 10 2 BEGIN PROMPT -33 -1 "" END diff --git a/ef/ef0600.cpp b/ef/ef0600.cpp index df0aee30a..6a281bf58 100755 --- a/ef/ef0600.cpp +++ b/ef/ef0600.cpp @@ -1,8 +1,6 @@ #include #include #include -#include -#include #include #include #include @@ -15,7 +13,7 @@ #define PICTURE_IMPORTO "###.###.###.##@,@@" -enum pt {undefined = 0, st_banca = 1, st_cliente = 2, st_distinta = 3, st_scadenza = 4}; +enum pt { st_undefined = 0, st_banca = 1, st_cliente = 2, st_distinta = 3, st_scadenza = 4}; ////////////////////////////////////////////////////////////////////// // Classe per le stampe di controllo degli effetti in portafoglio // @@ -31,7 +29,7 @@ class TPrint_effetti_app : public TPrintapp int _cur_1, _cur_2, _cur_3, _cur_4, _interline; long _dist_prec, _cliente_prec; char _tipo_prec, _tipocf_prec; - real _tot_data, _tot_mese, _tot_banca, _tot_distinta, _tot_tip_dist, _tot_cliente, _tot_stampa; + real _tot_data, _tot_mese, _tot_banca, _tot_distinta, _tot_tip_dist, _tot_cliente, _tot_stampa; bool _prima_volta; public: virtual bool preprocess_page(int file, int counter); @@ -56,10 +54,10 @@ public: const TString& look_clifo(char tipo, long codcf, TString& cli) const; void st_tot_scad(); void st_tot_mese(); - void st_header_scad(const TDate* scad); - void st_header_ban(const TString* ban); + void st_header_scad(const TDate& scad); + void st_header_ban(const TString& ban); void st_header_dist(const char tipodist); - void st_header_cliente(const TString* cli); + void st_header_cliente(const TString& cli); TPrint_effetti_app(); virtual ~TPrint_effetti_app(){}; }; @@ -117,8 +115,11 @@ void TPrint_effetti_app::st_tot_scad() void TPrint_effetti_app::st_tot_mese() { _pr.put("TOTALE ",50); - _pr.put(itom(_scad_prec.month()),57); - _pr.put(_tot_mese.string(PICTURE_IMPORTO),72); + if (_scad_prec.ok()) + { + _pr.put(itom(_scad_prec.month()),57); + _pr.put(_tot_mese.string(PICTURE_IMPORTO),72); + } printer().print(_pr); _tot_mese = 0.0; _pr.reset(); @@ -126,23 +127,26 @@ void TPrint_effetti_app::st_tot_mese() // stampa l'intestazione per mese data scadenza // (dopo la "rottura" per mese) -void TPrint_effetti_app::st_header_scad(const TDate* scad) -{ - TString year = scad->string(); - year = year.right(4); - _pr.put(itom(scad->month()),1); - _pr.put(year,10); +void TPrint_effetti_app::st_header_scad(const TDate& scad) +{ + if (scad.ok()) + { + TString16 year = scad.string(); + year = year.right(4); + _pr.put(itom(scad.month()),1); + _pr.put(year,10); + } printer().print(_pr); _pr.reset(); } // stampa intestazione per banca di presentazione // (dopo la "rottura" per banca) -void TPrint_effetti_app::st_header_ban(const TString* ban) +void TPrint_effetti_app::st_header_ban(const TString& ban) { - TString s = (look_tab("%BAN",*ban)); + TString80 s = look_tab("%BAN",ban); if (s.empty()) - s = "Nessuna Banca di Presentazione"; + s = "Nessuna Banca di Presentazione"; _pr.put(s,1); printer().print(_pr); _pr.reset(); @@ -174,9 +178,9 @@ void TPrint_effetti_app::st_header_dist(const char tipodist) } // stampa intestazione per cliente (dopo la "rottura" per cliente) -void TPrint_effetti_app::st_header_cliente(const TString* cli) +void TPrint_effetti_app::st_header_cliente(const TString& cli) { - _pr.put(*cli,1); + _pr.put(cli,1); printer().print(_pr); _pr.reset(); } @@ -227,7 +231,7 @@ void TPrint_effetti_app::header_scadenza() int j =2; set_header(j, "@52gSTAMPA RI.BA. PER SCADENZA"); j++; set_header(j++, (const char *)(TString(132).fill('-'))); - set_header(j++, " Scadenza Banca Cliente N.Riba N.Dist Importo Val N.Rata St.Def. Fattura del. N."); + set_header(j++, " Scadenza Banca Cliente N.Riba N.Dist Importo Val. N.Rata St.Def. Fattura del. N."); set_header(j, (const char *)(TString(132).fill('-'))); } @@ -237,7 +241,7 @@ void TPrint_effetti_app::header_banca() int j = 2; set_header(j, "@45gSTAMPA RI.BA. PER BANCHE DI PRESENTAZIONE"); j++; set_header(j++, (const char *)(TString(132).fill('-'))); - set_header(j++, " Banca Scadenza Cliente N.Riba N.Dist Importo Val. N.Rata St.Def. Fattura del. N."); + set_header(j++, " Banca Scadenza Cliente N.Riba N.Dist Importo Val. N.Rata St.Def. Fattura del. N."); set_header(j, (const char *)(TString(132).fill('-'))); } @@ -248,7 +252,7 @@ void TPrint_effetti_app::header_distinta() set_header(j, "@55gSTAMPA RI.BA. PER DISTINTE"); j++; set_header(j++, (const char *)(TString(132).fill('-'))); set_header(j++, " Distinta "); - set_header(j++, "@1gTipo Num. N.Riba Scadenza Banca Cliente Importo Val. N.Rata St.Def. Fattura del. N."); + set_header(j++, "@1gTipo Num. N.Riba Scadenza Banca Cliente Importo Val. N.Rata St.Def. Fattura del. N."); set_header(j, (const char *)(TString(132).fill('-'))); } @@ -398,7 +402,7 @@ void TPrint_effetti_app::set_page(int file, int counter) void TPrint_effetti_app::set_scadenza() { set_row(1," "); - set_row(2,"@1g@s@13g#t@26g#t@54g@pn@63g@pn@72g@pn@91g#t@98g@pn@106g@s@114g@s@128g@n", + set_row(2,"@1g@s@13g#t@26g#t@54g@pn@63g@pn@72g@pn@91g#t@98g@pn@106g@s@114g@s@125g@n", FLD(LF_EFFETTI, EFF_DATASCAD), &_ban, &_cli, @@ -419,7 +423,7 @@ void TPrint_effetti_app::set_scadenza() void TPrint_effetti_app::set_banca() { set_row(1," "); - set_row(2,"@1g#t@14g@s@26g#t@54g@pn@63g@pn@72g@pn@91g#t@98g@pn@106g@s@114g@s@128g@n", + set_row(2,"@1g#t@14g@s@26g#t@54g@pn@63g@pn@72g@pn@91g#t@98g@pn@106g@s@114g@s@125g@n", &_ban, FLD(LF_EFFETTI, EFF_DATASCAD), &_cli, @@ -439,7 +443,7 @@ void TPrint_effetti_app::set_banca() void TPrint_effetti_app::set_distinta() { set_row(1," "); - set_row(2,"@3g@s@5g@pn@16g@pn@27g@s@41g#t@55g#t@72g@pn@91g#t@98g@pn@106g@s@114g@s@128g@n", + set_row(2,"@3g@s@5g@pn@16g@pn@24g@ld@35g#t@48g#-25t@72g@pn@91g#-4t@98g@pn@106g@s@114g@s@128g@n", FLD(LF_EFFETTI, EFF_TIPODIST), FLD(LF_EFFETTI, EFF_NDIST, "#######@"), FLD(LF_EFFETTI, EFF_NPROGTR, "#####@"), @@ -460,7 +464,7 @@ void TPrint_effetti_app::set_distinta() void TPrint_effetti_app::set_cliente() { set_row(1," "); - set_row(2,"@5g@pn@25g@s@37g#t@50g@pn@59g@pn@72g@pn@91g#t@98g@pn@106g@s@114g@s@128g@n", + set_row(2,"@5g@pn@25g@s@37g#t@50g@pn@59g@pn@72g@pn@91g#t@98g@pn@106g@s@114g@s@125g@n", FLD(LF_EFFETTI, EFF_CODCF,"@@@@@@"), FLD(LF_EFFETTI, EFF_DATASCAD), &_ban, @@ -483,7 +487,7 @@ bool TPrint_effetti_app::preprocess_page(int file, int counter) // scarico i dati, dal record corrente del cursore, che mi // necessitano per effettuare la "rorrura della stampa" TRectype & rec = current_cursor()->curr(); - TDate scad = rec.get_date (EFF_DATASCAD); + const TDate scad = rec.get_date (EFF_DATASCAD); TString ban = rec.get (EFF_CODABIP); long dist = rec.get_long (EFF_NDIST); char tipodist = rec.get_char(EFF_TIPODIST); @@ -504,7 +508,10 @@ bool TPrint_effetti_app::preprocess_page(int file, int counter) _cli = get_field(LF_CLIFO, CLI_RAGSOC); s = _cli.mid(30,50); s.trim(); _cli = _cli.mid(0,30); _cli.trim(); - _cli << " " << s; + _cli << " " << s; + + if (_pr_type != st_cliente) + _cli = _cli.left(25); s = get_field(LF_EFFETTI, EFF_CODVAL); (s.empty())?_val = s:_val = "Lit."; @@ -520,12 +527,12 @@ bool TPrint_effetti_app::preprocess_page(int file, int counter) { case st_scadenza: _scad_prec = scad; - st_header_scad(&scad); + st_header_scad(scad); break; case st_banca: _scad_prec = scad; _ban_prec = ban; - st_header_ban(&ban); + st_header_ban(ban); break; case st_distinta: _scad_prec = scad; @@ -537,7 +544,7 @@ bool TPrint_effetti_app::preprocess_page(int file, int counter) _scad_prec = scad; _cliente_prec = cliente; _tipocf_prec = tipocf; - st_header_cliente(&_cli); + st_header_cliente(_cli); break; default: break; @@ -589,7 +596,7 @@ bool TPrint_effetti_app::preprocess_page(int file, int counter) st_tot_mese(); _pr.reset(); printer().print(_pr); - st_header_scad(&scad); + st_header_scad(scad); } _scad_prec = scad; _tot_data += importo; @@ -626,7 +633,7 @@ bool TPrint_effetti_app::preprocess_page(int file, int counter) _pr.reset(); printer().print(_pr); // stampo nuovo header banca - st_header_ban(&ban); + st_header_ban(ban); } _scad_prec = scad; _ban_prec = ban; @@ -644,7 +651,7 @@ bool TPrint_effetti_app::preprocess_page(int file, int counter) st_tot_mese(); _pr.reset(); printer().print(_pr); - st_header_scad(&scad); + st_header_scad(scad); } if (dist !=_dist_prec) { @@ -737,7 +744,7 @@ bool TPrint_effetti_app::preprocess_page(int file, int counter) _tot_cliente = 0.0; _pr.reset(); printer().print(_pr); - st_header_cliente(&_cli); + st_header_cliente(_cli); } _cliente_prec = cliente; _tipocf_prec = tipocf; @@ -772,7 +779,7 @@ bool TPrint_effetti_app::set_print(int) mask.run(); force_setpage(FALSE); if (mask.last_key() == K_QUIT) - return FALSE; + return FALSE; _pr_type = (pt) mask.get_int(RDB_TIPOST); TDate data_stampa (mask.get(F_DATA_STAMPA)); _data_stampa = data_stampa.string(); @@ -810,27 +817,27 @@ bool TPrint_effetti_app::set_print(int) select_cursor(_cur_2); break; case st_distinta: - { - cod_from = mask.get(F_DA_DATA3); - cod_to = mask.get(F_A_DATA3); - from.put(EFF_DATASCAD,cod_from); - to.put(EFF_DATASCAD,cod_to); - cod_from = mask.get(F_DADIST); - cod_to = mask.get(F_ADIST); - filter.cut(0); - const TString16 tipodist(mask.get(F_DATIPODIST)); - - if (tipodist.not_empty()) - { - if (cod_from.not_empty()) - filter << "(NDIST>=" << cod_from << ") &&"; - if (cod_to.empty()) // le distinte - cod_to = "99999999"; - filter << "(NDIST<=" << cod_to << ")&&(TIPODIST==\"" << tipodist << "\")"; - } - else - filter << "(NDIST<=\"\")"; - select_cursor(_cur_3); + { + cod_from = mask.get(F_DA_DATA3); + cod_to = mask.get(F_A_DATA3); + from.put(EFF_DATASCAD,cod_from); + to.put(EFF_DATASCAD,cod_to); + cod_from = mask.get(F_DADIST); + cod_to = mask.get(F_ADIST); + filter.cut(0); + const TString16 tipodist(mask.get(F_DATIPODIST)); + + if (tipodist.not_empty()) + { + if (cod_from.not_empty()) + filter << "STR(NDIST>=" << cod_from << ")&&"; + if (cod_to.not_empty()) // le distinte + filter << "STR(NDIST<=" << cod_to << ")&&"; + filter << "(TIPODIST==\"" << tipodist << "\")"; + } + else + filter << "(NDIST<=\"\")"; + select_cursor(_cur_3); } break; case st_cliente: @@ -904,4 +911,4 @@ int ef0600(int argc, char* argv[]) TPrint_effetti_app app; app.run(argc, argv, "Stampe Controllo Effetti"); return 0; -} \ No newline at end of file +} diff --git a/ef/ef0600a.uml b/ef/ef0600a.uml index 2e5780232..e618a406a 100755 --- a/ef/ef0600a.uml +++ b/ef/ef0600a.uml @@ -54,13 +54,13 @@ BEGIN PROMPT 2 8 "Dalla Banca " FLAGS "RZ" GROUP 2 - USE BNP -// KEY 1 SELECT CODTAB ?= "?????" + USE BNP KEY 1 SELECT CODTAB ?= "??????????" + JOIN %BAN ALIAS 100 INTO CODTAB==CODTAB INPUT CODTAB F_DABAN DISPLAY "Codice ABI" CODTAB[1,5] - DISPLAY "Denominazione@50" S0 + DISPLAY "Denominazione@50" %BAN->S0 OUTPUT F_DABAN CODTAB[1,5] - CHECKTYPE NORMAL + CHECKTYPE SEARCH END NUMBER F_ABAN 5 @@ -68,13 +68,13 @@ BEGIN PROMPT 30 8 "Alla Banca " FLAGS "RZ" GROUP 2 - USE BNP -// KEY 1 SELECT CODTAB ?= "?????" + USE BNP KEY 1 SELECT CODTAB ?= "??????????" + JOIN %BAN ALIAS 100 INTO CODTAB==CODTAB INPUT CODTAB F_ABAN DISPLAY "Codice ABI" CODTAB[1,5] - DISPLAY "Denominazione@50" S0 - OUTPUT F_ABAN CODTAB[1,5] - CHECKTYPE NORMAL + DISPLAY "Denominazione@50" %BAN->S0 + OUTPUT F_ABAN CODTAB[1,5] + CHECKTYPE SEARCH END DATA F_DA_DATA2 diff --git a/ef/ef0700.cpp b/ef/ef0700.cpp index 90f6aaec7..74fa6def3 100755 --- a/ef/ef0700.cpp +++ b/ef/ef0700.cpp @@ -1,5 +1,4 @@ #include -#include #include "batbbnp.h" @@ -17,50 +16,58 @@ protected: public: // @cmember Disabilita la verifica del modulo : essendo una anagrafica, va sempre abilitata - virtual bool check_autorization() const - {return FALSE;} - TBnp_table_app() {} - virtual ~TBnp_table_app() {} + virtual bool check_autorization() const { return FALSE; } + + TBnp_table_app() { } + virtual ~TBnp_table_app() { } }; -HIDDEN inline TBnp_table_app& app() { return (TBnp_table_app&) main_app();} - +HIDDEN inline TBnp_table_app& app() { return (TBnp_table_app&) main_app(); } void TBnp_table_app::init_query_insert_mode(TMask& m) { - m.show(F_CODICEABI); - m.show(F_CODICECAB); - m.field(F_CODICEABI).check_type(CHECK_REQUIRED); - m.field(F_CODICECAB).check_type(CHECK_REQUIRED); - m.hide(F_ABI); - m.hide(F_CAB); - m.field(F_ABI).check_type(CHECK_NONE); - m.field(F_CAB).check_type(CHECK_NONE); + if (get_tabname() == "BNP") + { + m.show(F_CODICEABI); + m.show(F_CODICECAB); + m.field(F_CODICEABI).check_type(CHECK_REQUIRED); + m.field(F_CODICECAB).check_type(CHECK_REQUIRED); + m.hide(F_ABI); + m.hide(F_CAB); + m.field(F_ABI).check_type(CHECK_NONE); + m.field(F_CAB).check_type(CHECK_NONE); + } } void TBnp_table_app::init_insert_mode(TMask& m) { - m.show(F_CODICEABI); - m.show(F_CODICECAB); - m.field(F_CODICEABI).check_type(CHECK_REQUIRED); - m.field(F_CODICECAB).check_type(CHECK_REQUIRED); - m.hide(F_ABI); - m.hide(F_CAB); - m.field(F_ABI).check_type(CHECK_NONE); - m.field(F_CAB).check_type(CHECK_NONE); + if (get_tabname() == "BNP") + { + m.show(F_CODICEABI); + m.show(F_CODICECAB); + m.field(F_CODICEABI).check_type(CHECK_REQUIRED); + m.field(F_CODICECAB).check_type(CHECK_REQUIRED); + m.hide(F_ABI); + m.hide(F_CAB); + m.field(F_ABI).check_type(CHECK_NONE); + m.field(F_CAB).check_type(CHECK_NONE); + } } void TBnp_table_app::init_query_mode(TMask& m) { TTable_application::init_query_mode(m); - m.show(F_ABI); - m.show(F_CAB); - m.field(F_ABI).check_type(CHECK_REQUIRED); - m.field(F_CAB).check_type(CHECK_REQUIRED); - m.hide(F_CODICEABI); - m.hide(F_CODICECAB); - //m.field(F_CODICEABI).check_type(CHECK_NONE); - m.field(F_CODICECAB).check_type(CHECK_NONE); + if (get_tabname() == "BNP") + { + m.show(F_ABI); + m.show(F_CAB); + m.field(F_ABI).check_type(CHECK_REQUIRED); + m.field(F_CAB).check_type(CHECK_REQUIRED); + m.hide(F_CODICEABI); + m.hide(F_CODICECAB); + //m.field(F_CODICEABI).check_type(CHECK_NONE); + m.field(F_CODICECAB).check_type(CHECK_NONE); + } } bool TBnp_table_app::user_create() @@ -68,10 +75,7 @@ bool TBnp_table_app::user_create() TTable_application::user_create(); const TString& name = get_tabname(); if (name.empty()) - { - error_box("Specificare la tabella sulla linea di comando."); - return FALSE; - } + return error_box("Specificare la tabella sulla linea di comando."); return TRUE; } diff --git a/ef/ef0800.cpp b/ef/ef0800.cpp index 5bcfb41be..4b5c19bfa 100755 --- a/ef/ef0800.cpp +++ b/ef/ef0800.cpp @@ -39,6 +39,7 @@ #include "../cg/cg2101.h" #include "../cg/cg2103.h" #include "../cg/cgsaldac.h" +#include "../cg/cglib02.h" #include "../ve/velib.h" #include "ef0301.h" #include "ef0800a.h" @@ -86,22 +87,26 @@ class TContabilizzazione_effetti_app : public TSkeleton_application TTable *_cpg, // tabella condizioni di pagamento *_bnp; // tabella banca presentazione effetti TBill _banca, // conto di contropartita della banca - _cliente; // conto di contropartita del cliente + _cliente, // conto di contropartita del cliente + _trandiffcam; // conto di transizione per differenze cambi TArray_sheet *_dist_sheet; // array_sheet di distinte selezionabili per la conatabilizzazione TDistinta *_distinta; // Distinta per le elaborazioni TPartite_array *_part_array; // Array di partite da scrivere TMovimentoPN *_movimento; // Movimento di prima nota + TSaldo_agg _saldo; // Saldo da aggiornare TCausale *_caus; // Causale contabile per le elaborazioni error_type _error; // Errore rilevato durante l'elaborazione long _total_bills; // Totale distinte contabilizzate. int _cur_dist_row;// Numero di riga distinta corrente (per visualizzazione errore) protected: // TApplication // Compila la testata del movimento - void compile_head_mov(); + void compile_head_mov(); // Compila la riga di partita - void compile_riga_partita(TRiga_partite& riga, const TEffetto& effetto, const TRectype& riga_effetto); + void compile_riga_partita(TRiga_partite& riga, const TEffetto& effetto, const TRectype& riga_effetto, int numrig); // Compila la riga di pagamento - void compile_riga_pagamento(TRectype& riga_pagamento, const TEffetto& effetto, const TRectype& riga_effetto, char acc_sal); + void compile_riga_pagamento(TRectype& riga_pagamento, const TEffetto& effetto, const TRectype& riga_effetto, char acc_sal); + // Funzione di aggiornamento saldi una volta generato il movimento + void aggiorna_saldi(); // scrive il movimento e le scadenze error_type write_all(bool chage_status = TRUE); // cerca il conto di contropartita per la distinta corrente (setta _banca) @@ -112,16 +117,22 @@ protected: // TApplication char sezione() const; // aggiunge una riga all'array dei clienti da una riga effetto bool add_cg_row(const TEffetto& eff, const TRectype& reff, TArray& customers, TAssoc_array& banks, bool add_desc); + // aggiunge le righe spese al movimento + bool add_spese_rows(const real& spese); // aggiunge riga pagamento da riga effetto void compile_saldac(const TEffetto& eff, const TRectype& reff, - TImporto& abbuoni_att, TImporto& abbuoni_pas, TImporto& differenze_cam, + TImporto& abbuoni_att, TImporto& abbuoni_pas, TArray& differenze_cam, TArray& customers); // Controlla se il pagamento dell'effetto avra' differenze cambio bool has_diffcam(const TEffetto& eff) const; + + // Aggiunge una riga contabile al movimento + void join_row(const TRectype& row); + // unisce gli array clienti/banche nel record array delle righe contabili void join_rows(TArray& customers, TAssoc_array& banks, const TImporto& abbuoni_att, const TImporto& abbuoni_pas, - const TImporto& differenze_cam); + const TArray& differenze_cam, const real& spese); // Visualizza l'ultimo errore rilevato void display_error(); // Contabilizza l'effetto corrente @@ -153,8 +164,7 @@ inline TContabilizzazione_effetti_app& app() { return (TContabilizzazione_effett void TContabilizzazione_effetti_app::build_dist_sheet() { TRelation eff_rel(LF_EFFETTI); -// TRectype da(LF_EFFETTI),a(LF_EFFETTI); - TCursor cur_dist(&eff_rel,"TIPODIST!=\"\"",4); //,&da,&a); + TCursor cur_dist(&eff_rel,"TIPODIST!=\"\"",4); TRectype& rec = cur_dist.curr(); const long items = cur_dist.items(); _dist_sheet->destroy(); // resetta lo sheet delle distinte @@ -182,6 +192,7 @@ void TContabilizzazione_effetti_app::build_dist_sheet() t->add(num_eff); t->add(codabi); t->add(codcab); + t->add(rec.get(EFF_CODVAL)); const long pos = _dist_sheet->add(t); //aggiunge una riga allo sheet delle distinte _dist_sheet->enable_row(pos, enabled); ndist_prec = ndist; @@ -202,6 +213,8 @@ void TContabilizzazione_effetti_app::build_dist_sheet() t->add(num_eff); t->add(codabi); t->add(codcab); + t->add(rec.get(EFF_CODVAL)); + const long pos = _dist_sheet->add(t); //aggiunge una riga allo sheet delle distinte _dist_sheet->enable_row(pos, enabled); } @@ -233,22 +246,33 @@ bool TContabilizzazione_effetti_app::handle_select(TMask_field& f, KEY k) void TContabilizzazione_effetti_app::on_config_change() { TPartita::carica_allineamento(); -} -bool TContabilizzazione_effetti_app::create() -{ - TConfig conf(CONFIG_DITTA, "ef"); + TConfig conf(CONFIG_DITTA, "ef"); _cod_caus = conf.get("CODCAUS"); // implementare programma di gestione parametri effetti _cod_caus_pag = conf.get("CODCAUSPAG"); // implementare programma di gestione parametri effetti _desc_inc = conf.get("DESCINC", NULL, -1, "Distinta d'incasso"); _desc_pag = conf.get("DESCPAG", NULL, -1, "Ordine di pagamento"); - _caus = NULL; + + const long trans = conf.get_long("DIFFCAMS"); + if (trans > 0) + _trandiffcam.set(conf.get_int("DIFFCAMG"), conf.get_int("DIFFCAMC"), trans); + _sc_enabled = conf.get_bool("GesSal","cg"); if (!has_module(CGAUT) && _sc_enabled) { - error_box("Impossibile eseguire il programma se il modulo Contabilita' Generale non e' abilitato"); - return FALSE; + error_box("Impossibile contabilizzare gli effetti se il modulo Contabilita' Generale non e' abilitato"); + stop_run(); } +} + +bool TContabilizzazione_effetti_app::create() +{ + open_files(LF_TAB, LF_TABCOM, LF_CAUSALI, LF_RCAUSALI, + LF_EFFETTI, LF_REFFETTI, LF_CESS, + LF_MOV, LF_RMOV, LF_PARTITE, LF_SCADENZE, LF_PAGSCA, + LF_DOC, LF_CLIFO, LF_ATTIV, LF_PCON, LF_SALDI, 0); + + _caus = NULL; _error = no_error; _can_write = TRUE; _msk = new TMask("ef0800a"); @@ -256,22 +280,12 @@ bool TContabilizzazione_effetti_app::create() _msk->set_handler(F_RESET,handle_reset); _cpg = new TTable("%CPG"); _bnp = new TTable("BNP"); - _fcaus = new TLocalisamfile(LF_CAUSALI); - _frcaus = new TLocalisamfile(LF_RCAUSALI); - _effetti = new TLocalisamfile(LF_EFFETTI); - _reffetti = new TLocalisamfile(LF_REFFETTI); - _cessionari = new TLocalisamfile(LF_CESS); - _part = new TLocalisamfile(LF_PARTITE); - _scad = new TLocalisamfile(LF_SCADENZE); - _pags = new TLocalisamfile(LF_PAGSCA); - _attiv = new TLocalisamfile(LF_ATTIV); // Altrimenti TRegistro non va! _clifo = new TLocalisamfile(LF_CLIFO); _doc = new TLocalisamfile(LF_DOC); - _pcon = new TLocalisamfile(LF_PCON); _distinta = new TDistinta; _movimento = new TMovimentoPN; _dist_sheet = new TArray_sheet(-1, -1, -4, -4, "Selezione distinte", - "@1|Tipo|Numero distinta@R|Numero effetti@R|ABI@5|CAB@5"); + "@1|Tipo|Numero distinta@R|Numero effetti@R|ABI@5|CAB@5|Valuta"); _part_array = new TPartite_array; return TSkeleton_application::create(); } @@ -281,18 +295,8 @@ bool TContabilizzazione_effetti_app::destroy() if (_msk) delete _msk; if (_cpg) delete _cpg; if (_bnp) delete _bnp; - if (_fcaus) delete _fcaus; - if (_frcaus) delete _frcaus; - if (_effetti) delete _effetti; - if (_reffetti) delete _reffetti; - if (_cessionari) delete _cessionari; - if (_part) delete _part; - if (_scad) delete _scad; - if (_pags) delete _pags; - if (_attiv) delete _attiv; if (_clifo)delete _clifo; if (_doc)delete _doc; - if (_pcon)delete _pcon; if (_caus) delete _caus; if (_distinta) delete _distinta; if (_movimento) delete _movimento; @@ -369,13 +373,17 @@ void TContabilizzazione_effetti_app::display_error() break; case cau_abb_error: msg.format("Non e' possibile reperire i conti per gli abbuoni\n" - " o le differenze cambi dalla causale '%s'", _caus->codice()); + "o le differenze cambi dalla causale '%s'", _caus->codice()); break; + case cau_spe_error: + msg.format("Non e' possibile reperire il conto per le spese\n" + "dalla causale '%s'", _caus->codice()); + break; default: // Errori generici o non indicati vengono visualizzati nel punto dell'errore break; } warning_box(msg); - _error = no_error; // reset error, as any other one would do, so you can show me the other ones. + _error = no_error; // reset error, as any other one would do, so you can show me the other ones. _can_write = FALSE; // But from now on u cannot write anymore. U must exit this program and repair errors occurred. } @@ -395,7 +403,21 @@ bool TContabilizzazione_effetti_app::add_cg_row(const TEffetto& eff, const TRect c_rec->put(RMV_SOTTOCONTO,_cliente.sottoconto()); c_rec->put(RMV_ROWTYPE,"K"); - TString80 desc = _cliente.tipo() == 'F' ? "Pag. ft." : "Inc. ft."; + TString80 desc; + if (_cliente.tipo() == 'F') + { + if (imp >= ZERO) + desc = "Pag. ft."; + else + desc = "Nota cr."; + } + else + { + if (imp >= ZERO) + desc = "Inc. ft."; + else + desc = "Nota cr."; + } desc << ' ' << reff.get(REFF_NFATT); c_rec->put(RMV_DESCR, desc); if (add_desc) @@ -436,29 +458,66 @@ bool TContabilizzazione_effetti_app::add_cg_row(const TEffetto& eff, const TRect return !is_present; } +void TContabilizzazione_effetti_app::join_row(const TRectype& row) +{ + const int n = _movimento->cg_items(); + TRectype& riga = _movimento->cg(n); + riga = row; + riga.put(RMV_NUMRIG, n+1); + riga.put(RMV_ANNOES,_cod_es); + riga.put(MOV_DATAREG,_data_op); +} + +bool TContabilizzazione_effetti_app::add_spese_rows(const real& spese) +{ + if (spese.is_zero()) + return FALSE; + + TRectype& row_spese = _movimento->cg(-1); + TRectype& row_banca = _movimento->cg(-1); + + TBill conto_spese; _caus->bill(11, conto_spese); + const char sez_spese = _caus->sezione(11); + + const char sez_banca = _caus->sezione(2); + + row_spese.put(RMV_SEZIONE, sez_spese); + row_spese.put(RMV_IMPORTO, spese); + conto_spese.put(row_spese); + _banca.put(row_spese, TRUE); + row_spese.put(RMV_DESCR, _caus->desc_agg(11)); + if (_sc_enabled) + row_spese.put(RMV_ROWTYPE, 'G'); + + row_banca.put(RMV_SEZIONE, sez_banca); + row_banca.put(RMV_IMPORTO, spese); + _banca.put(row_banca); + conto_spese.put(row_banca, TRUE); + if (_sc_enabled) + row_banca.put(RMV_ROWTYPE, 'L'); + + return TRUE; +} + void TContabilizzazione_effetti_app::join_rows(TArray& customers, TAssoc_array& banks, const TImporto& abbuoni_att, const TImporto& abbuoni_pas, - const TImporto& differenze_cam) + const TArray& differenze_cam, + const real& spese) { // aggiunge prima i record delle righe relative ai clienti - int j=0,i=0; const int customer_items = customers.items(); - for (j=0; jcg(i++) = (TRectype&) customers[j]; - _movimento->cg(i-1).put(RMV_NUMRIG,i); - } + for (int j=0; jcg(i++) = *row; - _movimento->cg(i-1).put(RMV_NUMRIG,i); - } + for (j=0,row = (TRectype*)banks.first_item(); row != NULL && j 0 && _sc_enabled) + if (_sc_enabled) { TBill zio; TRectype riga(_movimento->cg(0)); @@ -469,8 +528,7 @@ void TContabilizzazione_effetti_app::join_rows(TArray& customers, TAssoc_array& riga.put(RMV_SEZIONE, abbuoni_pas.sezione()); riga.put(RMV_IMPORTO, abbuoni_pas.valore()); riga.put(RMV_ROWTYPE, "P"); - _movimento->cg(i++) = riga; - _movimento->cg(i-1).put(RMV_NUMRIG,i); + join_row(riga); } if (!abbuoni_att.is_zero()) { @@ -479,20 +537,48 @@ void TContabilizzazione_effetti_app::join_rows(TArray& customers, TAssoc_array& riga.put(RMV_SEZIONE, abbuoni_att.sezione()); riga.put(RMV_IMPORTO, abbuoni_att.valore()); riga.put(RMV_ROWTYPE, "A"); - _movimento->cg(i++) = riga; - _movimento->cg(i-1).put(RMV_NUMRIG,i); + join_row(riga); } - if (!differenze_cam.is_zero()) - { - _caus->bill(13, zio); zio.put(riga); - if (!zio.ok()) _error = cau_abb_error; - riga.put(RMV_SEZIONE, differenze_cam.sezione()); - riga.put(RMV_IMPORTO, differenze_cam.valore()); + if (differenze_cam.items() > 0) + { + TImporto diffcam; + for (int i = differenze_cam.items()-1; i >= 0; i--) + { + const TRectype& rec = (const TRectype&)differenze_cam[i]; + TImporto dc(rec.get_char(RMV_SEZIONE), rec.get_real(RMV_IMPORTO)); + diffcam += dc; + } + + _caus->bill(13, zio); + if (!zio.ok()) + _error = cau_abb_error; + + zio.put(riga); + riga.put(RMV_SEZIONE, diffcam.sezione()); + riga.put(RMV_IMPORTO, diffcam.valore()); riga.put(RMV_ROWTYPE, "C"); - _movimento->cg(i++) = riga; - _movimento->cg(i-1).put(RMV_NUMRIG,i); + join_row(riga); + + if (_trandiffcam.ok() && (customers.items() > 1 || differenze_cam.items() > 1)) + { + TRectype& rec = _movimento->cg(_movimento->cg_items()-1); + _trandiffcam.put(rec); _trandiffcam.put(rec, TRUE); + + riga.put(RMV_SEZIONE, diffcam.sezione() == 'D' ? 'A' : 'D'); + _trandiffcam.put(riga); _trandiffcam.put(riga, TRUE); + riga.zero(RMV_ROWTYPE); + join_row(riga); + + for (int i = 0; i < differenze_cam.items(); i++) + { + const TRectype& rec = (const TRectype&)differenze_cam[i]; + join_row(rec); + } + } } } + if (add_spese_rows(spese)) + _total_mov += spese; } error_type TContabilizzazione_effetti_app::search_clifo_bill(char tipo, const long codcf) @@ -543,9 +629,9 @@ error_type TContabilizzazione_effetti_app::search_bank_counter_bill(int tipopag) fc = "I7"; fs = "I8"; } - const int g = (int) _bnp->get_long(fg); - const int c = (int) _bnp->get_long(fc); - const long s = _bnp->get_long(fs); + const int g = _bnp->get_int(fg); + const int c = _bnp->get_int(fc); + const long s = _bnp->get_long(fs); _banca.set(g,c,s); } // se non ha trovato la banca oppure il conto, verifica che vi sia @@ -642,20 +728,25 @@ void TContabilizzazione_effetti_app::compile_head_mov() { if (mov.curr().exist(MOV_CONTROEURO)) mov.put(MOV_CONTROEURO, eurocambio); - else - mov.put(MOV_CAMBIO, real(1936.27) / cambio); + else + { + real cc = TCurrency::get_euro_change(); + cc /= cambio; + cc.round(6); + mov.put(MOV_CAMBIO, cc); + } } // MOV_TOTDOC e MOV_TOTDOCVAL vengono completati prima della scrittura del movimento } -void TContabilizzazione_effetti_app::compile_riga_partita(TRiga_partite& riga, const TEffetto& effetto, const TRectype& riga_effetto) +void TContabilizzazione_effetti_app::compile_riga_partita(TRiga_partite& riga, const TEffetto& effetto, const TRectype& riga_effetto, int numrig) { TLocalisamfile& head_mov = _movimento->lfile(); riga.put(PART_TIPOMOV,_caus->tipomov()); riga.put(PART_TIPOPAG,effetto.get_int(EFF_TIPOPAG)); riga.put(PART_NREG,head_mov.get_long(MOV_NUMREG)); - riga.put(PART_NUMRIG,_cur_dist_row+1); // Nelle righe del movimento le righe clienti vengono prima delle banche - // percio' vi e' una corrispondenza 1 a 1 + riga.put(PART_NUMRIG,numrig); + riga.put(PART_DATAREG,head_mov.get_date(MOV_DATAREG)); riga.put(PART_DATADOC,head_mov.get_date(MOV_DATADOC)); riga.put(PART_DATAPAG,effetto.get_date(EFF_DATASCAD)); @@ -679,8 +770,9 @@ void TContabilizzazione_effetti_app::compile_riga_partita(TRiga_partite& riga, c { if (cambio > ZERO) { - cambio = real(1936.27) / cambio; - riga.put(PART_CAMBIO, cambio); + real cc = TCurrency::get_euro_change() / cambio; + cc.round(6); + riga.put(PART_CAMBIO, cc); } } else @@ -726,25 +818,26 @@ void TContabilizzazione_effetti_app::compile_riga_pagamento(TRectype& riga_pagam void TContabilizzazione_effetti_app::compile_saldac(const TEffetto& eff, const TRectype& reff, TImporto& abbuoni_att, TImporto& abbuoni_pas, - TImporto& differenze_cam, TArray& customers) + TArray& differenze_cam, TArray& customers) { int anno = reff.get_int(REFF_ANNO); TString16 numpart = reff.get(REFF_NUMPART); - // Ricava il numero della fattura.. - TString16 numdoc_to_search = reff.get(REFF_CODNUM); - long nfatt = reff.get_long(REFF_NFATT); + // Ricava il numero della fattura. + TString16 numdoc_to_search = reff.get(REFF_CODNUM); + TString16 nfatt = reff.get(REFF_NFATT); TCodice_numerazione cn; - if (numdoc_to_search.not_empty() && nfatt > 0L) + if (numdoc_to_search.not_empty() && nfatt.not_empty() && real::is_natural(nfatt)) { cn.read(numdoc_to_search); - numdoc_to_search = cn.complete_num(nfatt); + const long nf = atol(nfatt); + numdoc_to_search = cn.complete_num(nf); } else // se gli estremi della fattura non sono compilati si piglia il numero della partita numdoc_to_search = numpart; if (anno == 0 || numpart.empty()) // Se non sono gia' settati sulla riga effetto... { - anno = reff.get_int(REFF_ANNODOC);// ... li va prendere dagli estremi fattura... + anno = reff.get_int(REFF_ANNODOC);// ... li va a prendere dagli estremi fattura... if (numdoc_to_search.not_empty()) { numpart = numdoc_to_search; @@ -768,7 +861,8 @@ void TContabilizzazione_effetti_app::compile_saldac(const TEffetto& eff, } TRiga_partite& riga_part = partita->new_row(); // Compila la riga di partita - compile_riga_partita(riga_part,eff,reff); + const int numrig = customers.items(); + compile_riga_partita(riga_part,eff,reff, numrig); // Compila la riga di pagamento: // reperire il numero della riga partita (nrigp) appena aggiunta const int nrigp = riga_part.get_int(PART_NRIGA); @@ -847,8 +941,19 @@ void TContabilizzazione_effetti_app::compile_saldac(const TEffetto& eff, } if (!new_diffcam.is_zero()) { - differenze_cam -= new_diffcam; // Sottraggo perche' va in sezione opposta - differenze_cam.normalize(); + // Sottraggo perche' va in sezione opposta + TImporto dc = new_diffcam; + dc.normalize(); dc.swap_section(); + + TRectype* row = new TRectype(LF_RMOV); + differenze_cam.add(row); + row->put(RMV_SEZIONE, dc.sezione()); + row->put(RMV_IMPORTO, dc.valore()); + TBill zio; _caus->bill(13, zio); + zio.put(*row); + + TString80 str; str << "ft. " << nfatt; + row->put(RMV_DESCR, str); } TRectype& last = (TRectype&)customers[customers.last()]; @@ -860,6 +965,39 @@ void TContabilizzazione_effetti_app::compile_saldac(const TEffetto& eff, } } +void TContabilizzazione_effetti_app::aggiorna_saldi() +{ + CHECK(_movimento, "Movimento non valido passato ad aggiorna_saldi()"); + + TLocalisamfile& mov = _movimento->lfile(); + + const TDate datareg(mov.get_date(MOV_DATAREG)); + + tiposal tsal = _caus->apertura() ? apertura : + (_caus->chiusura() ? chiusura : normale); + + + _saldo.reset(); // Inizializza saldi + _saldo.set_movprovv(FALSE); + _saldo.set_tipo_saldo(tsal); + _saldo.set_anno_es(mov.get_int(MOV_ANNOES)); + _saldo.set_num_ulmov(mov.get_long(MOV_NUMREG)); + _saldo.set_data_ulmov(datareg); + _saldo.set_movimentato(TRUE); + + const int cgitems = _movimento->cg_items(); + for (int i = 0; i < cgitems; i++) + { + const TRectype& r = _movimento->cg(i); + TImporto import(r.get_char("SEZIONE"), r.get_real("IMPORTO")); + + TBill conto; conto.get(r); + _saldo.aggiorna(conto, import, TRUE); + } + + _saldo.registra(); +} + error_type TContabilizzazione_effetti_app::write_all(bool change_status) { TRectype& head = _movimento->lfile().curr(); @@ -878,6 +1016,8 @@ error_type TContabilizzazione_effetti_app::write_all(bool change_status) if (good()) // nessun errore ? { + aggiorna_saldi(); + if (_sc_enabled) // Debbo scrivere anche le partite ? { if (numreg > orig_numreg) // Ha effettuato una rinumerazione ? @@ -920,18 +1060,17 @@ error_type TContabilizzazione_effetti_app::write_all(bool change_status) bool TContabilizzazione_effetti_app::has_diffcam(const TEffetto& eff) const { bool yes = FALSE; - real cambio = eff.get(EFF_CAMBIO); - if (cambio > ZERO) + if (eff.in_valuta()) // Considera solo effetti in valuta { - if (eff.get_bool(EFF_CONTROEURO)) - { - cambio = real(1936.27) / cambio; - cambio.round(5); - } + const TExchange cambio(eff); + TLocalisamfile partite(LF_PARTITE); for (int n = 1; yes == FALSE && n <= eff.rows_r(); n++) { const TRectype& riga = eff.row_r(n); + if (riga.get_char(REFF_ACCSAL) != 'S') // Ignora righe non saldanti + continue; + partite.put(PART_TIPOCF, eff.get(EFF_TIPOCF)); partite.put(PART_GRUPPO, 0); partite.put(PART_CONTO, 0); @@ -942,7 +1081,7 @@ bool TContabilizzazione_effetti_app::has_diffcam(const TEffetto& eff) const int err = partite.read(); if (err == NOERR) { - const real cambiofatt = partite.get(PART_CAMBIO); + const TExchange cambiofatt(partite.curr()); yes = cambiofatt != cambio; } else @@ -963,7 +1102,8 @@ void TContabilizzazione_effetti_app::contabilize_bill(const char tipo, const lon // per effettuare il raggruppamento TArray customers; TAssoc_array banks; - TImporto abbuoni_att, abbuoni_pas, differenze_cam; + TArray differenze_cam; + TImporto abbuoni_att, abbuoni_pas; bool reset_bank = FALSE; _total_mov = 0.0; @@ -975,7 +1115,8 @@ void TContabilizzazione_effetti_app::contabilize_bill(const char tipo, const lon const char* cc = distinta.tipocf() == 'C' ? _cod_caus : _cod_caus_pag; _caus = new TCausale(cc, _data_op.year()); if (!_caus->ok()) - { + { + _error = generic_error; error_box("Causale '%s' non valida o non presente in parametri effetti", cc); return; } @@ -995,11 +1136,22 @@ void TContabilizzazione_effetti_app::contabilize_bill(const char tipo, const lon //si dovranno generare piu' movimenti per un stessa distinta se le righe eccedono tale //valore (come avere le palle sopra un'incudine ed una mazza ferrata che sta per piombare a tutta forza...) search_bank_counter_bill(); - - if (!good()) return; // _error's already set + if (!good()) + return; // _error's already set + + real spese = distinta[0].get(EFF_SPESE); + TBill conto_cassa, conto_spese; + if (!spese.is_zero()) + { + _caus->bill(11, conto_spese); + if (!conto_spese.ok()) + { + _error = cau_spe_error; + return; + } + } const int items = distinta.items(); // Perche' sul file effetti il numero riga distinta e' un long ?? - int nrows=0; // numero di righe contabili generate // compila la testata compile_head_mov(); @@ -1012,29 +1164,39 @@ void TContabilizzazione_effetti_app::contabilize_bill(const char tipo, const lon const char tipo = eff.get_tipo(); search_clifo_bill(tipo, codcf); - const TString16 codval = eff.get(EFF_CODVAL); - const TDate datacam = eff.get(EFF_DATACAMBIO); - real cambio = eff.get(EFF_CAMBIO); - if (cambio > ZERO && eff.get_bool(EFF_CONTROEURO)) - cambio = real(1936.27) / cambio; - if (!good()) break; + // se la banca non e' stata settata cerca il conto sulla causale a seconda del tipo di pagamento di questo effetto - if (!_banca.ok()) + if (!_banca.ok() || reset_bank) { search_bank_counter_bill(eff.get_int(EFF_TIPOPAG)); + if (!good()) break; reset_bank = TRUE; // forza la ricerca del conto della banca ad ogni riga distinta } - // incrementa il numero di righe contabili generate fino ad ora. - // per i clienti e' sempre vero, mentre per le banche dipende se e' stato fatto un - // raggruppamento - if (!good()) break; - - const bool diff_cam = has_diffcam(eff); + const bool force_break = !_trandiffcam.ok() && has_diffcam(eff); for (int n = 1; n <= eff.rows_r(); n++) { - if (nrows > 0 && diff_cam) // Se ci sono differenze cambio ... + const TRectype& riga = eff.row_r(n); + add_cg_row(eff, riga, customers, banks, FALSE); + + if (_sc_enabled) + compile_saldac(eff, riga, abbuoni_att, abbuoni_pas, differenze_cam, customers); + + // Calcola il numero di righe contabili generate fino ad ora. + // per i clienti e' sempre vero, mentre per le banche dipende + // se e' stato fatto un raggruppamento + int nrows = customers.items() + banks.items(); + if (_sc_enabled) + { + if (!abbuoni_att.is_zero()) nrows++; + if (!abbuoni_pas.is_zero()) nrows++; + nrows+=differenze_cam.items(); + } + if (!spese.is_zero()) + nrows += 2; + + if (nrows > 0 && force_break) // Se ci sono differenze cambio ... nrows = CGROWS_LIMIT; // ... allora forza cambio movimento if (nrows >= CGROWS_LIMIT) // se sono arrivato al limite massimo, scrivo questo movimento @@ -1042,7 +1204,7 @@ void TContabilizzazione_effetti_app::contabilize_bill(const char tipo, const lon // Unisce le righe banche e clienti nel record_array delle righe contabili if (good() && _can_write) { - join_rows(customers, banks, abbuoni_att, abbuoni_pas, differenze_cam); + join_rows(customers, banks, abbuoni_att, abbuoni_pas, differenze_cam, spese); if (good()) write_all(FALSE); // non cambiare lo stato della distinta, cambialo solo alla fine } @@ -1051,37 +1213,23 @@ void TContabilizzazione_effetti_app::contabilize_bill(const char tipo, const lon _movimento->destroy_rows(mov.get_long(MOV_NUMREG)); // azzera le righe.. _part_array->destroy(); // e l'array delle partite customers.destroy(); - banks.destroy(); - abbuoni_att = abbuoni_pas = differenze_cam = TImporto('A', ZERO); - _total_mov = 0.0; - _total_mov_val = 0.0; + banks.destroy(); + differenze_cam.destroy(); + abbuoni_att = abbuoni_pas = TImporto('A', ZERO); + _total_mov = ZERO; + _total_mov_val = ZERO; + spese = ZERO; // compila la testata del nuovo movimento compile_head_mov(); } } if (!good()) break; - - const TRectype& riga = eff.row_r(n); - add_cg_row(eff, riga, customers, banks, diff_cam); - - if (_sc_enabled) - compile_saldac(eff, riga,abbuoni_att, abbuoni_pas, differenze_cam, customers); - - nrows = customers.items() + banks.items(); - if (_sc_enabled) - { - if (!abbuoni_att.is_zero()) nrows++; - if (!abbuoni_pas.is_zero()) nrows++; - if (!differenze_cam.is_zero()) nrows++; - } } - if (reset_bank) - _banca.set(0,0,0); } // Ciclo su effetti - if (good() && _can_write) // scrive il movimento residuo ... + if (good() && _can_write && customers.items()) // scrive il movimento residuo ... { - join_rows(customers, banks, abbuoni_att, abbuoni_pas, differenze_cam); + join_rows(customers, banks, abbuoni_att, abbuoni_pas, differenze_cam, spese); if (good() && write_all() == no_error) // Se la scrittura e' andata ok... _total_bills++; // incrementa il numero di distinte contabilizzate } diff --git a/ef/ef0900a.h b/ef/ef0900a.h index 710e6176f..d77fa06c1 100755 --- a/ef/ef0900a.h +++ b/ef/ef0900a.h @@ -3,3 +3,8 @@ #define F_DESCINC 103 #define F_DESCPAG 104 #define F_CODSIA 105 + +#define F_TRANS_G 111 +#define F_TRANS_C 112 +#define F_TRANS_S 113 +#define F_TRANS_D 114 diff --git a/ef/ef0900a.uml b/ef/ef0900a.uml index 999e66404..a3e004ffd 100755 --- a/ef/ef0900a.uml +++ b/ef/ef0900a.uml @@ -16,7 +16,7 @@ ENDPAGE PAGE "Parametri effetti" 1 1 60 14 -GROUPBOX DLG_NULL 78 7 +GROUPBOX DLG_NULL 78 8 BEGIN PROMPT 1 2 "@bContabilizzazione" END @@ -25,7 +25,6 @@ STRING F_CAUSALE 3 BEGIN PROMPT 2 3 "Causale incasso " FIELD CODCAUS - KEY 1 FLAGS "UZ" USE LF_CAUSALI INPUT CODCAUS F_CAUSALE @@ -45,9 +44,8 @@ END STRING F_CAUSALE_PAG 3 BEGIN - PROMPT 2 5 "Causale pagamento " + PROMPT 2 4 "Causale pagamento " FIELD CODCAUSPAG - KEY 1 FLAGS "UZ" COPY USE F_CAUSALE INPUT CODCAUS F_CAUSALE_PAG @@ -58,17 +56,67 @@ END STRING F_DESCPAG 25 BEGIN - PROMPT 30 5 "Descrizione movimento " + PROMPT 30 4 "Descrizione movimento " FIELD DESCPAG END STRING F_CODSIA 5 BEGIN - PROMPT 2 7 "Codice SIA " + PROMPT 2 6 "Codice SIA " FLAGS "Z" FIELD CODSIA END +NUMBER F_TRANS_G 3 +BEGIN + PROMPT 2 7 "Conto di transito per differenze cambi analitiche " + USE LF_PCON SELECT SOTTOCONTO!="" + INPUT GRUPPO F_TRANS_G + INPUT CONTO F_TRANS_C + INPUT SOTTOCONTO F_TRANS_S + DISPLAY "Gruppo" GRUPPO + DISPLAY "Conto" CONTO + DISPLAY "Sottoc." SOTTOCONTO + DISPLAY "Descrizione@50" DESCR + OUTPUT F_TRANS_G GRUPPO + OUTPUT F_TRANS_C CONTO + OUTPUT F_TRANS_S SOTTOCONTO + OUTPUT F_TRANS_D DESCR + CHECKTYPE NORMAL + ADD RUN CG0 -0 + FIELG DIFFCAMG +END + +NUMBER F_TRANS_C 3 +BEGIN + PROMPT 59 7 "" + COPY ALL F_TRANS_G + CHECKTYPE NORMAL + FIELG DIFFCAMC +END + +NUMBER F_TRANS_S 6 +BEGIN + PROMPT 66 7 "" + COPY ALL F_TRANS_G + CHECKTYPE NORMAL + FIELG DIFFCAMS +END + +STRING F_TRANS_D 50 +BEGIN + PROMPT 2 8 "Descrizione conto " + USE LF_PCON KEY 2 SELECT SOTTOCONTO!="" + INPUT DESCR F_TRANS_D + DISPLAY "Descrizione@50" DESCR + DISPLAY "Gruppo" GRUPPO + DISPLAY "Conto" CONTO + DISPLAY "Sottoc." SOTTOCONTO + COPY OUTPUT F_TRANS_S + CHECKTYPE NORMAL + ADD RUN CG0 -0 +END + ENDPAGE ENDMASK diff --git a/ef/f14.dir b/ef/f14.dir index 76e38f232..220dbf751 100755 --- a/ef/f14.dir +++ b/ef/f14.dir @@ -1,3 +1,3 @@ 14 0 -$reffetti|0|0|130|34|Righe effetti|#13|| +$reffetti|3|6|130|34|Righe effetti|#13|| diff --git a/ef/f14.trr b/ef/f14.trr index a49184390..3ca8624d5 100755 --- a/ef/f14.trr +++ b/ef/f14.trr @@ -12,8 +12,8 @@ ANNODOC|2|4|0|Anno/Esercizio della fattura CODNUM|1|4|0|Codice della numerazione NFATT|3|7|0|Numero documento DATAFATT|5|8|0|Data fattura -IMPFATT|4|18|2|Importo fattura -IMPORTO|4|18|2|Importo effetto +IMPFATT|4|18|3|Importo fattura +IMPORTO|4|18|3|Importo effetto IMPFATTVAL|4|18|3|Importo fattura in valuta IMPORTOVAL|4|18|3|Importo effetto in valuta ACCSAL|1|1|0|Acconto/Saldo diff --git a/ef/f31.dir b/ef/f31.dir index 51fdb6725..bc79c49d1 100755 --- a/ef/f31.dir +++ b/ef/f31.dir @@ -1,3 +1,3 @@ 31 0 -$effetti|12|12|163|34|Effetti|NEFF|| +$effetti|3|6|181|34|Effetti|NEFF|| diff --git a/ef/f31.trr b/ef/f31.trr index 538eb86b5..5cbfcf1fa 100755 --- a/ef/f31.trr +++ b/ef/f31.trr @@ -1,5 +1,5 @@ 31 -30 +31 NPROGTR|3|7|0|Numero progressivo effetto DATASCAD|5|8|0|Data di scadenza TIPOPAG|2|1|0|Tipo pagamento @@ -10,7 +10,7 @@ NUMEMISS|3|8|0|Numero di emissione DATAEMISS|5|8|0|Data emissione CODVAL|1|3|0|Codice valuta DATACAMBIO|5|8|0|Data cambio -CAMBIO|4|15|5|Cambio +CAMBIO|4|15|6|Cambio CONTROEURO|8|1|0|Cambio espresso contro Euro CODABI|10|5|0|Codice ABI banca CODCAB|10|5|0|Codice CAB banca @@ -28,8 +28,9 @@ CODABIP|10|5|0|Codice ABI banca di presentazione CODCABP|10|5|0|Codice CAB banca di presentazione DATARIBA|5|8|0|Data RIBA DISRIBAEST|8|1|0|Distinta RIBA estratta -IMPORTO|4|18|2|Importo effetto +IMPORTO|4|18|3|Importo effetto IMPORTOVAL|4|18|3|Importo effetto in valuta +SPESE|4|18|3|Spese bancarie distinta 4 NPROGTR| CODCF+NPROGTR| diff --git a/ef/rb.frm b/ef/rb.frm index e2beb8ef1..5ab9647ed 100755 --- a/ef/rb.frm +++ b/ef/rb.frm @@ -1,10 +1,13 @@ USE 31 JOIN 14 INTO NPROGTR==NPROGTR JOIN 20 INTO TIPOCF=="C" CODCF==CODCF +JOIN 17 TO 20 INTO TIPOCF==TIPOCF CODCF==CODCF +JOIN 16 TO 17 INTO TIPOCF==TIPOCF CODCF==CODCF CODIND==CODINDEFF JOIN 13 TO 20 ALIAS 113 INTO COM==COMCF +JOIN 13 TO 16 ALIAS 213 INTO COM==COM JOIN %BAN ALIAS 201 INTO CODTAB[1,5]==CODABI JOIN %BAN ALIAS 203 INTO CODTAB==CODABI+CODCAB -JOIN 13 TO 203@ ALIAS 213 INTO COM==S5 +JOIN 13 TO 203@ ALIAS 313 INTO COM==S5 JOIN %BAN ALIAS 202 INTO CODTAB==CODABIP+CODCABP END @@ -33,13 +36,21 @@ BEGIN PROMPT 50 2 "" FIELD 31->DATASCAD END - -NUMERO 2 18 + +STRINGA 23 3 +BEGIN + KEY "Codice valuta" + PROMPT 0 0 "" + FIELD 31->CODVAL + FLAGS "H" +END + +VALUTA 2 18 BEGIN KEY "importo" PROMPT 70 2 "" MESSAGE _IMPORTO - PICTURE "###.###.###.###" + DRIVENBY 23 END STRING 3 50 @@ -53,7 +64,7 @@ NUMERO 4 56 BEGIN KEY "importo in lettere" PROMPT 27 6 "" - FIELD 31->IMPORTO + MESSAGE _IMPORTO PICTURE "(*,*)LETTERE@44" END @@ -96,19 +107,19 @@ BEGIN MESSAGE _FATT,!DATIFATT END -NUMERO 10 18 +VALUTA 10 18 BEGIN KEY "importo fattura" PROMPT 73 10 "" MESSAGE _FATT,!IMPFATT - PICTURE "###.###.###.###" + DRIVENBY 23 END STRING 11 30 2 BEGIN KEY "ragione sociale debitore" PROMPT 31 14 "" - FIELD 20->RAGSOC + MESSAGE _CLI,!RAGSOC END STRING 13 32 @@ -122,7 +133,7 @@ STRING 14 5 BEGIN KEY "CAP debitore" PROMPT 31 17 "" - FIELD 20->CAPCF + MESSAGE _CLI,!CAPCF END STRING 15 30 @@ -182,7 +193,7 @@ STRING 22 27 BEGIN KEY "localita banca d'appoggio" PROMPT 1 19 "" - FIELD 213@->DENCOM + FIELD 313@->DENCOM END END diff --git a/ef/riba.ini b/ef/riba.ini index e44098925..72b18b83a 100755 --- a/ef/riba.ini +++ b/ef/riba.ini @@ -80,12 +80,25 @@ NAME(5)=RAGIONE SOCIALE MITTENTE TYPE(5)=STRINGA POSITION(5)=19 LENGTH(5)=26 -MESSAGE(5) = _DITTA,!RAGSOC,1 +MESSAGE(5)=_DITTA,!RAGSOC,1 -NAME(6)=CAMPO ALTERABILE +NAME(6)=FILLER TYPE(6)=FISSO POSITION(6)=45 -LENGTH(6)=75 +LENGTH(6)=68 + +NAME(7)=CODICE MONETA +TYPE(7)=STRINGA +POSITION(7)=113 +LENGTH(7)=1 +MESSAGE(7) = _CODMON + + +NAME(8)=FILLER +TYPE(8)=FISSO +POSITION(8)=114 +LENGTH(8)=6 + [RECORD 14] NAME(0) = CAMPO BLANK @@ -172,7 +185,7 @@ POSITION(15) = 91 LENGTH(15) = 5 MESSAGE(15) = _CODSIA -NAME(16) = CODICE FISSO (FACOLTATIVO) +NAME(16) = TIPO CODICE INDIVIDUALE (FACOLTATIVO) TYPE(16) = FISSO POSITION(16) = 96 LENGTH(16) = 1 @@ -182,10 +195,16 @@ TYPE(17) = FISSO POSITION(17) = 97 LENGTH(17) = 16 -NAME(18) = CAMPO BLANK +NAME(18) = FILLER TYPE(18) = FISSO POSITION(18) = 113 -LENGTH(18) = 7 +LENGTH(18) = 6 + +NAME(19) = CODICE MONETA +TYPE(19) = STRINGA +POSITION(19) = 119 +LENGTH(19) = 1 +MESSAGE(19) = _CODMON [RECORD 20] NAME(0)=CAMPO BLANK @@ -467,17 +486,17 @@ POSITION(6)=45 LENGTH(6)=7 MESSAGE(6) = _NRIBA,!TOT -NAME(7)=IMPORTO TOTALE DEL FLUSSO -TYPE(7)=IMPORTO +NAME(7)=ZERO FILLED +TYPE(7)=NUMERO POSITION(7)=52 LENGTH(7)=15 -PICTURE(7)= ############@ -MESSAGE(7)=_IMPORTO,!TOT -NAME(8)=ZERO FILLED -TYPE(8)=NUMERO +NAME(8)=IMPORTO TOTALE DEL FLUSSO +TYPE(8)=IMPORTO POSITION(8)=67 LENGTH(8)=15 +PICTURE(8)= ############### +MESSAGE(8)=_IMPORTO,!TOT NAME(9)=NUMERO RECORD TYPE(9)= NUMERO @@ -488,5 +507,15 @@ MESSAGE(9) = _NRIBA,!NREC NAME(10)=CAMPO ALTERABILE TYPE(10)=FISSO POSITION(10)=89 -LENGTH(10)=31 +LENGTH(10)=24 +NAME(11)=CODICE MONETA +TYPE(11)=STRINGA +POSITION(11)=113 +LENGTH(11)=1 +MESSAGE(11) = _CODMON + +NAME(12)=FILLER +TYPE(12)=FISSO +POSITION(12)=114 +LENGTH(12)=6 diff --git a/include/applicat.cpp b/include/applicat.cpp index c101a7116..ec32198cf 100755 --- a/include/applicat.cpp +++ b/include/applicat.cpp @@ -250,8 +250,7 @@ long XVT_CALLCONV1 TApplication::task_eh(WINDOW win, EVENT *ep) // Setta la caption della task window TString cap; - prassi_spa(cap); - cap << " - " << _application->get_module_name(); + cap << _application->get_module_name() << " - " << prassi_spa(); TTemp_window tw(win); tw.set_caption(cap); @@ -381,6 +380,27 @@ long TApplication::handler(WINDOW win, EVENT* ep) } +const TString & TApplication::god_string(const char * keyword) const +{ + if (_god_vars== NULL) + ((TApplication *)this)->_god_vars = new TAssoc_array; + + TString * s = (TString *)_god_vars->objptr(keyword); + + if (s == NULL) + { + TFilename godfile; + + godfile = firm2dir(-1); + godfile.add("config"); + godfile.add("gm.ini"); + TConfig c(godfile, "GODMODE"); + s = new TString(c.get(keyword)); + _god_vars->add(keyword, s); + } + return *s; +} + void TApplication::stop_run() { if (_savefirm) prefix().set_codditta(_savefirm); @@ -423,13 +443,16 @@ bool TApplication::remove_menu(MENU_TAG id) TApplication::TApplication() - : _savefirm(0), _create_ok(FALSE) + : _savefirm(0), _create_ok(FALSE), _god_vars(NULL) { } TApplication::~TApplication() -{} +{ + if (_god_vars != NULL) + delete _god_vars; +} bool TApplication::create() { diff --git a/include/applicat.h b/include/applicat.h index 1175d5a3d..bd0f40d0e 100755 --- a/include/applicat.h +++ b/include/applicat.h @@ -18,6 +18,9 @@ #define CHK_DONGLE 0 // dongle authorization checks #define CHK_USER 1 // user authorization checks +#ifndef __ASSOC_H +class TAssoc_array; +#endif // @doc EXTERNAL // @class TApplication | Classe per la gestione di tutte le applicazioni PRASSI @@ -39,6 +42,8 @@ class TApplication TBit_array _dongle_aut; // @cmember:(INTERNAL) Array di autorizzazione concessa all'utente TBit_array _user_aut; + // @cmember:(INTERNAL) Array di valori dei modi speciali + TAssoc_array * _god_vars; // @cmember:(INTERNAL) Codice dell'applicazione TString _name; @@ -127,6 +132,12 @@ public: // @cmember Abilita la verifica del modulo cui appartiene il programma virtual bool check_autorization() const {return TRUE;} + + // @cmember Ritorna la stringa di attivazione del modo speciale per la funzione

+ const TString & god_string(const char * keyword = "GODMODE") const; + + // @cmember Verifica l'attivazione del modo speciale per la funzione

+ bool god_mode(const char * keyword = "GODMODE") const { return god_string(keyword).not_empty(); } // @cmember Forza la chiusura dell'applicazione void stop_run(); diff --git a/include/archives.cpp b/include/archives.cpp index 4b533600b..d4fa9408f 100755 --- a/include/archives.cpp +++ b/include/archives.cpp @@ -266,7 +266,7 @@ bool TArchive::fsplit( { fclose(o); ::remove(work); - warning_box("La copia del file %s, generato dalla procedura, richiederà più di un dischetto: " + warning_box("Il salvataggio del file %s, generato dalla procedura, richiederà più di un dischetto: " "il floppy inserito risulta contenere uno o più files. E' consigliabile " "utilizzare dischetti vuoti o formattati per ridurre il loro numero." "Premere OK per continuare.", (const char*)from.name()); @@ -279,7 +279,7 @@ bool TArchive::fsplit( return FALSE; TString msg("Archiviazione di "); msg << work << " (" << (tot/1024) << "K)"; - TProgind w(tot, msg, TRUE, TRUE, 40); + TProgind w(tot, msg, TRUE, TRUE); TString buffer(BUFSIZE); @@ -631,9 +631,12 @@ bool TArchive::restore(long firm, char floppy, bool temp. bool) if (!lastdisk) { TFilename cfg("a:/config.001"); cfg[0] = floppy; - if (!fexist(cfg)) - lastdisk = !yesno_box("Inserire il successivo disco di ripristino?\n" - "(Rispondere NO se si desidera interrompere la procedura)"); + if (!cfg.exist()) + { + bool stop = !yesno_box("Inserire il successivo disco di ripristino?\n" + "(Rispondere NO se si desidera interrompere la procedura)"); + if (stop) return FALSE; + } } } while(!lastdisk); diff --git a/include/browbar.h b/include/browbar.h index 31b10defe..e0ffdb3ed 100755 --- a/include/browbar.h +++ b/include/browbar.h @@ -1,17 +1,17 @@ -BUTTON DLG_FINDREC 8 2 +BUTTON DLG_FINDREC 10 2 BEGIN PROMPT -13 -1 "Ri~cerca" MESSAGE EXIT,K_F9 PICTURE BMP_FINDREC END -BUTTON DLG_CANCEL 8 2 +BUTTON DLG_CANCEL 10 2 BEGIN PROMPT -23 -1 "" MESSAGE EXIT,K_ESC END -BUTTON DLG_QUIT 8 2 +BUTTON DLG_QUIT 10 2 BEGIN PROMPT -33 -1 "" MESSAGE EXIT,K_QUIT diff --git a/include/cfven.h b/include/cfven.h index c3f425e02..ae40aea4a 100755 --- a/include/cfven.h +++ b/include/cfven.h @@ -70,4 +70,6 @@ #define CFV_SCONTOCL "SCONTOCL" #define CFV_SCONTOR "SCONTOR" #define CFV_CODSCINC "CODSCINC" +#define CFV_TIPODOCFAT "TIPODOCFAT" +#define CFV_CODCAUS "CODCAUS" #endif diff --git a/include/config.cpp b/include/config.cpp index 00c25f478..bca46c391 100755 --- a/include/config.cpp +++ b/include/config.cpp @@ -729,7 +729,7 @@ TConfig::TConfig(int which_config, const char* paragraph) u.upper(); _file.add(u); _file.ext("ini"); - if (u != "PRASSI" && !fexist(_file)) + if (u != "PRASSI" && !_file.exist()) { TFilename prassi = _file.path(); prassi.add("prassi.ini"); diff --git a/include/controls.cpp b/include/controls.cpp index c13ca84fd..111702dd1 100755 --- a/include/controls.cpp +++ b/include/controls.cpp @@ -174,8 +174,8 @@ XVT_FNTID xvt_default_font(bool bold) RCT pc; xvt_vobj_get_client_rect(TASK_WIN, &pc); - ROWY = (pc.bottom - pc.top) / 23; - const int MAX_CHARX = (pc.right - pc.left) / 80; + ROWY = (pc.bottom - pc.top) / 24; + const int COLX = (pc.right - pc.left) / 80; // controlla con Guy TString str(80, 'M'); CHARX = xvt_dwin_get_text_width(TASK_WIN, str.get_buffer(), str.size()) / str.size(); @@ -430,8 +430,8 @@ WINDOW create_interface(WINDOW parent, short x, short y, short dx, short dy, top++; } - if (x < 0) left = (max_rct.right - width) >> 1; - if (y < 0) top = (max_rct.bottom - height) >> 1; + if (x < 0) left = (max_rct.right - width) / 2; + if (y < 0) top = (max_rct.bottom - height) / 2; } RCT r; xvt_rect_set(&r, left, top, left+width, top+height); @@ -467,8 +467,8 @@ WINDOW create_interface(WINDOW parent, short x, short y, short dx, short dy, { RCT max; xvt_vobj_get_client_rect(TASK_WIN, &max); xi_pu_to_fu(itf, (XinPoint *) &max, 2); - X_FU_MULTIPLE = max.right / 80; - Y_FU_MULTIPLE = max.bottom / 25; + X_FU_MULTIPLE = max_rct.right / 80; // Controlla con Guy + Y_FU_MULTIPLE = max_rct.bottom / 24; // Was 25! } if (dx > 0) @@ -901,7 +901,7 @@ const char* TControl::parse_caption(const char* cap, bool& bold, COLOR& color) c } else { - NFCHECK(0, "Bad character after @ in prompt"); + NFCHECK("Bad character (%c) after @ in %s", code, cap); break; } } @@ -1104,6 +1104,16 @@ void TText_control::set_caption(const char* text) font = (FONT_OBJ*)xi_tree_malloc(sizeof(FONT_OBJ), _obj->v.text); *font = xi_create_copy_font_id(get_interface(), xvt_default_font(bold), NULL); RCT rct; get_rect(rct); + + if (bold) + { + const int estimated_size = strlen(c) * (XI_FU_MULTIPLE+2); + if (estimated_size > (rct.right-rct.left)) + { + rct.right = rct.left + estimated_size; + set_rect(rct); + } + } xi_invalidate_rect(parent(), &rct); #endif } diff --git a/include/currency.cpp b/include/currency.cpp index 82463e7e8..af9e01d63 100755 --- a/include/currency.cpp +++ b/include/currency.cpp @@ -15,19 +15,20 @@ class TDowJones : public TFile_cache int _dec_prices; // Decimali per i prezzi unitari int _dec_change; // Decimali per i cambi bool _is_euro; // E' l'EURO in persona - bool _contro_euro; // Il cambio e' espresso contro EURO + exchange_type _et; // Il cambio e' espresso contro EURO public: const TExchangeData& operator=(const TExchangeData& d) { _chg = d._chg; _dec = d._dec; _dec_prices = d._dec_prices; - _is_euro = d._is_euro; _contro_euro = d._contro_euro; + _is_euro = d._is_euro; _et = d._et; return d; } TExchangeData() - : _chg(1.0), _dec(0), _dec_prices(0), _is_euro(FALSE), _contro_euro(FALSE) { } + : _chg(1.0), _dec(0), _dec_prices(0), _is_euro(FALSE), _et(_exchange_base) { } }; + long _codditta; TString16 _base_val, _firm_val, _euro_val; real _euro_chg; @@ -43,15 +44,21 @@ public: const TString& get_firm_val(); const TString& get_euro_val(); const char* expand_value(const char* val); + const char* normalize_value(const char* val, const real& chg, exchange_type& et); real exchange(const real& num, - const char* fromval, const real& fromchg, bool fromeuro, - const char* toval, const real& tochg, bool toeuro, + const char* fromval, const real& fromchg, exchange_type fromeuro, + const char* toval, const real& tochg, exchange_type toeuro, bool price = FALSE); + + real exchange(const real& num, const TExchange& frval, const TExchange& toval, bool price = FALSE); + int get_dec(const char* val, bool prices = FALSE); - const real& get_change(const char* val, bool& contro_euro); + const real& get_change(const char* val, exchange_type& contro_euro); + real get_base_change(const char* val); + real get_contro_change(const char* val); - TDowJones() : TFile_cache("%VAL") { } + TDowJones() : TFile_cache("%VAL"), _codditta(0) { } virtual ~TDowJones() { } } DowJones; @@ -80,7 +87,7 @@ TObject* TDowJones::rec2obj(const TRectype& rec) const data->_dec_prices = data->_dec; data->_dec_change = rec.get_int("I2"); data->_is_euro = rec.get_bool("B0"); - data->_contro_euro = rec.get_bool("B1"); + data->_et = rec.get_bool("B1") ? _exchange_contro : _exchange_base; } return data; @@ -94,14 +101,22 @@ void TDowJones::flush() } void TDowJones::test_cache() -{ +{ + // Controllo se e' cambiata la ditta + const long newfirm = prefix().get_codditta(); + if (newfirm != _codditta) + { + _codditta = newfirm; + _firm_val = prefix().firm().codice_valuta(); + } + if (_base_val.empty()) { fill(); FOR_EACH_ASSOC_OBJECT(_cache, hash, key, obj) if (*key) { const TExchangeData& data = *(const TExchangeData*)obj; - if ((_base_val.empty() || stricmp(key, "LIT") == 0) && data._chg == 1.0) + if ((_base_val.empty() || strcmp(key, "LIT") == 0) && data._chg == 1.0) _base_val = key; if (data._is_euro && _euro_val.empty()) _euro_val = key; @@ -110,8 +125,8 @@ void TDowJones::test_cache() if (_euro_val.empty()) // Si son dimenticati dell'EURO? { TExchangeData* euro = new TExchangeData; - euro->_chg = 1936.27; euro->_dec = 2; euro->_dec_prices = 3; - euro->_is_euro = TRUE; euro->_contro_euro = FALSE; + euro->_chg = 1936.27; euro->_dec = euro->_dec_prices = 2; + euro->_is_euro = TRUE; euro->_et = _exchange_base; _euro_val = "EUR"; _cache.add(_euro_val, euro); } @@ -119,20 +134,19 @@ void TDowJones::test_cache() if (_base_val.empty()) // Si son dimenticati delle LIRE? { TExchangeData* lira = new TExchangeData; - lira->_chg = 1.0; lira->_dec = 0; lira->_dec_prices = 0; - lira->_is_euro = lira->_contro_euro = FALSE; + lira->_chg = 1.0; lira->_dec = lira->_dec_prices = 0; + lira->_is_euro = FALSE; lira->_et = _exchange_base; _base_val = "LIT"; _cache.add(_base_val, lira); } _firm_val = prefix().firm().codice_valuta(); - bool dummy_ce; - _euro_chg = get_change(_euro_val, dummy_ce); + _euro_chg = get_base_change(_euro_val); } } const char* TDowJones::expand_value(const char* val) { - if (val) + if (val && *val > ' ') { if (*val == '_') { @@ -145,9 +159,8 @@ const char* TDowJones::expand_value(const char* val) } else { - if (*val <= ' ') - val = get_firm_val(); - } + // Leave code as is + } } else val = get_firm_val(); @@ -182,10 +195,10 @@ const TString& TDowJones::get_euro_val() real TDowJones::exchange(const real& num, // Importo da convertire const char* frval, // Dalla valuta const real& frchg, // Dal cambio - bool freur, // Dal cambio in euro + exchange_type freur, // Dal cambio in euro const char* toval, // Alla valuta const real& tochg, // Al cambio - bool toeur, // Al cambio in euro + exchange_type toeur, // Al cambio in euro bool price) // e' un prezzo ? { real n = num; @@ -195,12 +208,12 @@ real TDowJones::exchange(const real& num, // Importo da convertire const TExchangeData& datato = get(toval); real fr = frchg; - if (fr <= ZERO) { fr = datafr._chg; freur = datafr._contro_euro; } + if (fr <= ZERO) { fr = datafr._chg; freur = datafr._et; } real to = tochg; - if (to <= ZERO) { to = datato._chg; toeur = datato._contro_euro; } + if (to <= ZERO) { to = datato._chg; toeur = datato._et; } - const int mode = (freur ? 1 : 0) + (toeur ? 2 : 0); + const int mode = (freur == _exchange_contro ? 1 : 0) + (toeur == _exchange_contro ? 2 : 0); switch (mode) { case 1: @@ -221,19 +234,175 @@ real TDowJones::exchange(const real& num, // Importo da convertire return n; } +real TDowJones::exchange(const real& num, // Importo da convertire + const TExchange& frval, // Dalla valuta + const TExchange& toval, // Alla valuta + bool price) // e' un prezzo ? +{ + exchange_type fret, toet; + const real& frch = frval.get_change(fret); + const real& toch = toval.get_change(toet); + return exchange(num, frval.get_value(), frch, fret, toval.get_value(), toch, toet, price); +} + int TDowJones::get_dec(const char* val, bool price) { const TExchangeData& data = get(val); return price ? data._dec_prices : data._dec; } -const real& TDowJones::get_change(const char* val, bool& contro_euro) +const real& TDowJones::get_change(const char* val, exchange_type& et) { const TExchangeData& data = get(val); - contro_euro = data._contro_euro; + et = data._et; return data._chg; } +real TDowJones::get_base_change(const char* val) +{ + exchange_type et; + real c = get_change(val, et); + if (et == _exchange_contro) + { + c = _euro_chg / c; + c.round(6); + } + return c; +} + +real TDowJones::get_contro_change(const char* val) +{ + exchange_type et; + real c = get_change(val, et); + if (et == _exchange_base) + { + c = _euro_chg / c; + c.round(6); + } + return c; +} + +const char* TDowJones::normalize_value(const char* val, const real& exch, exchange_type& et) +{ + val = expand_value(val); + if (et == _exchange_undefined) + { + if (exch > ZERO) + { + real base_diff = get_base_change(val) - exch; + base_diff = abs(base_diff); + + real contro_diff = get_contro_change(val) - exch; + contro_diff = abs(contro_diff); + + et = base_diff < contro_diff ? _exchange_base : _exchange_contro; + } + else + get_change(val, et); + } + return val; +} + +/////////////////////////////////////////////////////////// +// TExchange +/////////////////////////////////////////////////////////// + +void TExchange::copy(const TExchange& exc) +{ + strcpy(_val, exc._val); + _exchange = exc._exchange; + _et = exc._et; +} + +const real& TExchange::get_change(exchange_type& et) const +{ + if (_exchange.is_zero()) + return DowJones.get_change(_val, et); + et = _et; + return _exchange; +} + +real TExchange::get_base_change() const +{ + exchange_type et; + real c = get_change(et); + if (et != _exchange_base) + { + c = DowJones.get_base_change("_EURO") / c; + c.round(6); + } + return c; +} + +real TExchange::get_contro_change() const +{ + exchange_type et; + real c = get_change(et); + if (et != _exchange_contro) + { + c = DowJones.get_base_change("_EURO") / c; + c.round(6); + } + return c; +} + +int TExchange::compare(const TSortable& obj) const +{ + const TExchange& exc = (const TExchange&)obj; + int cmp = strcmp(_val, exc._val); + if (cmp == 0) + { + if (_et == exc._et) + { + exchange_type dummy; + const real diff = get_change(dummy) - exc.get_change(dummy); + cmp = diff.sign(); + } + else + { + real chg1 = get_contro_change(); + real chg2 = exc.get_contro_change(); + const real diff = chg1 - chg2; + cmp = diff.sign(); + } + } + return cmp; +} + +bool TExchange::same_value_as(const TExchange& exc) const +{ + return strcmp(_val, exc._val) == 0; +} + +void TExchange::set(const char* val, const real& chg, exchange_type et) +{ + val = DowJones.normalize_value(val, chg, et); + strncpy(_val, val, 4); + _val[3] = '\0'; + _exchange = chg; + _et = et; +} + +void TExchange::set(const TRectype& rec) +{ + const TString16 codval = rec.get("CODVAL"); + const real chg = rec.get_real("CAMBIO"); + exchange_type et = _exchange_undefined; + if (rec.exist("CONTROEURO")) + et = rec.get_bool("CONTROEURO") ? _exchange_contro : _exchange_base; + set(codval, chg, et); +} + +TExchange::TExchange(const char* val, const real& chg, exchange_type et) +{ + set(val, chg, et); +} + +TExchange::TExchange(const TRectype& rec) +{ + set(rec); +} + /////////////////////////////////////////////////////////// // TCurrency /////////////////////////////////////////////////////////// @@ -268,50 +437,38 @@ int TCurrency::get_euro_dec(bool price) return DowJones.get_dec(get_euro_val(), price); } -const real& TCurrency::get_firm_change(bool& ce) +const real& TCurrency::get_firm_change(exchange_type& ce) { return DowJones.get_change("_FIRM", ce); } const real& TCurrency::get_euro_change() -{ - bool ce; - return DowJones.get_change("_EURO", ce); +{ + exchange_type dummy; + return DowJones.get_change("_EURO", dummy); } - -void TCurrency::force_value(const char* newval, const real& newchange, bool neweuro) -{ - newval = DowJones.expand_value(newval); - if (newval && *newval) - { - strncpy(_val, newval, 4); - _val[3] = '\0'; - _exchange = newchange; - _euro = neweuro; - } - else - { - *_val = '\0'; - _exchange = ZERO; - _euro = FALSE; - } +void TCurrency::force_value(const char* newval, const real& newchange, exchange_type newet) +{ + _chg.set(newval, newchange, newet); } -void TCurrency::change_value(const char* val, const real& newchange, bool to_euro) +void TCurrency::change_value(const TExchange& exc) { - val = DowJones.expand_value(val); - if (!_num.is_zero() && stricmp(_val, val) != 0) - { - _num = DowJones.exchange(_num, _val, _exchange, _euro, - val, newchange, to_euro, is_price()); - } - force_value(val, newchange, to_euro); + if (!_num.is_zero() && _chg != exc) + _num = DowJones.exchange(_num, _chg, exc, is_price()); + _chg = exc; +} + +void TCurrency::change_value(const char* val, const real& newchange, exchange_type to_euro) +{ + const TExchange exc(val, newchange, to_euro); + change_value(exc); } int TCurrency::decimals() const { - return DowJones.get_dec(_val, is_price()); + return DowJones.get_dec(get_value(), is_price()); } int TCurrency::compare(const TSortable& s) const @@ -322,14 +479,15 @@ int TCurrency::compare(const TSortable& s) const return _num == cur._num ? 0 : (_num > cur._num ? +1 : -1); } TCurrency curr(cur); - curr.change_value(_val); + curr.change_value(get_value()); return _num == curr._num ? 0 : (_num > curr._num ? +1 : -1); } void TCurrency::copy(const TCurrency& cur) { + _chg = cur._chg; _num = cur._num; - force_value(cur._val, cur._exchange, _euro); + _price = cur._price; } const char* TCurrency::string(bool dotted) const @@ -346,16 +504,18 @@ const char* TCurrency::string(bool dotted) const TCurrency& TCurrency::operator+=(const TCurrency& cur) { CHECK(is_price() == cur.is_price(), "Somma di pere e mele!"); - if (same_value_as(cur)) - { - _num += cur._num; - } - else - { - real n = DowJones.exchange(cur._num, cur._val, cur._exchange, cur._euro, - _val, _exchange, _euro, is_price()); - _num += n; - } + if (!cur._num.is_zero()) + { + if (same_value_as(cur)) + { + _num += cur._num; + } + else + { + real n = DowJones.exchange(cur._num, cur._chg, _chg, is_price()); + _num += n; + } + } return *this; } @@ -373,18 +533,23 @@ TCurrency& TCurrency::operator-=(const TCurrency& cur) _num -= cur._num; else { - real n = DowJones.exchange(cur._num, cur._val, cur._exchange, cur._euro, - _val, _exchange, _euro, is_price()); + real n = DowJones.exchange(cur._num, cur._chg, _chg, is_price()); _num -= n; } return *this; } +TCurrency TCurrency::operator-(const TCurrency& num) const +{ + TCurrency cur(*this); + cur -= num; + return cur; +} + TCurrency& TCurrency::operator*=(const real& num) { _num *= num; - // Arrotondo forzando price a FALSE - _num.round(DowJones.get_dec(_val, _price = FALSE)); + _num.round(decimals()); return *this; } @@ -397,22 +562,22 @@ TCurrency TCurrency::operator*(const real& num) const bool TCurrency::is_base_value() const { - return *_val == '\0' || get_base_val() == _val; + return get_base_val() == get_value(); } -bool TCurrency::same_value_as(const TCurrency& cur) const +bool TCurrency::is_firm_value() const { - const int cmp = stricmp(_val, cur._val); - if (cmp == 0) - return TRUE; - if (*_val == '\0' || *cur._val == '\0') - return is_base_value() == cur.is_base_value(); - return FALSE; + return get_firm_val() == get_value(); } -TCurrency::TCurrency(const real& num, const char* val, const real& exchg, bool euro, bool price) +TCurrency::TCurrency(const real& num, const char* val, const real& exchg, exchange_type et, bool price) : _num(num), _price(price) { - force_value(val, exchg, euro); + force_value(val, exchg, et); } +TCurrency::TCurrency(const real& num, const TExchange& exc, bool price) + : _num(num), _chg(exc), _price(price) +{ } + + diff --git a/include/currency.h b/include/currency.h index 82e3017c0..0dfc7fbb7 100755 --- a/include/currency.h +++ b/include/currency.h @@ -9,12 +9,44 @@ class TRectype; #endif -class TCurrency : public TSortable -{ - real _num; // Valore assoluto +enum exchange_type { _exchange_base, _exchange_contro, _exchange_undefined }; + +class TExchange : public TSortable +{ char _val[4]; // Codice valuta real _exchange; // Cambio personalizzato - bool _euro; // Cambio personalizzato contro Euro + exchange_type _et;// Cambio normale o contro euro + +protected: + void copy(const TExchange& exc); + +public: + virtual int compare(const TSortable& obj) const; + bool same_value_as(const TExchange& exc) const; + + TExchange& operator=(const TExchange& exc) { copy(exc); return *this; } + TExchange& operator=(const TRectype& rec) { set(rec); return *this; } + + void set(const char* val = NULL, const real& exc = ZERO, exchange_type et = _exchange_undefined); + void set(const TRectype& rec); + + exchange_type get_type() const { return _et; } + + const char* get_value() const { return _val; } + const real& get_change(exchange_type& et) const; + real get_base_change() const; + real get_contro_change() const; + + TExchange(const char* val = NULL, const real& exc = ZERO, exchange_type et = _exchange_undefined); + TExchange(const TExchange& exc) { copy(exc); } + TExchange(const TRectype& rec); + virtual ~TExchange() { } +}; + +class TCurrency : public TSortable +{ + TExchange _chg; // Cambio + real _num; // Valore dell'importo bool _price; // Prezzo unitario o no protected: @@ -28,24 +60,33 @@ public: static int get_base_dec(bool price = FALSE); static int get_firm_dec(bool price = FALSE); static int get_euro_dec(bool price = FALSE); - static const real& get_firm_change(bool& ce); + static const real& get_firm_change(exchange_type& ce); static const real& get_euro_change(); void set_price(bool p) { _price = p; } bool is_price() const { return _price; } - void force_value(const char* newval, const real& newchange = ZERO, bool neweuro = FALSE); - void change_value(const char* newval, const real& newchange = ZERO, bool neweuro = FALSE); + void force_value(const char* newval, const real& newchange = ZERO, exchange_type et = _exchange_undefined); + void change_value(const TExchange& exc); + void change_value(const char* newval, const real& newchange = ZERO, exchange_type et = _exchange_undefined); void change_to_base_val() { change_value(get_base_val()); } void change_to_firm_val() { change_value(get_firm_val()); } void change_to_euro_val() { change_value(get_euro_val()); } - const char* get_value() const { return _val; } + const char* get_value() const { return _chg.get_value(); } bool is_base_value() const; - bool same_value_as(const TCurrency& cur) const; + bool is_firm_value() const; + bool same_value_as(const TCurrency& cur) const { return _chg.same_value_as(cur._chg); } void set_num(const real& num) { _num = num; _num.round(decimals()); } const real& get_num() const { return _num; } + + void set_exchange(const TExchange& exc) { _chg = exc; } + const TExchange& get_exchange() const { return _chg; } + + const real& get_change(exchange_type& et) const { return _chg.get_change(et); } + real get_base_change() const { return _chg.get_base_change(); } + real get_contro_change() const { return _chg.get_contro_change(); } const TCurrency& operator=(const TCurrency& cur) { copy(cur); return *this; } @@ -57,15 +98,17 @@ public: TCurrency operator * (const real& num) const; TCurrency& operator /= (const real& num); TCurrency operator / (const real& num) const; + TCurrency operator - () const { TCurrency c(*this); c._num = -c._num; return c; } const char* string(bool dotted = FALSE) const; - void read(const TRectype& rec, const char* field, const char *val = NULL, const char *exchange = NULL); - void write(TRectype& rec, const char* field, const char *val = NULL, const char *exchange = NULL, bool forceval = FALSE) const; + void read(const TRectype& rec, const char* field, const char *val = NULL, const char *exchange = NULL, const char* et = NULL); + void write(TRectype& rec, const char* field, const char *val = NULL, const char *exchange = NULL, const char* et = NULL, bool forceval = FALSE) const; int decimals() const; - TCurrency(bool price = FALSE) : _price(price) { _val[0] = '\0'; } + TCurrency(bool price = FALSE) : _price(price) { } TCurrency(const TCurrency& cur) { copy(cur); } - TCurrency(const real& num, const char* val = "", const real& exchg = ZERO, bool euro = FALSE, bool price = FALSE); + TCurrency(const real& num, const char* val = "", const real& exchg = ZERO, exchange_type et = _exchange_undefined, bool price = FALSE); + TCurrency(const real& num, const TExchange& chg, bool price = FALSE); virtual ~TCurrency() { } }; @@ -76,8 +119,8 @@ public: TPrice() : TCurrency(TRUE) { } TPrice(const TPrice& price) { copy(price); } - TPrice(const real& num, const char* val = "", const real& exc = ZERO, bool euro = FALSE) - : TCurrency(num, val, exc, euro, TRUE) { } + TPrice(const real& num, const char* val = "", const real& exc = ZERO, exchange_type ext = _exchange_undefined) + : TCurrency(num, val, exc, ext, TRUE) { } virtual ~TPrice() { } }; diff --git a/include/doc.h b/include/doc.h index f62d57182..8fa79b75b 100755 --- a/include/doc.h +++ b/include/doc.h @@ -71,7 +71,7 @@ #define DOC_DATAAGG "DATAAGG" #define DOC_UTENTE "UTENTE" #define DOC_DOCEVASO "DOCEVASO" - +#define DOC_CONTROEURO "CONTROEURO" #endif diff --git a/include/dongle.cpp b/include/dongle.cpp index 41f3ef395..ec11441b3 100755 --- a/include/dongle.cpp +++ b/include/dongle.cpp @@ -96,6 +96,8 @@ unsigned long TEutronFooter::checksum(bool set) bool TEutronFooter::valid() { + if (_size == 0 || _checksum == 0) + return FALSE; return _checksum == checksum(FALSE); } diff --git a/include/effetti.h b/include/effetti.h index 5d647fc93..0d6d251db 100755 --- a/include/effetti.h +++ b/include/effetti.h @@ -32,5 +32,6 @@ #define EFF_IMPORTO "IMPORTO" #define EFF_IMPORTOVAL "IMPORTOVAL" #define EFF_ACCSAL "ACCSAL" +#define EFF_SPESE "SPESE" #endif diff --git a/include/execp.cpp b/include/execp.cpp index 5bfb43073..be7ed9a91 100755 --- a/include/execp.cpp +++ b/include/execp.cpp @@ -85,29 +85,33 @@ bool TExternal_app::can_run() const if (*prefix().name() <= '.') return TRUE; - TRecord_cache utonti(LF_USER); // Non uso cache() per problemi durante conversioni - TToken_string perm(4096, '\n'), row(80,SAFE_PIPE_CHR); - for (TString16 u = user(); u.not_empty(); u = utonti.get(u, "GROUPNAME")) + const TLocalisamfile test(LF_USER); + if (test.curr().exist("PERMISSION")) { - if (utonti.already_loaded(u)) - { - NFCHECK("L'utente %s ha dei permessi ricorsivi", (const char*)u); - break; - } - perm = utonti.get(u, "PERMISSION"); - if (!perm.blank()) + TRecord_cache utonti(LF_USER); // Non uso cache() per problemi durante conversioni + TToken_string perm(4096, '\n'), row(80,SAFE_PIPE_CHR); + for (TString16 u = user(); u.not_empty(); u = utonti.get(u, "GROUPNAME")) { - FOR_EACH_TOKEN(perm, tok) + if (utonti.already_loaded(u)) + { + NFCHECK("L'utente %s ha dei permessi ricorsivi", (const char*)u); + break; + } + perm = utonti.get(u, "PERMISSION"); + if (!perm.blank()) { - row = tok; - if (_path == row.get(0)) // Il nome corrisponde + FOR_EACH_TOKEN(perm, tok) { - if (*row.get(1) == 'N') - return FALSE; + row = tok; + if (_path == row.get(0)) // Il nome corrisponde + { + if (*row.get(1) == 'N') + return FALSE; + } } } - } - } + } + } return TRUE; } diff --git a/include/filetext.cpp b/include/filetext.cpp index 434918331..646972d2a 100755 --- a/include/filetext.cpp +++ b/include/filetext.cpp @@ -412,7 +412,7 @@ void TFile_text::set_rec_parm(TConfig& config, const char* section) } TFile_text::TFile_text(const char* file_name, const char* config_name) - : _name(file_name), _skiplines(0), _kill_zeroes(FALSE) + : _name(file_name), _skiplines(0), _kill_zeroes(FALSE), _force_record_separator(FALSE) { _read_file = NULL; _write_file = NULL; @@ -574,7 +574,9 @@ int TFile_text::write(TRecord_text& rec) // Record a lunghezza fissa buffer.rpad(_recordsize); buffer.cut(_recordsize); - *_write_file << buffer; + *_write_file << buffer; + if (_force_record_separator) + *_write_file << _recordsep; } if (!ok_w()) return 1; } @@ -659,12 +661,12 @@ bool TFile_text::_autoload(TRecord_text& rec, TCursor& cur , TTracciato_record& field.set_file(rel.lfile().num()); if (!field.name().empty()) campo = field.read(rel); - TString message = tc.message(); + const TString& message = tc.message(); if (!message.empty()) { TToken_string msg (message, ','); if (!msg.blank()) - validate(cur, rec, msg, campo); + validate(cur, rec, msg, campo); } rec.add(campo, i); @@ -678,9 +680,11 @@ int TFile_text::autosave(const TRecord_text& rec, int mainfile ) const TString& type = rec.type();//prendo il tracciato record del tipo del record_text TTracciato_record* tr = t_rec(type); if (tr) - if (tr->relation()) - if (mainfile==0 || tr->relation()->lfile().num()==mainfile) - return _autosave(*(tr->relation()),rec, *tr); + { + TRelation* rel = tr->relation(); + if (rel && (mainfile==0 || rel->lfile().num()==mainfile)) + return _autosave(*rel,rec, *tr); + } return NOERR; // l'assenza del tracciato non significa un errore } diff --git a/include/filetext.h b/include/filetext.h index e8affe777..c0d189bdd 100755 --- a/include/filetext.h +++ b/include/filetext.h @@ -155,6 +155,7 @@ class TFile_text : public TObject char _fieldsep; //separatore di campo (se a lunghezza variabile) bool _fixedlen; //indicatore di lunghezza fissa dei campi bool _kill_zeroes; // Flag per svuotare i campi pieni di zero + bool _force_record_separator; // Flag per forzare la scrittura del separatore di record anche se siamo a lunghezza fissa int _typepos;//posizione ove trovare la chiave nel record a lunghezza fissa int _typelen;//lunghezza della chiave del record a lunghezza fissa int _typefield;//posizione ove trovare la chiave nel record a lunghezza variabile @@ -258,6 +259,8 @@ public: const TString& get_field(const TRecord_text& rec, const char* name); //Svuota i campi pieni di zeri void kill_zero_only(const bool b = TRUE) { _kill_zeroes = b; } + //Forza la scrittura del separatore di record anche se è a lunghezza fissa + void force_record_separator(const bool b = TRUE) { _force_record_separator = b; if (b && _recordsep.empty()) _recordsep = "\r\n";} TFile_text(const char* file_name, const char* config_name); virtual ~TFile_text(); diff --git a/include/form.cpp b/include/form.cpp index 57c3a27ff..a78259339 100755 --- a/include/form.cpp +++ b/include/form.cpp @@ -1386,8 +1386,12 @@ protected: // TForm_string virtual bool parse_head(TScanner& scanner); virtual bool parse_item(TScanner& scanner); virtual bool update(); + // @cmember Manda il messaggio al campo

+ virtual void send_message(const TString& cmd, TForm_item& dest) const; public: virtual TObject* dup() const; + virtual TCurrency get_currency() const; + TForm_currency(TPrint_section* section) : TForm_number(section), _driver(NULL) {} virtual ~TForm_currency() {} }; @@ -1414,6 +1418,19 @@ TObject* TForm_currency::dup() const return fn; } +TCurrency TForm_currency::get_currency() const +{ + TString16 codval; + if (_driver) + codval = _driver->get(); + else + codval = form().get_curr_codval(); + const real n(get()); + TCurrency curr(n, codval); + curr.set_price(_flag.price != 0); + return curr; +} + bool TForm_currency::update() { if (read()) // valuta il campo @@ -1425,16 +1442,9 @@ bool TForm_currency::update() do_message(nm); - const real n(get()); - if (!n.is_zero()) + if (!real::is_null(get())) { - TString16 codval; - if (_driver) - codval = _driver->get(); - else - codval = form().get_curr_codval(); - TCurrency curr(n, codval); - curr.set_price(_flag.price != 0); + const TCurrency curr = get_currency(); // Niente apply_format(), la picture viene ignorata per i TForm_currency const bool dotted = picture().empty() || picture().find('.') >= 0; @@ -1453,6 +1463,24 @@ bool TForm_currency::update() return TRUE; } +void TForm_currency::send_message(const TString& cmd, TForm_item& dest) const +{ + if (cmd == "ADD") + { + TCurrency total; + if (dest.class_name() != class_name()) // La destinazione non e' un TForm_currency + { + const real n = dest.get(); + total.set_num(n); + } + else + total = ((TForm_currency&)dest).get_currency(); + total += get_currency(); + dest.set(total.string()); + } + else + TForm_number::send_message(cmd, dest); +} /////////////////////////////////////////////////////////// // TForm_date diff --git a/include/form.h b/include/form.h index b4e8d5fe4..f7110b4e0 100755 --- a/include/form.h +++ b/include/form.h @@ -323,7 +323,7 @@ public: const TString& get_curr_codval() const { return _curr_codval; } // @cmember Setta il flag di TCurrency automatici - void set_magic_currency(bool mc) + void set_magic_currency(bool mc = TRUE) { _magic_currency = mc; } // @cmember Ritorna il valore del flag per i TCurrency automatici const bool magic_currency() const @@ -793,7 +793,7 @@ protected: // @cmember Ritorna il messaggio

-esimo del campo TToken_string& message(int m = 0); // @cmember Manda il messaggio al campo

- void send_message(const TString& cmd, TForm_item& dest) const; + virtual void send_message(const TString& cmd, TForm_item& dest) const; // @cmember Esegue il messaggio

bool do_message(int m = 0); diff --git a/include/isam.cpp b/include/isam.cpp index 52fc4d1e4..d845779d0 100755 --- a/include/isam.cpp +++ b/include/isam.cpp @@ -373,6 +373,7 @@ HIDDEN int error_codes_rb[] = {-1,-1,_isreinsert,-1,-1,_islocked,-1,_isalropen,_ return isamerr; } +// Used also by varrec HIDDEN bool rec_has_memo(const RecDes* rd) { for( int i = rd->NFields - 1; i >= 0; i--) @@ -1082,6 +1083,25 @@ int TBaseisamfile::_open( _isam_handle = prefix().open_isamfile(_logicnum, filename, mode==_excllock, index); if (_isam_handle > 0) { + const int dbfreclen = DB_reclen(filehnd()->fhnd); + const int trcreclen = int(_isamfile->d->LenR); + const TRecnotype n = DB_reccount(filehnd()->fhnd); + + if (dbfreclen != trcreclen) + { + TString msg; + msg.format("Lunghezza record incoerente sul file %d (%s): file=%d trc=%d", + num(), (const char*)filename(), dbfreclen, trcreclen); + if (n == 0) + { + msg << "\nSi consiglia di eliminare il file ed i suoi indici."; + error_box(msg); + } + else + fatal_box(msg); + } + if (filehnd()->r->NKeys <= 0) + fatal_box("Il file %d (%s) e' senza indici", num(), (const char*)filename()); _recno = RECORD_NON_FISICO; setkey(1); _lasterr = NOERR; @@ -1170,10 +1190,17 @@ int TBaseisamfile::is_valid() err = get_error(err); else { - if (prefix().get_reclen(_logicnum) > 0) + const int trcreclen = prefix().get_reclen(_logicnum); + if (trcreclen > 0) err = NOERR; else err = _isbadtrc; + if (DB_tagget(isam_handle) == -1) + err = _ispatherr; + + const int dbfreclen = DB_reclen(isam_handle); + if (dbfreclen != trcreclen) + err = _istrcerr; } if (isam_handle > 0) prefix().close_isamfile(isam_handle); @@ -1219,7 +1246,7 @@ bool TBaseisamfile::is_changed_since(long& last) const if (::_fstat(fh, &stat) == 0) { const long tim = long(stat.st_mtime); - yes = tim != last; + yes = tim >= last; last = tim; } ::_close(fh); diff --git a/include/isam.h b/include/isam.h index 502d12f8c..9f61bb155 100755 --- a/include/isam.h +++ b/include/isam.h @@ -484,7 +484,7 @@ public: void zero(const char * fieldname) { curr().zero(fieldname);} // @cmember Vuota il contenuto del record corrente - void zero() + virtual void zero() { curr().zero();} // @cmember Vuota tutto il record corrente usando il carattere

void zero(char c) diff --git a/include/mailbox.cpp b/include/mailbox.cpp index cc3522e13..c77e21c18 100755 --- a/include/mailbox.cpp +++ b/include/mailbox.cpp @@ -4,8 +4,8 @@ #include #include -#define DEF_MSGS_CAPACITY 50 -#define MAX_TXT_LEN 200 +#define DEF_MSGS_CAPACITY 8 +#define MAX_TXT_LEN 256 TMessage::TMessage(const char* to, const char* sub, const char* text, const char* from) diff --git a/include/mask.cpp b/include/mask.cpp index 7a4042ec2..cf1421a2b 100755 --- a/include/mask.cpp +++ b/include/mask.cpp @@ -1022,14 +1022,14 @@ void TMask::next_page( _focus = find_first_active(toolwin()); } + TWindow::set_focus(); + if (_focus >= 0) { TMask_field& ff = fld(_focus); if (ff.active()) ff.highlight(); } - - TWindow::set_focus(); } void TMask::show_page(int p) diff --git a/include/maskfld.cpp b/include/maskfld.cpp index ff7b91d6c..73202662b 100755 --- a/include/maskfld.cpp +++ b/include/maskfld.cpp @@ -700,7 +700,7 @@ bool TOperable_field::on_key( { case K_F11: { - TString msg(80); + TString msg; msg << "Identificatore: " << dlg() << '\n' << "Maschera: " << mask().source_file() << '\n'; if (field() != NULL) @@ -4008,16 +4008,23 @@ TCurrency& TCurrency_field::get_currency(TCurrency& cur) const const real num = get(); const char* value = NULL; real exchange; + exchange_type et = _exchange_undefined; const TMask_field* d0 = driver(0); - const TMask_field* d1 = driver(1); if (d0) + { value = d0->get(); - else - value = "_FIRM"; - if (d1) - exchange = real(d1->get()); + const TMask_field* d1 = driver(1); + if (d1) + { + exchange = real(d1->get()); + const TMask_field* d2 = driver(2); + if (d2) + et = d2->get().blank() ? _exchange_base : _exchange_contro; + } + } + cur.set_num(num); - cur.force_value(value, exchange); + cur.force_value(value, exchange, et); cur.set_price(_flags.uppercase != 0); return cur; } @@ -4049,10 +4056,8 @@ const char* TCurrency_field::raw2win(const char* data) const const TMask_field* d0 = driver(0); if (d0) value = d0->get(); - else - value = "_FIRM"; - - TCurrency cur(num, value, ZERO, FALSE, _flags.uppercase != 0); + const bool price = _flags.uppercase != 0; + TCurrency cur(num, value, ZERO, _exchange_undefined, price); TString& s = _ctl_data._park; s = cur.string(TRUE); @@ -4642,7 +4647,7 @@ const char* TMemo_field::win2raw(const char* data) const bool TMemo_field::on_key(KEY k) { - if (k == K_TAB && focusdirty()) + if (k == K_ENTER || k == K_TAB && focusdirty()) get_window_data(); return TEdit_field::on_key(k); } @@ -4683,10 +4688,10 @@ bool TZoom_field::on_key( KEY key ) get_window_data(); TMask m("Zoom", 1, 72, 18); m.add_memo(101, 0, prompt(), 1, 0, -1, -3); - m.add_button(DLG_OK, 0, "Conferma", -12, -1, 9, 2); - m.add_button(DLG_CANCEL, 0, "Annulla", -22, -1, 9, 2); + m.add_button(DLG_OK, 0, "", -12, -1, 10, 2); + m.add_button(DLG_CANCEL, 0, "", -22, -1, 10, 2); m.set(101, _str); - if (m.run() != K_ESC) + if (m.run() == K_ENTER) { _str = m.get(101); set_window_data(raw2win(_str)); @@ -4757,6 +4762,52 @@ extern "C" } #endif +void TField_window::handler(WINDOW win, EVENT* ep) +{ + switch (ep->type) + { + case E_FOCUS: + if (ep->v.active) + { + WINDOW parent = xvt_vobj_get_parent(win); + XI_OBJ* itf = xi_get_itf(parent); + xi_set_focus(itf); + } + break; + default: + break; + } + TScroll_window::handler(win, ep); +} + +bool TField_window::on_key(KEY k) +{ + if (k == K_TAB || k == K_BTAB || k == K_F3 || k == K_F4) + { + const TMask& m = _owner->mask(); + const short id = _owner->dlg(); + const int start = m.id2pos(id); + const int dir = (k == K_TAB || k == K_F3) ? +1 : -1; + + int pos = start; + while (TRUE) + { + pos += dir; + if (pos < 0) pos = m.fields()-1; + if (pos >= m.fields()) pos = 0; + if (pos == start) + break; + TMask_field& f = m.fld(pos); + if (f.is_operable()) + { + f.set_focus(); + return TRUE; + } + } + } + return TScroll_window::on_key(k); +} + void TField_window::update() { const WINDOW me = win(); @@ -4810,11 +4861,7 @@ void TWindowed_field::show(bool on) void TWindowed_field::highlight() const { if (_win && active()) - { - WINDOW w = _win->win(); - xvt_scr_set_focus_vobj(w); - xvt_vobj_raise(w); - } + _win->set_focus(); } RCT& TWindowed_field::get_rect(RCT& r) const diff --git a/include/maskfld.h b/include/maskfld.h index 98a61f4b9..736f441c2 100755 --- a/include/maskfld.h +++ b/include/maskfld.h @@ -1541,7 +1541,9 @@ class TField_window : public TScroll_window protected: virtual void update(); - + virtual void handler(WINDOW win, EVENT* ep); + virtual bool on_key(KEY k); + public: TWindowed_field& owner() const { return *_owner; } diff --git a/include/msksheet.cpp b/include/msksheet.cpp index 825dc65fa..45d403c57 100755 --- a/include/msksheet.cpp +++ b/include/msksheet.cpp @@ -9,6 +9,7 @@ extern "C" #include #include #include +#include #include #include #include @@ -309,7 +310,7 @@ TSpreadsheet::TSpreadsheet( _needs_update(-1), _selection_posted(-1), _save_columns_order(FALSE) { int m_width[MAX_COL], v_width[MAX_COL]; - int fixed_columns = 1; // Number of fixed columns + int fixed_cols = 0; // Number of fixed columns int lines_in_header = 1; // Number of header lines TControl::_fld = o; @@ -317,12 +318,11 @@ TSpreadsheet::TSpreadsheet( _mask.read_mask(maskname, maskno, 0); // Legge la maschera // Calcolo larghezza massima tabella - TToken_string header(head); TToken_string new_header(256); int i = 0, tot_width = NUMBER_WIDTH+1; - int f_width = tot_width<<1; // Stima larghezza colonne fisse - int max_width = f_width; // Stima larghezza della colonna piu' grande + int max_width = tot_width<<1; // Stima larghezza della colonna piu' grande + unsigned char f_width[MAX_COL]; // Larghezza colonne fisse for (const char* h = header.get(); h; h = header.get(), i++) { @@ -357,8 +357,8 @@ TSpreadsheet::TSpreadsheet( v++; if (wi.find('F') >= 0) { - fixed_columns++; - f_width += v; + f_width[fixed_cols] = v; + fixed_cols++; } testa.cut(at); } @@ -380,12 +380,19 @@ TSpreadsheet::TSpreadsheet( _columns = i; RCT rct; coord2rct(parent, x, y, dx, dy, rct); - rct.right -= 2*XI_FU_MULTIPLE; // toglie scroll-bar - - // Controlla se ci sono troppe colonne fisse - if ((f_width+max_width)*XI_FU_MULTIPLE > rct.right) - fixed_columns = 1; - + rct.right -= 2*XI_FU_MULTIPLE; // toglie scroll-bar + + // Controlla se posso bloccare anche questa colonna + int f_totwidth=0; + for (int fc = 0; fc < fixed_cols; fc ++) + { + f_totwidth += f_width[fc]; + if ((f_totwidth+max_width)*XI_FU_MULTIPLE > rct.right) + { + fixed_cols = fc-1; + break; + } + } XI_OBJ* itf = get_interface(parent); XI_OBJ_DEF* listdef = xi_add_list_def(NULL, dlg, @@ -409,7 +416,7 @@ TSpreadsheet::TSpreadsheet( l->movable_columns = TRUE; l->scroll_bar = TRUE; l->scroll_bar_button = TRUE; - l->fixed_columns = fixed_columns; + l->fixed_columns = fixed_cols+1; l->active_back_color = FOCUS_BACK_COLOR; l->white_space_color = MASK_DARK_COLOR; l->rule_color = MASK_DARK_COLOR; @@ -744,7 +751,10 @@ int TSpreadsheet::insert( notify(r, K_CTRL + K_INS); if (update_sheet) - xi_cell_request(_obj); + { + xi_cell_request(_obj); + post_select(r); + } } else r = -1; @@ -950,20 +960,42 @@ bool TSpreadsheet::event_handler(XI_OBJ* itf, XI_EVENT *xiev) if (f) { const TEditable_field* e = (const TEditable_field*)f; - src = row(rec).get(col); // Set value for cell + TToken_string& rowrec = row(rec); + src = rowrec.get(col); // Set value for cell if (src && *src) { - if (e->is_kind_of(CLASS_LIST_FIELD)) - /* src = src */; // Leave code as is - else - src = e->raw2win(src); // Get formatted string - } - - if ((src == NULL || *src == '\0' || (*src == 'X' && src[1] == '\0')) && - e->is_kind_of(CLASS_BOOLEAN_FIELD)) - { - xiev->v.cell_request.icon_rid = (src && *src) ? ICO_CHECK_ON : ICO_CHECK_OFF; + switch (e->class_id()) + { + case CLASS_LIST_FIELD: + break; // Leave code as is + case CLASS_BOOLEAN_FIELD: + xiev->v.cell_request.icon_rid = ICO_CHECK_ON; + break; + case CLASS_CURRENCY_FIELD: + if (e->driver(0)) + { + TOperable_field* driver = e->driver(0); + if (driver->parent() == e->parent()) + { + const real r(src); // Memorizzo valore numerico + const int pos = driver->dlg() - FIRST_FIELD; + TString16 codval = rowrec.get(pos); // Codice valuta + const TCurrency c(r, codval, ZERO, _exchange_undefined, driver->uppercase()); + src = c.string(TRUE); + break; + } + } + //Fall down as usual + default: + src = e->raw2win(src); // Get formatted string + break; + } } + else + { + if (e->class_id() == CLASS_BOOLEAN_FIELD_ + xiev->v.cell_request.icon_rid = ICO_CHECK_OFF; + } if (cell_disabled(rec, col)) { @@ -1604,7 +1636,7 @@ void TSpreadsheet::activate(bool on) void TSpreadsheet::select(int rec, int col, bool scrollto) { if (col <= 0) - col = _cur_col; + col = _cur_col; if (!scrollto) { int rows; @@ -1634,8 +1666,8 @@ void TSpreadsheet::select(int rec, int col, bool scrollto) _cur_col = find_enabled_column(rec, 1, +1); _cur_rec = rec; _cur_row = row; - _edit_field = col2field(_cur_col); - + _edit_field = _cur_col > 0 ? col2field(_cur_col) : NULL; + str2mask(_cur_rec); _row_dirty = FALSE; } @@ -2846,7 +2878,8 @@ TRectype * TSheet_field::putkey(const TRelation& r) dbfieldname = _file_k_names.get()) { TMask_field& f= mask().field(_file_k_ids.get_int()); - ((TLoadable_field&)f).autoload(r); + if (mask().edit_mode()) + ((TLoadable_field&)f).autoload(r); // Molto probabilmente inutile! _sheetfile->put(dbfieldname, f.get()); } return &_sheetfile->curr(); @@ -2934,6 +2967,19 @@ bool TSheet_field::autoload(const TRelation& rel) return _enable_autoload; } +void TSheet_field::restart_key() +{ + _file_k_names.restart(); + _file_k_ids.restart(); +} + +TMask_field *TSheet_field::get_key(TString & dbfieldname) +{ + if ((dbfieldname = _file_k_names.get())!="") + return &mask().field(atoi(_file_k_ids.get())); + return NULL; +} + // Certified: ...under debug.. bool TSheet_field::autosave(TRelation& rel) { @@ -2944,15 +2990,14 @@ bool TSheet_field::autosave(TRelation& rel) if (_sheetfile) { // trasferisce dal file locale - if (mask().insert_mode()) { + if (mask().insert_mode()) + { // rinumera la chiave - _file_k_names.restart(); - _file_k_ids.restart(); TString dbfieldname; - while ((dbfieldname=_file_k_names.get())!="") { - TMask_field & f= mask().field(atoi(_file_k_ids.get())); - _linee_rec->renum_key(dbfieldname, f.get()); - } + TMask_field * f; + restart_key(); + while (f = get_key(dbfieldname)) + _linee_rec->renum_key(dbfieldname, f->get()); } } // ******* diff --git a/include/msksheet.h b/include/msksheet.h index d88f2313d..7dc544356 100755 --- a/include/msksheet.h +++ b/include/msksheet.h @@ -133,6 +133,9 @@ public: void set_lines_record(TRecord_array &); // @cmember Ritorna se il record assegnato è gestito esternamente (read/write/remove) bool external_record() const {return _external_record;} + // @cmember Gestisce i campi della chiave + void restart_key(); + TMask_field *get_key(TString & dbfieldname); // @cmember Ritorna una riga dello spreadsheet TToken_string& row(int n); @@ -254,6 +257,8 @@ public: // @cmember Trasferisce i valori dalla maschera alla riga

void update_row(int n) { mask2row(n, row(n)); } + // @cmember Trasferisce i valori dalla riga alla maschera

+ void update_mask(int n) { row2mask(n, row(n)); } // @cmember Costruttore TSheet_field(TMask* m); diff --git a/include/multirec.h b/include/multirec.h index dd2e52231..9c441bb9f 100755 --- a/include/multirec.h +++ b/include/multirec.h @@ -76,7 +76,7 @@ public: TAuto_variable_rectype& head() { return *this; } // Ritorna la testata del documento // @cmember restituisce il record array del corpo - TRecord_array & body(int logicnum = 0) const; + virtual TRecord_array & body(int logicnum = 0) const; // @cmember restituisce il numero di record nel corpo int rows(int logicnum = 0) const { return body(logicnum).rows(); } diff --git a/include/os_dep.h b/include/os_dep.h index b0b98c567..a0d2be433 100755 --- a/include/os_dep.h +++ b/include/os_dep.h @@ -53,4 +53,6 @@ bool os_dongle_server_running(); bool os_test_network_version(); +void os_sleep(long m); + #endif diff --git a/include/os_win16.cpp b/include/os_win16.cpp index 9ccd27a5a..d369eadce 100755 --- a/include/os_win16.cpp +++ b/include/os_win16.cpp @@ -317,11 +317,9 @@ int os_execute(const TFilename& path, bool sync, bool iconizetask, bool showchil bool was_maximized = FALSE; if (iconizetask) { + HWND hwnd = (HWND)xvt_vobj_get_attr(TASK_WIN, ATTR_NATIVE_WINDOW); + was_maximized = IsZoomed(hwnd); TTemp_window tw(TASK_WIN); - RCT rct_scr, rct_tsk; - xvt_vobj_get_client_rect(SCREEN_WIN, &rct_scr); - xvt_vobj_get_client_rect(tw.win(), &rct_tsk); - was_maximized = rct_scr.right == rct_tsk.right; tw.iconize(); tw.deactivate(); } @@ -448,6 +446,7 @@ os_type os_get_type() return minver > 95 ? os_Windows98 : os_Windows95; } const DWORD winflags = GetWinFlags(); + if (winflags & 0x4000) return os_WindowsNT; return os_Windows; @@ -692,7 +691,18 @@ bool os_test_network_version() } } } - message_box("Impossibile determinare la versione del driver di rete '%s'",VREDIRNAME); + //VREDIR.VXD puo' non esistere; inutile la segnalazione seguente. + //message_box("Impossibile determinare la versione del driver di rete '%s'",VREDIRNAME); } return TRUE; } + +void os_sleep(long m) +{ + clock_t fine = ((m * CLOCKS_PER_SEC)/1000) + clock(); + + while (fine > clock()) + do_events(); +} + + diff --git a/include/printapp.cpp b/include/printapp.cpp index 322becffc..8321ab36b 100755 --- a/include/printapp.cpp +++ b/include/printapp.cpp @@ -1165,17 +1165,31 @@ bool TPrint_application::print_tree (link_item * head) void TPrint_application::real2currency(TString& s, const real& r, const char* p) const { - TCurrency c(r, "_FIRM"); - if (_curr_codval.not_empty()) - c.change_value(_curr_codval); - const TString80 pic = (p && *p) ? p : _picture; - const bool dotted = pic.empty() || pic.find('.') >= 0; - s = c.string(dotted); + const TFixed_string pic = (p && *p) ? p : _picture; + if (!r.is_zero() || _print_zero) + { + TCurrency c(r); + if (_curr_codval.not_empty()) + c.change_value(_curr_codval); + const bool dotted = pic.empty() || pic.find('.') >= 0; + s = c.string(dotted); + } + else + s.cut(0); const int len = pic.len(); if (len >= 9) s.right_just(len); } +HIDDEN void raddoppia_chiocciole(TString& toprint) +{ + for (int i = toprint.len()-1; i >= 0; i--) + { + if (toprint[i] == '@') + toprint.insert("@", i); + } +} + // @doc INTERNAL // @mfunc Stampa un singolo record @@ -1237,7 +1251,7 @@ bool TPrint_application::print_one ( if (ft->_flags & FONT_FLAG) { TPrintstyle st = normalstyle; - switch (((const char *) (ft->_fld))[0]) + switch (ft->_fld[0]) { case 'u': st = underlinedstyle; @@ -1271,7 +1285,7 @@ bool TPrint_application::print_one ( } else { - if ((*(const char *) (ft->_fld)) == 'p') + if (ft->_fld[0] == 'p') { // picture TToken_string ttt (ft->_fld, '|'); @@ -1302,10 +1316,10 @@ bool TPrint_application::print_one ( { // check value if (tr->_from == f.get(fn).sub(from<0 ? 0 : from,to)) - break; + break; } } - if (i == _transtab.items ()) + if (i == _transtab.items()) toprint = ""; else toprint = tr->_to; @@ -1353,6 +1367,8 @@ bool TPrint_application::print_one ( toprint = toprint.sub (from, to); else if (to != -1) toprint = toprint.left (to); + if (toprint.find('@') >= 0) + raddoppia_chiocciole(toprint); } else if (ft->_flags & VALUTA_FLAG) { @@ -1384,6 +1400,7 @@ bool TPrint_application::print_one ( toprint = fill_str (toprint, _fillchar); // add to print row ((TPrintrow *)(&rw[ft->row()]))->put (toprint, pos[ft->row ()]); + if (pos[ft->row()] != -1) pos[ft->row ()] += toprint.len (); } diff --git a/include/printer.cpp b/include/printer.cpp index eb844d57c..65cbebd59 100755 --- a/include/printer.cpp +++ b/include/printer.cpp @@ -718,7 +718,7 @@ const char* TPrintrow::row_codified() const // Calcolo lunghezza stringa for (i = _row.size()-1; i >= 0; i--) { - if (_row[i] > ' ') + if (_row[i] != ' ') { len = i+1; break; @@ -762,7 +762,9 @@ const char* TPrintrow::row_codified() const __tmp_string[k++] = (char) (_cols[i] >> 8); __tmp_string[k++] = ']'; last_color = _cols[i]; - } + } + if (_row[i] == '@') + __tmp_string[k++] = '@'; // Escape for @ __tmp_string[k++] = _row[i]; } __tmp_string[k] = '\0'; @@ -814,6 +816,11 @@ TPrintrow& TPrintrow::put(const char *str, int position, int len) c = str[++i]; switch (toupper (c)) { + case '@': // Escape for @ + _row[position] = '@'; + _attr[position] = _currentstyle; + _cols[position++] = _currentcolor; + break; case '#': case '<': case '>': @@ -896,7 +903,7 @@ TPrintrow& TPrintrow::put(const char *str, int position, int len) else { _row[position] = c; - _attr[position++] = _currentstyle; + _attr[position] = _currentstyle; _cols[position++] = _currentcolor; } } // switch @@ -1855,6 +1862,8 @@ void TPrinter::print_txt(TTextfile& txt) xvt_print_open(); xvt_print_start_thread(start_print, (long) (&PrintWhat)); xvt_print_close(); + if (is_generic()) + os_spool_row("\n"); // Force flushing on Generic printer } } diff --git a/include/printwin.cpp b/include/printwin.cpp index 547d43e0d..60651e741 100755 --- a/include/printwin.cpp +++ b/include/printwin.cpp @@ -200,9 +200,10 @@ void TPrintwin::paint_row(long j) const int row = (int)(j % _formlen); const int y = row*_chary + _chary - _descent + ((_chary == 1) ? 0 : _vofs); - if (_chary > 1) // Stampante vera (non Generica solo Testo) + paint_background(j); + + if (_chary > 1) { - paint_background(j); _txt.read_line(j); diff --git a/include/rdoc.h b/include/rdoc.h index 2cc673996..3b3f4e2f6 100755 --- a/include/rdoc.h +++ b/include/rdoc.h @@ -50,10 +50,12 @@ #define RDOC_QTAGG5 "QTAGG5" #define RDOC_IMPIANTO "IMPIANTO" #define RDOC_LINEA "LINEA" +#define RDOC_IDRIGA "IDRIGA" #define RDOC_DACODNUM "DACODNUM" #define RDOC_DAANNO "DAANNO" #define RDOC_DAPROVV "DAPROVV" #define RDOC_DANDOC "DANDOC" +#define RDOC_DAIDRIGA "DAIDRIGA" #endif diff --git a/include/recarray.cpp b/include/recarray.cpp index 4ad8fe3db..b9496656f 100755 --- a/include/recarray.cpp +++ b/include/recarray.cpp @@ -128,6 +128,16 @@ bool TRecord_array::renum_key(const char* field, long num) return renum_key(field, n); } +void TRecord_array::sort(COMPARE_FUNCTION sort_func) +{ + TObject * rec = _data.remove(0); // salva chiave + + _data.sort(sort_func); // ordina + _data.insert(rec,0); // ripristina chiave + TString16 n; + for (int i = _data.last(); i > 0; i--) + row(i, FALSE).renum_key(_num, n.format("%d", i)); // Rinumera +} int TRecord_array::rec2row(const TRectype& r) const { diff --git a/include/recarray.h b/include/recarray.h index f04a31f59..f1f963ec0 100755 --- a/include/recarray.h +++ b/include/recarray.h @@ -114,6 +114,8 @@ public: bool renum_key(const char* field, const TString& num); // @cmember Rinumera il campo chiave in seguito a reinsert bool renum_key(const char* field, long num); + // @cmember Ordina il Record Array secondo il criterio definito in + void sort(COMPARE_FUNCTION sort_func); // @cmember Legge tutto l'array dal file virtual int read(const TRectype& r); diff --git a/include/rectypes.h b/include/rectypes.h index 180e27b40..be5d07562 100755 --- a/include/rectypes.h +++ b/include/rectypes.h @@ -97,7 +97,8 @@ enum TIsamerr { _isdeadlock = 223, // @emem Condizione di deadlock _isreinsert = 224, // @emem Chiave primaria duplicata _islocked = 225, // @emem Record bloccato - _isbadtrc = 226 // @emem Tracciato Record errato o mancante + _isbadtrc = 226, // @emem Tracciato Record errato o mancante + _istrcerr = 227 // @emem Tracciato record incoerente }; typedef long TRecnotype; diff --git a/include/relapp.cpp b/include/relapp.cpp index 52efb0ee2..5c4cb19c8 100755 --- a/include/relapp.cpp +++ b/include/relapp.cpp @@ -45,7 +45,7 @@ void TRelation_application::set_key_filter() if (fld.is_edit() && fld.in_key(0)) { TBrowse* b = ((TEdit_field&)fld).browse(); - if (b) + if (b && b->cursor()->relation()->lfile().num() == get_relation()->lfile().num()) { expr = b->get_filter(); if (expr.find(rf) < 0) @@ -195,28 +195,30 @@ void TRelation_application::set_toolbar(bool all) { if (all) { - bool can_edit = !_mask->query_mode(); - if (can_edit) - can_edit = user_can_write(get_relation()); + const int mode = _mask->mode(); + const bool can_edit_some = user_can_write(NULL); int pos = _mask->id2pos(DLG_SAVEREC); - if (pos >= 0) - _mask->fld(pos).enable(can_edit); - + if (pos >= 0) + { + bool enabsave=mode != MODE_QUERY; + if (enabsave) + enabsave = !protected_record(*get_relation()); + _mask->fld(pos).enable(enabsave); + } pos = _mask->id2pos(DLG_DELREC); if (pos >= 0) { - const int mode = _mask->mode(); - bool enabdel = (mode == MODE_QUERY) || (mode == MODE_MOD && can_edit); + bool enabdel = (mode == MODE_QUERY && can_edit_some) || (mode == MODE_MOD); if (enabdel && mode == MODE_MOD) { TRelation& r = *get_relation(); const TRecnotype oldpos = r.lfile().recno(); - enabdel = !protected_record(r.curr()); + enabdel = !protected_record(r); if (r.lfile().recno() != oldpos) r.lfile().readat(oldpos); + _mask->fld(pos).enable(enabdel); } - _mask->fld(pos).enable(enabdel); } pos = _mask->id2pos(DLG_FINDREC); @@ -226,8 +228,7 @@ void TRelation_application::set_toolbar(bool all) pos = _mask->id2pos(DLG_NEWREC); if (pos >= 0) { - bool enabins = (_mask->query_mode() || _lnflag == 0) && - user_can_write(NULL); + bool enabins = (mode == MODE_QUERY || _lnflag == 0) && can_edit_some; _mask->fld(pos).enable(enabins); } } @@ -381,7 +382,7 @@ void TRelation_application::insert_mode() } if (!user_can_write(r)) { - error_box("L'utente %s non puo' inserire questo documento", + warning_box("L'utente %s non puo' inserire in questo archivio", (const char*)user()); return; } @@ -751,7 +752,7 @@ int TRelation_application::delete_mode() { TRelation& r = *get_relation(); _autodelete = 0x3; - if (!protected_record(r.curr())) + if (!protected_record(r)) { if (modify_mode()) { @@ -867,9 +868,12 @@ bool TRelation_application::save(bool check_dirty) { static bool was_dirty = FALSE; + int pos = _mask->id2pos(DLG_SAVEREC); + if (pos < 0 || !(_mask->fld(pos).shown() && _mask->fld(pos).enabled())) + return TRUE; + int err = NOERR; const int mode = _mask->mode(); - if (check_dirty) { const int dirty = _mask->dirty(); @@ -1076,11 +1080,12 @@ bool TRelation_application::relation_remove() // emesso un di errore. { CHECK(_mask->edit_mode(), "You can call remove in edit mode only"); + TRelation& r = *get_relation(); r.restore_status(); - if (protected_record(r.curr())) + if (protected_record(r)) return message_box("Elemento non eliminabile"); if (_curr_transaction == TRANSACTION_DELETE || yesno_box("Confermare l'eliminazione")) @@ -1096,6 +1101,13 @@ bool TRelation_application::relation_remove() } +bool TRelation_application::protected_record(TRelation &r) +{ + if (user_can_write(&r)) + return protected_record(r.curr()); + return TRUE; +} + bool TRelation_application::remove() { TMask &m=*_mask; @@ -1631,6 +1643,7 @@ void TRelation_application::edit_mask2ini() void TRelation_application::mask2ini(const TMask& m, TConfig& ini) { TString16 defpar; defpar << get_relation()->lfile().num(); + ini.set_paragraph(defpar); ini.set("Firm", get_firm(), "Transaction"); @@ -1638,15 +1651,59 @@ void TRelation_application::mask2ini(const TMask& m, TConfig& ini) for (int f = 0; f < m.fields(); f++) { TMask_field& campo = m.fld(f); - if (campo.field() && campo.shown()) + if (campo.shown()) { - const TString& str = campo.get(); - campo.field()->write(ini, defpar, str); + if (campo.field()) + { + str = campo.get(); + if (str.blank()) str = " "; + campo.field()->write(ini, defpar, str); + } + else + if (campo.is_sheet()) + { + TSheet_field &sheet=(TSheet_field &)campo; + sheet2ini(sheet,ini); + } } } - ini.set_paragraph(defpar); } +void TRelation_application::ini2sheet(TConfig& ini,TSheet_field &sheet) +{ +} + +void TRelation_application::sheet2ini(TSheet_field &sheet,TConfig& ini) +{ + if (sheet.record() != NULL) + { + // scrive le righe degli sheet associati + TString16 defpar; + TString str(80); + for (int r = 1 ; r <= sheet.items(); r++) + { + TString16 defpar = format("%d,%d",sheet.record()->logic_num(),r); + const TMask& sm = sheet.sheet_mask(); + + TMask_field* fkey; + sheet.restart_key(); + while (fkey = sheet.get_key(str)) + { + ini.set(str, fkey->get(), defpar); + } + for (int sf = 0; sf < sm.fields(); sf++) + { + TMask_field& campo = sm.fld(sf); + if (campo.shown() && campo.field()) + { + str = sheet.row(r-1).get(sheet.cid2index(campo.dlg())); + if (str.empty()) str = " "; + ini.set(campo.field()->name(), str ,defpar); + } + } + } + } +} bool TRelation_application::mask2mail(const TMask& m) { if (::can_dispatch_transaction(get_relation()->curr())) diff --git a/include/relapp.h b/include/relapp.h index a8b02d4f2..c1e27b8d3 100755 --- a/include/relapp.h +++ b/include/relapp.h @@ -182,8 +182,11 @@ protected: { return FALSE; } // @cmember Richiede se il record corrente e' protetto (non cancellabile) - virtual bool protected_record(TRectype&) + virtual bool protected_record(TRectype&) { return FALSE; } + + // @cmember Richiede se il record corrente e' protetto (non cancellabile) + virtual bool protected_record(TRelation &); // @cmember Inizializza la maschera per il modo ricerca virtual void init_query_mode(TMask&) @@ -220,6 +223,8 @@ protected: void ini2query_mask(); void ini2insert_mask(); void edit_mask2ini(); + virtual void ini2sheet(TConfig& ini, TSheet_field &sheet); + virtual void sheet2ini(TSheet_field &sheet,TConfig& ini); virtual void ini2mask(TConfig& ini, TMask& m, bool query); virtual void mask2ini(const TMask& m, TConfig& ini); virtual bool mask2mail(const TMask& m); diff --git a/include/relation.cpp b/include/relation.cpp index 58b35d406..6319b9d63 100755 --- a/include/relation.cpp +++ b/include/relation.cpp @@ -592,16 +592,18 @@ int TRelation::position_rels( _errors = NOERR; + + const int primo = first < 0 ? 0 : first; + const int ultimo = first < 0 && (-first) < _reldefs.items() ? -first : _reldefs.items(); + // workhorse: position files for each active relation - for (int i = first; i < _reldefs.items(); i++) + for (int i = primo; i < ultimo; i++) { TRelationdef& rd = reldef(i); + TLocalisamfile& from = file(rd.num()); TLocalisamfile& to = file(rd.link()); - TReclock lck = rd._allow_lock ? lockop : _nolock; - - TRectype& furr = from.curr(); - furr.zero(); + from.zero(); // Azzera il record corrente (tutti se TSortedfile) if (to.curr().empty()) continue; @@ -609,14 +611,17 @@ int TRelation::position_rels( from.setkey(rd._key); // build record - for (int j = 0 ; j < rd._fields.items(); j++) // for each field + TRectype& furr = from.curr(); + for (int j = 0; j < rd._fields.items(); j++) // for each field { expr = rd.evaluate_expr(j, to); TFieldref& s = (TFieldref&) rd._fields[j]; s.write(expr, furr); } // for each field + const TReclock lck = rd._allow_lock ? lockop : _nolock; from.read(_isgteq, lck); + // record read : if not found, zero current record bool eq = !from.bad(); for (int kk = 0; eq && kk < rd._fields.items(); kk++) @@ -714,7 +719,6 @@ bool TRelation::next_match( old.restart(); - for (f = fields.get(0); f && ok; f = fields.get()) { const TFixed_string v(from.curr().get(f)); @@ -751,7 +755,11 @@ bool TRelation::is_first_match( CHECKD(i != NOTFOUND,"Nonexistent file referenced in relation ",logicnum); for (int j = 0; j < _reldefs.items(); j++) - if (reldef(j).num() == i) return reldef(j)._first_match; + { + TRelationdef& rdj = reldef(j); + if (rdj.num() == i) + return rdj._first_match; + } const int err = file().status(); return err == NOERR; } @@ -1084,7 +1092,7 @@ int TCursor::filtercursor(int pagecnt, TRecnotype* page) { rec.readat(fil,page[i]); if (update_relation()) - _if->update(); + _if->update(-filter_limit()); bool ok = TRUE; if (_filterfunction) @@ -1442,7 +1450,7 @@ TRecnotype TCursor::read(TIsamop op, TReclock lockop) TCursor::TCursor(TRelation* r, const char* fil, int nkey, const TRectype *from, const TRectype* to) : _if(r), _nkey(nkey), _frozen(FALSE), _filterfunction(NULL), _fexpr(NULL), - _filter_update(FALSE), _filterfunction_update(FALSE) + _filter_update(FALSE), _filterfunction_update(FALSE), _filter_limit(0) { file().setkey(_nkey); _pos = 0; @@ -1630,11 +1638,9 @@ bool TSorted_cursor::check_expr( bool TSorted_cursor::is_upper(TString& s) // Controlla se nell'espressione esiste l'operatore UPPER() { - bool rt=TRUE; + bool rt=FALSE; if (s.find("UPPER") >= 0) - rt=check_expr(s); - else - rt=FALSE; + rt = check_expr(s); return rt; } @@ -1644,7 +1650,6 @@ TRecnotype TSorted_cursor::buildcursor(TRecnotype rp) int abspos=0,junk, l, pagecnt = 0; const bool filtered = has_filter(); TString s; - El_To_Sort * Element; _sort = new TSort(sizeof(El_To_Sort)); _order_expr.restart(); @@ -1661,8 +1666,8 @@ TRecnotype TSorted_cursor::buildcursor(TRecnotype rp) int flen = f.len(n<0 ? relation()->lfile(n).curr() : relation()->curr()); _sort->addsortkey(abspos+f.from(),flen,versus); CHECKS(flen!=0,"Field can not have null length: ",(const char *) s); - int lf = (relation()->lfile(n).num()); - TRectype r(lf); + + const TRectype& r = relation()->lfile(n).curr(); abspos+=r.length(f.name()); CHECKD(abspos<=256,"Cannot exceed 256 bytes-key %d",abspos); } @@ -1730,6 +1735,7 @@ TRecnotype TSorted_cursor::buildcursor(TRecnotype rp) ap = 0; pagecnt = 0; + El_To_Sort* Element = NULL; while ((Element=(El_To_Sort *)_sort->retrieve()) != NULL) { page[pagecnt++]=Element->p; @@ -1750,6 +1756,42 @@ TRecnotype TSorted_cursor::buildcursor(TRecnotype rp) return ap; } +const char* TSorted_cursor::fill_sort_key(char* k) +{ + TString16 fmt; + TString sf; + *k = '\0'; + for (TString80 s = _order_expr.get(0); s.not_empty(); s = _order_expr.get()) + { + const bool is_up = is_upper(s); + const int p = s.find('[');// Qui estrae il nome del campo: + if (p >= 0) // rimane solo l'indicazione del file (eventuale) + s.cut(p); // ed il nome del campo: + else // UPPER(20->RAGSOC[1,30]+) --->> 20->RAGSOC + { + const char last = s.right(1)[0]; + if (last == '-' || last == '+') + s.rtrim(1); + } + const TFieldref f(s,0); + sf = f.read(*relation()); + const TRectype& frec = curr(f.file()); + const TFieldtypes fld_type = frec.type(f.name()); + if (fld_type == _datefld) // Se il campo e' di tipo data, la converte in ANSI! + { + TDate d(sf); + sf=d.string(ANSI); + } + if (is_up) sf.upper(); + if (fld_type == _alfafld || fld_type == _datefld) + fmt.format("%%-%ds",f.len(frec)); + else + fmt.format("%%%ds",f.len(frec)); + strcat(k, format(fmt, (const char*)sf)); + } + return k; +} + int TSorted_cursor::filtercursor(int pagecnt, TRecnotype* page) { int np=0 /*, handle=file().filehnd()->fhnd */; @@ -1760,40 +1802,16 @@ int TSorted_cursor::filtercursor(int pagecnt, TRecnotype* page) for (int i=0; i< pagecnt; i++) { file().readat(rec,page[i]); - if (update_relation()) relation()->update(); + if (update_relation()) + relation()->update(-filter_limit()); + if ((filterfunction() ? filterfunction()(relation()) : TRUE ) && (expression() ? __evalcondition(*relation(), expression(), field_refs()) : TRUE)) { if (np < i) page[np] = page[i]; np++; - _order_expr.restart(); - strcpy(Element.f,""); - while ((s=_order_expr.get()).not_empty()) - { - bool is_up=is_upper(s); - int p=s.find('[');// Qui estrae il nome del campo: - if (p>-1) // rimane solo l'indicazione del file (eventuale) - s.cut(p); // ed il nome del campo: - else // UPPER(20->RAGSOC[1,30]+) --->> 20->RAGSOC - if (s.right(1) == "-" || s.right(1) == "+") - s.cut(s.len()-1); - TFieldref f(s,0); - sf=f.read(*relation()); - TRectype& frec = file(f.file()).curr(); - TFieldtypes fld_type = frec.type(f.name()); - if (fld_type == _datefld) // Se il campo e' di tipo data, la converte in ANSI! - { - TDate d(sf); - sf=d.string(ANSI); - } - if (is_up) sf.upper(); - if (fld_type == _alfafld || fld_type == _datefld) - fmt.format("%%-%ds",f.len(frec)); - else - fmt.format("%%%ds",f.len(frec)); - strcat(Element.f,(const char*)sf.format((const char *)fmt,(const char *)sf)); - } + fill_sort_key(Element.f); Element.p=page[i]; _sort->sort((char *) &Element); } @@ -1804,8 +1822,7 @@ int TSorted_cursor::filtercursor(int pagecnt, TRecnotype* page) bool TSorted_cursor::changed() { - bool rt; - + bool rt = FALSE; if (_is_valid_expr) { rt = TCursor::changed(); @@ -1813,17 +1830,73 @@ bool TSorted_cursor::changed() _is_changed_expr = FALSE; } else - { - NFCHECK("Can't perform changed() while expression is not valid!"); - rt=FALSE; - } + NFCHECK("Can't perform changed() while sorted cursor expression is not valid!"); return rt; } +TRecnotype TSorted_cursor::read(TIsamop op, TReclock lockop) +{ + TString256 searching; fill_sort_key(searching.get_buffer()); + searching.rtrim(); + const int cmplen = searching.len(); + + TRecnotype first = 0L; + TRecnotype last = items()-1; + TRecnotype found = -1L; + + TString256 testing; + while (first <= last) + { + const TRecnotype test = (first+last)/2; + TCursor::operator=(test); + fill_sort_key(testing.get_buffer()); + const int cmp = searching.compare(testing, cmplen); + if (cmp == 0) + { + if (op != _isgreat) + { + if (found < 0l || test < found) + found = test; + last = test-1; + } + else + first = test+1; + } + else + { + if (cmp < 0) + { + last = test-1; + if (op != _isequal) + { + if (found < 0l || test < found) + found = test; + } + } + else + first = test+1; + } + } + + if (found >= 0L) + { + TCursor::operator=(found); + file().setstatus(NOERR); + if (lockop != _nolock) + lock(lockop); + } + else + { + found = items()-1; + TCursor::operator=(found); + file().setstatus(op == _isequal ? _iskeynotfound : _iseof); + } + return found; +} void TSorted_cursor::change_order(const char* order_expr) { - if (order_expr && *order_expr && order_expr != _order_expr) + if (order_expr && *order_expr && _order_expr != order_expr) { TString s; _order_expr = order_expr; @@ -2491,15 +2564,15 @@ int TSortedfile::operator --() } // @mfunc Si posiziona sul primo record del file (vedi ) -int TSortedfile::first(word lockop ) +int TSortedfile::first(word lockop) { int err = _curs->items() > 0 ? NOERR : _iseof; - *_curs = 0; + _curs->first_item(); setstatus(err); return err; } // @mfunc Si posiziona sull'ultimo record del file (vedi ) -int TSortedfile::last(word lockop ) +int TSortedfile::last(word lockop) { int err = _curs->items() > 0 ? NOERR : _iseof; _curs->last_item(); @@ -2527,7 +2600,7 @@ int TSortedfile::prev(word lockop ) // @mfunc Salta

record dalla posizione corrente (vedi ) int TSortedfile::skip(TRecnotype nrec, word lockop ) { -// return *this+=nrec; manca il lock... + *_curs += nrec; // manca il lock... setstatus(_curs->file().status()); NFCHECK("Operazione 'skip' non consentita sul cursore"); return 0; @@ -2557,6 +2630,8 @@ int TSortedfile::read(TRectype& rec, word op , word lockop ) curr() = rec; _curs->read((TIsamop)op,(TReclock)lockop); setstatus(_curs->file().status()); + if (&curr() != &rec) + rec = curr(); return status(); } @@ -2571,8 +2646,8 @@ int TSortedfile::readat(TRectype& rec, TRecnotype nrec, word lockop ) // parametri presi dalle funzioni a basso livello sugli isam, quindi relativi alle posizioni fisiche // e non a quanto restituito da recno() (che da' la posizione all'interno del cursore) *_curs=nrec; - - rec=curr(); + if (&curr() != &rec) + rec=curr(); setstatus(_curs->file().status()); return status(); } @@ -2658,7 +2733,7 @@ TRectype& TSortedfile::curr() const return _curs->curr(); } -void TSortedfile::set_curr(TRectype * curr) +void TSortedfile::set_curr(TRectype* curr) { _curs->file().set_curr(curr); } @@ -2676,12 +2751,9 @@ TSortedfile::TSortedfile(int logicnum,TRelation * rel,const char * ordexpr,const _rel=rel; _curs = new TSorted_cursor(_rel,ordexpr,"",nkey); - if (&curr()!=&(_curs->file().curr())) - _curs->file().set_curr(&curr()); - - _curs->setfilter(filter,TRUE); //must pass TRUE because cursors doesn't update rel (BUG). - // DON't move this line BEFORE set_curr : filter's fieldrefs are allocated at cursor setfilter + _curs->setfilter(filter,TRUE); //BUG: cursors doesn't update rel. } + // @mfunc Distruttore TSortedfile::~TSortedfile() { @@ -2690,7 +2762,6 @@ TSortedfile::~TSortedfile() delete _rel; } - // // *** EOF relation.cpp diff --git a/include/relation.h b/include/relation.h index e62872e19..c0f719ca5 100755 --- a/include/relation.h +++ b/include/relation.h @@ -64,8 +64,8 @@ public: // TObject public: // @cmember Aggiorna l'albero delle relazioni - int update() - { return position_rels(_isequal, _nolock);} + int update(int first = 0) + { return position_rels(_isequal, _nolock, first); } // @cmember Azzera l'albero delle relazioni void zero(); //@cmember Sposta la relazione sul record successivo del file principale (chiama ) @@ -237,7 +237,9 @@ class TCursor : public TContainer TRecnotype _lastkrec; // @cmember:(INTERNAL) Ditta di creazione indice long _index_firm; - // @cmember:(INTERNAL) Filtro definito con la + // @cmember:(INTERNAL) Nome assoluto del file principale + TFilename _filename; + // @cmember:(INTERNAL) Filtro definito con la TString _filter; // @cmember:(INTERNAL) Nome della chiave iniziale TString _keyfrom; @@ -253,6 +255,8 @@ class TCursor : public TContainer bool _filter_update; // @cmember:(INTERNAL) Flag che permette l'update della relazione per la funzione-filtro bool _filterfunction_update; + // @cmember:(INTERNAL) Livello max per l'update della relazione per la espressione-filtro + int _filter_limit; // @cmember:(INTERNAL) Funzione filtro FILTERFUNCTION _filterfunction; // @cmember:(INTERNAL) Nome del file indice @@ -283,8 +287,10 @@ protected: // @cmember Indica se e' possibile fare l'update sulla relazione (se e' possibile // sia sull'espressione-filtro che sulla funzione-filtro) bool update_relation() const - {return (_filter_update || _filterfunction_update);} - + { return (_filter_update || _filterfunction_update); } + + int filter_limit() const { return _filter_limit; } + // @access Public Member public: // @cmember Si sposta alla posizione

@@ -335,7 +341,7 @@ public: //@cmember Testa la presenza di un record senza spostare il cursore int test(TIsamop op = _isequal, TReclock lockop = _nolock) const; // @cmember Legge il record - TRecnotype read(TIsamop op = _isgteq, TReclock lockop = _nolock); + virtual TRecnotype read(TIsamop op = _isgteq, TReclock lockop = _nolock); // @cmember Mette un lock sul record int lock(TReclock = _lock); // @cmember Toglie un lock sul record (chiama ) @@ -354,8 +360,8 @@ public: bool frozen() const { return _frozen; } // @cmember Permette di modificare l'espressione-filtro - void setfilter(const char* filter_expr, bool update=FALSE) - { filter(filter_expr); _filter_update = update; } + void setfilter(const char* filter_expr, bool update=FALSE, int limit = 0) + { filter(filter_expr); _filter_update = update; _filter_limit = limit; } // @cmember Setta la regione-filtro dal record

al record

void setregion(const TRectype& from, const TRectype& to) { filter(NULL,&from, &to); } @@ -452,6 +458,9 @@ protected: bool check_expr(TString& s); // @cmember Controlla se la singola espressione contiene l'operatore UPPER(), ritornandone l'argomento bool is_upper(TString& s); + // @cmember Costruisce una stringa con la chiave di sort del record corrente + const char* fill_sort_key(char* k); + // @cmember Costruisce il cursore a partire dal record (vedi ) virtual TRecnotype buildcursor(TRecnotype rp); // @cmember Permette di creare una pagina di cursori (vedi ) @@ -463,9 +472,13 @@ protected: public: // @cmember Si sposta alla posizione

TRecnotype operator =(const TRecnotype nr) - {return TCursor::operator =(nr); } + { return TCursor::operator =(nr); } + // @cmember Trova l'indice del record corrente + virtual TRecnotype read(TIsamop op = _isgteq, TReclock lockop = _nolock); + // @cmember Permette di cambiare l'ordinamento del cursore. void change_order(const char* order_expr); + // @cmember Costruttore TSorted_cursor(TRelation *f,const char * order_expr, const char * filter = "", int key = 1, const TRectype* from = NULL, const TRectype* to = NULL); // @cmember Distruttore @@ -698,6 +711,8 @@ public: // @cmember Ritorna il record corrente del del file virtual TRectype& curr() const; + // @cmember Azzera tutti i record del cursore + virtual void zero() { _rel->zero(); } // @cmember Sostituisce il record corrente del del file (disallocando il vecchio) virtual void set_curr(TRectype * curr); // @cmember Si posiziona sul primo record del file (vedi ) diff --git a/include/sheet.cpp b/include/sheet.cpp index 97aa7c6b2..47a5ea5c2 100755 --- a/include/sheet.cpp +++ b/include/sheet.cpp @@ -1433,7 +1433,7 @@ void TBrowse_sheet::handler( if (p.h > 2 * cr.right / 3) pa = XVT_POPUP_RIGHT_ALIGN; - xvt_menu_popup(menu, win, p, pa, NULL); + xvt_menu_popup(menu->child, win, p, pa, NULL); xvt_res_free_menu_tree(menu); } #else @@ -1444,6 +1444,7 @@ void TBrowse_sheet::handler( if (r == RESP_2 || r == RESP_3) sht.save_columns_order(field()); #endif + return; } break; default: @@ -1468,6 +1469,9 @@ void TBrowse_sheet::handler( case M_EDIT_CLEAR: sheet().save_columns_order(field()); return; + case M_EDIT_SEARCH: + fld(0).on_key(K_F11); + return; default: break; } diff --git a/include/strings.cpp b/include/strings.cpp index fc3ecc2b9..a8b0371e0 100755 --- a/include/strings.cpp +++ b/include/strings.cpp @@ -149,7 +149,7 @@ TString& TString::set( else { if (size() == 0) - resize(15, FALSE); + resize(DEFAULT_SIZE, FALSE); *_str = '\0'; } @@ -181,12 +181,6 @@ TString::TString(const TString& s) : _str(NULL), _size(0) TString::TString(int size, char c) : _str(NULL), _size(0) { -/* - resize(size, FALSE); - *(_str+size--)='\0'; - for (;c && size>=0; size--) - *(_str+size)=c; -*/ if (size > 0) fill(c, size); // Guy: Much simpler and faster (uses memset) else diff --git a/include/tabutil.cpp b/include/tabutil.cpp index df02a4c2e..2810e8d7a 100755 --- a/include/tabutil.cpp +++ b/include/tabutil.cpp @@ -143,7 +143,7 @@ void TTable::load_module_description() n << "recdesc/d" << _tabname; n.ext("des"); n.lower(); - if (fexist(n)) + if (n.exist()) { TConfig des(n, "TabDescr"); _module = des.get("Module"); @@ -157,28 +157,35 @@ void TTable::load_module_description() if (list_files(n, f) == 1) { n = f.row(0); - if (_module.empty()) + if (!n.exist()) + n.overwrite("ba",0); + if (n.exist()) { - _module = n.left(2); - _module.lower(); - } - TScanner m(n); - bool ok = TRUE; - while (ok) - { - const TString& l2 = m.line().left(2); - if (l2.empty()) - ok = FALSE; - else - if (l2 == "PA") - break; - } - if (ok) - { - const int apicia = m.token().find('"')+1; - const int apicic = m.token().find('"', apicia); - _description = m.token().sub(apicia, apicic); - } + if (_module.empty()) + { + _module = n.left(2); + _module.lower(); + } + TScanner m(n); + bool ok = TRUE; + while (ok) + { + const TString& l2 = m.line().left(2); + if (l2.empty()) + ok = FALSE; + else + if (l2 == "PA") + break; + } + if (ok) + { + const int apicia = m.token().find('"')+1; + const int apicic = m.token().find('"', apicia); + _description = m.token().sub(apicia, apicic); + } + } + else + _module = "ba"; } else _module = "ba"; diff --git a/include/text.cpp b/include/text.cpp index ba7308bc1..d240a8cc4 100755 --- a/include/text.cpp +++ b/include/text.cpp @@ -154,9 +154,11 @@ void TTextfile::_read_page (long n) _spots.destroy (); long l = 0l; - fseek (_index, _page_start * (long) sizeof (long), SEEK_SET); if (_page_start != 0l) + { + fseek (_index, _page_start * (long) sizeof (long), SEEK_SET); fread (&l, sizeof (long), 1, _index); + } fseek (_instr, l, SEEK_SET); for (long i = _page_start; i <= _page_end; i++) @@ -166,6 +168,7 @@ void TTextfile::_read_page (long n) fgets (TEXT_TMP, TEXT_TMP_SIZE, _instr); TEXT_TMP[strlen (TEXT_TMP) - 1] = '\0'; TString & ts = (TString &) _page[(int) (i - _page_start)]; + CHECK(ts.size() > 0, "Corrupted string"); ts = TEXT_TMP; if (_interactive) { @@ -340,7 +343,8 @@ void TTextfile::read_line ( txt.left_just(len); } // ficca il testo cola' dove si puote - for (int k = 0; k < txt.len(); k++) + const txtlen = txt.len(); + for (int k = 0; k < txtlen; k++) TEXT_TMP[ndx++] = txt[k]; } // see (!terminated) above else // Restore sp pointer @@ -353,7 +357,8 @@ void TTextfile::read_line ( if (ch == '@' || (ch == '$' && *(sp) == '[')) { if (!first && p >= pos) - { + { + CHECKD(ndx < TEXT_TMP_SIZE, "Bad TEXT_TMP index ", ndx); _styles[_item++] = stl; TEXT_TMP[ndx] = '\0'; _line.add (TEXT_TMP); @@ -364,15 +369,21 @@ void TTextfile::read_line ( if (ch == '@') // font style change ? { const char c = *sp++; - - style sss = _trans_style (c); - if (sss == normal) - stl = (long) col << 16; + if (c == '@') + { + _styles[_item++] = stl; + _line.add("@"); + } else - stl |= (long) sss; + { + style sss = _trans_style (c); + if (sss == normal) + stl = (long) col << 16; + else + stl |= (long) sss; + } } else if (ch == '$' && *sp == '[') // color change - { ++sp; // eat '[' @@ -389,7 +400,8 @@ void TTextfile::read_line ( } if (ch && p >= pos) - { + { + CHECKD(ndx < TEXT_TMP_SIZE, "Bad TEXT_TMP index ", ndx); first = FALSE; TEXT_TMP[ndx++] = ch; } @@ -448,22 +460,30 @@ long TTextfile::search( // @comm Cerca in una riga per volta rispettando i formati { - TString lin(512); TString80 text(txt); + TString lin(512); + TString text(txt); if (!casesens) - text.lower(); + text.lower(); + if (regexp && text.right(1) != "*") + text << '*'; for (long i = from; down ? (i < lines()) : (i >= 0); down ? i++ : i--) { lin = line(i); + if (!casesens) + lin.lower(); if (regexp) { - if (match(txt, lin)) - return i; + for (ret = 0; lin[ret]; ret++) + { + if (match(text, lin.mid(ret))) + return i; + } } else - { - if (!casesens) lin.lower(); - if ((ret = lin.find(text)) != -1) + { + ret = lin.find(text); + if (ret >= 0) return i; } } diff --git a/include/tree.cpp b/include/tree.cpp index b7981867a..3c37f7d29 100755 --- a/include/tree.cpp +++ b/include/tree.cpp @@ -421,7 +421,7 @@ bool TObject_tree::goto_node(const TString& node) bool ok = TRUE; if (node.not_empty()) { -#ifdef DBG +#ifdef DBG_TREE if (!_expanded.is_key(node)) // Usa l'assoc array per testare i nodi validi! { NFCHECK("Invalid node: %s", (const char*)node); @@ -476,7 +476,7 @@ bool TObject_tree::set_object(TObject* obj) { if (_current) { -#ifdef DBG +#ifdef DBG_TREE TString str; curr_id(str); _expanded.add(str); // Usa l'assoc array per memorizzare i nodi validi! #endif @@ -641,7 +641,7 @@ bool TObject_tree::kill_node() if (_current->_rbrother) _current->_rbrother->_lbrother = _current->_lbrother; -#ifdef DBG +#ifdef DBG_TREE TString id; curr_id(id); _expanded.remove(id); #endif @@ -803,6 +803,7 @@ class TTree_window : public TField_window TNode_info _curr_info; // Nodo attualmente selezionato static int _row_height; + static bool _tree_locked; protected: // TWindow virtual void update(); @@ -831,6 +832,7 @@ public: }; int TTree_window::_row_height = CHARY+2; +bool TTree_window::_tree_locked = FALSE; const int TABX = 3; @@ -1031,12 +1033,12 @@ void TTree_window::draw_plus_minus() } void TTree_window::update() -{ +{ TField_window::update(); if (_tree == NULL) return; - + TUpdate_info ui; ui._win = this; ui._x = 0; @@ -1062,7 +1064,8 @@ void TTree_window::update() if (!ok) { ok = _tree->goto_root(); - if (!ok) return; + if (!ok) + return; } _node_info.reset(); @@ -1165,7 +1168,7 @@ bool TTree_window::index2info(long index, TNode_info& ni) bool TTree_window::on_key(KEY key) { - if (_tree == NULL) + if (_tree == NULL || _tree_locked) return FALSE; if (key == K_RIGHT) @@ -1187,7 +1190,8 @@ bool TTree_window::on_key(KEY key) } if (key == K_UP || key == K_DOWN) - { + { + _tree_locked = TRUE; int index = info2index(_curr_info); if (key == K_UP) index--; @@ -1214,28 +1218,40 @@ bool TTree_window::on_key(KEY key) _tree->curr_id(_curr_info._id); owner().on_key(K_SPACE); if (!scroll) + { force_update(); + do_events(); + } } + + _tree_locked = FALSE; if (!scroll) return TRUE; } if (key == K_ENTER) - { + { + _tree_locked = TRUE; if (_tree->goto_node(_curr_info._id)) { - bool ok; - if (_tree->expanded()) - ok = _tree->shrink(); - else - ok = _tree->expand(); - if (ok) + if (_tree->has_son()) { - force_update(); - do_events(); + bool ok; + if (_tree->expanded()) + ok = _tree->shrink(); + else + ok = _tree->expand(); + if (ok) + { + force_update(); + do_events(); + // Make sure of being well positioned after the redraw!!! + _tree->goto_node(_curr_info._id); + } } owner().on_key(K_CTRL + K_SPACE); } + _tree_locked = FALSE; } return TField_window::on_key(key); @@ -1247,8 +1263,9 @@ void TTree_window::handler(WINDOW win, EVENT* ep) { case E_MOUSE_DBL: case E_MOUSE_DOWN: - if (_tree) - { + if (_tree && !_tree_locked) + { + _tree_locked = TRUE; const int c = ep->v.mouse.where.h / CHARX; const int r = ep->v.mouse.where.v / _row_height; dev2log(ep->v.mouse.where); @@ -1280,6 +1297,7 @@ void TTree_window::handler(WINDOW win, EVENT* ep) force_update(); } } + _tree_locked = FALSE; } break; default: diff --git a/include/viswin.cpp b/include/viswin.cpp index b594a895d..203c501c7 100755 --- a/include/viswin.cpp +++ b/include/viswin.cpp @@ -587,7 +587,7 @@ TPushbutton_control* TViswin::add_button ( // @comm Aggiunge i bottoni nella finestra { - TPushbutton_control* b = new TPushbutton_control(win(), id, -11, -1, 11, 2, "", + TPushbutton_control* b = new TPushbutton_control(win(), id, -11, -1, 12, 2, "", caption, bup, bdn); _button.add(b); return b; @@ -2499,7 +2499,7 @@ void TViswin::find_next() else { long l = search(_txt_to_find, x, _point.y+(_down_dir ? 1l : -1l), - _down_dir, _case_sensitive); + _down_dir, _case_sensitive, _regexp); if (l == -1) beep(); else @@ -2561,7 +2561,7 @@ TViswin::TViswin(const char *fname, TWait_cursor hourglass; if (title == NULL) - title = (fname ? fname : "Anteprima di stampa"); + title = fname ? fname : "Anteprima di stampa"; _last_found.y = -1; @@ -2585,18 +2585,23 @@ TViswin::TViswin(const char *fname, _rulers = cnf.get_bool("Righelli", NULL, -1,TRUE); PRINT_HEIGHT = cnf.get_int("FontSize", NULL, -1, PRINT_HEIGHT); - - long flags = WSF_HSCROLL | WSF_VSCROLL | WSF_SIZE; - create(x, y, width, height, title, flags, - W_DOC, parent, VISWIN_BAR); - if (width <= 0 && height <= 0) - maximize(); } + else + PRINT_HEIGHT = 10; + height = rows(); for (int i = 0; i < 4; i++) _modules.add(new TImage(BMP_MODULE1 + i), i); _modules.add(new TImage(BMP_MODULE), i); + + long flags = WSF_HSCROLL | WSF_VSCROLL; + if (_toplevel) + flags |= WSF_SIZE /* | WSF_CLOSE */; + + WIN_TYPE rt = _toplevel ? W_DOC : W_PLAIN; + create(x, y, maxlarg, maxalt, title, flags, rt, parent, + _toplevel ? VISWIN_BAR : 0); attach_interface(win(), BACKGROUND); diff --git a/m770/770100b.uml b/m770/770100b.uml index f1225b1fe..ea7256d03 100755 --- a/m770/770100b.uml +++ b/m770/770100b.uml @@ -72,18 +72,18 @@ BEGIN OUTPUT F_ARTBIL I3 OUTPUT F_QUOTAIMP R4 OUTPUT F_PERRIT R0 - OUTPUT F_FLAG_INPS B4 - OUTPUT F_PERC_INPS R1 - OUTPUT F_PERC_ASS_INPS R2 - OUTPUT F_PERC_COMMIT_INPS R3 - OUTPUT F_CASSA_PREV R5 - OUTPUT F_TABCAUSQUAC S6 - OUTPUT F_TABCAUSQUAD S2 - OUTPUT F_TABCAUSQUADB S7 - OUTPUT F_TABCAUSQUAD1 S3 - OUTPUT F_TABCAUSQUAE S8 - OUTPUT F_TABCAUSQUAE1 S9 - OUTPUT F_TABFLAGTS S4 + OUTPUT F_FLAG_INPS B4 + OUTPUT F_PERC_INPS R1 + OUTPUT F_PERC_ASS_INPS R2 + OUTPUT F_PERC_COMMIT_INPS R3 + OUTPUT F_CASSA_PREV R5 + OUTPUT F_TABCAUSQUAC S6 + OUTPUT F_TABCAUSQUAD S2 + OUTPUT F_TABCAUSQUADB S7 + OUTPUT F_TABCAUSQUAD1 S3 + OUTPUT F_TABCAUSQUAE S8 + OUTPUT F_TABCAUSQUAE1 S9 + OUTPUT F_TABFLAGTS S4 FLAGS "Z" WARNING "Manca la causale" ADD RUN 773mod -3 %CA7 @@ -161,18 +161,16 @@ BEGIN FIELD LF_SCPERC->NUMDOC END -NUMBER F_COMPENS 15 +CURRENCY F_COMPENS 15 BEGIN PROMPT 33 4 "Compenso " FIELD LF_SCPERC->COMPENSO - PICTURE "." - FLAGS "R" NUM_EXPR {(#THIS!=0) || (#F_SPESE!=0)} WARNING "Indicare il compenso e/o le spese" MESSAGE K_TAB, F_TOTDOC END -NUMBER F_IVA 15 +CURRENCY F_IVA 15 BEGIN PROMPT 59 4 "Iva " FIELD LF_SCPERC->IVA @@ -181,7 +179,7 @@ BEGIN MESSAGE K_TAB, F_TOTDOC END -NUMBER F_SPESE 15 +CURRENCY F_SPESE 15 BEGIN PROMPT 0 5 "Spese " FIELD LF_SCPERC->SPESE @@ -192,7 +190,7 @@ BEGIN MESSAGE K_TAB, F_TOTDOC END -NUMBER F_TOTDOC 15 +CURRENCY F_TOTDOC 15 BEGIN PROMPT 23 5 "Totale " FIELD LF_SCPERC->TOTALE @@ -458,7 +456,7 @@ BEGIN END // MAI VISUALIZZATO (ma da registrare) -NUMBER F_TOTRIT 15 +CURRENCY F_TOTRIT 15 BEGIN PROMPT 80 80 "" FIELD LF_SCPERC->TOTRIT @@ -466,7 +464,7 @@ BEGIN END // MAI VISUALIZZATO (ma da registrare) -NUMBER F_RITOPE 15 +CURRENCY F_RITOPE 15 BEGIN PROMPT 80 80 "" FIELD LF_SCPERC->RITOPE @@ -474,7 +472,7 @@ BEGIN END // MAI VISUALIZZATO (ma da registrare) -NUMBER F_RITVER 15 +CURRENCY F_RITVER 15 BEGIN PROMPT 80 80 "" FIELD LF_SCPERC->RITVER diff --git a/m770/770100c.uml b/m770/770100c.uml index c98834d93..400dd8242 100755 --- a/m770/770100c.uml +++ b/m770/770100c.uml @@ -15,53 +15,46 @@ END TEXT DLG_NULL BEGIN - PROMPT 2 3 "Compenso" -END + PROMPT 2 3 "Compenso" +END -NUMBER 102 15 +CURRENCY 102 15 BEGIN PROMPT 33 3 "" - PICTURE "." - FLAGS "R" FIELD LF_RPAG->COMPENSO END TEXT DLG_NULL BEGIN - PROMPT 2 4 "Spese" -END + PROMPT 2 4 "Spese" +END -NUMBER 103 15 +CURRENCY 103 15 BEGIN PROMPT 33 4 "" - PICTURE "." - FLAGS "R" FIELD LF_RPAG->SPESA END TEXT DLG_NULL BEGIN - PROMPT 2 5 "Imponibile" -END + PROMPT 2 5 "Imponibile" +END -NUMBER 104 15 +CURRENCY 104 15 BEGIN PROMPT 33 5 "" - PICTURE "." - FLAGS "R" FIELD LF_RPAG->IMPONIBILE END TEXT DLG_NULL BEGIN - PROMPT 2 6 "% Ritenuta " -END + PROMPT 2 6 "% Ritenuta " +END NUMBER 105 6 BEGIN PROMPT 33 6 "" PICTURE ".2" - FLAGS "R" NUM_EXPR {(#THIS>=0) && (#THIS<=100)} WARNING "L'aliquota deve essere compresa tra 0 e 100" FIELD LF_RPAG->PERC @@ -69,52 +62,46 @@ END TEXT DLG_NULL BEGIN - PROMPT 2 7 "Ritenuta lorda" -END + PROMPT 2 7 "Ritenuta lorda" +END -NUMBER 106 15 +CURRENCY 106 15 BEGIN PROMPT 33 7 "" - PICTURE "." - FLAGS "RD" + FLAGS "D" FIELD LF_RPAG->RITLORDA END TEXT DLG_NULL BEGIN - PROMPT 2 8 "Contributi obbligatori" -END + PROMPT 2 8 "Contributi obbligatori" +END -NUMBER 107 15 +CURRENCY 107 15 BEGIN PROMPT 33 8 "" - PICTURE "." - FLAGS "R" FIELD LF_RPAG->CONTROBB END TEXT DLG_NULL BEGIN - PROMPT 2 9 "Detrazioni carichi famigliari" -END + PROMPT 2 9 "Detrazioni carichi famigliari" +END -NUMBER 108 15 +CURRENCY 108 15 BEGIN PROMPT 33 9 "" - PICTURE "." - FLAGS "R" FIELD LF_RPAG->DETFAMIL END TEXT DLG_NULL BEGIN - PROMPT 2 10 "N°giorni lavoro dipendente" -END + PROMPT 2 10 "N°giorni lavoro dipendente" +END NUMBER 109 3 BEGIN PROMPT 33 10 "" - FLAGS "R" FIELD LF_RPAG->GIOLAVDIP NUM_EXPR {(#THIS>=0) && (#THIS<=366)} WARNING "Non ci sono tutti questi giorni in un'anno" @@ -122,96 +109,85 @@ END TEXT DLG_NULL BEGIN - PROMPT 2 11 "Detrazioni lavoro dipendente" -END + PROMPT 2 11 "Detrazioni lavoro dipendente" +END -NUMBER 110 15 +CURRENCY 110 15 BEGIN PROMPT 33 11 "" - PICTURE "." - FLAGS "R" FIELD LF_RPAG->DETLAVDIP END TEXT DLG_NULL BEGIN - PROMPT 2 12 "Totale detrazioni" -END + PROMPT 2 12 "Totale detrazioni" +END -NUMBER 111 15 +CURRENCY 111 15 BEGIN PROMPT 33 12 "" - PICTURE "." - FLAGS "RD" + FLAGS "D" FIELD LF_RPAG->TOTDET END TEXT DLG_NULL BEGIN - PROMPT 2 13 "Ritenute operate" -END + PROMPT 2 13 "Ritenute operate" +END -NUMBER 112 15 +CURRENCY 112 15 BEGIN PROMPT 33 13 "" - PICTURE "." - FLAGS "R" FIELD LF_RPAG->RITENUTA END TEXT DLG_NULL BEGIN - PROMPT 2 14 "Compenso netto" -END + PROMPT 2 14 "Compenso netto" +END -NUMBER 113 15 +CURRENCY 113 15 BEGIN PROMPT 33 14 "" - PICTURE "." - FLAGS "RD" + FLAGS "D" FIELD LF_RPAG->NETTO END // -------------------------------------------------- // Inizio campi gestiti a programma ma non a maschera // -------------------------------------------------- -NUMBER 114 15 +CURRENCY 114 15 BEGIN PROMPT 80 80 "" - PICTURE "." - FLAGS "RD" + FLAGS "D" FIELD LF_RPAG->SOMNSRIT END -NUMBER 115 15 +CURRENCY 115 15 BEGIN PROMPT 80 80 "" - PICTURE "." - FLAGS "RD" + FLAGS "D" FIELD LF_RPAG->AMMLORDO END -NUMBER 116 15 +CURRENCY 116 15 BEGIN PROMPT 80 80 "" - PICTURE "." - FLAGS "RD" + FLAGS "D" FIELD LF_RPAG->QUOTAPROV END -NUMBER 117 15 +CURRENCY 117 15 BEGIN PROMPT 80 80 "" - PICTURE "." - FLAGS "RD" + FLAGS "D" FIELD LF_RPAG->IMPNETTO END -NUMBER 118 15 +CURRENCY 118 15 BEGIN PROMPT 80 80 "" - PICTURE "." - FLAGS "RD" + FLAGS "D" FIELD LF_RPAG->COMNETTO END diff --git a/m770/770100d.uml b/m770/770100d.uml index 92867cf7a..e0ffc425c 100755 --- a/m770/770100d.uml +++ b/m770/770100d.uml @@ -136,11 +136,9 @@ BEGIN GROUP 2 6 END -NUMBER 108 15 +CURRENCY 108 15 BEGIN PROMPT 2 7 "Importo versato " - PICTURE "." - FLAGS "R" FIELD LF_RVER->RITENUTA VALIDATE REQIF_FUNC 1 102 WARNING "Inserire la ritenuta" diff --git a/m770/770100e.uml b/m770/770100e.uml index 8d344071d..0d00ff8db 100755 --- a/m770/770100e.uml +++ b/m770/770100e.uml @@ -15,47 +15,41 @@ END TEXT DLG_NULL BEGIN - PROMPT 2 3 "Compenso" -END + PROMPT 2 3 "Compenso" +END -NUMBER 102 15 +CURRENCY 102 15 BEGIN PROMPT 33 3 "" - PICTURE "." - FLAGS "R" FIELD LF_RPAG->COMPENSO END TEXT DLG_NULL BEGIN - PROMPT 2 4 "CPA" -END + PROMPT 2 4 "CPA" +END -NUMBER 103 15 +CURRENCY 103 15 BEGIN PROMPT 33 4 "" - PICTURE "." - FLAGS "R" FIELD LF_RPAG->IMPCPA END TEXT DLG_NULL BEGIN - PROMPT 2 5 "Imponibile" -END + PROMPT 2 5 "Imponibile" +END -NUMBER 104 15 +CURRENCY 104 15 BEGIN PROMPT 33 5 "" - PICTURE "." - FLAGS "R" FIELD LF_RPAG->IMPONIBILE END TEXT DLG_NULL BEGIN - PROMPT 2 6 "% Ritenuta " -END + PROMPT 2 6 "% Ritenuta " +END NUMBER 105 6 BEGIN @@ -69,103 +63,91 @@ END TEXT DLG_NULL BEGIN - PROMPT 2 7 "Ritenuta" -END + PROMPT 2 7 "Ritenuta" +END -NUMBER 106 15 +CURRENCY 106 15 BEGIN PROMPT 33 7 "" - PICTURE "." - FLAGS "R" FIELD LF_RPAG->RITENUTA END TEXT DLG_NULL BEGIN - PROMPT 2 8 "Spese" -END + PROMPT 2 8 "Spese" +END -NUMBER 107 15 +CURRENCY 107 15 BEGIN PROMPT 33 8 "" - PICTURE "." - FLAGS "R" FIELD LF_RPAG->SPESA END TEXT DLG_NULL BEGIN - PROMPT 2 9 "Somme regime convenzionale" -END + PROMPT 2 9 "Somme regime convenzionale" +END -NUMBER 108 15 +CURRENCY 108 15 BEGIN PROMPT 33 9 "" - PICTURE "." - FLAGS "R" FIELD LF_RPAG->SOMREGCONV END TEXT DLG_NULL BEGIN - PROMPT 2 10 "Compenso netto" -END + PROMPT 2 10 "Compenso netto" +END -NUMBER 109 15 +CURRENCY 109 15 BEGIN PROMPT 33 10 "" - PICTURE "." - FLAGS "RD" + FLAGS "D" FIELD LF_RPAG->NETTO END // -------------------------------------------------- // Inizio campi gestiti a programma ma non a maschera // -------------------------------------------------- -NUMBER 110 15 +CURRENCY 110 15 BEGIN PROMPT 80 80 "" - PICTURE "." - FLAGS "RD" + FLAGS "D" FIELD LF_RPAG->SOMNSRIT END -NUMBER 111 15 +CURRENCY 111 15 BEGIN PROMPT 80 80 "" - PICTURE "." - FLAGS "RD" + FLAGS "D" FIELD LF_RPAG->AMMLORDO END -NUMBER 112 15 +CURRENCY 112 15 BEGIN PROMPT 80 80 "" - PICTURE "." - FLAGS "RD" + FLAGS "D" FIELD LF_RPAG->QUOTAPROV END -NUMBER 113 15 +CURRENCY 113 15 BEGIN PROMPT 80 80 "" - PICTURE "." - FLAGS "RD" + FLAGS "D" FIELD LF_RPAG->IMPNETTO END -NUMBER 114 15 +CURRENCY 114 15 BEGIN PROMPT 80 80 "" - PICTURE "." - FLAGS "RD" + FLAGS "D" FIELD LF_RPAG->COMNETTO END NUMBER 115 5 BEGIN PROMPT 80 80 "" - FLAGS "RD" + FLAGS "D" FIELD LF_RPAG->NUMVERS END // ------------------------------------------------ diff --git a/m770/770100f.uml b/m770/770100f.uml index 681b37008..b6b0f545d 100755 --- a/m770/770100f.uml +++ b/m770/770100f.uml @@ -15,53 +15,46 @@ END TEXT DLG_NULL BEGIN - PROMPT 2 3 "Compenso" -END + PROMPT 2 3 "Compenso" +END -NUMBER 102 15 +CURRENCY 102 15 BEGIN PROMPT 33 3 "" - PICTURE "." - FLAGS "R" FIELD LF_RPAG->COMPENSO END TEXT DLG_NULL BEGIN - PROMPT 2 4 "Spese" -END + PROMPT 2 4 "Spese" +END -NUMBER 103 15 +CURRENCY 103 15 BEGIN PROMPT 33 4 "" - PICTURE "." - FLAGS "R" FIELD LF_RPAG->SPESA END TEXT DLG_NULL BEGIN - PROMPT 2 5 "Imponibile" -END + PROMPT 2 5 "Imponibile" +END -NUMBER 104 15 +CURRENCY 104 15 BEGIN PROMPT 33 5 "" - PICTURE "." - FLAGS "R" FIELD LF_RPAG->IMPONIBILE END TEXT DLG_NULL BEGIN - PROMPT 2 6 "% Ritenuta " -END + PROMPT 2 6 "% Ritenuta " +END NUMBER 105 6 BEGIN PROMPT 33 6 "" PICTURE ".2" - FLAGS "R" NUM_EXPR {(#THIS>=0) && (#THIS<=100)} WARNING "L'aliquota deve essere compresa tra 0 e 100" FIELD LF_RPAG->PERC @@ -69,34 +62,30 @@ END TEXT DLG_NULL BEGIN - PROMPT 2 7 "Ritenuta" -END + PROMPT 2 7 "Ritenuta" +END -NUMBER 106 15 +CURRENCY 106 15 BEGIN PROMPT 33 7 "" - PICTURE "." - FLAGS "R" FIELD LF_RPAG->RITENUTA END TEXT DLG_NULL BEGIN - PROMPT 2 8 "Somme regime convenzionale" -END + PROMPT 2 8 "Somme regime convenzionale" +END -NUMBER 107 15 +CURRENCY 107 15 BEGIN PROMPT 33 8 "" - PICTURE "." - FLAGS "R" FIELD LF_RPAG->SOMREGCONV END TEXT DLG_NULL BEGIN - PROMPT 2 9 "% Imponibile contr.10%" -END + PROMPT 2 9 "% Imponibile contr.10%" +END NUMBER 108 6 BEGIN @@ -110,34 +99,30 @@ END TEXT DLG_NULL BEGIN - PROMPT 2 10 "Contr.10% percipiente" -END + PROMPT 2 10 "Contr.10% percipiente" +END -NUMBER 109 15 +CURRENCY 109 15 BEGIN PROMPT 33 10 "" - PICTURE "." - FLAGS "R" FIELD LF_RPAG->CTSSNPERC END TEXT DLG_NULL BEGIN - PROMPT 2 11 "Contr.10% complessivo" -END + PROMPT 2 11 "Contr.10% complessivo" +END -NUMBER 110 15 +CURRENCY 110 15 BEGIN PROMPT 33 11 "" - PICTURE "." - FLAGS "R" FIELD LF_RPAG->CTSSNCOMP END TEXT DLG_NULL BEGIN - PROMPT 2 12 "Codice contr.10%" -END + PROMPT 2 12 "Codice contr.10%" +END STRING 111 1 BEGIN @@ -157,64 +142,58 @@ END TEXT DLG_NULL BEGIN - PROMPT 2 13 "Compenso netto" -END + PROMPT 2 13 "Compenso netto" +END -NUMBER 112 15 +CURRENCY 112 15 BEGIN PROMPT 33 13 "" - PICTURE "." - FLAGS "RD" + FLAGS "D" FIELD LF_RPAG->NETTO END // -------------------------------------------------- // Inizio campi gestiti a programma ma non a maschera // -------------------------------------------------- -NUMBER 113 15 +CURRENCY 113 15 BEGIN PROMPT 80 80 "" - PICTURE "." - FLAGS "RD" + FLAGS "D" FIELD LF_RPAG->SOMNSRIT END -NUMBER 114 15 +CURRENCY 114 15 BEGIN PROMPT 80 80 "" - PICTURE "." - FLAGS "RD" + FLAGS "D" FIELD LF_RPAG->AMMLORDO END -NUMBER 115 15 +CURRENCY 115 15 BEGIN PROMPT 80 80 "" - PICTURE "." - FLAGS "RD" + FLAGS "D" FIELD LF_RPAG->QUOTAPROV END -NUMBER 116 15 +CURRENCY 116 15 BEGIN PROMPT 80 80 "" - PICTURE "." - FLAGS "RD" + FLAGS "D" FIELD LF_RPAG->IMPNETTO END -NUMBER 117 15 +CURRENCY 117 15 BEGIN PROMPT 80 80 "" - PICTURE "." - FLAGS "RD" + FLAGS "D" FIELD LF_RPAG->COMNETTO END NUMBER 118 5 BEGIN PROMPT 80 80 "" - FLAGS "RD" + FLAGS "D" FIELD LF_RPAG->NUMVERS END // ------------------------------------------------ diff --git a/m770/770100g.uml b/m770/770100g.uml index e6bb800bb..a84c13c89 100755 --- a/m770/770100g.uml +++ b/m770/770100g.uml @@ -15,34 +15,30 @@ END TEXT DLG_NULL BEGIN - PROMPT 2 3 "Compenso" -END + PROMPT 2 3 "Compenso" +END -NUMBER 102 15 +CURRENCY 102 15 BEGIN PROMPT 33 3 "" - PICTURE "." - FLAGS "R" FIELD LF_RPAG->COMPENSO END TEXT DLG_NULL BEGIN - PROMPT 2 4 "Imponibile" -END + PROMPT 2 4 "Imponibile" +END -NUMBER 103 15 +CURRENCY 103 15 BEGIN PROMPT 33 4 "" - PICTURE "." - FLAGS "R" FIELD LF_RPAG->IMPONIBILE END TEXT DLG_NULL BEGIN - PROMPT 2 5 "% Ritenuta " -END + PROMPT 2 5 "% Ritenuta " +END NUMBER 104 6 BEGIN @@ -56,79 +52,70 @@ END TEXT DLG_NULL BEGIN - PROMPT 2 6 "Ritenuta totale" -END + PROMPT 2 6 "Ritenuta totale" +END -NUMBER 105 15 +CURRENCY 105 15 BEGIN PROMPT 33 6 "" - PICTURE "." - FLAGS "R" FIELD LF_RPAG->RITENUTA END TEXT DLG_NULL BEGIN - PROMPT 2 7 "Utili pagati" -END + PROMPT 2 7 "Utili pagati" +END -NUMBER 106 15 +CURRENCY 106 15 BEGIN PROMPT 33 7 "" - PICTURE "." - FLAGS "R" FIELD LF_RPAG->UTPAGATI END TEXT DLG_NULL BEGIN - PROMPT 2 8 "Ritenute utili pagati" -END + PROMPT 2 8 "Ritenute utili pagati" +END -NUMBER 107 15 +CURRENCY 107 15 BEGIN PROMPT 33 8 "" - PICTURE "." - FLAGS "R" FIELD LF_RPAG->RITUTPAG END TEXT DLG_NULL BEGIN - PROMPT 2 9 "Utili spettanti" -END + PROMPT 2 9 "Utili spettanti" +END -NUMBER 108 15 +CURRENCY 108 15 BEGIN PROMPT 33 9 "" - PICTURE "." - FLAGS "RD" + FLAGS "D" FIELD LF_RPAG->UTSPETT END TEXT DLG_NULL BEGIN - PROMPT 2 10 "Ritenute utili spettanti" -END + PROMPT 2 10 "Ritenute utili spettanti" +END -NUMBER 109 15 +CURRENCY 109 15 BEGIN PROMPT 33 10 "" - PICTURE "." - FLAGS "RD" + FLAGS "D" FIELD LF_RPAG->RITUTSPE END TEXT DLG_NULL BEGIN - PROMPT 2 11 "Numero quote" -END + PROMPT 2 11 "Numero quote" +END NUMBER 110 6 BEGIN PROMPT 33 11 "" PICTURE ".2" - FLAGS "R" NUM_EXPR {(#THIS>=0) && (#THIS<=100)} WARNING "L'aliquota deve essere compresa tra 0 e 100" FIELD LF_RPAG->NQUOTE @@ -136,57 +123,51 @@ END TEXT DLG_NULL BEGIN - PROMPT 2 12 "Totale" -END + PROMPT 2 12 "Totale" +END -NUMBER 111 15 +CURRENCY 111 15 BEGIN PROMPT 33 12 "" - PICTURE "." - FLAGS "RD" + FLAGS "D" FIELD LF_RPAG->NETTO END // -------------------------------------------------- // Inizio campi gestiti a programma ma non a maschera // -------------------------------------------------- -NUMBER 112 15 +CURRENCY 112 15 BEGIN PROMPT 80 80 "" - PICTURE "." - FLAGS "RD" + FLAGS "D" FIELD LF_RPAG->SOMNSRIT END -NUMBER 113 15 +CURRENCY 113 15 BEGIN PROMPT 80 80 "" - PICTURE "." - FLAGS "RD" + FLAGS "D" FIELD LF_RPAG->AMMLORDO END -NUMBER 114 15 +CURRENCY 114 15 BEGIN PROMPT 80 80 "" - PICTURE "." - FLAGS "RD" + FLAGS "D" FIELD LF_RPAG->QUOTAPROV END -NUMBER 115 15 +CURRENCY 115 15 BEGIN PROMPT 80 80 "" - PICTURE "." - FLAGS "RD" + FLAGS "D" FIELD LF_RPAG->IMPNETTO END -NUMBER 116 15 +CURRENCY 116 15 BEGIN PROMPT 80 80 "" - PICTURE "." - FLAGS "RD" + FLAGS "D" FIELD LF_RPAG->COMNETTO END diff --git a/m770/771.cpp b/m770/771.cpp index 35a4acf8c..3c48fa86a 100755 --- a/m770/771.cpp +++ b/m770/771.cpp @@ -1,13 +1,10 @@ #include -#include #include "771.h" -#define usage "Error - usage : %s -{0|1|2|3|4|5|6}" - int main(int argc,char** argv) { - int n = (argc > 1) ? atoi(argv[1]+1) : -1; + int n = (argc > 1) ? atoi(argv[1]+1) : 0; switch (n) { @@ -17,11 +14,11 @@ int main(int argc,char** argv) break; // Quadro H case 1: - m71290(argc,argv); +// m71290(argc,argv); break; // Quadro I e Prospetto dati generali case 2: - m71300(argc,argv); +// m71300(argc,argv); break; // Quadro L case 3: @@ -29,7 +26,7 @@ int main(int argc,char** argv) break; // Dettaglio H case 4: - m71295(argc,argv); +// m71295(argc,argv); break; ////////////////////////////////////// // 1: Quadro D1 @@ -50,14 +47,15 @@ int main(int argc,char** argv) // 5 = G-1 ////////////////////////////////////// case 6: - quadroF (argc,argv); +// quadroF (argc,argv); break; // Quadro A case 7: - quadriA_A3(argc,argv); +// quadriA_A3(argc,argv); break; default: - error_box(usage, argv[0]) ; - } + break; + } + exit(0); return 0; } diff --git a/m770/771100.cpp b/m770/771100.cpp index 9506366f4..564c33493 100755 --- a/m770/771100.cpp +++ b/m770/771100.cpp @@ -9,16 +9,15 @@ // // Lista modifiche: // -// 1.4.96 Rappresentante: codice e carica rappr. non vengono piu' registrati +// 1.4.96 Rappresentante: codice e carica rappr. non vengono piu' registrati // su NDITTE ma bensi' su BASE // -#include +#include #include #include #include #include -#include -#include +#include #include #include #include "771.h" @@ -31,7 +30,7 @@ #include "77lib.h" #include "../ba/ba4500.h" -class TDati_anagrafici : public TApplication +class TDati_anagrafici : public TSkeleton_application { private: static bool indirizzo (TMask_field&, KEY); @@ -49,7 +48,7 @@ class TDati_anagrafici : public TApplication TMask* _msk; TRelation* _rel; char _ana; - long _codditta; + long _codditta; bool Dichiarante() const { return _ana == 'A'; } bool Rappresentante() const { return _ana == 'C'; } bool ScrittureContabili() const { return _ana == 'D'; } @@ -60,8 +59,7 @@ class TDati_anagrafici : public TApplication TString _titolo; virtual bool create(); virtual bool destroy(); - virtual bool menu(MENU_TAG m); - bool main_loop(); + virtual void main_loop(); KEY registra(TMask& m, bool check_dirty); void registra_fis_giu(); void registra_rappr(); @@ -130,7 +128,7 @@ bool TDati_anagrafici::attivita_handler(TMask_field& m, KEY k) body << m.mask().get(F_ATTIV); TMessage msg(appname, MSG_LN, (const char*) body); - msg.send(); + msg.send(); TExternal_app a(appname); a.run(); @@ -152,16 +150,16 @@ bool TDati_anagrafici::DCditta_handler(TMask_field& f, KEY k) m.stop_run(K_ESC); const long lDittaCaaf = m.get_long(F_DITTACAAF); TToken_string body(16); - body.add("1"); // usa la chiave 1 - body.add(lDittaCaaf); // ditta per il campo codice ditta - body.add(lDittaCaaf); // ditta per il secondo campo codice ditta - TString16 cmd("ba4 -2"); - TMessage msg(cmd, MSG_LN, (const char*) body); - msg.send(); - TExternal_app a(cmd); - a.run(); - m.set_focus(); - xvt_statbar_set(""); + body.add("1"); // usa la chiave 1 + body.add(lDittaCaaf); // ditta per il campo codice ditta + body.add(lDittaCaaf); // ditta per il secondo campo codice ditta + TString16 cmd("ba4 -2"); + TMessage msg(cmd, MSG_LN, (const char*) body); + msg.send(); + TExternal_app a(cmd); + a.run(); + m.set_focus(); + xvt_statbar_set(""); } return TRUE; } @@ -383,10 +381,10 @@ bool TDati_anagrafici::cod_conc (TMask_field& f, KEY k) codanagr = f.mask().get_long(F_ANAGR); // Setta il prompt del button di uscita sull'anagrafica del dichiarante -// if (tipoa == 'G') -// f.mask().field(F_ANAGR_DICH).set_prompt("Giuridiche"); -// if (tipoa == 'F') -// f.mask().field(F_ANAGR_DICH).set_prompt("Fisiche"); +// if (tipoa == 'G') +// f.mask().field(F_ANAGR_DICH).set_prompt("Giuridiche"); +// if (tipoa == 'F') +// f.mask().field(F_ANAGR_DICH).set_prompt("Fisiche"); // Ricerca sull'archivio anagrafiche dei dati anag.setkey(1); @@ -482,7 +480,8 @@ bool TDati_anagrafici::ditta_caaf(TMask_field& f, KEY k) bool TDati_anagrafici::create() { - TApplication::create(); + _msk = NULL; + _rel = new TRelation (LF_NDITTE); _rel->add(LF_BASE, "CODDITTA=CODDITTA"); _rel->add(LF_BASEBIS, "CODDITTA=CODDITTA"); @@ -521,8 +520,8 @@ bool TDati_anagrafici::create() if (ScrittureContabili()) { _msk = new TMask ("771100d"); - _msk->set_handler(F_ANAGR, indirizzo); - _msk->set_handler(F_ATTIVITA, attivita_handler); + _msk->set_handler(F_ANAGR, indirizzo); + _msk->set_handler(F_ATTIVITA, attivita_handler); _msk->set_handler(F_FISICA, anagrafica_handler); _msk->set_handler(F_GIURIDICA,anagrafica_handler); _msk->disable(DLG_SAVEREC); @@ -553,14 +552,16 @@ bool TDati_anagrafici::create() _msk->set_handler(F_BTN_FISICA, anagr_dich_handler); } - _msk->set_mode(MODE_MOD); - TString16 codditta; codditta << _codditta; - if (codditta != "0") - _msk->set(F_CODDITTA,codditta); - - dispatch_e_menu (BAR_ITEM(1)); - - return TRUE; + if (_msk) + { + _msk->set_mode(MODE_MOD); + TString16 codditta; codditta << _codditta; + if (codditta != "0") + _msk->set(F_CODDITTA,codditta); + + return TSkeleton_application::create(); + } + return FALSE; } bool TDati_anagrafici::destroy() @@ -570,7 +571,7 @@ bool TDati_anagrafici::destroy() return TApplication::destroy(); } -bool TDati_anagrafici::main_loop() +void TDati_anagrafici::main_loop() { KEY tasto = K_ESC; _msk->open_modal(); @@ -583,7 +584,7 @@ bool TDati_anagrafici::main_loop() // controllo se indicato rappresentante if (Rappresentante() && (_msk->get_long(F_ANAGR) == 0L)) - message_box("Il rappresentante non e' stato indicato."); + message_box("Il rappresentante non e' stato indicato."); tasto = _msk->run(); @@ -592,8 +593,8 @@ bool TDati_anagrafici::main_loop() case K_ESC : break; case K_QUIT : - if (registra(*_msk,TRUE) == K_ESC) - tasto = K_ESC; + if (registra(*_msk,TRUE) == K_ESC) + tasto = K_ESC; break; case K_SAVE : registra(*_msk,FALSE); @@ -604,35 +605,34 @@ bool TDati_anagrafici::main_loop() } _msk->close_modal(); - return FALSE; } KEY TDati_anagrafici::registra(TMask& m, bool check_dirty) { - KEY k = K_YES; - - if (check_dirty && m.dirty()) - k = yesnocancel_box("Registrare le modifiche?"); + KEY k = K_YES; + + if (check_dirty && m.dirty()) + k = yesnocancel_box("Registrare le modifiche?"); if (k == K_YES) { - if (_ana == 'A' || _ana == 'B') - registra_fis_giu(); + if (_ana == 'A' || _ana == 'B') + registra_fis_giu(); - if (_ana == 'C') - registra_rappr(); + if (_ana == 'C') + registra_rappr(); - if (_ana == 'E') - registra_caaf(); + if (_ana == 'E') + registra_caaf(); - if (_ana == 'F') - registra_dirprof(); + if (_ana == 'F') + registra_dirprof(); - if (_ana == 'G') - registra_dativari(); - } - - return k; + if (_ana == 'G') + registra_dativari(); + } + + return k; } void TDati_anagrafici::registra_fis_giu() @@ -799,13 +799,6 @@ void TDati_anagrafici::registra_dativari() } } -bool TDati_anagrafici::menu(MENU_TAG m) -{ - if (m == BAR_ITEM(1)) - return main_loop(); - return FALSE; -} - int m71100 (int argc, char* argv[]) { TDati_anagrafici main_app(*argv[2]); diff --git a/m770/771230c.uml b/m770/771230c.uml index 756b00acb..d522184ef 100755 --- a/m770/771230c.uml +++ b/m770/771230c.uml @@ -1,4 +1,5 @@ #include "771230.h" + TOOLBAR "" 0 19 0 3 #include @@ -188,50 +189,44 @@ BEGIN FIELD TASSAZIONE END -NUMBER 105 15 +CURRENCY 105 15 BEGIN PROMPT 1 3 "Ammontare lordo " - PICTURE "." FIELD AMMLORDO END -NUMBER 106 15 +CURRENCY 106 15 BEGIN PROMPT 1 4 "Contributi obbligatori " - PICTURE "." FIELD CONTROBB NUM_EXPR {#106+#107<=#105} WARNING "I contributi e le somme non soggette superano il lordo" END -NUMBER 107 15 +CURRENCY 107 15 BEGIN PROMPT 1 5 "Somme non soggette a ritenuta " - PICTURE "." FIELD SOMNONSOGG NUM_EXPR {#106+#107<=#105} WARNING "I contributi e le somme non soggette superano il lordo" END -NUMBER 108 15 +CURRENCY 108 15 BEGIN PROMPT 1 6 "Imponibile " - PICTURE "." FIELD IMPONIBILE END -NUMBER 109 15 +CURRENCY 109 15 BEGIN PROMPT 1 7 "Imposta " - PICTURE "." FIELD IMPOSTA MESSAGE CHECK,113 END -NUMBER 110 15 +CURRENCY 110 15 BEGIN PROMPT 1 8 "Detrazioni per carichi di famiglia " - PICTURE "." FIELD DETCARFAM MESSAGE CHECK,113 END @@ -244,27 +239,24 @@ BEGIN FIELD GGLAVDIP END -NUMBER 112 15 +CURRENCY 112 15 BEGIN PROMPT 1 10 "Detrazioni da lavoro dipendente " - PICTURE "." FIELD DETLAVDIP MESSAGE CHECK,113 END -NUMBER 113 15 +CURRENCY 113 15 BEGIN PROMPT 1 11 "Totale detrazioni " FLAGS "D" - PICTURE "." NUM_CALC MIN(#109,#110+#112) FIELD TOTDET END -NUMBER 114 15 +CURRENCY 114 15 BEGIN PROMPT 1 12 "Ritenute operate " - PICTURE "." FIELD RITENUTE END diff --git a/m770/771230d.uml b/m770/771230d.uml index fdedbfd43..06ec2ce63 100755 --- a/m770/771230d.uml +++ b/m770/771230d.uml @@ -168,42 +168,37 @@ BEGIN FIELD CAUSALE END -NUMBER 104 15 +CURRENCY 104 15 BEGIN PROMPT 1 3 "Ammontare lordo " - PICTURE "." FIELD TOTALE END -NUMBER 105 15 +CURRENCY 105 15 BEGIN PROMPT 1 4 "Somme non soggette a ritenuta " - PICTURE "." FIELD SOMME NUM_EXPR {(#105+#106)<=#104} WARNING "Le somme non soggette a ritenuta superano il lordo" END -NUMBER 106 15 +CURRENCY 106 15 BEGIN PROMPT 1 5 "Somme non sogg. a rit. per reg. conv. " - PICTURE "." FIELD SOMREGCONV NUM_EXPR {(#105+#106)<=#104} WARNING "Le somme non soggette a ritenuta superano il lordo" END -NUMBER 107 15 +CURRENCY 107 15 BEGIN PROMPT 1 6 "Imponibile " - PICTURE "." FIELD IMPONIBILE END -NUMBER 108 15 +CURRENCY 108 15 BEGIN PROMPT 1 7 "Ritenute operate " - PICTURE "." FIELD IMPORTO END @@ -214,7 +209,6 @@ BEGIN FIELD GENERATA END - BUTTON DLG_OK 10 2 BEGIN PROMPT -13 -1 "~Conferma" diff --git a/m770/771230d1.uml b/m770/771230d1.uml index 7a1b8825d..3cb22f7dc 100755 --- a/m770/771230d1.uml +++ b/m770/771230d1.uml @@ -160,38 +160,33 @@ BEGIN FIELD CAUSALE END -NUMBER 104 15 +CURRENCY 104 15 BEGIN PROMPT 1 3 "Ammontare lordo corrisposto " - PICTURE "." FIELD TOTALE END -NUMBER 105 15 +CURRENCY 105 15 BEGIN PROMPT 1 4 "Spese anticipate " - PICTURE "." FIELD SPESEANT END -NUMBER 106 15 +CURRENCY 106 15 BEGIN PROMPT 1 5 "Quota provvigioni " - PICTURE "." FIELD QUOTAPRO END -NUMBER 107 15 +CURRENCY 107 15 BEGIN PROMPT 1 6 "Imponibile " - PICTURE "." FIELD IMPONIBILE END -NUMBER 108 15 +CURRENCY 108 15 BEGIN PROMPT 1 7 "Ritenute operate " - PICTURE "." FIELD IMPORTO END diff --git a/m770/771230db.uml b/m770/771230db.uml index ab38defbf..df64f7fa8 100755 --- a/m770/771230db.uml +++ b/m770/771230db.uml @@ -164,42 +164,37 @@ BEGIN FIELD CAUSALE END -NUMBER 104 15 +CURRENCY 104 15 BEGIN PROMPT 1 3 "Ammontare lordo " - PICTURE "." FIELD TOTALE END -NUMBER 105 15 +CURRENCY 105 15 BEGIN PROMPT 1 4 "Somme non soggette a ritenuta " - PICTURE "." FIELD SOMME NUM_EXPR {(#105+#106)<=#104} WARNING "Le somme non soggette a ritenuta superano il lordo" END -NUMBER 106 15 +CURRENCY 106 15 BEGIN PROMPT 1 5 "Somme non sogg. a rit. per reg. conv. " - PICTURE "." FIELD SOMREGCONV NUM_EXPR {(#105+#106)<=#104} WARNING "Le somme non soggette a ritenuta superano il lordo" END -NUMBER 107 15 +CURRENCY 107 15 BEGIN PROMPT 1 6 "Imponibile " - PICTURE "." FIELD IMPONIBILE END -NUMBER 108 15 +CURRENCY 108 15 BEGIN PROMPT 1 7 "Ritenute operate " - PICTURE "." FIELD IMPORTO END @@ -219,7 +214,6 @@ BEGIN FIELD GENERATA END - BUTTON DLG_OK 10 2 BEGIN PROMPT -13 -1 "~Conferma" diff --git a/m770/771230e.uml b/m770/771230e.uml index 5a4e4f319..966b6e12a 100755 --- a/m770/771230e.uml +++ b/m770/771230e.uml @@ -151,10 +151,9 @@ BEGIN FIELD CAUSALE END -NUMBER 103 15 +CURRENCY 103 15 BEGIN PROMPT 1 4 "Imponibile corrisposto " - PICTURE "." FIELD IMPONIBILE END @@ -166,24 +165,21 @@ BEGIN FIELD PERC END -NUMBER 105 15 +CURRENCY 105 15 BEGIN PROMPT 1 5 "Ritenute operate " - PICTURE "." FIELD IMPORTO END -NUMBER 106 15 +CURRENCY 106 15 BEGIN PROMPT 1 6 "Somme corrisposte al netto delle ritenute " - PICTURE "." FIELD NETTO END -NUMBER 107 15 +CURRENCY 107 15 BEGIN PROMPT 1 7 "Somme non soggette a ritenuta " - PICTURE "." FIELD SOMME END diff --git a/m770/771230e1.uml b/m770/771230e1.uml index 7995b601b..29e74abd4 100755 --- a/m770/771230e1.uml +++ b/m770/771230e1.uml @@ -166,10 +166,9 @@ BEGIN FIELD CAUSALE END -NUMBER 104 15 +CURRENCY 104 15 BEGIN PROMPT 1 3 "12. Somme corrisposte " - PICTURE "." FIELD SOMME MESSAGE CHECK,108 END @@ -179,10 +178,9 @@ BEGIN PROMPT 1 4 "13. Ammontare complessivo dei premi riscossi sui quali" END -NUMBER 105 15 +CURRENCY 105 15 BEGIN PROMPT 1 5 " le ritenute sono state commisurate " - PICTURE "." FIELD AMMONTARE END @@ -194,17 +192,15 @@ BEGIN FIELD PERC END -NUMBER 107 15 +CURRENCY 107 15 BEGIN PROMPT 1 7 "15. Ritenute operate " - PICTURE "." FIELD IMPORTO END -NUMBER 108 15 +CURRENCY 108 15 BEGIN PROMPT 1 8 "16. Netto corrisposto (12 - 15) " - PICTURE "." FIELD NETTO END diff --git a/m770/771230pr.uml b/m770/771230pr.uml index 9f79961fd..9a46f165d 100755 --- a/m770/771230pr.uml +++ b/m770/771230pr.uml @@ -38,22 +38,19 @@ BEGIN FLAGS "D" END -NUMBER 102 15 +CURRENCY 102 15 BEGIN PROMPT 1 2 "Ammontare complessivo " - PICTURE "." END -NUMBER 103 15 +CURRENCY 103 15 BEGIN PROMPT 1 3 "Ammontare somme soggette a ritenuta " - PICTURE "." END -NUMBER 104 15 +CURRENCY 104 15 BEGIN PROMPT 1 4 "Ritenute operate " - PICTURE "." END BUTTON DLG_OK 10 2 diff --git a/m770/771231.cpp b/m770/771231.cpp index aa9384cdd..947627ff3 100755 --- a/m770/771231.cpp +++ b/m770/771231.cpp @@ -252,7 +252,7 @@ bool TQuadroF::user_destroy() return TRUE; } -HIDDEN const int PROSP_RIGHE = 16; +const int PROSP_RIGHE = 16; void TQuadroF::riempi_prospetto(const char prosp) { diff --git a/m770/771232.cpp b/m770/771232.cpp index 0d55e76b7..c24eb03fa 100755 --- a/m770/771232.cpp +++ b/m770/771232.cpp @@ -25,7 +25,7 @@ HIDDEN const char* aliq[] = "" }; -HIDDEN const char* DISTINTA_APP = "771mod -6 4"; +#define DISTINTA_APP "771mod -6 4" //771234b.uml #define AMM_AZ 102 diff --git a/m770/771310a.uml b/m770/771310a.uml index 4463b5ff6..89b5d293b 100755 --- a/m770/771310a.uml +++ b/m770/771310a.uml @@ -58,32 +58,32 @@ BEGIN USE LF_QUAL KEY 1 SELECT ((CODDITTA=#F_CODDITTA) && (QLAP=#F_ANNODIC)) INPUT CODDITTA F_CODDITTA INPUT QLAP F_QLANNOPAG - DISPLAY "A.P." QLAP - DISPLAY "M.P." QLMP - DISPLAY "Ritenute@15" QLRITEFF + DISPLAY "A.P." QLAP + DISPLAY "M.P." QLMP + DISPLAY "Ritenute@15" QLRITEFF DISPLAY "Importo versato" QLRITVER - DISPLAY "L.V." QLLV - DISPLAY "T.V." QLTV - DISPLAY "C.T." QLCT - DISPLAY "Art.Bil." QLAB - DISPLAY "Data Vers." QLDV - DISPLAY "Serie/ABI" QLSERIE - DISPLAY "Numero/CAB@11" QLNUMERO - DISPLAY "Rss" QLRSS - DISPLAY "Note@7" QLNOTE - OUTPUT F_QLDATAVERS QLDV - OUTPUT F_QLMESEPAG QLMP - OUTPUT F_QLANNOPAG QLAP - OUTPUT F_QLLUOVERS QLLV - OUTPUT F_QLTIPOVERS QLTV - OUTPUT F_QLCODTRIB QLCT - OUTPUT F_ARTBIL QLAB - OUTPUT F_QLSERIE QLSERIE - OUTPUT F_ABI QLSERIE - OUTPUT F_CAB QLNUMERO[1,5] - OUTPUT F_NPROG QLNUMERO[6,11] - OUTPUT F_QLNUMERO QLNUMERO - OUTPUT F_CCQUIETANZA QLNUMERO + DISPLAY "L.V." QLLV + DISPLAY "T.V." QLTV + DISPLAY "C.T." QLCT + DISPLAY "Art.Bil." QLAB + DISPLAY "Data Vers." QLDV + DISPLAY "Serie/ABI" QLSERIE + DISPLAY "Numero/CAB@11" QLNUMERO + DISPLAY "Rss" QLRSS + DISPLAY "Note@7" QLNOTE + OUTPUT F_QLDATAVERS QLDV + OUTPUT F_QLMESEPAG QLMP + OUTPUT F_QLANNOPAG QLAP + OUTPUT F_QLLUOVERS QLLV + OUTPUT F_QLTIPOVERS QLTV + OUTPUT F_QLCODTRIB QLCT + OUTPUT F_ARTBIL QLAB + OUTPUT F_QLSERIE QLSERIE + OUTPUT F_ABI QLSERIE + OUTPUT F_CAB QLNUMERO[1,5] + OUTPUT F_NPROG QLNUMERO[6,11] + OUTPUT F_QLNUMERO QLNUMERO + OUTPUT F_CCQUIETANZA QLNUMERO FIELD LF_QUAL->QLAP FLAGS "R" VALIDATE FIXLEN_FUNC 4 @@ -257,12 +257,10 @@ BEGIN PROMPT 0 14 "Rit. Effettuate" END -NUMBER F_QLRITEFF 15 +CURRENCY F_QLRITEFF 15 BEGIN PROMPT 0 15 "" FIELD LF_QUAL->QLRITEFF - PICTURE "." - FLAGS "R" END TEXT DLG_NULL @@ -270,12 +268,10 @@ BEGIN PROMPT 17 14 "Importo versato" END -NUMBER F_QLRITVER 15 +CURRENCY F_QLRITVER 15 BEGIN PROMPT 17 15 "" FIELD LF_QUAL->QLRITVER - PICTURE "." - FLAGS "R" END TEXT DLG_NULL diff --git a/m770/772.cpp b/m770/772.cpp index 8f4c38114..99dbb4cae 100755 --- a/m770/772.cpp +++ b/m770/772.cpp @@ -1,9 +1,6 @@ #include -#include #include "772.h" -#define usage "Error - usage : %s -{0|1|2|3|4|5}" - int main(int argc,char** argv) { const int n = (argc > 1) ? atoi(argv[1]+1) : -1; @@ -23,8 +20,9 @@ int main(int argc,char** argv) case 5: stampa_riepilogo(argc,argv); break; default: - error_box(usage, argv[0]) ; + break; } + exit(0); return 0; } diff --git a/m770/772100.cpp b/m770/772100.cpp index 4dff00d65..a3298761c 100755 --- a/m770/772100.cpp +++ b/m770/772100.cpp @@ -1,5 +1,6 @@ // 772100.cpp - Stampa schede percipienti #include +#include #include #include #include @@ -51,10 +52,8 @@ II I__I I_15__________I I______I I_____I I_IMPONIB__II_SPESE____II_IMPOSTE__II_T HIDDEN TString256 tmp; HIDDEN const int RIGHE_FOOTER = 2; -HIDDEN const char* P198_REAL_PICTURE = "############"; // picture standard di stampa -HIDDEN const char* STD_IMP_PIC = "############"; HIDDEN const char* STD_ALQ_PIC = ".2"; // costanti di stampa @@ -113,6 +112,7 @@ class TStampa_perc : public TPrintapp bool init_print(); void add(TVersamento& vers); bool find(TVersamento& vers); + TString STD_IMP_PIC; protected: virtual void on_config_change(); @@ -236,10 +236,10 @@ int TStampa_perc::setta_righe_documento() reset_print(); TString spesedoc(20), imposdoc(20), totdoc(20), impondoc(20); - spesedoc = _spesedoc.string(P198_REAL_PICTURE); - imposdoc = _imposdoc.string(P198_REAL_PICTURE); - totdoc = _totaledoc.string(P198_REAL_PICTURE); - impondoc = _impondoc.string(P198_REAL_PICTURE); + spesedoc = _spesedoc.string(STD_IMP_PIC); + imposdoc = _imposdoc.string(STD_IMP_PIC); + totdoc = _totaledoc.string(STD_IMP_PIC); + impondoc = _impondoc.string(STD_IMP_PIC); // inizilizza offset di riga per lasciare una riga bianca // tra una scheda e l'altra @@ -866,14 +866,20 @@ bool TStampa_perc::init_print() } bool TStampa_perc::set_print(int) -{ - long codditta_prec; - int i = 0; +{ + STD_IMP_PIC = "############"; + int fd = TCurrency::get_firm_dec(); + if (fd > 0) + { + for (int i = STD_IMP_PIC.len()-1; fd > 0; i--, fd--) + STD_IMP_PIC[i] = '@'; + STD_IMP_PIC[i] = ','; + } if (_liv == 'S') { - codditta_prec = get_firm_770(); - while ((_codditta = _cnf->get_long(DITTE_SEL, _section, i++)) != 0L) + const long codditta_prec = get_firm_770(); + for (int i = 0; (_codditta = _cnf->get_long(DITTE_SEL, _section, i)) != 0L; i++) { set_firm_770(_codditta); // init_print ritorna TRUE solo se K_ENTER diff --git a/m770/772200.cpp b/m770/772200.cpp index 72ced645c..d94748733 100755 --- a/m770/772200.cpp +++ b/m770/772200.cpp @@ -685,8 +685,9 @@ bool TSt_certif::init_print() } set_print_zero(FALSE); + set_magic_currency(TRUE); - _prog = new TProgind(_cur->items(),"Elaborazione in corso... prego attendere",FALSE); + _prog = new TProgind(_cur->items(),"Elaborazione in corso...",FALSE); crea_sort(); _sort->endsort(); diff --git a/m770/772300.cpp b/m770/772300.cpp index 797e646fd..585e08f29 100755 --- a/m770/772300.cpp +++ b/m770/772300.cpp @@ -3,25 +3,25 @@ // 16. 1.96 Stampa solo le schede che hanno almeno un pagamento con data // compresa negli estremi richiesti // +#include +#include +#include #include #include #include +#include #include #include -#include -#include -#include -#include + #include "scperc.h" #include "rpag.h" #include "rver.h" + #include #include #include #include #include "perc.h" -#include -#include #include "772.h" #include "772300.h" @@ -204,7 +204,7 @@ void TStampa_mov::setta_righe_pagamenti(const TString& datapag,const real& impon const TString& percent,const real& ritenpag,int i) { set_row (i, "@32g%10s", (const char*) datapag); - set_row (i, "@43g%15.0r", &imponpag); + set_row (i, "@43g%r", &imponpag); set_row (i, "@59g%s", (const char*) percent); set_row (i, "@65g%12r", &ritenpag); } @@ -219,15 +219,15 @@ void TStampa_mov::setta_righe_versamenti(char luovers,char tipovers,const TStrin set_row (j, "@84g%10s", (const char*) dataver); set_row (j, "@97g%s", (const char*) serie); set_row (j, "@103g%s", (const char*) numero); - set_row (j, "@116g%15.0r", &impvers); + set_row (j, "@116g%r", &impvers); } } void TStampa_mov::set_total_perc() { - set_row (_row, "@20gTOTALE PERCIPIENTE@43g%15.0r", &_tot_imponpag); - set_row (_row, "@62g%15.0r", &_tot_ritenpag); - set_row (_row, "@116g%15.0r", &_tot_impvers); + set_row (_row, "@20gTOTALE PERCIPIENTE@43g%r", &_tot_imponpag); + set_row (_row, "@62g%r", &_tot_ritenpag); + set_row (_row, "@116g%r", &_tot_impvers); set_row (_row+1, ""); _g_tot_imp += _tot_imponpag; @@ -239,9 +239,9 @@ void TStampa_mov::set_total_perc() void TStampa_mov::set_global_total() { - set_row (_row, "@20gTOTALE GENERALE @43g%15.0r", &_g_tot_imp); - set_row (_row, "@62g%15.0r", &_g_tot_rit); - set_row (_row, "@116g%15.0r", &_g_tot_ver); + set_row (_row, "@20gTOTALE GENERALE @43g%r", &_g_tot_imp); + set_row (_row, "@62g%r", &_g_tot_rit); + set_row (_row, "@116g%r", &_g_tot_ver); set_row (_row+1, ""); } @@ -430,17 +430,15 @@ bool TStampa_mov::set_print(int) bool TStampa_mov::init_print() { TMask msk ("772300a"); - KEY tasto; - TLocalisamfile* fl; - msk.set_handler (F_CODDITTA, codditta_hnd); - - printer().footerlen(3); + printer().footerlen(3); + + set_real_picture("###.###.###.###"); + set_magic_currency(TRUE); _g_tot_imp = _g_tot_rit = _g_tot_ver = ZERO; - tasto = msk.run(); - + KEY tasto = msk.run(); if (tasto == K_ENTER) { _tipoa_da = msk.get (F_TIPODA)[0]; @@ -463,7 +461,7 @@ bool TStampa_mov::init_print() reset_files(); //resetta l'albero di stampa add_file(LF_SCPERC); - fl = &(current_cursor()->file(LF_SCPERC)); + TLocalisamfile* fl = &(current_cursor()->file(LF_SCPERC)); TRectype da (fl->curr()); TRectype a (fl->curr()); diff --git a/m770/772400.cpp b/m770/772400.cpp index cbbdc97d8..f0bb2ad5e 100755 --- a/m770/772400.cpp +++ b/m770/772400.cpp @@ -1,24 +1,25 @@ // 772400.cpp - Calcolo e Stampa versamenti ritenute +#include #include #include +#include #include +#include #include #include -#include -#include -#include -#include "scperc.h" -#include "rpag.h" -#include "rver.h" + #include #include -#include "perc.h" -#include + #include "772.h" #include "772400.h" #include "77lib.h" -static TString256 tmp; +#include "scperc.h" +#include "rpag.h" +#include "rver.h" +#include "perc.h" + static bool filter_func (const TRelation*); @@ -57,6 +58,7 @@ class TSt_vers : public TPrintapp long _codditta, _codanagp; real _tot_cod, _tot_mese; bool _primo; + TString _tmp; protected: virtual bool user_create() ; @@ -393,11 +395,13 @@ bool TSt_vers::set_print(int) set_real_picture ("###.###.###.###"); set_print_zero(); + set_magic_currency(TRUE); + printer().footerlen(5); setta_intestazione(); - _prog = new TProgind(_cur->items(),"Elaborazione in corso... prego attendere",FALSE); + _prog = new TProgind(_cur->items(),"Elaborazione in corso...",FALSE); crea_sort(); _sort->endsort(); @@ -450,10 +454,11 @@ const char* TSt_vers::desc_percipiente(char t, long c) ragsoc.trim(); nome.trim(); ragsoc << ' ' << nome; } - tmp = ragsoc; + _tmp = ragsoc; } - else tmp = ""; - return tmp; + else + _tmp.cut(0); + return _tmp; } bool TSt_vers::user_create() diff --git a/m770/776100.cpp b/m770/776100.cpp index 9daa89331..9c814d1cb 100755 --- a/m770/776100.cpp +++ b/m770/776100.cpp @@ -12,8 +12,6 @@ #include #include #include -#include -#include #include #include @@ -28,7 +26,7 @@ HIDDEN const int NUM_QUADRI = 30; typedef enum { grassetto=0, sottolineato, piano } stile; -class TManutenzione_quadri : public TApplication +class TManutenzione_quadri : public TSkeleton_application { private: TRelation* _rel; @@ -42,8 +40,8 @@ class TManutenzione_quadri : public TApplication protected: virtual bool create(); + virtual void main_loop(); virtual bool destroy(); - virtual bool menu(MENU_TAG m); virtual void on_config_change(); static bool filtra_ditte(const TRelation * r); static bool show_menu(TMask_field& fld, KEY k); @@ -60,7 +58,6 @@ class TManutenzione_quadri : public TApplication const char* make_prompt(int i, stile st = grassetto); - bool main_loop(); bool query_mask(); void init_query_mask (TMask&); @@ -187,8 +184,6 @@ TMask* TManutenzione_quadri::load_mask(int n) bool TManutenzione_quadri::create() { - TApplication::create(); - _base = new TLocalisamfile(LF_BASE); _basebis = new TLocalisamfile(LF_BASEBIS); _rel = new TRelation(LF_BASE); @@ -198,9 +193,7 @@ bool TManutenzione_quadri::create() _qcomp_prev.spaces(NUM_QUADRI); load_mask(0); - dispatch_e_menu (BAR_ITEM(1)); - - return TRUE; + return TSkeleton_application::create(); } bool TManutenzione_quadri::destroy() @@ -555,10 +548,9 @@ void TManutenzione_quadri::init_query_mask(TMask& m) m.set(F_ANNODIC, _anno_dic); } -bool TManutenzione_quadri::main_loop() +void TManutenzione_quadri::main_loop() { KEY tasto = K_TAB; - while (tasto != K_QUIT) { @@ -567,7 +559,7 @@ bool TManutenzione_quadri::main_loop() if (tasto != K_ESC) { if (!query_mask()) - return FALSE; + return; // Disabilita cambio ditta enable_menu_item(M_FILE_NEW, FALSE); // Disabilita cambio parametri @@ -609,15 +601,6 @@ bool TManutenzione_quadri::main_loop() } } - - return FALSE; -} - -bool TManutenzione_quadri::menu(MENU_TAG m) -{ - if (m == BAR_ITEM(1)) - return main_loop(); - return FALSE; } bool TManutenzione_quadri::query_mask() diff --git a/m770/776100b.uml b/m770/776100b.uml index 797a2c223..421a6db41 100755 --- a/m770/776100b.uml +++ b/m770/776100b.uml @@ -293,7 +293,7 @@ END TEXT DLG_NULL_C BEGIN - PROMPT 5 10 "Riepilogo SC" + PROMPT 5 10 "Riepilogo SC " GROUP MENU_MAIN MENU_MAIN_VIS END @@ -307,7 +307,7 @@ END TEXT DLG_NULL_D BEGIN - PROMPT 5 11 "Riepilogo SF" + PROMPT 5 11 "Riepilogo SF " GROUP MENU_MAIN MENU_MAIN_VIS END @@ -321,7 +321,7 @@ END TEXT DLG_NULL_DB BEGIN - PROMPT 5 12 "Riepilogo SG" + PROMPT 5 12 "Riepilogo SG " GROUP MENU_MAIN MENU_MAIN_VIS END @@ -335,7 +335,7 @@ END TEXT DLG_NULL_D1 BEGIN - PROMPT 5 13 "Riepilogo SH" + PROMPT 5 13 "Riepilogo SH " GROUP MENU_MAIN MENU_MAIN_VIS END @@ -349,7 +349,7 @@ END TEXT DLG_NULL_E BEGIN - PROMPT 5 14 "Riepilogo SP" + PROMPT 5 14 "Riepilogo SP " GROUP MENU_MAIN MENU_MAIN_VIS END @@ -363,7 +363,7 @@ END TEXT DLG_NULL_E1 BEGIN - PROMPT 5 15 "Riepilogo SQ" + PROMPT 5 15 "Riepilogo SQ " GROUP MENU_MAIN MENU_MAIN_VIS END @@ -377,7 +377,7 @@ END TEXT DLG_NULL_L BEGIN - PROMPT 5 16 "Riepilogo SL/SK" + PROMPT 5 16 "Riepilogo SL/SK " GROUP MENU_MAIN MENU_MAIN_VIS END diff --git a/m770/77lib.h b/m770/77lib.h index 9d7a792b3..21df08655 100755 --- a/m770/77lib.h +++ b/m770/77lib.h @@ -9,10 +9,10 @@ class TSchedaP; // Flag di record del dichiarante (quadro I "globale") -HIDDEN const char COD_QUA_I_DIC = 'D'; -HIDDEN const char DELEGA_BANCARIA = 'B'; -HIDDEN const char DISTINTA = 'D'; -HIDDEN const char CC_POSTALE = 'C'; +#define COD_QUA_I_DIC 'D' +#define DELEGA_BANCARIA 'B' +#define DISTINTA 'D' +#define CC_POSTALE 'C' //////////////////////////////////////////////////////////////////////// // @@ -22,15 +22,15 @@ HIDDEN const char CC_POSTALE = 'C'; // L'anno di dichiarazione selezionato nei parametri di studio 770. // (Usato anche in 773100a.uml) -HIDDEN const char* ANNO_SEL = "AnnoDic"; +#define ANNO_SEL "AnnoDic" // Elenco di ditte selezionate da un utente. Array in CONFIG_USER -HIDDEN const char* DITTE_SEL = "DitteSel"; -HIDDEN const char* ST_MODULO = "StSuModulo"; -HIDDEN const char* ST_DATA = "StDataMod"; -HIDDEN const char* ST_DOC = "StDocNoPag"; +#define DITTE_SEL "DitteSel" +#define ST_MODULO "StSuModulo" +#define ST_DATA "StDataMod" +#define ST_DOC "StDocNoPag" // La ditta corrente per il 770 - s/get_firm_770() usano questo -HIDDEN const char* DITTA_770 = "Ditta770"; +#define DITTA_770 "Ditta770" // Arrotonda modificato { 1500 -> 1000 (e non 2000 come in round(-3)) } const real& round_770(const real& importo); @@ -368,50 +368,50 @@ struct TLink770 // con overloading dell'operatore di assegnazione da un TRectype struct Pag_struct { - TDate datapag; - real imponibile; - real perc; - real ritenuta; - real compenso; - real netto; - long numvers; - real spesa; - real ctssnperc; - real ctssncomp; - real ritlorda; - real controbb; - real detfamil; - real detlavdip; - real totdet; - int giolavdip; - real impcpa; - real somregconv; - real alqimp10; - TString16 cod10; - real utpagati; - real utspett; - real ritutpag; - real ritutspe; - real nquote; - real somnsrit; - real ammlordo; - real quotaprov; - real impnetto; - real comnetto; - - // overloading operatore di confronto - int operator==(Pag_struct& s); - - // overloading operatore di assegnazione - // ritorna per riferimento la struttura - // compilata con i valori del record passato - Pag_struct& operator=(TRectype & rec); - - // overloading operatore di assegnazione - // ritorna per riferimento la struttura - // incrementata dai valori della struttura passata - Pag_struct& operator+=(Pag_struct& s); -}; + TDate datapag; + real imponibile; + real perc; + real ritenuta; + real compenso; + real netto; + long numvers; + real spesa; + real ctssnperc; + real ctssncomp; + real ritlorda; + real controbb; + real detfamil; + real detlavdip; + real totdet; + int giolavdip; + real impcpa; + real somregconv; + real alqimp10; + TString16 cod10; + real utpagati; + real utspett; + real ritutpag; + real ritutspe; + real nquote; + real somnsrit; + real ammlordo; + real quotaprov; + real impnetto; + real comnetto; + + // overloading operatore di confronto + int operator==(Pag_struct& s); + + // overloading operatore di assegnazione + // ritorna per riferimento la struttura + // compilata con i valori del record passato + Pag_struct& operator=(TRectype & rec); + + // overloading operatore di assegnazione + // ritorna per riferimento la struttura + // incrementata dai valori della struttura passata + Pag_struct& operator+=(Pag_struct& s); +}; #endif diff --git a/m770/77srsc.frm b/m770/77srsc.frm index 70373bb12..ceb7a2aa5 100755 --- a/m770/77srsc.frm +++ b/m770/77srsc.frm @@ -88,7 +88,7 @@ BEGIN FIELD TASSAZIONE END -NUMBER 4 14 +VALUTA 4 14 BEGIN SPECIAL STRINGA INTESTAZIONE "@CAmm. lordo" "Amm. lordo" SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" @@ -99,7 +99,7 @@ BEGIN FIELD AMMLORDO END -NUMBER 5 14 +VALUTA 5 14 BEGIN SPECIAL STRINGA INTESTAZIONE "@CContributi" "Contributi" SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" @@ -110,7 +110,7 @@ BEGIN FIELD CONTROBB END -NUMBER 6 14 +VALUTA 6 14 BEGIN SPECIAL STRINGA INTESTAZIONE "Somme non sogg" "Somme non sogg" SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" @@ -121,7 +121,7 @@ BEGIN FIELD SOMNONSOGG END -NUMBER 7 14 +VALUTA 7 14 BEGIN SPECIAL STRINGA INTESTAZIONE "@CImponibile" "Imponibile" SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" @@ -132,7 +132,7 @@ BEGIN FIELD IMPONIBILE END -NUMBER 8 14 +VALUTA 8 14 BEGIN SPECIAL STRINGA INTESTAZIONE "@CImposta" "Imposta" SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" @@ -143,7 +143,7 @@ BEGIN FIELD IMPOSTA END -NUMBER 9 14 +VALUTA 9 14 BEGIN SPECIAL STRINGA INTESTAZIONE "@CDetr. fam." "Detr. fam." SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" @@ -164,7 +164,7 @@ BEGIN FIELD GGLAVDIP END -NUMBER 11 14 +VALUTA 11 14 BEGIN SPECIAL STRINGA INTESTAZIONE "@CDetr. lav." "Detr. lav." SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" @@ -175,7 +175,7 @@ BEGIN FIELD DETLAVDIP END -NUMBER 12 14 +VALUTA 12 14 BEGIN SPECIAL STRINGA INTESTAZIONE "@CTot. detr." "Tot. detr." SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" @@ -186,7 +186,7 @@ BEGIN FIELD TOTDET END -NUMBER 13 14 +VALUTA 13 14 BEGIN SPECIAL STRINGA INTESTAZIONE "Ritenute" "Ritenute" SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" diff --git a/m770/77srsf.frm b/m770/77srsf.frm index d6e2b1f6b..356694823 100755 --- a/m770/77srsf.frm +++ b/m770/77srsf.frm @@ -93,7 +93,7 @@ BEGIN PICTURE "###.###.###^^^" END -NUMBER 4 15 +VALUTA 4 15 BEGIN SPECIAL STRINGA INTESTAZIONE "Somme non sogg." "Somme non sogg." SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" @@ -104,7 +104,7 @@ BEGIN PICTURE "###.###.###^^^" END -NUMBER 5 15 +VALUTA 5 15 BEGIN SPECIAL STRINGA INTESTAZIONE "Som. Reg. Conv." "Som. Reg. Conv" SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" @@ -115,7 +115,7 @@ BEGIN PICTURE "###.###.###^^^" END -NUMBER 6 14 +VALUTA 6 14 BEGIN SPECIAL STRINGA INTESTAZIONE "@cImponibile" "Imponibile" SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" @@ -126,7 +126,7 @@ BEGIN PICTURE "###.###.###^^^" END -NUMBER 7 14 +VALUTA 7 14 BEGIN SPECIAL STRINGA INTESTAZIONE "@cImporto" "Importo" SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" diff --git a/m770/77srsg.frm b/m770/77srsg.frm index 64c862c5f..82a834190 100755 --- a/m770/77srsg.frm +++ b/m770/77srsg.frm @@ -81,7 +81,7 @@ BEGIN FIELD CAUSALE END -NUMERO 3 14 +VALUTA 3 14 BEGIN SPECIAL STRINGA INTESTAZIONE "@CTotale" "Totale" SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" @@ -92,7 +92,7 @@ BEGIN PICTURE "###.###.###^^^" END -NUMERO 4 14 +VALUTA 4 14 BEGIN SPECIAL STRINGA INTESTAZIONE "Somm. non sogg. iva" "Somm. non sogg. iva" SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" @@ -103,7 +103,7 @@ BEGIN PICTURE "###.###.###^^^" END -NUMERO 5 14 +VALUTA 5 14 BEGIN SPECIAL STRINGA INTESTAZIONE "Somm. reg. conv." "Som. reg.conv." SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" @@ -114,7 +114,7 @@ BEGIN PICTURE "###.###.###^^^" END -NUMERO 6 14 +VALUTA 6 14 BEGIN SPECIAL STRINGA INTESTAZIONE "@CImponibile" "Imponibile" SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" @@ -125,7 +125,7 @@ BEGIN PICTURE "###.###.###^^^" END -NUMERO 7 14 +VALUTA 7 14 BEGIN SPECIAL STRINGA INTESTAZIONE "@CImporto" "Importo" SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" @@ -136,7 +136,7 @@ BEGIN PICTURE "###.###.###^^^" END -STRINGA 8 14 +VALUTA 8 14 BEGIN SPECIAL STRINGA INTESTAZIONE "Contributo 10%" "Contributo 10%" SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" diff --git a/m770/77srsh.frm b/m770/77srsh.frm index 06323cf6f..36d26a0c9 100755 --- a/m770/77srsh.frm +++ b/m770/77srsh.frm @@ -79,7 +79,7 @@ BEGIN FIELD CAUSALE END -NUMBER 3 14 +VALUTA 3 14 BEGIN SPECIAL STRINGA INTESTAZIONE "@CTotale" "Totale" SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" @@ -90,7 +90,7 @@ BEGIN PICTURE "###.###.###^^^" END -NUMBER 4 14 +VALUTA 4 14 BEGIN SPECIAL STRINGA INTESTAZIONE "Spes. Ant." "Spes. Ant." SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" @@ -101,7 +101,7 @@ BEGIN PICTURE "###.###.###^^^" END -NUMBER 5 14 +VALUTA 5 14 BEGIN SPECIAL STRINGA INTESTAZIONE "Quaota Provv." "quaota Provv." SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" @@ -112,7 +112,7 @@ BEGIN PICTURE "###.###.###^^^" END -NUMBER 6 14 +VALUTA 6 14 BEGIN SPECIAL STRINGA INTESTAZIONE "@CImponibile" "Imponibile" SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" @@ -123,7 +123,7 @@ BEGIN PICTURE "###.###.###^^^" END -NUMBER 7 14 +VALUTA 7 14 BEGIN SPECIAL STRINGA INTESTAZIONE "Rit. Op." "Rit. Op." SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" diff --git a/m770/77srsl.frm b/m770/77srsl.frm index ee946db6f..f2f54314e 100755 --- a/m770/77srsl.frm +++ b/m770/77srsl.frm @@ -37,7 +37,7 @@ BEGIN MESSAGE _PAGENO END -NUMERO 4 40 +STRINGA 4 40 BEGIN KEY "Intestazione stampa" PROMPT 55 2 "Stampa riepilogo SL/SK" @@ -147,7 +147,7 @@ BEGIN FIELD 42->QLSERIE END -NUMERO 9 15 +VALUTA 9 15 BEGIN SPECIAL STRINGA INTESTAZIONE "@cRit. effettuate" "Rit. effettuate" SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" @@ -158,7 +158,7 @@ BEGIN PICTURE "###.###.###.###^^^" END -NUMERO 10 15 +VALUTA 10 15 BEGIN SPECIAL STRINGA INTESTAZIONE "@cImp. Versato" "Imp. Versato" SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" diff --git a/m770/77srsp.frm b/m770/77srsp.frm index 54eac097a..d3657ed48 100755 --- a/m770/77srsp.frm +++ b/m770/77srsp.frm @@ -79,7 +79,7 @@ BEGIN FIELD CAUSALE END -NUMBER 3 14 +VALUTA 3 14 BEGIN SPECIAL STRINGA INTESTAZIONE "@CImponibile" "Imponibile" SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" @@ -90,7 +90,7 @@ BEGIN PICTURE "###.###.###^^^" END -NUMBER 4 14 +VALUTA 4 14 BEGIN SPECIAL STRINGA INTESTAZIONE "@CAliquota" "Aliquota" SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" @@ -101,7 +101,7 @@ BEGIN PICTURE "##@,@@" END -NUMBER 5 14 +VALUTA 5 14 BEGIN SPECIAL STRINGA INTESTAZIONE "@CImporto" "Importo" SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" @@ -112,7 +112,7 @@ BEGIN PICTURE "###.###.###^^^" END -NUMBER 6 14 +VALUTA 6 14 BEGIN SPECIAL STRINGA INTESTAZIONE "@CNetto" "Netto" SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" @@ -123,7 +123,7 @@ BEGIN PICTURE "###.###.###^^^" END -NUMBER 7 14 +VALUTA 7 14 BEGIN SPECIAL STRINGA INTESTAZIONE "@CSomme" "Somme" SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" diff --git a/m770/77srsq.frm b/m770/77srsq.frm index f4ec2dfa9..6221c9e97 100755 --- a/m770/77srsq.frm +++ b/m770/77srsq.frm @@ -83,7 +83,7 @@ BEGIN FIELD CAUSALE END -NUMBER 3 14 +VALUTA 3 14 BEGIN SPECIAL STRINGA INTESTAZIONE "@CSomme" "Somme" SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" @@ -94,7 +94,7 @@ BEGIN PICTURE "###.###.###^^^" END -NUMBER 4 14 +VALUTA 4 14 BEGIN SPECIAL STRINGA INTESTAZIONE "@CAmmontare" "Ammontare" SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" @@ -105,7 +105,7 @@ BEGIN PICTURE "###.###.###^^^" END -NUMBER 5 14 +NUMERO 5 9 BEGIN SPECIAL STRINGA INTESTAZIONE "Ragione Sociale" "Ragione Sociale" SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" @@ -116,7 +116,7 @@ BEGIN PICTURE "##@,@@" END -NUMBER 6 14 +VALUTA 6 14 BEGIN SPECIAL STRINGA INTESTAZIONE "@CImporto" "Importo" SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" @@ -127,7 +127,7 @@ BEGIN PICTURE "###.###.###^^^" END -NUMBER 7 14 +VALUTA 7 14 BEGIN SPECIAL STRINGA INTESTAZIONE "@CNetto" "Netto" SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" @@ -138,7 +138,7 @@ BEGIN PICTURE "###.###.###^^^" END -NUMERO 8 14 +VALUTA 8 14 BEGIN SPECIAL STRINGA INTESTAZIONE "@CAmm. Compl." "Amm. Compl." SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" @@ -149,7 +149,7 @@ BEGIN PICTURE "###.###.###^^^" END -NUMERO 9 14 +VALUTA 9 14 BEGIN SPECIAL STRINGA INTESTAZIONE "Imponibile" "Imponibile" SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" @@ -160,7 +160,7 @@ BEGIN PICTURE "###.###.###^^^" END -NUMERO 10 14 +VALUTA 10 14 BEGIN SPECIAL STRINGA INTESTAZIONE "Rit. Op." "Rit. Op." SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" @@ -171,7 +171,7 @@ BEGIN PICTURE "###.###.###^^^" END -NUMERO 11 14 +VALUTA 11 14 BEGIN SPECIAL STRINGA INTESTAZIONE "Ragione Sociale" "Ragione Sociale" SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" diff --git a/mg/batbcau.uml b/mg/batbcau.uml index 12ffbf757..7b518d405 100755 --- a/mg/batbcau.uml +++ b/mg/batbcau.uml @@ -113,7 +113,7 @@ END BOOL F_UPDTULC BEGIN FIELD B2 - PROMPT 2 13 "Aggiorna ultimo costo " + PROMPT 2 11 "Aggiorna ultimo costo " END STRING F_CAUCOLL 5 diff --git a/mg/f114.trr b/mg/f114.trr index 73601b91f..2a8df4a4f 100755 --- a/mg/f114.trr +++ b/mg/f114.trr @@ -10,9 +10,9 @@ VALORE|4|18|3|Valore NRIGA|2|4|0|Numeratore sheet ULTCOS1|4|15|5|Ulitmo costo alla chisura ULTCOS2|4|15|5|Penultimo costo alla cgisura -COSTSTD|4|15|2|Costo standard alla chisura +COSTSTD|4|15|3|Costo standard alla chisura COSTOMEDIO|4|15|5|Costo medio (VACQ/ACQ) alla chiusura -PRZLIST|4|15|2|Prezzo di liostino alla chiusura +PRZLIST|4|15|3|Prezzo di listino alla chiusura CODLISTINO|1|3|0|Codice listino usato in chiusura CATVEN|1|3|0|Cat vendita del listino 2 diff --git a/mg/mg0.cpp b/mg/mg0.cpp index 234781264..dd16d6908 100755 --- a/mg/mg0.cpp +++ b/mg/mg0.cpp @@ -1,27 +1,16 @@ #include -#include -// -// Gestione tabelle e Parametri di magazzino -#include "mg0.h" -#define usage "Error - usage : %s -{0|1|2}" +#include "mg0.h" int main(int argc, char** argv) { - int rt = -1; - const int r = (argc > 1) ? atoi(&argv[1][1]) : -1; - + const int r = (argc > 1) ? argv[1][1] - '0' : 0; switch (r) { - case 0: // gestione tabelle - rt = mg0100(argc,argv) ; break; - case 1: // stampa tabelle - rt = mg0200(argc,argv) ; break; - case 2: // configurazione mag - rt = mg0300(argc,argv) ; break; - default: - error_box(usage, argv[0]) ; break; + case 1: mg0200(argc,argv); break; // stampa tabelle + case 2: mg0300(argc,argv); break; // configurazione mag + default: mg0100(argc,argv); break; // gestione tabelle } - - return rt ; + exit(0); + return 0; } diff --git a/mg/mg0100.cpp b/mg/mg0100.cpp index 6f52e2461..fe715eea2 100755 --- a/mg/mg0100.cpp +++ b/mg/mg0100.cpp @@ -1,12 +1,14 @@ // gestione tabelle di magazzino + +#include #include #include -#include + #include "batbcau.h" #include "batbfca.h" -#include "..\ve\batbmag.h" -#include "mglib.h" +#include "mglib.h" +#include "../ve/batbmag.h" #define MAXMETACH 20 // maschere delle tabelle di magazzino diff --git a/mg/mg0200.cpp b/mg/mg0200.cpp index 3bab99e96..138500509 100755 --- a/mg/mg0200.cpp +++ b/mg/mg0200.cpp @@ -1,34 +1,29 @@ #include -#include #include #include -#include -#include -#include -#include + #include "mglib.h" #include "mg0200.h" -class TStampa_tabmag : public TApplication +class TStampa_tabmag : public TSkeleton_application { TCodice_livelli * _cod_liv; TMask * _mask; TForm * _form; - void set_print(TString & tabname); +private: + void set_print(const TString& tabname); + protected: - virtual bool create(); - virtual bool destroy(); - virtual bool menu(MENU_TAG); -static bool hnd_livinizio(TMask_field &, KEY); // handler -static bool hnd_livfine(TMask_field &, KEY); // handler + virtual void main_loop(); + + static bool hnd_livinizio(TMask_field &, KEY); // handler + static bool hnd_livfine(TMask_field &, KEY); // handler + public: // @cmember Disabilita la verifica del modulo in chiave - virtual bool check_autorization() const - {return FALSE;} - const TCodice_livelli & liv_cod() - {return *_cod_liv;} - + virtual bool check_autorization() const { return FALSE; } + const TCodice_livelli& liv_cod() { return *_cod_liv; } }; bool TStampa_tabmag::hnd_livinizio(TMask_field &f, KEY k) @@ -58,7 +53,7 @@ bool TStampa_tabmag::hnd_livfine(TMask_field &f, KEY k) return TRUE; } -void TStampa_tabmag::set_print(TString & tabname) +void TStampa_tabmag::set_print(const TString& tabname) { const short begin=_cod_liv->code_start(_mask->get_int(F_INIZIO1)), end= begin+_cod_liv->code_length(_mask->get_int(F_INIZIO1))-1; @@ -84,13 +79,7 @@ void TStampa_tabmag::set_print(TString & tabname) _form->cursor()->setfilter(filter); } -bool TStampa_tabmag::create() -{ - dispatch_e_menu(BAR_ITEM(1)); - return TRUE; -} - -bool TStampa_tabmag::menu(MENU_TAG) +void TStampa_tabmag::main_loop() { TString16 maskname("bast"); TString16 formname("tab_"); @@ -113,14 +102,9 @@ bool TStampa_tabmag::menu(MENU_TAG) _form->print(); delete _form; } // while - return FALSE; -} -bool TStampa_tabmag::destroy() -{ delete _mask; delete _cod_liv; - return TRUE; } int mg0200(int argc, char* argv[]) diff --git a/mg/mg0300.cpp b/mg/mg0300.cpp index 7fdcee49e..944213947 100755 --- a/mg/mg0300.cpp +++ b/mg/mg0300.cpp @@ -1,20 +1,4 @@ -#include - -#ifndef __CHECKS_H -#include -#endif - -#ifndef __CONFAPP_H #include -#endif - -#ifndef __EXECP_H -#include -#endif - -#ifndef __TABUTIL_H -#include -#endif #include "mgconf.h" @@ -27,8 +11,7 @@ class TConf_magazz : public TConfig_application static bool check_fields(TMask_field& f, KEY k); public: // @cmember Disabilita la verifica del modulo in chiave - virtual bool check_autorization() const - {return FALSE;} + virtual bool check_autorization() const { return FALSE; } virtual bool preprocess_config (TMask& mask, TConfig& config); virtual bool postprocess_config (TMask& mask, TConfig& config); @@ -88,9 +71,6 @@ bool TConf_magazz::user_destroy( ) int mg0300(int argc, char* argv[]) { TConf_magazz appc; - - //if( argc < 3 ) - // fatal_box( SINTASSI ); appc.run(argc, argv, "Parametri gestione magazzino"); return 0; } diff --git a/mg/mg1100.cpp b/mg/mg1100.cpp index 719bcbbb4..5cb8ad6ad 100755 --- a/mg/mg1100.cpp +++ b/mg/mg1100.cpp @@ -1,15 +1,15 @@ -#include -#include -#include +//#include +//#include +//#include #include #include #include -#include +//#include -#include "..\mg\mglib.h" -#include "..\cg\cglib01.h" -#include "..\ve\veconf.h" -#include "..\db\dblib.h" +#include "../mg/mglib.h" +#include "../cg/cglib01.h" +#include "../ve/veconf.h" +#include "../db/dblib.h" #include "mg1100.h" @@ -17,12 +17,10 @@ // class TMask_movmag : public TMask { - static TRecord_cache _cache_causali; static TArticolo_giacenza* _curr_art; TEsercizi_contabili esercizi; TMov_mag * _mov_mag; - TCodgiac_livelli * livelli_giac; // oggetto gestione livelli di giacenza TString _price_codart; real price_quant; bool price_proposed; @@ -35,6 +33,7 @@ class TMask_movmag : public TMask TMagazzini _magazzini; TArticolo_giacenza& curr_art(); + bool qta_inventory(real & qta); static bool notify_righe(TSheet_field & fld_righe, int item, KEY k); // notify delle righe di sheet static bool handle_righe(TMask_field &f, KEY k); // handler delle righe @@ -50,11 +49,10 @@ class TMask_movmag : public TMask public: const TMagazzini & magazzini() const {return _magazzini;} - TMask_movmag(TCodgiac_livelli *l_m,TMov_mag * m_m); + TMask_movmag(TMov_mag * m_m); virtual ~TMask_movmag(); }; -TRecord_cache TMask_movmag::_cache_causali("%CAU"); TArticolo_giacenza* TMask_movmag::_curr_art = NULL; // HANDLER DEL CODICE LIVELLO anagrafica @@ -62,15 +60,13 @@ bool TMask_movmag::codgrp_handler(TMask_field& f, KEY k) { if ((k == K_TAB && f.focusdirty() ||k == K_ENTER ) && !f.empty()) { - TMask_movmag & mask=(TMask_movmag &)f.mask().get_sheet()->mask(); - - if (!mask.livelli_giac->enabled()) + if (!livelli_giacenza().enabled()) { f.error_box("Livelli del codice non abilitati"); return FALSE; } const int levnum=1+f.dlg()-F_LIV1; - return mask.livelli_giac->autoinsert(levnum,f); + return livelli_giacenza().autoinsert(levnum,f); } return TRUE; } @@ -78,11 +74,9 @@ bool TMask_movmag::codgrp_handler(TMask_field& f, KEY k) // costruttore della maschera anagrafica di magazzino //TMask_movmag::TMask_movmag() : -TMask_movmag::TMask_movmag(TCodgiac_livelli *l_m,TMov_mag * m_m) +TMask_movmag::TMask_movmag(TMov_mag * m_m) : TMask("mg1100") { - // oggetti dell'applicazione - livelli_giac= l_m; _mov_mag = m_m; // setta handler e notify TSheet_field & ss=(TSheet_field &)field(F_RIGHE); @@ -101,13 +95,13 @@ TMask_movmag::TMask_movmag(TCodgiac_livelli *l_m,TMov_mag * m_m) // per la pagina giacenze TSheet_field &fld_righe= (TSheet_field &)field(F_RIGHE); // setta le colonne in base all'abilitazione dei livelli di giacenza - livelli_giac->set_sheetcolumn(fld_righe,F_LIV1,1); - livelli_giac->set_sheetcolumn(fld_righe,F_LIV2,2); - livelli_giac->set_sheetcolumn(fld_righe,F_LIV3,3); - livelli_giac->set_sheetcolumn(fld_righe,F_LIV4,4); + livelli_giacenza().set_sheetcolumn(fld_righe,F_LIV1,1); + livelli_giacenza().set_sheetcolumn(fld_righe,F_LIV2,2); + livelli_giacenza().set_sheetcolumn(fld_righe,F_LIV3,3); + livelli_giacenza().set_sheetcolumn(fld_righe,F_LIV4,4); // abilita i controlli for (int l=0; l<4; l++) - if (livelli_giac->autoinsert(1+l)) + if (livelli_giacenza().autoinsert(1+l)) { ss.sheet_mask().efield(F_LIV1+l).check_type(CHECK_SEARCH); ss.sheet_mask().field(F_LIV1+l).set_handler(codgrp_handler); @@ -135,10 +129,10 @@ void TMask_movmag::sheetrighe_get(TSheet_field &fld_righe, int item) TRectype &rec= fld_righe.record()->row(item, TRUE); TToken_string &row= fld_righe.row(item-1); // codici di livello - row.add( m.livelli_giac->unpack_grpcode(rec.get("LIVGIAC") ,1),fld_righe.cid2index(F_LIV1) ); - row.add( m.livelli_giac->unpack_grpcode(rec.get("LIVGIAC") ,2),fld_righe.cid2index(F_LIV2) ); - row.add( m.livelli_giac->unpack_grpcode(rec.get("LIVGIAC") ,3),fld_righe.cid2index(F_LIV3) ); - row.add( m.livelli_giac->unpack_grpcode(rec.get("LIVGIAC") ,4),fld_righe.cid2index(F_LIV4) ); + row.add( livelli_giacenza().unpack_grpcode(rec.get("LIVGIAC") ,1),fld_righe.cid2index(F_LIV1) ); + row.add( livelli_giacenza().unpack_grpcode(rec.get("LIVGIAC") ,2),fld_righe.cid2index(F_LIV2) ); + row.add( livelli_giacenza().unpack_grpcode(rec.get("LIVGIAC") ,3),fld_righe.cid2index(F_LIV3) ); + row.add( livelli_giacenza().unpack_grpcode(rec.get("LIVGIAC") ,4),fld_righe.cid2index(F_LIV4) ); } // item varies from 1 to items() @@ -149,12 +143,12 @@ void TMask_movmag::sheetrighe_put(TSheet_field &fld_righe, int item) TRectype &recrighe= fld_righe.record()->row(item, TRUE); // codici livello - if (m.livelli_giac->enabled()) { + if (livelli_giacenza().enabled()) { TString16 packedcode; - m.livelli_giac->pack_grpcode(packedcode,row.get(fld_righe.cid2index(F_LIV1)),1); - m.livelli_giac->pack_grpcode(packedcode,row.get(fld_righe.cid2index(F_LIV2)),2); - m.livelli_giac->pack_grpcode(packedcode,row.get(fld_righe.cid2index(F_LIV3)),3); - m.livelli_giac->pack_grpcode(packedcode,row.get(fld_righe.cid2index(F_LIV4)),4); + livelli_giacenza().pack_grpcode(packedcode,row.get(fld_righe.cid2index(F_LIV1)),1); + livelli_giacenza().pack_grpcode(packedcode,row.get(fld_righe.cid2index(F_LIV2)),2); + livelli_giacenza().pack_grpcode(packedcode,row.get(fld_righe.cid2index(F_LIV3)),3); + livelli_giacenza().pack_grpcode(packedcode,row.get(fld_righe.cid2index(F_LIV4)),4); recrighe.put("LIVGIAC", packedcode); } } @@ -200,12 +194,13 @@ bool TMask_movmag::notify_righe(TSheet_field & ss, int r, KEY key) } else if (key == K_INS) { // Inserimento if (r < ss.items() && *ss.cell(r,ss.cid2index( F_AUTOMATICA))==riga_automatica) return FALSE; // cannot insert between a row and its generated one + } else if (key == K_CTRL + K_INS) { // Inserimento accordato // Magazzino e Deposito di default: controlla prima quelli della causale, // quindi se non sono settati, prende quelli di default TString16 stdmag; TString16 stddep; - TCausale_magazzino & cau = (TCausale_magazzino &)m._cache_causali.get(m.get(F_CODCAUS)); + TCausale_magazzino cau = cache().get("%CAU",m.get(F_CODCAUS)); if (cau.default_magdep().not_empty()) { stdmag = cau.default_mag(); @@ -222,19 +217,58 @@ bool TMask_movmag::notify_righe(TSheet_field & ss, int r, KEY key) ss.row(r).add(stddep, ss.cid2index(F_CODDEP)); } ss.select(r); - } else if (key == K_SPACE) { - old_codcaus=ss.sheet_mask().get(F_CAUSRIG); + + } else if (key == K_SPACE) { + old_codcaus = ss.sheet_mask().get(F_CAUSRIG); if (old_codcaus.blank()) - old_codcaus=ss.mask().get(F_CODCAUS); - old_quant=ss.sheet_mask().get_real(F_QUANT); - old_codart=ss.sheet_mask().get(F_CODART); + old_codcaus = ss.mask().get(F_CODCAUS); + if (old_quant != ss.sheet_mask().get_real(F_QUANT)) + { + old_quant = ss.sheet_mask().get_real(F_QUANT); + m.qta_inventory(old_quant); + } + old_codart = ss.sheet_mask().get(F_CODART); + } else if (key == K_ENTER) { + if (m.get_bool(F_INVENTORYMODE)) + { + real diff = ss.sheet_mask().get_real(F_QUANT) ; + m.qta_inventory(diff); + if (diff != old_quant) + { + ss.sheet_mask().set(F_QUANT, diff); + ss.row(r).add(diff.string(), ss.cid2index(F_QUANT)); + } + } if (m.update_rigamov(r,old_codcaus,old_codart,old_quant)) ss.select(r); } return TRUE; } +bool TMask_movmag::qta_inventory(real & qta) +{ + if (get_bool(F_INVENTORYMODE)) + { + const TMask & sm = sfield(F_RIGHE).sheet_mask(); + qta -= sm.get_real(F_GIAC); + + TString8 codcau(sm.get(F_CAUSRIG)); + if (codcau.blank()) + codcau = get(F_CODCAUS); + if (codcau.blank()) + return message_box("La causale non e' indicata"); + + TCausale_magazzino cau = cache().get("%CAU",codcau); + switch (cau.sgn(s_giac)) + { + case 1: break; + case -1: qta = - qta; break; + default: message_box("La causale indicata non movimenta la giacenza"); + } + } + return TRUE; +} // proposta soft: solo se il prezzo è non nullo (già impostato) bool TMask_movmag::handle_righeprezzo1(TMask_field &f, KEY k) @@ -276,12 +310,13 @@ TArticolo_giacenza& TMask_movmag::curr_art() bool TMask_movmag::handle_codarticolo(TMask_field &f, KEY k) { - if (k==K_TAB && f.focusdirty()) + if (k==K_TAB) { // TMask_movmag& maskmov = (TMask_movmag&)f.mask(); TMask_movmag& maskmov = (TMask_movmag &)f.mask().get_sheet()->mask(); maskmov.curr_art().read(f.get()); - handle_righeprezzo2(f, k); + if (f.focusdirty()) + handle_righeprezzo2(f, k); } return TRUE; } @@ -294,9 +329,9 @@ bool TMask_movmag::handle_giacattuale(TMask_field &f, KEY k) { TString codliv; // codici livello - if (maskmov.livelli_giac->enabled()) + if (livelli_giacenza().enabled()) { - maskmov.livelli_giac->pack_maskgrpcodes(codliv,maskrighe,F_LIV1,4); + livelli_giacenza().pack_maskgrpcodes(codliv,maskrighe,F_LIV1,4); codliv.rtrim(); } TString16 codmag(maskrighe.get(F_CODMAG)); @@ -329,25 +364,30 @@ bool TMask_movmag::add_autorows (int r, const char * old_codcaus, const char * o if (new_codcaus.blank()) new_codcaus=get(F_CODCAUS); - TCausale_magazzino &oldcau=(TCausale_magazzino &)_cache_causali.get(old_codcaus); - TCausale_magazzino &cau =(TCausale_magazzino &)_cache_causali.get(new_codcaus); + TCausale_magazzino oldcau = cache().get("%CAU",old_codcaus); + TCausale_magazzino cau = cache().get("%CAU",new_codcaus); bool rimuovi_righe_coll=FALSE; - bool inserisci_righe_coll=*cau.caus_collegata()!='\0'; + bool inserisci_righe_coll= *cau.caus_collegata()!='\0' && *ss.cell(r,ss.cid2index(F_ESPLOSA)) == ' '; if (inserisci_righe_coll) { // ******************************* // deve esserci una riga collegata - TCausale_magazzino &cau_coll =(TCausale_magazzino &)_cache_causali.get(cau.caus_collegata()); - - if ((r < ss.items()-1 && *ss.cell(r+1,ss.cid2index( F_AUTOMATICA)) == riga_automatica) - && cau_coll.esplodente()) - if (strcmp(old_codart,ss.cell(r,ss.cid2index( F_CODART)))!=0 ) + TCausale_magazzino cau_coll = cache().get("%CAU",cau.caus_collegata()); + + if (old_codcaus != new_codcaus) + { + rimuovi_righe_coll = TRUE; + } + else + if ((r < ss.items()-1 && *ss.cell(r+1,ss.cid2index( F_AUTOMATICA)) == riga_automatica) + && cau_coll.esplodente()) { - // ho cambiato il codice articolo del finito: rimuovo le righe automatiche esplose - rimuovi_righe_coll=TRUE; + if (strcmp(old_codart,ss.cell(r,ss.cid2index( F_CODART)))!=0 ) + // ho cambiato il codice articolo del finito: rimuovo le righe automatiche esplose + rimuovi_righe_coll = TRUE; + else + inserisci_righe_coll=FALSE; } - else - inserisci_righe_coll=FALSE; } else if (*oldcau.caus_collegata()!='\0') // ho cambiato causale, passando ad una che non ha collegamenti @@ -363,7 +403,7 @@ bool TMask_movmag::add_autorows (int r, const char * old_codcaus, const char * o // ****************** if (inserisci_righe_coll) { - TCausale_magazzino &cau_coll =(TCausale_magazzino &)_cache_causali.get(cau.caus_collegata()); + TCausale_magazzino cau_coll =cache().get("%CAU",cau.caus_collegata()); TString16 mag, dep; mag = cau_coll.default_mag(); dep = cau_coll.default_dep(); @@ -374,12 +414,13 @@ bool TMask_movmag::add_autorows (int r, const char * old_codcaus, const char * o { // manca, la inserisco ss.insert(r+offset); - ss.row(r+offset)=ss.row(r); - ss.row(r+offset).add(TString(1,riga_automatica),ss.cid2index(F_AUTOMATICA)); + TToken_string & newrow = ss.row(r+offset); + newrow = ss.row(r); + newrow.add(TString(1,riga_automatica),ss.cid2index(F_AUTOMATICA)); if (cau_coll.has_default_mag()) - ss.row(r+offset).add(mag,ss.cid2index(F_CODMAG)); + newrow.add(mag,ss.cid2index(F_CODMAG)); if (cau_coll.has_default_dep()) - ss.row(r+offset).add(dep,ss.cid2index(F_CODDEP)); + newrow.add(dep,ss.cid2index(F_CODDEP)); COPIA_SU_AUTO(F_PREZZO); added_some= TRUE; } @@ -424,7 +465,7 @@ bool TMask_movmag::add_explrows(int r) bool added_some=FALSE; - TCausale_magazzino &cau =(TCausale_magazzino &)_cache_causali.get(new_codcaus); + TCausale_magazzino cau = cache().get("%CAU",new_codcaus); TArticolo articolo; if (cau.esplodente() && *sheet.cell(r,sheet.cid2index(F_ESPLOSA)) == ' ') @@ -438,41 +479,53 @@ bool TMask_movmag::add_explrows(int r) real prezzo,quant; const char tipo_costo = cau.get("S11")[0]; const int livello = cau.get_int("I0"); - distinta.set_root(sheet.cell(r,sheet.cid2index(F_CODART))); - distinta.explode(boom, TRUE, RAGGR_EXP_NONE, livello, "A"); - for (int newrow=0; newrow < boom.items() ; newrow++) + const TString codart = sheet.cell(r,sheet.cid2index(F_CODART)); + bool ok = distinta.set_root(codart); + if (ok) { - TRiga_esplosione & riga_esp=(TRiga_esplosione & )(boom[newrow]); - sheet.insert(r+newrow+1); - TToken_string & nuova_riga=sheet.row(r+newrow+1); - nuova_riga=sheet.row(r); - nuova_riga.add(riga_esp.articolo() ,sheet.cid2index(F_CODART)); - nuova_riga.add(riga_esp.um() , sheet.cid2index(F_UM)); - quant=sheet.row(r).get(sheet.cid2index(F_QUANT)); - quant*=riga_esp.val(); - nuova_riga.add(quant.string() , sheet.cid2index(F_QUANT)); - if (codmag.not_empty()) + distinta.explode(boom, TRUE, RAGGR_EXP_NONE, livello, "A"); + for (int newrow=0; newrow < boom.items() ; newrow++) { - nuova_riga.add(codmag.sub(1,3) ,sheet.cid2index(F_CODMAG)); - nuova_riga.add(codmag.sub(4,5) ,sheet.cid2index(F_CODDEP)); + TRiga_esplosione & riga_esp=(TRiga_esplosione & )(boom[newrow]); + sheet.insert(r+newrow+1); + TToken_string & nuova_riga=sheet.row(r+newrow+1); + nuova_riga=sheet.row(r); + nuova_riga.add(riga_esp.articolo() ,sheet.cid2index(F_CODART)); + nuova_riga.add(riga_esp.um() , sheet.cid2index(F_UM)); + quant=sheet.row(r).get(sheet.cid2index(F_QUANT)); + quant*=riga_esp.val(); + nuova_riga.add(quant.string() , sheet.cid2index(F_QUANT)); + if (codmag.not_empty()) + { + nuova_riga.add(codmag.sub(1,3) ,sheet.cid2index(F_CODMAG)); + nuova_riga.add(codmag.sub(4,5) ,sheet.cid2index(F_CODDEP)); + } + articolo.read(riga_esp.articolo()); + if (tipo_costo == 'U') + prezzo = articolo.get_real(ANAMAG_ULTCOS1); + else + if (tipo_costo == 'S') + prezzo = articolo.get_real(ANAMAG_COSTSTD); + if (!prezzo.is_zero()) + nuova_riga.add(prezzo.string(),sheet.cid2index(F_PREZZO)); + nuova_riga.add("X",sheet.cid2index(F_ESPLOSA)); + + sheet.check_row(r+1+newrow); + sheet.force_update(r+1+newrow); + added_some=TRUE; + } + // elimino la riga "padre" + if (boom.items() > 0) + { + if (boom.items() == 1 && codart == ((TRiga_esplosione &)boom[0]).articolo()) + error_box("Distinta %s ciclica", (const char *)codart); + sheet.destroy(r); } - articolo.read(riga_esp.articolo()); - if (tipo_costo == 'U') - prezzo = articolo.get_real(ANAMAG_ULTCOS1); else - if (tipo_costo == 'S') - prezzo = articolo.get_real(ANAMAG_COSTSTD); - if (!prezzo.is_zero()) - nuova_riga.add(prezzo.string(),sheet.cid2index(F_PREZZO)); - nuova_riga.add("X",sheet.cid2index(F_ESPLOSA)); + message_box("Impossibile esplodere l'articolo %s", (const char *)codart); + - sheet.check_row(r+1+newrow); - sheet.force_update(r+1+newrow); - added_some=TRUE; } - // elimino la riga "padre" - if (boom.items() > 0) - sheet.destroy(r); } return added_some; } @@ -481,8 +534,7 @@ real TMask_movmag::proposed_price(const char *codart, real quant, const char *causrig) { real rv("0"); - TCausale_magazzino & cau= - (TCausale_magazzino &)_cache_causali.get(*causrig ? causrig : get(F_CODCAUS)); + TCausale_magazzino cau = cache().get("%CAU",*causrig ? causrig : get(F_CODCAUS)); TLocalisamfile anamag(LF_ANAMAG); anamag.put("CODART",codart); anamag.read(); @@ -550,17 +602,17 @@ bool TMask_movmag::handle_datacomp(TMask_field &fld, KEY k) return TRUE; } - - class TApp_movmag: public TRelation_application { TMask_movmag *_msk; // maschera principale - TCodgiac_livelli * _livelli_giac;// oggetto handler per i livelli di giacenza TRelation * _rel; // relazione contenente il file movimenti virtual bool user_create(); virtual bool user_destroy(); virtual TMask *get_mask(int) { return _msk; } + virtual void init_query_mode(TMask&) ; + virtual void init_insert_mode(TMask&) ; + virtual void init_modify_mode(TMask&) ; virtual bool changing_mask(int) { return FALSE; } virtual TRelation *get_relation() const { return _rel; } virtual const char *get_next_key(); @@ -575,6 +627,22 @@ public: inline TApp_movmag& app() { return (TApp_movmag&) main_app(); } +void TApp_movmag::init_query_mode(TMask& m) +{ + m.enable(F_INVENTORYMODE); + TRelation_application::init_query_mode(m); +} +void TApp_movmag::init_modify_mode(TMask& m) +{ + m.disable(F_INVENTORYMODE); + TRelation_application::init_modify_mode(m); +} +void TApp_movmag::init_insert_mode(TMask& m) +{ + m.disable(F_INVENTORYMODE); + TRelation_application::init_insert_mode(m); +} + bool TApp_movmag::user_create() { open_files(LF_ANAMAG,LF_UMART,LF_MOVMAG,LF_RMOVMAG,LF_MAG,LF_TABCOM,0); @@ -582,10 +650,8 @@ bool TApp_movmag::user_create() TMov_mag * m_m= new TMov_mag(); // record del movimento di magazzino m_m->enable_autoload(LF_RMOVMAG); - // gestione giacenza a livelli - _livelli_giac= new TCodgiac_livelli; // maschera specifica con gli handler dei movimenti - _msk= new TMask_movmag(_livelli_giac,m_m); + _msk= new TMask_movmag(m_m); // relazione con un solo file (LF_MOVMAG) ma col record Head_Body _rel= new TRelation(LF_MOVMAG); _rel->lfile().set_curr(m_m); @@ -597,7 +663,6 @@ bool TApp_movmag::user_destroy() { delete _rel; delete _msk; - delete _livelli_giac; return TRUE; } diff --git a/mg/mg1100.h b/mg/mg1100.h index a89cab5dd..75dbd5f1d 100755 --- a/mg/mg1100.h +++ b/mg/mg1100.h @@ -25,6 +25,8 @@ #define F_DESCONDV 125 #define F_EXNUMDOC 126 #define F_EXANNODOC 127 +#define F_INVENTORYMODE 128 +#define F_INVENTORYMODE2 129 #define H_NUMREG 131 #define H_DATAREG 132 diff --git a/mg/mg1100.uml b/mg/mg1100.uml index 9d410357e..a12a6bd9d 100755 --- a/mg/mg1100.uml +++ b/mg/mg1100.uml @@ -6,7 +6,7 @@ ENDPAGE PAGE "Testata" 11 60 14 -GROUPBOX DLG_NULL 75 5 +GROUPBOX DLG_NULL 75 6 BEGIN PROMPT 1 1 "" FLAGS "R" @@ -17,7 +17,7 @@ BEGIN // FLAGS "D" FLAGS "G" FIELD NUMREG - PROMPT 2 2 "Operazione numero " + PROMPT 2 3 "Operazione numero " KEY 1 3 4 USE LF_MOVMAG INPUT NUMREG F_NUMREG @@ -37,13 +37,13 @@ END NUMBER F_ANNOES 4 BEGIN FLAGS "D" - PROMPT 2 3 "Esercizio di competenza " + PROMPT 2 4 "Esercizio di competenza " FIELD ANNOES END DATE F_DATAREG BEGIN - PROMPT 38 2 "Data di registrazione " + PROMPT 38 3 "Data di registrazione " FLAGS "A" FIELD DATAREG KEY 3 @@ -60,7 +60,7 @@ END DATE F_DATACOMP BEGIN - PROMPT 38 3 "Data di competenza " + PROMPT 38 4 "Data di competenza " FLAGS "A" FIELD DATACOMP KEY 4 @@ -77,7 +77,7 @@ END STRING F_DESCR 50 40 BEGIN - PROMPT 2 4 "Descrizione " + PROMPT 2 5 "Descrizione " FIELD DESCR MESSAGE COPY,H_DESCR END @@ -95,21 +95,21 @@ END STRING F_EXNUMDOC 7 BEGIN FLAGS "U" - PROMPT 2 6 "Documento numero " + PROMPT 2 7 "Documento numero " FIELD EX_NUMDOC END DATE F_EXANNODOC BEGIN - PROMPT 30 6 " del " + PROMPT 30 7 " del " FIELD EX_DATADOC END STRING F_CODCAUS 5 BEGIN - PROMPT 2 8 "Codice causale " + PROMPT 2 9 "Codice causale " FIELD CODCAUS USE %CAU FLAGS "U" @@ -125,7 +125,7 @@ END STRING F_DESCAU 50 30 BEGIN - PROMPT 30 8 "" + PROMPT 30 9 "" USE %CAU KEY 2 INPUT S0 F_DESCAU DISPLAY "Descrizione@50 " S0 @@ -137,7 +137,7 @@ END RADIOBUTTON F_TIPOCF 15 BEGIN - PROMPT 2 8 "" + PROMPT 2 9 "" FLAGS "G" FIELD TIPOCF ITEM " |Nessuno" @@ -152,12 +152,12 @@ END TEXT F_CODCLI BEGIN - PROMPT 20 10 "Codice cliente " + PROMPT 20 11 "Codice cliente " END TEXT F_CODFOR BEGIN - PROMPT 20 10 "Codice fornitore " + PROMPT 20 11 "Codice fornitore " END // agisce anche quando l'utente non entra in gioco (settaggio da contratto...) @@ -165,7 +165,7 @@ NUMBER F_CODCF 6 BEGIN // FLAGS "UHG" FIELD CODCF - PROMPT 37 10 "" + PROMPT 37 11 "" USE LF_CLIFO INPUT TIPOCF F_TIPOCF SELECT INPUT CODCF F_CODCF @@ -179,7 +179,7 @@ END // esegue i controlli e ricopia i valori del codice sia in CLI che in FOR STRING F_RAGSOC 50 30 BEGIN - PROMPT 48 12 "" + PROMPT 48 13 "" USE LF_CLIFO KEY 2 INPUT TIPOCF F_TIPOCF SELECT INPUT RAGSOC F_RAGSOC @@ -192,7 +192,7 @@ END LISTBOX F_TIPOCONDV 1 12 BEGIN FIELD TIPOCV - PROMPT 2 12 "Condizione di vendita " + PROMPT 2 13 "Condizione di vendita " ITEM " |Nessuna" MESSAGE CLEAR,F_CATVEN MESSAGE RESET,F_CODLIST|RESET,F_CODCONTR|RESET,F_CODOFF @@ -216,7 +216,7 @@ END STRING F_CATVEN 2 BEGIN FLAGS "DU" - PROMPT 2 14 "Cat.ven." + PROMPT 2 15 "Cat.ven." FIELD CATVEN USE CVE INPUT CODTAB F_CATVEN @@ -230,7 +230,7 @@ END STRING F_CODLIST 3 BEGIN FLAGS "U" - PROMPT 2 16 "Codice listino " + PROMPT 2 17 "Codice listino " FIELD CODCONDV USE LF_CONDV INPUT TIPO "L" @@ -250,7 +250,7 @@ END STRING F_CODCONTR 3 BEGIN FLAGS "U" - PROMPT 2 16 "Codice contratto " + PROMPT 2 17 "Codice contratto " FIELD CODCONDV USE LF_CONDV INPUT TIPO "C" @@ -273,7 +273,7 @@ END STRING F_CODOFF 3 BEGIN FLAGS "U" - PROMPT 2 16 "Codice offerta " + PROMPT 2 17 "Codice offerta " FIELD CODCONDV USE LF_CONDV INPUT TIPO "O" @@ -286,6 +286,14 @@ BEGIN // GROUP G_DEFMOV END +BOOL F_INVENTORYMODE +BEGIN + PROMPT 2 2 "Modalita' di inserimento come movimento di differenza inventariale" + MESSAGE TRUE SHOW ,F_INVENTORYMODE2 + MESSAGE FALSE HIDE ,F_INVENTORYMODE2 + FLAGS "U" +END + ENDPAGE @@ -293,61 +301,61 @@ PAGE "Righe" 11 60 14 GROUPBOX DLG_NULL 75 5 BEGIN - PROMPT 1 1 "" + PROMPT 1 2 "" FLAGS "R" END NUMBER H_NUMREG 7 BEGIN FLAGS "D" - PROMPT 2 2 "Operazione numero " + PROMPT 2 3 "Operazione numero " END NUMBER H_ANNOES 4 BEGIN FLAGS "D" - PROMPT 2 3 "Esercizio di competenza " + PROMPT 2 4 "Esercizio di competenza " END DATE H_DATAREG BEGIN - PROMPT 38 2 "Data di registrazione " + PROMPT 38 3 "Data di registrazione " FLAGS "D" END DATE H_DATACOMP BEGIN - PROMPT 38 3 "Data di competenza " + PROMPT 38 4 "Data di competenza " FLAGS "D" END STRING H_DESCR 50 40 BEGIN - PROMPT 2 4 "Descrizione " + PROMPT 2 5 "Descrizione " FLAGS "D" END -TEXT DLG_NULL +TEXT F_INVENTORYMODE2 BEGIN - PROMPT 2 6 "Righe" - GROUP G_DEFMOV + PROMPT 2 7 "@BModalita' di inserimento come movimento di differenza inventariale" + FLAGS "UD" END SPREADSHEET F_RIGHE BEGIN - PROMPT 0 7 "RIGHE DI MOVIMENTO" + PROMPT 0 8 "RIGHE DI MOVIMENTO" FLAGS "AI" //USE LF_RMOVMAG KEY NRIG //INPUT NUMREG F_NUMREG ITEM "@1F" - ITEM "CodArt" + ITEM "CodArt@F" + ITEM "Liv1@F10" + ITEM "Liv2@F10" + ITEM "Liv3@F10" + ITEM "Liv4@F10" ITEM "Descrizione" ITEM "CodMag" ITEM "CodDep" - ITEM "Liv1" - ITEM "Liv2" - ITEM "Liv3" - ITEM "Liv4" ITEM "UM@4" ITEM "Qta" ITEM "Prezzo" diff --git a/mg/mg1100a.h b/mg/mg1100a.h index 441b72900..704e1dd47 100755 --- a/mg/mg1100a.h +++ b/mg/mg1100a.h @@ -1,13 +1,13 @@ // colonne visibili dello Sheet #define F_AUTOMATICA 101 #define F_CODART 102 -#define F_DESART 103 -#define F_CODMAG 104 -#define F_CODDEP 105 -#define F_LIV1 106 -#define F_LIV2 107 -#define F_LIV3 108 -#define F_LIV4 109 +#define F_LIV1 103 +#define F_LIV2 104 +#define F_LIV3 105 +#define F_LIV4 106 +#define F_DESART 107 +#define F_CODMAG 108 +#define F_CODDEP 109 #define F_UM 110 #define F_QUANT 111 #define F_PREZZO 112 diff --git a/mg/mg1100a.uml b/mg/mg1100a.uml index 6f8d64de7..ca2b6d3f7 100755 --- a/mg/mg1100a.uml +++ b/mg/mg1100a.uml @@ -213,11 +213,12 @@ END STRING F_UM 2 BEGIN FLAGS "U" - PROMPT 2 11 "Unità di misura " + PROMPT 2 11 "Unita' di misura " FIELD UM - USE LF_UMART KEY 2 + USE LF_UMART KEY 2 SELECT CODART==#F_CODART INPUT CODART F_CODART SELECT INPUT UM F_UM + DISPLAY "Codice Articolo@25" CODART DISPLAY "U.M.@10" UM DISPLAY "F.C.@10" FC OUTPUT F_CODART CODART @@ -229,7 +230,7 @@ END NUMBER F_QUANT 15 5 BEGIN - PROMPT 2 13 "Quantità " + PROMPT 2 13 "Quantita' " FIELD QUANT CHECKTYPE REQUIRED WARNING "Indicare la quantità" diff --git a/mg/mg1400.cpp b/mg/mg1400.cpp index 9f3c36d2b..745dd8c11 100755 --- a/mg/mg1400.cpp +++ b/mg/mg1400.cpp @@ -25,8 +25,8 @@ class TApp_openclose; class TMask_openclose: public TMask { - bool ordaut; - TEsercizi_contabili esercizi; + bool _ordaut; + TEsercizi_contabili _esercizi; bool _gestione_listini; bool _gestione_condv; @@ -39,7 +39,7 @@ protected: static bool handle_val(TMask_field &, KEY); public: - TEsercizi_contabili& exercise() { return (TEsercizi_contabili&) esercizi; } + TEsercizi_contabili& exercise() { return (TEsercizi_contabili&)_esercizi; } TMask_openclose(const bool ord) ; virtual ~TMask_openclose() {} }; @@ -47,8 +47,8 @@ public: TMask_openclose::TMask_openclose(const bool ord) : TMask("mg1400") { - ordaut = ord; - if (ordaut) + _ordaut = ord; + if (_ordaut) disable(-1); set_handler(F_DATECLOSE, handle_close); set_handler(F_DATEOPEN, handle_open); @@ -65,7 +65,7 @@ bool TMask_openclose::handle_close(TMask_field &fld, KEY k) TMask_openclose& mask = (TMask_openclose&)fld.mask(); if (k == K_ENTER || fld.to_check(k)) { - TEsercizi_contabili& ex = mask.esercizi; + TEsercizi_contabili& ex = mask.exercise(); TDate d(fld.get()); const int es_close = ex.date2esc(d); @@ -95,19 +95,19 @@ bool TMask_openclose::handle_open(TMask_field &fld, KEY k) TDate fi(mask.get(F_DATECLOSE)); if (k == K_ENTER && in <= fi ) return fld.warning_box ("La data di apertura del nuovo esercizio deve essere superiore alla data di chiusura dell'esercizio precedente"); - const int es_open = mask.esercizi.date2esc(in); + const int es_open = mask.exercise().date2esc(in); mask.set(F_ESTOOPEN, es_open); if (es_open == 0) return fld.error_box("La data indicata non appartiene a nessun esercizio"); - const int es_close = mask.esercizi.pred(es_open); + const int es_close = mask.exercise().pred(es_open); if (es_close == 0) return fld.error_box("Non esiste l'esercizio precedente per la data indicata."); // Setta data ed esercizio di chiusura mask.set(F_ESTOCLOSE,es_close); - mask.set(F_DATECLOSE, mask.esercizi.esercizio(es_close).fine()); + mask.set(F_DATECLOSE, mask.exercise().esercizio(es_close).fine()); } return TRUE; } @@ -125,10 +125,11 @@ void TMask_openclose::common_handler(TMask_field &fld) } else { + mask.enable(-6); mask.enable(-5, eb); mask.enable(-4, !eb); // Le causali degli ordini sono abilitate solo se NON c'e' il modulo ordini - if (mask.ordaut) + if (mask._ordaut) mask.disable(-1); if (eb) mask.reset(-4); @@ -192,7 +193,7 @@ class TApp_openclose : public TSkeleton_application TDate _date_to_open; action _what; bool _valorizza_comp; - TTipo_valorizz _calctype,_stotype; + TTipo_valorizz _calctype; protected: virtual bool create(); @@ -248,7 +249,7 @@ void TApp_openclose::compila_movimento(TMov_mag& currmov, TArticolo_giacenza& ar } // Currency delle mie brame... - TCurrency currency(ZERO, "_FIRM"); + TCurrency currency; // Aggiunge una nuova riga al movimento corrente TString codmagdep(rec.get(MAG_CODMAG)); @@ -346,7 +347,7 @@ void TApp_openclose::compila_movimento(TMov_mag& currmov, TArticolo_giacenza& ar default: break; } - if (qta != 0.0) + if (qta != 0.0 || (caus == CAUS_A_VAL && prezzo != ZERO)) { TRectype& riga = currmov.new_row(); TRecord_array& ums = art.um(); @@ -375,15 +376,15 @@ void TApp_openclose::chiudi_esercizio() TCursor cur(&rel); rel.lfile().set_curr(new TArticolo_giacenza()); // setta il Multirec come current della relazione - TString descr1, descr2; + TString descr1, descr2, codmag; int err = NOERR; TTable esc("ESC"); + TTable magazzini("MAG"); rebuild_balances(_es_to_close); // Cosi' ci assicuriamo che i saldi dell'esercizio vecchio siano a posto descr1.format(_what == definitiva ? "Apertura esercizio %s" : "Aggiornamento saldi esercizio %s", (const char*) _es_to_open); descr2 << descr1 << " in corso..."; - // cose specifiche per chiusura definitiva... // Reperisce l'ultimo movimento di magazzino per il numero di registrazione _movmag->last(); @@ -443,6 +444,63 @@ void TApp_openclose::chiudi_esercizio() compila_movimento(currmov, art, rec, i); } } + + // Aggiornamento storico + + // Zappa eventuali record già presenti. + art.storico(_es_to_open).destroy_rows(); + + // Ricostruisce lo storico per ogni magazzino possibile + for (magazzini.first(); !magazzini.eof(); magazzini.next()) + { + codmag = magazzini.get("CODTAB"); + if (codmag.len() > 3) + continue; // Salta i depositi + + switch (_calctype) + { + case valorizz_LIFO: + art.agg_storicoLIFO(_es_to_close, codmag, TRUE, _valorizza_comp); break; + case valorizz_FIFO: + art.agg_storicoFIFO(_es_to_close, codmag, TRUE, _valorizza_comp); break; + default: + { + real val; + switch (_calctype) + { + case valorizz_costmediopond: + val = art.costo_mediopond(_es_to_close, codmag, ""); + break; + case valorizz_costmedio: + val = art.costo_medio(_es_to_close, codmag, ""); + break; + case valorizz_ultcos: + val = art.ultimo_costo(_es_to_close); + break; + case valorizz_mediacos: + val = art.media_costi(_es_to_close); + break; + case valorizz_przlist: + val = art.prezzo_listino(_es_to_close, _catven, _codlis); + break; + case valorizz_coststd: + val = art.costo_standard(_es_to_close); + break; + case valorizz_LIFOa: + val = art.LIFO_annuale(_es_to_close, codmag, ""); + break; + case valorizz_FIFOa: + val = art.FIFO_annuale(_es_to_close, codmag, ""); + break; + default: break; + } + if (val != ZERO) + art.agg_storico(_es_to_close, codmag, TRUE, _valorizza_comp, val); + break; + } + } + } + prog->addstatus(1L); } delete prog; @@ -518,7 +576,6 @@ void TApp_openclose::main_loop() _es_to_close = _msk->get(F_ESTOCLOSE); _es_to_open = _msk->get(F_ESTOOPEN); _calctype = (TTipo_valorizz) _msk->get_int(F_VALORIZZAZIONE); - _stotype = (TTipo_valorizz) _msk->get_int(F_STOMET); _what = (action) _msk->get_int(F_WHAT); //Provvisoria o definitiva? _valorizza_comp= _msk->get(F_VALCOMP)=="C"; //Valorizza i componenti o i finiti _codlis = _msk->get(F_LIST); diff --git a/mg/mg1400.uml b/mg/mg1400.uml index e4f155949..2ecde743d 100755 --- a/mg/mg1400.uml +++ b/mg/mg1400.uml @@ -34,16 +34,16 @@ END LISTBOX F_VALORIZZAZIONE 27 BEGIN PROMPT 2 5 "Valorizzazione " - ITEM "5|Al costo medio ponderato" MESSAGE HIDE,2@|ENABLE,3@ - ITEM "4|Al costo medio acquisti" MESSAGE HIDE,2@|ENABLE,3@ - ITEM "0|All'ultimo costo" MESSAGE HIDE,2@|ENABLE,3@ - ITEM "1|Alla media dei costi" MESSAGE HIDE,2@|ENABLE,3@ - ITEM "2|Al prezzo di listino" MESSAGE SHOW,2@|ENABLE,3@ - ITEM "3|Al costo standard" MESSAGE HIDE,2@|ENABLE,3@ - ITEM "7|L.I.F.O. annuale" MESSAGE HIDE,2@|DISABLE,3@|COPY,F_STOMET - ITEM "6|F.I.F.O. annuale" MESSAGE HIDE,2@|DISABLE,3@|COPY,F_STOMET - ITEM "9|L.I.F.O. storico" MESSAGE HIDE,2@|DISABLE,3@|COPY,F_STOMET - ITEM "8|F.I.F.O. storico" MESSAGE HIDE,2@|DISABLE,3@|COPY,F_STOMET + ITEM "5|Al costo medio ponderato" MESSAGE HIDE,2@ + ITEM "4|Al costo medio acquisti" MESSAGE HIDE,2@ + ITEM "0|All'ultimo costo" MESSAGE HIDE,2@ + ITEM "1|Alla media dei costi" MESSAGE HIDE,2@ + ITEM "2|Al prezzo di listino" MESSAGE SHOW,2@ + ITEM "3|Al costo standard" MESSAGE HIDE,2@ + ITEM "7|L.I.F.O. annuale" MESSAGE HIDE,2@ + ITEM "6|F.I.F.O. annuale" MESSAGE HIDE,2@ + ITEM "9|L.I.F.O. storico" MESSAGE HIDE,2@ + ITEM "8|F.I.F.O. storico" MESSAGE HIDE,2@ /* TBI LIFO/FIFO ragionieristico ITEM "9|L.I.F.O. ragionieristico" MESSAGE HIDE,2@|DISABLE,3@|COPY,F_STOMET @@ -51,21 +51,6 @@ BEGIN */ END -LISTBOX F_STOMET 27 -BEGIN - PROMPT 2 6 "Storico " - ITEM "7|L.I.F.O. annuale" - ITEM "6|F.I.F.O. annuale" - ITEM "9|L.I.F.O. storico" - ITEM "8|F.I.F.O. storico" - /* - TBI LIFO/FIFO ragionieristico - ITEM "9|L.I.F.O. ragionieristico" - ITEM "10|F.I.F.O. ragionieristico" - */ - GROUP 3 -END - GROUPBOX DLG_NULL 22 4 BEGIN PROMPT 50 4 "Listino" @@ -136,7 +121,7 @@ BEGIN CHECKTYPE REQUIRED WARNING "La causale deve avere i segni: GIAC+, INCL+" ADD RUN MG0 -0 %CAU - GROUP 4 6 + GROUP 6 END STRING F_CAUACL 5 @@ -151,7 +136,7 @@ BEGIN CHECKTYPE REQUIRED WARNING "La causale deve avere i segni: GIAC-, ACL+" ADD RUN MG0 -0 %CAU - GROUP 4 6 + GROUP 6 END STRING F_CAUPRF 5 @@ -165,7 +150,7 @@ BEGIN OUTPUT F_CAUPRF CODTAB CHECKTYPE REQUIRED WARNING "La causale deve avere i segni: GIAC-, PRODF+" - GROUP 4 6 + GROUP 6 ADD RUN MG0 -0 %CAU END @@ -180,7 +165,7 @@ BEGIN OUTPUT F_CAUPRC CODTAB CHECKTYPE REQUIRED WARNING "La causale deve avere i segni: GIAC+, PRODC+" - GROUP 4 6 + GROUP 6 ADD RUN MG0 -0 %CAU END @@ -195,7 +180,7 @@ BEGIN OUTPUT F_CAUORF CODTAB CHECKTYPE REQUIRED WARNING "La causale deve avere il segno: ORDF+" - GROUP 1 4 6 + GROUP 1 6 ADD RUN MG0 -0 %CAU END @@ -210,7 +195,7 @@ BEGIN OUTPUT F_CAUORC CODTAB CHECKTYPE REQUIRED WARNING "La causale deve avere il segno: ORDC+" - GROUP 1 4 6 + GROUP 1 6 ADD RUN MG0 -0 %CAU END @@ -218,13 +203,13 @@ STRING F_CAUQTA 5 BEGIN PROMPT 3 12 "Movimentazione qta " FLAGS "U" - USE %CAU SELECT (B0 == "X") + USE %CAU SELECT (B0 == "X")&&(S2[23,23] == "+")&&(S2[1,1] == "+") INPUT CODTAB F_CAUQTA DISPLAY "Codice" CODTAB DISPLAY "Descrizione@50" S0 OUTPUT F_CAUQTA CODTAB CHECKTYPE REQUIRED - WARNING "La causale deve avere il flag di movimentazione quantità" + WARNING "La causale deve avere il flag di movimentazione quantità e i segni: GIAC+ RIMIN+" GROUP 5 6 FLAGS "D" ADD RUN MG0 -0 %CAU @@ -234,13 +219,13 @@ STRING F_CAUVAL 5 BEGIN PROMPT 43 12 "Movimentazione val " FLAGS "U" - USE %CAU SELECT (B1 == "X") + USE %CAU SELECT (B1 == "X")&&(S2[23,23] == "+")&&(S2[1,1] == "+") INPUT CODTAB F_CAUVAL DISPLAY "Codice" CODTAB DISPLAY "Descrizione@50" S0 OUTPUT F_CAUVAL CODTAB CHECKTYPE REQUIRED - WARNING "La causale deve avere il flag di movimentazione valore" + WARNING "La causale deve avere il flag di movimentazione valore e i segni: GIAC+ RIMIN+" GROUP 5 6 FLAGS "D" ADD RUN MG0 -0 %CAU @@ -251,7 +236,7 @@ BEGIN PROMPT 3 14 "Valorizzo " ITEM "C|i componenti impegnati in produzione" ITEM "F|i finiti in fase di produzione" - GROUP 4 +// GROUP 4 END BUTTON DLG_OK 10 2 diff --git a/mg/mg3100.cpp b/mg/mg3100.cpp index d73690924..0869b7648 100755 --- a/mg/mg3100.cpp +++ b/mg/mg3100.cpp @@ -82,13 +82,13 @@ TStampadatist_mask::TStampadatist_mask(): set_handler(F_ORDINE, handle_ragg); set_handler(F_ORDINEART,handle_subord); set_handler(F_FILTRO,handle_filt); - if (!artlev().enabled()) { + if (!livelli_articolo().enabled()) { TMask_field &f1=field(F_RAGGCODICE); f1.reset(); f1.check();f1.hide(); field(F_FROMLIVELLOART).hide(); field(F_TOLIVELLOART).hide(); } - if (!giaclev().enabled()) { + if (!livelli_giacenza().enabled()) { TMask_field &f2=field(F_RAGGLIVGIAC); f2.reset(); f2.check();f2.hide(); field(F_FROMLIVELLOGIAC).hide(); @@ -426,13 +426,13 @@ void TStampa_datistorici::setprint_perarticoli() case 'D': _form->find_field('B',odd_page,"H_CATMER").hide(); _form->find_field('B',odd_page,"TOT_CATMER").hide(); - _form->set_ordering(normale); + _form->set_ordering(mg_normale); break; case 'M': case 'S': _form->find_field('B',odd_page,"H_CATMER").show(); _form->find_field('B',odd_page,"TOT_CATMER").show(); - _form->set_ordering(subordine == 'M' ? cat_merc : scat_merc); + _form->set_ordering(subordine == 'M' ? mg_cat_merc : mg_scat_merc); espr.format("%d->%s", LF_ANAMAG, subordine == 'M' ? "GRMERC[1,3]" : "GRMERC"); _form->find_field('B',odd_page,"GRUPPI_CATMER").setcondition(espr,_strexpr); @@ -505,13 +505,13 @@ void TStampa_datistorici::setprint_perarticoli_all() if (_mask->get_bool(F_RAGGCODICE)) { if (_mask->get_int(F_TOLIVELLOART)) - sortexp << "[" << _mask->artlev().packed_length(_mask->get_int(F_TOLIVELLOART)) << "]"; + sortexp << "[" << livelli_articolo().packed_length(_mask->get_int(F_TOLIVELLOART)) << "]"; } if (_mask->get_bool(F_RAGGLIVGIAC)) { sortexp << "|LIVELLO" ; if (_mask->get_int(F_TOLIVELLOGIAC)) - sortexp << "[1," << _mask->artlev().packed_length(_mask->get_int(F_TOLIVELLOGIAC)) << "]"; + sortexp << "[1," << livelli_articolo().packed_length(_mask->get_int(F_TOLIVELLOGIAC)) << "]"; } sortexp << "|CODMAG"; char filtro_articoli=*_mask->get(F_FILTRO); @@ -574,7 +574,7 @@ void TStampa_datistorici::setprint_perarticoli_all() arec.put("CODART",_mask->get(F_AART)); _form->find_field('B',odd_page,"H_CATMER").hide(); _form->find_field('B',odd_page,"TOT_CATMER").hide(); - _form->set_ordering(normale); + _form->set_ordering(mg_normale); if (!_mask->get(F_DAART).blank()) srangea << "da \"" << _mask->get(F_DAART) << "\" "; if (!_mask->get(F_AART).blank()) @@ -586,7 +586,7 @@ void TStampa_datistorici::setprint_perarticoli_all() arec.put("DESCR",_mask->get(F_ADES)); _form->find_field('B',odd_page,"H_CATMER").disable(); _form->find_field('B',odd_page,"TOT_CATMER").hide(); - _form->set_ordering(normale); + _form->set_ordering(mg_normale); if (!_mask->get(F_DADES).blank()) srangea << "da \"" << _mask->get(F_DADES) << "\" "; if (!_mask->get(F_ADES).blank()) @@ -599,7 +599,7 @@ void TStampa_datistorici::setprint_perarticoli_all() arec.put("GRMERC",_mask->get(F_ACATMER)); _form->find_field('B',odd_page,"H_CATMER").show(); _form->find_field('B',odd_page,"TOT_CATMER").show(); - _form->set_ordering(subordine == 'M' ? cat_merc : scat_merc); + _form->set_ordering(subordine == 'M' ? mg_cat_merc : mg_scat_merc); if (!_mask->get(F_DAART).blank()) { diff --git a/mg/mg3200.cpp b/mg/mg3200.cpp index 42c746216..f0a7aa344 100755 --- a/mg/mg3200.cpp +++ b/mg/mg3200.cpp @@ -247,13 +247,13 @@ void TStampa_disp::setprint_perarticoli() if (_mask->get_bool(F_RAGGCODICE)) { if (_mask->get_int(F_TOLIVELLOART)) - sortexp << "[" << _mask->artlev().packed_length(_mask->get_int(F_TOLIVELLOART)) << "]"; + sortexp << "[" << livelli_articolo().packed_length(_mask->get_int(F_TOLIVELLOART)) << "]"; } if (_mask->get_bool(F_RAGGLIVGIAC)) { sortexp << "|LIVELLO" ; if (_mask->get_int(F_TOLIVELLOGIAC)) - sortexp << "[1," << _mask->artlev().packed_length(_mask->get_int(F_TOLIVELLOGIAC)) << "]"; + sortexp << "[1," << livelli_articolo().packed_length(_mask->get_int(F_TOLIVELLOGIAC)) << "]"; } sortexp << "|CODMAG"; char subordine=*_mask->get(F_ORDINEART); @@ -290,7 +290,7 @@ void TStampa_disp::setprint_perarticoli() arec.put("CODART",_mask->get(F_AART)); _form->find_field('B',odd_page,"H_CATMER").hide(); _form->find_field('B',odd_page,"TOT_CATMER").hide(); - _form->set_ordering(normale); + _form->set_ordering(mg_normale); if (!_mask->get(F_DAART).blank()) srangea << "da \"" << _mask->get(F_DAART) << "\" "; if (!_mask->get(F_AART).blank()) @@ -302,7 +302,7 @@ void TStampa_disp::setprint_perarticoli() arec.put("DESCR",_mask->get(F_ADES)); _form->find_field('B',odd_page,"H_CATMER").disable(); _form->find_field('B',odd_page,"TOT_CATMER").hide(); - _form->set_ordering(normale); + _form->set_ordering(mg_normale); if (!_mask->get(F_DADES).blank()) srangea << "da \"" << _mask->get(F_DADES) << "\" "; if (!_mask->get(F_ADES).blank()) @@ -314,7 +314,7 @@ void TStampa_disp::setprint_perarticoli() arec.put("GRMERC",_mask->get(F_ACATMER)); _form->find_field('B',odd_page,"H_CATMER").show(); _form->find_field('B',odd_page,"TOT_CATMER").show(); - _form->set_ordering(cat_merc); + _form->set_ordering(mg_cat_merc); if (!_mask->get(F_DAART).blank()) { srangea << "da \"" << _mask->get(F_DAART) << "\" "; diff --git a/mg/mg3300.cpp b/mg/mg3300.cpp index 902f6f988..97f1bce71 100755 --- a/mg/mg3300.cpp +++ b/mg/mg3300.cpp @@ -102,20 +102,20 @@ bool TForm_schedemag::validate(TForm_item &cf, TToken_string &s) } if (subcode=="GRUPPOART") { TString valore; - if (_tolivart==artlev().last_level()) + if (_tolivart==livelli_articolo().last_level()) valore=relation()->lfile(LF_ANAMAG).get("DESCR"); else - valore=artlev().group_descr_packed(relation()->lfile(LF_ANAMAG).get("CODART"),_tolivart); + valore=livelli_articolo().group_descr_packed(relation()->lfile(LF_ANAMAG).get("CODART"),_tolivart); cf.set(valore); return TRUE; } if (subcode=="CODGRUPPOGIAC") { TString valore,levname; int livello=_tolivgiac; - levname=giaclev().name(livello); + levname=livelli_giacenza().name(livello); add_giaclev(levname,1,livello); levname << ' '; - valore=giaclev().unpack_grpcode(relation()->lfile(LF_MAG).get("LIVELLO"),livello); + valore=livelli_giacenza().unpack_grpcode(relation()->lfile(LF_MAG).get("LIVELLO"),livello); if (valore.empty()) valore = UNKNOWN_NAME; cf.set(levname << valore); @@ -125,14 +125,14 @@ bool TForm_schedemag::validate(TForm_item &cf, TToken_string &s) } if (subcode=="CODGRUPPOART") { TString valore(relation()->lfile(LF_ANAMAG).get("CODART")); - if (artlev().enabled()) - valore.cut(min(valore.len(),artlev().packed_length(_tolivart))); + if (livelli_articolo().enabled()) + valore.cut(min(valore.len(),livelli_articolo().packed_length(_tolivart))); cf.set(valore); return TRUE; } if (subcode=="GRUPPOGIAC") { TString valore; - valore=giaclev().group_descr_packed(relation()->lfile(LF_RMOVMAG).get("LIVGIAC"),_tolivgiac); + valore=livelli_giacenza().group_descr_packed(relation()->lfile(LF_RMOVMAG).get("LIVGIAC"),_tolivgiac); cf.set(valore); return TRUE; } @@ -182,6 +182,24 @@ bool TForm_schedemag::validate(TForm_item &cf, TToken_string &s) } return TRUE; } + + if (subcode.left(3) == "ADD") + { + TCausale_magazzino &ccrr=(TCausale_magazzino &)_causali_mag->get(cf.section().find_field(FF_CAUSALE_RIGA).get()); + const bool is_qta = subcode.right(3) == "QTA"; + const short fld = atoi(s.get(2)); + + const bool ok = is_qta && ccrr.update_qta() || !is_qta && ccrr.update_val(); + + if (ok) + { + real v1(cf.get()); + real v2(cf.section().find_field(fld).get()); + + v2 += v1; + cf.section().find_field(fld).set(v2.string()); + } + } } return TForm_stampemg::validate(cf, s); } @@ -193,20 +211,20 @@ bool TForm_schedemag::ragg_exprs(int livart,int livgiac) // *********** int tolivart,tolivgiac; - tolivart =livart ? livart : artlev().last_level() ; - tolivgiac=livgiac ? livgiac : giaclev().last_level(); + tolivart =livart ? livart : livelli_articolo().last_level() ; + tolivgiac=livgiac ? livgiac : livelli_giacenza().last_level(); // sezioni livello codice piece="CODART"; - if (artlev().enabled()) - piece << "[1," << artlev().packed_length(tolivart) <<']'; + if (livelli_articolo().enabled()) + piece << "[1," << livelli_articolo().packed_length(tolivart) <<']'; *_rmov_raggcond<< (_rmov_raggcond->empty()? "":"+" )<add(piece); _rmov_joinexp->cut(0) << piece << "==" << piece; if (livart==0) { piece="LIVGIAC"; - if (giaclev().enabled()) - piece << "[1," << giaclev().packed_length(tolivgiac) <<']'; + if (livelli_giacenza().enabled()) + piece << "[1," << livelli_giacenza().packed_length(tolivgiac) <<']'; *_rmov_raggcond << '+' << piece; _rmov_sortexp->add(piece); } @@ -222,7 +240,7 @@ void TForm_schedemag::setdett_permag(bool sudd_dep,bool show_dett,int livart,int TForm_subsection &h_a=(TForm_subsection &)find_field('B',odd_page,"HEADER_ARTICOLO"); h_a.enable(show_dett); TForm_subsection &h_g=(TForm_subsection &)find_field('B',odd_page,"HEADER_LIVGIAC"); - h_g.enable(giaclev().enabled() && (livart ==0 || livgiac !=0 )); + h_g.enable(livelli_giacenza().enabled() && (livart ==0 || livgiac !=0 )); *_rmov_raggcond="CODMAG[1,3]"; _rmov_sortexp->add("CODMAG[1,3]"); @@ -244,8 +262,8 @@ void TForm_schedemag::setdett_permag(bool sudd_dep,bool show_dett,int livart,int _rmov_sortexp->add(cond); _rmov_sortexp->add("NUMREG"); - _tolivart=livart ? livart :artlev().last_level() ; - _tolivgiac=livgiac ? livgiac :giaclev().last_level(); + _tolivart=livart ? livart :livelli_articolo().last_level() ; + _tolivgiac=livgiac ? livgiac :livelli_giacenza().last_level(); } @@ -260,7 +278,7 @@ void TForm_schedemag::setdett_percatmer(bool sottocat,int livart,int livgiac,boo h_g.enable(livart ==0 || livgiac !=0 || sudd_mag); h_g.set_newpage(livart ==0 || livgiac !=0 || sudd_mag); TForm_subsection &h_l=(TForm_subsection &)find_field('B',odd_page,"HEADER_LIVGIAC"); - h_l.enable(giaclev().enabled() && (livgiac !=0 ||livart ==0)); + h_l.enable(livelli_giacenza().enabled() && (livgiac !=0 ||livart ==0)); TForm_subsection &h_m=(TForm_subsection &)find_field('B',odd_page,"HEADER_MAG"); h_m.enable(sudd_mag ); TForm_subsection &h_d=(TForm_subsection &)find_field('B',odd_page,"HEADER_DEP"); @@ -293,8 +311,8 @@ void TForm_schedemag::setdett_percatmer(bool sottocat,int livart,int livgiac,boo _rmov_sortexp->add("NUMREG"); _rmov_sortexp->add("CAUS"); - _tolivart=livart ? livart :artlev().last_level() ; - _tolivgiac=livgiac ? livgiac :giaclev().last_level(); + _tolivart=livart ? livart :livelli_articolo().last_level() ; + _tolivgiac=livgiac ? livgiac :livelli_giacenza().last_level(); _sottocatmer=sottocat; } @@ -317,7 +335,7 @@ void TForm_schedemag::setdett_perart(bool percatmer,bool sottocatmer,int livart, h_g.enable(livart ==0 || livgiac !=0 || sudd_mag); h_g.set_newpage(livart ==0 || livgiac !=0 || sudd_mag); TForm_subsection &h_l=(TForm_subsection &)find_field('B',odd_page,"HEADER_LIVGIAC"); - h_l.enable(giaclev().enabled() && (livart ==0 || livgiac !=0 )); + h_l.enable(livelli_giacenza().enabled() && (livart ==0 || livgiac !=0 )); TForm_subsection &h_m=(TForm_subsection &)find_field('B',odd_page,"HEADER_MAG"); h_m.enable(sudd_mag ); TForm_subsection &h_d=(TForm_subsection &)find_field('B',odd_page,"HEADER_DEP"); @@ -326,8 +344,8 @@ void TForm_schedemag::setdett_perart(bool percatmer,bool sottocatmer,int livart, TForm_subsection &t_s=(TForm_subsection &)find_field('B',odd_page,"TOTALI_GRMOV"); t_s.show(livart==0 || livgiac !=0 || sudd_mag); - _tolivart=livart ? livart :artlev().last_level() ; - _tolivgiac=livgiac ? livgiac :giaclev().last_level(); + _tolivart=livart ? livart :livelli_articolo().last_level() ; + _tolivgiac=livgiac ? livgiac :livelli_giacenza().last_level(); _sottocatmer=sottocatmer; // settaggio catmer/ragg codice @@ -338,7 +356,7 @@ void TForm_schedemag::setdett_perart(bool percatmer,bool sottocatmer,int livart, catmercod << (sottocatmer ? "[1,3]" :""); cond << catmercod << '+'; } - cond << "CODART[1," << artlev().packed_length(_tolivart) << ']'; + cond << "CODART[1," << livelli_articolo().packed_length(_tolivart) << ']'; s.setcondition(cond,_strexpr); } // settaggio raggruppamenti codice sulla scheda @@ -621,9 +639,9 @@ void TStampa_schede_mag::main_loop() { char dettaglio=_mask->get(F_ENABLER)[0]; if (dettaglio=='A' && _mask->get_int(F_TOLIVELLOART)==0) - _mask->set(F_TOLIVELLOART,_mask->artlev().last_level()); + _mask->set(F_TOLIVELLOART,livelli_articolo().last_level()); if (dettaglio=='G' && _mask->get_int(F_TOLIVELLOGIAC)==0) - _mask->set(F_TOLIVELLOGIAC,_mask->giaclev().last_level()); + _mask->set(F_TOLIVELLOGIAC,livelli_giacenza().last_level()); if (*_mask->get(F_ORDINE)=='A') { _form = new TForm_schedemag("mg3300a", "") ; diff --git a/mg/mg3300a.frm b/mg/mg3300a.frm index 00f5c2ade..40cd1882c 100755 --- a/mg/mg3300a.frm +++ b/mg/mg3300a.frm @@ -341,7 +341,7 @@ SECTION BODY ODD 0 NUMBER 105 12 BEGIN PROMPT 54 1 "" - PICTURE "###.###.###" + PICTURE "###.###.###" MESSAGE _NUMEXPR,LF_RMOVMAG->QUANT*LF_RMOVMAG->PREZZO|_USER,*SEGNOCAUS|ADD,FF_VALORE_MOV END END // sezione movimenti di competenza @@ -356,7 +356,7 @@ SECTION BODY ODD 0 BEGIN PROMPT 46 1 "" PICTURE "###.##@,@##" - MESSAGE _USER,SALDOPREC + MESSAGE _USER,SALDOPREC|ADD,FF_SALDO_GRMOV END NUMBER 101 12 BEGIN @@ -391,7 +391,7 @@ SECTION BODY ODD 0 NUMERO FF_CODCF_MOV 6 BEGIN PROMPT 62 1 "" - PICTURE "######" + PICTURE "######" END STRINGA FF_CLIFO_MOV 50 BEGIN @@ -416,13 +416,13 @@ SECTION BODY ODD 0 BEGIN PROMPT 46 1 "" PICTURE "###.##@,@##" - MESSAGE ADD,FF_SALDO_GRMOV + MESSAGE _USER,ADDQTA,FF_SALDO_GRMOV END NUMBER FF_VALORE_MOV 12 BEGIN PROMPT 69 1 "" PICTURE "###.###.##@" - MESSAGE ADD,FF_VALORE_GRMOV + MESSAGE _USER,ADDVAL,FF_VALORE_GRMOV END NUMBER 100 12 BEGIN diff --git a/mg/mg3300b.frm b/mg/mg3300b.frm index 5fc40bdc5..67ddcba36 100755 --- a/mg/mg3300b.frm +++ b/mg/mg3300b.frm @@ -193,6 +193,8 @@ SECTION BODY ODD 2 END SECTION GRUPPI_RMOVMAG 1 0 0 FILE LF_RMOVMAG GROUP CODMAG+CODART + SECTION H_MOVS_INTERESSATI 1 0 0 STREXPR LF_MOVMAG->DATAREG>"" + NUMERO 10 BEGIN FLAGS "H" @@ -221,7 +223,8 @@ SECTION BODY ODD 2 FLAGS "H" MESSAGE _USER,DESCRCAUSALE|COPY,FF_DESCRCAUSALE END - + END // header mov + SECTION MOVIMENTO 1 0 0 FILE LF_RMOVMAG GROUP NUMREG NUMBER FF_QUANTRIGA 12 @@ -254,7 +257,7 @@ SECTION BODY ODD 2 BEGIN PROMPT 31 1 "" PICTURE "###.##@,@##" - MESSAGE _USER,SALDOPREC + MESSAGE _USER,SALDOPREC|ADD,FF_SALDO_GART END NUMBER 101 12 BEGIN @@ -331,13 +334,13 @@ SECTION BODY ODD 2 BEGIN PROMPT 46 2 "" PICTURE "###.##@,@##" - MESSAGE ADD,FF_SALDO_GART + MESSAGE _USER,ADDQTA,FF_SALDO_GART END NUMBER FF_VALORE_MOV 12 BEGIN PROMPT 69 2 "" PICTURE "###.###.##@" - MESSAGE ADD,FF_VALORE_GART + MESSAGE _USER,ADDVAL,FF_VALORE_GART END NUMBER 100 12 BEGIN diff --git a/mg/mg3500.cpp b/mg/mg3500.cpp index 6d63ae495..fdc1eb110 100755 --- a/mg/mg3500.cpp +++ b/mg/mg3500.cpp @@ -144,11 +144,11 @@ void TStampa_storgiac::main_loop() _form->find_field('B',odd_page,"TOT_SCATMER").hide(); _form->find_field('B',odd_page,"GRUPPI_SCATMER").setcondition("CODART[1,1]",_strexpr); } - _form->set_ordering(cat_merc); + _form->set_ordering(mg_cat_merc); } break; case 'R': - _form->set_ordering(ragg_fisc);// Setta la subsection in modo da raggruppare per RAGGFIS + _form->set_ordering(mg_ragg_fisc);// Setta la subsection in modo da raggruppare per RAGGFIS _form->use_alternate_cursor(); _cur = _form->cursor(); _cur->setkey(1); diff --git a/mg/mg4200.cpp b/mg/mg4200.cpp index 2cc3c90a2..45482cd7d 100755 --- a/mg/mg4200.cpp +++ b/mg/mg4200.cpp @@ -535,7 +535,7 @@ void TStampa_inventario::setprint_permagazzini() else espr1 = "ANNOES|CODMAG|CODART|LIVELLO"; _form->find_field('B',odd_page,"GRUPPI_SCATMER").setcondition("CODART",_strexpr); - _form->set_ordering(normale); + _form->set_ordering(mg_normale); break; case 'S': case 'M': @@ -549,7 +549,7 @@ void TStampa_inventario::setprint_permagazzini() espr1.format("ANNOES|CODMAG[1,3]|%d->GRMERC|CODART|LIVELLO|CODMAG[4,5]", LF_ANAMAG); else espr1.format("ANNOES|CODMAG|%d->GRMERC|CODART|LIVELLO", LF_ANAMAG); - _form->set_ordering(cat_merc); + _form->set_ordering(mg_cat_merc); espr2.format("CODMAG[1,3]+CODMAG[1,5]+%d->GRMERC[1,3]", LF_ANAMAG); _form->find_field('B',odd_page,"GRUPPI_CATMER").setcondition(espr2,_strexpr); if (subordine == 'S') @@ -585,7 +585,7 @@ void TStampa_inventario::setprint_permagazzini() espr1.format("ANNOES|CODMAG[1,3]|%d->RAGGFIS|CODART|LIVELLO|CODMAG[4,5]",LF_ANAMAG); else espr1.format("ANNOES|CODMAG|%d->RAGGFIS|CODART|LIVELLO|CODMAG[4,5]",LF_ANAMAG); - _form->set_ordering(ragg_fisc); + _form->set_ordering(mg_ragg_fisc); espr2.format("CODMAG[1,3]+CODMAG[1,5]+%d->RAGGFIS", LF_ANAMAG); _form->find_field('B',odd_page,"GRUPPI_CATMER").setcondition(espr2,_strexpr); _form->find_field('B',odd_page,"GRUPPI_SCATMER").setcondition(espr2,_strexpr); @@ -649,7 +649,7 @@ void TStampa_inventario::setprint_perarticoli() _form->find_field('B',odd_page,"TOT_SCATMER").hide(); espr1 = "ANNOES|CODART|LIVELLO|CODMAG"; _form->find_field('B',odd_page,"GRUPPI_SCATMER").setcondition("CODART",_strexpr); - _form->set_ordering(normale); + _form->set_ordering(mg_normale); break; case 'S': case 'M': @@ -660,7 +660,7 @@ void TStampa_inventario::setprint_perarticoli() _form->find_field('B',odd_page,"H_CATMER").show(); _form->find_field('B',odd_page,"TOT_CATMER").show(); espr1.format("ANNOES|%d->GRMERC|CODART|LIVELLO|CODMAG", LF_ANAMAG); - _form->set_ordering(cat_merc); + _form->set_ordering(mg_cat_merc); espr2.format("%d->GRMERC[1,3]", LF_ANAMAG); _form->find_field('B',odd_page,"GRUPPI_CATMER").setcondition(espr2,_strexpr); if (subordine == 'S') @@ -693,7 +693,7 @@ void TStampa_inventario::setprint_perarticoli() _form->find_field('B',odd_page,"H_SCATMER").hide(); _form->find_field('B',odd_page,"TOT_SCATMER").hide(); espr1.format("ANNOES|%d->RAGGFIS|CODART|LIVELLO|CODMAG",LF_ANAMAG); - _form->set_ordering(ragg_fisc); + _form->set_ordering(mg_ragg_fisc); espr2.format("%d->RAGGFIS", LF_ANAMAG); _form->find_field('B',odd_page,"GRUPPI_CATMER").setcondition(espr2,_strexpr); _form->find_field('B',odd_page,"GRUPPI_SCATMER").setcondition(espr2,_strexpr); @@ -762,7 +762,7 @@ void TStampa_inventario::setprint_perarticoli_all() _form->find_field('B',odd_page,"H_SCATMER").hide(); _form->find_field('B',odd_page,"TOT_SCATMER").hide(); _form->find_field('B',odd_page,"GRUPPI_SCATMER").setcondition("CODART",_strexpr); - _form->set_ordering(normale); + _form->set_ordering(mg_normale); break; case 'D': _cur->setkey(2); @@ -773,7 +773,7 @@ void TStampa_inventario::setprint_perarticoli_all() _form->find_field('B',odd_page,"H_SCATMER").hide(); _form->find_field('B',odd_page,"TOT_SCATMER").hide(); _form->find_field('B',odd_page,"GRUPPI_SCATMER").setcondition("CODART",_strexpr); - _form->set_ordering(normale); + _form->set_ordering(mg_normale); break; case 'S': case 'M': @@ -812,13 +812,13 @@ void TStampa_inventario::setprint_perarticoli_all() _form->find_field('B',odd_page,"TOT_SCATMER").hide(); _form->find_field('B',odd_page,"GRUPPI_SCATMER").setcondition("CODART",_strexpr); } - _form->set_ordering(cat_merc); + _form->set_ordering(mg_cat_merc); } break; case 'R': { //TString filter_expr; - _form->set_ordering(ragg_fisc);// Setta la subsection in modo da raggruppare per RAGGFIS + _form->set_ordering(mg_ragg_fisc);// Setta la subsection in modo da raggruppare per RAGGFIS _form->use_alternate_cursor(); _cur = _form->cursor(); // Setta il cursore sortato per questo ordinamento... siccome non esiste una chiave RAGGFIS+CODART _cur->setkey(1); diff --git a/mg/mg4300.cpp b/mg/mg4300.cpp index 9c1c8b582..ffe6e2917 100755 --- a/mg/mg4300.cpp +++ b/mg/mg4300.cpp @@ -190,15 +190,15 @@ bool TGiornalemag::validate(TForm_item &cf, TToken_string &s) { for (int lev=1; lev <= livello_giac; lev++) { - if (!giofrm->giaclev().enabled(lev)) + if (!livelli_giacenza().enabled(lev)) continue; - const int starts = giofrm->giaclev().code_start(lev) -1; - const int length = giofrm->giaclev().code_length(lev); + const int starts = livelli_giacenza().code_start(lev) -1; + const int length = livelli_giacenza().code_length(lev); valore << livello.mid(starts,length); valore << "/"; } - valore << giofrm->giaclev().name(livello_giac); - valore << " " << giofrm->giaclev().group_descr_packed(livello,livello_giac) << " "; + valore << livelli_giacenza().name(livello_giac); + valore << " " << livelli_giacenza().group_descr_packed(livello,livello_giac) << " "; } } else { if (ragg_classi) @@ -289,7 +289,7 @@ const char * TGiornalemag::get_fiscfield(TVariable_rectype & r) TString c2(cur->relation()->lfile(LF_RMOVMAG).get("LIVGIAC")); if (livello_giac) - *valore << giofrm->giaclev().unpack_grpcode(c2, livello_giac); + *valore << livelli_giacenza().unpack_grpcode(c2, livello_giac); } else { @@ -494,7 +494,7 @@ bool TStampa_giornalemag::create() { open_files(LF_ANAMAG, LF_MOVMAG, LF_RMOVMAG, LF_TAB, LF_TABCOM, 0); _mask = new TStampemg_mask("mg4300"); - _mask->show(F_TOLIVELLOGIAC, _mask->giaclev().enabled()); // Abilita la gestione del dettaglio livello giacenza + _mask->show(F_TOLIVELLOGIAC, livelli_giacenza().enabled()); // Abilita la gestione del dettaglio livello giacenza return TSkeleton_application::create(); } diff --git a/mg/mglib.h b/mg/mglib.h index f8ac002fa..651747397 100755 --- a/mg/mglib.h +++ b/mg/mglib.h @@ -144,16 +144,20 @@ protected: void reset_anno_sto () { set_anno_sto();} bool is_last_esercizio(const char* annoes) const; - void copia_storico(TString & newanno, const char * annoes,const char * codmag); - void add_storico(const char * annorif,const char * annoes,const char * codmag, const real & qta, const real & prz); + void copia_storico(TRecord_array& nrstorico, const char * annoes,const char * codmag); + void add_storico(TRecord_array& nrstorico, const char * annoes,const char * codmag, const real & qta, const real & prz); public: virtual TObject* dup() const { return new TArticolo_giacenza(codice()); } virtual void zero(char c = '\0'); + int find_mag(TRecord_array& rmag, const char * codmag = NULL, const char * livello = NULL, int from = 0) const ; + int find_storico(TRecord_array& rsto, const char * codmag = NULL, int from = 0) const; + int find_mag(const char * annoes, const char * codmag = NULL, const char * livello = NULL, int from = 0) const ; - int find_storico(const char * annoesrif, const char * annoes = NULL, const char * codmag = NULL, int from = 0) const; + int find_storico(const char * annoesrif, const char * codmag = NULL, int from = 0) const; + TRecord_array & mag(const char * annoes) const; TRecord_array & storico(const char * annoesrif) const; @@ -188,10 +192,9 @@ public: bool giacenza_effettiva = TRUE, bool valorizza_componenti = TRUE) const; real FIFO_ragionieristico(const char * annoes, const char * codmag, const char * livello, bool giacenza_effettiva = TRUE, bool valorizza_componenti = TRUE) const; - void agg_storicoLIFOa(const char * annoes, const char * codmag, bool giac_eff, bool valorizza_componenti) ; - void agg_storicoFIFOa(const char * annoes, const char * codmag, bool giac_eff, bool valorizza_componenti) ; void agg_storicoLIFO (const char * annoes, const char * codmag, bool giac_eff, bool valorizza_componenti) ; void agg_storicoFIFO (const char * annoes, const char * codmag, bool giac_eff, bool valorizza_componenti) ; + void agg_storico(const char * annoes, const char * codmag, bool giac_eff, bool valorizza_componenti, const real& val) ; real giacenza_corretta(const TRectype & rec ,bool giacenza_effettiva,bool valorizza_componenti) const ; @@ -199,7 +202,8 @@ public: void put_costo_standard(const real& costo); real giacenza_anno(const char* codmag, const char* livello, int anno) const; - real scorta_minima(const char* codmag, const char* livello, int anno) const; + real scorta_minima(const char* codmag, const char* livello, int anno=0, bool liv_riordino=FALSE) const; + long lead_time(const char* codmag, const char* livello, int anno=0) const; TArticolo_giacenza(const char* codice = NULL); TArticolo_giacenza(const TRectype& rec); @@ -312,6 +316,11 @@ public: const TString & group_descr(const char * code, int levnum) const; const TString & group_descr_packed(const char * packed_code, int levnum) const; + + // Setta il prompt del campo sulla maschera + void set_mask_field(TMask &m,int field, int lev) const; + // Setta i prompt dei campi livelli di codice sulla maschera + void set_mask_fields(TMask &m,int firstfield) const; // Setta la colonna del campo livello codice di uno sheet in base alle abilitazioni void set_sheetcolumn(TSheet_field &fld_righe,int field, int lev) const; // Setta le colonne dei campi livello codice di uno sheet in base alle abilitazioni @@ -325,7 +334,7 @@ public: TString build_tabcode_packed(const TString & pcode, const int levnum) const ; // Restituisce il formato previsto per il codice (default==ultimo livello) - const char * code_format(int levnum=-1) const ; + const char* code_format(int levnum=-1) const ; // Restituisce se

e' riconosciuto come codice articolo (default==ultimo livello) bool fit_to_format(const char *codepart, int levnum=-1) const ; // Ritorna se il livello è abilitato all'autoinserimento @@ -541,10 +550,10 @@ bool rebuild_balances(const TString& annoes, #define UNKNOWN_NAME "-" typedef enum { - normale, // Codice o descrizione - ragg_fisc, // Raggr. Fiscale + Codice Articolo - cat_merc, // Cat. Merceologica[1..3] + Codice Articolo - scat_merc // Cat. Merceologica[1..5] + Codice Articolo + mg_normale, // Codice o descrizione + mg_ragg_fisc, // Raggr. Fiscale + Codice Articolo + mg_cat_merc, // Cat. Merceologica[1..3] + Codice Articolo + mg_scat_merc // Cat. Merceologica[1..5] + Codice Articolo } TTipo_ordinamento_mg; class TForm_stampemg : public TForm @@ -555,15 +564,10 @@ class TForm_stampemg : public TForm //sostituire con le funzioni di TLivelli_... : //TDecoder *_giacgrp,*_artgrp; - TCodart_livelli * _artlev; - TCodgiac_livelli * _giaclev; - protected: bool setdettaglio(bool show, int fromlivart,int livart,int fromlivgiac,int livgiac,bool dettgiac); void add_giaclev(TString &levname,int from,int to); public: - TCodart_livelli & artlev() {return *_artlev;} - TCodgiac_livelli & giaclev(){return *_giaclev;} public: void gruppogiac(TForm_item &cf, TToken_string &s); @@ -581,21 +585,17 @@ public: class TStampemg_mask: public TMask { - TCodgiac_livelli _giaclev; - TCodart_livelli _artlev; TMagazzini _magazz_ini; public: void enable_livellicodice() ; void set_livellicodice() ; - TCodgiac_livelli &giaclev() {return _giaclev;} - TCodart_livelli &artlev() {return _artlev;} TMagazzini & magazz_ini() {return _magazz_ini;} TStampemg_mask(const char * name) : TMask(name){;} virtual ~TStampemg_mask(){} }; - - +TCodgiac_livelli &livelli_giacenza(); +TCodart_livelli &livelli_articolo(); class TCondizione_vendita : public TObject { @@ -613,7 +613,7 @@ class TCondizione_vendita : public TObject TConfig * _config_ditta; bool _load_mask; - bool cerca(int tiporicerca,const char * cod, const real & qta); + bool cerca(int tiporicerca,const char * cod, const real & qta, const char *um=NULL); protected: diff --git a/mg/mglib01.cpp b/mg/mglib01.cpp index fab324a48..979e18403 100755 --- a/mg/mglib01.cpp +++ b/mg/mglib01.cpp @@ -811,14 +811,9 @@ TString TCodice_livelli::unpack_grpcode(const TString& pc, const int levnum) con int start=0; for (int i=1; _lev_enabled && i=pc.len()) - return(""); - else - { - if (levnum < 1 || levnum > _last_level ) - return(""); - return(pc.mid(start,levnum == _last_level ? -1 : _code_length[levnum-1])); - } + if (start >= pc.len() || levnum < 1 || levnum > _last_level) + return EMPTY_STRING; + return pc.mid(start,levnum == _last_level ? -1 : _code_length[levnum-1]); } TString TCodice_livelli::build_tabcode(const TString & gcode, const int levnum) const @@ -867,16 +862,22 @@ const int TCodice_livelli::group_search_packed(const char * packed_code, int lev void TCodice_livelli::set_sheetcolumn(TSheet_field &fld_righe,int field, int lev) const { - CHECK(lev <= max_levels() && lev > 0,"I codici livello partono da 1") ; + TMask& sm = fld_righe.sheet_mask(); + TEdit_field& fld = sm.efield(field); if (enabled(lev)) { - fld_righe.sheet_mask().field(field).show(); - fld_righe.set_column_header(field,name(lev)); - fld_righe.sheet_mask().field(field).set_prompt(name(lev)); + const TString& header = name(lev); + fld.set_prompt(header); + fld.show(); + + const int len = header.len() + 1; + const int f_len = code_length(lev); + fld_righe.set_column_header(field, header); + fld_righe.set_column_width(field, (len > f_len ? len : f_len) * 8); } else { - fld_righe.sheet_mask().field(field).hide(); + fld.hide(); fld_righe.delete_column(field); } } @@ -887,6 +888,22 @@ void TCodice_livelli::set_sheet_columns(TSheet_field &sht, short dlg) const set_sheetcolumn(sht, dlg+l, l+1); } +void TCodice_livelli::set_mask_fields(TMask &m,int firstfield) const +{ + for (int l = max_levels(); l>=1 ; l--) + set_mask_field(m,firstfield+l-1,l) ; +} + +void TCodice_livelli::set_mask_field(TMask &m,int field, int l) const +{ + if (enabled(l)) + { + if (strlen(m.field(field).prompt()) > (unsigned int)name(l).len()) + m.field(field).set_prompt(name(l)); + } + m.field(field).show(enabled(l)); +} + TCodice_livelli::TCodice_livelli() : _last_firm(-1), _gruppi(NULL) {} @@ -934,6 +951,21 @@ TCodgiac_livelli::TCodgiac_livelli() init(); } +static TCodgiac_livelli *_livelli_giacenza=NULL; +static TCodart_livelli *_livelli_articolo=NULL; + +TCodgiac_livelli &livelli_giacenza() +{ + if (_livelli_giacenza==NULL) + _livelli_giacenza=new TCodgiac_livelli(); + return *_livelli_giacenza; +} +TCodart_livelli &livelli_articolo() +{ + if (_livelli_articolo==NULL) + _livelli_articolo=new TCodart_livelli(); + return *_livelli_articolo; +} TMagazzini::TMagazzini() : TRecord_cache("MAG") , _mgconfig(NULL),_last_firm(-1) diff --git a/mg/mglib02.cpp b/mg/mglib02.cpp index 2cc96f249..f30866d8f 100755 --- a/mg/mglib02.cpp +++ b/mg/mglib02.cpp @@ -217,17 +217,21 @@ bool TArticolo::lock_and_prompt(const char * cod) do { - err = read(cod,_isequal,_testandlock); + if (cod && *cod) + err = read(cod,_isequal,_testandlock); + else + err = _iskeyerr; switch (err) { case NOERR: return TRUE; + case _iskeyerr: + mess << "Il codice articolo ''" << cod << "'' non e' valido"; + break; case _islocked: - { mess.cut(0); mess << "Il record di anagrafica\ndell'articolo ''" << cod << "'' e' gia' usato da un altro programma. Scegliere se ritentare la lettura o ignorare l'articolo."; break; - } case _iskeynotfound: mess.cut(0); mess << "Il record di anagrafica\ndell'articolo ''"<< cod << "'' non esiste."; @@ -334,7 +338,7 @@ const TString & TArticolo_giacenza::get_str(const char* fieldname) const break; case LF_STOMAG: if (index = 0) - index = find_storico(op1, op2); + index = find_storico(op1); if (index > 0) return storico(op1).row(index).get(op4); break; @@ -384,9 +388,8 @@ void TArticolo_giacenza::zero(char c) TArticolo::zero(c); } -int TArticolo_giacenza::find_mag(const char * annoes, const char * codmag, const char * livello, int from) const +int TArticolo_giacenza::find_mag(TRecord_array& rmag, const char * codmag, const char * livello, int from) const { - TRecord_array & rmag = mag(annoes); const int last = rmag.last_row(); if (last > 0 && from < last) @@ -409,9 +412,14 @@ int TArticolo_giacenza::find_mag(const char * annoes, const char * codmag, const return -1; } -int TArticolo_giacenza::find_storico(const char * annoesrif, const char * annoes, const char * codmag, int from) const +int TArticolo_giacenza::find_mag(const char * annoes, const char * codmag, const char * livello, int from) const +{ + TRecord_array & rmag = mag(annoes); + return find_mag(rmag, codmag, livello, from); +} + +int TArticolo_giacenza::find_storico(TRecord_array& rsto, const char * codmag, int from) const { - TRecord_array & rsto = storico(annoesrif); const int last = rsto.last_row(); if (last > 0 && from <= last) @@ -432,6 +440,12 @@ int TArticolo_giacenza::find_storico(const char * annoesrif, const char * annoes return -1; } +int TArticolo_giacenza::find_storico(const char * annoesrif, const char * codmag, int from) const +{ + TRecord_array & rsto = storico(annoesrif); + return find_storico(rsto, codmag, from); +} + TRecord_array & TArticolo_giacenza::mag(const char * annoes) const { TString16 anno = annoes; @@ -629,7 +643,7 @@ real TArticolo_giacenza::ultimo_costo(const char * annoes) const } else { - const int index = find_storico(annoes, annoes); + const int index = find_storico(annoes); if (index < 0 ) return ZERO; const real costo = storico(annoes).row(index).get_real(STOMAG_ULTCOS1); return costo == ZERO ? costo_standard(annoes) : costo; @@ -646,7 +660,7 @@ real TArticolo_giacenza::media_costi(const char * annoes) const } else { - const int index = find_storico(annoes, annoes); + const int index = find_storico(annoes); if (index < 0 ) return ZERO; const TRectype & rec = storico(annoes).row(index); real costo = rec.get_real(STOMAG_ULTCOS1); @@ -662,21 +676,21 @@ real TArticolo_giacenza::prezzo_listino(const char * annoes, const char * catven { TString codart=codice(); TConfig cfg(CONFIG_DITTA); - TCondizione_vendita cv(&cfg); - cv.put_listino(codlist,catven); - if (cv.ricerca(codart)) - return cv.get_prezzo(); - else + if (codlist && *codlist>' ') { - // se non lo trova, cerca nel prezzo indicato nelle UM - TString16 f; - f.format("#%d->%s", LF_UMART, UMART_PREZZO); - return get_real(f); - } + TCondizione_vendita cv(&cfg); + cv.put_listino(codlist,catven); + if (cv.ricerca(codart)) + return cv.get_prezzo(); + } + // se non lo trova, cerca nel prezzo indicato nelle UM + TString16 f; + f.format("#%d->%s", LF_UMART, UMART_PREZZO); + return get_real(f); } else { - const int index = find_storico(annoes, annoes); + const int index = find_storico(annoes); if (index < 0 ) return ZERO; return storico(annoes).row(index).get_real(STOMAG_PRZLIST); } @@ -688,7 +702,7 @@ real TArticolo_giacenza::costo_standard(const char * annoes) const return get_real(ANAMAG_COSTSTD); else { - const int index = find_storico(annoes, annoes); + const int index = find_storico(annoes); if (index < 0 ) return ZERO; return storico(annoes).row(index).get_real(STOMAG_COSTSTD); } @@ -787,6 +801,8 @@ real TArticolo_giacenza::FIFO_annuale(const char * annoes, const char * codmag, } if (giacenza <= ZERO) return ZERO; + if (rim == ZERO) + return ZERO; if (giacenza > acq) return ((giacenza - acq) * (valrim / rim) + valacq) / giacenza; return valacq / acq; @@ -822,7 +838,7 @@ real TArticolo_giacenza::LIFO(const char * annoes, const char * codmag, const ch valrim=ZERO; rim = giacenza; - for (i = find_storico(annoes, "", codmag); i > 0; i = find_storico(annoes, "", codmag, i)) + for (i = find_storico(annoes, codmag); i > 0; i = find_storico(annoes, codmag, i)) { TRectype & rec = rstorico[i]; const real qta = rec.get(STOMAG_QUANT); @@ -838,7 +854,7 @@ real TArticolo_giacenza::LIFO(const char * annoes, const char * codmag, const ch giacenza -= qta; } } - return valrim / rim; + return rim == ZERO ? ZERO :valrim / rim; } real TArticolo_giacenza::FIFO(const char * annoes, const char * codmag, const char * livello, @@ -911,48 +927,65 @@ real TArticolo_giacenza::LIFO_ragionieristico(const char * annoes, const char * return ZERO; // da implementare } -void TArticolo_giacenza::copia_storico(TString & nuovoanno,const char * annoes,const char * codmag) +void TArticolo_giacenza::copia_storico(TRecord_array& nrstorico,const char * annoes,const char * codmag) { - CHECK(codmag && *codmag,"Copia_storico: Indicare l'anno esercizio dello storico"); - TEsercizi_contabili ese; - nuovoanno=ese.next(atoi(annoes)); + CHECK(annoes && *annoes,"Copia_storico: Indicare l'anno esercizio dello storico"); + + TString nuovoanno(nrstorico.key().get(STOMAG_ANNOESRIF)); + //nrstorico.destroy_rows(); + TRecord_array & rstorico = storico(annoes); - int last=rstorico.last_row(); + + int last = nrstorico.last_row(); int codmag_len = (codmag && *codmag) ? strlen(codmag) : 0; + for (int i = rstorico.last_row(); i > 0; i--) - if (codmag_len == 0 || rstorico[i].get(STOMAG_CODMAG).compare(codmag, codmag_len) == 0) + { + const TRectype& rst = rstorico[i]; + if (codmag_len == 0 || rst.get(STOMAG_CODMAG).compare(codmag, codmag_len) == 0) { - TRectype newrec(rstorico[i]); + TRectype newrec(rst); newrec.put(STOMAG_ANNOESRIF,nuovoanno); newrec.put(STOMAG_NRIGA,++last); - rstorico.insert_row(newrec); + nrstorico.insert_row(newrec); } + } } -void TArticolo_giacenza::add_storico(const char * annorif,const char * annoes,const char * codmag, const real & qta, const real & prz) +HIDDEN int sort_storico(const TObject ** a, const TObject ** b) { - CHECK(codmag && *codmag,"Add_storico: Indicare l'anno esercizio dello storico"); - TEsercizi_contabili ese; - TRecord_array & rstorico = storico(annoes); - for (int i=rstorico.last_row(); i>0; i--) + TRectype * rec_a = (TRectype *) *a; + TRectype * rec_b = (TRectype *) *b; + TString16 mag_a = rec_a->get(STOMAG_CODMAG); + int res = mag_a.compare(rec_b->get(STOMAG_CODMAG)); + + if (res == 0) + res = rec_a->get_int(STOMAG_ANNOES) - rec_b->get_int(STOMAG_ANNOES); + return res; +} + +void TArticolo_giacenza::add_storico(TRecord_array& nrstorico,const char * annoes,const char * codmag, const real & qta, const real & prz) +{ + //CHECK(annorif && *annorif,"Add_storico: Indicare l'anno esercizio dello storico"); + //TRecord_array & rstorico = storico(annorif); + TString annorif(nrstorico.key().get(STOMAG_ANNOESRIF)); + for (int i=nrstorico.last_row(); i>0; i--) { - TString anno=rstorico[i].get(STOMAG_ANNOESRIF); - if (anno<=annorif) - { - TString mag=rstorico[i].get(STOMAG_CODMAG); - if (mag<=codmag) - break; - } + TString mag=nrstorico[i].get(STOMAG_CODMAG); + if (mag<=codmag) + break; } TRectype storec(LF_STOMAG); storec.put(STOMAG_ANNOESRIF,annorif); + storec.put(STOMAG_ANNOES,annoes); storec.put(STOMAG_CODART,codice()); storec.put(STOMAG_NRIGA,i+1); storec.put(STOMAG_CODMAG,codmag); storec.put(STOMAG_QUANT,qta); storec.put(STOMAG_VALORE,prz); - rstorico.insert_row(storec); + nrstorico.insert_row(storec); } + // annoes indica l'anno dell'esercizio da chiudere void TArticolo_giacenza::agg_storicoLIFO(const char * annoes, const char * codmag, bool giac_eff, bool valorizza_componenti) @@ -970,37 +1003,53 @@ void TArticolo_giacenza::agg_storicoLIFO(const char * annoes, const char * codma valacq += rec.get_real(MAG_VALACQ); giacenza += giacenza_corretta(rec,giac_eff,valorizza_componenti); } - TCurrency qta(ZERO,"_FIRM"),prz(ZERO,"_FIRM",TRUE); TString nuovoanno; - copia_storico(nuovoanno, annoes, nuovoanno); + TPrice prz; + real qta; + + TEsercizi_contabili ese; + nuovoanno.format("%d", ese.next(atoi(annoes))); + + TRecord_array nuovo_storico(storico(nuovoanno)); + copia_storico(nuovo_storico, annoes, codmag); if (giacenza <= ZERO) giacenza=ZERO; if (giacenza > rim) { - qta.set_num(giacenza-rim); - prz.set_num(valacq/acq); - add_storico(nuovoanno,annoes,codmag,qta.get_num(),prz.get_num()); - return; + qta=giacenza-rim; + if (acq.is_zero()) + prz.set_num(ZERO); + else + prz.set_num(valacq/acq); + add_storico(nuovo_storico,annoes,codmag,qta,prz.get_num()); } - real res = rim-giacenza; - TRecord_array & rstorico = storico(nuovoanno); - for (i = find_storico(nuovoanno, "", codmag); i > 0; i = find_storico(nuovoanno, "", codmag, i)) + else { - TRectype & rec = rstorico[i]; - const real qta_sto=rec.get_real(STOMAG_QUANT); - if (qta_sto > res) + real res = rim-giacenza; + //TRecord_array & rstorico = storico(nuovoanno); + for (i = find_storico(nuovo_storico, codmag); i > 0; i = find_storico(nuovo_storico, codmag, i)) { - qta.set_num(qta_sto-res); - rec.put(STOMAG_QUANT,qta.get_num()); - break; - } else { - rstorico.destroy_row(i); - res -= qta_sto; + TRectype & rec = nuovo_storico[i]; + const real qta_sto=rec.get_real(STOMAG_QUANT); + if (qta_sto > res) + { + qta=qta_sto-res; + rec.put(STOMAG_QUANT,qta); + break; + } + else + { + nuovo_storico.destroy_row(i); + res -= qta_sto; + } } } - rstorico.pack(); + + nuovo_storico.pack(); + nuovo_storico.sort(sort_storico); + nuovo_storico.write(); } @@ -1022,18 +1071,22 @@ void TArticolo_giacenza::agg_storicoFIFO(const char * annoes, const char * codma if (giacenza <= ZERO) return ; - if (giacenza <= acq) - return; - TString nuovoanno; - copia_storico(nuovoanno, annoes, codmag); +// if (giacenza <= acq) +// return; - TCurrency qta(ZERO,"_FIRM"),prz(ZERO,"_FIRM",TRUE); - TRecord_array & rstorico = storico(annoes); - const int last = rstorico.last_row(); + TString nuovoanno; + TEsercizi_contabili ese; + nuovoanno.format("%d", ese.next(atoi(annoes))); + + TRecord_array nuovo_storico(storico(nuovoanno)); + copia_storico(nuovo_storico, annoes, codmag); + + real qta; + real res = giacenza - acq; - for (i = find_storico(nuovoanno, "", codmag); i > 0; i = find_storico(nuovoanno, "", codmag, i)) + for (i = find_storico(nuovo_storico, codmag); i > 0; i = find_storico(nuovo_storico, codmag, i)) { - TRectype & rec = rstorico[i]; + TRectype & rec = nuovo_storico[i]; const real qta_sto = rec.get(STOMAG_QUANT); if (res > qta_sto) { @@ -1041,21 +1094,55 @@ void TArticolo_giacenza::agg_storicoFIFO(const char * annoes, const char * codma } else { if (res>ZERO) { - qta.set_num(res); - rec.put(STOMAG_QUANT, qta.get_num()); + qta=res; + rec.put(STOMAG_QUANT, qta); res=ZERO; } else { - rstorico.destroy_row(i); + nuovo_storico.destroy_row(i); } } } // aggiunge la quota dell'anno in corso - qta.set_num(giacenza-rim); - prz.set_num(valacq/acq); - add_storico(nuovoanno, annoes, codmag, qta.get_num(), prz.get_num()); - rstorico.pack(); +// qta=giacenza-rim; + qta = min(giacenza, acq); + TPrice prz; + if (!acq.is_zero()) + prz.set_num(valacq/acq); + add_storico(nuovo_storico, annoes, codmag, qta, prz.get_num()); + + nuovo_storico.pack(); + nuovo_storico.sort(sort_storico); + nuovo_storico.write(); } +void TArticolo_giacenza::agg_storico(const char * annoes, const char * codmag, + bool giac_eff, bool valorizza_componenti, const real& val) +{ + CHECK(strlen(codmag)<=3,"Non è più possibile avere valorizzazione a livello di deposito"); + CHECK(codmag && *codmag,"Necessario indicare il magazzino"); + +// TPrice prz(val); + TPrice prz; + real qta; + + TRecord_array & rmag = mag(annoes); + for (int i = find_mag(annoes, codmag, ""); i > 0; i = find_mag(annoes, codmag, "", i)) + { + const TRectype & rec = rmag.row(i); + qta += giacenza_corretta(rec, giac_eff, valorizza_componenti); + } + + TString nuovoanno; + TEsercizi_contabili ese; + nuovoanno.format("%d", ese.next(atoi(annoes))); + + TRecord_array& nuovo_storico = storico(nuovoanno); + + //nuovo_storico.destroy_rows(); + add_storico(nuovo_storico, annoes, codmag, qta, prz.get_num()); + nuovo_storico.sort(sort_storico); + nuovo_storico.write(); +} void TArticolo_giacenza::put_ultimo_costo(const real& costo, const TDate& data) { @@ -1114,14 +1201,15 @@ real TArticolo_giacenza::giacenza_anno(const char* codmag, i = find_mag(annoes, codmag, livello, i)) { const TRectype& rec = rmag.row(i); - giac += rec.get_real("GIAC"); + if (!rec.get(MAG_CODMAG).empty()) + giac += rec.get_real("GIAC"); } return giac; } real TArticolo_giacenza::scorta_minima(const char* codmag, const char* livello, - int anno) const + int anno, bool liv_riordino) const { TString16 annoes; if (anno > 0) @@ -1134,14 +1222,51 @@ real TArticolo_giacenza::scorta_minima(const char* codmag, i = find_mag(annoes, codmag, livello, i)) { const TRectype& rec = rmag.row(i); - sm += rec.get_real("SCORTAMIN"); - nmag++; + if (!rec.get(MAG_CODMAG).empty()) + { + if (liv_riordino) + sm += rec.get_real("LIVRIOR"); + else + sm += rec.get_real("SCORTAMIN"); + nmag++; + } } if (nmag) sm = sm / nmag; return sm; } +long TArticolo_giacenza::lead_time(const char* codmag, + const char* livello, + int anno) const +{ + TString4 annoes; + if (anno > 0) + annoes.format("%04d", anno); + + const TRecord_array& rmag = mag(annoes); + real sm; + int nmag=0; + for (int i = find_mag(annoes, codmag, livello); i > 0; + i = find_mag(annoes, codmag, livello, i)) + { + const TRectype& rec = rmag.row(i); + if (!rec.get(MAG_CODMAG).empty()) + { + if (rec.get_real(MAG_GIORNIRIOR).is_zero()) + sm += get_real(ANAMAG_GIORNIRIOR); + else + sm += rec.get_real(MAG_GIORNIRIOR); + nmag++; + } + } + if (nmag) + sm = sm / nmag; + else + sm = get_real(ANAMAG_GIORNIRIOR); + return sm.integer(); +} + TArticolo_giacenza::TArticolo_giacenza(const char* codice) : TArticolo(codice) @@ -1373,12 +1498,12 @@ bool TCondizione_vendita::ricerca(const char * codice, const real & qta) } -bool TCondizione_vendita::cerca( int tiporicerca, const char * codriga , const real & qta) +bool TCondizione_vendita::cerca( int tiporicerca, const char * codriga , const real & qta, const char * um) { // if (_condv.get("COD").empty()) // return FALSE; - bool found = FALSE; + TString80 cod; cod << codriga << "|1"; if(config_ditta().get_bool("GES", "ve", tiporicerca)) { @@ -1410,12 +1535,14 @@ bool TCondizione_vendita::cerca( int tiporicerca, const char * codriga , const r for( int i = 0; !found && i < seqricrighe.len( ); i ++ ) { - _rcondv.zero( ); + _rcondv.zero(' '); _rcondv.put( "TIPO", _condv.get( "TIPO")); _rcondv.put( "CATVEN", _condv.get( "CATVEN")); _rcondv.put( "TIPOCF", _condv.get( "TIPOCF")); _rcondv.put( "CODCF", _condv.get( "CODCF")); _rcondv.put("COD", _condv.get("COD")); + if( _condv.get_bool( "GESTUM" ) ) + _rcondv.put( "UM", (um && *um ) ? um : cache().get(LF_UMART, cod).get("UM")); if (gest_scagl) _rcondv.put("NSCAGL", 1); @@ -1426,13 +1553,15 @@ bool TCondizione_vendita::cerca( int tiporicerca, const char * codriga , const r case 'A': { _rcondv.put( "CODRIGA", codriga); - if (_rcondv.read() != NOERR && - _rcondv.prev() == NOERR && - _rcondv.get("TIPORIGA")[0] == 'A') - { - const TString cod_found(_rcondv.get("CODRIGA")); - found = cod_found.compare(codriga, cod_found.len()) == 0; - } + int err=_rcondv.read(); + found = err == NOERR; + if (!found) + if (err=_rcondv.prev() == NOERR) + if (err=_rcondv.get("TIPORIGA")[0] == 'A') + { + const TString cod_found(_rcondv.get("CODRIGA")); + found = cod_found.compare(codriga, cod_found.len()) == 0; + } } break; case 'R': @@ -1495,7 +1624,6 @@ bool TCondizione_vendita::cerca( int tiporicerca, const char * codriga , const r else _prezzo = ZERO; */ - TString80 cod; cod << codriga << "|1"; const TRectype& um = cache().get(LF_UMART, cod); _prezzo = um.get_real("PREZZO"); found = _prezzo != ZERO; @@ -1506,11 +1634,12 @@ bool TCondizione_vendita::cerca( int tiporicerca, const char * codriga , const r void TCondizione_vendita::put_condv(const char *tipocv,const char *codicecv,const char *catven,const char *tipocf,const char *codcf) { - _condv.put("TIPO",tipocv); - _condv.put("CATVEN",catven); - _condv.put("TIPOCF",tipocf); - _condv.put("CODCF",codcf); - _condv.put("COD",codicecv); + _condv.zero(' '); + _condv.put("TIPO",tipocv); + _condv.put("CATVEN",catven); + _condv.put("TIPOCF",tipocf); + _condv.put("CODCF",codcf); + _condv.put("COD",codicecv); } void TCondizione_vendita::put_listino(const char * codlist,const char *catven) diff --git a/mg/mglib02a.cpp b/mg/mglib02a.cpp index add0a842f..4c7a87448 100755 --- a/mg/mglib02a.cpp +++ b/mg/mglib02a.cpp @@ -9,10 +9,10 @@ #include "rmovmag.h" #ifndef __CGLIB01_H -#include "..\cg\cglib01.h" +#include "../cg/cglib01.h" #endif #ifndef __DBLIB_H -#include "..\db\dblib.h" +#include "../db/dblib.h" #endif @@ -137,8 +137,9 @@ int TMov_mag::remove(TBaseisamfile& f) const void TMov_mag::add_extrarows() const { add_autorows(); - if (add_explrows()) - add_autorows(); + add_explrows(); +// if (add_explrows()) +// add_autorows(); } bool TMov_mag::add_autorows() const @@ -159,7 +160,7 @@ bool TMov_mag::add_autorows() const if (codcaus.not_empty()) { const TCausale_magazzino& cau_coll = causale(codcaus); -// if (!cau_coll.esplodente()) + if (!row.get(RMOVMAG_ESPLOSA)) { // deve esserci una riga collegata if (!b.exist(r + 1) || b[r + 1].get_char(RMOVMAG_TIPORIGA) != riga_automatica) @@ -215,7 +216,7 @@ bool TMov_mag::add_explrows() const if (ok) { distinta.explode(boom, TRUE, RAGGR_EXP_NONE, livello, "A"); - TString codmag(codmag_rauto(r)); + //TString codmag(codmag_rauto(r)); real prezzo(prezzo_rauto(r)); TRectype * linea_auto; for (int newrow=0; newrow < boom.items() ; newrow++) @@ -225,8 +226,8 @@ bool TMov_mag::add_explrows() const linea_auto->put(RMOVMAG_CODART, riga_esp.articolo()); linea_auto->put(RMOVMAG_UM, riga_esp.um()); linea_auto->put(RMOVMAG_QUANT, riga_esp.val()); - if (codmag.not_empty()) - linea_auto->put(RMOVMAG_CODMAG, codmag); + //if (codmag.not_empty()) + // linea_auto->put(RMOVMAG_CODMAG, codmag); //if (!prezzo.is_zero()) articolo.read(riga_esp.articolo()); if (tipo_costo == 'U') @@ -242,16 +243,16 @@ bool TMov_mag::add_explrows() const b.insert_row(linea_auto); added=TRUE; } + // ora ci sono, mi basta eliminare la riga "padre" + if (boom.items() > 0 ) + { + if (boom.items() == 1 && codart == ((TRiga_esplosione &)boom[0]).articolo()) + error_box("Movimento di magazzino %ld:\ndistinta %s ciclica", get_long(MOVMAG_NUMREG),(const char *)codart); + b.destroy_row(r,TRUE); + } + else + message_box("Movimento di magazzino %ld:\nimpossibile esplodere l'articolo %s", get_long(MOVMAG_NUMREG),(const char *)codart); } - // ora ci sono, mi basta eliminare la riga "padre" - if (boom.items() > 0 ) - { - if (boom.items() == 1 && codart == ((TRiga_esplosione &)boom[0]).articolo()) - error_box("Movimento di magazzino %ld:\ndistinta %s ciclica", get_long(MOVMAG_NUMREG),(const char *)codart); - b.destroy_row(r,TRUE); - } - else - error_box("Movimento di magazzino %ld:\nimpossibile esplodere l'articolo %s", get_long(MOVMAG_NUMREG),(const char *)codart); } } // ciclo righe return added; @@ -568,9 +569,21 @@ int TMov_mag::update_balances(TRectype & magrec, const TLine_movmag &l,int rett_ umart.put(UMART_UM , l.um()); umart.read(); real fc=umart.get_real("FC"); - - diff=real(rett_sign) * l.quant() * fc; - diff_val= real(rett_sign) * l.quant() * l.prezzo(); + + + const real qt = l.quant(); + + diff=real(rett_sign) * qt * fc; + diff_val= real(rett_sign) * qt * l.prezzo(); + + // Se è una causale che movimenta il valore ma la qta è 0 + // anche diff_val avrà lo stesso valore, impostando 0 di conseguenza + // anche nei campi relativi a VALACQ, VALRIM etc etc. + // Quindi al limite come controllo finale su movimenti che movimentano la qta + // nel caso il calcolo dia proprio ZERO, impostiamo diff_val all'importo del valore stesso + if (qt == ZERO && caus.update_val()) + diff_val = real(rett_sign) * l.prezzo(); + if (caus.update_qta()) { update_balance(magrec,"GIAC",diff* (real)caus.sgn(s_giac)); // update .. @@ -696,7 +709,7 @@ bool rebuild_balances(const TString& annoes, const int cod_pred_es = esercizi.pred(atoi(annoes)); TString16 pred_es; pred_es.format("%d",cod_pred_es); - const bool reset_giac = cod_pred_es != 0 ? esercizi.esercizio(cod_pred_es).chiusura_mag() != TDate(NULLDATE) : TRUE; + const bool reset_giac = cod_pred_es != 0 ? esercizi.esercizio(cod_pred_es).chiusura_mag().ok() : TRUE; TString information; // azzera tutte giacenze (ciclo sulle giacenze) @@ -736,11 +749,11 @@ bool rebuild_balances(const TString& annoes, cur.freeze(); information.format("Ricostruzione saldi esercizio %s: ricalcolo ...",(const char *)annoes); TProgind barra_mov(maxmov,information, FALSE, TRUE); + TMov_mag & mov_rec=(TMov_mag &)cur.curr(); for (long m=0; mlast_level()) : to); + to=(to==0 ? (_tolivgiac ? _tolivgiac:livelli_giacenza().last_level()) : to); int lv=(from==0 ? 1: from ); for (; lv unpack_grpcode(relation()->lfile(LF_MAG).get("LIVELLO"),lv); + const TString & piece = livelli_giacenza().unpack_grpcode(relation()->lfile(LF_MAG).get("LIVELLO"),lv); if (piece.not_empty()) levname << '/' << piece ; } @@ -23,9 +23,9 @@ void TForm_stampemg::gruppogiac(TForm_item &cf, TToken_string &s) if (_fromlivgiac && livello == _fromlivgiac) { - levname << _giaclev->name(livello) << ' ' ; + levname << livelli_giacenza().name(livello) << ' ' ; } - valore=_giaclev->group_descr_packed(relation()->lfile(LF_MAG).get("LIVELLO"),livello); + valore=livelli_giacenza().group_descr_packed(relation()->lfile(LF_MAG).get("LIVELLO"),livello); if (valore.empty()) valore = UNKNOWN_NAME; cf.set(levname << valore); @@ -37,7 +37,7 @@ void TForm_stampemg::gruppoart(TForm_item &cf, TToken_string &s) int lv=atoi(s.get()); TToken_string valore; - valore=_artlev->group_descr_packed(relation()->lfile(LF_ANAMAG).get("CODART"),lv); + valore=livelli_articolo().group_descr_packed(relation()->lfile(LF_ANAMAG).get("CODART"),lv); if (valore.empty()) { valore.separator(','); @@ -59,9 +59,9 @@ void TForm_stampemg::codgruppogiac(TForm_item &cf, TToken_string &s) add_giaclev(levname,1,_fromlivgiac); levname << ' '; } else { - levname << _giaclev->name(livello) << ' ' ; + levname << livelli_giacenza().name(livello) << ' ' ; } - valore=_giaclev->unpack_grpcode(relation()->lfile(LF_MAG).get("LIVELLO"),livello); + valore=livelli_giacenza().unpack_grpcode(relation()->lfile(LF_MAG).get("LIVELLO"),livello); if (valore.empty()) valore = UNKNOWN_NAME; cf.set(levname << valore); @@ -87,33 +87,33 @@ bool TForm_stampemg::validate(TForm_item &cf, TToken_string &s) int lv=atoi(s.get()); do { valore=relation()->lfile(LF_ANAMAG).get("CODART"); - valore.rpad(25).cut(_artlev->packed_length(lv)); + valore.rpad(25).cut(livelli_articolo().packed_length(lv)); } while (--lv>0 && valore==""); cf.set(valore); } else if (subcode=="CATMER") { - valore=relation()->lfile(_ordering == ragg_fisc ? -600 : (_ordering == scat_merc ? -401 : -400)).get("S0"); + valore=relation()->lfile(_ordering == mg_ragg_fisc ? -600 : (_ordering == mg_scat_merc ? -401 : -400)).get("S0"); cf.set(valore); } else if (subcode=="CODCATMER") { - valore=relation()->lfile(LF_ANAMAG).get(_ordering == ragg_fisc ? "RAGGFIS" : "GRMERC"); - if (_ordering != ragg_fisc) + valore=relation()->lfile(LF_ANAMAG).get(_ordering == mg_ragg_fisc ? "RAGGFIS" : "GRMERC"); + if (_ordering != mg_ragg_fisc) { valore.rpad(5); - valore.cut(_ordering == scat_merc ? 5 : 3); + valore.cut(_ordering == mg_scat_merc ? 5 : 3); } cf.set(valore); } else if (subcode=="LIVELLIGIAC") { int lv=_tolivgiac; valore=""; do { - const TString & piece = _giaclev->unpack_grpcode(relation()->lfile(LF_MAG).get("LIVELLO"),lv+1); + const TString & piece = livelli_giacenza().unpack_grpcode(relation()->lfile(LF_MAG).get("LIVELLO"),lv+1); if (piece.not_empty()) { if (valore.not_empty()) valore << '/'; valore << piece ; } - } while (lv++<_giaclev->last_level()); + } while (lv++name(_tolivgiac+1); + levname=livelli_giacenza().name(_tolivgiac+1); else levname="Giacenza"; cf.set(levname << ' ' << valore); @@ -166,13 +166,13 @@ void TForm_stampemg::set_ordering(const TTipo_ordinamento_mg t) switch (_ordering) { default: - case normale: + case mg_normale: cond = "CODART"; break; - case ragg_fisc: + case mg_ragg_fisc: cond = "RAGGFIS"; break; - case cat_merc: + case mg_cat_merc: cond = "GRMERC[1,3]"; break; } @@ -181,8 +181,8 @@ void TForm_stampemg::set_ordering(const TTipo_ordinamento_mg t) bool TForm_stampemg::setdett_perart(bool totaliart,int fromlivart,int livart,bool totaligiac,int fromlivgiac,int livgiac,bool showmag, bool showdep) { - const int last_artlev=_artlev->last_level() ? _artlev->last_level() : 1; - const int last_giaclev=_giaclev->last_level(); + const int last_artlev=livelli_articolo().last_level() ? livelli_articolo().last_level() : 1; + const int last_giaclev=livelli_giacenza().last_level(); if (totaliart) // voglio i totali di articolo { @@ -213,8 +213,8 @@ bool TForm_stampemg::setdett_perart(bool totaliart,int fromlivart,int livart,boo bool TForm_stampemg::setdett_permag(bool totaliart,int fromlivart,int livart,bool totaligiac,int fromlivgiac,int livgiac,bool showmag, bool showdep,bool showdett) { - const int last_artlev=_artlev->last_level() ? _artlev->last_level() : 1; - const int last_giaclev=_giaclev->last_level(); + const int last_artlev=livelli_articolo().last_level() ? livelli_articolo().last_level() : 1; + const int last_giaclev=livelli_giacenza().last_level(); if (totaliart) // voglio i totali di articolo { @@ -249,8 +249,8 @@ bool TForm_stampemg::setdett_permag(bool totaliart,int fromlivart,int livart,boo bool TForm_stampemg::setdettaglio(bool show, int fromlivart,int livart,int fromlivgiac,int livgiac,bool dettgiac) { - const int last_artlev=_artlev->last_level() ? _artlev->last_level() : 1; - const int last_giaclev=_giaclev->last_level(); + const int last_artlev=livelli_articolo().last_level() ? livelli_articolo().last_level() : 1; + const int last_giaclev=livelli_giacenza().last_level(); const int tolivart =min(( livart ? livart :last_artlev) ,last_artlev-1); const int tolivgiac=min((livgiac ? livgiac :last_giaclev),last_giaclev ); @@ -308,7 +308,7 @@ bool TForm_stampemg::setdettaglio(bool show, int fromlivart,int livart,int froml sname << i; TForm_subsection &s=(TForm_subsection &)find_field('B',odd_page,sname); TString cond(s.condition()); - cond << "+LIVELLO[" << _giaclev->packed_length(i-1)+1 << "," << _giaclev->packed_length(i) <<']'; + cond << "+LIVELLO[" << livelli_giacenza().packed_length(i-1)+1 << "," << livelli_giacenza().packed_length(i) <<']'; s.setcondition(cond,_strexpr); } } @@ -319,7 +319,7 @@ bool TForm_stampemg::setdettaglio(bool show, int fromlivart,int livart,int froml sname << i; TForm_subsection &s=(TForm_subsection &)find_field('B',odd_page,sname); TString cond(s.condition()); - cond << '[' << (i==1 ? 1:_artlev->packed_length(i-1))<<',' << _artlev->packed_length(i) <<']'; + cond << '[' << (i==1 ? 1:livelli_articolo().packed_length(i-1))<<',' << livelli_articolo().packed_length(i) <<']'; s.setcondition(cond,_strexpr); } @@ -330,17 +330,17 @@ bool TForm_stampemg::setdettaglio(bool show, int fromlivart,int livart,int froml TForm_stampemg::TForm_stampemg(const char *name,const char *code) : TForm(name,code) { - _giaclev= new TCodgiac_livelli(); - _artlev= new TCodart_livelli(); +// _giaclev= new TCodgiac_livelli(); +// _artlev= new TCodart_livelli(); _fromlivgiac=_tolivgiac=0; _fromlivart=_tolivart=0; - _ordering = normale; + _ordering = mg_normale; } TForm_stampemg::~TForm_stampemg() { - delete _giaclev; - delete _artlev; +// delete _giaclev; +// delete _artlev; } // maschera delle stampe magazzino @@ -351,7 +351,7 @@ void TStampemg_mask::enable_livellicodice() if (pos >= 0) { TMask_field &f_ragg=field(F_RAGGCODICE); - if (!_artlev.enabled()) + if (!livelli_articolo().enabled()) { // nasconde i campi di livello articolo f_ragg.reset(); f_ragg.check(); f_ragg.hide(); @@ -370,7 +370,7 @@ void TStampemg_mask::enable_livellicodice() if (pos_g >= 0) { TMask_field &f_ragg=field(F_RAGGLIVGIAC); - if (!_giaclev.enabled()) + if (!livelli_giacenza().enabled()) { // nasconde i campi di livello giacenza f_ragg.reset(); f_ragg.check();f_ragg.hide(); @@ -391,16 +391,16 @@ void TStampemg_mask::set_livellicodice() { if (!get_bool(F_RAGGCODICE) && get_int(F_FROMLIVELLOGIAC)==0) { - set(F_FROMLIVELLOART,artlev().last_level()); + set(F_FROMLIVELLOART,livelli_articolo().last_level()); //set(F_TOLIVELLOART,); } if (!get_bool(F_RAGGLIVGIAC)) { if (get_int(F_TOLIVELLOART)==0) - set(F_TOLIVELLOART,artlev().last_level()); // + set(F_TOLIVELLOART,livelli_articolo().last_level()); // } else { if (get_int(F_TOLIVELLOGIAC)==0) - set(F_TOLIVELLOGIAC,giaclev().last_level()); // + set(F_TOLIVELLOGIAC,livelli_giacenza().last_level()); // } } diff --git a/mg/mgtabcom.txt b/mg/mgtabcom.txt index 9b8d3491e..81d71ba11 100755 --- a/mg/mgtabcom.txt +++ b/mg/mgtabcom.txt @@ -38,3 +38,5 @@ CAU|PRPR|Programma di produzione||0 0 +10 0 0 0 0 0 0 +10 0 0||||C|V|||||||||||| CAU|IMCO|Impegno componenti||0 0 0 0 +10 0 0 0 +10 0 0 0||||C|V||||||||||||||||||||||||||||||||||||||||||| | | |||||||| CAU|CFPR|Carico articoli da produzione||+10 0 0 0 0 0 0 0 0 -10 0 0||||P|C||||||||||||||||||||||||||||||||||||||||||| | | |||||||| CAU|SCCI|Scarico componenti da impegno di produzione||-10 0 0 0 0 0 0 0 -10 0 0 0||||C|S||||||||||||||||||||||||||||||||||||||||||| | | |||||||| +CAU|MOVQ|Movimentazione quantita||+10 0 0 0 0 0 0 0 0 0 +10 0||||C|C|||||||||||||||||||||||||||||||||||||||||||X| | |||||||| +CAU|MOVV|Movimentazione valore||+10 0 0 0 0 0 0 0 0 0 +10 0||||C|C||||||||||||||||||||||||||||||||||||||||||| |X| |||||||| diff --git a/mr/mr0400.h b/mr/mr0400.h index 2ac1b5ac3..c861c72a8 100755 --- a/mr/mr0400.h +++ b/mr/mr0400.h @@ -48,6 +48,7 @@ #define F_CALENDAR 202 #define F_DEFAULT_IMP 203 #define F_DEFAULT_LNP 204 +#define F_WEEKCOMPLETE 205 #endif diff --git a/mr/mr0400a.uml b/mr/mr0400a.uml index ce019b65a..bbe20b231 100755 --- a/mr/mr0400a.uml +++ b/mr/mr0400a.uml @@ -36,6 +36,12 @@ BEGIN OUTPUT F_DEFAULT_IMP S6 END +BOOL F_WEEKCOMPLETE +BEGIN + PROMPT 2 3 "Numera settimane a partire dalla prima completa" + FIELD WEEKCOMPLETE +END + STRING F_DEFAULT_IMP 5 BEGIN PROMPT 42 2 "Impianto di default " @@ -48,7 +54,6 @@ BEGIN END - LISTBOX F_NTURNI 3 BEGIN PROMPT 2 4 "Numero turni " diff --git a/mr/mr2.url b/mr/mr2.url index dc409d674..a839ce9c7 100755 --- a/mr/mr2.url +++ b/mr/mr2.url @@ -34,4 +34,6 @@ image USER_BMP_SELECT_ORDF "selordf.bmp" image USER_BMP_ORDINI_INPUT "ord_in.bmp" image USER_BMP_ORDINI_OUTPUT "ord_out.bmp" +image USER_BMP_VINCOLI_INPUT "cons_in.bmp" +image USER_BMP_VINCOLI_OUTPUT "cons_out.bmp" diff --git a/mr/mr2100.cpp b/mr/mr2100.cpp index 96b840fcf..13ce7137f 100755 --- a/mr/mr2100.cpp +++ b/mr/mr2100.cpp @@ -4,6 +4,8 @@ #include #include #include +#include +#include #include "mrplib.h" #include "..\mg\mglib.h" @@ -12,33 +14,61 @@ #include "mr2100.h" #include "mr2100a.h" +#include "mr2100c.h" /////////////////////////////////////////////////////////// // TMRP_record /////////////////////////////////////////////////////////// -const real& TMRP_record::add_gross_req(const real & val) +void TMRP_record::add_ref(TMRP_docref * ref, TMRP_docrefs ** refs) { + if (ref) + { + if (!*refs) + *refs = new TMRP_docrefs(); + (*refs)->add(ref); + } +} + +const real& TMRP_record::add_gross_req(const real & val, TMRP_internalref * ref) +{ + if (_internal_req == NULL) + _internal_req = new TMRP_internalrefs(); + _internal_req->add(ref); + return add_gross_req(val); +} + +const real& TMRP_record::add_gross_req(const real & val, TMRP_docref * ref) +{ + add_ref(ref, &_requirements); _gross_requirement += val; return _gross_requirement; } -const real& TMRP_record::add_sched_rec(const real & val) +const real& TMRP_record::add_sched_rec(const real & val, TMRP_docref * ref) { + add_ref(ref, &_scheduls); _sched_receipts += val; return _sched_receipts; } -const real& TMRP_record::add_planned_ord(const real & val) +const real& TMRP_record::add_planned_ord(const real & val, TMRP_docref * ref) { + add_ref(ref, &_plans); _planned_orders += val; return _planned_orders; } -const real& TMRP_record::add_proposed_ord(const real & val) +const real& TMRP_record::add_resched_ord(const real & val) { - _proposed_orders += val; - return _proposed_orders; + _resched_orders += val; + return _resched_orders; +} + +const real& TMRP_record::add_unsched_ord(const real & val) +{ + _unsched_orders += val; + return _unsched_orders; } const real& TMRP_record::add_net_req(const real & val) @@ -61,19 +91,30 @@ TMRP_record & TMRP_record::operator=(const TMRP_record & a) _sched_receipts=a._sched_receipts; _net_requirement=a._net_requirement; _planned_orders=a._planned_orders; - _proposed_orders=a._proposed_orders; + _resched_orders=a._resched_orders; + + if (a._plans) _plans = (TMRP_docrefs *)a._plans->dup(); + if (a._scheduls) _scheduls = (TMRP_docrefs *)a._scheduls->dup(); + if (a._requirements) _requirements = (TMRP_docrefs *)a._requirements->dup(); + if (a._internal_req) _internal_req = (TMRP_internalrefs *)a._internal_req->dup(); + return *this; } TMRP_record::TMRP_record(const TMRP_time& t) : _time(t) { + _plans = NULL; + _scheduls = NULL; + _requirements = NULL; + _internal_req = NULL; } /////////////////////////////////////////////////////////// // TMRP_line /////////////////////////////////////////////////////////// TArticolo_giacenza *TMRP_line::_articolo_giac=NULL; +TString16 TMRP_line::_substr; void TMRP_line::lotti_riordino(real & minimo, real & increm) const { @@ -95,6 +136,8 @@ void TMRP_line::lotti_riordino(real & minimo, real & increm) const int TMRP_line::add_son(const real& qta, TMRP_line* son) { CHECK(son, "Can't add NULL TMRP_line son"); + if (son == this) + fatal_box("Riga di MRP %sz %s padre di se stessa", (const char *)articolo(), (const char *)livgiac()); CHECK(son != this, "Hermafrodite TMRP_line"); _qta_sons.add(qta); return _sons.add(son); @@ -105,7 +148,7 @@ bool TMRP_line::is_son(const TCodice_articolo& art) const for (int i = sons()-1; i >= 0; i--) { const TMRP_line& r = son(i); - if (r.codice() == art) + if (r.articolo() == art) break; } return i >= 0; @@ -116,9 +159,9 @@ int TMRP_line::compare(const TSortable& s) const const TMRP_line& line = (const TMRP_line&)s; const bool imfather = sons() > 0; const bool hesfather = line.sons() > 0; - if (imfather && (!hesfather || is_son(line.codice()))) + if (imfather && (!hesfather || is_son(line.articolo()))) return +1; - if (hesfather && (!imfather || line.is_son(codice()))) + if (hesfather && (!imfather || line.is_son(articolo()))) return -1; return 0; } @@ -138,9 +181,9 @@ TMRP_line & TMRP_line::operator=(const TMRP_line & a) _codmag=a._codmag; _codimp=a._codimp; _codlin=a._codlin; - _codcli=a._codcli; + _codclifor=a._codclifor; // contents - _description=a._description; + _descr=a._descr; _sons=a._sons; _qta_sons=a._qta_sons; _req_per_bucket=a._req_per_bucket; @@ -181,7 +224,7 @@ TMRP_record& TMRP_line::record(const TMRP_time& t) const // approssima in base al lotto minimo; prevede valori negativi real TMRP_line::sizeup_net_requirement(int i, const real &val) { - real req; // Azzera net requirement + real req(ZERO); // Azzera net requirement if (val < ZERO) { req = -val; // Rende positiva la richiesta effettiva @@ -206,19 +249,24 @@ real TMRP_line::sizeup_net_requirement(int i, const real &val) return req; } -const real& TMRP_line::add_gross_req(const TMRP_time& t, const real& val) -{ return record(t).add_gross_req(val); } +const real& TMRP_line::add_gross_req(const TMRP_time& t, const real& val, TMRP_internalref * ref) +{ return record(t).add_gross_req(val, ref); } -const real& TMRP_line::add_sched_rec(const TMRP_time& t, const real &val) -{ return record(t).add_sched_rec(val);} +const real& TMRP_line::add_gross_req(const TMRP_time& t, const real& val, TMRP_docref * ref) +{ return record(t).add_gross_req(val, ref); } -const real& TMRP_line::add_planned_ord(const TMRP_time& t, const real &val) -{ return record(t).add_planned_ord(val);} +const real& TMRP_line::add_sched_rec(const TMRP_time& t, const real &val, TMRP_docref * ref) +{ return record(t).add_sched_rec(val, ref);} + +const real& TMRP_line::add_planned_ord(const TMRP_time& t, const real &val, TMRP_docref * ref) +{ return record(t).add_planned_ord(val, ref);} + +const real& TMRP_line::add_resched_ord(int i, const real &val) +{ return record(i).add_resched_ord(val); } + +const real& TMRP_line::add_unsched_ord(int i, const real &val) +{ return record(i).add_unsched_ord(val); } -const real& TMRP_line::add_proposed_ord(int i, const real &val) -{ - return record(i).add_proposed_ord(val); -} const real & TMRP_line::set_net_req(int i, const real &val) { if (val>ZERO) @@ -245,23 +293,18 @@ const TMRP_time& TMRP_line::lead_time(int i, TMRP_time& t, bool anticipate) cons if (anticipate) { - TLocalisamfile dist(LF_DIST); - dist.put("CODDIST", codice()); - if (dist.read() == NOERR) + if (!cache().get(LF_DIST, articolo()).empty()) { - int days = dist.get_int("LEADTIME"); - long hours = dist.get_long("LEADHOURS"); + int days = cache().get(LF_DIST, articolo()).get_int("LEADTIME"); + long hours = cache().get(LF_DIST, articolo()).get_long("LEADHOURS"); t.sub_time(days, hours); } else { - TLocalisamfile anamag(LF_ANAMAG); - anamag.put(ANAMAG_CODART, codice()); - if (anamag.read() == NOERR) - { - int days = anamag.get_int("LEADTIME"); - t.sub_time(days); - } + _articolo_giac->read(articolo()); + TDate d = t.date(); + d -= _articolo_giac->lead_time(codmagdep(), livgiac()); + t.set(d, t.hour(), t.impianto(), t.linea()); } } return t; @@ -275,8 +318,8 @@ real &TMRP_line::giacenza_attuale(real &g) const real &TMRP_line::giacenza_attuale(real &g, const TDate &d) const { - _articolo_giac->read(codice()); - g = _articolo_giac->giacenza_anno(codmag(),livgiac(),d.year()); + _articolo_giac->read(articolo()); + g = _articolo_giac->giacenza_anno(codmagdep(),livgiac(),d.year()); return g; } @@ -288,8 +331,8 @@ real &TMRP_line::scorta_minima(real &g) const real &TMRP_line::scorta_minima(real &g, const TDate &d) const { - _articolo_giac->read(codice()); - g = _articolo_giac->scorta_minima(codmag(),livgiac(),d.year()); + _articolo_giac->read(articolo()); + g = _articolo_giac->scorta_minima(codmagdep(),livgiac(),d.year()); return g; } @@ -300,7 +343,7 @@ TMRP_line::TMRP_line(const char* art, const char* giac, long codcli) : _codart(art), _livgiac(giac), _codmag(mag), _codmag_coll(magc), - _codimp(imp), _codlin(lin), _codcli(codcli) + _codimp(imp), _codlin(lin), _codclifor(codcli) { if (_articolo_giac==NULL) _articolo_giac= new TArticolo_giacenza(); @@ -312,7 +355,6 @@ TMRP_line::TMRP_line(const TMRP_line&a) } - /////////////////////////////////////////////////////////// // TMRP_lines /////////////////////////////////////////////////////////// @@ -325,12 +367,13 @@ TMRP_lines::TMRP_lines(const TMRP_lines & a) TObject* TMRP_lines::dup() const { - return new TMRP_lines(*this);; + return new TMRP_lines(*this); } TMRP_lines & TMRP_lines::operator= (const TMRP_lines &a) { TMRP_array::operator= (a); _ignore_mag=a._ignore_mag; + _ignore_dep=a._ignore_dep; _ignore_imp=a._ignore_imp; _ignore_lin=a._ignore_lin; return *this; @@ -356,6 +399,7 @@ TMRP_line* TMRP_lines::find(const TCodice_articolo& codart, const TString& gia, { _key = codart; _key.add(gia); + _key.trim(); // trim to trim giaclevel... if (_ignore_mag) { _key.add(" ",2); @@ -363,8 +407,14 @@ TMRP_line* TMRP_lines::find(const TCodice_articolo& codart, const TString& gia, } else { - _key.add(mag,2); - _key.add(magc,3); + if (_ignore_dep) + { + _key.add(mag.left(3) ,2); + _key.add(magc.left(3),3); + } else { + _key.add(mag,2); + _key.add(magc,3); + } } if (_ignore_imp) _key.add(" ",4); @@ -382,7 +432,7 @@ TMRP_line* TMRP_lines::find(const TCodice_articolo& codart, const TString& gia, } TMRP_lines::TMRP_lines() - : _ignore_mag(FALSE), _ignore_imp(FALSE), _ignore_lin(FALSE) + : _ignore_mag(FALSE), _ignore_dep(FALSE), _ignore_imp(FALSE), _ignore_lin(FALSE) { } TMRP_lines::~TMRP_lines() @@ -392,72 +442,91 @@ TMRP_lines::~TMRP_lines() // TRiga_ordine /////////////////////////////////////////////////////////// -#define SORT_COMPLETE 13 // -#define SORT_BY_DFA -1 // data documento + data di consegna + fornitore + articolo -#define SORT_BY_DAF -2 // data documento + data di consegna + articolo + fornitore -#define SORT_BY_FAD -3 // -#define SORT_BY_FDA -4 // -#define SORT_BY_AFD -5 // -#define SORT_BY_ADF -6 // +#define COMPARE_ALL_CODES 13 // +#define COMPARE_COMPLETE 99 // +#define COMPARE_TDFA -1 // +#define COMPARE_TDAF -2 // +#define COMPARE_TFAD -3 // +#define COMPARE_TFDA -4 // +#define COMPARE_TAFD -5 // +#define COMPARE_TADF -6 // +#define COMPARE_DTFA -7 // data documento + data di consegna + fornitore + articolo +#define COMPARE_DATF -8 // data documento + data di consegna + articolo + fornitore +#define COMPARE_ATFD -9 // +#define COMPARE_ADTF -10 // + class TRiga_ordine : public TToken_string { public: - int compare(const TToken_string& r, int level = SORT_COMPLETE, bool ascending=TRUE) const; + int compare(const TToken_string& r, int level = COMPARE_ALL_CODES, bool ascending=TRUE) const; int compare_field(TString &str0, TString &str1,short field_no) const; TRiga_ordine& operator=(TToken_string& r); TRiga_ordine& operator+=(TRiga_ordine& r); TRiga_ordine() : TToken_string(128) { } - TRiga_ordine(const TDate& datadoc, long forn, - const TMRP_line& line, int bucket, - TCodgiac_livelli& livelli, const real & price); + TRiga_ordine(const TDate& datadoc, const TDate& datacons, long forn, + const TMRP_line& line, int bucket, const real & price); virtual ~TRiga_ordine() { } }; int TRiga_ordine::compare(const TToken_string& riga, int level, bool ascending) const { - TString16 str0, str1; + TString str0, str1; int cmp = 0; if (level>=0) { - for (int i = 2; i <= level && cmp == 0; i++) + for (int i = 2; i <= level && i <= COMPARE_ALL_CODES && cmp == 0; i++) { get(i, str0); riga.get(i, str1); - cmp=compare_field(str0,str1,short(i+FIRST_FIELD)); + cmp = compare_field(str0,str1,short(i+FIRST_FIELD)); + } + if (level > COMPARE_ALL_CODES) + { + i = F_DOCANNODOC; + while (cmp == 0 && i <= F_DOCNRIGA) + { + get(i-FIRST_FIELD, str0); + riga.get(i-FIRST_FIELD, str1); + if (str1.blank()) // se la linea trovata non è riferita a un doc, va sempre bene + break; + cmp = compare_field(str0,str1,short(i++)); + } } } else { // ordinamenti non standard short f; - short fields_DFA[] = {F_DATADOC, F_DATACONS, F_ORD_TYPE, F_FORNITORE, F_ARTICOLO}; - short fields_DAF[] = {F_DATADOC, F_DATACONS, F_ARTICOLO, F_ORD_TYPE, F_FORNITORE}; - short fields_AFD[] = {F_ARTICOLO, F_ORD_TYPE, F_FORNITORE, F_DATADOC, F_DATACONS}; - short fields_ADF[] = {F_ARTICOLO, F_ORD_TYPE, F_DATADOC, F_DATACONS, F_FORNITORE}; - short fields_FAD[] = {F_ORD_TYPE, F_FORNITORE, F_ARTICOLO, F_DATADOC, F_DATACONS}; - short fields_FDA[] = {F_ORD_TYPE, F_FORNITORE, F_DATADOC, F_DATACONS, F_ARTICOLO}; - for (int i = 0; i < 5 && cmp == 0; i++) + short fields_TFAD[] = {F_ORD_TYPE, F_FORNITORE, F_ARTICOLO, F_LIV1, F_LIV2, F_LIV3, F_LIV4, F_DATADOC, F_DATACONS}; + short fields_TFDA[] = {F_ORD_TYPE, F_FORNITORE, F_DATADOC, F_DATACONS, F_ARTICOLO, F_LIV1, F_LIV2, F_LIV3, F_LIV4}; + short fields_TDFA[] = {F_ORD_TYPE, F_DATADOC, F_DATACONS, F_FORNITORE, F_ARTICOLO, F_LIV1, F_LIV2, F_LIV3, F_LIV4}; + short fields_TDAF[] = {F_ORD_TYPE, F_DATADOC, F_DATACONS, F_ARTICOLO, F_LIV1, F_LIV2, F_LIV3, F_LIV4, F_FORNITORE}; + short fields_TAFD[] = {F_ORD_TYPE, F_ARTICOLO, F_LIV1, F_LIV2, F_LIV3, F_LIV4, F_FORNITORE, F_DATADOC, F_DATACONS}; + short fields_TADF[] = {F_ORD_TYPE, F_ARTICOLO, F_LIV1, F_LIV2, F_LIV3, F_LIV4, F_DATADOC, F_DATACONS, F_FORNITORE}; + short fields_DTFA[] = {F_DATADOC, F_DATACONS, F_ORD_TYPE, F_FORNITORE, F_ARTICOLO, F_LIV1, F_LIV2, F_LIV3, F_LIV4}; + short fields_DATF[] = {F_DATADOC, F_DATACONS, F_ARTICOLO, F_LIV1, F_LIV2, F_LIV3, F_LIV4, F_ORD_TYPE, F_FORNITORE}; + short fields_ATFD[] = {F_ARTICOLO, F_LIV1, F_LIV2, F_LIV3, F_LIV4, F_ORD_TYPE, F_FORNITORE, F_DATADOC, F_DATACONS}; + short fields_ADTF[] = {F_ARTICOLO, F_LIV1, F_LIV2, F_LIV3, F_LIV4, F_ORD_TYPE, F_DATADOC, F_DATACONS, F_FORNITORE}; + for (int i = 0; i < 9 && cmp == 0; i++) { switch (level) { - case SORT_BY_DFA: - f=fields_DFA[i]; break; - case SORT_BY_DAF: - f=fields_DAF[i]; break; - case SORT_BY_FAD: - f=fields_FAD[i]; break; - case SORT_BY_FDA: - f=fields_FDA[i]; break; - case SORT_BY_ADF: - f=fields_ADF[i]; break; - case SORT_BY_AFD: - f=fields_AFD[i]; break; + case COMPARE_TFAD: f=fields_TFAD[i]; break; + case COMPARE_TFDA: f=fields_TFDA[i]; break; + case COMPARE_TDFA: f=fields_TDFA[i]; break; + case COMPARE_TDAF: f=fields_TDAF[i]; break; + case COMPARE_TADF: f=fields_TADF[i]; break; + case COMPARE_TAFD: f=fields_TAFD[i]; break; + case COMPARE_DTFA: f=fields_DTFA[i]; break; + case COMPARE_DATF: f=fields_DATF[i]; break; + case COMPARE_ADTF: f=fields_ADTF[i]; break; + case COMPARE_ATFD: f=fields_ATFD[i]; break; default: NFCHECK("Ordinamento sconosciuto"); break; } - get(f-FIRST_FIELD, str0); - riga.get(f-FIRST_FIELD, str1); + get(f - FIRST_FIELD, str0); + riga.get(f - FIRST_FIELD, str1); cmp=compare_field(str0,str1,f); } } @@ -506,46 +575,87 @@ TRiga_ordine& TRiga_ordine::operator=(TToken_string& r) TRiga_ordine& TRiga_ordine::operator+=(TRiga_ordine& r) { CHECK(compare(r) == 0, "Can't add incompatible order line"); - real qta = get(13); - qta += real(r.get(13)); - add(qta.string(), 13); + real qta = get(F_QUANTITA - FIRST_FIELD); + qta += real(r.get(F_QUANTITA - FIRST_FIELD)); + add(qta.string(), F_QUANTITA - FIRST_FIELD); return *this; } -TRiga_ordine::TRiga_ordine(const TDate& datadoc, long forn, const TMRP_line& line, int bucket, TCodgiac_livelli& lg, const real & price) +TRiga_ordine::TRiga_ordine(const TDate& datadoc, const TDate& datacons, long forn, const TMRP_line& line, int bucket, const real & price) : TToken_string(128) { - add(" ",F_SELECTED-FIRST_FIELD); - add("F",F_ORD_TYPE-FIRST_FIELD); - add(datadoc.string(),F_DATADOC-FIRST_FIELD); - const TMRP_time& time = line.time(bucket); - add(time.date().string(),F_DATACONS-FIRST_FIELD); - add(forn,F_FORNITORE-FIRST_FIELD); - add(line.codice(),F_ARTICOLO-FIRST_FIELD); + add(" ",F_SELECTED - FIRST_FIELD); + add("F",F_ORD_TYPE - FIRST_FIELD); + add(datadoc.string(),F_DATADOC - FIRST_FIELD); + add(datacons.string(),F_DATACONS - FIRST_FIELD); + add(line.codclifor() ? line.codclifor() : forn, F_FORNITORE - FIRST_FIELD); + add(line.articolo(),F_ARTICOLO - FIRST_FIELD); - const TString& liv = line.livgiac(); - for (int l = 1; l <= 4; l++) - { - if (lg.enabled(l)) - add(liv.mid(lg.code_start(l), lg.code_length(l)),F_LIV1+l-1-FIRST_FIELD); - else - add(" ",F_LIV1+l-1-FIRST_FIELD); - } + for (int l = livelli_giacenza().last_level(); l >= 1; l--) + add(line.livgiac(l), F_LIV1+l-1 - FIRST_FIELD); - add(line.codmag().left(3),F_MAGAZZINO-FIRST_FIELD); - add(line.codmag().mid(3),F_DEPOSITO-FIRST_FIELD); - - add(line.codimp(),F_CODIMP-FIRST_FIELD); - add(line.codlin(),F_CODLIN-FIRST_FIELD); + add(line.codmag(), F_MAGAZZINO - FIRST_FIELD); + add(line.coddep(),F_DEPOSITO - FIRST_FIELD); + add(line.codimp(),F_CODIMP - FIRST_FIELD); + add(line.codlin(),F_CODLIN - FIRST_FIELD); real q = line.net_requirement(bucket); //q -= line.planned_orders(bucket); - const TCodice_um um; - const TQuantita qta(line.codice(), um, q); - add(qta.val().string(),F_QUANTITA-FIRST_FIELD); - add(qta.um(),F_UM-FIRST_FIELD); - add(price.string(),F_PREZZO-FIRST_FIELD); + const TCodice_um um_nulla; + const TQuantita qta(line.articolo(), um_nulla, q); + add(qta.val().string(),F_QUANTITA - FIRST_FIELD); + add(qta.um(),F_UM - FIRST_FIELD); + add(price.string(),F_PREZZO - FIRST_FIELD); - add(line.description(),F_DESCART-FIRST_FIELD); + add(line.description(),F_DESCART - FIRST_FIELD); +} + + + + +/////////////////////////////////////////////////////////// +// TMRP_docref / TMRP_docrefs +/////////////////////////////////////////////////////////// + +TMRP_docref::TMRP_docref(int anno, const char * codnum,long numdoc,int nriga, + const char *um, const real & qta, const real &prz) +{ + _annodoc = anno; + _codnum = codnum; + _numdoc = numdoc; + _numrig = nriga; + _um = um; + _qta = qta; + _prz = prz; +} + +TObject* TMRP_docref::dup() const +{ + TMRP_docref * o = new TMRP_docref(_annodoc, _codnum, _numdoc, _numrig, _um, _qta, _prz); + return o; +} + + +TObject* TMRP_internalref::dup() const +{ + TMRP_internalref * o = new TMRP_internalref(*this); + return o; +} +TMRP_internalref::TMRP_internalref(TMRP_line *line, int bucket, const real & qta): + _line(line), _qta(qta), _bucket(bucket) +{ + _um = cache().get(LF_DIST,line->articolo()).get("UM"); + _date = _line->record(bucket).time().date(); +} + +TMRP_internalref::TMRP_internalref(const TMRP_internalref &r): + _line(r._line), _qta(r._qta) ,_date (r._date), _um(r._um), _bucket(r._bucket) +{ } + +TObject* TMRP_docrefs::dup() const +{ + TMRP_docrefs * o = new TMRP_docrefs(); + *o = *this; + return o; } /////////////////////////////////////////////////////////// @@ -616,7 +726,7 @@ void TLav_finder::art2magimpline(const TCodice_articolo& art, { const TLinea_prod lnp(lin) ; imp = lnp.codimp(); - mag = lnp.codmag(); + mag = lnp.codmagdep(); } else { @@ -632,46 +742,8 @@ TLav_finder::TLav_finder() : _lnp("LNP", "S6"), _keep_imp(TRUE) // TMatResPlanning /////////////////////////////////////////////////////////// -class TMatResMask; - - -class TMatResPlanning : public TSkeleton_application -{ - TMRP_lines _articles; - TLav_finder _artinfo; - -private: - bool gross2net_logic(TMRP_line &curr_article, int bucket,bool lotsizing_f, bool lotsizing_p, bool use_leadtime); - bool load_gross_requirements(const TMatResMask& m); - bool load_planned_orders(const TMatResMask& m); - bool explode_articles(const TMatResMask& m); - - bool test_codnum(const TCodice_numerazione& num, TString_array& a) const; - int test_status(const TRectype& doc, TString_array& a) const; - bool has_confirmed_status(const TRectype& doc, TToken_string & riga ) const; - -protected: - bool preprocess_cycle(const TMatResMask& m); // req iniziale dai docs - bool net_requirement_cycle(const TMatResMask& m); - bool build_orders(TMatResMask& m); - -public: - virtual void main_loop(); - virtual bool firm_change_enabled() const { return FALSE; } - - void compute(TMatResMask& m); - bool emit_orders(TMatResMask& m); -}; - -TMatResPlanning& app() { return (TMatResPlanning&)main_app(); } - -/////////////////////////////////////////////////////////// -// TMatResMask -/////////////////////////////////////////////////////////// - class TMatResMask : public TCalendar_mask { - TCodgiac_livelli _livelli; TCondizione_vendita *_condv; void clear_sheets(); @@ -679,43 +751,122 @@ protected: void round_field(TMask_field& fld, bool up) const; virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); - int find_pos(const TRiga_ordine& r, int& cmp) const; + int find_pos(const TRiga_ordine& r, int& cmp, int level=COMPARE_ALL_CODES) const; void sort_orders(); - bool orders_selected(char type); - void select_orders(char type); + bool orders_selected(char type, const char * dacatmer,const char * acatmer); + void select_orders(char type, const char * dacatmer, const char * acatmer); public: - TCodgiac_livelli & livelli_giacenza() {return _livelli;} int round_date(TDate& date, bool up = FALSE) const; - int add_order_line(const TDate& data, long forn, const TMRP_line& l, int bucket); + int add_order_line(long forn, const TMRP_line& l, int bucket); TMatResMask(); virtual ~TMatResMask() { } }; +class TMatResPlanning : public TSkeleton_application +{ + TMRP_lines _articles; + TLav_finder _artinfo; + TMatResMask* _mask; + +private: + bool gross2net_logic(TMRP_line &curr_article, int bucket); + bool load_gross_requirements(); + bool load_planned_orders(); + bool explode_articles(); + + bool test_codnum(const TCodice_numerazione& num, TString_array& a) const; + int test_status(const TRectype& doc, TString_array& a) const; + bool has_confirmed_status(const TRectype& doc, TToken_string & riga ) const; + +protected: + bool preprocess_cycle(); // req iniziale dai docs + bool net_requirement_cycle(); + bool build_orders(); + + static void print_orders_header(TPrinter& pr); + static void print_orders_body(TPrinter& pr, TToken_string *sheetrow); + static void set_body_order_line(TPrintrow &row, TToken_string *sheetrow); + bool print_risalita(TToken_string &row, int backlevel, bool dett_ord); + bool print_risalita(const TMRP_line & line, const TDate & d, int backlevel, bool dett_ord); + int print_internal_ref(const TMRP_internalref &iref, int backlevel, bool dett_ord); + int print_gross_ref(const TMRP_line& line, int bucket); +public: + virtual void main_loop(); + virtual bool firm_change_enabled() const { return FALSE; } + + void compute(); + bool print_orders(); + bool emit_orders(); + void risalita(const TMask & m); + int round_date(TDate &d, bool up=FALSE) const {return _mask->round_date(d, up);} +}; + +TMatResPlanning& app() { return (TMatResPlanning&)main_app(); } + +/////////////////////////////////////////////////////////// +// TMatResMask +/////////////////////////////////////////////////////////// +class TRisalita_mask : public TAutomask +{ + TMRP_line* _line; + bool add_total_row(int pos, const char * um , const real & lordo, const char * umpadre ,const real & lordopadre) ; +protected: + virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); + bool add_total_rows(); +static compare_rows(TSheet_field &sf, int r1, int r2); + +public: + int add_gross_ref(const TMRP_line& line, int bucket); + int add_internal_ref(const TMRP_internalref & iref); + TRisalita_mask(TMRP_line* line, const TDate & from, const TDate & to, bool is_buck0); + virtual ~TRisalita_mask() { } +}; + + int TMatResMask::round_date(TDate& date, bool up) const { - // Dimensione del bucke in giorni - const int bucket_size = get_int(F_BUCKETS); + // Dimensione del bucket in giorni + const int bucket_size = get_int(F_BUCKET)*get_int(F_DAYXBUCK); // Riporta la data al primo lunedi prima dell'inizio TDate inizio = get_date(F_DADATA); - if (bucket_size>1) // non vado a giorni - { - const int wday = inizio.wday(); - if (wday > 1) inizio -= wday-1; - } - // Calcola il bucket di appartenenza - const int days = int(date - inizio); int bucket; - if (days<0) - bucket = days / bucket_size; + if (bucket_size == 31) // mese solare + { + if (up) + { + date.set_end_month(); + int wday = date.wday(); + wday = (7-wday) % 7; + //wday -= get_int(F_LASTWRKDAY); + if (wday<0) + date += wday; + } + else + date.set_day(1); + bucket = (date.year()-inizio.year())*12 + date.month() - inizio.month(); + if (bucket<0) bucket = -1; + } else - bucket = days / bucket_size; - if (up) // Arrotonda alla fine del bucket - date = inizio + long((bucket+1 )* bucket_size - 1 /*- get_int(F_LASTWRKDAY)*/); - else // Arrotonda all'inizio del bucket - date = inizio + long(bucket * bucket_size); + { + if (bucket_size>1) // non vado a giorni + { + const int wday = inizio.wday(); + if (wday > 1) inizio -= wday-1; + } + // Calcola il bucket di appartenenza + const int days = int(date - inizio); + if (days<0) + bucket = 0; + else + bucket = days / bucket_size; + if (up) // Arrotonda alla fine del bucket + date = inizio + long((bucket+1 )* bucket_size - 1 /*- get_int(F_LASTWRKDAY)*/); + else // Arrotonda all'inizio del bucket + date = inizio + long(bucket * bucket_size); + } return bucket; } @@ -743,6 +894,7 @@ bool TMatResMask::on_field_event(TOperable_field& o, TField_event e, long jolly) round_field(o, TRUE); break; case F_BUCKET: + case F_DAYXBUCK: if (e == fe_modify) { round_field(field(F_DADATA), FALSE); @@ -782,12 +934,55 @@ bool TMatResMask::on_field_event(TOperable_field& o, TField_event e, long jolly) } } break; + case F_FORNITORE: + if (jolly == 5) // codice fornitore sullo sheet ordini + { + TSheet_field& so = sfield(F_ORDINI); + TToken_string &row = so.row(so.selected()); + switch(e) + { + case fe_modify: + case fe_init: + { + real qta, price; + TString codart; + long codfor; + char tipocf; + row.get(F_FORNITORE - FIRST_FIELD, codfor); + row.get(F_ORD_TYPE - FIRST_FIELD, tipocf); + + if (tipocf == 'F') + if (codfor == 0L) + { + } + else + { + row.get(F_QUANTITA - FIRST_FIELD, qta); + row.get(F_ARTICOLO - FIRST_FIELD, codart); + find_price(get(F_TIPOCV),get(F_CODCONDV),get(F_CATVEN_CV), + "F", codfor, codart, qta, price); + row.add(price.string(), F_PREZZO - FIRST_FIELD); + } + } + break; + } + } + break; case F_YEAR: case F_IMPIANTO: case F_LINEA: if (e == fe_modify || (o.dlg() == F_YEAR && e == fe_init )) update_calendar(F_CALENDAR, F_YEAR, F_IMPIANTO, F_LINEA); break; + case DLG_QUIT: + if (e == fe_button && jolly == 0L) + { + TSheet_field& s = sfield(F_ORDINI); + const int it=s.items(); + if (it > 0 && !yesno_box(confirm_msg, it)) + return FALSE; + } + break; case DLG_CANCEL: if (e == fe_button) if (jolly == 0L) @@ -811,33 +1006,49 @@ bool TMatResMask::on_field_event(TOperable_field& o, TField_event e, long jolly) if (it==0 || yesno_box(confirm_msg, it)) { s.destroy(); - app().compute(*this); + app().compute(); enable(DLG_SAVEREC, s.items() > 0); - enable(-1, s.items() == 0); + enable(-G_PREPROCESS, s.items() == 0); sort_orders(); s.set_focus(); } } break; + case F_RISALITA: + if (e == fe_button) + { + /*TSheet_field & sf= m.sfield(F_ORDINI); + TToken_string & row=sf.row(sf.selected()); + TDate datacons(row.get(sf.cid2index(F_DATACONS)));*/ + app().risalita(*this); + } + break; case F_RESORT_ORDINI: if (e == fe_button) sort_orders(); break; case F_SELECT_ORDF: if (e == fe_button) - select_orders('F'); + select_orders('F', get(F_OF_DAGRMERC), get(F_OF_AGRMERC)); break; case F_SELECT_ORDP: if (e == fe_button) - select_orders('P'); + select_orders('P', get(F_OP_DAGRMERC), get(F_OP_AGRMERC)); break; case DLG_SAVEREC: if (e == fe_button && check_fields()) { - if (!app().emit_orders(*this)) + if (!app().emit_orders()) message_box("Nessun ordine generato"); } break; + case DLG_PRINT: + if (e == fe_button) + { + app().print_orders(); + return FALSE; + } + break; case DLG_PROFILE: if (e == fe_modify) { @@ -861,8 +1072,8 @@ void TMatResMask::clear_sheets() sa.force_update(); } } -// Per ora scansione lineare, in futuro ricerca binaria -int TMatResMask::find_pos(const TRiga_ordine& r, int& cmp) const + +int TMatResMask::find_pos(const TRiga_ordine& r, int& cmp, int level) const { TSheet_field& s = sfield(F_ORDINI); TString_array& a = s.rows_array(); @@ -870,36 +1081,110 @@ int TMatResMask::find_pos(const TRiga_ordine& r, int& cmp) const for (int i = 0; i < a.items(); i++) { const TRiga_ordine& riga = (const TRiga_ordine&)a[i]; - cmp = r.compare(riga); - if (cmp <= 0) + cmp = r.compare(riga, level); + if (cmp == 0) break; } return i; } -int TMatResMask::add_order_line(const TDate& datadoc, long forn, const TMRP_line& line, int bucket) +int TMatResMask::add_order_line(long forn, const TMRP_line& line, int bucket) { - TRiga_ordine* r = new TRiga_ordine(datadoc, forn, line, bucket, _livelli, ZERO); + int pos; - int cmp; - const int pos = find_pos(*r, cmp); + TMRP_time deliv_time = line.time(bucket); + TMRP_time plan_time; + if (get_bool(F_IGN_LDTIME)) + plan_time = line.time(bucket); + else + line.lead_time(bucket, plan_time, TRUE); + if (line.sons() == 0) // Sottrai alle foglie il bonus + { + plan_time.sub_time(get_int(F_XTRA_LDTIME)); + deliv_time.sub_time(get_int(F_XTRA_LDTIME)); + } + plan_time.sub_time(get_int(F_XTRA_PLTIME)); + + TDate datadoc = plan_time.date(); + round_date(datadoc); + TDate datacons = deliv_time.date(); + round_date(datacons); TSheet_field& s = sfield(F_ORDINI); TString_array& a = s.rows_array(); - if (cmp == 0) - { - TRiga_ordine& riga = (TRiga_ordine&)a[pos]; - riga += *r; - delete r; - } - else - { - if (1 || cmp > 0) - a.add(r); + real q(line.net_requirement(bucket)); + TMRP_docrefs * o = line.record(bucket).plans_refs(); + // le proposte di rescheduling sono da mettere su uno sheet a parte... + int nref = o ? nref = o->items() : 0; + real qtaplan; + do { + TRiga_ordine* r = new TRiga_ordine(datadoc, datacons, forn, line, bucket, ZERO); + nref--; + if (nref >= 0) + { + const TString & codnum = o->get_ref(nref).codnumdoc(); + if (codnum == get(F_NUM_PROD) + || codnum == get(F_NUM_FORN)) + { + qtaplan = o->get_ref(nref).qta_residua(); + qtaplan.round(5); + q.round(5); +// if (qtaplan > q ) +// { + qtaplan = q - qtaplan; // tengo solo in parte questo ordine ... + r->add(o->get_ref(nref).annodoc() , F_DOCANNODOC - FIRST_FIELD); + r->add(o->get_ref(nref).codnumdoc() , F_DOCCODNUM - FIRST_FIELD); + r->add(o->get_ref(nref).numdoc() , F_DOCNUM - FIRST_FIELD); + r->add(o->get_ref(nref).numrig() , F_DOCNRIGA - FIRST_FIELD); + r->add(qtaplan.string() , F_QUANTITA - FIRST_FIELD); +// } else { +// q = q - qtaplan; // genero solo una parte del nuovo ordine... +// r->add(q.string() , F_QUANTITA - FIRST_FIELD); +// qtaplan = ZERO; +// } + q = ZERO; + } + } else { + r->add(q.string() , F_QUANTITA - FIRST_FIELD); + qtaplan = ZERO; + } + if ((nref >= 0 && (!qtaplan.is_zero() || get_bool(F_ALLORDERS))) || // correggo un vecchio ordine ... + (nref < 0 && !q.is_zero())) // ... o ne genero uno nuovo + { + int cmp = -1; + if (nref >= 0 && qtaplan < ZERO) + pos = find_pos(*r, cmp, COMPARE_COMPLETE); + else + pos = find_pos(*r, cmp, COMPARE_ALL_CODES); + + if (cmp == 0) + { + TRiga_ordine& riga = (TRiga_ordine&)a[pos]; + riga += *r; + delete r; + } + else + { + a.add(r); + pos = a.items()-1; + if (nref >= 0) + { + // disabilita i campi del doc + s.disable_cell(pos, F_ORD_TYPE - FIRST_FIELD); + s.disable_cell(pos, F_DATADOC - FIRST_FIELD); + s.disable_cell(pos, F_DATACONS - FIRST_FIELD); + s.disable_cell(pos, F_FORNITORE - FIRST_FIELD); + s.disable_cell(pos, F_MAGAZZINO - FIRST_FIELD); + s.disable_cell(pos, F_DEPOSITO - FIRST_FIELD); + s.disable_cell(pos, F_CODIMP - FIRST_FIELD); + s.disable_cell(pos, F_CODLIN - FIRST_FIELD); + } + } + } else - a.insert(r, pos); - } + delete r; + } while (nref >= 0 /*&& q > ZERO*/); return pos; } @@ -911,44 +1196,51 @@ static int order_compare(TSheet_field &s,int i1,int i2, int sorttype) const TRiga_ordine& r2 = (TRiga_ordine&)s.row(i2); return r1.compare(r2,sorttype,ascending); } -static int order_compareDFA(TSheet_field &s,int i1,int i2) -{ return order_compare(s,i1,i2,SORT_BY_DFA);} -static int order_compareDAF(TSheet_field &s,int i1,int i2) -{ return order_compare(s,i1,i2,SORT_BY_DAF);} -static int order_compareAFD(TSheet_field &s,int i1,int i2) -{ return order_compare(s,i1,i2,SORT_BY_AFD);} -static int order_compareADF(TSheet_field &s,int i1,int i2) -{ return order_compare(s,i1,i2,SORT_BY_ADF);} -static int order_compareFAD(TSheet_field &s,int i1,int i2) -{ return order_compare(s,i1,i2,SORT_BY_FAD);} -static int order_compareFDA(TSheet_field &s,int i1,int i2) -{ return order_compare(s,i1,i2,SORT_BY_FDA);} +static int order_compareDTFA(TSheet_field &s,int i1,int i2) +{ return order_compare(s,i1,i2,COMPARE_DTFA);} +static int order_compareDATF(TSheet_field &s,int i1,int i2) +{ return order_compare(s,i1,i2,COMPARE_DATF);} +static int order_compareATFD(TSheet_field &s,int i1,int i2) +{ return order_compare(s,i1,i2,COMPARE_ATFD);} +static int order_compareADTF(TSheet_field &s,int i1,int i2) +{ return order_compare(s,i1,i2,COMPARE_ADTF);} +static int order_compareTFAD(TSheet_field &s,int i1,int i2) +{ return order_compare(s,i1,i2,COMPARE_TFAD);} +static int order_compareTFDA(TSheet_field &s,int i1,int i2) +{ return order_compare(s,i1,i2,COMPARE_TFDA);} +static int order_compareTDFA(TSheet_field &s,int i1,int i2) +{ return order_compare(s,i1,i2,COMPARE_TDFA);} +static int order_compareTDAF(TSheet_field &s,int i1,int i2) +{ return order_compare(s,i1,i2,COMPARE_TDAF);} +static int order_compareTAFD(TSheet_field &s,int i1,int i2) +{ return order_compare(s,i1,i2,COMPARE_TAFD);} +static int order_compareTADF(TSheet_field &s,int i1,int i2) +{ return order_compare(s,i1,i2,COMPARE_TADF);} void TMatResMask::sort_orders() -{ +{ + TWait_cursor clessidra; TSheet_field& s = sfield(F_ORDINI); TSheet_field& a = s; switch (-get_int(F_SORT)) { - case SORT_BY_DAF: - a.sort(order_compareDAF); break; - case SORT_BY_FAD: - a.sort(order_compareFAD); break; - case SORT_BY_FDA: - a.sort(order_compareFDA); break; - case SORT_BY_AFD: - a.sort(order_compareAFD); break; - case SORT_BY_ADF: - a.sort(order_compareADF); break; - case SORT_BY_DFA: - default: - a.sort(order_compareDFA); break; + case COMPARE_ATFD: a.sort(order_compareATFD); break; + case COMPARE_ADTF: a.sort(order_compareADTF); break; + case COMPARE_DTFA: a.sort(order_compareDTFA); break; + case COMPARE_DATF: a.sort(order_compareDATF); break; + case COMPARE_TFAD: a.sort(order_compareTFAD); break; + case COMPARE_TFDA: a.sort(order_compareTFDA); break; + case COMPARE_TAFD: a.sort(order_compareTAFD); break; + case COMPARE_TADF: a.sort(order_compareTADF); break; + case COMPARE_TDAF: a.sort(order_compareTDAF); break; + case COMPARE_TDFA: a.sort(order_compareTDFA); break; + default: + return; } - s.force_update(); } -bool TMatResMask::orders_selected(char type) +bool TMatResMask::orders_selected(char type, const char * dacatmer,const char * acatmer) { TSheet_field& s = sfield(F_ORDINI); const int it=s.items(); @@ -956,23 +1248,31 @@ bool TMatResMask::orders_selected(char type) { if ( *s.cell(r, s.cid2index(F_ORD_TYPE))==type && *s.cell(r, s.cid2index(F_SELECTED))=='X') - return TRUE; + if (*dacatmer <= ' ' || + cache().get(LF_ANAMAG,s.cell(r, s.cid2index(F_ARTICOLO))).get(ANAMAG_GRMERC).left(3) >= dacatmer) + if (*acatmer <= ' ' || + cache().get(LF_ANAMAG,s.cell(r, s.cid2index(F_ARTICOLO))).get(ANAMAG_GRMERC).left(3) <= acatmer) + return TRUE; } return FALSE; } -void TMatResMask::select_orders(char type) +void TMatResMask::select_orders(char type, const char * dacatmer,const char * acatmer) { TSheet_field& s = sfield(F_ORDINI); - bool on=!orders_selected(type); + bool on=!orders_selected(type, dacatmer, acatmer); const int it=s.items(); for (int r=0; r< it; r++) { if ( *s.cell(r, s.cid2index(F_ORD_TYPE))==type ) - { - s.row(r).add(on ? "X" : " ", s.cid2index(F_SELECTED)); - s.force_update(r); - } + if (*dacatmer <= ' ' || + cache().get(LF_ANAMAG,s.cell(r, s.cid2index(F_ARTICOLO))).get(ANAMAG_GRMERC).left(3) >= dacatmer) + if (*acatmer <= ' ' || + cache().get(LF_ANAMAG,s.cell(r, s.cid2index(F_ARTICOLO))).get(ANAMAG_GRMERC).left(3) <= acatmer) + { + s.row(r).add(on ? "X" : " ", s.cid2index(F_SELECTED)); + s.force_update(r); + } } TString msg=format("Ordini %s %s",type=='F' ? "fornitore" : "di produzione" ,on ? "selezionati" :"de-selezionati"); xvt_statbar_set(msg); @@ -984,7 +1284,7 @@ TMatResMask::TMatResMask() : TCalendar_mask("mr2100a") { _condv = NULL; TSheet_field& sf = sfield(F_ORDINI); - _livelli.set_sheet_columns(sf, F_LIV1); + livelli_giacenza().set_sheet_columns(sf, F_LIV1); TConfig ini(CONFIG_DITTA, "mg"); if (!ini.get_bool("GESDEPOSITI", "mg")) @@ -1004,6 +1304,316 @@ TMatResMask::TMatResMask() : TCalendar_mask("mr2100a") } } + +/////////////////////////////////////////////////////////// +// TRisalita_mask : +/////////////////////////////////////////////////////////// +TRisalita_mask::TRisalita_mask(TMRP_line* line, const TDate &fromdate, const TDate &todate, bool isbuck0) + : TAutomask("mr2100b.msk"), _line (line) +{ + TSheet_field& sf = sfield(F_ORDINI); + sf.disable(); + livelli_giacenza().set_sheet_columns(sf, F_LIV1); + livelli_giacenza().set_mask_fields(*this, F_LIV1); + TConfig ini(CONFIG_DITTA, "mg"); + if (!ini.get_bool("GESDEPOSITI", "mg")) + { + sf.delete_column(F_DEPOSITO); + sf.sheet_mask().hide(F_DEPOSITO); + } + + if (!ini.get_bool("GESTIMPIANTI", "mr")) + { + sf.delete_column(F_CODIMP); // Elimina colonna impianto + sf.sheet_mask().hide(F_CODIMP); + sf.sheet_mask().hide(F_DESCIMP); + } + TToken_string cod = line->articolo(); + set(F_ARTICOLO,cod); + set(F_DESCART,line->description()); + cod.add("1"); + set(F_UM,cache().get(LF_UMART,cod).get("UM")); + for (int l = livelli_giacenza().last_level(); l>=1 ; l--) + set(F_LIV1+l-1, line->livgiac(l)); + + bool has_internal_refs=FALSE; + real lordo,netto,plan,sched; + for (int b = line->last_bucket(); b >= 0 ; b--) + { + const TDate &d = line->record(b).time().date(); + if ((isbuck0 || d >= fromdate)) + { + set(F_FABB_DADATA, d); + set(F_FABB_ADATA, todate); + set(F_FABB_GIAC, line->record(b).on_hand().string()); + if (d <= todate) + { + lordo += line->gross_requirement(b); + netto += line->net_requirement(b); + plan += line->planned_orders(b); + sched += line->sched_receipts(b); + TMRP_internalrefs *irefs = line->record(b).internal_refs(); + if (irefs) + { + int ir = 0; + while (ir < irefs->items()) + { + TMRP_internalref &iref = irefs->get_ref(ir); + add_internal_ref(iref); + ir ++; + } + has_internal_refs = TRUE; + } else { + add_gross_ref(*line,b); + } + } + } + } + if (!has_internal_refs) + for (int c = F_ARTICOLO; c < F_DOCANNODOC; c++) + sf.delete_column(c); + add_total_rows(); + + set(F_FABB_LORDO,lordo.string()); + set(F_FABB_PIAN, plan.string()); + set(F_FABB_SCHED, sched.string()); + netto -= plan; + set(F_TOPLAN, netto.string()); + netto += plan + sched; + set(F_FABB_NETTO,netto.string()); +} + +bool TRisalita_mask::add_total_rows() +{ + TSheet_field& sf = sfield(F_ORDINI); + if (sf.items() == 0) + return FALSE; + sf.sort(compare_rows); + TString codice(get(F_ARTICOLO)), codpadre, um; + const TCodice_um um_nulla; + TQuantita totale(codice, um_nulla, ZERO); + TQuantita parziale(totale), qta, lordopadre; + real val; + + int padri(0), riga(0); + TToken_string * row; + TString_array& ra = sf.rows_array(); + while (row = (TToken_string *)ra.objptr(riga++)) + { + if (codpadre != row->get(sf.cid2index(F_ARTICOLO))) + { + if (!codpadre.blank()) + { + add_total_row(riga++, parziale.um(), parziale.val(), lordopadre.um(), lordopadre.val()); + parziale.set_val(ZERO); + lordopadre.set_articolo(codpadre, um_nulla); + lordopadre.set_val(ZERO); + padri++; + } + codpadre = row->get(sf.cid2index(F_ARTICOLO)); + } + // fabbisogno articolo + row->get(sf.cid2index(F_FABBISOGNO), val); + row->get(sf.cid2index(F_UMFABB), um); + qta.set(codice, um, val); + parziale += qta; + totale += qta; + // qta padre + row->get(sf.cid2index(F_QUANTITA), val); + row->get(sf.cid2index(F_UM), um); + qta.set(codpadre.blank() ? codice : codpadre, um, val); + lordopadre += qta; + } + add_total_row(riga++, parziale.um(), parziale.val(), lordopadre.um(), lordopadre.val()); + if (padri > 0) + add_total_row(riga, totale.um(), totale.val(), "", ZERO); + sf.force_update(); + return padri; +} + +TRisalita_mask::compare_rows(TSheet_field &sf, int r1, int r2) +{ + TToken_string & s1 = sf.row(r1); + TToken_string & s2 = sf.row(r2); + static TString ss1, ss2; + s1.get(sf.cid2index(F_ARTICOLO), ss1); + s2.get(sf.cid2index(F_ARTICOLO), ss2); + int d = ss1.compare(ss2); + if (d == 0) + { + TDate d1,d2; + s1.get(sf.cid2index(F_DATACONS), ss1); + s2.get(sf.cid2index(F_DATACONS), ss2); + d1 = ss1; + d2 = ss2; + d = int (d1 - d2); + if (d == 0) + { + s1.get(sf.cid2index(F_FABBISOGNO), ss1); + s2.get(sf.cid2index(F_FABBISOGNO), ss2); + real r1(ss1),r2(ss2); + r1 -= r2; + d = r1.sign(); + } + } + return d; +} + +bool TRisalita_mask::add_total_row(int pos, const char * um , const real & lordo, const char * umpadre ,const real & lordopadre) +{ + TSheet_field& sf = sfield(F_ORDINI); + sf.insert(--pos); + TToken_string & row = sf.row(pos); + row.add(um, sf.cid2index(F_UMFABB)); + row.add(lordo.string(), sf.cid2index(F_FABBISOGNO)); + row.add(umpadre, sf.cid2index(F_UM)); + row.add(lordopadre.string(), sf.cid2index(F_QUANTITA)); + sf.disable_row(pos); + return TRUE; +} + +bool TRisalita_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) +{ + switch (o.dlg()) + { + case F_RISALITA: + if (e == fe_button) + { + app().risalita(*this); + } + break; + } + return TRUE; +} + +int TRisalita_mask::add_internal_ref(const TMRP_internalref &iref) +{ + const TMRP_line& line=*iref.line(); + int bucket=iref.bucket(); + + const TMRP_time &deliv_time = line.time(bucket); + TMRP_time doc_time; + line.lead_time(bucket,doc_time, TRUE); + + TSheet_field& s = sfield(F_ORDINI); + TString_array& a = s.rows_array(); + TToken_string dockey; + TMRP_docrefs * gr_refs= line.record(bucket).requirements_refs(); + int grref = gr_refs ? gr_refs->items() : 0; + TMRP_docrefs * pl_refs= line.record(bucket).plans_refs(); + int plref = pl_refs ? pl_refs->items() : 0; + TMRP_docrefs * sr_refs = line.record(bucket).scheduls_refs(); + int srref = sr_refs ? sr_refs->items() : 0; + real totreq = line.net_requirement(bucket); + totreq += line.sched_receipts(bucket); + real qtaplan(totreq); + real qtareq(totreq); + do { + TCodice_um um; + TToken_string r; + real q = iref.qta(); + TMRP_docref * docref = NULL; + if (grref > 0) + docref = gr_refs->get_ref_ptr(--grref); + else if (srref > 0) + docref = sr_refs->get_ref_ptr(--srref); + else if (plref > 0) + docref = pl_refs->get_ref_ptr(--plref); + if (docref) + { + dockey.add("D",0); + dockey.add(docref->annodoc(),1); + dockey.add(docref->codnumdoc(),2); + dockey.add(docref->numdoc(),3); + //const TString & codnum = docref->codnumdoc(); + qtaplan = docref->qta_residua(); + qtaplan.round(5); + TQuantita qta(line.articolo(), docref->um(), docref->qta_residua()); + qta.convert2umbase(); + qtareq = qtareq - qta.val(); + qtareq.round(5); + qtareq = qtareq - qtaplan; + r.add(cache().get(LF_DOC,dockey).get(DOC_DATADOC),F_DATADOC - FIRST_FIELD); // data del documento di rif. + r.add(docref->annodoc() , F_DOCANNODOC - FIRST_FIELD); + r.add(docref->codnumdoc() , F_DOCCODNUM - FIRST_FIELD); + r.add(docref->numdoc() , F_DOCNUM - FIRST_FIELD); + r.add(docref->numrig() , F_DOCNRIGA - FIRST_FIELD); + r.add(qtaplan.string() , F_QUANTITA - FIRST_FIELD); + um = docref->um(); + } + else + { + qtaplan = qtareq; + r.add(doc_time.date().string(), F_DATADOC - FIRST_FIELD); + } + TQuantita qta(line.articolo(), um, qtaplan); + r.add(get(F_UM), F_UMFABB - FIRST_FIELD); + r.add(deliv_time.date().string(), F_DATACONS - FIRST_FIELD); + r.add(" ",F_FORNITORE - FIRST_FIELD); + r.add(line.articolo(),F_ARTICOLO - FIRST_FIELD); + const TString& liv = line.livgiac(); + for (int l = livelli_giacenza().last_level(); l >= 1; l--) + r.add(line.livgiac(l), F_LIV1+l-1 - FIRST_FIELD); + r.add(line.codmag(), F_MAGAZZINO - FIRST_FIELD); + r.add(line.coddep(), F_DEPOSITO - FIRST_FIELD); + r.add(line.codimp(),F_CODIMP - FIRST_FIELD); + r.add(line.codlin(),F_CODLIN - FIRST_FIELD); + r.add("",F_PREZZO - FIRST_FIELD); + r.add(line.description(),F_DESCART - FIRST_FIELD); + r.add(qta.val().string(),F_QUANTITA - FIRST_FIELD); + r.add(qta.um(),F_UM - FIRST_FIELD); + // aggiunge il fabbisogno + qta.convert2umbase(); + q = iref.qta() / totreq * qta.val(); + r.add(q.string(), F_FABBISOGNO - FIRST_FIELD); + + a.add(r); + } while ((grref > 0 || srref > 0 || plref > 0) && qtareq > ZERO); + return 0; +} + +int TRisalita_mask::add_gross_ref(const TMRP_line& line, int bucket) +{ + TSheet_field& s = sfield(F_ORDINI); + TString_array& a = s.rows_array(); + + TToken_string dockey; + real totreq, qtaplan, qtareq; + TMRP_time deliv_time = line.time(bucket); + TMRP_time doc_time; + line.lead_time(bucket,doc_time, TRUE); + TToken_string r; + //const TString & codnum = docref->codnumdoc(); + TMRP_docref * docref = NULL; + TMRP_docrefs * gr_refs= line.record(bucket).requirements_refs(); + int grref = gr_refs ? gr_refs->items() : 0; + while (grref) + { + docref = gr_refs->get_ref_ptr(--grref); + qtaplan = docref->qta_residua(); + qtaplan.round(5); + dockey.add("D",0); + dockey.add(docref->annodoc(),1); + dockey.add(docref->codnumdoc(),2); + dockey.add(docref->numdoc(),3); + r.add(cache().get(LF_DOC,dockey).get(DOC_DATADOC),F_DATADOC - FIRST_FIELD); // data del documento di rif. + r.add(docref->annodoc(), F_DOCANNODOC - FIRST_FIELD); + r.add(docref->codnumdoc(), F_DOCCODNUM - FIRST_FIELD); + r.add(docref->numdoc(), F_DOCNUM - FIRST_FIELD); + r.add(docref->numrig(), F_DOCNRIGA - FIRST_FIELD); + r.add(deliv_time.date().string(), F_DATACONS - FIRST_FIELD); + r.add(" ",F_FORNITORE - FIRST_FIELD); + const TCodice_um um_nulla; + const TQuantita qta(line.articolo(), docref->um(), qtaplan); + r.add(qta.val().string(),F_QUANTITA - FIRST_FIELD); + r.add(qta.um(),F_UM - FIRST_FIELD); + r.add(qtaplan.string(), F_FABBISOGNO - FIRST_FIELD); + r.add(qta.um(),F_UMFABB - FIRST_FIELD); + a.add(r); + } + return 0; +} + /////////////////////////////////////////////////////////// // TMatResPlanning /////////////////////////////////////////////////////////// @@ -1059,8 +1669,9 @@ static long table_items(const char* tab) /////////// finished: 100% /////////// tested : 100% -bool TMatResPlanning::load_gross_requirements(const TMatResMask& m) +bool TMatResPlanning::load_gross_requirements() { + const TMatResMask& m = *_mask; TDate date_fr = m.get(F_DADATA); const int bucket_fr = m.round_date(date_fr, FALSE); @@ -1072,9 +1683,10 @@ bool TMatResPlanning::load_gross_requirements(const TMatResMask& m) const bool master = m.get(F_ORC_MASTER)[0] == 'M'; // azzera l'array _requirements const bool nomag = m.get_bool(F_NOMAG); + const bool nodep = m.get_bool(F_NODEP); const bool noimp = m.get_bool(F_NOIMP); const bool nolin = m.get_bool(F_NOLIN); - _articles.ignore(nomag, noimp, nolin); + _articles.ignore(nomag, nodep, noimp, nolin); _articles.destroy(); TTable num("%NUM"); @@ -1140,21 +1752,23 @@ bool TMatResPlanning::load_gross_requirements(const TMatResMask& m) TDate datacons = riga.get(RDOC_DATACONS); if (!datacons.ok()) datacons = doc_cons; // Data consegna troppo avanti - if (datacons > date_to) + if (datacons > date_to) continue; if (riga.is_articolo()) { const real qta = riga.qtaresidua(); + real prz = riga.prezzo(TRUE,TRUE); if (qta > ZERO) { const TCodice_articolo art = riga.get(RDOC_CODARTMAG); const TString16 liv = riga.get(RDOC_LIVELLO); - const TString8 mag = nomag ? EMPTY_STRING : riga.get(RDOC_CODMAG); + const TString8 mag = nomag ? EMPTY_STRING : riga.get(RDOC_CODMAG).left(nodep ? 3 : 5); const TString8 imp = noimp ? EMPTY_STRING : riga.get(RDOC_IMPIANTO); const TString8 lin = nolin ? EMPTY_STRING : riga.get(RDOC_LINEA); const TCodice_um um = riga.get(RDOC_UMQTA); TQuantita q(art, um, qta); + prz *= q.conv(); q.convert2umbase(); TMRP_line* line = _articles.find(art, liv, mag, "", imp, lin, 0L); if (line == NULL) @@ -1163,8 +1777,14 @@ bool TMatResPlanning::load_gross_requirements(const TMatResMask& m) line = _articles.find(art, liv, mag, "", imp, lin, 0L, TRUE); line->set_description(riga.get(RDOC_DESCR)); } + TString8 codnum = doc.get(DOC_CODNUM); + long docnum = doc.get_long(DOC_NDOC); + int numriga = riga.get_int(RDOC_NRIGA); + TMRP_docref * docref = new TMRP_docref(doc.get_int(DOC_ANNO), codnum, docnum, + numriga, um, qta, prz); + const TMRP_time t(datacons, 0, imp, lin); - line->add_gross_req(t, q.val()); + line->add_gross_req(t, q.val(), docref); if (master) line->add_net_req(t, q.val()); } @@ -1181,8 +1801,9 @@ bool TMatResPlanning::load_gross_requirements(const TMatResMask& m) /////////// finished: 100% /////////// tested : 100% -bool TMatResPlanning::explode_articles(const TMatResMask& m) +bool TMatResPlanning::explode_articles() { + const TMatResMask& m = *_mask; TDistinta_tree distinta; // albero distinta TArray boom; // array per i figli int level = 1; @@ -1211,11 +1832,10 @@ bool TMatResPlanning::explode_articles(const TMatResMask& m) return FALSE; TMRP_line& line = _articles[a]; - if (distinta.set_root(line.codice())) + if (distinta.set_root(line.articolo(), "", 1.0 , line.livgiac())) { - distinta.set_global("_DISTINTA", line.codice()); - distinta.set_global("_LIVELLO", line.livgiac()); - distinta.set_global("_MAGAZZINO", line.codmag()); + distinta.set_global("_DISTINTA", line.articolo()); + distinta.set_global("_MAGAZZINO", line.codmagdep()); distinta.set_global("_IMPIANTO", line.codimp()); distinta.set_global("_LINEA", line.codlin()); @@ -1235,9 +1855,9 @@ bool TMatResPlanning::explode_articles(const TMatResMask& m) if (add) { // articolo gestito dall'MRP - TString16 mag = line.codmag(); - TString16 imp = line.codimp(); - TString16 lin = line.codlin(); + TString8 mag = line.codmagdep(); + TString8 imp = line.codimp(); + TString8 lin = line.codlin(); _artinfo.art2magimpline(art, mag, imp, lin); TMRP_line* son = _articles.find(art, riga.giacenza(),mag, "", imp, lin, 0L); if (son == NULL) @@ -1246,6 +1866,7 @@ bool TMatResPlanning::explode_articles(const TMatResMask& m) son->set_description(distinta.describe(art)); } line.add_son(riga.val(), son); + distinta.describe(art); } } } @@ -1258,8 +1879,9 @@ bool TMatResPlanning::explode_articles(const TMatResMask& m) /////////// finished: 100% /////////// tested: -bool TMatResPlanning ::load_planned_orders(const TMatResMask& m) +bool TMatResPlanning::load_planned_orders() { + const TMatResMask& m = *_mask; TDate date_fr = m.get(F_DADATA); const int bucket_fr = m.round_date(date_fr, FALSE); @@ -1343,26 +1965,35 @@ bool TMatResPlanning ::load_planned_orders(const TMatResMask& m) if (riga.is_articolo()) { const real qta = riga.qtaresidua(); + real prz = riga.prezzo(TRUE,TRUE); if (qta > ZERO) { const TCodice_articolo art = riga.get(RDOC_CODARTMAG); const TString16 liv = riga.get(RDOC_LIVELLO); - const TString16 mag = riga.get(RDOC_CODMAG); - const TString16 imp = riga.get(RDOC_IMPIANTO); - const TString16 lin = riga.get(RDOC_LINEA); - TMRP_line* line = _articles.find(art, liv, mag, "", imp, lin, 0L, TRUE); - if (line != NULL) + const TString8 mag = riga.get(RDOC_CODMAG); + const TString8 imp = riga.get(RDOC_IMPIANTO); + const TString8 lin = riga.get(RDOC_LINEA); + const long clifor = doc.get_long(DOC_CODCF); + TMRP_line* line = _articles.find(art, liv, mag, "", imp, lin, 0L); + if (line == NULL) { - const TCodice_um um = riga.get(RDOC_UMQTA); - TQuantita q(art, um, qta); - q.convert2umbase(); - - const TMRP_time t(consegna, 0, imp, lin); - if (has_confirmed_status(doc, a.row(sheetrow))) - line->add_sched_rec(t, q.val()); - else - line->add_planned_ord(t, q.val()); + line = _articles.find(art, liv, mag, "", imp, lin, 0L, TRUE); + line->set_description(riga.get(RDOC_DESCR)); } + const TCodice_um um = riga.get(RDOC_UMQTA); + TQuantita q(art, um, qta); + prz *= q.conv(); + q.convert2umbase(); + TString8 codnum = doc.get(DOC_CODNUM); + long docnum = doc.get_long(DOC_NDOC); + int numriga = riga.get_int(RDOC_NRIGA); + TMRP_docref * docref = new TMRP_docref(doc.get_int(DOC_ANNO), codnum, docnum, + numriga, um, q.val(), prz); + const TMRP_time t(consegna, 0, imp, lin); + if (has_confirmed_status(doc, a.row(sheetrow))) + line->add_sched_rec(t, q.val(), docref); + else + line->add_planned_ord(t, q.val(), docref); } } } @@ -1376,15 +2007,15 @@ bool TMatResPlanning ::load_planned_orders(const TMatResMask& m) /////////// finished: 99% /////////// tested: 99% -bool TMatResPlanning::preprocess_cycle(const TMatResMask& m) +bool TMatResPlanning::preprocess_cycle() { // costruisce il gross requirement dai DOC di planning - bool ok=load_gross_requirements(m); + bool ok=load_gross_requirements(); // costruisce gli sched rec degli elementi dai DOCS ordini fornitore emessi - ok |= load_planned_orders(m); + ok |= load_planned_orders(); if (ok) // esplode l'array mediante la DIBA - return explode_articles(m); + return explode_articles(); /* // costruisce il gross requirement dai DOC di planning @@ -1401,8 +2032,18 @@ bool TMatResPlanning::preprocess_cycle(const TMatResMask& m) /////////// tested: // implementa la logica che porta dal fabbisogno lordo a quello netto // per quel bucket e riporta il balance on hand sul bucket successivo -bool TMatResPlanning::gross2net_logic(TMRP_line &curr_article, int bucket, bool lotsizing_f, bool lotsizing_p, bool use_leadtime) +// ipotesi essenziale per il rescheduling: la chiamata della funzione +// deve essere fatta ciclicamente su tutti i bucket di un articolo +// prima di passare ad un altro articolo +bool TMatResPlanning::gross2net_logic(TMRP_line &curr_article, int bucket) { + const TMatResMask& m = *_mask; + + const TDate& start_date =m.get_date(F_DADATA); + const bool lotsizing_p =m.get_bool(F_LOTSIZING_P); + const bool lotsizing_f =m.get_bool(F_LOTSIZING_F); + const bool use_leadtime =!m.get_bool(F_IGN_LDTIME); + // Verifico se esiste gia' un fabbisogno netto real sm,tmpreal = -curr_article.net_requirement(bucket); if (tmpreal >= ZERO) // Devo calcolare il fabbisogno netto @@ -1413,6 +2054,7 @@ bool TMatResPlanning::gross2net_logic(TMRP_line &curr_article, int bucket, bool tmpreal -= sm; } tmpreal += curr_article.sched_receipts(bucket); + // tmpreal += curr_article.planned_orders(bucket); //planned orders are not added here, but in build orders phase // adegua il quantitativo del fabbisogno netto in base al lot-sizing, se il valore risulta negativo const int n_figli = curr_article.sons(); @@ -1433,7 +2075,8 @@ bool TMatResPlanning::gross2net_logic(TMRP_line &curr_article, int bucket, bool // trasforma i fabbisogni totali nel fabbisogno lordo dei figli net_req += curr_article.sched_receipts(bucket); - if (net_req > ZERO) + // net_req += curr_article.planned_orders(bucket);//planned orders are not added here, but in build orders phase + if (net_req > ZERO && n_figli) { TMRP_time lead_time; curr_article.lead_time(bucket, lead_time, use_leadtime); @@ -1443,21 +2086,22 @@ bool TMatResPlanning::gross2net_logic(TMRP_line &curr_article, int bucket, bool TMRP_line& article_son = curr_article.son(o); tmpreal = net_req * curr_article.qta_son(o); if (tmpreal > ZERO) - article_son.add_gross_req(lead_time, tmpreal); + { + TMRP_internalref * iref = new TMRP_internalref( &curr_article, bucket, tmpreal); + article_son.add_gross_req(lead_time, tmpreal, iref); + } } } - curr_article.add_proposed_ord(bucket, curr_article.net_requirement(bucket)); return TRUE; } /////////// finished: 99% /////////// tested: -bool TMatResPlanning::net_requirement_cycle(const TMatResMask& m) +bool TMatResPlanning::net_requirement_cycle() { + const TMatResMask& m = *_mask; + bool ok = TRUE; - const bool lotsizing_p=m.get_bool(F_LOTSIZING_P); - const bool lotsizing_f=m.get_bool(F_LOTSIZING_F); - const bool use_leadtime=!m.get_bool(F_IGN_LDTIME); // ordina gli articoli const long total = _articles.sort(); @@ -1478,7 +2122,11 @@ bool TMatResPlanning::net_requirement_cycle(const TMatResMask& m) for (int bucket = 0; ok && bucket <= last; bucket = curr_article.next_bucket(bucket)) { - ok = gross2net_logic(curr_article, bucket, lotsizing_f, lotsizing_p, use_leadtime); + // !?!?! la logica gross2net dovrebbe funzionare in termini di intervalli di date + // (bucket-utente) piuttosto che di bucket di MRPline (che possono essere più di uno + // in un intervallo, altrimenti i ragionamenti di scorte minime e lotti + // funzionano in modo sbagliato, perchè approssimano più volte + ok = gross2net_logic(curr_article, bucket); if (!ok) break; } @@ -1490,16 +2138,16 @@ bool TMatResPlanning::net_requirement_cycle(const TMatResMask& m) /////////// finished: 100% /////////// tested : 100% // genera le righe degli ordini di produzione o a fornitore -bool TMatResPlanning::build_orders(TMatResMask& m) +bool TMatResPlanning::build_orders() { + TMatResMask& m = *_mask; + TSheet_field& sf = m.sfield(F_ORDINI); sf.destroy(); -// TArticolo articolo; const long tot = _articles.items(); if (tot > 0L) { - const int extratime = m.get_int(F_XTRA_LDTIME); TProgind pi(tot, "Generazione righe ordini...", FALSE, TRUE); for (long a = 0; a < tot; a++) @@ -1507,28 +2155,18 @@ bool TMatResPlanning::build_orders(TMatResMask& m) pi.addstatus(1); const TMRP_line& line = _articles[a]; - const TRectype& anarec = cache().get(LF_ANAMAG,line.codice()); - const TRectype& distrec = cache().get(LF_DIST,line.codice()); + const TRectype& anarec = cache().get(LF_ANAMAG,line.articolo()); + const TRectype& distrec = cache().get(LF_DIST,line.articolo()); const bool prod = distrec.get_bool("ARTPROD"); const long forn = prod ? 0 : anarec.get_long("CODFORN"); for (int b = line.last_bucket(); b >= 0; b--) { + const TMRP_record & rrr = line.record(b); real qta = line.net_requirement(b); - //qta -= line.planned_orders(b); + qta -= line.planned_orders(b); qta.round(5); if (!qta.is_zero()) - { - TMRP_time time = line.time(b); - if (line.sons() == 0) // Sottrai alle foglie il bonus - time.sub_time(extratime); - TDate date = time.date(); - m.round_date(date); - - //articolo.read(line.codice()); - //const char reorder_type=articolo.get_char(ANAMAG_RIORDINO); - //if (prod || reorder_type=='F' || reorder_type==' ' || reorder_type=='\0') - m.add_order_line(date, forn, line, b); - } + m.add_order_line(forn, line, b); } } } @@ -1540,40 +2178,424 @@ bool TMatResPlanning::build_orders(TMatResMask& m) TCodice_articolo codart; FOR_EACH_SHEET_ROW(sf,n,row) { - long codcli=atol(row->get(F_FORNITORE-FIRST_FIELD)); - const TRectype& rec=cache().get(LF_DIST,row->get(F_ARTICOLO-FIRST_FIELD)); - bool art_prod = rec.get_bool("ARTPROD"); - bool art_acq = rec.get_bool("ARTACQ") || codcli!=0L; + row->get(F_QUANTITA - FIRST_FIELD,qta); + row->get(F_ARTICOLO - FIRST_FIELD,codart); + long codcli=atol(row->get(F_FORNITORE - FIRST_FIELD)); + const TRectype& rec=cache().get(LF_DIST, codart); + bool art_prod, art_acq; - if (rec.empty()) // - art_prod=!(art_acq=TRUE); - TString16 tipoord=!art_acq ? "P":"F" ; - row->add(tipoord, F_ORD_TYPE-FIRST_FIELD); + if (rec.empty()) + { + art_acq=TRUE; + art_prod = cache().get(LF_ANAMAG, codart).get_bool(ANAMAG_ARTPROD); + } else { + art_prod = rec.get_bool("ARTPROD"); + art_acq = rec.get_bool("ARTACQ") || codcli!=0L; + } + TString4 tipoord = art_prod ? "P" : "F" ; + row->add(tipoord, F_ORD_TYPE - FIRST_FIELD); sf.check_row(n); if (tipoord=="P") tipoord=" "; else tipoord=m.get(F_TIPOCF_CONDV); - row->get(F_QUANTITA-FIRST_FIELD,qta); - row->get(F_ARTICOLO-FIRST_FIELD,codart); find_price(m.get(F_TIPOCV),m.get(F_CODCONDV),m.get(F_CATVEN_CV), - tipoord, codcli, - codart, qta, - price); - row->add(price.string(), F_PREZZO-FIRST_FIELD); + tipoord, codcli, codart, qta, price); + row->add(price.string(), F_PREZZO - FIRST_FIELD); + + if (!art_prod || !art_acq) + sf.disable_cell(n,F_ORD_TYPE - FIRST_FIELD); - sf.enable_cell(n,F_ORD_TYPE-FIRST_FIELD,art_prod != art_acq); } return TRUE; } +/////////// finished: 0% + +void TMatResPlanning::print_orders_header(TPrinter& pr) +{ + TString format; + TPrintrow row; + print_header(pr); + row.put("@48G@BSTAMPA PROPOSTE D'ORDINE DA M.R.P."); + pr.setheaderline(1,row); + row.reset(); + set_body_order_line(row, NULL); + pr.setheaderline(3,row); + row.reset(); + row.put((const char *)TString(131,'-')); + pr.setheaderline(4,row); +} +void TMatResPlanning::print_orders_body(TPrinter& pr, TToken_string *sheetrow) +{ + TPrintrow row; + // riga 1 + set_body_order_line(row, sheetrow); + + // riga 2 + pr.print(row); + row.reset(); + int pos = 31; + row.put(format("@%dG%s", pos, (const char *)sheetrow->get(F_DESCART-FIRST_FIELD))); + + if (*sheetrow->get(F_DOCCODNUM-FIRST_FIELD) > ' ') + { + row.put(format("@%dGDocumento %s", pos+= 54+1, (const char *)sheetrow->get(F_DOCCODNUM-FIRST_FIELD))); + row.put(format("@%dG%d", pos+= 4+10+1, sheetrow->get_int(F_DOCANNODOC-FIRST_FIELD))); + row.put(format("@%dGn.%6ld", pos+= 4+1, sheetrow->get_long(F_DOCNUM-FIRST_FIELD))); + row.put(format("@%dGriga %3d", pos+= 2+6+1, sheetrow->get_int(F_DOCNRIGA-FIRST_FIELD))); + } + pr.print(row); +} + +void TMatResPlanning::set_body_order_line(TPrintrow &row, TToken_string *sheetrow) +{ + int pos = 0; + row.put(format("@b@%dG%1s", pos, sheetrow ? (const char *)sheetrow->get(F_ORD_TYPE-FIRST_FIELD): "")); + row.put(format("@%dG%6s", pos+= 1+1, sheetrow ? (const char *)sheetrow->get(F_FORNITORE-FIRST_FIELD): "CliFor")); + row.put(format("@%dG%s", pos+= 6+1, sheetrow ? (const char *)sheetrow->get(F_DATADOC-FIRST_FIELD): "Data doc.")); + row.put(format("@%dG%s", pos+= 10+1, sheetrow ? (const char *)sheetrow->get(F_DATACONS-FIRST_FIELD): "Consegna")); + row.put(format("@%dG%s", pos+= 10+1, sheetrow ? (const char *)sheetrow->get(F_ARTICOLO-FIRST_FIELD): "Codice articolo")); + pos += 20+1; + for (int l = 1; l <= livelli_giacenza().last_level(); l++) + { + const int len = livelli_giacenza().code_length(l); + if (sheetrow == NULL) + { + if (l == 1) + row.put(format("@%dG%s", pos, "Livello")); + } + else + row.put(format("@%dG%s", pos, (const char *)sheetrow->get(F_LIV1+l-1-FIRST_FIELD))); + pos += len+1; + } + real r; + if (sheetrow) + { + sheetrow->get(F_QUANTITA-FIRST_FIELD, r); + row.put(format("@%dG%18s", pos, (const char *)r.string(18,5))); + } else { + row.put(format("@%dGQuantita'", pos+8)); + } + row.put(format("@%dG%s", pos+= 18+1, sheetrow ? (const char *)sheetrow->get(F_UM-FIRST_FIELD): "UM")); + if (sheetrow) + sheetrow->get(F_PREZZO-FIRST_FIELD, r); + TCurrency c(TRUE); + c.set_num(r); + row.put(format("@%dG%18s", pos+=2+1, sheetrow ? (const char *)c.string(): "Prezzo")); + row.put(format("@%dG%3s", pos+=18+1, sheetrow ? (const char *)sheetrow->get(F_MAGAZZINO-FIRST_FIELD): "Mag.")); + row.put(format("@%dG%2s", pos+= 3+1, sheetrow ? (const char *)sheetrow->get(F_DEPOSITO-FIRST_FIELD): "")); + row.put(format("@%dG%5s", pos+= 2+1, sheetrow ? (const char *)sheetrow->get(F_CODIMP-FIRST_FIELD): "Imp.")); + row.put(format("@%dG%5s", pos+= 5+1, sheetrow ? (const char *)sheetrow->get(F_CODLIN-FIRST_FIELD): "Linea")); + pos += 5+1; +} + +/////////// tested : 0% +// stampa le proposte d'ordine +bool TMatResPlanning::print_orders() +{ + TMatResMask& m = *_mask; + TSheet_field& sf = m.sfield(F_ORDINI); + if (sf.items() < 1) + { + message_box("Nessun ordine da stampare"); + return FALSE; + } + TMask pmask("mr2100c.msk"); + pmask.set(S_LIV_RISALITA,1); + while (pmask.run() != K_ESC) + { + TPrinter& pr = printer(); + pr.open(); + if (pmask.get(S_PRINTTYPE)[0] == 'O') + { + if (pmask.get_bool(S_RISALITA)) + { + TIndwin(60,"Ordinamento proposte per articolo/data...",FALSE); + sf.sort(order_compareADTF); + } + pr.setheaderhandler(print_orders_header); + pr.headerlen(6); + pr.setfooterhandler(print_footer); + pr.footerlen(2); + + TString last_key; + TString key; + FOR_EACH_SHEET_ROW(sf, r, row) + { + key = row->get(F_ARTICOLO-FIRST_FIELD); + key << row->get(F_DATACONS-FIRST_FIELD); + if (last_key.blank()) + last_key = key; + print_orders_body(pr,row); + if (pmask.get_bool(S_RISALITA) /*&& (key != last_key || sf.items() == r)*/) + { + print_risalita(*row, pmask.get_int(S_LIV_RISALITA), pmask.get_bool(S_DETT_ORDINI)); + last_key=key; + } + if (pmask.get_bool(S_INTERLINEA)) + { + TPrintrow prow; + pr.print(prow); + } + } + } + pr.close(); + } + return TRUE; +} + +bool TMatResPlanning::print_risalita(TToken_string &row, int ris_level, bool dett_ord) +{ + TPrinter& pr = printer(); + TMatResMask& m = *_mask; + TSheet_field& sf = m.sfield(F_ORDINI); + // rintraccia la TMRPline per la risalita + TString art; + TString16 liv; + TString8 mag, magc, imp, lin; + long codcf; + codcf = row.get_long(sf.cid2index(F_FORNITORE)); + row.get(sf.cid2index(F_ARTICOLO), art); + for (int l= livelli_giacenza().last_level(); l>=1; l--) + livelli_giacenza().pack_grpcode(liv, row.get(sf.cid2index(F_LIV1+l-1)), l); + add_magcode(mag, row.get(sf.cid2index(F_MAGAZZINO))); + add_depcode(mag, row.get(sf.cid2index(F_DEPOSITO ))); + row.get(sf.cid2index(F_CODIMP), imp); + row.get(sf.cid2index(F_CODLIN), lin); + + TMRP_line* line = _articles.find(art, liv, mag, magc, imp, lin, codcf); + if (!line) + line = _articles.find(art, liv, mag, magc, imp, lin, 0L); + if (line) + { + print_risalita(*line, row.get(sf.cid2index(F_DATACONS)), ris_level, dett_ord); + return TRUE; + } + else + { + TPrintrow prow; + prow.put(format("@32gRisalita: impossibile rintracciare la proposta originale")); + pr.print(prow); + return FALSE; + } +} + +bool TMatResPlanning::print_risalita(const TMRP_line & line, const TDate &date, int backlevel, bool dett_ord) +{ + TPrinter& pr = printer(); + TDate todate(date); + TDate fromdate = todate; + const bool isbuck0 = (round_date(fromdate) == 0); + round_date(todate,TRUE); + int rows=0; + real on_hand, lordo, netto, plan, sched; + for (int b = line.last_bucket(); b >= 0 ; b--) + { + const TDate &d = line.record(b).time().date(); + if ((isbuck0 || d >= fromdate)) + { + if (d <= todate) + { + on_hand = line.record(b).on_hand(); + lordo += line.gross_requirement(b); + netto += line.net_requirement(b); + plan += line.planned_orders(b); + sched += line.sched_receipts(b); + TMRP_internalrefs *irefs = line.record(b).internal_refs(); + if (irefs) + { + int ir = 0; + while (ir < irefs->items()) + { + TMRP_internalref &iref = irefs->get_ref(ir); + rows += print_internal_ref(iref, backlevel, dett_ord); + ir ++; + } + } else { + rows += print_gross_ref(line, b); + } + } + } + } + if (rows==0) + return FALSE; + TPrintrow prow; + int pos = 30; + prow.put(format("@%dg Totale fabbisogno lordo %s", pos, lordo.string(18,5))); + pr.print(prow); + prow.put(format("@%dg Giacenza iniziale %s", pos, on_hand.string(18,5))); + pr.print(prow); + if (dett_ord) + { + prow.put(format("@%dg Ordini pianificati %s", pos, plan.string(18,5))); + pr.print(prow); + prow.put(format("@%dg Ordini confermati %s", pos, sched.string(18,5))); + pr.print(prow); + } + sched += plan; + prow.put(format("@%dg Totale ordinato %s", pos, sched.string(18,5))); + pr.print(prow); + netto -= plan; + prow.put(format("@%dg Totale da pianificare %s", pos, netto.string(18,5))); + pr.print(prow); + if (backlevel>1 || backlevel<0) + { + prow.reset(); + pr.print(prow); + } + return TRUE; +} + +int TMatResPlanning::print_internal_ref(const TMRP_internalref &iref, int backlevel, bool dett_ord) +{ + TPrinter& pr = printer(); + int rows=0; + const TMRP_line& line=*iref.line(); + int bucket=iref.bucket(); + const TMRP_time &deliv_time = line.time(bucket); + { + TMRP_time doc_time; + line.lead_time(bucket,doc_time, TRUE); + TDate docdate = doc_time.date(); + + TToken_string dockey; + TMRP_docrefs * gr_refs= line.record(bucket).requirements_refs(); + int grref = gr_refs ? gr_refs->items() : 0; + TMRP_docrefs * pl_refs= line.record(bucket).plans_refs(); + int plref = pl_refs ? pl_refs->items() : 0; + TMRP_docrefs * sr_refs = line.record(bucket).scheduls_refs(); + int srref = sr_refs ? sr_refs->items() : 0; + real totreq = line.net_requirement(bucket); + totreq += line.sched_receipts(bucket); + real qtaplan(totreq); + real qtareq(totreq); + do { + TCodice_um um; + TPrintrow r1, r2; + real q = iref.qta(); + TMRP_docref * docref = NULL; + if (grref > 0) + docref = gr_refs->get_ref_ptr(--grref); + else if (srref > 0) + docref = sr_refs->get_ref_ptr(--srref); + else if (plref > 0) + docref = pl_refs->get_ref_ptr(--plref); + if (docref) + { + dockey.add("D",0); + dockey.add(docref->annodoc(),1); + dockey.add(docref->codnumdoc(),2); + dockey.add(docref->numdoc(),3); + qtaplan = docref->qta_residua(); + qtaplan.round(5); + TQuantita qta(line.articolo(), docref->um(), docref->qta_residua()); + qta.convert2umbase(); + qtareq = qtareq - qta.val(); + qtareq.round(5); + // documento di rif. + docdate = cache().get(LF_DOC,dockey).get(DOC_DATADOC); + r2.put(format("@86gDocumento %s",(const char *)docref->codnumdoc() )); + r2.put(format("@101g%d",docref->annodoc() )); + r2.put(format("@106gn.%6ld",docref->numdoc())); + r2.put(format("@115griga %3d",docref->numrig())); + um = docref->um(); + } + else + { + qtaplan = qtareq; + } + TQuantita qta(line.articolo(), um, qtaplan); + r1.put(format("@9g%s", (const char *) docdate.string())); + r1.put(format("@20g%s", (const char *)deliv_time.date().string())); + r1.put(format("@31g%s", (const char *)line.articolo())); + int pos= 52; + for (int l = 1; l <= livelli_giacenza().last_level(); l++) + { + r1.put(format("@%dg%s",pos, (const char *)line.livgiac(l))); + pos += livelli_giacenza().code_length(l)+1; + } + // aggiunge il fabbisogno + r1.put(format("@%dg%s", pos+18+1+2+1, (const char *)qta.val().string(15,2))); + r1.put(format("@%dg%s", pos+18+1+2+1+15+1, (const char *)qta.um())); + qta.convert2umbase(); + q = iref.qta() / totreq * qta.val(); + r1.put(format("@%dg%s", pos, (const char *)q.string(18,5))); + r1.put(format("@%dg%s", pos+=18+1, (const char *)"\"\"")); + pos +=2+1+15+1; + r1.put(format("@%dg%s", pos+=2+1, (const char *)line.codmag())); + r1.put(format("@%dg%s", pos+=3+1, (const char *)line.coddep())); + r1.put(format("@%dg%s", pos+=2+1, (const char *)line.codimp())); + r1.put(format("@%dg%s", pos+=5+1, (const char *)line.codlin())); + + r2.put(format("@31g%s", (const char *)line.description())); + + pr.print(r1); + pr.print(r2); + rows++; + } while ((grref > 0 || srref > 0 || plref > 0) && qtareq > ZERO); + } + if (--backlevel != 0) + print_risalita(line, deliv_time.date(), backlevel, dett_ord); + return rows; +} + +int TMatResPlanning::print_gross_ref(const TMRP_line& line, int bucket) +{ +return 0; + TPrinter& pr = printer(); + + TToken_string dockey; + + real totreq, qtaplan, qtareq; + TMRP_time deliv_time = line.time(bucket); + TMRP_time doc_time; + line.lead_time(bucket,doc_time, TRUE); + TPrintrow r; + //const TString & codnum = docref->codnumdoc(); + TMRP_docref * docref = NULL; + TMRP_docrefs * gr_refs= line.record(bucket).requirements_refs(); + int grref = gr_refs ? gr_refs->items() : 0; + while (grref) + { + docref = gr_refs->get_ref_ptr(--grref); + qtaplan = docref->qta_residua(); + qtaplan.round(5); + dockey.add("D",0); + dockey.add(docref->annodoc(),1); + dockey.add(docref->codnumdoc(),2); + dockey.add(docref->numdoc(),3); + // data del documento di rif. + //r.put(format("", add(cache().get(LF_DOC,dockey).get(DOC_DATADOC))); + r.put(format("@82g%d",docref->annodoc())); + r.put(format("@86g%s",(const char *) docref->codnumdoc())); + r.put(format("@90g%ld", docref->numdoc())); + r.put(format("@100g%riga n.d", docref->numrig())); + //r.put(format("", deliv_time.date().string()); + const TCodice_um um_nulla; + const TQuantita qta(line.articolo(), docref->um(), qtaplan); + r.put(format("@10g%s", (const char *)qta.val().string())); + r.put(format("@30g%s", (const char *)qta.um())); + r.put(format("@50g%s", (const char *)qtaplan.string())); + r.put(format("@70g%s", (const char *)qta.um())); + } + return 0; +} + + /////////// finished: 90% /////////// tested : 90% // genera gli ordini di produzione o a fornitore -bool TMatResPlanning::emit_orders(TMatResMask& m) +bool TMatResPlanning::emit_orders() { + TMatResMask& m = *_mask; + TSheet_field& sf = m.sfield(F_ORDINI); + const bool divide_by_date = m.get_bool(F_DIVIDEBYDATE); + const bool divide_by_art = m.get_bool(F_DIVIDEBYART); + TTipo_documento tipo_doc_forn(m.get(F_TIPO_FORN )); + TTipo_documento tipo_doc_prod(m.get(F_TIPO_PROD )); TDate today(TODAY); int docf = 0, docp = 0; @@ -1584,38 +2606,65 @@ bool TMatResPlanning::emit_orders(TMatResMask& m) TToken_string& riga = *row; if (*riga.get(0) == 'X') { + bool ok=TRUE; + const bool newdoc = riga.get_long(F_DOCNUM - FIRST_FIELD) == 0L; const TDate datadoc = riga.get(sf.cid2index(F_DATADOC)); const TDate datacon = riga.get(sf.cid2index(F_DATACONS)); const char type = riga.get_char(sf.cid2index(F_ORD_TYPE)); const bool prod = type == 'P'; const long forn = prod ? 0 : riga.get_long(sf.cid2index(F_FORNITORE)); - const real qta(riga.get(sf.cid2index(F_QUANTITA))); + const long numdoc = riga.get_long(sf.cid2index(F_DOCNUM)); + real qta(riga.get(sf.cid2index(F_QUANTITA))); riga.add(" ",sf.cid2index(F_OK)); if (qta.is_zero()) continue; - if (datadoc < today) + if (datadoc < today && newdoc) if (!noyes_box("Riga %d: data di emissione del documento (%s) inferiore a quella odierna. Confermi ?",r+1,(const char *)datadoc.string())) continue; - if (datacon < datadoc) + if (datacon < datadoc && newdoc) if (!noyes_box("Riga %d: data di consegna (%s) inferiore a quella di emissione del documento (%s). Confermi ?",r+1,(const char *)datacon.string(), (const char *)datadoc.string())) continue; - if (prod || forn!=0L) + if (forn == 0L && newdoc) + { + if ((prod && !tipo_doc_prod.clifo_optional()) || + (!prod && !tipo_doc_forn.clifo_optional())) + { + error_box("Codice fornitore mancante alla riga %d", r+1); + continue; + } + } + key.cut(0); + if (newdoc) { - key = datadoc.string(); - key.add(datacon.string()); key.add(type); key.add(forn); - TDocumento* doc = (TDocumento*)docs.objptr(key); - if (doc == NULL) + key.add(datadoc.string()); + key.add(divide_by_date ? datacon.string() : " "); + key.add(divide_by_art ? riga.get(sf.cid2index(F_ARTICOLO)) : " "); + } else { + key.format("%c%ld",prod ? 'P':'F',numdoc); + } + TDocumento* doc = (TDocumento*)docs.objptr(key); + if (doc == NULL) + { + const TString& codnum = m.get(prod ? F_NUM_PROD : F_NUM_FORN ); + const TString& tipdoc = m.get(prod ? F_TIPO_PROD: F_TIPO_FORN ); + doc = new TDocumento('D', datadoc.year(), codnum, 0); + doc->set_tipo(tipdoc); + TRectype& testata = doc->head(); + if (numdoc) + { + doc->put(DOC_NDOC, numdoc); + ok = doc->read()==NOERR; + } + else { - const TString& codnum = m.get(prod ? F_NUM_PROD : F_NUM_FORN ); - const TString& tipdoc = m.get(prod ? F_TIPO_PROD: F_TIPO_FORN ); - doc = new TDocumento('D', datadoc.year(), codnum, 0); - doc->set_tipo(tipdoc); - TRectype& testata = doc->head(); testata.put(DOC_DATADOC, datadoc); - testata.put(DOC_DATACONS, datacon); + testata.put(DOC_DATACONS, divide_by_date ? datacon : datadoc); + } + if (ok) + { if (prod) docp++; else @@ -1626,53 +2675,78 @@ bool TMatResPlanning::emit_orders(TMatResMask& m) } docs.add(key, doc); } - TRiga_documento& rdoc = doc->new_row(m.get(prod ? F_RIGA_PROD : F_RIGA_FORN)); + } + if (ok) + { + int numriga = riga.get_int(sf.cid2index(F_DOCNRIGA)); + TRiga_documento& rdoc = numdoc ? (*doc)[numriga] : doc->new_row(m.get(prod ? F_RIGA_PROD : F_RIGA_FORN)); + if (numdoc) + qta += rdoc.get_real(RDOC_QTA); rdoc.put(RDOC_CODART, riga.get(sf.cid2index(F_ARTICOLO))); - + TString80 str; - TCodice_livelli & livelli = m.livelli_giacenza(); - livelli.pack_grpcode(str, riga.get(sf.cid2index(F_LIV1)), 1); - livelli.pack_grpcode(str, riga.get(sf.cid2index(F_LIV2)), 2); - livelli.pack_grpcode(str, riga.get(sf.cid2index(F_LIV3)), 3); - livelli.pack_grpcode(str, riga.get(sf.cid2index(F_LIV4)), 4); + for (int l= livelli_giacenza().last_level(); l>=1; l--) + livelli_giacenza().pack_grpcode(str, riga.get(sf.cid2index(F_LIV1+l-1)), l); rdoc.put(RDOC_LIVELLO,str); - + add_magcode(str,riga.get(sf.cid2index(F_MAGAZZINO))); add_depcode(str,riga.get(sf.cid2index(F_DEPOSITO))); rdoc.put(RDOC_CODMAG, str); - + rdoc.put(RDOC_IMPIANTO, riga.get(sf.cid2index(F_CODIMP))); rdoc.put(RDOC_LINEA, riga.get(sf.cid2index(F_CODLIN))); rdoc.put(RDOC_QTA, qta); + rdoc.put(RDOC_UMQTA, riga.get(sf.cid2index(F_UM))); rdoc.put(RDOC_PREZZO, riga.get(sf.cid2index(F_PREZZO))); - TString ddd=riga.get(sf.cid2index(F_DESCART)); rdoc.put(RDOC_DESCR, riga.get(sf.cid2index(F_DESCART))); - + if (!divide_by_date) + rdoc.put(RDOC_DATACONS,datacon.string()); + riga.add("X",sf.cid2index(F_OK)); } - else - error_box("Codice fornitore mancante alla riga %d", r+1); } } const int tot = int(docs.items()); if (tot > 0 && yesno_box("Confermare la generazione di\n" "%d ordini di produzione e di\n" - "%d odini a fornitori?", docp, docf)) + "%d ordini a fornitori?", docp, docf)) { TProgind pi(tot, "Generazione ordini", FALSE, TRUE); FOR_EACH_ASSOC_OBJECT(docs, hash, str, obj) { pi.addstatus(1); - TDocumento* doc = (TDocumento*)obj; - if (doc->write()!=NOERR) - doc->read(); // unlock + TDocumento& doc = (TDocumento&)*obj; + int err; + if (doc.get_long(DOC_NDOC)) + { + // riscrittura; elimina righe con qta zero + for (int numriga = doc.physical_rows(); numriga >0 ; numriga--) + { + if (doc[numriga].get_real(RDOC_QTA).is_zero()) + doc.destroy_row(numriga, TRUE); + } + err = doc.rewrite(); + } + else + // generazione + err = doc.write(); + if (err != NOERR) + doc.read(); // unlock } FOR_EACH_SHEET_ROW_BACK(sf, r, row) { if (*row->get(sf.cid2index(F_SELECTED)) == 'X' && *row->get(sf.cid2index(F_OK))=='X') - sf.destroy(r); + { + if (m.get_bool(F_ALLORDERS)) + { + row->add("", sf.cid2index(F_QUANTITA)); + sf.force_update(r); + } + else + sf.destroy(r); + } } m.enable(DLG_SAVEREC, sf.items() > 0); @@ -1681,11 +2755,47 @@ bool TMatResPlanning::emit_orders(TMatResMask& m) return tot > 0; } -void TMatResPlanning::compute(TMatResMask& m) +void TMatResPlanning::compute() { - if (preprocess_cycle(m)) // req iniziale dai docs - if (net_requirement_cycle(m)) - build_orders(m); + if (preprocess_cycle()) // req iniziale dai docs + if (net_requirement_cycle()) + build_orders(); +} + +void TMatResPlanning::risalita(const TMask & m) +{ + TSheet_field & sf= m.sfield(F_ORDINI); + TToken_string & row=sf.row(sf.selected()); + TString art; + TString16 liv; + TString8 mag, magc, imp, lin; + long codcf; + codcf = row.get_long(sf.cid2index(F_FORNITORE)); + row.get(sf.cid2index(F_ARTICOLO), art); + for (int l= livelli_giacenza().last_level(); l>=1; l--) + livelli_giacenza().pack_grpcode(liv, row.get(sf.cid2index(F_LIV1+l-1)), l); + add_magcode(mag, row.get(sf.cid2index(F_MAGAZZINO))); + add_depcode(mag, row.get(sf.cid2index(F_DEPOSITO ))); + row.get(sf.cid2index(F_CODIMP), imp); + row.get(sf.cid2index(F_CODLIN), lin); + + if (art.blank()) + return; + TMRP_line* line = _articles.find(art, liv, mag, magc, imp, lin, codcf); + if (!line) + line = _articles.find(art, liv, mag, magc, imp, lin, 0L); + if (line) + { + TDate todate(row.get(sf.cid2index(F_DATACONS))); + TDate fromdate = todate; + round_date(fromdate); + round_date(todate,TRUE); + TRisalita_mask *rismask; + rismask = new TRisalita_mask(line, fromdate, todate, fromdate <= _mask->get_date(F_DADATA)); + rismask->run(); + delete rismask; + } else + message_box("Impossibile rintracciare la riga d'ordine indicata tra quelle generate in MRP"); } void TMatResPlanning::main_loop() @@ -1695,22 +2805,45 @@ void TMatResPlanning::main_loop() open_files(LF_ANAMAG, LF_DIST, LF_RDIST, 0); open_files(LF_MAG, 0); - TMatResMask m; + _mask = new TMatResMask; TConfig prassid(CONFIG_DITTA, "ve"); // apre il file di configurazione della ditta corrente if (prassid.get_bool("GES", NULL, A_LISTINI)) { - m.enable(F_CATVEN_CV,prassid.get_bool("GESLISCV")); + _mask->enable(F_CATVEN_CV,prassid.get_bool("GESLISCV")); } else { - m.disable(F_TIPOCV); - m.disable(F_CATVEN_CV); + _mask->disable(F_TIPOCV); + _mask->disable(F_CATVEN_CV); } if (!prassid.get_bool("GES", NULL, A_CONTRATTI) || !prassid.get_bool("GESCONCC")) - m.disable(F_TIPOCF_CONDV); + _mask->disable(F_TIPOCF_CONDV); - while (m.run()!=K_QUIT); + while (_mask->run()!=K_QUIT); + + delete _mask; +} + +void print_header(TPrinter& pr) +{ + TString format; + TPrintrow row; + TLocalisamfile firm(LF_NDITTE); + TLocalisamfile anag(LF_ANAG); + firm.put("CODDITTA",main_app().get_firm()); + firm.read(); + anag.put("TIPOA",firm.get("TIPOA")); + anag.put("CODANAGR",firm.get("CODANAGR")); + anag.read(); + format << "@2g" << anag.get("RAGSOC")<< "@80g@>@110gPagina @#"; + row.put(format); + pr.setheaderline(0,row); +} +void print_footer(TPrinter& pr) +{ + TPrintrow row; + pr.setfooterline(1,row); } int mr2100(int argc, char* argv[]) diff --git a/mr/mr2100.h b/mr/mr2100.h index 767ed15a9..a00adb973 100755 --- a/mr/mr2100.h +++ b/mr/mr2100.h @@ -1,31 +1,55 @@ #ifndef __MR2100_H #define __MR2100_H +void print_header(TPrinter& pr); +void print_footer(TPrinter& pr); + +class TMRP_internalref; +class TMRP_internalrefs; +class TMRP_docref; +class TMRP_docrefs; +class TMRP_line; + class TMRP_record : public TObject { TMRP_time _time; // time - real _gross_requirement; // gross req real _on_hand; // projected on hand - real _sched_receipts; // scheduled receipts (released ) + real _unsched_orders; // unscheduled orders + real _resched_orders; // rescheduled orders real _net_requirement; // lot-sized net requirement + real _gross_requirement; // gross req + real _sched_receipts; // scheduled receipts (released ) real _planned_orders; // anticipated planned orders - real _proposed_orders; // anticipated planned orders + TMRP_docrefs *_plans; // doc. di pianificazione + TMRP_docrefs *_scheduls; // doc. di pianificazione confermati + TMRP_docrefs *_requirements; // gross.req. da documenti esterni + TMRP_internalrefs *_internal_req; // gross.req. da esplosioni interne + + void add_ref(TMRP_docref * ref, TMRP_docrefs ** refs); public: - const real& gross_requirement() const { return _gross_requirement; } const real& on_hand() const { return /*_on_hand <= ZERO ? ZERO :*/_on_hand ; } - const real& sched_receipts() const { return _sched_receipts; } const real& net_requirement() const { return _net_requirement; } + const real& resched_orders() const { return _resched_orders; } + const real& unsched_orders() const { return _unsched_orders; } + const real& gross_requirement() const { return _gross_requirement; } + const real& sched_receipts() const { return _sched_receipts; } const real& planned_orders() const { return _planned_orders; } - const real& proposed_orders() const { return _proposed_orders; } + + TMRP_docrefs *requirements_refs() const { return _requirements; } + TMRP_docrefs *scheduls_refs() const { return _scheduls; } + TMRP_docrefs *plans_refs() const { return _plans; } + TMRP_internalrefs *internal_refs() const { return _internal_req; } const real& set_on_hand(const real & val) { return _on_hand=val;} const real& set_net_req(const real & val) { return _net_requirement=val;} const real& add_net_req(const real & val); - const real& add_gross_req(const real& val); - const real& add_sched_rec(const real& val); - const real& add_planned_ord(const real& val); - const real& add_proposed_ord(const real& val); + const real& add_gross_req(const real& val , TMRP_docref *ref = NULL); + const real& add_gross_req(const real& val , TMRP_internalref *ref ); + const real& add_sched_rec(const real& val, TMRP_docref *ref = NULL); + const real& add_planned_ord(const real& val, TMRP_docref *ref = NULL); + const real& add_resched_ord(const real& val); + const real& add_unsched_ord(const real& val); TMRP_record & operator=(const TMRP_record & a); @@ -36,6 +60,32 @@ public: virtual ~TMRP_record() { } }; +class TException : public TObject +{ + int _from, _to; + real _q; + const TMRP_line * _mrpline; +protected: +public : + virtual TObject* dup() const ; + + int from() const {return _from;} + int to() const {return _to;} + const real& qta() const {return _q;} + const TMRP_line & mrpline() const {return *_mrpline;} + TException(const TMRP_line * line, int from, int to, const real & q); + virtual ~TException() {} +}; + +class TExceptions_array : public TAssoc_array +{ +public : + add(TException * e); + add(const TException & e); + TExceptions_array() {} + virtual ~TExceptions_array() {} +}; + class TMRP_line : public TSortable { @@ -45,32 +95,39 @@ class TMRP_line : public TSortable TString8 _codmag_coll; TString8 _codimp; TString8 _codlin; - long _codcli; -static TArticolo_giacenza *_articolo_giac; - + long _codclifor; +static TArticolo_giacenza *_articolo_giac; +static TString16 _substr; protected: TArray _req_per_bucket; TPointer_array _sons; TArray _qta_sons; - TString _description; + TString _descr; bool is_son(const TCodice_articolo& art) const; void lotti_riordino(real & minimo, real & increm) const ; + public: TMRP_record& record(int i) const; TMRP_record& record(const TMRP_time& t) const; - const TCodice_articolo& codice() const { return _codart; } + const TCodice_articolo& articolo() const { return _codart; } const TString& livgiac() const { return _livgiac; } - const TString& codmag() const { return _codmag; } - const TString& codmag_coll() const { return _codmag_coll; } + const TString& codmagdep() const { return _codmag; } + const TString& codmagdep_coll() const { return _codmag_coll; } const TString& codimp() const { return _codimp; } const TString& codlin() const { return _codlin; } - long codcli() const { return _codcli; } - const TString& description() const { return _description; } + long codclifor() const { return _codclifor; } + const TString& description() const { return _descr; } + + const TString& codmag() const { return _substr = _codmag.left(3); } + const TString& codmagaz_coll() const { return _substr = _codmag_coll.left(3); } + const TString& coddep() const { return _substr = _codmag.mid(3); } + const TString& coddep_coll() const { return _substr = _codmag_coll.mid(3); } + const TString& livgiac(int l) const { return _substr = _livgiac.mid(livelli_giacenza().code_start(l)-1, livelli_giacenza().code_length(l));} virtual int compare(const TSortable& s) const; int first_bucket(int i) const { return _req_per_bucket.first(); } @@ -98,23 +155,28 @@ public: const real & planned_orders(int i) const {return record(i).planned_orders();} - const real & proposed_orders(int i) const - {return record(i).proposed_orders();} + const real & resched_orders(int i) const + {return record(i).resched_orders();} - const TString& set_description(const TString &s) { return _description=s; } + const real & unsched_orders(int i) const + {return record(i).unsched_orders();} + + const TString& set_description(const TString &s) { return _descr=s; } const real& set_on_hand(int i, const real& val); const real& set_on_hand(const TMRP_time& t, const real& val); - const real& add_gross_req(const TMRP_time& t, const real& val); - const real& add_sched_rec(const TMRP_time& t, const real& val); - const real& add_planned_ord(const TMRP_time& t, const real& val); + const real& add_gross_req(const TMRP_time& t, const real& val, TMRP_docref *ref = NULL); + const real& add_gross_req(const TMRP_time& t, const real& val, TMRP_internalref *ref); + const real& add_sched_rec(const TMRP_time& t, const real& val, TMRP_docref *ref = NULL); + const real& add_planned_ord(const TMRP_time& t, const real& val, TMRP_docref *ref = NULL); const real& add_net_req(const TMRP_time& t, const real& val); const real& add_net_req(int i, const real& val); const real& set_net_req(int i, const real& val); - const real& add_proposed_ord(int i, const real& val); + const real& add_resched_ord(int i, const real& val); + const real& add_unsched_ord(int i, const real& val); real sizeup_net_requirement(int i, const real& val); real& giacenza_attuale(real&) const; @@ -129,6 +191,13 @@ public: virtual TObject* dup() const; TMRP_line & operator=(const TMRP_line & a); + // gestione eccezioni + bool find_ad_excepts(bool anticipi, bool posticipi, TExceptions_array &e); + bool find_extra_excepts(bool fixed, TExceptions_array &e); + void print_exception(int from, int to, const real &diff, int header) const; + + // capacity review + TMRP_line(const char* art, const char* giac, const char* magdep, const char* magdepc, const char* imp, const char* lin, @@ -140,6 +209,7 @@ public: class TMRP_lines : public TMRP_array { bool _ignore_mag; + bool _ignore_dep; bool _ignore_imp; bool _ignore_lin; @@ -156,8 +226,8 @@ public: TMRP_line& operator[](long n) const { return (TMRP_line&)find_obj(n); } - void ignore(bool im, bool ii, bool il) - { _ignore_mag = im; _ignore_imp = ii; _ignore_lin = il; } + void ignore(bool im, bool id, bool ii, bool il) + { _ignore_mag = im; _ignore_dep = id; _ignore_imp = ii; _ignore_lin = il; } virtual TObject* dup() const; TMRP_lines & operator= (const TMRP_lines &a); @@ -167,6 +237,77 @@ public: virtual ~TMRP_lines(); }; +class TMRP_docref : public TObject +{ + TString8 _codnum; + int _annodoc; + long _numdoc; + int _numrig ; + TString4 _um; + real _qta; + real _prz; + +public: + virtual TObject* dup() const; + // settaggio valori + void set_annodoc(int anno) {_annodoc = anno;} + void set_codnumdoc(const char * codnum) {_codnum = codnum;} + void set_numdoc(long numdoc) {_numdoc = numdoc;} + void set_numrig(int nr) {_numrig = nr;} + void set_um(const char *um) {_um = um;} + void set_qta_residua(real & q) {_qta = q;} + + int annodoc() {return _annodoc;} + const TString& codnumdoc() {return _codnum;} + long numdoc() {return _numdoc;} + int numrig() {return _numrig;} + const TString& um() {return _um;} + const real & qta_residua() {return _qta;} + + TMRP_docref(int anno, const char * codnum,long numdoc,int nriga, + const char *um, const real & qta, const real &prz); +}; + + +class TMRP_docrefs : public TArray +{ +public: + TObject* dup() const; + TMRP_docref & get_ref(int n) {return (TMRP_docref & )operator[](n);} + TMRP_docref * get_ref_ptr(int n) {return (TMRP_docref *)objptr(n);} +}; + +class TMRP_internalref : public TObject +{ + TMRP_line * _line; + int _bucket; + TDate _date; // eliminare + TString4 _um; + real _qta; + +public: + virtual TObject* dup() const; + // settaggio valori + void set_um(const char *um) {_um = um;} + void set_qta(const real & qta) {_qta = qta;} + const TMRP_line * line() const {return _line;} + int bucket() const {return _bucket;} + const TDate & date() const {return _date;} + const TString& um() const {return _um;} + const real & qta() const {return _qta;} + + TMRP_internalref(TMRP_line * line, int bucket, const real & qta); + TMRP_internalref(const TMRP_internalref &r); +}; + +class TMRP_internalrefs : public TArray +{ +public: + TMRP_internalref & get_ref(int n) {return (TMRP_internalref & )operator[](n);} + TMRP_internalref *get_ref_ptr(int n) {return (TMRP_internalref * )objptr(n);} +}; + + #endif diff --git a/mr/mr2100a.h b/mr/mr2100a.h index 02803618b..e339afb99 100755 --- a/mr/mr2100a.h +++ b/mr/mr2100a.h @@ -1,6 +1,9 @@ #ifndef __MR2100A_H #define __MR2100A_H +#define G_PREPROCESS 1 +#define G_POSTPROCESS 2 + #define F_PROFILO 200 #define F_NUM_ORC 201 #define F_TIPI_ORC 202 @@ -18,10 +21,10 @@ #define F_TIPO_FORN 214 #define F_RIGA_FORN 215 #define F_NOMAG 216 -#define F_NOIMP 217 -#define F_NOLIN 218 -#define F_KEEP_IMP 219 -#define F_XTRA_LDTIME 220 +#define F_NODEP 217 +#define F_NOIMP 218 +#define F_NOLIN 219 +//#define 220 #define F_ORC_MASTER 221 #define F_SORT 222 #define F_LOTSIZING_P 223 @@ -32,6 +35,19 @@ #define F_TIPOCF_CONDV 228 #define F_CF_CONDV 229 #define F_SORT_ORDER 230 +#define F_KEEP_IMP 231 +#define F_OP_DAGRMERC 235 +#define F_OP_AGRMERC 236 +#define F_OF_DAGRMERC 237 +#define F_OF_AGRMERC 238 +//#define F_NUMBERBYCLI 240 +//#define F_NUMBERBYWEEK 241 +#define F_DIVIDEBYDATE 242 +#define F_DIVIDEBYART 243 +#define F_DAYXBUCK 244 +#define F_XTRA_LDTIME 245 +#define F_XTRA_PLTIME 246 +#define F_ALLORDERS 250 // campi senza default sul profilo #define F_YEAR 301 @@ -55,7 +71,10 @@ #define F_DESCNUM 110 // sheet ordini +#define F_RISALITA 100 #define F_SELECTED 101 +#define F_FABBISOGNO 101 +#define F_UMFABB 102 #define F_ORD_TYPE 102 #define F_DATADOC 103 #define F_DATACONS 104 @@ -73,7 +92,12 @@ #define F_UM 116 #define F_PREZZO 117 #define F_DESCART 118 -#define F_OK 119 +#define F_DOCANNODOC 119 // lasciare questi 4 campi in sequenza: 1 +#define F_DOCCODNUM 120 // 2 +#define F_DOCNUM 121 // 3 +#define F_DOCNRIGA 122 // 4 + +#define F_OK 123 #define F_RAGSOC 154 #define F_DESCMAG 160 @@ -81,5 +105,14 @@ #define F_DESCLIN 163 #define H_CODIMP 164 +// maschera mr2100b +#define F_FABB_LORDO 201 +#define F_FABB_NETTO 202 +#define F_FABB_SCHED 203 +#define F_FABB_PIAN 204 +#define F_FABB_GIAC 205 +#define F_FABB_DADATA 206 +#define F_FABB_ADATA 207 +#define F_TOPLAN 208 #endif diff --git a/mr/mr2100a.uml b/mr/mr2100a.uml index 0f0f8b0aa..90276c9d1 100755 --- a/mr/mr2100a.uml +++ b/mr/mr2100a.uml @@ -5,19 +5,25 @@ TOOLBAR "Toolbar" 0 -3 -1 -1 STRING DLG_PROFILE 50 BEGIN - PROMPT 1 0 "Profilo " + PROMPT 9 0 "Profilo " PSELECT END BUTTON DLG_ELABORA 10 2 BEGIN - PROMPT -15 -1 "~Elabora" + PROMPT -16 -1 "~Elabora" PICTURE BMP_ELABORA END +BUTTON DLG_PRINT 10 2 +BEGIN + PROMPT -26 -1 "~Stampa" +END + + BUTTON DLG_SAVEREC 10 2 BEGIN - PROMPT -25 -1 "~Registra" + PROMPT -36 -1 "~Registra" PICTURE BMP_SAVEREC PICTURE BMP_SAVERECDN FLAGS "D" @@ -25,19 +31,19 @@ END BUTTON DLG_EDIT 10 2 BEGIN - PROMPT -35 -1 "~Modifica" + PROMPT -46 -1 "~Modifica" MESSAGE RUN,ve0,-1 PICTURE BMP_EDIT END BUTTON DLG_CANCEL 10 2 BEGIN - PROMPT -45 -1 "" + PROMPT -56 -1 "" END BUTTON DLG_QUIT 10 2 BEGIN - PROMPT -55 -1 "~Fine" + PROMPT -66 -1 "~Fine" PICTURE BMP_QUIT PICTURE BMP_QUITDN END @@ -46,7 +52,7 @@ ENDPAGE PAGE "Query" -1 -1 80 19 -GROUPBOX DLG_NULL 78 4 +GROUPBOX DLG_NULL 78 5 BEGIN PROMPT 1 1 "@bParametri dell'elaborazione" END @@ -55,7 +61,7 @@ DATE F_DADATA BEGIN PROMPT 2 2 "Dalla data " CHECKTYPE REQUIRED - GROUP 1 + GROUP G_PREPROCESS END DATE F_ADATA @@ -64,44 +70,63 @@ BEGIN CHECKTYPE REQUIRED VALIDATE DATE_CMP_FUNC > F_DADATA WARNING "La data finale deve essere maggiore di quella iniziale" - GROUP 1 + GROUP G_PREPROCESS END LIST F_BUCKETS 1 15 BEGIN - GROUP 1 - PROMPT 2 3 "Bucket temporale " + GROUP G_PREPROCESS + PROMPT 2 4 "Intervallo " ITEM "1|1 Settimana" - MESSAGE DISABLE,F_BUCKET|COPY,F_BUCKET + MESSAGE SHOW,F_BUCKET|DISABLE,F_BUCKET|COPY,F_BUCKET|"7",F_DAYXBUCK ITEM "2|2 Settimane" - MESSAGE DISABLE,F_BUCKET|COPY,F_BUCKET + MESSAGE SHOW,F_BUCKET|DISABLE,F_BUCKET|COPY,F_BUCKET|"7",F_DAYXBUCK ITEM "4|1 Mese" - MESSAGE DISABLE,F_BUCKET|COPY,F_BUCKET - ITEM "8|2 Mese" - MESSAGE DISABLE,F_BUCKET|COPY,F_BUCKET + MESSAGE SHOW,F_BUCKET|DISABLE,F_BUCKET|COPY,F_BUCKET|"7",F_DAYXBUCK + ITEM "8|2 Mesi" + MESSAGE SHOW,F_BUCKET|DISABLE,F_BUCKET|COPY,F_BUCKET|"7",F_DAYXBUCK ITEM "13|3 Mesi" - MESSAGE DISABLE,F_BUCKET|COPY,F_BUCKET + MESSAGE SHOW,F_BUCKET|DISABLE,F_BUCKET|COPY,F_BUCKET|"7",F_DAYXBUCK ITEM "17|4 Mesi" - MESSAGE DISABLE,F_BUCKET|COPY,F_BUCKET + MESSAGE SHOW,F_BUCKET|DISABLE,F_BUCKET|COPY,F_BUCKET|"7",F_DAYXBUCK ITEM "26|6 Mesi" - MESSAGE DISABLE,F_BUCKET|COPY,F_BUCKET + MESSAGE SHOW,F_BUCKET|DISABLE,F_BUCKET|COPY,F_BUCKET|"7",F_DAYXBUCK ITEM "52|1 Anno" - MESSAGE DISABLE,F_BUCKET|COPY,F_BUCKET + MESSAGE SHOW,F_BUCKET|DISABLE,F_BUCKET|COPY,F_BUCKET|"7",F_DAYXBUCK ITEM " |Personalizzato" - MESSAGE ENABLE,F_BUCKET + MESSAGE SHOW,F_BUCKET|ENABLE,F_BUCKET|"7",F_DAYXBUCK + ITEM "G|1 Giorno" + MESSAGE HIDE,F_BUCKET|"1",F_BUCKET|"1",F_DAYXBUCK + ITEM "M|Mese solare" + MESSAGE HIDE,F_BUCKET|"31",F_BUCKET|"1",F_DAYXBUCK END NUMBER F_BUCKET 2 BEGIN - GROUP 1 - PROMPT 45 3 "Settimane " - FLAGS "U" + GROUP G_PREPROCESS + PROMPT 45 4 "Settimane " + FLAGS "UG" CHECKTYPE REQUIRED END +LIST F_DAYXBUCK 1 9 +BEGIN + PROMPT 42 42 "" + ITEM "7|settimane" + ITEM "1|giorni" + FLAGS "D" +END + BOOLEAN F_NOMAG BEGIN PROMPT 2 10 "Non suddividere per magazzini" + MESSAGE TRUE DISABLE,F_NODEP|"X",F_NODEP + MESSAGE FALSE ENABLE,F_NODEP +END + +BOOLEAN F_NODEP +BEGIN + PROMPT 40 10 "Non suddividere per depositi" END BOOLEAN F_NOIMP @@ -122,7 +147,7 @@ PAGE "Elabora" -1 -1 80 19 LIST F_ORC_MASTER 1 20 BEGIN - GROUP 1 + GROUP G_PREPROCESS PROMPT 1 5 "" ITEM "O|Ordini da clienti" ITEM "M|Master Schedule Plan" @@ -130,14 +155,14 @@ END SPREADSHEET F_NUM_ORC 8 6 BEGIN - GROUP 1 + GROUP G_PREPROCESS PROMPT 1 6 "" ITEM "Codice" END SPREADSHEET F_TIPI_ORC 62 6 BEGIN - GROUP 1 + GROUP G_PREPROCESS PROMPT 16 6 "" ITEM "Tipo@4" ITEM "Descrizione@50" @@ -150,16 +175,16 @@ BEGIN PROMPT 1 13 "@bOrdini produzione/fornitori" END -SPREADSHEET F_NUM_ORF 8 6 +SPREADSHEET F_NUM_ORF 8 BEGIN - GROUP 1 + GROUP G_PREPROCESS PROMPT 1 14 "" ITEM "Codice" END -SPREADSHEET F_TIPI_ORF 62 6 +SPREADSHEET F_TIPI_ORF 62 BEGIN - GROUP 1 + GROUP G_PREPROCESS PROMPT 16 14 "" ITEM "Tipo@4" ITEM "Descrizione@50" @@ -172,6 +197,10 @@ ENDPAGE PAGE "Genera" -1 -1 78 20 +BOOL F_ALLORDERS +BEGIN + PROMPT 2 2 "Mostra tutte le righe d'ordine" +END TEXT DLG_NULL BEGIN PROMPT 2 6 "@bOrdini di produzione" @@ -179,7 +208,7 @@ END STRING F_NUM_PROD 4 BEGIN - GROUP 1 + GROUP G_PREPROCESS PROMPT 27 6 "Numerazione " FLAGS "U" USE %NUM @@ -193,7 +222,7 @@ END STRING F_TIPO_PROD 4 BEGIN - GROUP 1 + GROUP G_PREPROCESS PROMPT 50 6 "Tipo " FLAGS "U" USE %TIP @@ -207,7 +236,7 @@ END STRING F_RIGA_PROD 4 BEGIN - GROUP 1 + GROUP G_PREPROCESS PROMPT 66 6 "Riga " FLAGS "U" USE %TRI SELECT S7=="M" @@ -226,7 +255,7 @@ END STRING F_NUM_FORN 4 BEGIN - GROUP 1 + GROUP G_PREPROCESS PROMPT 27 7 "Numerazione " FLAGS "U" COPY USE F_NUM_PROD @@ -239,7 +268,7 @@ END STRING F_TIPO_FORN 4 BEGIN - GROUP 1 + GROUP G_PREPROCESS PROMPT 50 7 "Tipo " FLAGS "U" COPY USE F_TIPO_PROD @@ -252,7 +281,7 @@ END STRING F_RIGA_FORN 4 BEGIN - GROUP 1 + GROUP G_PREPROCESS PROMPT 66 7 "Riga " FLAGS "U" COPY USE F_RIGA_PROD @@ -265,7 +294,7 @@ END LIST F_TIPOCV 10 BEGIN - GROUP 1 + GROUP G_PREPROCESS PROMPT 2 8 "Preleva i prezzi da " ITEM "|Anagrafica" MESSAGE HIDE,F_CODCONDV|HIDE,F_TIPOCF_CONDV|HIDE,F_CATVEN_CV|CHECK,F_CODCONDV @@ -318,44 +347,71 @@ BEGIN ITEM "F|Fornitore" END +BOOLEAN F_DIVIDEBYART +BEGIN + PROMPT 2 10 "Suddividi gli ordini per articolo" + GROUP G_PREPROCESS +END + +BOOLEAN F_DIVIDEBYDATE +BEGIN + PROMPT 40 10 "Suddividi gli ordini per scadenza" + GROUP G_PREPROCESS +END + + BOOLEAN F_KEEP_IMP BEGIN - GROUP 1 + GROUP G_PREPROCESS PROMPT 2 13 "Mantieni la produzione all'interno dello stesso impianto" HELP "Mantiene la ricerca della lavorazioni all'interno dello stesso impianto" END BOOLEAN F_LOTSIZING_F BEGIN - GROUP 1 + GROUP G_PREPROCESS PROMPT 2 15 "Lotti minimi sugli ordini di acquisto" END BOOLEAN F_LOTSIZING_P BEGIN - GROUP 1 + GROUP G_PREPROCESS PROMPT 2 16 "Lotti minimi sugli ordini di produzione" END BOOL F_IGN_LDTIME BEGIN - GROUP 1 + GROUP G_PREPROCESS PROMPT 2 17 "Ignora lead time di anagrafica " FLAGS "U" END NUMBER F_XTRA_LDTIME 2 BEGIN - GROUP 1 - PROMPT 42 17 "anticipa di " + GROUP G_PREPROCESS + PROMPT 2 18 "Anticipa le consegne di " FLAGS "U" END TEXT DLG_NULL BEGIN - GROUP 1 - PROMPT 58 17 "giorni sui materiali" + GROUP G_PREPROCESS + PROMPT 31 18 "giorni lavorativi" + FLAGS "U" +END + +NUMBER F_XTRA_PLTIME 2 +BEGIN + GROUP G_PREPROCESS + PROMPT 2 19 "Anticipa le emissioni di " + FLAGS "U" +END + +TEXT DLG_NULL +BEGIN + GROUP G_PREPROCESS + PROMPT 31 19 "giorni lavorativi" FLAGS "U" END @@ -363,32 +419,75 @@ ENDPAGE PAGE "Fabbisogni" -1 -1 78 20 -BUTTON F_SELECT_ORDP 20 2 +BUTTON F_SELECT_ORDP 16 2 BEGIN - PROMPT 12 1 "Ordini di produzione" + PROMPT 0 1 "Ordini di produzione" PICTURE USER_BMP_SELECT_ORDP END -BUTTON F_SELECT_ORDF 20 2 +STRING F_OP_DAGRMERC 3 BEGIN - PROMPT 46 1 "Ordini a fornitore" + FLAGS "U" + PROMPT 20 1 "Da gr.merc.:" + USE GMC SELECT CODTAB[4,5] = "" + INPUT CODTAB F_OP_DAGRMERC + OUTPUT F_OP_DAGRMERC CODTAB + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 +END +STRING F_OP_AGRMERC 3 +BEGIN + FLAGS "U" + PROMPT 20 2 " a gr.merc.:" + COPY USE F_OP_DAGRMERC + COPY DISPLAY F_OP_DAGRMERC + INPUT CODTAB F_OP_AGRMERC + OUTPUT F_OP_AGRMERC CODTAB +END + +BUTTON F_SELECT_ORDF 16 2 +BEGIN + PROMPT 40 1 "Ordini a fornitore" PICTURE USER_BMP_SELECT_ORDF END -LIST F_SORT 25 +STRING F_OF_DAGRMERC 3 +BEGIN + FLAGS "U" + PROMPT 60 1 "Da gr.merc.:" + COPY USE F_OP_DAGRMERC + COPY DISPLAY F_OP_DAGRMERC + INPUT CODTAB F_OF_DAGRMERC + OUTPUT F_OF_DAGRMERC CODTAB +END +STRING F_OF_AGRMERC 3 +BEGIN + FLAGS "U" + PROMPT 60 2 " a gr.merc.:" + COPY USE F_OP_DAGRMERC + COPY DISPLAY F_OP_DAGRMERC + INPUT CODTAB F_OF_AGRMERC + OUTPUT F_OF_AGRMERC CODTAB +END + +LIST F_SORT 26 BEGIN PROMPT 1 3 "Ordinamento " - ITEM "1|Data/fornitore/articolo" - ITEM "2|Data/articolo/fornitore" - ITEM "3|Fornitore/articolo/data" - ITEM "4|Fornitore/data/articolo" - ITEM "5|Articolo/fornitore/data" - ITEM "6|Articolo/data/fornitore" + ITEM "1|Tipo/data/fornit./articolo" + ITEM "2|Tipo/data/articolo/fornit." + ITEM "3|Tipo/fornit./articolo/data" + ITEM "4|Tipo/fornit./data/articolo" + ITEM "5|Tipo/articolo/fornit./data" + ITEM "6|Tipo/articolo/data/fornit." + ITEM "7|Data/tipo/fornit./articolo" + ITEM "8|Data/articolo/tipo/fornit." + ITEM "9|Articolo/tipo/fornit./data" + ITEM "10|Articolo/data/tipo/fornit." END BOOLEAN F_SORT_ORDER BEGIN - PROMPT 42 3 "Inverso" + PROMPT 44 3 "Inverso" END BUTTON F_RESORT_ORDINI 10 1 @@ -417,10 +516,13 @@ BEGIN ITEM "UM." ITEM "Prezzo@18" ITEM "Descrizione@50" + ITEM "Anno" + ITEM "Cod.Num." + ITEM "Num.Doc." + ITEM "Num.Riga." DEFAULT NONE END - ENDPAGE PAGE "Calendario" -1 -1 78 20 @@ -718,33 +820,54 @@ ENDPAGE ENDMASK -PAGE "Righe ordini" -1 -1 70 15 +PAGE "Righe ordini" -1 -1 70 16 BOOLEAN F_SELECTED BEGIN - PROMPT 1 1 "Riga selezionata per la generazione" + PROMPT 1 0 "Riga selezionata per la generazione" END LIST F_ORD_TYPE 1 14 BEGIN - FLAGS "G" - PROMPT 46 1 "Ordine " + FLAGS "" + PROMPT 1 1 "Ordine " ITEM "F|Fornitore" MESSAGE ENABLE,F_FORNITORE|ENABLE,F_RAGSOC ITEM "P|Produzione" MESSAGE CLEAR,F_FORNITORE|CLEAR,F_RAGSOC END +STRING F_DOCANNODOC 4 +BEGIN + FLAGS "D" + PROMPT 1 2 "Anno " +END +STRING F_DOCCODNUM 4 +BEGIN + FLAGS "D" + PROMPT 19 2 "Documento " +END +NUMBER F_DOCNUM 9 +BEGIN + FLAGS "D" + PROMPT 35 2 "" +END +NUMBER F_DOCNRIGA 4 +BEGIN + FLAGS "D" + PROMPT 60 2 "Riga " +END + DATE F_DATADOC BEGIN - PROMPT 1 2 "Data doc. " + PROMPT 1 3 "Data doc. " CHECKTYPE REQUIRED FIELD DATADOC END DATE F_DATACONS BEGIN - PROMPT 39 2 "Data consegna " + PROMPT 39 3 "Data consegna " CHECKTYPE REQUIRED VALIDATE DATE_CMP_FUNC >= F_DATADOC FIELD DATACONS @@ -753,7 +876,7 @@ END NUMBER F_FORNITORE 6 BEGIN - PROMPT 1 3 "Fornitore " + PROMPT 1 4 "Fornitore " USE LF_CLIFO INPUT TIPOCF "F" INPUT CODCF F_FORNITORE @@ -762,58 +885,93 @@ BEGIN OUTPUT F_FORNITORE CODCF OUTPUT F_RAGSOC RAGSOC FIELD CODCF - CHECKTYPE REQUIRED + CHECKTYPE NORMAL GROUP 2 END STRING F_RAGSOC 50 37 BEGIN - PROMPT 24 3 "" + PROMPT 24 4 "" USE LF_CLIFO KEY 2 INPUT TIPOCF "F" INPUT RAGSOC F_RAGSOC DISPLAY "Descrizione@50" RAGSOC DISPLAY "Codice@16" CODCF COPY OUTPUT F_FORNITORE - CHECKTYPE REQUIRED + CHECKTYPE NORMAL GROUP 2 END STRING F_ARTICOLO 20 BEGIN - PROMPT 1 4 "Articolo " + PROMPT 1 5 "Articolo " FLAGS "D" END STRING F_DESCART 50 BEGIN - PROMPT 1 5 "Descrizione " + PROMPT 1 6 "Descrizione " FLAGS "D" END STRING F_LIV1 10 BEGIN - PROMPT 1 6 "Giacenza " + PROMPT 1 7 "Giacenza " + USE GCG + INPUT CODTAB[1,1] "1" + INPUT CODTAB[2,20] F_LIV1 + OUTPUT F_LIV1 CODTAB[2,20] + DISPLAY "Codice" CODTAB[2,20] + DISPLAY "Descrizione@50" S0 + CHECKTYPE NORMAL + MESSAGE EMPTY CLEAR, F_LIV2 + MESSAGE ENABLE, F_LIV2 + FLAGS "D" END STRING F_LIV2 10 BEGIN - PROMPT 27 6 "Giacenza " + PROMPT 27 7 "Giacenza " + COPY USE F_LIV1 + COPY DISPLAY F_LIV1 + INPUT CODTAB[1,1] "2" + INPUT CODTAB[2,20] F_LIV2 + OUTPUT F_LIV2 CODTAB[2,20] + CHECKTYPE NORMAL + MESSAGE EMPTY CLEAR, F_LIV3 + MESSAGE ENABLE, F_LIV3 + FLAGS "D" END STRING F_LIV3 10 BEGIN - PROMPT 1 7 "Giacenza " + PROMPT 1 8 "Giacenza " + COPY USE F_LIV1 + COPY DISPLAY F_LIV1 + INPUT CODTAB[1,1] "3" + INPUT CODTAB[2,20] F_LIV3 + OUTPUT F_LIV3 CODTAB[2,20] + CHECKTYPE NORMAL + MESSAGE EMPTY CLEAR, F_LIV4 + MESSAGE ENABLE, F_LIV4 + FLAGS "D" END STRING F_LIV4 10 BEGIN - PROMPT 27 7 "Giacenza " + PROMPT 27 8 "Giacenza " + COPY USE F_LIV1 + COPY DISPLAY F_LIV1 + INPUT CODTAB[1,1] "4" + INPUT CODTAB[2,20] F_LIV4 + OUTPUT F_LIV4 CODTAB[2,20] + CHECKTYPE NORMAL + FLAGS "D" END STRING F_MAGAZZINO 3 BEGIN - PROMPT 1 8 "Magazzino " + PROMPT 1 9 "Magazzino " FLAGS "U" USE MAG INPUT CODTAB[1,3] F_MAGAZZINO @@ -829,7 +987,7 @@ END STRING F_DEPOSITO 2 BEGIN - PROMPT 19 8 "" + PROMPT 19 9 "" FLAGS "U" COPY ALL F_MAGAZZINO CHECKTYPE NORMAL @@ -837,7 +995,7 @@ END STRING F_DESCMAG 50 37 BEGIN - PROMPT 24 8 "" + PROMPT 24 9 "" USE MAG KEY 2 INPUT S0 F_DESCMAG DISPLAY "Descrizione@50" S0 @@ -849,7 +1007,7 @@ END STRING H_CODIMP 5 BEGIN - PROMPT 1 9 "Impianto " + PROMPT 1 10 "Impianto " FLAGS "UGH" MESSAGE EMPTY COPY,H_CODIMP MESSAGE COPY,F_CODIMP|CHECK,F_CODIMP @@ -857,7 +1015,7 @@ END STRING F_CODIMP 5 BEGIN - PROMPT 1 9 "Impianto " + PROMPT 1 10 "Impianto " FLAGS "UZ" USE IMP INPUT CODTAB F_CODIMP @@ -870,7 +1028,7 @@ END STRING F_DESCIMP 50 37 BEGIN - PROMPT 24 9 "" + PROMPT 24 10 "" FLAGS "U" USE IMP KEY 2 INPUT S0 F_DESCIMP @@ -882,7 +1040,7 @@ END STRING F_CODLIN 5 BEGIN - PROMPT 1 10 "Linea " + PROMPT 1 11 "Linea " FLAGS "UZ" USE LNP INPUT CODTAB F_CODLIN @@ -896,7 +1054,7 @@ END STRING F_DESCLIN 50 37 BEGIN - PROMPT 24 10 "" + PROMPT 24 11 "" USE LNP KEY 2 INPUT S0 F_DESCLIN DISPLAY "Descrizione@50" S0 @@ -907,21 +1065,20 @@ END NUMBER F_QUANTITA 18 5 BEGIN - PROMPT 1 11 "Quantita' " + PROMPT 1 12 "Quantita' " PICTURE ".5" - FLAGS "U" - CHECKTYPE REQUIRED + FLAGS "" END STRING F_UM 2 BEGIN - PROMPT 44 11 "Unita' di misura " + PROMPT 44 12 "Unita' di misura " FLAGS "D" END NUMBER F_PREZZO 18 3 BEGIN - PROMPT 1 12 "Prezzo " + PROMPT 1 13 "Prezzo " END BOOL F_OK @@ -933,12 +1090,17 @@ END BUTTON DLG_OK 10 2 BEGIN - PROMPT -12 -1 "" + PROMPT -13 -1 "" +END + +BUTTON F_RISALITA 10 2 +BEGIN + PROMPT -23 -1 "Risalita" END BUTTON DLG_CANCEL 10 2 BEGIN - PROMPT -22 -1 "" + PROMPT -33 -1 "" END ENDPAGE diff --git a/mr/mr2100b.uml b/mr/mr2100b.uml new file mode 100755 index 000000000..0340b4b53 --- /dev/null +++ b/mr/mr2100b.uml @@ -0,0 +1,452 @@ +#include "mr2100a.h" +#include "mr2url.h" +PAGE "Risalita su MRP" -1 -1 80 20 + +STRING F_ARTICOLO 20 +BEGIN + PROMPT 1 0 "Articolo " + FLAGS "D" +END + +STRING F_DESCART 70 36 +BEGIN + PROMPT 36 0 "" + FLAGS "D" +END + +STRING F_LIV1 10 +BEGIN + PROMPT 1 1 "Giacenza " + USE GCG + INPUT CODTAB[1,1] "1" + INPUT CODTAB[2,20] F_LIV1 + OUTPUT F_LIV1 CODTAB[2,20] + DISPLAY "Codice" CODTAB[2,20] + DISPLAY "Descrizione@50" S0 + CHECKTYPE NORMAL + MESSAGE EMPTY CLEAR, F_LIV2 + MESSAGE ENABLE, F_LIV2 + FLAGS "D" +END + +STRING F_LIV2 10 +BEGIN + PROMPT 27 1 "Giacenza " + COPY USE F_LIV1 + COPY DISPLAY F_LIV1 + INPUT CODTAB[1,1] "2" + INPUT CODTAB[2,20] F_LIV2 + OUTPUT F_LIV2 CODTAB[2,20] + CHECKTYPE NORMAL + MESSAGE EMPTY CLEAR, F_LIV3 + MESSAGE ENABLE, F_LIV3 + FLAGS "D" +END + +STRING F_LIV3 10 +BEGIN + PROMPT 1 2 "Giacenza " + COPY USE F_LIV1 + COPY DISPLAY F_LIV1 + INPUT CODTAB[1,1] "3" + INPUT CODTAB[2,20] F_LIV3 + OUTPUT F_LIV3 CODTAB[2,20] + CHECKTYPE NORMAL + MESSAGE EMPTY CLEAR, F_LIV4 + MESSAGE ENABLE, F_LIV4 + FLAGS "D" +END + +STRING F_LIV4 10 +BEGIN + PROMPT 27 2 "Giacenza " + COPY USE F_LIV1 + COPY DISPLAY F_LIV1 + INPUT CODTAB[1,1] "4" + INPUT CODTAB[2,20] F_LIV4 + OUTPUT F_LIV4 CODTAB[2,20] + CHECKTYPE NORMAL + FLAGS "D" +END + + +DATE F_FABB_DADATA +BEGIN + PROMPT 1 3 "Dal " + PICTURE ".5" + FLAGS "D" +END + +DATE F_FABB_ADATA +BEGIN + PROMPT 28 3 "al " + PICTURE ".5" + FLAGS "D" +END + +STRING F_UM 2 +BEGIN + PROMPT 53 3 "Unita' di misura " + FLAGS "D" +END + +NUMBER F_TOPLAN 18 5 +BEGIN + PROMPT 1 4 "Da pianificare " + PICTURE ".5" + FLAGS "D" +END + +NUMBER F_FABB_NETTO 18 5 +BEGIN + PROMPT 1 5 "Fabbis. netto " + PICTURE ".5" + FLAGS "D" +END + +NUMBER F_FABB_LORDO 18 5 +BEGIN + PROMPT 1 6 "Fabbis. lordo " + PICTURE ".5" + FLAGS "D" + CHECKTYPE REQUIRED +END + + +NUMBER F_FABB_PIAN 18 5 +BEGIN + PROMPT 41 5 " pianificato " + PICTURE ".5" + FLAGS "D" +END + +NUMBER F_FABB_SCHED 18 5 +BEGIN + PROMPT 41 6 " confermato " + PICTURE ".5" + FLAGS "D" +END + +NUMBER F_FABB_GIAC 18 5 +BEGIN + PROMPT 35 4 " giacenza iniziale " + PICTURE ".5" + FLAGS "D" +END + +SPREADSHEET F_ORDINI 79 11 +BEGIN + FLAGS "D" + PROMPT 0 7 "" + ITEM "Fabbisogno@F18" + ITEM "UM" + ITEM "Documento@10" + ITEM "Consegna@10" + ITEM "Cli/For" + ITEM "Codice Articolo@20" + ITEM "Liv.1@10" + ITEM "Liv.2@10" + ITEM "Liv.3@10" + ITEM "Liv.4@10" + ITEM "Mag@3" + ITEM "Dep@2" + ITEM "Imp.@5" + ITEM "Linea@5" + ITEM "Quantita'@18" + ITEM "UM." + ITEM "Prezzo@18" + ITEM "Descrizione@50" + ITEM "Anno" + ITEM "Cod.Num." + ITEM "Num.Doc." + ITEM "Num.Riga." +END + +BUTTON DLG_CANCEL 10 2 +BEGIN + PROMPT -11 -1 "" +END + +ENDPAGE + +ENDMASK + +PAGE "Righe ordini" -1 -1 70 16 + +NUMBER F_FABBISOGNO 18 5 +BEGIN + PROMPT 1 0 "Fabbisogno " + PICTURE ".5" +END + +STRING F_UMFABB 2 +BEGIN + FLAGS "" + PROMPT 1 30 "" +END + +STRING F_DOCANNODOC 4 +BEGIN + PROMPT 1 2 "Anno " +END + +STRING F_DOCCODNUM 4 +BEGIN + PROMPT 19 2 "Documento " +END + +NUMBER F_DOCNUM 9 +BEGIN + PROMPT 35 2 "N. " +END + +NUMBER F_DOCNRIGA 4 +BEGIN + PROMPT 50 2 "Riga " +END + +DATE F_DATADOC +BEGIN + PROMPT 1 3 "Data doc. " + CHECKTYPE REQUIRED + FIELD DATADOC +END + +DATE F_DATACONS +BEGIN + PROMPT 39 3 "Data consegna " + CHECKTYPE REQUIRED + VALIDATE DATE_CMP_FUNC >= F_DATADOC + FIELD DATACONS + WARNING "Data di consegna inferiore a quella del documento" +END + +NUMBER F_FORNITORE 6 +BEGIN + PROMPT 1 4 "Fornitore " + USE LF_CLIFO + INPUT TIPOCF "F" + INPUT CODCF F_FORNITORE + DISPLAY "Codice" CODCF + DISPLAY "Descrizione@50" RAGSOC + OUTPUT F_FORNITORE CODCF + OUTPUT F_RAGSOC RAGSOC + FIELD CODCF + CHECKTYPE NORMAL + GROUP 2 +END + +STRING F_RAGSOC 50 37 +BEGIN + FLAGS "D" + PROMPT 24 4 "" + USE LF_CLIFO KEY 2 + INPUT TIPOCF "F" + INPUT RAGSOC F_RAGSOC + DISPLAY "Descrizione@50" RAGSOC + DISPLAY "Codice@16" CODCF + COPY OUTPUT F_FORNITORE + CHECKTYPE NORMAL + GROUP 2 +END + +STRING F_ARTICOLO 20 +BEGIN + PROMPT 1 5 "Articolo " +END + +STRING F_DESCART 50 +BEGIN + PROMPT 1 6 "Descrizione " +END + +STRING F_LIV1 10 +BEGIN + PROMPT 1 7 "Giacenza " + USE GCG + INPUT CODTAB[1,1] "1" + INPUT CODTAB[2,20] F_LIV1 + OUTPUT F_LIV1 CODTAB[2,20] + DISPLAY "Codice" CODTAB[2,20] + DISPLAY "Descrizione@50" S0 + CHECKTYPE NORMAL + MESSAGE EMPTY CLEAR, F_LIV2 + MESSAGE ENABLE, F_LIV2 +END + +STRING F_LIV2 10 +BEGIN + PROMPT 27 7 "Giacenza " + COPY USE F_LIV1 + COPY DISPLAY F_LIV1 + INPUT CODTAB[1,1] "2" + INPUT CODTAB[2,20] F_LIV2 + OUTPUT F_LIV2 CODTAB[2,20] + CHECKTYPE NORMAL + MESSAGE EMPTY CLEAR, F_LIV3 + MESSAGE ENABLE, F_LIV3 +END + +STRING F_LIV3 10 +BEGIN + PROMPT 1 8 "Giacenza " + COPY USE F_LIV1 + COPY DISPLAY F_LIV1 + INPUT CODTAB[1,1] "3" + INPUT CODTAB[2,20] F_LIV3 + OUTPUT F_LIV3 CODTAB[2,20] + CHECKTYPE NORMAL + MESSAGE EMPTY CLEAR, F_LIV4 + MESSAGE ENABLE, F_LIV4 +END + +STRING F_LIV4 10 +BEGIN + PROMPT 27 8 "Giacenza " + COPY USE F_LIV1 + COPY DISPLAY F_LIV1 + INPUT CODTAB[1,1] "4" + INPUT CODTAB[2,20] F_LIV4 + OUTPUT F_LIV4 CODTAB[2,20] + CHECKTYPE NORMAL +END + +STRING F_MAGAZZINO 3 +BEGIN + PROMPT 1 9 "Magazzino " + FLAGS "U" + USE MAG + INPUT CODTAB[1,3] F_MAGAZZINO + INPUT CODTAB[4,5] F_DEPOSITO + DISPLAY "Magazzino" CODTAB[1,3] + DISPLAY "Deposito" CODTAB[4,5] + DISPLAY "Descrizione@50" S0 + OUTPUT F_MAGAZZINO CODTAB[1,3] + OUTPUT F_DEPOSITO CODTAB[4,5] + OUTPUT F_DESCMAG S0 + CHECKTYPE NORMAL +END + +STRING F_DEPOSITO 2 +BEGIN + PROMPT 19 9 "" + FLAGS "U" + COPY ALL F_MAGAZZINO + CHECKTYPE NORMAL +END + +STRING F_DESCMAG 50 37 +BEGIN + PROMPT 24 9 "" + FLAGS "D" + USE MAG KEY 2 + INPUT S0 F_DESCMAG + DISPLAY "Descrizione@50" S0 + DISPLAY "Magazzino" CODTAB[1,3] + DISPLAY "Deposito" CODTAB[4,5] + COPY OUTPUT F_MAGAZZINO + CHECKTYPE NORMAL +END + +STRING H_CODIMP 5 +BEGIN + PROMPT 1 10 "Impianto " + FLAGS "UGH" + MESSAGE EMPTY COPY,H_CODIMP + MESSAGE COPY,F_CODIMP|CHECK,F_CODIMP +END + +STRING F_CODIMP 5 +BEGIN + PROMPT 1 10 "Impianto " + FLAGS "UZ" + USE IMP + INPUT CODTAB F_CODIMP + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_CODIMP CODTAB + OUTPUT F_DESCIMP S0 + CHECKTYPE NORMAL +END + +STRING F_DESCIMP 50 37 +BEGIN + PROMPT 24 10 "" + FLAGS "UD" + USE IMP KEY 2 + INPUT S0 F_DESCIMP + DISPLAY "Descrizione@50" S0 + DISPLAY "Codice@16" CODTAB + COPY OUTPUT F_CODIMP + CHECKTYPE NORMAL +END + +STRING F_CODLIN 5 +BEGIN + PROMPT 1 11 "Linea " + FLAGS "UZ" + USE LNP + INPUT CODTAB F_CODLIN + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_CODLIN CODTAB + OUTPUT F_DESCLIN S0 + OUTPUT H_CODIMP S6 + CHECKTYPE NORMAL +END + +STRING F_DESCLIN 50 37 +BEGIN + FLAGS "D" + PROMPT 24 11 "" + USE LNP KEY 2 + INPUT S0 F_DESCLIN + DISPLAY "Descrizione@50" S0 + DISPLAY "Codice@16" CODTAB + COPY OUTPUT F_CODLIN + CHECKTYPE NORMAL +END + +NUMBER F_QUANTITA 18 5 +BEGIN + PROMPT 1 12 "Quantita' " + PICTURE ".5" + FLAGS "" + CHECKTYPE REQUIRED +END + +STRING F_UM 2 +BEGIN + PROMPT 36 12 "Unita' di misura " +END + +NUMBER F_PREZZO 18 3 +BEGIN + PROMPT 1 13 "Prezzo " +END + +BOOL F_OK +BEGIN + PROMPT 44 11 "OK" + FLAGS "H" +END + + +BUTTON DLG_OK 10 2 +BEGIN + PROMPT -13 -1 "" +END + +BUTTON F_RISALITA 10 2 +BEGIN + PROMPT -23 -1 "Risalita" +END + +BUTTON DLG_CANCEL 10 2 +BEGIN + PROMPT -33 -1 "" +END + +ENDPAGE + +ENDMASK diff --git a/mr/mr2100c.h b/mr/mr2100c.h new file mode 100755 index 000000000..f3545ff72 --- /dev/null +++ b/mr/mr2100c.h @@ -0,0 +1,6 @@ +#define S_PRINTTYPE 101 +#define S_INTERLINEA 102 +#define S_SEPARATE 103 +#define S_RISALITA 104 +#define S_LIV_RISALITA 105 +#define S_DETT_ORDINI 106 diff --git a/mr/mr2100c.uml b/mr/mr2100c.uml new file mode 100755 index 000000000..3a4a839a0 --- /dev/null +++ b/mr/mr2100c.uml @@ -0,0 +1,57 @@ +#include "mr2100c.h" +#define G_RISALITA 1 +PAGE "Stampa MRP" -1 -1 60 15 +STRING DLG_PROFILE 50 +BEGIN + PROMPT 2 2 "" + FLAGS "HG" +END + +RADIO S_PRINTTYPE 40 +BEGIN + PROMPT 2 1 "Stampa" + ITEM "O|Proposte d'ordine" +// ITEM "E|Tabulato eccezioni" + FLAGS "D" + DEFAULT NONE +END + +BOOL S_INTERLINEA +BEGIN + PROMPT 2 5 "Interlinea tra le righe d'ordine" +END + +BOOL S_RISALITA +BEGIN + PROMPT 2 7 "Aggiungi informazioni di risalita" + MESSAGE TRUE SHOW,G_RISALITA@|"X",S_INTERLINEA|DISABLE,S_INTERLINEA + MESSAGE FALSE HIDE,G_RISALITA@|ENABLE,S_INTERLINEA +END + +NUMBER S_LIV_RISALITA 1 +BEGIN + PROMPT 2 8 "Risali fino al livello " + GROUP G_RISALITA +END + + +BOOL S_DETT_ORDINI +BEGIN + PROMPT 2 10 "Totali separati per ordini confermati e proposti" + GROUP G_RISALITA +END + +BUTTON DLG_PRINT 10 2 +BEGIN + PROMPT -12 -1 "" + PICTURE BMP_PRINT +END + +BUTTON DLG_CANCEL 10 2 +BEGIN + PROMPT -22 -1 "" +END + +ENDPAGE + +ENDMASK diff --git a/mr/mr2200.cpp b/mr/mr2200.cpp index 63b6d87d5..072e5422e 100755 --- a/mr/mr2200.cpp +++ b/mr/mr2200.cpp @@ -42,59 +42,162 @@ public: TCRPCheck_mask(TPlanning_mask * main_mask); }; -class TSave_mask : public TAutomask +// sotto-maschera di riepilogo di alcune opzione della maschera principale +class TPlann_sub_mask : public TAutomask { - TPlanning_mask *_m; protected: - bool on_field_event(TOperable_field& o, TField_event e, long jolly); + TPlanning_mask *_m; void copy_fields_from(); void copy_fields_to(); + bool on_field_event(TOperable_field& o, TField_event e, long jolly); +public: + TPlann_sub_mask(TPlanning_mask &m, const char * name); + virtual ~TPlann_sub_mask() {} +}; + +class TSave_mask : public TPlann_sub_mask +{ + TExceptions_array _exceptions; +protected: + bool on_field_event(TOperable_field& o, TField_event e, long jolly); public: TSave_mask(TPlanning_mask &m); virtual ~TSave_mask() {} }; +class TPrint_mask : public TPlann_sub_mask +{ +protected: + bool on_field_event(TOperable_field& o, TField_event e, long jolly); +public: + TPrint_mask(TPlanning_mask &m); + virtual ~TPrint_mask() {} +}; + +/////////////////////////////////////////////////////////// +// Maschera di reassunto +/////////////////////////////////////////////////////////// +void TPlann_sub_mask::copy_fields_from() +{ + for (int i = fields()-1; i >=0; i--) + { + const int dlg = fld(i).dlg(); + if (dlg > DLG_USER && _m->id2pos(dlg)>=0) + set(dlg, _m->get(dlg)); + } +} + +void TPlann_sub_mask::copy_fields_to() +{ + for (int i = fields()-1; i >=0; i--) + { + const int dlg = fld(i).dlg(); + if (dlg > DLG_USER && _m->id2pos(dlg)>=0) + _m->set(dlg, get(dlg)); + } +} + +TPlann_sub_mask::TPlann_sub_mask(TPlanning_mask &m, const char * name) : + TAutomask(name) +{ + _m = &m; + copy_fields_from(); +} + +bool TPlann_sub_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) +{ + switch (o.dlg()) + { + case DLG_QUIT: + copy_fields_to(); + save_profile(); + break; + } + return TRUE; +} +/////////////////////////////////////////////////////////// +// Maschera stampa +/////////////////////////////////////////////////////////// + +TPrint_mask::TPrint_mask(TPlanning_mask &m) : + TPlann_sub_mask(m, "mr2200f.msk") {} + + +bool TPrint_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) +{ + switch (o.dlg()) + { + case F_MSP_RESORT: + if (e==fe_button) + { + copy_fields_to(); + _m->sortMSPsheet(); + } + break; + case F_SHOWPERC: + case F_SHOWDETAILS: + case F_LOADTYPE: + if (e == fe_modify) + { + copy_fields_to(); + _m->on_field_event((TOperable_field&)_m->field(F_LOADTYPE), fe_modify, jolly ); + } + break; + case DLG_QUIT: + if (e == fe_button) + { + switch (get(S_PRINTTYPE)[0]) + { + case 'C': + _m->print_capacities(); break; + case 'O': + _m->print_articles(); break; + case 'E': + { + TExceptions_array e; + if (_m->find_exceptions(get_bool(S_HURRYUP_EXCEPT),get_bool(S_DELAY_EXCEPT),get_bool(S_EXTRA_EXCEPT), e, TRUE)) + _m->print_exceptions(e); + } + break; + } + } + default: + TPlann_sub_mask::on_field_event(o,e,jolly); + } + return TRUE; +} + /////////////////////////////////////////////////////////// // Maschera salvataggio /////////////////////////////////////////////////////////// TSave_mask::TSave_mask(TPlanning_mask &m) : - TAutomask("mr2200e.msk") + TPlann_sub_mask(m, "mr2200e.msk") { _m = &m; copy_fields_from(); } -void TSave_mask::copy_fields_from() -{ - for (int i = fields()-1; i >=0; i--) - { - const int dlg = fld(i).dlg(); - if (dlg > DLG_USER) - set(dlg, _m->get(dlg)); - } -} - -void TSave_mask::copy_fields_to() -{ - for (int i = fields()-1; i >=0; i--) - { - const int dlg = fld(i).dlg(); - if (dlg > DLG_USER) - _m->set(dlg, get(dlg)); - } -} - bool TSave_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) { switch (o.dlg()) { - case DLG_QUIT: - copy_fields_to(); - break; case F_NUM_PLAN: case F_TIPO_PLAN: return _m->on_savefields_event(o, fe_close, jolly); + case DLG_QUIT: + _m->find_exceptions(TRUE,TRUE,TRUE,_exceptions); + if (_m->salva_documenti(_exceptions)<0) + _m->elabora(); // necessario per ricaricare i rif alle righe + if (_exceptions.items()) + { + if (yesno_box("%d eccezioni rilevate. Stampo il tabulato ?",_exceptions.items())) + _m->print_exceptions(_exceptions); + else + message_box("Controllare il tabulato eccezioni."); + } + default: + TPlann_sub_mask::on_field_event(o,e,jolly); } return TRUE; } @@ -103,40 +206,114 @@ bool TSave_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) // Maschera principale /////////////////////////////////////////////////////////// +bool TPlanning_mask::_week_complete; + +void TPlanning_mask::get_week_year(const TDate &d, int &week, int &year) +{ + week = d.week(); + year = d.year(); + const int wday = TDate(1,1,year).wday(); + if (wday != 1 && _week_complete) + week --; + if (week > 52 && !_week_complete) + { + week = 1; + year ++; + } +} // Arrotonda la data al bucket e ne restituisce il numero (data iniziale==bucket 0) -int TPlanning_mask::round_date(TDate& date, bool up) const +int TPlanning_mask::round_date(TDate& date, bool up, bool towrkday) const { - // Dimensione del bucke in giorni - const int bucket_size = days_per_bucket(); - - // Riporta la data al primo lunedi prima dell'inizio - TDate inizio = get_date(F_DADATA); - if (bucket_size>1) // non vado a giorni - { - const int wday = inizio.wday(); - if (wday > 1) inizio -= wday-1; - } - // Calcola il bucket di appartenenza - const int days = int(date - inizio); int bucket; - if (days<0) - bucket = -1; + TDate inizio(starting_date()); + + if (bucket_mese()) + { + if (up) + { + date.set_end_month(); + if (towrkday) + { + int wday = date.wday(); + wday = (7-wday) % 7; + wday -= get_int(F_LASTWRKDAY); + if (wday<0) + date += wday; + } + } + else + date.set_day(1); + bucket = (date.year()-inizio.year())*12 + date.month() - inizio.month(); + if (bucket<0) bucket = -1; + } else - bucket = days / bucket_size; - if (up || days<0) // Arrotonda alla fine del bucket - date = inizio + long((bucket+1 )* bucket_size - 1 - get_int(F_LASTWRKDAY)); - else // Arrotonda all'inizio del bucket - date = inizio + long(bucket * bucket_size); + { + // Dimensione del bucket in giorni + const int bucket_size = days_per_bucket(); + + // Riporta la data al primo lunedi prima dell'inizio + if (bucket_size>1) // non vado a giorni + { + const int wday = inizio.wday(); + if (wday > 1) inizio -= wday-1; + } + // Calcola il bucket di appartenenza + const int days = int(date - inizio); + if (days<0) + bucket = -1; + else + bucket = days / bucket_size; + if (bucket_size > 1) // multipli settimanali + { + if (up || days<0) // Arrotonda alla fine del bucket + date = inizio + long((bucket+1 )* bucket_size - 1 - (towrkday ? get_int(F_LASTWRKDAY) : 0)); + else // Arrotonda all'inizio del bucket + date = inizio + long(bucket * bucket_size); + } + } return bucket; } -void TPlanning_mask::round_field(TMask_field& fld, bool up) const +// restituisce il numero del bucket (data iniziale==bucket 0) +int TPlanning_mask::bucket(const TDate& date) const +{ + int bucket; + TDate inizio(starting_date()); + + if (bucket_mese()) + { + bucket = inizio.month() - date.month(); + if (bucket<0) bucket = -1; + } + else + { + // Dimensione del bucket in giorni + const int bucket_size = days_per_bucket(); + + // Riporta la data al primo lunedi prima dell'inizio + if (bucket_size>1) // non vado a giorni + { + const int wday = inizio.wday(); + if (wday > 1) inizio -= wday-1; + } + // Calcola il bucket di appartenenza + const int days = int(date - inizio); + if (days<0) + bucket = -1; + else + bucket = days / bucket_size; + } + return bucket; +} + + +void TPlanning_mask::round_field(TMask_field& fld, bool up, bool towrkday) const { TDate date = fld.get(); if (date.ok()) { - round_date(date, up); + round_date(date, up, towrkday); fld.set(date); } } @@ -271,7 +448,7 @@ bool TPlanning_mask::carica_documenti() const bool two_level = get_bool(F_2LEVEL_MSP); - TDate date_fr = get(F_DADATA); + TDate date_fr(starting_date()); const int bucket_fr = round_date(date_fr, FALSE); TDate date_to = get(F_ADATA); const int bucket_to = round_date(date_to, TRUE); @@ -352,7 +529,7 @@ bool TPlanning_mask::carica_documenti() if (qta > ZERO) { const TCodice_articolo art = riga.get(RDOC_CODARTMAG); - const TString16 liv = livelli_giac().enabled() ? riga.get(RDOC_LIVELLO) : ""; + const TString16 liv = livelli_giacenza().enabled() ? riga.get(RDOC_LIVELLO) : ""; const long cli = (ignore_cli && (tn & _Doc_vincoli)) ||ignore_allcli ? 0 : doc.get_long(DOC_CODCF) ; const TString8 mag = ignore_mag && (tn & _Doc_vincoli) ? "" : riga.get(RDOC_CODMAG); const TString8 magc = ignore_mag && (tn & _Doc_vincoli) ? "" : riga.get(RDOC_CODMAGC); @@ -381,8 +558,8 @@ bool TPlanning_mask::carica_documenti() line = _articles. find(cli, art, liv, imp, lin, mag, magc, TRUE); } - if (line->desc().empty()) - line->set_desc(riga.get(RDOC_DESCR)); + if (line->description().empty()) + line->set_description(riga.get(RDOC_DESCR)); if (buck >= 0 && buck <= LAST_BUCKET) { @@ -394,7 +571,7 @@ bool TPlanning_mask::carica_documenti() int numrig = riga.get_int(RDOC_NRIGA); real prz = riga.get_int(RDOC_PREZZO); prz = prz / qta * q.val(); - line->add_rigaref(buck, codnum, annodoc, numdoc, numrig,q.val(),prz);// memorizza la provenienza dal doc + line->add_rigaref(buck, codnum, annodoc, numdoc, numrig, q.um(), q.val(), prz);// memorizza la provenienza dal doc } if (tn & _Doc_planning) @@ -440,10 +617,10 @@ TMSP_constraint* TPlanning_mask::find_constraint(const TMSP_line& l, bool force_ const bool ignore_lin=get_bool(F_NOLIN_IN); const bool ignore_cli=get_bool(F_NOCLI_IN); - TString8 codmag=ignore_mag ? "" : l.codmag(); + TString8 codmag=ignore_mag ? "" : l.codmagdep(); TString8 codimp=ignore_imp ? "" : l.codimp(); TString8 codlin=ignore_lin ? "" : l.codlin(); - long codcli=ignore_cli ? 0L : l.cliente() ; + long codcli=ignore_cli ? 0L : l.codclifor() ; // se il magazzino o l'impianto non e' indicato sul vincolo cerca di individuarlo // in base ai default di linea/impianto if (codimp.blank()) @@ -469,31 +646,31 @@ TMSP_constraint* TPlanning_mask::find_constraint(const TMSP_line& l, bool force_ } // cerca il vincolo con - stesso magazzino , impianto e linea - TMSP_constraint* c = _constraints.find(codcli, l.codice(), l.livgiac(), codimp, codlin, codmag); + TMSP_constraint* c = _constraints.find(codcli, l.articolo(), l.livgiac(), codimp, codlin, codmag); if (c == NULL ) { if (!codmag.blank()) { // cerca il vincolo con - stesso magazzino e impianto - c =_constraints.find(codcli, l.codice(), l.livgiac(), codimp, "", codmag); + c =_constraints.find(codcli, l.articolo(), l.livgiac(), codimp, "", codmag); if (c == NULL) // cerca il vincolo con - stesso magazzino - c =_constraints.find(codcli, l.codice(), l.livgiac(), "", "", codmag); + c =_constraints.find(codcli, l.articolo(), l.livgiac(), "", "", codmag); } if (c == NULL) // cerca il vincolo con - stesso impianto e linea - c =_constraints.find(codcli, l.codice(), l.livgiac(), codimp, codlin, ""); + c =_constraints.find(codcli, l.articolo(), l.livgiac(), codimp, codlin, ""); if (c == NULL) // cerca il vincolo con - stessa impianto - c =_constraints.find(codcli, l.codice(), l.livgiac(), codimp, "" , ""); + c =_constraints.find(codcli, l.articolo(), l.livgiac(), codimp, "" , ""); } if (c == NULL && force_insert) { // MA STO VINCOLO MANCA PROPRIO! ALLORA LO INSERISCO - c = _constraints.find(codcli, l.codice(), l.livgiac(), codimp, codlin, codmag, TRUE); - if (c->desc().blank()) - c->set_desc(l.desc()); - c->set_mastercode_check(get_bool(F_2LEVEL_MSP) && !distinta_master(l.codice())); + c = _constraints.find(codcli, l.articolo(), l.livgiac(), codimp, codlin, codmag, TRUE); + if (c->description().blank()) + c->set_description(l.description()); + c->set_mastercode_check(get_bool(F_2LEVEL_MSP) && !distinta_master(l.articolo())); } return c; } @@ -507,12 +684,12 @@ int TPlanning_mask::find_constr_row(TMSP_constraint& cons) { TToken_string &row=sf.row(r); TString16 liv; - if (livelli_giac().enabled()) + if (livelli_giacenza().enabled()) { - livelli_giac().pack_grpcode(liv, row.get(sf.cid2index(F_LIV1)),1); - livelli_giac().pack_grpcode(liv, row.get(sf.cid2index(F_LIV2)),2); - livelli_giac().pack_grpcode(liv, row.get(sf.cid2index(F_LIV3)),3); - livelli_giac().pack_grpcode(liv, row.get(sf.cid2index(F_LIV4)),4); + livelli_giacenza().pack_grpcode(liv, row.get(sf.cid2index(F_LIV1)),1); + livelli_giacenza().pack_grpcode(liv, row.get(sf.cid2index(F_LIV2)),2); + livelli_giacenza().pack_grpcode(liv, row.get(sf.cid2index(F_LIV3)),3); + livelli_giacenza().pack_grpcode(liv, row.get(sf.cid2index(F_LIV4)),4); liv.trim(); } TString16 imp(row.get(sf.cid2index(F_CODIMP)));imp.trim(); @@ -522,12 +699,12 @@ int TPlanning_mask::find_constr_row(TMSP_constraint& cons) add_depcode(mag, row.get(sf.cid2index(F_DEPOSITO ))); if (sf.cell_disabled(r, sf.cid2index(F_BUCKET1))) { - if (cons.cliente()==row.get_long(sf.cid2index(F_CLIENTE)) && - cons.codice() == row.get(sf.cid2index(F_ARTICOLO)) && + if (cons.codclifor()==row.get_long(sf.cid2index(F_CLIENTE)) && + cons.articolo() == row.get(sf.cid2index(F_ARTICOLO)) && cons.livgiac() == liv&& cons.codimp()== imp && cons.codlin()==lin && - cons.codmag()==mag ) + cons.codmagdep()==mag ) return r; else r+=2; @@ -548,7 +725,7 @@ int TPlanning_mask::find_constr_row(TMSP_constraint& cons) rowgiac.add("** Giacenza teorica",F_DESCART-FIRST_FIELD); row.add("** Ordini ",F_DESCART-FIRST_FIELD); r = sf.items()-3; - TArticolo_giacenza art(cons.codice()); + TArticolo_giacenza art(cons.articolo()); init_bucket0(art, r+2); return r; } @@ -567,10 +744,12 @@ void TPlanning_mask::set_sheet_header() const bool show_week = get_bool(F_SHOW_WEEK) && bucket_size>=7; const bool show_price = get_bool(F_SHOWPRICES); - TDate d = get(F_DADATA); + TDate d(starting_date()); + int year, week; TString str; for (int b = 0; b <= LAST_BUCKET; b++) { + round_date(d); const bool on=(b > 0 && b < LAST_BUCKET && d < date_to); sf.enable_column(F_BUCKET0 + b*2, on); sf.enable_column(F_BUCKET0 + b*2+1, on && show_price ); @@ -578,8 +757,9 @@ void TPlanning_mask::set_sheet_header() sl.enable_column(F_LBUCKET0 + b, on); if (show_week) { + get_week_year(d, week, year); str = "S."; - str << d.week() << '-' << d.year(); + str << week << '-' << year; } else str = d.string(); @@ -589,11 +769,11 @@ void TPlanning_mask::set_sheet_header() case LAST_BUCKET: str.insert(">= "); break; default: d += bucket_size; break; } + sl.set_column_header(F_LBUCKET0 + b, str); str.insert("Qta "); sf.set_column_header(F_BUCKET0 + b*2, str); str.overwrite("Prz"); sf.set_column_header(F_BUCKET0 + b*2 +1, str); - sl.set_column_header(F_LBUCKET0 + b, str); } sf.force_update(); sl.force_update(); @@ -698,51 +878,52 @@ int TPlanning_mask::insert_propose(bool verbose) const TDate & d=_proposed_articles[new_row].time(0).date() ; firstdate=min(firstdate,d); } - firstbuck=int((firstdate- get_date(F_DADATA))/days_per_bucket())+1; + firstbuck=int(bucket(firstdate) - bucket(starting_date()))+1; } return firstbuck; } bool TPlanning_mask::remove_propose(bool verbose) { - bool removed = FALSE; - if (_proposed_articles.items()>0L) - { - if (!verbose || yesno_box("Vuoi annullare le nuove proposte?")) - { - add_or_sub_propose(-1); - _proposed_articles.destroy(); - removed = TRUE; - } - } - bool some = _proposed_articles.items() > 0L; + bool remove = FALSE; + bool remove_all = FALSE; + bool some = _proposed_articles.items() > 0L; // proposte attuali + if (some) + remove = (!verbose || yesno_box("Vuoi annullare le nuove proposte?")); if (!some && verbose) { - if (load_MRP_lines(_released_schedule)) + if (load_MRP_lines(_actual_plan)) { some = _mrp_articles.items() > 0L; - if (some && noyes_box("Vuoi annullare tutte le pianificazioni non confermate?")) + if (some) { - _proposed_articles = _mrp_articles; - add_or_sub_propose(-1); - _proposed_articles.destroy(); - removed = TRUE; + remove = (noyes_box("Vuoi annullare tutte le pianificazioni non confermate?")); + if (remove && get_bool(F_RESCHEDULING) && noyes_box("Vuoi annullare anche le pianificazioni confermate?")) + remove_all = TRUE; } - if (!removed) + if (!remove) message_box("Nessuna pianificazione da annullare"); + else + _proposed_articles = _mrp_articles; } } + if (remove) + { + add_or_sub_propose(-1, remove_all); + _proposed_articles.destroy(); + } return TRUE; } -void TPlanning_mask::add_or_sub_propose(char sign) +void TPlanning_mask::add_or_sub_propose(char sign, bool scheduled) { + CHECK(sign <0 || !scheduled, "Le qta schedulate possono solo venire sottratte"); TWait_cursor hourglass; const long new_rows=_proposed_articles.items(); TSheet_field& sf = sfield(F_ARTICOLI); for (long new_row=0; new_row < new_rows; new_row++) { const TMRP_line & a=_proposed_articles[new_row]; - TMSP_line line(a.codcli(), a.codice(), a.livgiac(), a.codimp(), a.codlin(), a.codmag(), a.codmag_coll()); + TMSP_line line(a.codclifor(), a.articolo(), a.livgiac(), a.codimp(), a.codlin(), a.codmagdep(), a.codmagdep_coll()); bool line_found=FALSE; TMSP_constraint* constraint= find_constraint(line,FALSE); @@ -776,8 +957,8 @@ void TPlanning_mask::add_or_sub_propose(char sign) if (!sf.cell_disabled(art_row, F_BUCKET1-FIRST_FIELD)) { - line_found=(a.codcli()==codcli && a.codice()==codart && a.livgiac()==liv - && a.codimp()==codimp && a.codlin()==codlin && a.codmag()==mag ); + line_found=(a.codclifor()==codcli && a.articolo()==codart && a.livgiac()==liv + && a.codimp()==codimp && a.codlin()==codlin && a.codmagdep()==mag ); if (line_found) break; } else { @@ -797,37 +978,43 @@ void TPlanning_mask::add_or_sub_propose(char sign) artrow.add(predrow.get_char(F_TIPOCF_SHEET-FIRST_FIELD), F_TIPOCF_SHEET-FIRST_FIELD); artrow.add(a.codimp(), F_CODIMP-FIRST_FIELD); artrow.add(a.codlin(), F_CODLIN-FIRST_FIELD); - TString8 str=a.codmag().left(3); + TString8 str=a.codmagdep().left(3); artrow.add(str, F_MAGAZZINO-FIRST_FIELD); - str=a.codmag().mid(3); + str=a.codmagdep().mid(3); artrow.add(str, F_DEPOSITO-FIRST_FIELD); - str=a.codmag_coll().left(3); + str=a.codmagdep_coll().left(3); artrow.add(str, F_MAG_COLL-FIRST_FIELD); - str=a.codmag_coll().mid(3); + str=a.codmagdep_coll().mid(3); artrow.add(str, F_DEP_COLL-FIRST_FIELD); } TToken_string& artrow = sf.row(art_row); const int lastbuck = _proposed_articles[new_row].last_bucket(); //TDate data_buck; - for (int bucket=0; bucket<=lastbuck ; bucket++) + for (int nbucket=0; nbucket<=lastbuck ; nbucket++) { - int b= int((_proposed_articles[new_row].time(bucket).date() - get_date(F_DADATA))/days_per_bucket()); + int b = bucket( _proposed_articles[new_row].time(nbucket).date() ); real art_per_buck(artrow.get(F_BUCKET1 + b*2 - FIRST_FIELD)); + real prop = _proposed_articles[new_row].planned_orders(nbucket); if (sign>0) - art_per_buck += _proposed_articles[new_row].planned_orders(bucket); - else + art_per_buck += prop; + else { - if (art_per_buck >= _proposed_articles[new_row].planned_orders(bucket)) - art_per_buck -= _proposed_articles[new_row].planned_orders(bucket); - else - art_per_buck = ZERO; + if (b>=0) + { + if (scheduled) + prop += _proposed_articles[new_row].sched_receipts(nbucket); + if (art_per_buck > prop) + art_per_buck -= prop; + else + art_per_buck = ZERO; + } } artrow.add(art_per_buck.string(), F_BUCKET1 + b*2 - FIRST_FIELD); real price; if (!art_per_buck.is_zero()) find_price(get(F_TIPOCV),get(F_CODCONDV),get(F_CATVEN_CV), - get(F_TIPOCF), a.codcli(), a.codice(), + get(F_TIPOCF), a.codclifor(), a.articolo(), art_per_buck, price); artrow.add(price.string(), F_BUCKET1 + b*2 + 1 - FIRST_FIELD); } @@ -837,44 +1024,6 @@ void TPlanning_mask::add_or_sub_propose(char sign) } -// compatta le linee togliendo i doppioni -void TPlanning_mask::pack_article_sheet() -{ - TSheet_field& sf = sfield(F_ARTICOLI); - TToken_string lastrow; - for (int art_row=int(sf.items())-1; art_row >=0; art_row--) - { - if (!sf.cell_disabled(art_row, F_BUCKET1-FIRST_FIELD)) - { - TToken_string &row=sf.row(art_row); - long codcli = atol(row.get(F_CLIENTE-FIRST_FIELD)); - TCodice_articolo codart = row.get(F_ARTICOLO-FIRST_FIELD); - TString16 codimp= row.get(F_CODIMP-FIRST_FIELD); - TString16 codlin= row.get(F_CODLIN-FIRST_FIELD); - TString16 liv; - if (livelli_giac().enabled()) - { - livelli_giac().pack_grpcode(liv, row.get(sf.cid2index(F_LIV1)),1); - livelli_giac().pack_grpcode(liv, row.get(sf.cid2index(F_LIV2)),2); - livelli_giac().pack_grpcode(liv, row.get(sf.cid2index(F_LIV3)),3); - livelli_giac().pack_grpcode(liv, row.get(sf.cid2index(F_LIV4)),4); - liv.trim(); - } - TString16 mag; - add_magcode(mag, row.get(F_MAGAZZINO-FIRST_FIELD)); - add_depcode(mag, row.get(F_DEPOSITO-FIRST_FIELD)); - - for (int bucket=0; bucket<=LAST_BUCKET ; bucket++) - { - real art_per_buck(lastrow.get(F_BUCKET1 + bucket*2 - FIRST_FIELD)); - row.add(art_per_buck.string(), F_BUCKET1 + bucket*2 - FIRST_FIELD); - } - } - } - sf.force_update(); -} - - void TPlanning_mask::check_articles() { TSheet_field& sf = sfield(F_ARTICOLI); @@ -911,176 +1060,6 @@ void TPlanning_mask::check_capacities() sf.set_focus_cell(cm.last_row(),cm.last_col()+F_LBUCKET0); } -void TPlanning_mask::print_articles() -{ - TString repname("mr2200"); - TSheet_field& sf = sfield(F_ARTICOLI); - const int nrows=sf.items(); - - TIsamtempfile * report = new TIsamtempfile(LF_MRPREPORT,repname, TRUE, TRUE ); - TString8 codimp,codlin; - TProgind pi(nrows, format("Stampa %s...",(const char *)(get_bool(F_MSCHEDULEPLAN)? - "Master Schedule Plan":"pianificazione ordini"))); - char block='\0'; - const int a_buck0 = sf.cid2index(F_BUCKET0); - for (int r=0; rcurr(); - if (sf.cell_disabled(r, a_buck0 +2)) - { - if (r= 0; b--) - { - switch(b) - { - case 0: - campo = "QTAFIRST"; break; - case LAST_BUCKET: - campo = "QTALAST"; break; - default: - campo.format("QTA%d", b); break; - } - record.put(campo, row.get(sf.cid2index(F_BUCKET0+b*2))); - } - report->write(); - pi.addstatus(1); - } - TMSP_form form(report); - // stampa - if (form.cursor()->items() > 0) - { - TDate fd = get_date(F_DADATA); - TDate td = get_date(F_ADATA); - TDate wd; - const short first_id = 3; - const short last_id = 12; - --fd; - TString descr; - descr.format("\nAl %s", (const char*)fd); - form.find_field('B', odd_page, first_id).set_col_head(descr); - for (;fd <= td;) - { - ++fd; - descr.format("Da %s\nAl ",(const char*)fd); - fd += days_per_bucket()-1; - wd = fd; - descr << (const char*) fd; - const short id = first_id+round_date(wd,FALSE)+1; - if (id > last_id) - continue; - form.find_field('B', odd_page, id).set_col_head(descr); - } - ++td; - descr.format("Dal %s", (const char*)td); - form.find_field('B', odd_page, last_id).set_col_head(descr); - const int hh = 7; - const int fl = printer().formlen(); - - int rows[4]; // Righe orizzontali - rows[0] = hh-3; - rows[1] = hh; - rows[2] = fl; - rows[3] = 0; - form.genera_intestazioni(odd_page, hh-2); - //FOrm.genera_fincatura(odd_page, hh-3, fl, rows); - form.print(); - } - // report non va cancellato, poiche' ne viene fatta la sostituzione nella relazione del form - // quindi la delete viene gia' fatta alla distruzione di _form -} - -void TPlanning_mask::print_capacities() -{ - TString repname("mr2200"); - TSheet_field& sf = sfield(F_LINEE); - const int nrows=sf.items(); - - TIsamtempfile * report = new TIsamtempfile(LF_MRPREPORT,repname, TRUE, FALSE ); - TString8 codimp,codlin; - TString codart; - TProgind pi(nrows, format("Stampa %s...",(const char *)(*get(F_LOADTYPE)=='M'? - "carico macchina":"carico uomo"))); - const int a_buck0 = sf.cid2index(F_LBUCKET0); - char block='\0'; - for (int r=0; r curr(); - record.zero(' '); - codimp=row.get(sf.cid2index(F_CODIMPCRP)); - codlin=row.get(sf.cid2index(F_CODLINCRP)); - codart=row.get(sf.cid2index(F_CODARTCRP)); - record.put("RIGA", r); - record.put("IMPIANTO", codimp); - record.put("LINEA", codlin); - record.put("CODART", codart); - char type('D'); - if (!codart.blank()) - type = 'A'; - else if (!codlin.blank()) - type = 'L'; - else if (!codimp.blank()) - type = 'I'; - const bool is_capacity = sf.cell_disabled(r, a_buck0 +2); - if (!is_capacity) - type = tolower(type); - record.put("TIPO",type); -// record.put("TIPOCF", row.get(sf.cid2index(F_TIPOCF_SHEET))); -// record.put("CODCLI", row.get(sf.cid2index(F_CLIENTE))); - record.put("UM", row.get(sf.cid2index(F_LUM))); - TString16 campo; - for (int b = LAST_BUCKET; b >= 0; b--) - { - switch(b) - { - case 0: - campo = "QTAFIRST"; break; - case LAST_BUCKET: - campo = "QTALAST"; break; - default: - campo.format("QTA%d", b); - } - record.put(campo, row.get(sf.cid2index(F_LBUCKET0+b*2))); - } - report->write(); - pi.addstatus(1); - } -// delete report; -// TIsamtempfile * report = new TIsamtempfile(LF_MRPREPORT,repname, FALSE, FALSE ); - TCRP_form form(report); - // stampa - if (form.cursor()->items() > 0) - form.print(); - // report non va cancellato, poiche' ne viene fatta la sostituzione nella relazione del form - // quindi la delete viene gia' fatta alla distruzione di _form -} - bool TPlanning_mask::sortMSPsheet() { TWait_cursor hg; @@ -1123,14 +1102,39 @@ bool TPlanning_mask::sortCRPsheet() void TPlanning_mask::add_MRP_bucket(TMRP_line& new_article, int nbucket, const real &curr_arts) { TDate data_buck; - data_buck=get_date(F_DADATA); + data_buck=starting_date(); data_buck+=days_per_bucket()*(nbucket-1); + round_date(data_buck); TMRP_time t(data_buck, 0, "", ""); new_article.add_planned_ord(t, curr_arts ); } +void TPlanning_mask::propose(int row) +{ + const bool useextralines=get_bool(F_USENONSTDLIN_MSP); + const bool useextrahours=get_bool(F_USEEXTRAHRS_MSP) ; + set(F_USENONSTDLIN_CRP ,useextralines ? "X" : ""); + set(F_USEEXTRAHRS_CRP ,useextrahours ? "X" : ""); + if (get(F_RECALC_TYPE)=="1") + propose_1stJIT(_first_fit_logic,TRUE,TRUE, row); + else if (get(F_RECALC_TYPE)=="1_INFH") + propose_1stJIT(_first_fit_logic,TRUE,FALSE, row); + else if (get(F_RECALC_TYPE)=="1_INF") + propose_1stJIT(_first_fit_logic,FALSE,FALSE, row); + else if (get(F_RECALC_TYPE)=="JIT") + propose_1stJIT(_JIT_logic,TRUE,TRUE, row); + else if (get(F_RECALC_TYPE)=="JIT_INFH") + propose_1stJIT(_JIT_logic,TRUE,FALSE, row); + else if (get(F_RECALC_TYPE)=="JIT_INF") + propose_1stJIT(_JIT_logic,FALSE,FALSE, row); + else if (get(F_RECALC_TYPE)=="UNIL") + propose_1stJIT(_uniform_logic,TRUE,FALSE, row); + else if (get(F_RECALC_TYPE)=="UNI") + propose_1stJIT(_uniform_logic,FALSE,FALSE, row); + // aggiorna lo sheet delle capacita' +} // propone secondo la logica FirstFit o JIT -void TPlanning_mask::propose_1stJIT(TMSP_logic logic, bool check_machine, bool check_human) +void TPlanning_mask::propose_1stJIT(TMSP_logic logic, bool check_machine, bool check_human, int numriga) { const bool useextralines=get_bool(F_USENONSTDLIN_MSP); const bool useextrahours=get_bool(F_USEEXTRAHRS_MSP) ; @@ -1142,15 +1146,8 @@ void TPlanning_mask::propose_1stJIT(TMSP_logic logic, bool check_machine, bool c _capacities.destroy(); if (check_machine || check_human) { - if (ok = load_MRP_lines(_released_schedule)) + if (ok = load_MRP_lines(_actual_plan)) { - /* - gross2net(_released_schedule,FALSE); - ok = general_review(check_machine, check_human, useextralines, useextrahours,FALSE, no_outcapacity,0, 0,_released_schedule, logic, "Calcolo carico minimo..."); - _proposed_articles = _mrp_articles; - add_or_sub_propose(-1); - */ - //add_or_sub_propose(-1); gross2net(_actual_plan,FALSE); ok = general_review(check_machine, check_human, useextralines, useextrahours,FALSE, no_outcapacity,0, 0,_actual_plan, logic, "Calcolo carico minimo..."); } @@ -1160,7 +1157,7 @@ void TPlanning_mask::propose_1stJIT(TMSP_logic logic, bool check_machine, bool c int buck=NO_PROPOSE; for (int level=1; ok && level <= 2; level++) { - if (ok = load_MRP_lines(_stock_break,level)) + if (ok = load_MRP_lines(_stock_break, level, numriga)) { _proposed_articles.destroy(); gross2net(_stock_break, lotsizing); @@ -1179,8 +1176,9 @@ void TPlanning_mask::propose_1stJIT(TMSP_logic logic, bool check_machine, bool c _proposed_articles.add(last_propose); if (buck!=NO_PROPOSE) { - TDate dbuck(get_date(F_DADATA)); + TDate dbuck(starting_date()); dbuck +=buck*days_per_bucket(); + round_date(dbuck); message_box("Quantita' proposte a partire dal %s (colonna %d)", (const char *)dbuck.string(),buck); } else @@ -1208,18 +1206,20 @@ bool TPlanning_mask::general_review(bool check_machine, bool check_human, bool u TArray labors; const long max_mrp_rows=_mrp_articles.items(); - TProgind pi(max_mrp_rows*LAST_BUCKET ,msg, TRUE, TRUE); + TProgind pi((max_mrp_rows+1)*LAST_BUCKET ,msg, TRUE, TRUE); for (int bucket = 0; bucket < LAST_BUCKET ; bucket++) { + pi.addstatus(1); for (long mrp_row=0; mrp_row < max_mrp_rows; mrp_row++) { pi.addstatus(1); if (pi.iscancelled()) return FALSE; TMRP_line &mrpline=_mrp_articles[mrp_row]; - TDate data_buck(get_date(F_DADATA)); + TDate data_buck(starting_date()); data_buck+=days_per_bucket()*(bucket-1); + round_date(data_buck); const TMRP_time mrp_time(data_buck, 0, "",""); TMRP_record & mrp_rec= mrpline.record(mrp_time); real pieces, curr_arts, art_per_buck(mrp_rec.net_requirement()); // quantità da produrre nel bucket @@ -1232,9 +1232,9 @@ bool TPlanning_mask::general_review(bool check_machine, bool check_human, bool u dist_tree().set_global("_LIVELLO",livello_di_giacenza); dist_tree().set_global("_IMPIANTO",codimp); dist_tree().set_global("_LINEA",codlin); - dist_tree().set_global("_MAGAZZINO",mrpline.codmag()); + dist_tree().set_global("_MAGAZZINO",mrpline.codmagdep()); bool no_limits=(logic == _uniform_logic && !check_machine) - || !dist_tree().set_root(mrpline.codice()); + || !dist_tree().set_root(mrpline.articolo()); if (!no_limits) { TRiga_esplosione * l=dist_tree().first_critical_labor(labors); @@ -1254,6 +1254,13 @@ bool TPlanning_mask::general_review(bool check_machine, bool check_human, bool u // secondo tentativo: rimane entro i vincoli di minimo e massimo anticipo utilizando anche le linee non STD // terzo tentativo: supera i vincoli di minimo e massimo anticipo utilizando anche le linee non STD art_per_buck.round(5); + //if (nbucket>bucket) + if (art_per_buck > mrpline.net_requirement(lastbuck)) + { + // il sotto stock si propagherebbe fino alla fine ? + art_per_buck = mrpline.net_requirement(lastbuck) ; + mrpline.set_net_req(bucket,art_per_buck); + } while (art_per_buck > ZERO && attemp <= 3) { if (logic == _JIT_logic) @@ -1269,12 +1276,6 @@ bool TPlanning_mask::general_review(bool check_machine, bool check_human, bool u if (upper_buck>bucket) upper_buck=bucket; nbucket= (logic == _JIT_logic) ? upper_buck : lower_buck; - if (nbucket>bucket) - { - // sono oltre il bucket attuale: il sotto stock si propagherebbe fino alla fine ? - art_per_buck = mrpline.net_requirement(lastbuck) ; - mrpline.set_net_req(bucket,art_per_buck); - } while (art_per_buck > ZERO // ho un sotto-stock da risolvere && nbucket>=lower_buck && nbucket <= upper_buck) // sono entro il range definito { @@ -1288,7 +1289,7 @@ bool TPlanning_mask::general_review(bool check_machine, bool check_human, bool u nlinea= curr_labor->find_linea(codlin); if (nlinea<0) { - error_box("La linea %s non e' in grado di produrre l'articolo %s", (const char * )codlin, (const char *) _mrp_articles[mrp_row].codice()); + error_box("La linea %s non e' in grado di produrre l'articolo %s", (const char * )codlin, (const char *) _mrp_articles[mrp_row].articolo()); break; } numlinee=nlinea+1; @@ -1303,13 +1304,13 @@ bool TPlanning_mask::general_review(bool check_machine, bool check_human, bool u crpline_lin = _capacities.find(linea_prod); if (crpline_lin == NULL) crpline_lin = compute_capacity(linea_prod,useextralines, useextrahours); - crpline_art = _capacities.find(codimplin, linea_prod.codice(), mrpline.codice(), mrpline.codcli(),TRUE); + crpline_art = _capacities.find(codimplin, linea_prod.codice(), mrpline.articolo(), mrpline.codclifor(),TRUE); crpline_imp = _capacities.find(codimplin); crpline_firm = _capacities.find(); int human_level = 1; if ( linea_prod.personale_dedicato()) human_level = 3; - else if (linea_prod.get_impianto()->personale_dedicato()) + else if (linea_prod.get_impianto() && linea_prod.get_impianto()->personale_dedicato()) human_level = 2; // individua il massimo caricabile sulla linea unit_load = l->val()*curr_labor->um_temporale().converti_in_ore()/curr_labor->produttiv_linea(nlinea); @@ -1356,7 +1357,7 @@ bool TPlanning_mask::general_review(bool check_machine, bool check_human, bool u if (curr_arts != art_per_buck && mode == _actual_plan) { TMRP_line* new_article = _proposed_articles.find(mrpline.codice(), - mrpline.livgiac(), mrpline.codmag(), + mrpline.livgiac(), mrpline.codmagdep(), linea_prod.codimp() , linea_prod.codice(), mrpline.codcli(), TRUE); add_MRP_bucket(*new_article, nbucket, curr_arts-art_per_buck ); }*/ @@ -1369,12 +1370,12 @@ bool TPlanning_mask::general_review(bool check_machine, bool check_human, bool u crpline_art->load(nbucket).add_machine(load); crpline_lin->load(nbucket).add_machine(load); // aggiunge il numero pezzi - pieces = curr_arts * cache().get(LF_ANAMAG,mrpline.codice()).get_real(ANAMAG_PPCONF); + pieces = curr_arts * cache().get(LF_ANAMAG,mrpline.articolo()).get_real(ANAMAG_PPCONF); crpline_art->load(nbucket).add_pieces(pieces); crpline_lin->load(nbucket).add_pieces(pieces); crpline_imp->load(nbucket).add_pieces(pieces); // aggiunge l'impegno finanziario - pieces = curr_arts * cache().get(LF_ANAMAG,mrpline.codice()).get_real(ANAMAG_COSTSTD); + pieces = curr_arts * cache().get(LF_ANAMAG,mrpline.articolo()).get_real(ANAMAG_COSTSTD); crpline_art->load(nbucket).add_money(pieces); crpline_lin->load(nbucket).add_money(pieces); crpline_imp->load(nbucket).add_money(pieces); @@ -1391,19 +1392,19 @@ bool TPlanning_mask::general_review(bool check_machine, bool check_human, bool u crpline_art->load(nbucket).add_human(hload) ; if (mode == _stock_break) { - TString8 codmag(mrpline.codmag()); - TString8 codmagc(mrpline.codmag_coll()); + TString8 codmag(mrpline.codmagdep()); + TString8 codmagc(mrpline.codmagdep_coll()); if (codmag.blank()) codmag = linea_prod.codmagdep(); if (codmagc.blank()) codmagc = linea_prod.codmagdep_coll(); - TMRP_line* new_article = find_propose(mrpline.codcli(), mrpline.codice(), + TMRP_line* new_article = find_propose(mrpline.codclifor(), mrpline.articolo(), mrpline.livgiac(), codimplin , linea_prod.codice(), codmag, codmagc, TRUE); add_MRP_bucket(*new_article, nbucket, curr_arts); } } } else - error_box("Articolo %s: impianto %s incompatibile con la linea %s",(const char *)mrpline.codice(), (const char *)codimp, (const char *)linea_prod.codice()); + error_box("Articolo %s: impianto %s incompatibile con la linea %s",(const char *)mrpline.articolo(), (const char *)codimp, (const char *)linea_prod.codice()); if (logic == _uniform_logic) nbucket++; else @@ -1441,10 +1442,17 @@ bool TPlanning_mask::general_review(bool check_machine, bool check_human, bool u if (upper_buck>bucket) upper_buck=bucket; nbucket = lower_buck; + //if (nbucket>bucket) + if (art_per_buck > mrpline.net_requirement(lastbuck)) + { + // sono oltre il bucket attuale: il sotto stock si propagherebbe fino alla fine ? + art_per_buck = mrpline.net_requirement(lastbuck) ; + mrpline.set_net_req(bucket,art_per_buck); + } while (nbucket <= upper_buck) { - TMRP_line* new_article = find_propose(mrpline.codcli(), mrpline.codice(), mrpline.livgiac(), - mrpline.codimp() , mrpline.codlin(), mrpline.codmag(), mrpline.codmag_coll(), TRUE); + TMRP_line* new_article = find_propose(mrpline.codclifor(), mrpline.articolo(), mrpline.livgiac(), + mrpline.codimp() , mrpline.codlin(), mrpline.codmagdep(), mrpline.codmagdep_coll(), TRUE); curr_arts = art_per_buck; if (logic == _uniform_logic) curr_arts /= (upper_buck-nbucket+1); @@ -1460,8 +1468,9 @@ bool TPlanning_mask::general_review(bool check_machine, bool check_human, bool u const TDate lastdate = mrpline.record(lastbuck).time().date(); int b=bucket+1; do { - data_buck=get_date(F_DADATA); + data_buck=starting_date(); data_buck+=days_per_bucket()*(b-1); + round_date(data_buck); const TMRP_time t(data_buck, 0, "",""); if (mrpline.record(t).net_requirement() > ZERO) mrpline.add_net_req(b, pending); @@ -1515,7 +1524,8 @@ TCRP_line *TPlanning_mask::compute_capacity(TLinea_prod &lineaprod, bool useextr crpline_firm=_capacities.find("", "", "", 0L, TRUE); // calcola la capacita' - TDate data_buck=get_date(F_DADATA); + TDate data_buck=starting_date(); + TDate next_data_buck = data_buck; real capacity,human,human_imp,human_firm; for (int b=1; b=0 ; day--) + next_data_buck += days_per_bucket(); + round_date(next_data_buck); + while (data_buck < next_data_buck) { cal.add_oremacchina(capacity, data_buck,useextrahours); if (lineaprod.personale_dedicato()) cal.add_oreuomo(human, data_buck,useextrahours); - if (compute_imp && lineaprod.get_impianto()->personale_dedicato()) + if (compute_imp && lineaprod.get_impianto() && lineaprod.get_impianto()->personale_dedicato()) cal_imp.add_oreuomo(human_imp, data_buck,useextrahours); if (compute_firm) cal_firm.add_oreuomo(human_firm, data_buck,useextrahours); @@ -1566,12 +1578,12 @@ void TPlanning_mask::msprow2codes(TToken_string &row,long &clifor, TCodice_artic { clifor = row.get_long(F_CLIENTE-FIRST_FIELD); art = row.get(F_ARTICOLO-FIRST_FIELD); - if (livelli_giac().enabled()) + if (livelli_giacenza().enabled()) { - livelli_giac().pack_grpcode(liv, row.get(F_LIV1-FIRST_FIELD),1); - livelli_giac().pack_grpcode(liv, row.get(F_LIV2-FIRST_FIELD),2); - livelli_giac().pack_grpcode(liv, row.get(F_LIV3-FIRST_FIELD),3); - livelli_giac().pack_grpcode(liv, row.get(F_LIV4-FIRST_FIELD),4); + livelli_giacenza().pack_grpcode(liv, row.get(F_LIV1-FIRST_FIELD),1); + livelli_giacenza().pack_grpcode(liv, row.get(F_LIV2-FIRST_FIELD),2); + livelli_giacenza().pack_grpcode(liv, row.get(F_LIV3-FIRST_FIELD),3); + livelli_giacenza().pack_grpcode(liv, row.get(F_LIV4-FIRST_FIELD),4); liv.trim(); } add_magcode(mag,row.get(F_MAGAZZINO-FIRST_FIELD)); @@ -1589,16 +1601,16 @@ void TPlanning_mask::crprow2codes(TToken_string &row, TString & imp, TString & l clifor=0L; //clifor = row.get_long(F_CLIENTE-FIRST_FIELD); //art = row.get(F_ARTICOLO-FIRST_FIELD); - //livelli_giac().pack_grpcode(liv, row.get(F_LIV1-FIRST_FIELD),1); - //livelli_giac().pack_grpcode(liv, row.get(F_LIV2-FIRST_FIELD),2); - //livelli_giac().pack_grpcode(liv, row.get(F_LIV3-FIRST_FIELD),3); - //livelli_giac().pack_grpcode(liv, row.get(F_LIV4-FIRST_FIELD),4); + //livelli_giacenza().pack_grpcode(liv, row.get(F_LIV1-FIRST_FIELD),1); + //livelli_giacenza().pack_grpcode(liv, row.get(F_LIV2-FIRST_FIELD),2); + //livelli_giacenza().pack_grpcode(liv, row.get(F_LIV3-FIRST_FIELD),3); + //livelli_giacenza().pack_grpcode(liv, row.get(F_LIV4-FIRST_FIELD),4); imp = row.get(F_CODIMPCRP-FIRST_FIELD); imp.trim(); lin = row.get(F_CODLINCRP-FIRST_FIELD); lin.trim(); um = row.get(F_LUM-FIRST_FIELD); um.trim(); } // carica le MRP line dallo sheet articoli -bool TPlanning_mask::load_MRP_lines(TMSP_mode mode, int level) +bool TPlanning_mask::load_MRP_lines(TMSP_mode mode, int level, int numriga) { TSheet_field& sa = sfield(F_ARTICOLI); if (sa.items()==0) @@ -1607,52 +1619,63 @@ bool TPlanning_mask::load_MRP_lines(TMSP_mode mode, int level) return FALSE; } TWait_cursor hourglass; + int first_row=-1, last_row=-1; + if (numriga >= 0) + { + TRiga_articolo::find_block(sa, numriga, first_row, last_row); + first_row--; + } const int a_buck0 = sa.cid2index(F_BUCKET0); TDate data_buck; _mrp_articles.destroy(); // calcola gli impegni di produzione per gli articoli dello sheet + TMRP_line* curr_article=NULL; + int added_on = -1; bool skip=FALSE; - TMRP_line* last_constraint = NULL; FOR_EACH_SHEET_ROW(sa, r, row) if (!sa.cell_disabled(r, a_buck0+2) || sa.cell_disabled(r+1, a_buck0+2)) { - const bool is_constraint=sa.cell_disabled(r, a_buck0+2); - if (is_constraint) + if (first_row < 0 || r >=first_row && r <=last_row) { - bool is_second_level; - const int prior=get_int(F_2LEVEL_PRIORITY); - if (prior>0) - is_second_level=(atoi(row->get(F_PRIORITA-FIRST_FIELD))>=prior); - else - is_second_level=(row->get_char(F_MASTERCODE-FIRST_FIELD)==MASTERCODE_CHAR); - skip = (level == 1 && !is_second_level || level == 2 && is_second_level ); - } - if (!skip) - { - long clifor; - TCodice_articolo art ; - TString16 liv; - TString8 mag, magc, imp, lin; - TCodice_um um ; - msprow2codes(*row, clifor, art, liv, mag, magc, imp, lin, um); - - TMRP_line* curr_article=last_constraint; - if (!is_constraint || mode == _stock_break) - curr_article = _mrp_articles.find(art, liv, mag, magc, imp, lin, clifor ,TRUE); + const bool is_constraint=sa.cell_disabled(r, a_buck0+2); if (is_constraint) - last_constraint = curr_article; - - TMSP_line* mspline = _articles.find(*row, FALSE); - - bool added_some=FALSE; - for (int nbucket=LAST_BUCKET-1; nbucket>=0 ; nbucket--) { - data_buck=get_date(F_DADATA); - data_buck+=days_per_bucket()*(nbucket-1); - const TMRP_time t(data_buck, 0, imp, lin); - real qta=row->get(a_buck0+nbucket*2); - if (qta != ZERO) + bool is_second_level; + const int prior=get_int(F_2LEVEL_PRIORITY); + if (prior>0) + is_second_level=(atoi(row->get(F_PRIORITA-FIRST_FIELD))>=prior); + else + is_second_level=(row->get_char(F_MASTERCODE-FIRST_FIELD)==MASTERCODE_CHAR); + skip = (level == 1 && !is_second_level || level == 2 && is_second_level ); + } + if (!skip) + { + long clifor; + TCodice_articolo art ; + TString16 liv; + TString8 mag, magc, imp, lin; + TCodice_um um ; + msprow2codes(*row, clifor, art, liv, mag, magc, imp, lin, um); + + if ((is_constraint && mode == _stock_break ) || + (!is_constraint && mode == _actual_plan) || + (is_constraint && mode == _rescheduling) ) { + curr_article = _mrp_articles.find(art, liv, mag, magc, imp, lin, clifor ,TRUE); + added_on = -1; + } + TMSP_line* mspline = _articles.find(*row, FALSE); + + if ((mode == _stock_break ) || + (!is_constraint && mode == _actual_plan) || + (!is_constraint && mode == _rescheduling) ) + for (int nbucket=LAST_BUCKET-1; nbucket>=0 ; nbucket--) + { + data_buck=starting_date(); + data_buck+=days_per_bucket()*(nbucket-1); + round_date(data_buck); + const TMRP_time t(data_buck, 0, imp, lin); + real qta=row->get(a_buck0+nbucket*2); TQuantita q(art, um, qta); q.convert2umbase(); real rq(mspline ? mspline->qta_min(nbucket) : ZERO); @@ -1660,37 +1683,54 @@ bool TPlanning_mask::load_MRP_lines(TMSP_mode mode, int level) // e le celle normali negli sched receipts switch (mode) { - case _actual_plan: - case _released_schedule: - if (curr_article) + case _rescheduling: + if ((!qta.is_zero() || !rq.is_zero() || added_on>nbucket)&& + (nbucket>0)) { - curr_article->add_sched_rec(t, rq); - curr_article->add_planned_ord(t, q.val() - rq); - added_some=TRUE; + curr_article->add_planned_ord(t, q.val()); + if (mspline) + { + // transfer docs' refs + TMRP_docref * ref = mspline->first_rigaref(nbucket); + while (ref) + { + curr_article->add_sched_rec(t, ref->qta_residua(), ref); + ref = mspline->next_rigaref(nbucket); + } + } + added_on = nbucket; } break; - case _stock_break: - if (is_constraint) + case _actual_plan: + if (!qta.is_zero()) { - curr_article->add_gross_req(t, q.val()); - added_some=TRUE; - } else { - if (last_constraint) + if (curr_article) { - last_constraint->add_sched_rec(t, rq); - last_constraint->add_planned_ord(t, q.val() - rq); + curr_article->add_sched_rec(t, rq); + curr_article->add_planned_ord(t, q.val() - rq); + added_on = nbucket; } } + else if (added_on > nbucket) + curr_article->set_on_hand(t, ZERO); // per settare tutti i bucket precedenti + break; + case _stock_break: + if (!qta.is_zero()) + { + if (is_constraint) + { + curr_article->add_gross_req(t, q.val()); + } else { + curr_article->add_sched_rec(t, rq); + curr_article->add_planned_ord(t, q.val() - rq); + } + added_on = nbucket; + } else + if (added_on > nbucket || added_on == 0 && nbucket == 0 ) + curr_article->set_on_hand(t, get_bool(F_MSCHEDULEPLAN) && nbucket == 0 ? + curr_article->giacenza_attuale(qta,data_buck) : ZERO); break; } - } else - if (added_some) - curr_article->set_on_hand(t, ZERO); // per settare tutti i bucket precedenti - if (nbucket == 0 && is_constraint) - { - //curr_article->set_on_hand(t, curr_article->giacenza_attuale(qta,data_buck)); - if (last_constraint) - last_constraint->set_on_hand(t, curr_article->giacenza_attuale(qta,data_buck)); } } } @@ -1710,21 +1750,22 @@ bool TPlanning_mask::gross2net(TMSP_mode mode, bool lotsizing) // calcola il fabbisogno netto e lo riporta sul bucket seguente TMRP_line & mrp_line = _mrp_articles[mrp_row]; const int last = mrp_line.last_bucket(); + real netreq, giacres, resched, need; for (int bucket = 0; bucket <= last; bucket = mrp_line.next_bucket(bucket)) { - real netreq,giacres; switch (mode) { case _actual_plan: - netreq += mrp_line.planned_orders(bucket); - case _released_schedule: + netreq = mrp_line.planned_orders(bucket); netreq += mrp_line.sched_receipts(bucket); mrp_line.set_net_req(bucket, netreq); break; case _stock_break: - giacres = mrp_line.on_hand(bucket); - giacres += mrp_line.sched_receipts(bucket); + giacres = mrp_line.on_hand(bucket); giacres -= mrp_line.gross_requirement(bucket); + //if (bucket == 0) + giacres += mrp_line.planned_orders(bucket); + giacres += mrp_line.sched_receipts(bucket); if (lotsizing) netreq = mrp_line.sizeup_net_requirement(bucket, giacres); else @@ -1743,13 +1784,36 @@ bool TPlanning_mask::gross2net(TMSP_mode mode, bool lotsizing) } +const TDate & TPlanning_mask::starting_date() const +{ + if (!_start_date.ok()) + { + TDate &nakedate = ((TPlanning_mask *)(this))->_start_date; + if (get_date(F_DADATA).ok()) + nakedate = get_date(F_DADATA); + else + { + nakedate = TODAY; + round_date(nakedate, TRUE, FALSE); + nakedate+=1; + } + } + return _start_date; +} + int TPlanning_mask::days_per_bucket() const { return get_int(F_DAYXBUCK) * (get_int(F_BUCKETS) ? get_int(F_BUCKETS) : get_int(F_BUCKET)); } +bool TPlanning_mask::bucket_mese() const +{ + return *get(F_BUCKETS) == 'M'; +} + void TPlanning_mask::clear_sheets() { + _start_date = NULLDATE; _proposed_articles.destroy(); _mrp_articles.destroy(); @@ -1798,12 +1862,12 @@ int TPlanning_mask::init_bucket0(TArticolo_giacenza &art, int r) TToken_string &art_row=sf.row(r); // calcola codice di magazzino e di livello TString16 livello; - if (livelli_giac().enabled()) + if (livelli_giacenza().enabled()) { - livelli_giac().pack_grpcode(livello, giac_row.get(sf.cid2index(F_LIV1)),1); - livelli_giac().pack_grpcode(livello, giac_row.get(sf.cid2index(F_LIV2)),2); - livelli_giac().pack_grpcode(livello, giac_row.get(sf.cid2index(F_LIV3)),3); - livelli_giac().pack_grpcode(livello, giac_row.get(sf.cid2index(F_LIV4)),4); + livelli_giacenza().pack_grpcode(livello, giac_row.get(sf.cid2index(F_LIV1)),1); + livelli_giacenza().pack_grpcode(livello, giac_row.get(sf.cid2index(F_LIV2)),2); + livelli_giacenza().pack_grpcode(livello, giac_row.get(sf.cid2index(F_LIV3)),3); + livelli_giacenza().pack_grpcode(livello, giac_row.get(sf.cid2index(F_LIV4)),4); livello.trim(); } TString16 codmag; @@ -1813,7 +1877,7 @@ int TPlanning_mask::init_bucket0(TArticolo_giacenza &art, int r) TQuantita prog_giac(art.codice(),giac_row.get(sf.cid2index(F_UM)),planned); if (add_giac) { - real giac=art.giacenza_anno(codmag, livello, get_date(F_DADATA).year()); + real giac=art.giacenza_anno(codmag, livello, starting_date().year()); prog_giac +=giac; } // ??? prog_giac += giac_row.get(b0); @@ -1823,18 +1887,18 @@ int TPlanning_mask::init_bucket0(TArticolo_giacenza &art, int r) if (ord_row.get_char(F_MASTERCODE-FIRST_FIELD) == MASTERCODE_CHAR) art_row.add(get_int(F_2LEVEL_PRIORITY),F_PRIORITA-FIRST_FIELD); - do_test_art_row(r,c,FALSE); + do_test_art_row(r,c,r,FALSE); return c-2; } -bool TPlanning_mask::do_test_art_row(int r, int c, bool signal) +bool TPlanning_mask::do_test_art_row(int r, int first, int last, bool signal) { TSheet_field& sf = sfield(F_ARTICOLI); TMask & smask= sf.sheet_mask(); TToken_string & curr_row=sf.row(r); - TToken_string & constr_row=sf.row(c-1); - TToken_string & giac_row=sf.row(c); + TToken_string & constr_row=sf.row(first-1); + TToken_string & giac_row=sf.row(first); // ********** // setta la priorita' su tutte le righe del blocco @@ -1842,7 +1906,7 @@ bool TPlanning_mask::do_test_art_row(int r, int c, bool signal) const int old_prior=constr_row.get_int(sf.cid2index(F_PRIORITA)); if (old_prior != prior) { - for (int i = c-1; i<=r; i++) + for (int i = first-1; i<=last; i++) { sf.row( i ).add(prior , sf.cid2index(F_PRIORITA)); sf.force_update(i); @@ -1852,17 +1916,17 @@ bool TPlanning_mask::do_test_art_row(int r, int c, bool signal) // calcola la giacenza proiettata TCodice_articolo codart(curr_row.get(sf.cid2index(F_ARTICOLO))); TArticolo_giacenza art(codart); - TString16 liv; + TString16 liv; TString8 mag,imp,lin; long codcli=constr_row.get_long(F_CLIENTE-FIRST_FIELD); imp=constr_row.get(sf.cid2index(F_CODIMP)); lin=constr_row.get(sf.cid2index(F_CODLIN)); - if (livelli_giac().enabled()) + if (livelli_giacenza().enabled()) { - livelli_giac().pack_grpcode(liv, constr_row.get(sf.cid2index(F_LIV1)),1); - livelli_giac().pack_grpcode(liv, constr_row.get(sf.cid2index(F_LIV2)),2); - livelli_giac().pack_grpcode(liv, constr_row.get(sf.cid2index(F_LIV3)),3); - livelli_giac().pack_grpcode(liv, constr_row.get(sf.cid2index(F_LIV4)),4); + livelli_giacenza().pack_grpcode(liv, constr_row.get(sf.cid2index(F_LIV1)),1); + livelli_giacenza().pack_grpcode(liv, constr_row.get(sf.cid2index(F_LIV2)),2); + livelli_giacenza().pack_grpcode(liv, constr_row.get(sf.cid2index(F_LIV3)),3); + livelli_giacenza().pack_grpcode(liv, constr_row.get(sf.cid2index(F_LIV4)),4); liv.trim(); } add_magcode(mag, constr_row.get(sf.cid2index(F_MAGAZZINO))); @@ -1881,28 +1945,28 @@ bool TPlanning_mask::do_test_art_row(int r, int c, bool signal) const int b0 = sf.cid2index(F_BUCKET0); TQuantita vincolo(codart,giac_row.get(sf.cid2index(F_UM)),ZERO); TQuantita totale(vincolo),qta(vincolo); - totale += real(sf.cell(c, b0));// giacenza iniziale + totale += real(sf.cell(first, b0));// giacenza iniziale for (int b = 1; b < LAST_BUCKET; b++) { - vincolo.set_val(real(sf.cell(c-1, b0+b*2))); - for (int i = c+1; i <= r; i++) + vincolo.set_val(real(sf.cell(first-1, b0+b*2))); + for (int i = first+1; i <= last; i++) { totale += real(sf.cell(i, b0+b*2)); // somma alla giacenza le produzioni } - totale -= real(sf.cell(c-1, b0+b*2)); // detrae le uscite + totale -= real(sf.cell(first-1, b0+b*2)); // detrae le uscite giac_row.add(totale.val().string(), b0+b*2); if (signal && totale.val() < soglia) { TString err; - const int bucket_size = days_per_bucket(); - const TDate d = get_date(F_DADATA) + long(bucket_size * (b-1)); - err << "Riga " << c+1 << ": Vincolo non ripettato al " << d; + TDate d = starting_date() + long(days_per_bucket() * (b-1)); + round_date(d); + err << "Riga " << first+1 << ": Vincolo non ripettato al " << d; beep(); signal =FALSE; xvt_statbar_set(err); } } - sf.force_update(c); + sf.force_update(first); if (signal) xvt_statbar_set(""); // ********** @@ -1914,15 +1978,16 @@ bool TPlanning_mask::do_test_art_row(int r, int c, bool signal) CHECK (currconstr, "Impossibile trovare il vincolo dell'articolo di 1' livello"); TMSP_line2 *art2ndlev; currconstr->reset_unused_line2(); - while (r>c) + r = last; + while (r>first) { TToken_string & curr_row=sf.row(r); // aggancia i master di 2' livello - if (art2ndlev=currconstr->use_mspline2(curr_row, sf)) + if (art2ndlev=currconstr->use_mspline2(curr_row)) do_test_art_2ndlevel(art2ndlev); else if (signal) - message_box("Impossibile determinare l'articolo Master per %s",(const char*)currconstr->codice()); + message_box("Impossibile determinare l'articolo Master per %s",(const char*)currconstr->articolo()); r--; } while (art2ndlev=currconstr->get_unused_line2()) @@ -1942,11 +2007,11 @@ void TPlanning_mask::do_test_art_2ndlevel(TMSP_line2 *art2ndlev, bool erase) TMaster_code *mc; while ((mc=art2ndlev->get_mastercode(i++))!=NULL) { - TMSP_constraint* master_constr=_constraints.find(art2ndlev->constraint().cliente(),mc->articolo() - , mc->livello(), mc->codimp(), mc->codlin(), mc->codmag()); + TMSP_constraint* master_constr=_constraints.find(art2ndlev->constraint().codclifor(),mc->articolo() + , mc->livello(), mc->codimp(), mc->codlin(), mc->codmagdep()); if (master_constr==NULL) { - master_constr=_constraints.find(art2ndlev->constraint().cliente(),mc->articolo(), mc->livello(), mc->codimp(), mc->codlin(), mc->codmag(), TRUE); + master_constr=_constraints.find(art2ndlev->constraint().codclifor(),mc->articolo(), mc->livello(), mc->codimp(), mc->codlin(), mc->codmagdep(), TRUE); } int mrow= find_constr_row(*master_constr); @@ -1980,11 +2045,53 @@ void TPlanning_mask::do_test_art_2ndlevel(TMSP_line2 *art2ndlev, bool erase) sf.force_update(mrow); int first,last; TRiga_articolo::find_block(sf, mrow+2, first, last); - do_test_art_row(last, first, FALSE); + do_test_art_row(mrow+2, first, last, FALSE); } } } +// compatta le linee togliendo i doppioni +bool TPlanning_mask::pack_article_sheet(int r, int first, int last) +{ + TSheet_field& sf = sfield(F_ARTICOLI); + TToken_string &art_row = sf.row(r); + bool packed = FALSE; + for (int curr=last; curr >=first; curr--) if (curr != r) + { + TToken_string &curr_row=sf.row(curr); + if (TRiga_articolo ::order_compare(art_row, curr_row,15)==0) + { + packed = TRUE; + TToken_string work_row = curr_row; + for (int bucket=0; packed && bucket<=LAST_BUCKET ; bucket++) + { + real qta1(art_row.get(F_BUCKET1 + bucket*2 - FIRST_FIELD)); + real qta2(work_row.get(F_BUCKET1 + bucket*2 - FIRST_FIELD)); + real prz1(art_row.get(F_BUCKET1 +1 + bucket*2 - FIRST_FIELD)); + real prz2(work_row.get(F_BUCKET1 +1 + bucket*2 - FIRST_FIELD)); + if (!prz1.is_zero() && !qta2.is_zero() && prz1 != prz2) + packed = FALSE; + if (qta2.is_zero()) + work_row.add(prz1.string(), F_BUCKET1 + 1 + bucket*2 - FIRST_FIELD); + qta2 += qta1; + work_row.add(qta2.string(), F_BUCKET1 + bucket*2 - FIRST_FIELD); + } + if (packed) + { + curr_row = work_row; + sf.destroy(r); + } + } + } + if (packed) + { + sf.select(first); + sf.force_update(); + } + return packed; +} + + // controllo linee in modo interattivo bool TPlanning_mask::test_art_row(int r, bool signal) { @@ -1993,35 +2100,51 @@ bool TPlanning_mask::test_art_row(int r, bool signal) int first,last; if (TRiga_articolo::find_block(sf, r, first, last)) { + if (signal && pack_article_sheet(r, first+1, last)) + TRiga_articolo::find_block(sf, first+1, first, last); TToken_string & curr_row=sf.row(r); - do_test_art_row(last, first, signal); - if (signal) + const bool err = do_test_art_row(r, first, last, signal); + if (signal) { + // interactive mode: TMSP_line* line = _articles.find(curr_row, FALSE); if (line) { - real value; + real value,goodvalue; for (int b = 0 ; b < LAST_BUCKET; b++) { value = (curr_row.get(sf.cid2index(F_BUCKET0 + b*2))); - if (value != line->qta_min(b)) + goodvalue = line->qta_locked(b); + if (!goodvalue.is_zero()) { - if (line->qta_locked(b)) + if (value != goodvalue) { - error_box("Impossibile modificare la quantita' per l'articolo %s, colonna %d",(const char *)line->codice(),b); + error_box("Impossibile modificare la quantita' per l'articolo %s, colonna %d",(const char *)line->articolo(),b); do_events(); ok = FALSE; } - else if (value < line->qta_min(b)) + } else { + goodvalue = line->qta_min(b); + if (value < goodvalue) { - error_box("Impossibile inserire una quantita' inferiore a %s per l'articolo %s, colonna %d",(const char *)line->qta_min(b).string(),(const char *)line->codice(),b); - do_events(); - ok = FALSE; + if (!get_bool(F_RESCHEDULING) || get_int(F_RESCHED_ALERT)) + { + TString msg (format("%s %s confermati per l'articolo %s, colonna %d",(const char *)line->qta_min(b).string(),(const char *)line->um(),(const char *)line->articolo(),b)); + if (get_bool(F_RESCHEDULING)) + { + if (err) + xvt_statbar_set(msg); + } else { + error_box(msg); + ok = FALSE; + } + do_events(); + } } - } + } if (!ok) { - curr_row.add(line->qta_min(b).string(), sf.cid2index(F_BUCKET0 + b*2)); + curr_row.add(goodvalue.string(), sf.cid2index(F_BUCKET0 + b*2)); sf.force_update(r); } } @@ -2057,8 +2180,8 @@ bool TPlanning_mask::test_load_row(int r, bool signal) if (signal && capacita < carico) { TString err; - const int bucket_size = days_per_bucket(); - const TDate d = get_date(F_DADATA) + long(bucket_size * (b-1)); + TDate d = starting_date() + long(days_per_bucket() * (b-1)); + round_date(d); err << "Riga " << c+1 << ": capacita' superata al " << d; beep(); signal =FALSE; @@ -2069,205 +2192,102 @@ bool TPlanning_mask::test_load_row(int r, bool signal) return signal; } - -int TPlanning_mask::salva_documenti() +// copia i dati della riga al di fuori delle informazioni dei bucket +void TPlanning_mask::copy_sheet_row(TToken_string & newrow, const TToken_string & row) +{ + const TSheet_field& sf = sfield(F_ARTICOLI); + const int b0 = sf.cid2index(F_BUCKET0); + TString str; + for (int i = 0; i < b0; i++) + { + row.get(i, str); + newrow.add(str, i); + } +} + +int TPlanning_mask::salva_cella(int r, int b, TPlan_docs &doc_rows) { - int some=0; TSheet_field& sf = sfield(F_ARTICOLI); const int b0 = sf.cid2index(F_BUCKET0); - const int b1 = sf.cid2index(F_BUCKET1); const int um = sf.cid2index(F_UM); const TDate date_to = get(F_ADATA); - - TPlan_docs doc_rows(get(F_NUM_PLAN), get(F_TIPO_PLAN), get(F_RIGA_PLAN)); - - const TDate from = get(F_DADATA); + const TDate from(starting_date()); const int bucket_size = days_per_bucket(); const bool number_by_cli = get_bool(F_NUMBERBYCLI); const bool number_by_week = get_bool(F_NUMBERBYWEEK); - TProgind pi(LAST_BUCKET, "Emissione documenti" , FALSE, TRUE); - for (int b = 1; b < LAST_BUCKET; b++) - { - pi.addstatus(1); - TDate datacons = from + long(bucket_size * (b-1)); - if (datacons > date_to) - continue; - round_date(datacons,TRUE); + TDate datacons = from + long(bucket_size * (b-1)); + //if (datacons > date_to) + // return FALSE; + round_date(datacons,TRUE); - FOR_EACH_SHEET_ROW(sf, r, row) - if (!sf.cell_disabled(r, b1)) - { - TMSP_line& line = *_articles.find(*row, TRUE); + TToken_string & row = sf.row(r); + TMSP_line &line = *_articles.find(row, TRUE); + TMSP_constraint *constraint = find_constraint(line); + TMRP_line *mrpline = _mrp_articles.find(constraint->articolo(),constraint->livgiac(), + constraint->codmagdep(),constraint->codmagdep_coll(), constraint->codimp(), constraint->codlin(), constraint->codclifor()); - if ((get(F_DA_MAGAZZ).empty() || line.codmag() >= get(F_DA_MAGAZZ)) && - (get(F_A_MAGAZZ).empty() || line.codmag() <= get(F_A_MAGAZZ)) && - (get(F_DA_IMPIANTO).empty() || line.codimp() >= get(F_DA_IMPIANTO)) && - (get(F_A_IMPIANTO).empty() || line.codimp() <= get(F_A_IMPIANTO))) - { - TDate datadoc = datacons; - datadoc -= cache().get(LF_ANAMAG,line.codice()).get_real(ANAMAG_GIORNIRIOR).integer(); - round_date(datadoc); - const TString8 new_tipodoc(get(F_TIPO_PLAN)); - const TString8 new_codnum(get(F_NUM_PLAN)); - const int new_anno = datadoc.year(); - const long new_numdoc = (number_by_cli ? line.cliente() * 100L : 0L)+ - (number_by_week ? datadoc.week() : 0L); - const int new_numrig = 0; - TString8 codnum; - int anno; - long numdoc; - int numrig; - - real old, val,new_val(row->get(b0 + b*2)); - if (new_val < line.qta_min(b)) - { - if (yesno_box("Impossibile inserire un ordine inferiore a %s per %s. Interrompo ?",(const char *)line.qta_min(b).string(), (const char *)line.codice())) - return FALSE; - } - new_val -= line.qta_min(b); - TRigadoc_ref *rdr=line.first_rigaref(b); - bool found=FALSE; - while (rdr || found==FALSE && new_val!=ZERO) - { - if (rdr==NULL && !found) - { - found=TRUE; - rdr=new TRigadoc_ref(new_codnum,new_anno,new_numdoc,new_numrig,ZERO,ZERO); - line.add_rigaref(b, rdr); - } - old = rdr->qta_residua(); - codnum = rdr->codnum(); - anno = rdr->annodoc(); - numdoc = rdr->numdoc(); - numrig = rdr->numrig(); - //if (rdr->codnum()==new_codnum && rdr->annodoc() == new_anno && rdr->numdoc() == new_numdoc) - if (rdr->codnum()==new_codnum) - { - TToken_string keydoc("D"); - keydoc.add(anno); - keydoc.add(codnum); - keydoc.add(numdoc); - const TRectype & docrec = cache().get(LF_DOC,keydoc); - if (docrec.empty() || - new_tipodoc == docrec.get(DOC_TIPODOC) && !has_confirmed_status(docrec)) - { - val = new_val; - new_val = ZERO; - if (val != old) - { - const real incr = val-old; - TRiga_documento& riga = doc_rows.add_to_row(rdr, incr); - if (riga.get(RDOC_CODART).empty()) - { - riga.put(RDOC_CODART, line.codice()); - riga.put(RDOC_CODARTMAG, line.codice()); - riga.put(RDOC_LIVELLO, line.livgiac()); - riga.put(RDOC_CHECKED, "X"); - riga.put(RDOC_CODMAG, line.codmag()); - riga.put(RDOC_CODMAGC, line.codmag_coll()); - riga.put(RDOC_LINEA, line.codlin()); - riga.put(RDOC_IMPIANTO, line.codimp()); - riga.put(RDOC_UMQTA, row->get(sf.cid2index(F_UM))); - riga.put(RDOC_DATACONS, datacons); - riga.put(RDOC_DESCR, row->get(sf.cid2index(F_DESCART))); - - TRectype& doc = (TRectype&)riga.doc().head(); - if (doc.get(DOC_DATACONS).empty()) - { - doc.put(DOC_DATACONS, datacons); - doc.put(DOC_TIPOCF, "C"); - doc.put(DOC_CODCF, line.cliente()); - } - doc.put(DOC_DATADOC, from); - } - if (val == ZERO) - { - line.remove_rigaref(b); - enable_codes(r); - } - else - { - line.qta(b) -= old; - line.qta(b) += rdr->qta_residua(); - disable_codes(r); - } - sf.force_update(r); - } - } - } else - found = TRUE; - rdr=line.next_rigaref(b); - } // ciclo di aggiornamento dei riferimenti ai docs - } - } - const long recs= doc_rows.flush(datacons); - if (recs > 0L) - some += 1; - else if (recs < 0L) - some = -1; - } - switch (some) - { - case 0: - message_box("Nessun documento generato o modificato \n(numerazione %s, tipo %s)", - (const char *)get(F_NUM_PLAN),(const char *)get(F_TIPO_PLAN)); - break; - case -1: - if (yesno_box("Problemi nella registrazione dei documenti.\n(numerazione %s, tipo %s)\nRipeto l'elaborazione ?")) - elabora(); // necessario per ricaricare i rif alle righe - break; - } - return some; -} -/* -int TPlanning_mask::salva_cell() -{ - TMSP_line& line = *_articles.find(*row, TRUE); - - if ((get(F_DA_MAGAZZ).empty() || line.codmag() >= get(F_DA_MAGAZZ)) && - (get(F_A_MAGAZZ).empty() || line.codmag() <= get(F_A_MAGAZZ)) && + if ((get(F_DA_MAGAZZ).empty() || line.codmagdep() >= get(F_DA_MAGAZZ)) && + (get(F_A_MAGAZZ).empty() || line.codmagdep() <= get(F_A_MAGAZZ)) && (get(F_DA_IMPIANTO).empty() || line.codimp() >= get(F_DA_IMPIANTO)) && (get(F_A_IMPIANTO).empty() || line.codimp() <= get(F_A_IMPIANTO))) { TDate datadoc = datacons; - datadoc -= cache().get(LF_ANAMAG,line.codice()).get_real(ANAMAG_GIORNIRIOR).integer(); + datadoc -= cache().get(LF_ANAMAG,line.articolo()).get_real(ANAMAG_GIORNIRIOR).integer(); round_date(datadoc); const TString8 new_tipodoc(get(F_TIPO_PLAN)); const TString8 new_codnum(get(F_NUM_PLAN)); - const int new_anno = datadoc.year(); - const long new_numdoc = (number_by_cli ? line.cliente() * 100L : 0L)+ - (number_by_week ? datadoc.week() : 0L); + int new_anno = datadoc.year(); + int new_week = datadoc.week(); + if (number_by_week) + get_week_year(datadoc, new_week, new_anno); + const long new_numdoc = (number_by_cli ? line.codclifor() * 100L : 0L)+ + (number_by_week ? new_week : 0L); const int new_numrig = 0; TString8 codnum; int anno; long numdoc; int numrig; - real old, val,new_val(row->get(b0 + b*2)); - if (new_val < line.qta_min(b)) + real old, val,new_val(row.get(b0 + b*2)); + int cazzo = mrpline->last_bucket(); + if (mrpline && mrpline->last_bucket() >= b-1) { - if (yesno_box("Impossibile inserire un ordine inferiore a %s per %s. Interrompo ?",(const char *)line.qta_min(b).string(), (const char *)line.codice())) - return FALSE; - } - new_val -= line.qta_min(b); - TRigadoc_ref *rdr=line.first_rigaref(b); + // ************* + // rescheduling checks + const real & pl = mrpline->planned_orders(b-1); + const real & sr = mrpline->sched_receipts(b-1); + const real & uo = mrpline->unsched_orders(b-1); + const real & ro = mrpline->resched_orders(b-1); + + if (new_val.sign() > 0) // devo pianificare qualcosa... + { + real movable = ro - uo; + if (movable.sign()) // ... ma posso spostare la qta da altrove + { + real moved = fnc_min(new_val, movable); + new_val -= moved; + mrpline->record(b-1).add_unsched_ord(moved); + } + } + } + TMRP_docref *rdr=line.first_rigaref(b); bool found=FALSE; - while (rdr || found==FALSE && new_val!=ZERO) + while (rdr || found==FALSE && new_val.sign() > 0) { if (rdr==NULL && !found) { found=TRUE; - rdr=new TRigadoc_ref(new_codnum,new_anno,new_numdoc,new_numrig,ZERO,ZERO); + rdr=new TMRP_docref(new_anno,new_codnum,new_numdoc,new_numrig,row.get(sf.cid2index(F_UM)),ZERO,ZERO); line.add_rigaref(b, rdr); } old = rdr->qta_residua(); - codnum = rdr->codnum(); + codnum = rdr->codnumdoc(); anno = rdr->annodoc(); numdoc = rdr->numdoc(); numrig = rdr->numrig(); //if (rdr->codnum()==new_codnum && rdr->annodoc() == new_anno && rdr->numdoc() == new_numdoc) - if (rdr->codnum()==new_codnum) + if (rdr->codnumdoc() == new_codnum) { TToken_string keydoc("D"); keydoc.add(anno); @@ -2285,24 +2305,24 @@ int TPlanning_mask::salva_cell() TRiga_documento& riga = doc_rows.add_to_row(rdr, incr); if (riga.get(RDOC_CODART).empty()) { - riga.put(RDOC_CODART, line.codice()); - riga.put(RDOC_CODARTMAG, line.codice()); + riga.put(RDOC_CODART, line.articolo()); + riga.put(RDOC_CODARTMAG, line.articolo()); riga.put(RDOC_LIVELLO, line.livgiac()); riga.put(RDOC_CHECKED, "X"); - riga.put(RDOC_CODMAG, line.codmag()); - riga.put(RDOC_CODMAGC, line.codmag_coll()); + riga.put(RDOC_CODMAG, line.codmagdep()); + riga.put(RDOC_CODMAGC, line.codmagdep_coll()); riga.put(RDOC_LINEA, line.codlin()); riga.put(RDOC_IMPIANTO, line.codimp()); - riga.put(RDOC_UMQTA, row->get(sf.cid2index(F_UM))); + riga.put(RDOC_UMQTA, row.get(sf.cid2index(F_UM))); riga.put(RDOC_DATACONS, datacons); - riga.put(RDOC_DESCR, row->get(sf.cid2index(F_DESCART))); + riga.put(RDOC_DESCR, row.get(sf.cid2index(F_DESCART))); TRectype& doc = (TRectype&)riga.doc().head(); if (doc.get(DOC_DATACONS).empty()) { doc.put(DOC_DATACONS, datacons); doc.put(DOC_TIPOCF, "C"); - doc.put(DOC_CODCF, line.cliente()); + doc.put(DOC_CODCF, line.codclifor()); } doc.put(DOC_DATADOC, from); } @@ -2319,26 +2339,103 @@ int TPlanning_mask::salva_cell() } sf.force_update(r); } - } + } + else + { + //if (new_anno==anno && new_codnum==codnum && new_numdoc==numdoc) + new_val -= old; + } } else found = TRUE; rdr=line.next_rigaref(b); } // ciclo di aggiornamento dei riferimenti ai docs + return TRUE; } + return FALSE; } -*/ -// copia i dati della riga al di fuori delle informazioni dei bucket -void TPlanning_mask::copy_sheet_row(TToken_string & newrow, const TToken_string & row) + +int TPlanning_mask::salva_documenti(TExceptions_array &excepts) { + int some=0; + + TPlan_docs doc_rows(get(F_NUM_PLAN), get(F_TIPO_PLAN), get(F_RIGA_PLAN)); const TSheet_field& sf = sfield(F_ARTICOLI); - const int b0 = sf.cid2index(F_BUCKET0); - TString str; - for (int i = 0; i < b0; i++) + const int b1 = sf.cid2index(F_BUCKET1); + const TDate from(starting_date()); + const bool ordiniXarticolo = get_bool(F_DIVIDEBYART); + const bool ordiniXscadenza = get_bool(F_DIVIDEBYDATE); + + if (ordiniXscadenza && ordiniXarticolo) + if (!noyes_box("E' stato scelto di generare un ordine diverso per ogni articolo e scadenza. Confermi ?")) + return 0; + if (!(ordiniXscadenza || ordiniXarticolo)) + if (!noyes_box("E' stato scelto di generare un unico ordine per ogni articolo e scadenza. Confermi ?")) + return 0; + + TProgind pi(LAST_BUCKET*sf.items(), "Emissione documenti" , FALSE, TRUE); + if (ordiniXscadenza) { - row.get(i, str); - newrow.add(str, i); + // ************************* + // Generazione per scadenza: + for (int b = 1; b < LAST_BUCKET; b++) + { + long recs=0L; + TDate datacons = from + long(days_per_bucket() * (b-1)); + round_date(datacons); + FOR_EACH_SHEET_ROW(sf, r, row) + { + pi.addstatus(1); + if (!sf.cell_disabled(r, b1)) + salva_cella(r, b, doc_rows); + if (ordiniXarticolo) + recs = doc_rows.flush(datacons, row->get(sf.cid2index(F_ARTICOLO))); + } + pi.addstatus(1); + if (!ordiniXarticolo) + recs = doc_rows.flush(datacons, NULL); + if (recs > 0L) + some += 1; + else if (recs < 0L) + some = -1; + } } + else + { + // ************************* + // Generazione per articolo: + FOR_EACH_SHEET_ROW(sf, r, row) + if (!sf.cell_disabled(r, b1)) + { + for (int b = 1; b < LAST_BUCKET; b++) + { + pi.addstatus(1); + salva_cella(r, b, doc_rows); + } + long recs = 0L; + if (ordiniXarticolo) + recs = doc_rows.flush(NULLDATE,row->get(sf.cid2index(F_ARTICOLO))); + if (recs > 0L) + some += 1; + else if (recs < 0L) + some = -1; + } + if (!ordiniXarticolo) + some = int(doc_rows.flush(NULLDATE,"")); + } + switch (some) + { + case 0: + message_box("Nessun documento generato o modificato \n(numerazione %s, tipo %s)", + (const char *)get(F_NUM_PLAN),(const char *)get(F_TIPO_PLAN)); + break; + case -1: + if (!yesno_box("Problemi nella registrazione dei documenti.\n(numerazione %s, tipo %s)\nRipeto l'elaborazione ?", + (const char *)get(F_NUM_PLAN),(const char *)get(F_TIPO_PLAN))); + some = 0; + break; + } + return some; } bool TPlanning_mask::on_savefields_event(TOperable_field& o, TField_event e, long jolly) @@ -2373,17 +2470,20 @@ bool TPlanning_mask::on_field_event(TOperable_field& o, TField_event e, long jol { case F_DADATA: if (e == fe_modify) + { + _start_date = NULLDATE; round_field(o, FALSE); + } break; case F_ADATA: if (e == fe_modify) - round_field(o, TRUE); + round_field(o, TRUE, FALSE); break; case F_BUCKET: if (e == fe_modify) { - round_field(field(F_DADATA), FALSE); - round_field(field(F_ADATA), TRUE); + on_field_event((TOperable_field& )field(F_DADATA), fe_modify, jolly); + on_field_event((TOperable_field& )field(F_ADATA), fe_modify, jolly); } break; case F_YEAR: @@ -2443,17 +2543,23 @@ bool TPlanning_mask::on_field_event(TOperable_field& o, TField_event e, long jol } break; case se_leave: - if (nriga < righe && _curr_art_row != s.row(nriga)) + if (nriga < righe) { - const bool ok=test_art_row(nriga); - if (!ok) - _curr_art_row.cut(0); - return ok; + const TToken_string &art_row= s.row(nriga); + if (_curr_art_row != s.row(nriga)) + { + const bool ok=test_art_row(nriga); + if (!ok) + _curr_art_row.cut(0); + else + _curr_art_row= s.row(nriga); + return ok; + } } break; case se_enter: - if (nriga < righe) - _curr_art_row= s.row(nriga); + //if (nriga < righe) + // _curr_art_row= s.row(nriga); break; default: break; @@ -2481,6 +2587,15 @@ bool TPlanning_mask::on_field_event(TOperable_field& o, TField_event e, long jol if (e==fe_button) sortCRPsheet(); break; + case H_CODIMP: + if (e == fe_modify) + { + const TSheet_field& s = sfield(F_ARTICOLI); + TMask & m=s.sheet_mask(); + if (!m.get(F_CODLIN).blank()) + m.set(F_CODIMP,o.get()); + } + break; case F_BUCKET1: case F_BUCKET2: case F_BUCKET3: @@ -2549,28 +2664,8 @@ bool TPlanning_mask::on_field_event(TOperable_field& o, TField_event e, long jol if (e == fe_button && check_fields()) { remove_propose(); - const bool useextralines=get_bool(F_USENONSTDLIN_MSP); - const bool useextrahours=get_bool(F_USEEXTRAHRS_MSP) ; - set(F_USENONSTDLIN_CRP ,useextralines ? "X" : ""); - set(F_USEEXTRAHRS_CRP ,useextrahours ? "X" : ""); - if (get(F_RECALC_TYPE)=="1") - propose_1stJIT(_first_fit_logic,TRUE,TRUE); - else if (get(F_RECALC_TYPE)=="1_INFH") - propose_1stJIT(_first_fit_logic,TRUE,FALSE); - else if (get(F_RECALC_TYPE)=="1_INF") - propose_1stJIT(_first_fit_logic,FALSE,FALSE); - else if (get(F_RECALC_TYPE)=="JIT") - propose_1stJIT(_JIT_logic,TRUE,TRUE); - else if (get(F_RECALC_TYPE)=="JIT_INFH") - propose_1stJIT(_JIT_logic,TRUE,FALSE); - else if (get(F_RECALC_TYPE)=="JIT_INF") - propose_1stJIT(_JIT_logic,FALSE,FALSE); - else if (get(F_RECALC_TYPE)=="UNIL") - propose_1stJIT(_uniform_logic,TRUE,FALSE); - else if (get(F_RECALC_TYPE)=="UNI") - propose_1stJIT(_uniform_logic,FALSE,FALSE); - // aggiorna lo sheet delle capacita' - on_field_event((TOperable_field&)field(F_LOADTYPE), fe_modify, jolly ); + propose(); + on_field_event((TOperable_field&)field(F_LOADTYPE), fe_modify, 0L); sfield(F_ARTICOLI).set_focus(); } break; @@ -2586,19 +2681,28 @@ bool TPlanning_mask::on_field_event(TOperable_field& o, TField_event e, long jol case F_PRINT: if (e == fe_button) { - if (is_page_crp()) - print_capacities(); - else - print_articles(); + TPrint_mask pm(*this); + while (pm.run() != K_ESC) ; + } + break; + case F_RECALCLINE: + if (e == fe_button) + { + TSheet_field& s = sfield(F_ARTICOLI); + int curr_row=s.selected(); + s.update_row(curr_row); + propose(curr_row); + s.update_mask(curr_row); } break; case F_CHECKLINE: if (e == fe_button) { - const TSheet_field& s = sfield(F_ARTICOLI); + TSheet_field& s = sfield(F_ARTICOLI); TMSPCheck_mask cm(this); cm.disable(-G_MOVIMENTO); int curr_row=s.selected(); + s.update_row(curr_row); const bool is_disabled=s.cell_disabled(curr_row,F_BUCKET1-FIRST_FIELD) ; const bool is_constr=(is_disabled && curr_row>0 && s.cell_disabled(curr_row-1,F_BUCKET1-FIRST_FIELD)); if (is_disabled && !is_constr) @@ -2608,7 +2712,7 @@ bool TPlanning_mask::on_field_event(TOperable_field& o, TField_event e, long jol //cm.gopos_mainmask(); } break; - case F_DETTAGLIO_OUT: + case F_DOCUMENTI_OUT: if (e == fe_button) { TSheet_field& s = sfield(F_ARTICOLI); @@ -2616,15 +2720,20 @@ bool TPlanning_mask::on_field_event(TOperable_field& o, TField_event e, long jol TMSP_line *l = _articles.find(s.row(curr_row)); if (l) { - TLista_ordini m(l,"Pianificazione", get_date(F_DADATA), days_per_bucket()); - if (m.run()!= K_ESC) - m.edit_checked(); - } else { - message_box("Nessun ordine pianificato per questa riga"); + TLista_docref m(l,"Documenti pianificati", starting_date(), days_per_bucket()); + if (m.reset_bucket_field()) + { + if (m.run() != K_ESC) + m.edit_checked(); + } + return TRUE; } + message_box("Nessun ordine pianificato per la riga corrente"); } break; - case F_DETTAGLIO_IN: + case F_DOCUMENTI_IN: + case F_VINCOLI_IN: + case F_VINCOLI_OUT: if (e == fe_button) { TSheet_field& s = sfield(F_ARTICOLI); @@ -2635,12 +2744,42 @@ bool TPlanning_mask::on_field_event(TOperable_field& o, TField_event e, long jol TMSP_constraint *c = _constraints.find(s.row(curr_row)); if (c) { - TLista_ordini m(c,"Vincoli",get_date(F_DADATA), days_per_bucket()); - if (m.run()!= K_ESC) - m.edit_checked(); - } else { - message_box("Nessun vincolo per questa riga"); + switch (o.dlg()) + { + case F_DOCUMENTI_IN: + { + TLista_docref m(c,"Documenti vincolo",starting_date(), days_per_bucket()); + if (m.reset_bucket_field()) + { + if (m.run()!= K_ESC) + m.edit_checked(); + return TRUE; + } + } + break; + case F_VINCOLI_IN: + { + TLista_upperlines m(c,starting_date(), days_per_bucket()); + if (m.reset_bucket_field()) + m.run(); + else + message_box("Nessun vincolo interno sulla riga corrente"); + return TRUE; + } + break; + case F_VINCOLI_OUT: + { + TLista_mastercodes m(c, s.row(s.selected()), starting_date(), days_per_bucket()); + if (m.reset_bucket_field()) + m.run(); + else + message_box("Nessun articolo Master dipendente dalla riga corrente"); + return TRUE; + } + break; + } } + message_box("Nessun vincolo per la riga corrente"); } break; case F_SHOW_WEEK: @@ -2688,8 +2827,7 @@ bool TPlanning_mask::on_field_event(TOperable_field& o, TField_event e, long jol if (on_field_event((TOperable_field&)field(F_TIPO_PLAN), fe_close, jolly )) { TSave_mask save_mask(*this); - while (save_mask.run() != K_ESC) - salva_documenti(); + while (save_mask.run() != K_ESC); } } break; @@ -2728,7 +2866,7 @@ void TPlanning_mask::init() sf.set_append(FALSE); for (short l = 0; l < 4; l++) - livelli_giac().set_sheetcolumn(sf, F_LIV1+l, l+1); + livelli_giacenza().set_sheetcolumn(sf, F_LIV1+l, l+1); TConfig ini(CONFIG_DITTA, "mg"); if (!ini.get_bool("GESDEPOSITI")) @@ -2748,6 +2886,7 @@ void TPlanning_mask::init() sf.sheet_mask().hide(F_CODIMP); sf.sheet_mask().hide(F_DESCIMP); } + _week_complete = ini.get_bool("WEEKCOMPLETE", "mr", -1, TRUE); sfield(F_LINEE).disable(); // sfield(F_TESTE).disable(); @@ -2785,6 +2924,7 @@ TMSPCheck_mask::TMSPCheck_mask(TPlanning_mask * main_mask, const char *m,TSheet_ TMSPCheck_mask::TMSPCheck_mask(TPlanning_mask * main_mask): TAutomask("mr2200b.msk"), _main_mask(main_mask), _sheet(&main_mask->sfield(F_ARTICOLI)) { + livelli_giacenza().set_mask_fields(*this, FC_LIV1); _last_col=_last_row=_constr_row=-1; go_top(); set(FC_MINBUCK2CHECK,0L); @@ -2818,20 +2958,24 @@ int TMSPCheck_mask::fill_mask(const bool show_fields) { _constr_row=find_constr_row(_row); set(FC_RIGA,_row+1); - set(FC_CODCLI,codcli,TRUE); - set(FC_CODART,codart,TRUE); - set(FC_CODIMP,codimp,TRUE); - set(FC_CODLIN,codlin,TRUE); - set(FC_CODMAG,mag.left(3),TRUE); - set(FC_CODDEP,mag.mid(3),TRUE); - //set(FC_CODMAG_C,magc.left(3),TRUE); - //set(FC_CODDEP_C,magc.mid(3),TRUE); + set(FC_CODCLI,codcli, TRUE); + set(FC_CODART,codart, TRUE); + for (int l= livelli_giacenza().last_level(); l >= 1 ; l--) + set(FC_LIV1+l-1, livelli_giacenza().unpack_grpcode(liv,l), TRUE); + set(FC_CODIMP,codimp, TRUE); + set(FC_CODLIN,codlin, TRUE); + set(FC_CODMAG,mag.left(3), TRUE); + set(FC_CODDEP,mag.mid(3), TRUE); + //set(FC_CODMAG_C,magc.left(3), TRUE); + //set(FC_CODDEP_C,magc.mid(3), TRUE); } set(FC_BUCKET,_col); - TDate data_buck(_main_mask->get_date(F_DADATA)); - data_buck += (_col)*_main_mask->days_per_bucket()-1; + TDate data_buck(_main_mask->starting_date()); + data_buck += (_main_mask->days_per_bucket())*(_col); + _main_mask->round_date(data_buck); + data_buck -= 1; set(FC_DATE2,_col==LAST_BUCKET ? "" : data_buck.string()); - data_buck -= _main_mask->days_per_bucket()-1; + _main_mask->round_date(data_buck); set(FC_DATE1,_col==0 ? "" : data_buck.string()); set(FC_IS_VINCOLO,is_constr ? "X" : " "); @@ -2956,7 +3100,7 @@ void TMSPCheck_mask::fix_actual_pos() void TMSPCheck_mask::gopos(int row, int col) { - _row=row; + _row=row >= 0 ? row : 0; _col=col; fill_mask(); fix_actual_pos(); @@ -3196,11 +3340,12 @@ int TCRPCheck_mask::fill_mask(const bool show_fields) set(FC_CODART,codart); } set(FC_BUCKET,_col); - TDate data_buck(_main_mask->get_date(F_DADATA)); - data_buck += (_col)*_main_mask->days_per_bucket()-1; - set(FC_DATE2,data_buck.string()); - data_buck -= _main_mask->days_per_bucket()-1; + TDate data_buck(_main_mask->starting_date()); + data_buck += (_main_mask->days_per_bucket())*(_col-1); + _main_mask->round_date(data_buck); set(FC_DATE1,data_buck.string()); + _main_mask->round_date(data_buck,TRUE); + set(FC_DATE2,data_buck.string()); set(FC_IS_VINCOLO,is_constr ? "X" : " "); field(FC_IS_VINCOLO).on_hit(); diff --git a/mr/mr2200.h b/mr/mr2200.h index 32c8e4a06..61a9330a5 100755 --- a/mr/mr2200.h +++ b/mr/mr2200.h @@ -1,3 +1,6 @@ +#ifndef __MR2200_H +#define __MR2200_H + #include #include "mrplib.h" #include "../mg/mglib.h" @@ -10,12 +13,17 @@ const real MAXCAPACITY("999999999.99"); const int NO_PROPOSE=1000 ; -enum TMSP_mode {_actual_plan, _released_schedule, _stock_break}; +enum TMSP_mode {_actual_plan, _rescheduling, _stock_break}; enum TMSP_logic {_first_fit_logic, _JIT_logic, _uniform_logic}; - +class TSave_mask; +class TPrint_mask; class TPlanning_mask : public TCalendar_mask { +friend TSave_mask; +friend TPrint_mask; +static bool _week_complete; + TDate _start_date; // quantità provenienti dai documenti "ordine": TMSP_constraints _constraints; @@ -37,24 +45,20 @@ protected: bool on_field_event(TOperable_field& o, TField_event e, long jolly); - bool load_MRP_lines(TMSP_mode mode, int level=0); + bool load_MRP_lines(TMSP_mode mode, int level=0, int row=-1); bool gross2net(TMSP_mode mode, bool lotsizing=FALSE); void add_MRP_bucket(TMRP_line& new_article, int nbucket, const real &curr_arts); // proposta automatica del sistema bool general_review(bool check_machine, bool check_human, bool useextralines, bool useextrahours,bool lotsizing, bool no_outcapacity, int anticipomin,int anticipomax, TMSP_mode mode, TMSP_logic logic, const char *msg ); int insert_propose(bool verbose=FALSE) ; bool remove_propose(bool verbose=FALSE) ; - void add_or_sub_propose(char sign); + void add_or_sub_propose(char sign, bool scheduled=FALSE); - void propose_1stJIT(TMSP_logic logic, bool check_m, bool check_h); + void propose(int row = -1); + void propose_1stJIT(TMSP_logic logic, bool check_m, bool check_h, int row); // controlli - void print_articles(); - void print_capacities(); - bool sortMSPsheet(); - bool sortCRPsheet(); void check_articles(); void check_capacities(); - void pack_article_sheet(); // capacity review bool capacity_review(bool useextralines, bool useextrahours); TCRP_line *compute_capacity(TLinea_prod &lineaprod, bool useextralines, bool useextrahours); @@ -65,8 +69,9 @@ protected: bool test_art_row(int r, bool signal=TRUE); bool test_load_row(int r, bool signal=TRUE); int init_bucket0(TArticolo_giacenza &art, int r); + bool pack_article_sheet(int r, int first, int last); - bool do_test_art_row(int r, int c, bool signal); + bool do_test_art_row(int r, int first, int last, bool signal); void do_test_art_2ndlevel(TMSP_line2 *mspline, bool erase=FALSE); void copy_sheet_row(TToken_string & newrow, const TToken_string & row); @@ -77,8 +82,12 @@ protected: void enable_codes(int r, bool on = TRUE); void disable_codes(int r) {enable_codes(r,FALSE);} + int salva_cella(int r, int b, TPlan_docs &doc_rows); + // costruttore per la derivazione TPlanning_mask(const char * name); +public: + static void get_week_year(const TDate &d, int &week, int &year); public: bool on_savefields_event(TOperable_field& o, TField_event e, long jolly); @@ -95,10 +104,13 @@ public: {return _articles.find(cli, art, liv, imp, lin, mag, magc, Force);} + const TDate & starting_date() const; int days_per_bucket() const; + bool bucket_mese() const; - int round_date(TDate& date, bool up = FALSE) const; - void round_field(TMask_field& fld, bool up) const; + int bucket(const TDate& date) const; + int round_date(TDate& date, bool up = FALSE, bool wrkday = TRUE) const; + void round_field(TMask_field& fld, bool up = FALSE, bool wrkday = TRUE) const; int test_codnum(const TCodice_numerazione& num) const; bool test_tipodoc_num( const TSheet_field &sheet_num , const TSheet_field &sheet_type) ; @@ -109,7 +121,16 @@ public: bool elabora(); bool carica_documenti(); - int salva_documenti(); + int salva_documenti(TExceptions_array &e); + bool find_exceptions(bool anticipi, bool posticipi, bool extra, TExceptions_array &e, bool verbose=FALSE); + // STAMPE E VIDEO + void print_articles(); + void print_capacities(); + void print_exceptions(TExceptions_array &excepts); + + static void print_except_header(TPrinter& pr); + bool sortMSPsheet(); + bool sortCRPsheet(); void init(); TPlanning_mask(); @@ -131,3 +152,4 @@ public: }; +#endif // __MR2200_H \ No newline at end of file diff --git a/mr/mr2200a.frm b/mr/mr2200a.frm index 1af443221..9e1bc9eac 100755 --- a/mr/mr2200a.frm +++ b/mr/mr2200a.frm @@ -195,6 +195,24 @@ END PROMPT 19 1 "" FIELD QTA9 END + NUMERO 13 14 + BEGIN + SPECIAL STRINGA INTESTAZIONE "" "" + SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" + SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" + KEY "Bucket 10" + PROMPT 20 1 "" + FIELD QTA10 + END + NUMERO 14 14 + BEGIN + SPECIAL STRINGA INTESTAZIONE "" "" + SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" + SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" + KEY "Bucket 11" + PROMPT 21 1 "" + FIELD QTA11 + END END diff --git a/mr/mr2200a.h b/mr/mr2200a.h index bac0788b1..676bbdfd2 100755 --- a/mr/mr2200a.h +++ b/mr/mr2200a.h @@ -20,7 +20,7 @@ #define F_TIPI_ORC 202 #define F_NUM_PLA 203 #define F_TIPI_PLA 204 -//#define ????? 205 +//#define #define F_DADATA 206 #define F_ADATA 207 #define F_NOCLI_OUT 208 @@ -32,7 +32,8 @@ #define F_NUM_PLAN 210 #define F_TIPO_PLAN 211 #define F_RIGA_PLAN 212 -//#define F_?? 214 +#define F_RESCHEDULING 213 +#define F_RESCHED_ALERT 214 #define F_SHOW_WEEK 215 #define F_NOCLI_IN 216 @@ -107,6 +108,12 @@ #define F_DAYXBUCK 352 #define F_LASTWRKDAY 353 #define H_BUCKET 354 +// print fields +#define S_PRINTTYPE 601 +#define S_INTERLINEA 602 +#define S_DELAY_EXCEPT 603 +#define S_HURRYUP_EXCEPT 604 +#define S_EXTRA_EXCEPT 605 // non profiled fields : number freely #define F_ARTICOLI 401 @@ -114,6 +121,7 @@ #define F_RECALC_MSP 450 #define F_CANCEL_MSP 451 #define F_RECALC_CRP 452 +#define F_CLIFOR_DES 453 #define F_CHECK 453 #define F_PRINT 454 @@ -141,11 +149,11 @@ #define F_TIPOCF_SHEET 101 #define F_CLIENTE 102 #define F_ARTICOLO 103 -#define F_PRIORITA 104 -#define F_LIV1 105 -#define F_LIV2 106 -#define F_LIV3 107 -#define F_LIV4 108 +#define F_LIV1 104 +#define F_LIV2 105 +#define F_LIV3 106 +#define F_LIV4 107 +#define F_PRIORITA 108 #define F_DESCART 109 #define F_CODIMP 110 #define F_CODLIN 111 @@ -192,8 +200,11 @@ #define F_DESCLIN 153 #define F_DESCMAG 154 #define F_DESCMAGCOLL 155 -#define F_DETTAGLIO_IN 160 -#define F_DETTAGLIO_OUT 161 +#define F_DOCUMENTI_IN 160 +#define F_DOCUMENTI_OUT 161 +#define F_VINCOLI_IN 162 +#define F_VINCOLI_OUT 163 +#define F_RECALCLINE 170 // sheet linee #define F_CODIMPCRP 101 diff --git a/mr/mr2200a.uml b/mr/mr2200a.uml index 8d0fdb8c9..64ede3f36 100755 --- a/mr/mr2200a.uml +++ b/mr/mr2200a.uml @@ -3,7 +3,7 @@ TOOLBAR "" 0 19 -1 -1 -STRING DLG_PROFILE 50 +STRING DLG_PROFILE 70 50 BEGIN PROMPT 9 -3 "Profilo " PSELECT @@ -73,14 +73,13 @@ END DATE F_DADATA BEGIN - PROMPT 2 5 "Dalla data " - CHECKTYPE REQUIRED + PROMPT 2 4 "Dalla data " GROUP G_PREPROCESS END DATE F_ADATA BEGIN - PROMPT 45 5 "Alla data " + PROMPT 37 4 "Alla data " CHECKTYPE REQUIRED VALIDATE DATE_CMP_FUNC > F_DADATA WARNING "La data finale deve essere maggiore di quella iniziale" @@ -89,14 +88,14 @@ END LIST F_BUCKETS 1 15 BEGIN - PROMPT 2 7 "Intervalli di " + PROMPT 2 6 "Intervallo " ITEM "1|1 Settimana" MESSAGE SHOW,G_BUCKET_WEEK@|HIDE,G_BUCKET_DEF@|COPY,F_BUCKET|"7",F_DAYXBUCK ITEM "2|2 Settimane" MESSAGE SHOW,G_BUCKET_WEEK@|HIDE,G_BUCKET_DEF@|COPY,F_BUCKET|"7",F_DAYXBUCK ITEM "4|1 Mese" MESSAGE SHOW,G_BUCKET_WEEK@|HIDE,G_BUCKET_DEF@|COPY,F_BUCKET|"7",F_DAYXBUCK - ITEM "8|2 Mese" + ITEM "8|2 Mesi" MESSAGE SHOW,G_BUCKET_WEEK@|HIDE,G_BUCKET_DEF@|COPY,F_BUCKET|"7",F_DAYXBUCK ITEM "13|3 Mesi" MESSAGE SHOW,G_BUCKET_WEEK@|HIDE,G_BUCKET_DEF@|COPY,F_BUCKET|"7",F_DAYXBUCK @@ -106,22 +105,24 @@ BEGIN MESSAGE SHOW,G_BUCKET_WEEK@|HIDE,G_BUCKET_DEF@|COPY,F_BUCKET|"7",F_DAYXBUCK ITEM "52|1 Anno" MESSAGE SHOW,G_BUCKET_WEEK@|HIDE,G_BUCKET_DEF@|COPY,F_BUCKET|"7",F_DAYXBUCK - ITEM " | " + ITEM " |Personalizzato " MESSAGE SHOW,G_BUCKET_WEEK@|SHOW,G_BUCKET_DEF@|"7",F_DAYXBUCK - ITEM "0|1 Giorno" + ITEM "G|1 Giorno" MESSAGE HIDE,G_BUCKET_WEEK@|HIDE,G_BUCKET_DEF@|"1",F_BUCKET|"1",F_DAYXBUCK + ITEM "M|Mese solare" + MESSAGE HIDE,G_BUCKET_WEEK@|HIDE,G_BUCKET_DEF@|"31",F_BUCKET|"1",F_DAYXBUCK GROUP G_PREPROCESS END NUMBER H_BUCKET 2 BEGIN - PROMPT 35 7 "= " + PROMPT 41 6 "= " FLAGS "D" GROUP G_BUCKET_WEEK END NUMBER F_BUCKET 2 BEGIN - PROMPT 35 7 "= " + PROMPT 41 6 "= " FLAGS "GU" CHECKTYPE REQUIRED MESSAGE COPY,H_BUCKET @@ -129,24 +130,26 @@ BEGIN END LIST F_DAYXBUCK 1 9 BEGIN - PROMPT 42 7 "" + PROMPT 48 6 "" ITEM "1|giorni" ITEM "7|settimane" FLAGS "D" - GROUP G_BUCKET_WEEK + GROUP G_BUCKET_WEEK END - - -LIST F_LASTWRKDAY 1 9 +BOOL F_RESCHEDULING BEGIN - PROMPT 56 7 "Ordini al " - ITEM "2|Venerdi" - ITEM "1|Sabato" - ITEM "0|Domenica" - GROUP G_BUCKET_WEEK G_PREPROCESS + PROMPT 2 9 "Permetti rescheduling" + GROUP G_PREPROCESS + MESSAGE TRUE SHOW,F_RESCHED_ALERT + MESSAGE FALSE HIDE,F_RESCHED_ALERT +END +LIST F_RESCHED_ALERT 16 +BEGIN + PROMPT 30 9 "Segnalazioni " + ITEMS "1|in interattivo" + ITEMS "0|solo in stampa" + GROUP G_PREPROCESS END - - TEXT DLG_NULL BEGIN @@ -219,7 +222,7 @@ PAGE "Elabora" -1 -1 80 19 BOOL F_MSCHEDULEPLAN BEGIN - PROMPT 1 1 "Crea il Master Schedule Plan" + PROMPT 0 0 "Crea il Master Schedule Plan" MESSAGE TRUE SHOW,G_MASTERSCHEDULE@|HIDE,G_NOMASTERSCHEDULE@|"C",F_TIPOCF|DISABLE,F_TIPOCF MESSAGE FALSE SHOW,G_NOMASTERSCHEDULE@|HIDE,G_MASTERSCHEDULE@|ENABLE,F_TIPOCF FLAGS "HG" @@ -239,21 +242,30 @@ BEGIN GROUP G_PREPROCESS G_MASTERSCHEDULE END +LIST F_LASTWRKDAY 1 9 +BEGIN + PROMPT 2 2 "Ordini al " + ITEM "2|Venerdi" + ITEM "1|Sabato" + ITEM "0|Domenica" + GROUP G_PREPROCESS +END + TEXT DLG_NULL BEGIN - PROMPT 2 2 "@bOrdini da clienti" + PROMPT 2 3 "@bOrdini da clienti" GROUP G_MASTERSCHEDULE END TEXT DLG_NULL BEGIN - PROMPT 2 2 "@bVincoli da soddisfare" + PROMPT 2 3 "@bVincoli da soddisfare" GROUP G_NOMASTERSCHEDULE END LIST F_TIPOCF 9 BEGIN - PROMPT 28 2 "di tipo " + PROMPT 28 3 "di tipo " ITEM "C|cliente" MESSAGE SHOW,G_SCRITTE_CLI@|HIDE,G_SCRITTE_FOR@ ITEM "F|fornitore" @@ -263,14 +275,14 @@ END SPREADSHEET F_NUM_ORC 18 5 BEGIN - PROMPT 1 3 "" + PROMPT 1 4 "" ITEM "Numerazione" GROUP G_PREPROCESS END SPREADSHEET F_TIPI_ORC 56 5 BEGIN - PROMPT 20 3 "" + PROMPT 20 4 "" ITEM "Tipo@4" ITEM "Descrizione@30" ITEM "Da stato" @@ -280,25 +292,25 @@ END TEXT DLG_NULL BEGIN - PROMPT 2 9 "@bOrdini di produzione" + PROMPT 2 10 "@bOrdini di produzione" GROUP G_MASTERSCHEDULE END TEXT DLG_NULL BEGIN - PROMPT 2 9 "@bOrdini da pianificare" + PROMPT 2 10 "@bOrdini da pianificare" GROUP G_NOMASTERSCHEDULE END SPREADSHEET F_NUM_PLA 18 5 BEGIN - PROMPT 1 10 "" + PROMPT 1 11 "" ITEM "Numerazione" GROUP G_PREPROCESS END SPREADSHEET F_TIPI_PLA 56 5 BEGIN - PROMPT 20 10 "" + PROMPT 20 11 "" ITEM "Tipo@4" ITEM "Descrizione@30" ITEM "Da stato" @@ -310,7 +322,7 @@ END LIST F_TIPOCV 10 BEGIN GROUP G_PREPROCESS - PROMPT 2 18 "Preleva i prezzi da " + PROMPT 2 17 "Preleva i prezzi da " ITEM "|Anagrafica" MESSAGE HIDE,F_CODCONDV|HIDE,F_CATVEN_CV|CHECK,F_CODCONDV ITEM "L|Listino" @@ -324,7 +336,7 @@ END STRING F_CODCONDV 3 BEGIN - PROMPT 36 18 "" + PROMPT 36 17 "" USE LF_CONDV INPUT TIPO F_TIPOCV INPUT CATVEN F_CATVEN_CV @@ -334,7 +346,7 @@ BEGIN DISPLAY "" TIPO DISPLAY "Cat.ven." CATVEN DISPLAY "" TIPOCF - DISPLAY "Cli/for@10" CODCF + DISPLAY "Cli/For@10" CODCF DISPLAY "Codice" COD DISPLAY "Descrizione@30" DESCR @@ -345,7 +357,7 @@ END STRING F_CATVEN_CV 2 BEGIN - PROMPT 43 18 "Categoria di vendita " + PROMPT 43 17 "Categoria di vendita " USE CVE INPUT CODTAB F_CATVEN_CV DISPLAY "Codice" CODTAB @@ -489,6 +501,7 @@ BOOLEAN F_NUMBERBYWEEK BEGIN PROMPT 2 12 "Numera gli ordini per settimana" GROUP G_PREPROCESS + MESSAGE TRUE "X",F_DIVIDEBYDATE END BOOLEAN F_NUMBERBYCLI @@ -571,7 +584,7 @@ END STRING F_DA_IMPIANTO 5 BEGIN FLAGS "U" - PROMPT 2 15 "Da impianto " + PROMPT 2 15 "Da impianto " USE IMP INPUT CODTAB F_DA_IMPIANTO DISPLAY "Codice" CODTAB @@ -730,6 +743,7 @@ END BOOL F_SHOW_WEEK BEGIN PROMPT 42 5 "Mostra settimana" + GROUP G_BUCKET_WEEK END BOOL F_SHOWPRICES @@ -754,14 +768,14 @@ SPREADSHEET F_ARTICOLI BEGIN PROMPT 0 6 "" ITEM " @F3" - ITEM "Cliente@F6" + ITEM "CliFor@F6" ITEM "Articolo@F20" + ITEM "Liv.1@F10" + ITEM "Liv.2@F10" + ITEM "Liv.3@F10" + ITEM "Liv.4@F10" ITEM "Priorita'" - ITEM "Liv.1@10" - ITEM "Liv.2@10" - ITEM "Liv.3@10" - ITEM "Liv.4@10" - ITEM "Descrizione@50" + ITEM "Descrizione@40" ITEM "Impianto" ITEM "Linea" ITEM "Mag@3" @@ -1191,12 +1205,20 @@ ENDMASK PAGE "Articoli" -1 -1 80 19 -LIST F_TIPOCF_SHEET 9 +LIST F_TIPOCF_SHEET 1 BEGIN PROMPT 1 0 "" FLAGS "DG" - ITEM "C|Cliente " - ITEM "F|Fornitore" + ITEM "C|C" + MESSAGE "Cliente",F_CLIFOR_DES + ITEM "F|F" + MESSAGE "Fornitore",F_CLIFOR_DES +END + +STRING F_CLIFOR_DES 9 +BEGIN + PROMPT 5 0 "" + FLAGS "D" END NUMBER F_CLIENTE 6 @@ -1216,7 +1238,7 @@ END STRING F_DESCCLI 50 42 BEGIN - PROMPT 26 0 "" + PROMPT 24 0 "" FLAGS "D" END @@ -1228,11 +1250,11 @@ END NUMBER F_PRIORITA 4 BEGIN - PROMPT 55 1 "Priorita' " + PROMPT 52 1 "Priorita' " FLAGS "U" END -STRING F_DESCART 50 +STRING F_DESCART 70 50 BEGIN PROMPT 1 2 "Descrizione " FLAGS "DG" @@ -1240,7 +1262,7 @@ END STRING F_LIV1 10 BEGIN - PROMPT 1 3 "Giacenza " + PROMPT 1 3 "Giacenza " FLAGS "UD" USE GCG INPUT CODTAB[1,1] "1" @@ -1255,7 +1277,7 @@ END STRING F_LIV2 10 BEGIN - PROMPT 27 3 "Giacenza " + PROMPT 28 3 "Giacenza " FLAGS "UD" USE GCG INPUT CODTAB[1,1] "2" @@ -1285,7 +1307,7 @@ END STRING F_LIV4 10 BEGIN - PROMPT 27 4 "Giacenza " + PROMPT 28 4 "Giacenza " FLAGS "UD" USE GCG INPUT CODTAB[1,1] "4" @@ -1300,15 +1322,12 @@ STRING H_CODIMP 5 BEGIN PROMPT 1 5 "Impianto " FLAGS "UHG" - MESSAGE EMPTY COPY,H_CODIMP - MESSAGE COPY,F_CODIMP|CHECK,F_CODIMP END - STRING F_CODIMP 5 BEGIN PROMPT 1 5 "Impianto " - FLAGS "U" + FLAGS "UG" USE IMP INPUT CODTAB F_CODIMP DISPLAY "Codice" CODTAB @@ -1317,6 +1336,7 @@ BEGIN OUTPUT F_DESCIMP S0 CHECKTYPE NORMAL ADD NONE + MESSAGE CHECK,F_CODLIN END STRING F_DESCIMP 50 37 @@ -1335,7 +1355,7 @@ END STRING F_CODLIN 5 BEGIN PROMPT 1 6 "Linea " - FLAGS "U" + FLAGS "UG" USE LNP INPUT CODTAB F_CODLIN DISPLAY "Codice" CODTAB @@ -1345,6 +1365,7 @@ BEGIN OUTPUT H_CODIMP S6 CHECKTYPE NORMAL ADD NONE + MESSAGE EMPTY CLEAR,H_CODIMP END STRING F_DESCLIN 50 37 @@ -1388,12 +1409,6 @@ STRING F_DESCMAG 50 37 BEGIN PROMPT 25 7 "" FLAGS "D" - USE MAG KEY 2 - INPUT S0 F_DESCMAG - DISPLAY "Descrizione@50" S0 - DISPLAY "Magazzino" CODTAB[1,3] - DISPLAY "Deposito" CODTAB[4,5] - COPY OUTPUT F_MAGAZZINO CHECKTYPE NORMAL END @@ -1425,12 +1440,6 @@ STRING F_DESCMAGCOLL 50 37 BEGIN PROMPT 25 8 "" FLAGS "D" - USE MAG KEY 2 - INPUT S0 F_DESCMAG - DISPLAY "Descrizione@50" S0 - DISPLAY "Magazzino" CODTAB[1,3] - DISPLAY "Deposito" CODTAB[4,5] - COPY OUTPUT F_MAGAZZINO CHECKTYPE NORMAL END @@ -1661,34 +1670,52 @@ BEGIN FLAGS "H" END*/ +BUTTON F_RECALCLINE 8 2 +BEGIN + PROMPT 68 0 "" + PICTURE BMP_RECALC +END + BUTTON DLG_OK 10 2 BEGIN - PROMPT -15 -1 "" + PROMPT 3 -1 "" END -BUTTON F_DETTAGLIO_IN 10 2 +BUTTON F_DOCUMENTI_IN 3 2 BEGIN - PROMPT -25 -1 "Dett. IN" + PROMPT 18 -1 "Dett. IN" PICTURE USER_BMP_ORDINI_INPUT END +BUTTON F_VINCOLI_IN 6 2 +BEGIN + PROMPT 22 -1 "Dett. IN" + PICTURE USER_BMP_VINCOLI_INPUT +END + BUTTON F_CHECKLINE 10 2 BEGIN - PROMPT -35 -1 "" + PROMPT 33 -1 "" PICTURE USER_BMP_CHECK PICTURE BMP_LENTE END -BUTTON F_DETTAGLIO_OUT 10 2 +BUTTON F_DOCUMENTI_OUT 3 2 BEGIN - PROMPT -45 -1 "Dett. OUT" + PROMPT 48 -1 "Dett. OUT" PICTURE USER_BMP_ORDINI_OUTPUT END +BUTTON F_VINCOLI_OUT 6 2 +BEGIN + PROMPT 52 -1 "Dett. OUT" + PICTURE USER_BMP_VINCOLI_OUTPUT +END + BUTTON DLG_CANCEL 10 2 BEGIN - PROMPT -55 -1 "" + PROMPT 64 -1 "" END ENDPAGE diff --git a/mr/mr2200b.uml b/mr/mr2200b.uml index 354d737d7..d9776f8e6 100755 --- a/mr/mr2200b.uml +++ b/mr/mr2200b.uml @@ -1,6 +1,6 @@ #include "mr2200b.h" #include "mr2url.h" -PAGE "Controllo planning" -1 -1 76 20 +PAGE "Controllo planning" -1 -1 76 22 NUMBER FC_RIGA 4 @@ -49,6 +49,66 @@ BEGIN PROMPT 34 2 "" END + +STRING FC_LIV1 10 +BEGIN + PROMPT 1 3 "Giacenza " + FLAGS "UH" + USE GCG + INPUT CODTAB[1,1] "1" + INPUT CODTAB[2,11] FC_LIV1 + DISPLAY "Gruppo@20" CODTAB[2,20] + DISPLAY "Descr.@30" S0 + OUTPUT FC_LIV1 CODTAB[2,12] + CHECKTYPE NORMAL + MESSAGE EMPTY CLEAR,FC_LIV2|CHECK,FC_LIV2 + MESSAGE ENABLE,FC_LIV2 +END + +STRING FC_LIV2 10 +BEGIN + PROMPT 26 3 "" + FLAGS "UH" + USE GCG + INPUT CODTAB[1,1] "2" + INPUT CODTAB[2,11] FC_LIV2 + DISPLAY "Gruppo@20" CODTAB[2,20] + DISPLAY "Descr.@30" S0 + OUTPUT FC_LIV2 CODTAB[2,12] + CHECKTYPE NORMAL + MESSAGE EMPTY CLEAR,FC_LIV3|CHECK,FC_LIV3 + MESSAGE ENABLE,FC_LIV3 +END + +STRING FC_LIV3 10 +BEGIN + PROMPT 41 3 "" + FLAGS "UH" + USE GCG + INPUT CODTAB[1,1] "3" + INPUT CODTAB[2,11] FC_LIV3 + DISPLAY "Gruppo@20" CODTAB[2,20] + DISPLAY "Descr.@30" S0 + OUTPUT FC_LIV3 CODTAB[2,12] + CHECKTYPE NORMAL + MESSAGE EMPTY CLEAR,FC_LIV4|CHECK,FC_LIV4 + MESSAGE ENABLE,FC_LIV4 +END + +STRING FC_LIV4 10 +BEGIN + PROMPT 56 3 "" + FLAGS "UH" + USE GCG + INPUT CODTAB[1,1] "4" + INPUT CODTAB[2,11] FC_LIV4 + DISPLAY "Gruppo@20" CODTAB[2,20] + DISPLAY "Descr.@30" S0 + OUTPUT FC_LIV4 CODTAB[2,12] + CHECKTYPE NORMAL +END + + STRING FC_CODIMP 5 BEGIN FLAGS "DG" @@ -187,17 +247,17 @@ END GROUPBOX DLG_NULL 80 10 BEGIN - PROMPT 0 11 "" + PROMPT 0 13 "" END TEXT DLG_NULL BEGIN - PROMPT 9 12 "@bMovimento" + PROMPT 9 14 "@bMovimento" END LIST FC_MOVEFILTER 20 BEGIN - PROMPT 2 13 "" + PROMPT 2 15 "" ITEM "|Articoli e vincoli" ITEM "A|Solo linee articolo" ITEM "C|Solo linee vincolo" @@ -205,12 +265,12 @@ END TEXT DLG_NULL BEGIN - PROMPT 39 12 "@bRicerca" + PROMPT 39 14 "@bRicerca" END LIST FC_FINDFILTER 28 BEGIN - PROMPT 30 13 "" + PROMPT 30 15 "" ITEM "8|Sotto scorta" MESSAGE HIDE,FC_ARTICLE2FIND|SHOW,G_BUCKETRANGE@ ITEM "12|Anomalie" @@ -237,19 +297,19 @@ END NUMBER FC_MINBUCK2CHECK 2 BEGIN - PROMPT 30 14 "Dal bucket " + PROMPT 30 16 "Dal bucket " GROUP G_BUCKETRANGE END NUMBER FC_MAXBUCK2CHECK 2 BEGIN - PROMPT 45 14 "al bucket " + PROMPT 45 16 "al bucket " GROUP G_BUCKETRANGE END STRING FC_ARTICLE2FIND 20 BEGIN - PROMPT 30 15 "Codice " + PROMPT 30 17 "Codice " FLAGS "U" USE LF_ANAMAG INPUT CODART FC_ARTICLE2FIND @@ -261,87 +321,87 @@ END BUTTON FC_RIGHT_BAD 4 2 BEGIN - PROMPT 46 17 "" + PROMPT 46 19 "" PICTURE USER_BMP_ARROWRIGHT_RED GROUP G_MOVIMENTO END BUTTON FC_DOWN_BAD 4 2 BEGIN - PROMPT 40 18 "" + PROMPT 40 20 "" PICTURE USER_BMP_ARROWDOWN_RED GROUP G_MOVIMENTO END BUTTON FC_LEFT_BAD 4 2 BEGIN - PROMPT 34 17 "" + PROMPT 34 19 "" PICTURE USER_BMP_ARROWLEFT_RED GROUP G_MOVIMENTO END BUTTON FC_UP_BAD 4 2 BEGIN - PROMPT 40 16 "" + PROMPT 40 18 "" PICTURE USER_BMP_ARROWUP_RED GROUP G_MOVIMENTO END BUTTON FC_UPLEFT 4 2 BEGIN - PROMPT 4 14 "<" + PROMPT 4 16 "<" PICTURE USER_BMP_ARROWUPLEFT GROUP G_MOVIMENTO END BUTTON FC_UP 4 2 BEGIN - PROMPT 10 14 "Su'" + PROMPT 10 16 "Su'" PICTURE USER_BMP_ARROWUP GROUP G_MOVIMENTO END BUTTON FC_UPRIGHT 4 2 BEGIN - PROMPT 16 14 ">" + PROMPT 16 16 ">" PICTURE USER_BMP_ARROWUPRIGHT GROUP G_MOVIMENTO END BUTTON FC_RIGHT 4 2 BEGIN - PROMPT 16 16 ">" + PROMPT 16 18 ">" PICTURE USER_BMP_ARROWRIGHT END BUTTON FC_DOWNRIGHT 4 2 BEGIN - PROMPT 16 18 ">" + PROMPT 16 20 ">" PICTURE USER_BMP_ARROWDOWNRIGHT GROUP G_MOVIMENTO END BUTTON FC_DOWN 4 2 BEGIN - PROMPT 10 18 "Giu'" + PROMPT 10 20 "Giu'" PICTURE USER_BMP_ARROWDOWN GROUP G_MOVIMENTO END BUTTON FC_DOWNLEFT 4 2 BEGIN - PROMPT 4 18 "<" + PROMPT 4 20 "<" PICTURE USER_BMP_ARROWDOWNLEFT GROUP G_MOVIMENTO END BUTTON FC_LEFT 4 2 BEGIN - PROMPT 4 16 "<" + PROMPT 4 18 "<" PICTURE USER_BMP_ARROWLEFT END -BUTTON DLG_QUIT 10 2 +BUTTON DLG_CANCEL 10 2 BEGIN - PROMPT 60 18 "" + PROMPT 60 20 "" END diff --git a/mr/mr2200e.uml b/mr/mr2200e.uml index 607ef6aac..9dc4724a0 100755 --- a/mr/mr2200e.uml +++ b/mr/mr2200e.uml @@ -2,27 +2,48 @@ PAGE "Opzioni di salvataggio" -1 -1 66 16 +TEXT DLG_NULL +BEGIN + PROMPT 2 1 "Numera gli ordini per:" + FLAGS "D" +END + BOOLEAN F_NUMBERBYCLI BEGIN - PROMPT 2 1 "Numera gli ordini per cliente" + PROMPT 36 1 "cliente" FLAGS "D" + DEFAULT NONE END BOOLEAN F_NUMBERBYWEEK BEGIN - PROMPT 2 2 "Numera gli ordini per settimana" + PROMPT 50 1 "settimana" FLAGS "D" -END - - -TEXT DLG_NULL -BEGIN - PROMPT 2 4 "Numerazione " + DEFAULT NONE END TEXT DLG_NULL BEGIN - PROMPT 14 4 "da generare " + PROMPT 2 2 "Suddividi gli ordini per:" +END + +BOOLEAN F_DIVIDEBYART +BEGIN + PROMPT 36 2 "articolo" + FLAGS "D" + DEFAULT NONE +END + +BOOLEAN F_DIVIDEBYDATE +BEGIN + PROMPT 50 2 "scadenza" + FLAGS "D" + DEFAULT NONE +END + +TEXT DLG_NULL +BEGIN + PROMPT 2 4 "Numerazione da generare " END STRING F_NUM_PLAN 4 @@ -36,6 +57,7 @@ BEGIN OUTPUT F_NUM_PLAN CODTAB CHECKTYPE REQUIRED ADD NONE + DEFAULT NONE END STRING F_TIPO_PLAN 4 @@ -49,6 +71,7 @@ BEGIN OUTPUT F_TIPO_PLAN CODTAB CHECKTYPE REQUIRED ADD NONE + DEFAULT NONE END STRING F_RIGA_PLAN 4 @@ -63,6 +86,7 @@ BEGIN CHECKTYPE REQUIRED // GROUP G_PREPROCESS ADD NONE + DEFAULT NONE END STRING F_DA_IMPIANTO 5 @@ -75,7 +99,9 @@ BEGIN DISPLAY "Descrizione@50" S0 OUTPUT F_DA_IMPIANTO CODTAB CHECKTYPE NORMAL + DEFAULT NONE END + STRING F_A_IMPIANTO 5 BEGIN FLAGS "U" @@ -86,6 +112,7 @@ BEGIN DISPLAY "Descrizione@50" S0 OUTPUT F_A_IMPIANTO CODTAB CHECKTYPE NORMAL + DEFAULT NONE END STRING F_DA_LINEA 5 @@ -98,17 +125,20 @@ BEGIN DISPLAY "Descrizione@50" S0 OUTPUT F_DA_LINEA CODTAB CHECKTYPE NORMAL + DEFAULT NONE END + STRING F_A_LINEA 5 BEGIN FLAGS "UD" - PROMPT 30 7 " alla linea " + PROMPT 30 7 " alla linea " COPY USE F_DA_LINEA INPUT CODTAB F_A_LINEA DISPLAY "Codice" CODTAB DISPLAY "Descrizione@50" S0 OUTPUT F_A_LINEA CODTAB CHECKTYPE NORMAL + DEFAULT NONE END STRING F_DA_MAGAZZ 3 @@ -121,7 +151,9 @@ BEGIN DISPLAY "Descrizione@50" S0 OUTPUT F_DA_MAGAZZ CODTAB CHECKTYPE NORMAL + DEFAULT NONE END + STRING F_A_MAGAZZ 3 BEGIN FLAGS "U" @@ -132,6 +164,7 @@ BEGIN DISPLAY "Descrizione@50" S0 OUTPUT F_A_MAGAZZ CODTAB CHECKTYPE NORMAL + DEFAULT NONE END BUTTON DLG_QUIT 10 2 diff --git a/mr/mr2200f.uml b/mr/mr2200f.uml new file mode 100755 index 000000000..206adb8b9 --- /dev/null +++ b/mr/mr2200f.uml @@ -0,0 +1,170 @@ +#include "mr2200a.h" +#define G_ORDINI 1 +#define G_CRP 2 +#define G_EXCEPT 3 +PAGE "Stampa Planning" -1 -1 60 15 +STRING DLG_PROFILE 50 +BEGIN + PROMPT 2 2 "" + FLAGS "HG" + PSELECT +END + +RADIO S_PRINTTYPE 40 +BEGIN + PROMPT 2 1 "Stampa" + ITEM "E|Tabulato eccezioni" + MESSAGE HIDE,G_ORDINI@|HIDE,G_CRP@|SHOW,G_EXCEPT@ + ITEM "O|Proposte d'ordine" + MESSAGE HIDE,G_EXCEPT@|HIDE,G_CRP@|SHOW,G_ORDINI@ + ITEM "C|Capacity review" + MESSAGE HIDE,G_EXCEPT@|HIDE,G_ORDINI@|SHOW,G_CRP@ + DEFAULT NONE +END + +BOOL S_INTERLINEA +BEGIN + PROMPT 2 6 "Interlinea tra le righe d'ordine" + FLAGS "H" +END + +BOOL S_DELAY_EXCEPT +BEGIN + PROMPT 2 6 "Stampa proposte di dilazione" + GROUP G_EXCEPT +END + +BOOL S_HURRYUP_EXCEPT +BEGIN + PROMPT 2 7 "Stampa proposte di anticipo" + GROUP G_EXCEPT +END + +BOOL S_EXTRA_EXCEPT +BEGIN + PROMPT 2 8 "Stampa proposte di disdetta" + GROUP G_EXCEPT +END + + +LIST F_MSP_SORT 23 +BEGIN + GROUP G_ORDINI + PROMPT 2 6 "Ordinamento " + ITEM " | " + ITEM "1|*Cliente+Articolo+Linea" + ITEM "2|*Cliente+Linea+Articolo" + ITEM "3|*Articolo+Linea+Cliente" + ITEM "4|*Articolo+Cliente+Linea" + ITEM "5|*Linea+Articolo+Cliente" + ITEM "6|*Linea+Cliente+Articolo" + ITEM "8|*Articolo+Cliente" + ITEM "9|*Cliente+Articolo" + ITEM "17|Cliente+Articolo+Linea" + ITEM "18|Cliente+Linea+Articolo" + ITEM "19|Articolo+Linea+Cliente" + ITEM "20|Articolo+Cliente+Linea" + ITEM "21|Linea+Articolo+Cliente" + ITEM "22|Linea+Cliente+Articolo" + ITEM "24|Articolo+Cliente" + ITEM "25|Cliente+Articolo" + DEFAULT NONE +END + +BOOL F_MSP_SORT_ORDER +BEGIN + GROUP G_ORDINI + PROMPT 42 6 "inverso" + DEFAULT NONE +END + +BUTTON F_MSP_RESORT 10 1 +BEGIN + GROUP G_ORDINI + PROMPT 26 7 "Riordina" +END + +// ----------------------------- + +LIST F_LOADTYPE 20 +BEGIN + GROUP G_CRP + PROMPT 2 6 "" + ITEM "M|Carico macchina" + ITEM "H|Carico uomo" + ITEM "P|Numero pezzi" + ITEM "$|Costo standard" + DEFAULT NONE +END + +BOOL F_SHOWDETAILS +BEGIN + GROUP G_CRP + PROMPT 2 7 "Mostra dettaglio" + DEFAULT NONE +END +BOOL F_SHOWPERC +BEGIN + GROUP G_CRP + PROMPT 30 7 "Mostra percentuali" + DEFAULT NONE +END + + +BOOL F_USENONSTDLIN_CRP +BEGIN + GROUP G_CRP + PROMPT 2 8 "Linee non standard" + FLAGS "D" + DEFAULT NONE +END +BOOL F_USEEXTRAHRS_CRP +BEGIN + GROUP G_CRP + PROMPT 30 8 "Turni straordinari" + FLAGS "D" + DEFAULT NONE +END + +LIST F_CRP_SORT 23 +BEGIN +//GROUP G_CRP + FLAGS "HD" + PROMPT 2 7 "Ordina per " + ITEM "ILA|Impianto+Linea+Articolo" + ITEM "AIL|Articolo+Impianto+Linea" + ITEM "IAL|Impianto+Articolo+Linea" + DEFAULT NONE +END + +BOOL F_CRP_SORT_ORDER +BEGIN +//GROUP G_CRP + FLAGS "HD" + PROMPT 42 7 "inverso" + DEFAULT NONE +END + +BUTTON F_CRP_RESORT 9 1 +BEGIN +//GROUP G_CRP + FLAGS "HD" + PROMPT 64 7 "Riordina" +END + + + +BUTTON DLG_QUIT 10 2 +BEGIN + PROMPT -12 -1 "~Stampa" + PICTURE BMP_PRINT +END + +BUTTON DLG_CANCEL 10 2 +BEGIN + PROMPT -22 -1 "" +END + +ENDPAGE + +ENDMASK diff --git a/mr/mr2201.cpp b/mr/mr2201.cpp index 80bdc1909..958c66b4e 100755 --- a/mr/mr2201.cpp +++ b/mr/mr2201.cpp @@ -5,7 +5,7 @@ #include "../ve/veconf.h" #include "mr2100.h" -#include "mr2201.h" +#include "mr2200.h" #include "mr2200a.h" @@ -197,66 +197,66 @@ bool TRiga_articolo::find_block(const TSheet_field& sf, const int riga, int &fir int TRiga_articolo::order_compare( const TToken_string &r1 , const TToken_string &r2 , int level, bool ascending) { - TString16 str0, str1; - int cmp = 0; - if (level>=0) + TString str0, str1; + int cmp = 0; + if (level>=0) + { + for (int i = 2; i <= level && cmp == 0; i++) { - for (int i = 2; i <= level && cmp == 0; i++) - { - r1.get(i, str0); - r2.get(i, str1); - cmp=TRiga_articolo::compare_field(str0,str1,short(i+FIRST_FIELD)); - } - } else { - // ordinamenti non standard - short f; - short fields_ACL[] = {F_PRIORITA,F_ARTICOLO, F_CLIENTE, F_SORTCODIMP, F_SORTCODLIN,F_PRIORITA}; - short fields_ALC[] = {F_PRIORITA,F_ARTICOLO, F_SORTCODIMP, F_SORTCODLIN, F_CLIENTE,F_PRIORITA}; - short fields_LAC[] = {F_PRIORITA,F_SORTCODIMP, F_SORTCODLIN, F_ARTICOLO, F_CLIENTE,F_PRIORITA}; - short fields_LCA[] = {F_PRIORITA,F_SORTCODIMP, F_SORTCODLIN, F_CLIENTE, F_ARTICOLO,F_PRIORITA}; - short fields_CLA[] = {F_PRIORITA,F_CLIENTE, F_SORTCODIMP, F_SORTCODLIN, F_ARTICOLO,F_PRIORITA}; - short fields_CAL[] = {F_PRIORITA,F_CLIENTE, F_ARTICOLO, F_SORTCODIMP, F_SORTCODLIN,F_PRIORITA}; - short fields_CA[] = {F_PRIORITA,F_CLIENTE, F_ARTICOLO, F_PRIORITA, F_PRIORITA, F_PRIORITA}; - short fields_AC[] = {F_PRIORITA,F_ARTICOLO, F_CLIENTE, F_PRIORITA, F_PRIORITA, F_PRIORITA}; - for (int ii = 0; ii < 4 && cmp == 0; ii++) - { - const int i = ii + (-level <= SORT_BY_PRIORITY ? 0 : 1); - switch (level) - { - case SORT_BY_PCAL: - case SORT_BY_CAL: - f=fields_CAL[i]; break; - case SORT_BY_PCLA: - case SORT_BY_CLA: - f=fields_CLA[i]; break; - case SORT_BY_PLCA: - case SORT_BY_LCA: - f=fields_LCA[i]; break; - case SORT_BY_PLAC: - case SORT_BY_LAC: - f=fields_LAC[i]; break; - case SORT_BY_PACL: - case SORT_BY_ACL: - f=fields_ACL[i]; break; - case SORT_BY_PALC: - case SORT_BY_ALC: - f=fields_ALC[i]; break; - case SORT_BY_PAC: - case SORT_BY_AC: - f=fields_AC[i]; break; - case SORT_BY_PCA: - case SORT_BY_CA: - f=fields_CA[i]; break; - default: - NFCHECK("Ordinamento sconosciuto"); - break; - } - r1.get(f-FIRST_FIELD, str0); - r2.get(f-FIRST_FIELD, str1); - cmp=TRiga_articolo::compare_field(str0,str1,f) * (ascending && f != F_PRIORITA ? 1 : -1); - } + r1.get(i, str0); + r2.get(i, str1); + cmp=TRiga_articolo::compare_field(str0,str1,short(i+FIRST_FIELD)); } - return cmp; + } else { + // ordinamenti non standard + short f; + short fields_ACL[] = {F_PRIORITA, F_ARTICOLO,F_LIV1,F_LIV2,F_LIV3,F_LIV4, F_CLIENTE, F_SORTCODIMP, F_SORTCODLIN,F_PRIORITA}; + short fields_ALC[] = {F_PRIORITA, F_ARTICOLO,F_LIV1,F_LIV2,F_LIV3,F_LIV4, F_SORTCODIMP, F_SORTCODLIN, F_CLIENTE,F_PRIORITA}; + short fields_LAC[] = {F_PRIORITA, F_SORTCODIMP, F_SORTCODLIN, F_ARTICOLO,F_LIV1,F_LIV2,F_LIV3,F_LIV4, F_CLIENTE,F_PRIORITA}; + short fields_LCA[] = {F_PRIORITA, F_SORTCODIMP, F_SORTCODLIN, F_CLIENTE, F_ARTICOLO,F_LIV1,F_LIV2,F_LIV3,F_LIV4,F_PRIORITA}; + short fields_CLA[] = {F_PRIORITA, F_CLIENTE, F_SORTCODIMP, F_SORTCODLIN, F_ARTICOLO,F_LIV1,F_LIV2,F_LIV3,F_LIV4,F_PRIORITA}; + short fields_CAL[] = {F_PRIORITA, F_CLIENTE, F_ARTICOLO,F_LIV1,F_LIV2,F_LIV3,F_LIV4, F_SORTCODIMP, F_SORTCODLIN,F_PRIORITA}; + short fields_CA[] = {F_PRIORITA, F_CLIENTE, F_ARTICOLO,F_LIV1,F_LIV2,F_LIV3,F_LIV4, F_PRIORITA, F_PRIORITA, F_PRIORITA}; + short fields_AC[] = {F_PRIORITA, F_ARTICOLO,F_LIV1,F_LIV2,F_LIV3,F_LIV4, F_CLIENTE, F_PRIORITA, F_PRIORITA, F_PRIORITA}; + for (int ii = 0; ii < 8 && cmp == 0; ii++) + { + const int i = ii + (-level <= SORT_BY_PRIORITY ? 0 : 1); + switch (level) + { + case SORT_BY_PCAL: + case SORT_BY_CAL: + f=fields_CAL[i]; break; + case SORT_BY_PCLA: + case SORT_BY_CLA: + f=fields_CLA[i]; break; + case SORT_BY_PLCA: + case SORT_BY_LCA: + f=fields_LCA[i]; break; + case SORT_BY_PLAC: + case SORT_BY_LAC: + f=fields_LAC[i]; break; + case SORT_BY_PACL: + case SORT_BY_ACL: + f=fields_ACL[i]; break; + case SORT_BY_PALC: + case SORT_BY_ALC: + f=fields_ALC[i]; break; + case SORT_BY_PAC: + case SORT_BY_AC: + f=fields_AC[i]; break; + case SORT_BY_PCA: + case SORT_BY_CA: + f=fields_CA[i]; break; + default: + NFCHECK("Ordinamento sconosciuto"); + break; + } + r1.get(f-FIRST_FIELD, str0); + r2.get(f-FIRST_FIELD, str1); + cmp=TRiga_articolo::compare_field(str0,str1,f) * (ascending && f != F_PRIORITA ? 1 : -1); + } + } + return cmp; } @@ -387,30 +387,30 @@ TRiga_articolo& TRiga_articolo::operator+=(TRiga_articolo& r) TRiga_articolo::TRiga_articolo(const TMSP_constraint& line) : TToken_string(128) { - format("%ld", line.cliente()); - add(line.codice(),F_CLIENTE-FIRST_FIELD); + format("%ld", line.codclifor()); + add(line.articolo(),F_CLIENTE-FIRST_FIELD); add(" ",F_PRIORITA-FIRST_FIELD); const TString& liv = line.livgiac(); for (int l = 1; l <= 4; l++) { - if (livelli_giac().enabled(l)) - add(livelli_giac().unpack_grpcode(liv,l),F_LIV1+l-1-FIRST_FIELD); + if (livelli_giacenza().enabled(l)) + add(livelli_giacenza().unpack_grpcode(liv,l),F_LIV1+l-1-FIRST_FIELD); else add(" ",F_LIV1+l-1-FIRST_FIELD); } - add(line.desc(),F_DESCART-FIRST_FIELD); + add(line.description(),F_DESCART-FIRST_FIELD); add(line.codimp(),F_CODIMP-FIRST_FIELD); add(line.codlin(),F_CODLIN-FIRST_FIELD); - TString8 str = line.codmag().left(3); + TString8 str = line.codmagdep().left(3); add(str,F_MAGAZZINO-FIRST_FIELD); - str = line.codmag().mid(3); + str = line.codmagdep().mid(3); add(str, F_DEPOSITO-FIRST_FIELD); const TCodice_um um; - const TQuantita qta_art(line.codice(), um, ZERO); + const TQuantita qta_art(line.articolo(), um, ZERO); add(qta_art.um(),F_UM-FIRST_FIELD); TMSP_constraint& lin=(TMSP_constraint& )line; @@ -422,20 +422,6 @@ TRiga_articolo::TRiga_articolo(const TMSP_constraint& line) } /////////////////////////////////////////////////////////// -TRigadoc_ref::TRigadoc_ref(const char *codnum, int annodoc, long numdoc,int numrig, const real &qta, const real &prz) -{ - _codnum =codnum; - _annodoc =annodoc; - _numdoc =numdoc; - _numrig =numrig; - _qta=qta; - _prz=prz; -} -TObject* TRigadoc_ref::dup() const -{ - TRigadoc_ref* o=new TRigadoc_ref(_codnum,_annodoc,_numdoc,_numrig,_qta,_prz); - return o; -} //////////////////// TMSP_record::TMSP_record() : _curr_ref(-1), _qta_locked(FALSE), _qta_min(ZERO),_qta(ZERO),_price(ZERO) @@ -444,7 +430,7 @@ TMSP_record::TMSP_record() : TObject* TMSP_record::dup() const { TMSP_record* o=new TMSP_record(); - o->_rigadoc_refs =_rigadoc_refs; + o->_docrefs =_docrefs; o->_qta_locked=_qta_locked; o->_qta_min=_qta_min; o->_qta=_qta; @@ -454,31 +440,31 @@ TObject* TMSP_record::dup() const void TMSP_record::remove_rigaref() { CHECK(_curr_ref>0,"Nessun riferimento a riga documento da cancellare"); - _rigadoc_refs.remove(_curr_ref-1); - if (_curr_ref>=_rigadoc_refs.items()) + _docrefs.remove(_curr_ref-1); + if (_curr_ref>=_docrefs.items()) _curr_ref--; } -void TMSP_record::add_rigaref(TRigadoc_ref *r) +void TMSP_record::add_rigaref(TMRP_docref *r) { - _rigadoc_refs.add(r); - _curr_ref = _rigadoc_refs.items(); + _docrefs.add(r); + _curr_ref = _docrefs.items(); } -TRigadoc_ref *TMSP_record::first_rigaref() +TMRP_docref *TMSP_record::first_rigaref() { _curr_ref=0; return next_rigaref(); } -TRigadoc_ref *TMSP_record::next_rigaref() +TMRP_docref* TMSP_record::next_rigaref() { - if (_rigadoc_refs.items()<=_curr_ref) + if (_docrefs.items()<=_curr_ref) return NULL; - return (TRigadoc_ref *)_rigadoc_refs.objptr(_curr_ref++); + return _docrefs.get_ref_ptr(_curr_ref++); } -TRigadoc_ref* TMSP_record::rigaref(int n) +TMRP_docref* TMSP_record::rigaref(int n) { - if (_rigadoc_refs.items()<=n) + if (_docrefs.items()<=n) return NULL; - return (TRigadoc_ref* )_rigadoc_refs.objptr(_curr_ref=n); + return _docrefs.get_ref_ptr(_curr_ref=n); } @@ -765,22 +751,27 @@ TMSP_line2::TMSP_line2(const TMSP_constraint &c) /////////////////////////////////////////////////////////// // TMSP_constraint /////////////////////////////////////////////////////////// +TString16 TMSP_constraint::_substr; int TMSP_constraint::compare(const TSortable& s) const { const TMSP_constraint& c = (const TMSP_constraint&)s; - const long diff = _cliente - c._cliente; + const long diff = _codclifor - c._codclifor; int cmp = diff == 0L ? 0 : (diff > 0 ? +1 : -1); if (cmp == 0) { cmp = _codart.compare(c._codart); if (cmp == 0) { - cmp = _giac.compare(c._giac); + cmp = _livgiac.compare(c._livgiac); if (cmp == 0) { - cmp = _imp.compare(c._imp); + cmp = _codimp.compare(c._codimp); if (cmp == 0) - cmp = _mag.compare(c._mag); + { + cmp = _codlin.compare(c._codlin); + if (cmp == 0) + cmp = _codmag.compare(c._codmag); + } } } } @@ -795,34 +786,31 @@ void TMSP_constraint::fill_sheet_row(TToken_string& row, const TMask & m, bool c row.add(m.get_bool(F_NOCLI_IN) ? "" : tipocf,F_TIPOCF_SHEET-FIRST_FIELD); - row.add(format("%ld", cliente()),F_CLIENTE-FIRST_FIELD); - row.add(codice(),F_ARTICOLO-FIRST_FIELD); + row.add(format("%ld", codclifor()),F_CLIENTE-FIRST_FIELD); + row.add(articolo(),F_ARTICOLO-FIRST_FIELD); row.add(" ",F_PRIORITA-FIRST_FIELD); const TString& liv = livgiac(); for (int l = 1; l <= 4; l++) { - if (livelli_giac().enabled(l)) - row.add(livelli_giac().unpack_grpcode(liv,l),F_LIV1+l-1-FIRST_FIELD); + if (livelli_giacenza().enabled(l)) + row.add(livelli_giacenza().unpack_grpcode(liv,l),F_LIV1+l-1-FIRST_FIELD); else row.add(" ",F_LIV1+l-1-FIRST_FIELD); } - row.add(desc(),F_DESCART-FIRST_FIELD); + row.add(description(),F_DESCART-FIRST_FIELD); row.add(codimp(),F_CODIMP-FIRST_FIELD); row.add(codlin(),F_CODLIN-FIRST_FIELD); - TString8 str = _mag.left(3); - row.add(str, F_MAGAZZINO-FIRST_FIELD); - str = _mag.mid(3); - row.add(str,F_DEPOSITO-FIRST_FIELD); - str = _mag_coll.left(3); - row.add(str, F_MAG_COLL-FIRST_FIELD); - str = _mag_coll.mid(3); - row.add(str,F_DEP_COLL-FIRST_FIELD); + //TString8 str = _codmag.left(3); + row.add(codmag(), F_MAGAZZINO-FIRST_FIELD); + row.add(coddep(),F_DEPOSITO-FIRST_FIELD); + row.add(codmag_coll(), F_MAG_COLL-FIRST_FIELD); + row.add(coddep_coll(),F_DEP_COLL-FIRST_FIELD); const TCodice_um um; - const TQuantita qta_art(codice(), um, ZERO); + const TQuantita qta_art(articolo(), um, ZERO); row.add(qta_art.um(),F_UM-FIRST_FIELD); if (codes_only) @@ -839,34 +827,40 @@ void TMSP_constraint::fill_sheet_row(TToken_string& row, const TMask & m, bool c row.add(mastercodes2check() ? MASTERCODE_CHAR : ' ',F_MASTERCODE-FIRST_FIELD); } -TRigadoc_ref* TMSP_constraint::first_rigaref(int buck) +TMRP_docref* TMSP_constraint::first_rigaref(int buck) { TMSP_record& b = _bucket_qta[buck]; - TRigadoc_ref* rdr=b.first_rigaref(); + TMRP_docref* rdr=b.first_rigaref(); return rdr; } -TRigadoc_ref* TMSP_constraint::next_rigaref(int buck) +TMRP_docref* TMSP_constraint::next_rigaref(int buck) { TMSP_record& b = _bucket_qta[buck]; - TRigadoc_ref* rdr=b.next_rigaref(); + TMRP_docref* rdr=b.next_rigaref(); return rdr; } int TMSP_constraint::rigarefs(int buck) { return _bucket_qta[buck].rigarefs(); } -TRigadoc_ref * TMSP_constraint::rigaref(int buck, int n) +TMRP_docref * TMSP_constraint::rigaref(int buck, int n) { return _bucket_qta[buck].rigaref(n); } -void TMSP_constraint::add_rigaref(int buck, TString& codnum, int annodoc, long ndoc, int nrig, const real & qta, const real &prz) +const char *TMSP_constraint::um() +{ + TToken_string key=articolo(); + key.add("1"); + return cache().get(LF_UMART,key).get("UM"); +} +void TMSP_constraint::add_rigaref(int buck, TString& codnum, int annodoc, long ndoc, int nrig, const char * um, const real & qta, const real &prz) { TMSP_record& b = _bucket_qta[buck]; - TRigadoc_ref *rdr= new TRigadoc_ref(codnum, annodoc, ndoc, nrig, qta,prz); + TMRP_docref *rdr= new TMRP_docref(annodoc, codnum, ndoc, nrig, um, qta,prz); b.add_rigaref(rdr); } -void TMSP_constraint::add_rigaref(int buck, TRigadoc_ref *rdr) +void TMSP_constraint::add_rigaref(int buck, TMRP_docref *rdr) { TMSP_record& b = _bucket_qta[buck]; b.add_rigaref(rdr); @@ -884,8 +878,8 @@ int TMSP_constraint::find_distinta_master(const TMSP_constraint & constr, TStrin dist_tree().set_global("_LIVELLO",constr.livgiac()); dist_tree().set_global("_IMPIANTO",constr.codimp()); dist_tree().set_global("_LINEA",constr.codlin()); - dist_tree().set_global("_MAGAZZINO",constr.codmag()); - if (dist_tree().set_root(constr.codice())) + dist_tree().set_global("_MAGAZZINO",constr.codmagdep()); + if (dist_tree().set_root(constr.articolo())) { dist_tree().explode(sons, FALSE, RAGGR_EXP_NONE, 1, "AV"); TRiga_esplosione* riga; @@ -917,48 +911,50 @@ void TMSP_constraint::set_mastercode_check(bool on) _check_master=on; } -TMSP_line2 *TMSP_constraint::use_mspline2(TToken_string & row, TSheet_field & sf) +TMSP_line2 *TMSP_constraint::use_mspline2(TToken_string & row) { TString16 liv; TString8 mag,magc,imp,lin; long codcli=row.get_long(F_CLIENTE-FIRST_FIELD); - livelli_giac().pack_grpcode(liv, row.get(sf.cid2index(F_LIV1)),1); - livelli_giac().pack_grpcode(liv, row.get(sf.cid2index(F_LIV2)),2); - livelli_giac().pack_grpcode(liv, row.get(sf.cid2index(F_LIV3)),3); - livelli_giac().pack_grpcode(liv, row.get(sf.cid2index(F_LIV4)),4); - imp=row.get(sf.cid2index(F_CODIMP)); - lin=row.get(sf.cid2index(F_CODLIN)); - add_magcode(mag, row.get(sf.cid2index(F_MAGAZZINO))); - add_depcode(mag, row.get(sf.cid2index(F_DEPOSITO))); - add_magcode(magc, row.get(sf.cid2index(F_MAG_COLL))); - add_depcode(magc, row.get(sf.cid2index(F_DEP_COLL))); + livelli_giacenza().pack_grpcode(liv, row.get(F_LIV1-FIRST_FIELD),1); + livelli_giacenza().pack_grpcode(liv, row.get(F_LIV2-FIRST_FIELD),2); + livelli_giacenza().pack_grpcode(liv, row.get(F_LIV3-FIRST_FIELD),3); + livelli_giacenza().pack_grpcode(liv, row.get(F_LIV4-FIRST_FIELD),4); + imp=row.get(F_CODIMP-FIRST_FIELD); + lin=row.get(F_CODLIN-FIRST_FIELD); + add_magcode(mag, row.get(F_MAGAZZINO-FIRST_FIELD)); + add_depcode(mag, row.get(F_DEPOSITO-FIRST_FIELD)); + add_magcode(magc, row.get(F_MAG_COLL-FIRST_FIELD)); + add_depcode(magc, row.get(F_DEP_COLL-FIRST_FIELD)); codcli=row.get_long(F_CLIENTE-FIRST_FIELD); - TMSP_line mspline(codcli, codice(), liv, imp, lin, mag, magc); + TMSP_line mspline(codcli, articolo(), liv, imp, lin, mag, magc); for (int b= 0 ; b< LAST_BUCKET ; b++) { - real q(row.get(sf.cid2index(F_BUCKET0+b*2))); + real q(row.get(F_BUCKET0+b*2-FIRST_FIELD)); mspline.qta(b) = q; } return use_mspline2(mspline); } - TMSP_line2 *TMSP_constraint::use_mspline2(TMSP_constraint &line) { TMSP_line2 *a=NULL; - for (int i=_lines2.items()-1; i>=0 && a==NULL; i--) + if (_lines2) { - a=(TMSP_line2 *) _lines2.objptr(i); - if (a->constraint() != line) - a=NULL; + for (int i=_lines2->items()-1; i>=0 && a==NULL; i--) + { + a=(TMSP_line2 *) _lines2->objptr(i); + if (a->constraint() != line) + a=NULL; + } } if (a == NULL) { TString master; TString4 ummaster; TString16 livmaster; - TString8 impmaster(codimp()), linmaster(codlin()),magmaster(codmag()); + TString8 impmaster(codimp()), linmaster(codlin()),magmaster(codmagdep()); real expr; int dm=0; while ((dm=find_distinta_master(line, master, livmaster, ummaster, expr, impmaster, linmaster, magmaster,dm)+1) >0) @@ -966,9 +962,10 @@ TMSP_line2 *TMSP_constraint::use_mspline2(TMSP_constraint &line) if (a == NULL) { a = new TMSP_line2(line); - _lines2.add(a); + if (!_lines2) _lines2 = new TArray(); + _lines2->add(a); } - a->add_mastercode(new TMaster_code (master, livmaster, ummaster, expr, cache().get(LF_ANAMAG,master).get_real(ANAMAG_GIORNIRIOR), codimp(), codlin(), codmag())); + a->add_mastercode(new TMaster_code (master, livmaster, ummaster, expr, cache().get(LF_ANAMAG,master).get_real(ANAMAG_GIORNIRIOR), codimp(), codlin(), codmagdep())); } } if (a) @@ -981,79 +978,88 @@ TMSP_line2 *TMSP_constraint::use_mspline2(TMSP_constraint &line) void TMSP_constraint::reset_unused_line2() { - TMSP_line2 *a; - for (int i=_lines2.items()-1; i>=0; i--) + if (_lines2) { - a=(TMSP_line2 *) _lines2.objptr(i); - a->set_use(FALSE); + TMSP_line2 *a; + for (int i=_lines2->items()-1; i>=0; i--) + { + a=(TMSP_line2 *) _lines2->objptr(i); + a->set_use(FALSE); + } } } TMSP_line2 * TMSP_constraint::get_unused_line2() { - TMSP_line2 *a; - for (int i=_lines2.items()-1; i>=0; i--) + if (_lines2) { - a=(TMSP_line2 *) _lines2.objptr(i); - if (!a->used()) - return a; + TMSP_line2 *a; + for (int i=_lines2->items()-1; i>=0; i--) + { + a=(TMSP_line2 *) _lines2->objptr(i); + if (!a->used()) + return a; + } } return NULL; } void TMSP_constraint::discard_line2(TMSP_line2 * l) { - TMSP_line2 *a; - int i=_lines2.items(); - while (--i>=0) + if (_lines2) { - a=(TMSP_line2 *) _lines2.objptr(i); - if (a==l) + TMSP_line2 *a; + int i=_lines2->items(); + while (--i>=0) { - _lines2.destroy(i,TRUE); - break; + a=(TMSP_line2 *) _lines2->objptr(i); + if (a==l) + { + _lines2->destroy(i,TRUE); + break; + } } } } -bool TMSP_constraint::has_upperlines() const -{ - return _upperlines.items()>0; -} - // cerca ed eventualmente aggiunge la linea di articolo non-Master nell'elenco // degli articoli "upper", ovvero vincolanti per questo articolo Master TMSP_constraint * TMSP_constraint::add_upperline(const TMSP_constraint& mc) { TMSP_constraint * upl; - if (_upperlines.items()==0) + if (_upperlines == NULL) + _upperlines = new TMSP_constraints(); + if (_upperlines->items()==0) { // aggiunge se stesso - upl=_upperlines.find(cliente(), codice(), livgiac(), - codimp(),codlin(),codmag(),TRUE); + upl=_upperlines->find(codclifor(), articolo(), livgiac(), + codimp(),codlin(),codmagdep(),TRUE); *upl=*this; } - return _upperlines.find(mc.cliente(), mc.codice(), mc.livgiac(), - mc.codimp(),mc.codlin(),mc.codmag(),TRUE); + return _upperlines->find(mc.codclifor(), mc.articolo(), mc.livgiac(), + mc.codimp(),mc.codlin(),mc.codmagdep(),TRUE); } TMSP_constraint* TMSP_constraint::get_upperline(TMSP_constraint& mc) { - return _upperlines.find(mc.cliente(), mc.codice(), mc.livgiac(), - mc.codimp(),mc.codlin(),mc.codmag(),FALSE); + if (_upperlines) + return _upperlines->find(mc.codclifor(), mc.articolo(), mc.livgiac(), + mc.codimp(),mc.codlin(),mc.codmagdep(),FALSE); + else + return NULL; } TMSP_constraint & TMSP_constraint::operator=(const TMSP_constraint & line) { - _cliente=line.cliente(); - _codart=line.codice(); - _giac=line.livgiac(); - _imp=line.codimp(); - _lin=line.codlin(); - _mag=line.codmag(); - _mag_coll=line.codmag_coll(); + _codclifor=line.codclifor(); + _codart=line.articolo(); + _livgiac=line.livgiac(); + _codimp=line.codimp(); + _codlin=line.codlin(); + _codmag=line.codmagdep(); + _codmag_coll=line.codmagdep_coll(); _on_sheet=_on_sheet; - _desc=line.desc(); + _descr=line.description(); _bucket_qta=line._bucket_qta; return *this; } @@ -1066,15 +1072,22 @@ TMSP_constraint::TMSP_constraint(long cliente, const TString& lin, const TString& mag, const TString& magc) -: _cliente(cliente), _codart(codart), _giac(giac), - _imp(imp), _lin(lin), _mag(mag), _mag_coll(magc),_on_sheet(FALSE),_check_master(FALSE) +: _codclifor(cliente), _codart(codart), _livgiac(giac), + _codimp(imp), _codlin(lin), _codmag(mag), _codmag_coll(magc),_on_sheet(FALSE),_check_master(FALSE), _upperlines(NULL), _lines2(NULL) + { } TMSP_constraint::TMSP_constraint(const TMSP_constraint & line) -: _cliente(line.cliente()), _codart(line.codice()), _giac(line.livgiac()), - _imp(line.codimp()), _lin(line.codlin()), _mag(line.codmag()), _mag_coll(line.codmag_coll()),_on_sheet(FALSE), - _check_master(FALSE), _desc(line.desc()) -{ +: _codclifor(line.codclifor()), _codart(line.articolo()), _livgiac(line.livgiac()), + _codimp(line.codimp()), _codlin(line.codlin()), _codmag(line.codmagdep()), _codmag_coll(line.codmagdep_coll()), + _descr(line.description()), _on_sheet(FALSE), _check_master(FALSE), _upperlines(NULL), _lines2(NULL) +{ +} + +TMSP_constraint::~TMSP_constraint() +{ + if (_lines2) delete _lines2; + if (_upperlines) delete _upperlines; } /////////////////////////////////////////////////////////// @@ -1112,8 +1125,8 @@ TMSP_constraint* TMSP_constraints::find(long cliente, TMSP_constraint *c=(TMSP_constraint*)s; if (create) { - if (c->desc().blank()) - c->set_desc(cache().get(LF_ANAMAG,art).get("DESCR")); + if (c->description().blank()) + c->set_description(cache().get(LF_ANAMAG,art).get("DESCR")); } return c; } @@ -1132,9 +1145,9 @@ TMSP_constraint* TMSP_constraints::find(const TToken_string& row, bool create) case F_LIV1: case F_LIV2: case F_LIV3: - livelli_giac().pack_grpcode(giaclev, str, i+FIRST_FIELD-F_LIV1+1); break; + livelli_giacenza().pack_grpcode(giaclev, str, i+FIRST_FIELD-F_LIV1+1); break; case F_LIV4: - livelli_giac().pack_grpcode(giaclev, str, 4); + livelli_giacenza().pack_grpcode(giaclev, str, 4); _key.add(giaclev); break; // Concatena i livelli case F_MAGAZZINO: @@ -1156,10 +1169,10 @@ TMSP_constraint* TMSP_constraints::find(const TToken_string& row, bool create) TMSP_constraint *c=(TMSP_constraint*)s; if (create) { - if (c->desc().blank()) + if (c->description().blank()) { row.get(F_ARTICOLO, str); - c->set_desc(cache().get(LF_ANAMAG,str).get("DESCR")); + c->set_description(cache().get(LF_ANAMAG,str).get("DESCR")); } } return c; @@ -1239,9 +1252,9 @@ TMSP_line* TMSP_lines::find(const TToken_string& row, bool create) case F_LIV1: case F_LIV2: case F_LIV3: - livelli_giac().pack_grpcode(giaclev, str, i+FIRST_FIELD-F_LIV1+1); break; + livelli_giacenza().pack_grpcode(giaclev, str, i+FIRST_FIELD-F_LIV1+1); break; case F_LIV4: - livelli_giac().pack_grpcode(giaclev, str, 4); + livelli_giacenza().pack_grpcode(giaclev, str, 4); giaclev.trim(); _key.add(giaclev); break; // Concatena i livelli @@ -1282,16 +1295,16 @@ TSortable* TPlan_docs::new_obj(const TToken_string& key) const return doc; } -TDocumento& TPlan_docs::find(TRigadoc_ref * rdr) +TDocumento& TPlan_docs::find(TMRP_docref * rdr) { if (rdr) - _key.format("%s|%d|%ld",(const char *)rdr->codnum(), rdr->annodoc(), rdr->numdoc()); + _key.format("%s|%d|%ld",(const char *)rdr->codnumdoc(), rdr->annodoc(), rdr->numdoc()); else _key = " |0|0"; return *(TDocumento*)add_obj(_key); } -TRiga_documento& TPlan_docs::add_to_row(TRigadoc_ref * rdr, const real& qta) +TRiga_documento& TPlan_docs::add_to_row(TMRP_docref * rdr, const real& qta) { CHECK(rdr,"TPlan_docs::add_to_row :passare un rigaref fvalido"); TDocumento& doc = find(rdr); @@ -1313,14 +1326,18 @@ TRiga_documento& TPlan_docs::add_to_row(TRigadoc_ref * rdr, const real& qta) return rdoc; } -long TPlan_docs::flush(const TDate& data) +long TPlan_docs::flush(const TDate& data, const char * codart) { const long tot = items(); long retv=tot; if (tot > 0L) { TString msg; - msg << "Registrazione dei documenti di planning per il " << data; + msg << "Registrazione dei documenti di planning"; + if (codart) + msg << " articolo " << codart; + if (data.ok()) + msg << " per il " << data; TProgind pi(tot, msg, FALSE, TRUE); TLocalisamfile lfdoc(LF_DOC); for (long d = 0; d < tot; d++) @@ -1329,7 +1346,7 @@ long TPlan_docs::flush(const TDate& data) TDocumento& doc = (TDocumento&)find_obj(d); lfdoc.curr() = doc.head(); int err = lfdoc.read(_isequal, _lock); - if (err == _iskeynotfound || err == NOERR) + if (err == _iseof || err == _iskeynotfound || err == NOERR) { for (int r = doc.physical_rows(); r > 0; r--) { @@ -1338,7 +1355,7 @@ long TPlan_docs::flush(const TDate& data) doc.destroy_row(r, TRUE); } if (doc.physical_rows()) - err = (err == _iskeynotfound) ? doc.write(lfdoc) : doc.rewrite(lfdoc); + err = (err == NOERR) ? doc.rewrite(lfdoc) : doc.write(lfdoc) ; else err = doc.remove(lfdoc); } @@ -1369,25 +1386,121 @@ bool distinta_master(const char *code, bool is_son) /////////////////////////////////////////////////////////// // Sheet ordini / commessse /////////////////////////////////////////////////////////// -void TLista_ordini::get_row(long r, TToken_string& row) +void TLista_dettagli::set_bucket(int b) +{ + _curr_bucket=b; + reset_parked(); +} + +bool TLista_dettagli::reset_bucket_field() +{ + int b = 0; + while (b <= LAST_BUCKET && get_items(b)==0) + b++; + TMask_field & f=field(FIRST_FIELD); + f.set(format("%d",b <= LAST_BUCKET ? b : 0)); + bucket_handler(f, K_SPACE); + return b <= LAST_BUCKET; +} + +bool TLista_dettagli::bucket_handler(TMask_field & f, KEY key) +{ + if (key == K_SPACE) + { + TLista_dettagli &m = (TLista_dettagli &)f.mask(); + const int buck=atoi(f.get()); + if (m.curr_bucket() != buck) + { + m.set_bucket(buck); + int week1=0,week2=0, year1=0, year2=0; + TDate d; + if (buck>0) + { + d = m._from; + d += (buck - 1) * m._bucksize; + if (m._bucksize == 31) // mese solare + d.set_day(1); + TPlanning_mask::get_week_year(d, week1, year1); + } + m.set(FIRST_FIELD+1, d.string()); + if (buck == LAST_BUCKET) + d = NULLDATE; + else + { + d = m._from; + d += (buck - 1) * m._bucksize; + if (m._bucksize == 31) // mese solare + d.set_end_month(); + else + d += m._bucksize-1; + TPlanning_mask::get_week_year(d, week2, year2); + } + m.set(FIRST_FIELD+2, d.string()); + TString ws; + if (week1) + { + ws << (week2 ? "" : ">="); + ws << week1; + if (year1 != year2) + ws << "/" << year1; + } else + ws << "<="; + if (week2) + { + if (week1 != week2 || year1 != year2) + { + if (week1) + ws << "-"; + ws << week2; + } + ws << "/" << year2; + } + m.set(FIRST_FIELD+3, format("%s",(const char *)ws)); + m.select(0); + m.force_update(); + } + } + return TRUE; +} + +void TLista_dettagli::init(const char * title, TDate fromdate, int bucketsize) +{ + _curr_bucket = -1; + _from = fromdate; + _bucksize = bucketsize; + TMask_field &f= add_list(FIRST_FIELD,0,"Bucket ",1,0,2,"","0|1|2|3|4|5|6|7|8|9|10|11|12|13","0|1|2|3|4|5|6|7|8|9|10|11|12|13"); + f.set_handler(bucket_handler); + add_date(FIRST_FIELD+1,0,"Dal ",16,0,"D"); + add_date(FIRST_FIELD+2,0,"al ",33,0,"D"); + add_string(FIRST_FIELD+3,0,"Settimana ",49,0,15,"D"); +} + +TLista_dettagli::TLista_dettagli(const char * title, TDate fromdate, int bucketsize, const char * head) : + TSheet(-1, 5, 80, 15, title, head,0,2) +{ + init(title, fromdate, bucketsize); +} + + +void TLista_docref::get_row(long r, TToken_string& row) { row = ""; - if (r < _line->rigarefs(_curr_bucket)) + if (r < _line->rigarefs(curr_bucket())) { - TRigadoc_ref * rdr=_line->rigaref(_curr_bucket,(int)r); + TMRP_docref * rdr=_line->rigaref(curr_bucket(),(int)r); if (rdr) { TLocalisamfile & rdoc = _r->lfile(LF_RIGHEDOC); TLocalisamfile & doc = _r->lfile(LF_DOC); rdoc.put(RDOC_PROVV,"D"); rdoc.put(RDOC_ANNO,rdr->annodoc()); - rdoc.put(RDOC_CODNUM,rdr->codnum()); + rdoc.put(RDOC_CODNUM,rdr->codnumdoc()); rdoc.put(RDOC_NDOC,rdr->numdoc()); rdoc.put(RDOC_NRIGA,rdr->numrig()); _r->read(); row.add(" "); row.add(rdr->annodoc()); - row.add(rdr->codnum()); + row.add(rdr->codnumdoc()); row.add(rdr->numdoc()); row.add(rdr->numrig()); TDate dc(rdoc.get_date(RDOC_DATACONS)); @@ -1399,16 +1512,18 @@ void TLista_ordini::get_row(long r, TToken_string& row) row.add(q.string("#######@,@@@")); //const char statodef=cache().get("%TIP",doc.get(DOC_TIPODOC)).get("S2")[1]; row.add(doc.get(DOC_STATO)); + enable_row(r); } } else { row = "|||||||"; - row.add(_line->qta(_curr_bucket).string("#######@,@@@")); + row.add(_line->qta(curr_bucket()).string("#######@,@@@")); + disable_row(r); } } -bool TLista_ordini::edit_checked() +bool TLista_docref::edit_checked() { for (long r=0; r < items()-1; r++) if (checked(r)) { @@ -1431,76 +1546,115 @@ bool TLista_ordini::edit_checked() // aggiungere qui il feedback sulla rigaref; per ora c'e' un brutale /* TConfig action(ininame); - TRigadoc_ref * rdr=_line->rigaref(_curr_bucket,(int)r); + TMRP_docref * rdr=_line->rigaref(_curr_bucket,(int)r); */ } return TRUE; } -long TLista_ordini::get_items() const +long TLista_docref::get_items(int b) const { - const long i=_line->rigarefs(_curr_bucket); - return i == 0 ? i : i+1; + if (b >= 0 && _line->rigarefs(b)) + return _line->rigarefs(b)+1; + return 0L; } -void TLista_ordini::set_bucket(int b) -{ - _curr_bucket=b; - reset_parked(); -} -bool TLista_ordini::bucket_handler(TMask_field & f, KEY key) -{ - if (key == K_SPACE) - { - TLista_ordini &m = (TLista_ordini &)f.mask(); - const int buck=atoi(f.get()); - if (m.get_bucket() != buck) - { - m.set_bucket(buck); - m.select(0); - m.force_update(); - TDate d; - if (buck>0) - { - d = m._from; - d += buck * m._bucksize; - } - m.set(FIRST_FIELD+1, d.string()); - if (buck == LAST_BUCKET) - d = NULLDATE; - else - { - d = m._from; - d += (buck + 1) * m._bucksize -1 ; - } - m.set(FIRST_FIELD+2, d.string()); - } - } - return TRUE; -} -TLista_ordini::TLista_ordini(TMSP_constraint * l, const char * title, TDate fromdate, int bucketsize) : - TSheet(-1, 5, 80, 15, title, - "@1|Anno|CodNum|Numero|Riga|Consegna@10|UM|Q.ta totale@12|Q.ta residua@12|Stato",0,2), - _curr_bucket(0),_from(fromdate), _bucksize(bucketsize) +TLista_docref::TLista_docref(TMSP_constraint * l, const char * title, TDate fromdate, int bucketsize) : + TLista_dettagli(title, fromdate, bucketsize, + "@1|Anno|CodNum|Numero|Riga|Consegna@10|UM|Q.ta totale@12|Q.ta residua@12|Stato"), + _line (l) { - _line = l; - TMask_field &f= add_list(FIRST_FIELD,0,"Bucket ",1,0,2,"","0|1|2|3|4|5|6|7|8|9|10|11|12|13","0|1|2|3|4|5|6|7|8|9|10|11|12|13"); - f.set_handler(bucket_handler); - add_date(FIRST_FIELD+1,0,"Dal ",20,0,"D"); - add_date(FIRST_FIELD+2,0,"al ",40,0,"D"); _r= new TRelation(LF_RIGHEDOC); _r->add(LF_DOC,"PROVV==PROVV|CODNUM==CODNUM|ANNO==ANNO|NDOC==NDOC"); enable_check(); + reset_bucket_field(); // PRESET bucket - int b = 0; - while (b <= LAST_BUCKET && _line->rigarefs(b)==0) - b++; - f.set(format("%0d",(b <= LAST_BUCKET ? b : 0))); - f.set_focus(); } -TLista_ordini::~TLista_ordini() +TLista_docref ::~TLista_docref () { - delete _r; + if (_r) delete _r; +} + +const char *TLista_mastercodes::header() +{ + static TToken_string h; + h = "@1|Articolo@20"; + for (int l = 1; l <= livelli_giacenza().last_level() ; l++) + h << "|" << livelli_giacenza().name(l) << "@" << livelli_giacenza().code_length(l) ; + h.add("Impianto"); + h.add("Linea|Cod.Mag.|UM|Quantita'@12|Consegna"); + return h; +} + +TLista_mastercodes::TLista_mastercodes(TMSP_constraint *c, TToken_string &l, TDate fromdate, int bucketsize): + TLista_dettagli("Articoli Master interessati", fromdate, bucketsize, header()) +{ + _line_art = c->use_mspline2(l); +} +void TLista_mastercodes::get_row(long r, TToken_string& row) +{ + TMaster_code *mc; + if (mc = _line_art->get_mastercode(int(r))) + { + row = " "; + row.add(mc->articolo()); + for (int l = 1; l <= livelli_giacenza().last_level() ; l++) + row.add(livelli_giacenza().unpack_grpcode(mc->livello(),l)); + row.add(mc->codimp()); + row.add(mc->codlin()); + row.add(mc->codmagdep()); + row.add(mc->um()); + real e = mc->expr(); + e *= _line_art->constraint().qta(curr_bucket()); + row.add(e.string("#######@,@@@")); + TDate d = get_date(FIRST_FIELD+2); + d -= long(mc->leadtime().integer()); + row.add(d.string()); + } +} +long TLista_mastercodes::get_items(int b) const +{ + if (_line_art) + if (b >= 0 && b < LAST_BUCKET && !_line_art->constraint().qta(b).is_zero()) + return _line_art->mastercodes(); + return 0L; +} + +const char *TLista_upperlines::header() +{ + static TToken_string h; + h = "@1|Articolo@20"; + for (int l = 1; l <= livelli_giacenza().last_level() ; l++) + h << "|" << livelli_giacenza().name(l) << "@" << livelli_giacenza().code_length(l) ; + h.add("Impianto|Linea|Mag.|Dep.|UM|Quantita'@12"); + return h; +} + +TLista_upperlines::TLista_upperlines(TMSP_constraint *l, TDate fromdate, int bucketsize): + TLista_dettagli("Vincoli da articoli non Master", fromdate, bucketsize,header()) +{ + _line = l; +} +void TLista_upperlines::get_row(long r, TToken_string& row) +{ + TMSP_constraint& c = (*_line->upperlines())[r+1]; + row = " "; + row.add(c.articolo()); + for (int l = 1; l <= livelli_giacenza().last_level() ; l++) + row.add(livelli_giacenza().unpack_grpcode(c.livgiac(),l)); + row.add(c.codimp()); + row.add(c.codlin()); + row.add(c.codmag()); + row.add(c.coddep()); + row.add(c.um()); + row.add(c.qta(curr_bucket()).string("#######@,@@@")); +} +long TLista_upperlines::get_items(int b) const +{ + if (_line->upperlines()) + if (b >= 0 && !_line->qta(b).is_zero()) + return _line->upperlines_items()-1; + return 0L; } diff --git a/mr/mr2201.h b/mr/mr2201.h index 6a0bca84e..f8a6627cb 100755 --- a/mr/mr2201.h +++ b/mr/mr2201.h @@ -1,3 +1,5 @@ +#ifndef __MR2201_H +#define __MR2201_H #include #include #include @@ -100,44 +102,24 @@ public: TMSP_constraint* find(const TToken_string& row, bool create=FALSE); TMSP_constraint& operator[](long n) const - { return (TMSP_constraint&)find_obj(n); } + { return (TMSP_constraint&)find_obj(n); } }; -class TRigadoc_ref : public TObject -{ - TString8 _codnum; - int _annodoc; - long _numdoc; - int _numrig ; - real _qta; - real _prz; -public: - const TString& codnum() {return _codnum;} - int annodoc() {return _annodoc;} - long numdoc() {return _numdoc;} - int numrig() {return _numrig ;} - void set_numrig(int nr) {_numrig = nr;} - void set_qta_residua(real & q) {_qta = q;} - real & qta_residua() {return _qta;} -// real & qta_totale() {return _qta;} - virtual TObject* dup() const; - TRigadoc_ref(const char *codnum, int annodoc, long numdoc,int numrig, const real &qta, const real &prz); -}; class TMSP_record : public TObject { int _curr_ref; - TArray _rigadoc_refs; + TMRP_docrefs _docrefs; public: bool _qta_locked; real _qta_min; real _qta; real _price; - void add_rigaref(TRigadoc_ref *r); + void add_rigaref(TMRP_docref *r); void remove_rigaref(); - TRigadoc_ref *first_rigaref(); - TRigadoc_ref *next_rigaref(); - int rigarefs() {return _rigadoc_refs.items();} - TRigadoc_ref* rigaref(int n); + TMRP_docref *first_rigaref(); + TMRP_docref *next_rigaref(); + int rigarefs() {return _docrefs.items();} + TMRP_docref* rigaref(int n); virtual TObject* dup() const; TMSP_record(); }; @@ -160,7 +142,7 @@ public: const real &leadtime() const {return _leadtime;} const char *codimp() const {return _codimp;} const char *codlin() const {return _codlin;} - const char *codmag() const {return _codmag;} + const char *codmagdep() const {return _codmag;} TMaster_code(const char *code, const char *liv, const char *ummaster, const real &expr, const real &leadtime, const char *codimp, const char *codlin, const char *codmag); TMaster_code(const char *code, const char *liv,const char *ummaster, const real &expr, int leadtime, const char *codimp, const char *codlin, const char *codmag); @@ -177,6 +159,7 @@ public: bool used() {return _used;} void set_use(bool on) {_used=on;} void add_mastercode (TMaster_code *); + int mastercodes() const {return _mastercodes.items();} TMaster_code *get_mastercode (int i=0); TMSP_constraint &constraint() {return *_constraint;} TMSP_line2(const TMSP_constraint &c); @@ -199,60 +182,71 @@ public: class TMSP_constraint : public TSortable { - long _cliente; - TCodice_articolo _codart; - TString16 _giac; // livelli di giacenza - TString8 _imp, _lin; // codice impianto e linea - TString8 _mag; // magazzino /deposito - TString8 _mag_coll; // magazzino /deposito collegato - TString _desc; + long _codclifor; // cliente o fornitore + TCodice_articolo _codart; // articolo + TString16 _livgiac; // livelli di giacenza + TString8 _codmag; // magazzino /deposito + TString8 _codmag_coll; // magazzino /deposito collegato + TString8 _codimp, _codlin; // codice impianto e linea + TString _descr; // descrizione - bool _on_sheet; - bool _check_master; - TArray _lines2; // codici di livello 2 per articoli NON master - TMSP_constraints _upperlines; // vincoli dei codici di livello 1 per articoli master + bool _on_sheet; // gia' sullo sheet + bool _check_master; // anrticolo non master, controllare se esistono Master + TArray *_lines2; // codici master per articoli NON master + TMSP_constraints *_upperlines; // vincoli dei codici di livello 1 per articoli master - TMSP_record_array _bucket_qta; + TMSP_record_array _bucket_qta; // pianificazione +static TString16 _substr; protected: virtual int compare(const TSortable& s) const; public: - long cliente() const { return _cliente; } - const TCodice_articolo& codice() const { return _codart; } - const TString& livgiac() const { return _giac; } - const TString& codimp() const { return _imp; } - const TString& codlin() const { return _lin; } - const TString& codmag() const { return _mag; } - const TString& codmag_coll() const { return _mag_coll; } - const TString& desc() const { return _desc; } - void set_desc(const char* str) { _desc = str; } + const char *um(); + long codclifor() const { return _codclifor; } + const TCodice_articolo& articolo() const { return _codart; } + const TString& livgiac() const { return _livgiac; } + const TString& codimp() const { return _codimp; } + const TString& codlin() const { return _codlin; } + const TString& codmagdep() const { return _codmag; } + const TString& codmagdep_coll() const { return _codmag_coll; } + const TString& description() const { return _descr; } + void set_description(const char* str) { _descr = str; } - TRigadoc_ref * first_rigaref(int buck); - TRigadoc_ref * next_rigaref(int buck); + const TString& codmag() const { return _substr = _codmag.left(3); } + const TString& codmag_coll() const { return _substr = _codmag_coll.left(3); } + const TString& coddep() const { return _substr = _codmag.mid(3); } + const TString& coddep_coll() const { return _substr = _codmag_coll.mid(3); } + const TString& livgiac(int l) const { return _substr = _livgiac.mid(livelli_giacenza().code_start(l)-1, livelli_giacenza().code_length(l));} + + TMRP_docref * first_rigaref(int buck); + TMRP_docref * next_rigaref(int buck); int rigarefs(int buck); - TRigadoc_ref* rigaref(int buck, int n); - void add_rigaref(int buck, TString& codnum, int annodoc, long ndoc, int nrig, const real & qta, const real &prz); - void add_rigaref(int buck, TRigadoc_ref *rdr); + TMRP_docref* rigaref(int buck, int n); + void add_rigaref(int buck, TString& codnum, int annodoc, long ndoc, int nrig, const char * um, const real & qta, const real &prz); + void add_rigaref(int buck, TMRP_docref *rdr); void remove_rigaref(int buck); // master sched. a due livelli: int find_distinta_master(const TMSP_constraint & constr, TString & master, TString & livmaster,TString & um,real & expr, TString & imp,TString & lin,TString & magdep, int fromindex=0); void set_mastercode_check(bool on); bool mastercodes2check() const ; - - TMSP_line2 * use_mspline2(TMSP_constraint&line); - TMSP_line2 * use_mspline2(TToken_string &row, TSheet_field & sf); + // mastercodes + TMSP_line2 * use_mspline2(TMSP_constraint &line); + TMSP_line2 * use_mspline2(TToken_string &row); void discard_line2(TMSP_line2 * ); void reset_unused_line2(); TMSP_line2 * get_unused_line2(); - + const TArray * msplines2() const {return _lines2;} + // upperlines + const TMSP_constraints * upperlines() const {return _upperlines;} + long upperlines_items() const {return _upperlines ? upperlines()->items() : 0L;} + bool has_upperlines() const {return upperlines_items()>0;} TMSP_constraint* add_upperline(const TMSP_constraint& constr); TMSP_constraint* get_upperline(TMSP_constraint& constr); - bool has_upperlines() const ; - + TMSP_constraint* get_upperline(int r); + // buckets int last() const { return _bucket_qta.last(); } int pred(int i) const { return _bucket_qta.pred(i); } - bool & qta_locked(int b) { return _bucket_qta[b]._qta_locked; } virtual real& qta_min(int b) { return _bucket_qta[b]._qta_min; } virtual real& qta(int b) { return _bucket_qta[b]._qta; } @@ -271,7 +265,7 @@ public: const TString& imp, const TString& lin, const TString& mag, const TString& magc); TMSP_constraint(const TMSP_constraint & cons); - virtual ~TMSP_constraint() { } + virtual ~TMSP_constraint(); }; @@ -422,31 +416,72 @@ protected: virtual TSortable* new_obj(const TToken_string& key) const; public: - TDocumento& find(TRigadoc_ref * riga); - TRiga_documento& add_to_row(TRigadoc_ref * rdr, const real& qta); - long flush(const TDate& data); + TDocumento& find(TMRP_docref * riga); + TRiga_documento& add_to_row(TMRP_docref * rdr, const real& qta); + long flush(const TDate& data, const char * codart); TPlan_docs(const char* num, const char* tip, const char* rig); virtual ~TPlan_docs() { } }; -class TLista_ordini : public TSheet +class TLista_dettagli : public TSheet { TDate _from; int _bucksize; - TMSP_constraint * _line; - TRelation *_r; int _curr_bucket; - static bool bucket_handler(TMask_field & f, KEY key); +protected: + static bool bucket_handler(TMask_field & f, KEY key); + virtual long get_items(int b) const {return 0L;} + virtual long get_items() const {return get_items(_curr_bucket);} + +public: + bool reset_bucket_field(); + int curr_bucket() const {return _curr_bucket;} + void set_bucket(int b); + void init(const char * title, TDate fromdate, int bucketsize); + TLista_dettagli(const char * title, TDate fromdate, int bucketsize, const char * head); + ~TLista_dettagli() {} +}; + + +class TLista_docref : public TLista_dettagli +{ + TRelation *_r; + TMSP_constraint * _line; + static const char *header(); protected: virtual void get_row(long r, TToken_string& row); - virtual long get_items() const; + virtual long get_items(int b) const; public: bool edit_checked(); - int get_bucket() {return _curr_bucket;} - void set_bucket(int b); - TLista_ordini(TMSP_constraint *l, const char * title, TDate fromdate, int bucketsize); - ~TLista_ordini(); -}; \ No newline at end of file + TLista_docref(TMSP_constraint * l, const char * title, TDate fromdate, int bucketsize); + ~TLista_docref(); +}; + + +class TLista_mastercodes : public TLista_dettagli +{ + TMSP_line2 *_line_art; + static const char *header(); +protected: + virtual void get_row(long r, TToken_string& row); + virtual long get_items(int b) const; +public: + TLista_mastercodes(TMSP_constraint *c, TToken_string &l, TDate fromdate, int bucketsize); + ~TLista_mastercodes() {} +}; + +class TLista_upperlines : public TLista_dettagli +{ + TMSP_constraint *_line; + static const char *header(); +protected: + virtual void get_row(long r, TToken_string& row); + virtual long get_items(int b) const; +public: + TLista_upperlines(TMSP_constraint *l, TDate fromdate, int bucketsize); + ~TLista_upperlines() {} +}; +#endif // __MR2201_H diff --git a/mr/mr2202.cpp b/mr/mr2202.cpp new file mode 100755 index 000000000..481d3750b --- /dev/null +++ b/mr/mr2202.cpp @@ -0,0 +1,430 @@ +#include "mr2200.h" +#include "mr2200a.h" +#include "mr2200b.h" + +void TPlanning_mask::print_exceptions(TExceptions_array &excepts) +{ + if (excepts.items()) + { + TPrinter& pr = printer(); + pr.open(); + + pr.setheaderhandler(print_except_header); + pr.headerlen(6); + pr.setfooterhandler(print_footer); + pr.footerlen(2); + + TString_array keys; + TToken_string key, lastkey; + TString tmp; + excepts.get_keys(keys); + keys.sort(); + int header=0; + for (int k=0; k< keys.items(); k++) + { + key = keys.row(k); + key.get(0,tmp); + if (tmp != lastkey.get(0)) + header = 0; + else if (key.get(1,tmp)&& tmp != lastkey.get(1)) + header = 0; + else if (key.get(2,tmp) && tmp != lastkey.get(2)) + header = 1; + else + header = 2; + const TException & e = (const TException &)excepts[key]; + const TMRP_line &line = e.mrpline(); + line.print_exception(e.from(), e.to(), e.qta(), header); + lastkey = key; + } + pr.close(); + } +} + +void TPlanning_mask::print_except_header(TPrinter& pr) +{ + TString format; + TPrintrow row; + print_header(pr); + row.put("@48G@BSTAMPA TABULATO ECCEZIONI DA M.S.P."); + pr.setheaderline(1,row); + row.reset(); + row.put((const char *)TString(131,'-')); + pr.setheaderline(4,row); +} + +void TPlanning_mask::print_articles() +{ + TString repname("mr2200"); + TSheet_field& sf = sfield(F_ARTICOLI); + const int nrows=sf.items(); + + TIsamtempfile * report = new TIsamtempfile(LF_MRPREPORT,repname, TRUE, TRUE ); + TString8 codimp,codlin; + TProgind pi(nrows, format("Stampa %s...",get_bool(F_MSCHEDULEPLAN)? + "Master Schedule Plan":"pianificazione ordini")); + char block='\0'; + const int a_buck0 = sf.cid2index(F_BUCKET0); + for (int r=0; rcurr(); + if (sf.cell_disabled(r, a_buck0 +2)) + { + if (r= 0; nbucket--) + { + switch(nbucket) + { + case 0: + campo = "QTAFIRST"; break; + case LAST_BUCKET: + campo = "QTALAST"; break; + default: + campo.format("QTA%d", nbucket); break; + } + record.put(campo, row.get(sf.cid2index(F_BUCKET0+nbucket*2))); + } + report->write(); + pi.addstatus(1); + } + TMSP_form form(report); + // stampa + if (form.cursor()->items() > 0) + { + TDate fd(starting_date()); + TDate td = get_date(F_ADATA); + const short first_id = 3; + const short last_id = 14; + short b = -1; + --fd; + TString descr; + descr.format("\nAl %s", (const char*)fd); + form.find_field('B', odd_page, first_id).set_col_head(descr); + for (;fd <= td;) + { + ++b; + ++fd; + descr.format("Dal %s\nAl ",(const char*)fd); + round_date(fd,TRUE,FALSE); + descr << fd.string(); + if (first_id+b+1 > last_id) + continue; + form.find_field('B', odd_page, first_id+b+1).set_col_head(descr); + } + ++td; + descr.format("Dal %s", (const char*)td); + if (b == LAST_BUCKET) + form.find_field('B', odd_page, first_id+b+1).set_col_head(descr); + const int hh = 7; + const int fl = printer().formlen(); + + int rows[4]; // Righe orizzontali + rows[0] = hh-3; + rows[1] = hh; + rows[2] = fl; + rows[3] = 0; + form.genera_intestazioni(odd_page, hh-2); + //FOrm.genera_fincatura(odd_page, hh-3, fl, rows); + form.print(); + } + // report non va cancellato, poiche' ne viene fatta la sostituzione nella relazione del form + // quindi la delete viene gia' fatta alla distruzione di _form +} + +void TPlanning_mask::print_capacities() +{ + TString repname("mr2200"); + TSheet_field& sf = sfield(F_LINEE); + const int nrows=sf.items(); + + TIsamtempfile * report = new TIsamtempfile(LF_MRPREPORT,repname, TRUE, FALSE ); + TString8 codimp,codlin; + TString codart; + TProgind pi(nrows, format("Stampa %s...",(*get(F_LOADTYPE)=='M')? + "carico macchina":"carico uomo")); + const int a_buck0 = sf.cid2index(F_LBUCKET0); + char block='\0'; + for (int r=0; r curr(); + record.zero(' '); + codimp=row.get(sf.cid2index(F_CODIMPCRP)); + codlin=row.get(sf.cid2index(F_CODLINCRP)); + codart=row.get(sf.cid2index(F_CODARTCRP)); + record.put("RIGA", r); + record.put("IMPIANTO", codimp); + record.put("LINEA", codlin); + record.put("CODART", codart); + char type('D'); + if (!codart.blank()) + type = 'A'; + else if (!codlin.blank()) + type = 'L'; + else if (!codimp.blank()) + type = 'I'; + const bool is_capacity = sf.cell_disabled(r, a_buck0 +2); + if (!is_capacity) + type = tolower(type); + record.put("TIPO",type); +// record.put("TIPOCF", row.get(sf.cid2index(F_TIPOCF_SHEET))); +// record.put("CODCLI", row.get(sf.cid2index(F_CLIENTE))); + record.put("UM", row.get(sf.cid2index(F_LUM))); + TString16 campo; + for (int b = LAST_BUCKET; b >= 0; b--) + { + switch(b) + { + case 0: + campo = "QTAFIRST"; break; + case LAST_BUCKET: + campo = "QTALAST"; break; + default: + campo.format("QTA%d", b); + } + record.put(campo, row.get(sf.cid2index(F_LBUCKET0+b*2))); + } + report->write(); + pi.addstatus(1); + } +// delete report; +// TIsamtempfile * report = new TIsamtempfile(LF_MRPREPORT,repname, FALSE, FALSE ); + TCRP_form form(report); + // stampa + if (form.cursor()->items() > 0) + form.print(); + // report non va cancellato, poiche' ne viene fatta la sostituzione nella relazione del form + // quindi la delete viene gia' fatta alla distruzione di _form +} + + +bool TPlanning_mask::find_exceptions(bool anticipi, bool posticipi, bool extra, TExceptions_array &e, bool verbose) +{ + + e.destroy(); + if (!get_bool(F_RESCHEDULING)) + { + _mrp_articles.destroy(); + if (verbose) + message_box("Rescheduling non abilitato"); + } + else if (load_MRP_lines(_rescheduling)) + { + const TSheet_field& sf = sfield(F_ARTICOLI); + const int bucket1 = sf.cid2index(F_BUCKET1); + // PER OGNI ARTICOLO ... + const long max_mrp_rows=_mrp_articles.items(); + TProgind pi=((max_mrp_rows+1)*LAST_BUCKET ,"Ricerca eccezioni...", TRUE, TRUE); + for (long mrp_row=0; mrp_row < max_mrp_rows; mrp_row++) + { + pi.addstatus(1); + if (pi.iscancelled()) + return FALSE; + TMRP_line &mrpline=_mrp_articles[mrp_row]; + mrpline.find_ad_excepts(anticipi, posticipi, e); + if (extra) + mrpline.find_extra_excepts(get_bool(F_NUMBERBYWEEK)||get_bool(F_NUMBERBYCLI), e); + } // ... for each article + } + if (verbose && e.items()<=0) + message_box("Nessuna eccezione rilevata"); + return e.items()>0; +} + + +TObject* TException::dup() const +{ + return new TException(_mrpline, _from, _to, _q); +} + +TException::TException(const TMRP_line * line, int from, int to, const real & q) : + _mrpline(line), _from(from), _to(to), _q(q) +{} + + +TExceptions_array::add(const TException & e) +{ + return add((TException *)e.dup()); +} + +TExceptions_array::add(TException * e) +{ + const TMRP_line & line = e->mrpline(); + TToken_string key; + key.add(line.articolo()); + key.add(line.livgiac()); + key.add(format("%04d",e->from())); + key.add(format("%04d",e->from()==e->to() ? 9999 : e->to())); + key.add(line.codimp()); + key.add(line.codlin()); + key.add(line.codmagdep()); + key.add(line.codmagdep_coll()); + return TAssoc_array::add((const char *)key, e); +} + +bool TMRP_line::find_ad_excepts(bool anticipi, bool posticipi, TExceptions_array &e) +{ + bool some=FALSE; + real totplan,movable,diff; + // PER OGNI BUCKET ... + int last(last_bucket()), first=0; + for (int nbucket = 0; nbucket <= last; nbucket++) + { + const real & sr=sched_receipts(nbucket); + const real & ro=resched_orders(nbucket); + const real & uo=unsched_orders(nbucket); + const real & pl=planned_orders(nbucket); + totplan = planned_orders(nbucket) - sched_receipts(nbucket) - resched_orders(nbucket) + unsched_orders(nbucket); + if (totplan.sign() > 0) + { + for (int pivot = first; totplan.sign() > 0 && pivot <= last; pivot++) if (nbucket != pivot) + { + const real & sr=sched_receipts(pivot); + const real & ro=resched_orders(pivot); + const real & uo=unsched_orders(pivot); + const real & pl=planned_orders(pivot); + movable = sched_receipts(pivot); + if (nbucket > pivot) // posticipo solo se non devo poi ripianificare il pivot + movable -= planned_orders(pivot); + movable -= unsched_orders(pivot); + if (movable.sign() > 0) // + { + first = pivot; + diff = fnc_min(movable, totplan); + add_unsched_ord(pivot, diff); + add_resched_ord(nbucket, diff); + totplan -= diff; + movable -= diff; + if (pivot > nbucket && anticipi || pivot < nbucket && posticipi) + { + e.add(new TException(this, pivot, nbucket, diff)); + some = TRUE; + } + } + if (movable.sign() <= 0) // + first++; + } // ..look for available sched. receipts to move + } + } // ... for each bucket + return some; +} + +bool TMRP_line::find_extra_excepts(bool fixdoc, TExceptions_array &e) +{ + bool some=FALSE; + real totplan,movable,diff; + // PER OGNI BUCKET ... + for (int nbucket = 1; nbucket <= last_bucket(); nbucket++) + { + const real & sr=sched_receipts(nbucket); + const real & ro=resched_orders(nbucket); + const real & uo=unsched_orders(nbucket); + const real & pl=planned_orders(nbucket); + totplan = planned_orders(nbucket) - sched_receipts(nbucket) - resched_orders(nbucket) + unsched_orders(nbucket); + bool ex = totplan.sign() < 0; // troppa roba + if (totplan.sign() > 0 && fixdoc) // + ex = sr>0; + if (ex) + { + diff = -totplan; + e.add(new TException(this, nbucket, nbucket, diff)); + some = TRUE; + } + } // ... for each bucket + return some; +} + +void TMRP_line::print_exception(int from, int to, const real &diff, int header) const +{ + TPrinter& pr = printer(); + if (!pr.isopen()) + pr.open(); + TPrintrow prow; + + TToken_string code(articolo()); + TDate fromdate=time(from).date(); + TDate todate=time(to).date(); + if (header <= 0) + { + pr.print(prow); + prow.put(format("@bArticolo %s %s", (const char *)articolo(), (const char *)cache().get(LF_ANAMAG, code).get(ANAMAG_DESCR))); + pr.print(prow); + prow.reset(); + if (livelli_giacenza().enabled()) + { + int pos=0; + for (int l= 1; l <= livelli_giacenza().last_level(); l++) + { + prow.put(format("@%dg%s %s",pos,(const char *)livelli_giacenza().name(l), + (const char *)livgiac(l))); + pos += livelli_giacenza().name(l).len()+1; + pos += livgiac(l).len()+1; + } + pr.print(prow); + prow.reset(); + } + } + if (header <= 1) + { + prow.put(format("Ordini emessi con scadenza entro il @41g%s", (const char *)fromdate.string())); + pr.print(prow); + prow.reset(); + // stampa dettaglio ordini + TMRP_docrefs * docrefs = record(from).scheduls_refs(); + CHECK(docrefs,"Errore: rischedulazione senza riferimenti"); + const int nrefs=docrefs->items(); + for (int nref = 0; nref < nrefs; nref++) + { + TMRP_docref & docref = docrefs->get_ref(nref); + prow.put(format("@2gDocumento %s %4d n.%8ld riga %d %s %s", + (const char *)docref.codnumdoc(),docref.annodoc(),docref.numdoc(),docref.numrig(), + (const char *)docref.qta_residua().string(18,3),(const char *)docref.um())); + pr.print(prow); + prow.reset(); + } + } + code.add("1"); + TString um =cache().get(LF_UMART,code).get("UM"); + real v = abs(diff); + prow.put(format("@2g%s %s %s", (from == to) ? + (diff.sign()>0 ? "Eliminare " : "Aggiungere " ): + (from < to ? "Posticipare" : "Anticipare "), + (const char *)v.string(18,3), (const char *)um)); + if (from != to) + { + prow.put(format("@38gal %s", (const char *)todate.string())); + } + pr.print(prow); +} + diff --git a/mr/mr2url.h b/mr/mr2url.h index fd1f6d664..771e26853 100755 --- a/mr/mr2url.h +++ b/mr/mr2url.h @@ -17,4 +17,6 @@ #define USER_BMP_SELECT_ORDF 1701 #define USER_BMP_ORDINI_INPUT 1801 #define USER_BMP_ORDINI_OUTPUT 1802 +#define USER_BMP_VINCOLI_INPUT 1803 +#define USER_BMP_VINCOLI_OUTPUT 1804 diff --git a/mr/mrplib.cpp b/mr/mrplib.cpp index 39500e86b..365bb35f7 100755 --- a/mr/mrplib.cpp +++ b/mr/mrplib.cpp @@ -551,8 +551,9 @@ int TMRP_calendar::add_oremacchina(real & var,const TDate& date, bool max) } minuti += lungturno; } - var +=(minuti / 60.0 ); - return int(minuti / 60.0 ); + minuti /= 60.0; + var +=(minuti); + return int(minuti.integer()); } int TMRP_calendar::add_oremacchina_max(real & var,const TDate& date) @@ -1350,16 +1351,6 @@ TImpianto * TLinea_prod::get_impianto() const return NULL; } -static TCodgiac_livelli *_livelli=NULL; - -TCodgiac_livelli &livelli_giac() -{ - if (_livelli==NULL) - _livelli=new TCodgiac_livelli(); - return *_livelli; -} - - void find_price(const TString &tipocv, const TString &codcv, const TString &codcatven, const char *tipocf, long codcf, const char * codice, const real & qta, real & price) diff --git a/mr/mrplib.h b/mr/mrplib.h index e0b48bedc..ac9c1b992 100755 --- a/mr/mrplib.h +++ b/mr/mrplib.h @@ -150,7 +150,7 @@ class TMRP_time : public TSortable { static TAssoc_array _frate_indovino; - TString16 _imp, _lin; + TString8 _imp, _lin; TDate _date; int _hour; @@ -160,6 +160,11 @@ class TMRP_time : public TSortable public: static TMRP_calendar& get_calendar(const char* codimp=NULL,const char* ccodlin=NULL); + const TString& impianto() const {return _imp;} + const TString& linea() const {return _lin;} + const TDate& date() const { return _date; } + int hour() const { return _hour; } + virtual int compare(const TSortable& s) const; TMRP_time& add_time(int days, long hours = 0, bool macchina=TRUE); @@ -168,7 +173,6 @@ public: void set(const TDate& d, int h, const char* imp, const char* lin); TMRP_time& operator=(const TMRP_time& t) { copy(t); return *this; } - const TDate& date() const { return _date; } TMRP_time(); TMRP_time(const TDate& d, int h, const char* imp, const char* lin); @@ -294,7 +298,6 @@ public: TImpianto * get_impianto(const char * codice); TLinea_prod* get_linea(const char * codice); -TCodgiac_livelli &livelli_giac(); void find_price(const TString &tipocv, const TString &codcv, const TString &codcatven, const char * tipocf, long codcf, const char * codice, const real & qta, real & price); diff --git a/or/or1200a.frm b/or/or1200a.frm new file mode 100755 index 000000000..e538ee037 --- /dev/null +++ b/or/or1200a.frm @@ -0,0 +1,323 @@ +// Form per la stampa dettaglio disponibilita' articoli +#include "or1200a.h" +// Cursor sorting on main file is set also in application (LIVELLO[]+CODMAG[]) +USE LF_RIGHEDOC BY CODART CODNUM ANNO PROVV NDOC +JOIN LF_DOC INTO CODNUM==CODNUM ANNO==ANNO PROVV==PROVV NDOC==NDOC +JOIN LF_ANAMAG INTO CODART==CODART +END + +DESCRIPTION +BEGIN +END + + +GENERAL +BEGIN + OFFSET 0 0 +END + + +SECTION HEADER ODD 7 + +STRINGA 1 40 1 +BEGIN + KEY "nome ditta" + PROMPT 1 1 "Ditta " + MESSAGE _DITTA, !RAGSOC +END + +STRINGA 2 10 +BEGIN + KEY "Data" + PROMPT 106 1 "Data " + MESSAGE _TODAY +END + +NUMERO 3 7 +BEGIN + KEY "Nr. pagina" + PROMPT 122 1 "Pagina " + MESSAGE _PAGENO +END + +NUMERO 4 40 +BEGIN + KEY "Intestazione stampa" + PROMPT 60 2 "Stampa dettaglio disponibilita' articoli" +END + +END //HEADER + + +SECTION BODY ODD 2 COLUMNWISE + +STRING 1 20 +BEGIN + SPECIAL STRINGA INTESTAZIONE "Codice" "Codice" + SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" + SPECIAL STRINGA FINCATURA "X " "Fincatura sinistra e destra" + KEY "Codice" + PROMPT 1 1 "" + FIELD CODART + MESSAGE _ORDINE,CALCDISP,RESET +END + +STRING 2 30 2 +BEGIN + SPECIAL STRINGA INTESTAZIONE "Descrizione" "Descrizione" + SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" + SPECIAL STRINGA FINCATURA " X" "Fincatura sinistra e destra" + KEY "Descrizione" + PROMPT 2 1 "" + MESSAGE _ORDINE,DESCRIZIONE +END + +STRINGA 3 4 +BEGIN + SPECIAL STRINGA INTESTAZIONE "UM" "UM" + SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" + SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" + KEY "Unita' di misura" + PROMPT 3 1 "" + MESSAGE _ORDINE,CALCDISP,PRNUM // Stampa l'unita' di misura principale +END + +STRINGA 4 15 +BEGIN + SPECIAL STRINGA INTESTAZIONE "Giac. prev." "Giac. prev." + SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" + SPECIAL STRINGA FINCATURA "X " "Fincatura sinistra e destra" + KEY "Giacenza prevista (1)" // Solo intestazione + PROMPT 4 1 "" +END + +STRINGA 5 15 +BEGIN + SPECIAL STRINGA INTESTAZIONE "Sottoscorta" "Sottoscorta" + SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" + SPECIAL STRINGA FINCATURA " X" "Fincatura sinistra e destra" + KEY "Sottoscorta(1)" // Solo intestazione + PROMPT 5 1 "" +END + +STRINGA 6 15 +BEGIN + SPECIAL STRINGA INTESTAZIONE "Giac. prev." "Giac. prev." + SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" + SPECIAL STRINGA FINCATURA "X " "Fincatura sinistra e destra" + KEY "Giacenza prevista (2)" // Solo intestazione + PROMPT 6 1 "" +END + +STRINGA 7 15 +BEGIN + SPECIAL STRINGA INTESTAZIONE "Sottoscorta" "Sottoscorta" + SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" + SPECIAL STRINGA FINCATURA " X" "Fincatura sinistra e destra" + KEY "Sottoscorta(2)" // Solo intestazione + PROMPT 7 1 "" +END + +STRINGA 8 15 +BEGIN + SPECIAL STRINGA INTESTAZIONE "Giac. prev." "Giac. prev." + SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" + SPECIAL STRINGA FINCATURA "X " "Fincatura sinistra e destra" + KEY "Giacenza prevista (3)" // Solo intestazione + PROMPT 8 1 "" +END + +STRINGA 9 15 +BEGIN + SPECIAL STRINGA INTESTAZIONE "Sottoscorta" "Sottoscorta" + SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" + SPECIAL STRINGA FINCATURA " X" "Fincatura sinistra e destra" + KEY "Sottoscorta(3)" // Solo intestazione + PROMPT 9 1 "" +END + +STRINGA 10 15 +BEGIN + SPECIAL STRINGA INTESTAZIONE "Giac. prev." "Giac. prev." + SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" + SPECIAL STRINGA FINCATURA "X " "Fincatura sinistra e destra" + KEY "Giacenza prevista (4)" // Solo intestazione + PROMPT 10 1 "" +END + +STRINGA 11 15 +BEGIN + SPECIAL STRINGA INTESTAZIONE "Sottoscorta" "Sottoscorta" + SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" + SPECIAL STRINGA FINCATURA " X" "Fincatura sinistra e destra" + KEY "Sottoscorta(4)" // Solo intestazione + PROMPT 11 1 "" +END + +STRINGA 12 15 +BEGIN + SPECIAL STRINGA INTESTAZIONE "Giac. prev." "Giac. prev." + SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" + SPECIAL STRINGA FINCATURA "X " "Fincatura sinistra e destra" + KEY "Giacenza prevista (5)" // Solo intestazione + PROMPT 12 1 "" +END + +STRINGA 13 15 +BEGIN + SPECIAL STRINGA INTESTAZIONE "Sottoscorta" "Sottoscorta" + SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" + SPECIAL STRINGA FINCATURA " X" "Fincatura sinistra e destra" + KEY "Sottoscorta(5)" // Solo intestazione + PROMPT 13 1 "" +END + +STRINGA 14 15 +BEGIN + SPECIAL STRINGA INTESTAZIONE "Giac. prev." "Giac. prev." + SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" + SPECIAL STRINGA FINCATURA "X " "Fincatura sinistra e destra" + KEY "Giacenza prevista (6)" // Solo intestazione + PROMPT 14 1 "" +END + +STRINGA 15 15 +BEGIN + SPECIAL STRINGA INTESTAZIONE "Sottoscorta" "Sottoscorta" + SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" + SPECIAL STRINGA FINCATURA " X" "Fincatura sinistra e destra" + KEY "Sottoscorta(6)" // Solo intestazione + PROMPT 15 1 "" +END + +// Sta sezzzzzione serve per ciclare/raggruppare sulle righe articolo (tenendo conto anche di livelli/depositi/magazzini) +// In modo da settare la tabella riepilogativa per data, che viene mestamente stampata dopo la sezione, e quindi +// resettata per gli elementi successivi. Once again, the dorkery network. +SECTION ARTICOLI 1 0 0 FILE LF_RIGHEDOC GROUP CODART + STRINGA 101 10 + BEGIN + PROMPT 1 1 "" + KEY "Colonna finta per invocare il messaggio di calcolo" + MESSAGE _ORDINE,CALCDISP,CALC + END +END // End section + +STRING 51 20 +BEGIN + PROMPT 1 1 "" + SPECIAL STRINGA FINCATURA "X " "Fincatura sinistra e destra" + FLAGS "D" +END + +STRING 52 30 2 +BEGIN + PROMPT 2 1 "" + SPECIAL STRINGA FINCATURA " X" "Fincatura sinistra e destra" + FLAGS "D" +END + +STRINGA 53 4 +BEGIN + PROMPT 3 1 "" + FLAGS "D" +END + +NUMERO 54 15 +BEGIN + PROMPT 4 1 "" + SPECIAL STRINGA FINCATURA "X " "Fincatura sinistra e destra" + MESSAGE _ORDINE,CALCDISP,PRNGIAC,1 // Stampa la giacenza per il primo periodo + PICTURE "########@,@@@@@" +END + +NUMERO 55 15 +BEGIN + PROMPT 5 1 "" + SPECIAL STRINGA FINCATURA " X" "Fincatura sinistra e destra" + MESSAGE _ORDINE,CALCDISP,PRNSOTT,1 // Stampa la situazione di sottoscorta per il primo periodo + PICTURE "########@,@@@@@" +END + +NUMERO 56 15 +BEGIN + PROMPT 6 1 "" + SPECIAL STRINGA FINCATURA "X " "Fincatura sinistra e destra" + MESSAGE _ORDINE,CALCDISP,PRNGIAC,2 // Secondo periodo + PICTURE "########@,@@@@@" +END + +NUMERO 57 15 +BEGIN + PROMPT 7 1 "" + SPECIAL STRINGA FINCATURA " X" "Fincatura sinistra e destra" + MESSAGE _ORDINE,CALCDISP,PRNSOTT,2 // Secondo periodo + PICTURE "########@,@@@@@" +END + +NUMERO 58 15 +BEGIN + PROMPT 8 1 "" + SPECIAL STRINGA FINCATURA "X " "Fincatura sinistra e destra" + MESSAGE _ORDINE,CALCDISP,PRNGIAC,3 // terzo... + PICTURE "########@,@@@@@" +END + +NUMERO 59 15 +BEGIN + PROMPT 9 1 "" + SPECIAL STRINGA FINCATURA " X" "Fincatura sinistra e destra" + MESSAGE _ORDINE,CALCDISP,PRNSOTT,3 + PICTURE "########@,@@@@@" +END + +NUMERO 60 15 +BEGIN + PROMPT 10 1 "" + SPECIAL STRINGA FINCATURA "X " "Fincatura sinistra e destra" + MESSAGE _ORDINE,CALCDISP,PRNGIAC,4 + PICTURE "########@,@@@@@" +END + +NUMERO 61 15 +BEGIN + PROMPT 11 1 "" + SPECIAL STRINGA FINCATURA " X" "Fincatura sinistra e destra" + MESSAGE _ORDINE,CALCDISP,PRNSOTT,4 + PICTURE "########@,@@@@@" +END + +NUMERO 62 15 +BEGIN + PROMPT 12 1 "" + SPECIAL STRINGA FINCATURA "X " "Fincatura sinistra e destra" + MESSAGE _ORDINE,CALCDISP,PRNGIAC,5 + PICTURE "########@,@@@@@" +END + +NUMERO 63 15 +BEGIN + PROMPT 13 1 "" + SPECIAL STRINGA FINCATURA " X" "Fincatura sinistra e destra" + MESSAGE _ORDINE,CALCDISP,PRNSOTT,5 + PICTURE "########@,@@@@@" +END + +NUMERO 64 15 +BEGIN + PROMPT 14 1 "" + SPECIAL STRINGA FINCATURA "X " "Fincatura sinistra e destra" + MESSAGE _ORDINE,CALCDISP,PRNGIAC,6 + PICTURE "########@,@@@@@" +END + +NUMERO 65 15 +BEGIN + PROMPT 15 1 "" + SPECIAL STRINGA FINCATURA " X" "Fincatura sinistra e destra" + MESSAGE _ORDINE,CALCDISP,PRNSOTT,6 + PICTURE "########@,@@@@@" +END + +END // End of Body + + diff --git a/or/or1200a.h b/or/or1200a.h new file mode 100755 index 000000000..dd97731ad --- /dev/null +++ b/or/or1200a.h @@ -0,0 +1,42 @@ +// Defines per maschera + +#define F_TIPO 101 +#define F_CODNUM 102 +#define F_ANNO 103 +#define F_PROVV 104 +#define F_DATAOSS 105 +#define F_ARTFROM 106 +#define F_ARTTO 107 +#define F_PERIODS 108 +#define F_RIGHETUTTE 109 +#define F_DATE_H 110 +#define F_DETAIL_LEV 111 +#define F_DETAIL_MAG 112 +#define F_DETAIL_DEP 113 +#define F_GIAC1 114 +#define F_GIAC1_DES 115 +#define F_GIAC1_FROM 116 +#define F_GIAC1_TO 117 +#define F_GIAC2 118 +#define F_GIAC2_DES 119 +#define F_GIAC2_FROM 120 +#define F_GIAC2_TO 121 +#define F_GIAC3 122 +#define F_GIAC3_DES 123 +#define F_GIAC3_FROM 124 +#define F_GIAC3_TO 125 +#define F_GIAC4 126 +#define F_GIAC4_DES 127 +#define F_GIAC4_FROM 128 +#define F_GIAC4_TO 129 +#define F_MAGFROM 130 +#define F_MAGTO 131 +#define F_DEPFROM 132 +#define F_DEPTO 133 +#define F_GIACEFF 134 +#define F_VALCOMP 135 + +// defines di gruppi +#define GR_GIAC 1 +#define GR_DEP 2 + diff --git a/or/or1200a.uml b/or/or1200a.uml new file mode 100755 index 000000000..2ba540c32 --- /dev/null +++ b/or/or1200a.uml @@ -0,0 +1,429 @@ +#include "or1200a.h" + +TOOLBAR "" 0 19 0 4 + +BUTTON DLG_PRINT 10 2 +BEGIN + PROMPT -12 -1 "" +END + +BUTTON DLG_QUIT 10 2 +BEGIN + PROMPT -22 -1 "" +END + +ENDPAGE + +PAGE "Disponibilita' articoli" -1 -1 70 16 + +GROUPBOX DLG_NULL 40 5 +BEGIN + PROMPT 1 1 "Ordine" +END + +/* +STRING F_CODNUM 4 +BEGIN + PROMPT 2 2 "Codice Num. " + FLAG "U" + USE %NUM SELECT I1==3 + INPUT CODTAB F_CODNUM + DISPLAY "Cod. Num." CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_CODNUM CODTAB + CHECKTYPE REQUIRED +END +*/ + +NUMBER F_ANNO 4 +BEGIN + PROMPT 2 2 "Anno " + CHECKTYPE REQUIRED +END + +LIST F_PROVV 12 +BEGIN + PROMPT 2 3 "Tipo numerazione " + ITEM "D|Definitiva" + ITEM "P|Provvisoria" +END + +DATE F_DATE_H +BEGIN + FLAGS "AH" + PROMTP 2 4 "" +END + +DATE F_DATAOSS +BEGIN + PROMPT 2 4 "Data osservazione " + VALIDATE DATE_CMP_FUNC >= F_DATE_H + WARNING "La data osservazione deve essere minore della data attuale" +END + +NUMBER F_DETAIL_LEV 1 +BEGIN + PROMPT 45 2 "Livello dettaglio " + GROUP GR_GIAC + USE FCG + INPUT CODTAB F_DETAIL_LEV + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione livello@50" S0 + OUTPUT F_DETAIL_LEV CODTAB + CHECKTYPE NORMAL +END + +BOOLEAN F_DETAIL_MAG +BEGIN + PROMPT 45 3 "Dettaglia magazzini" +END + +BOOLEAN F_DETAIL_DEP +BEGIN + PROMPT 45 4 "Dettaglia depositi" + GROUP GR_DEP +END + +LISTBOX F_PERIODS 1 +BEGIN + PROMPT 2 7 "Numero periodi " + ITEM "1|1" + ITEM "2|2" + ITEM "3|3" + ITEM "4|4" + ITEM "5|5" + ITEM "6|6" +END + +LIST F_RIGHETUTTE 12 +BEGIN + PROMPT 2 8 "Tipo righe ordine " + ITEM "T|Tutte" + ITEM "O|Da ordinare" +END + +GROUPBOX DLG_NULL 30 4 +BEGIN + PROMPT 1 10 "Articolo" +END + +STRING F_ARTFROM 20 +BEGIN + PROMPT 2 11 "Dal " + FLAGS "U" + USE LF_ANAMAG + INPUT CODART F_ARTFROM + DISPLAY "Codice@20" CODART + DISPLAY "Descrizione@50" DESCR + OUTPUT F_ARTFROM CODART + CHECKTYPE NORMAL + ADD RUN ve2 -3 +END + +STRING F_ARTTO 20 +BEGIN + PROMPT 2 12 "Al " + FLAGS "U" + USE LF_ANAMAG + INPUT CODART F_ARTTO + DISPLAY "Codice@20" CODART + DISPLAY "Descrizione@50" DESCR + OUTPUT F_ARTTO CODART + CHECKTYPE NORMAL + ADD RUN ve2 -3 +END + +BOOLEAN F_GIACEFF +BEGIN + PROMPT 36 11 "Giacenza effettiva" +END + +BOOLEAN F_VALCOMP +BEGIN + PROMPT 36 12 "Valorizza componenti" +END + +GROUPBOX DLG_NULL 30 4 +BEGIN + PROMPT 1 15 "Magazzino" +END + +STRING F_MAGFROM 3 +BEGIN + PROMPT 2 16 "Dal " + FLAGS "U" + USE MAG SELECT CODTAB[4,5]=="" + INPUT CODTAB F_MAGFROM + DISPLAY "Codice " CODTAB[1,3] + DISPLAY "Denominazione mag.@50 " S0 + OUTPUT F_MAGFROM CODTAB[1,3] + CHECKTYPE NORMAL +END + +STRING F_MAGTO 3 +BEGIN + PROMPT 2 17 "Al " + FLAGS "U" + USE MAG SELECT CODTAB[4,5]=="" + INPUT CODTAB F_MAGTO + DISPLAY "Codice " CODTAB[1,3] + DISPLAY "Denominazione mag.@50 " S0 + OUTPUT F_MAGTO CODTAB[1,3] + CHECKTYPE NORMAL +END + +GROUPBOX DLG_NULL 40 4 +BEGIN + PROMPT 35 15 "Deposito" +END + +STRING F_DEPFROM 2 +BEGIN + PROMPT 36 16 "Dal " + FLAGS "U" + USE MAG SELECT CODTAB[4,5]!="" + INPUT CODTAB[1,3] F_MAGFROM + INPUT CODTAB[4,5] F_DEPFROM + DISPLAY "Codice " CODTAB + DISPLAY "Denominazione dep.@50 " S0 + OUTPUT F_MAGFROM CODTAB[1,3] + OUTPUT F_DEPFROM CODTAB[4,5] + CHECKTYPE NORMAL + GROUP GR_DEP +END + +STRING F_DEPTO 2 +BEGIN + PROMPT 36 17 "Al " + FLAGS "U" + USE MAG SELECT CODTAB[4,5]!="" + INPUT CODTAB[1,3] F_MAGTO + INPUT CODTAB[4,5] F_DEPTO + DISPLAY "Codice " CODTAB + DISPLAY "Denominazione mag.@50 " S0 + OUTPUT F_MAGTO CODTAB[1,3] + OUTPUT F_DEPTO CODTAB[4,5] + CHECKTYPE NORMAL + GROUP GR_DEP +END + +ENDPAGE + +PAGE "Livelli giacenza" -1 -1 78 20 + +GROUPBOX DLG_NULL 74 10 +BEGIN + PROMPT 2 2 "Livelli di giacenza" +END + +STRING F_GIAC1 1 +BEGIN + PROMPT 3 3 "1. " + FLAGS "DP" + USE FCG + INPUT CODTAB[1,1] F_GIAC1 + OUTPUT F_GIAC1_DES S0 + CHECKTYPE NORMAL +END + +STRING F_GIAC1_DES 60 +BEGIN + PROMPT 12 3 "" + FLAGS "D" +END + +STRING F_GIAC1_FROM 24 +BEGIN + PROMPT 12 4 "Da " + FLAGS "D" + KEY 1 + USE GCG SELECT CODTAB[1,1]=#F_GIAC1 + JOIN FCG ALIAS 500 INTO CODTAB==CODTAB[1,1] + INPUT CODTAB[1,1] F_GIAC1 + INPUT CODTAB[2,25] F_GIAC1_FROM + DISPLAY "N.Liv." CODTAB[1,1] + DISPLAY "Livello@20 " 500@->S0 + DISPLAY "Codice@23" CODTAB[2,25] + DISPLAY "Descrizione@50 " GCG->S0 + OUTPUT F_GIAC1_FROM CODTAB[2,25] + CHECKTYPE SEARCH + GROUP GR_GIAC +END + +STRING F_GIAC1_TO 23 +BEGIN + PROMPT 47 4 "A " + FLAGS "D" + KEY 1 + USE GCG SELECT CODTAB[1,1]=#F_GIAC1 + JOIN FCG ALIAS 500 INTO CODTAB==CODTAB[1,1] + INPUT CODTAB[1,1] F_GIAC1 + INPUT CODTAB[2,25] F_GIAC1_TO + DISPLAY "N.Liv." CODTAB[1,1] + DISPLAY "Livello@20 " 500@->S0 + DISPLAY "Codice@23" CODTAB[2,25] + DISPLAY "Descrizione@50 " GCG->S0 + OUTPUT F_GIAC1_TO CODTAB[2,25] + CHECKTYPE SEARCH + GROUP GR_GIAC +END + +STRING F_GIAC2 1 +BEGIN + PROMPT 3 5 "2. " + FLAGS "DP" + USE FCG + INPUT CODTAB[1,1] F_GIAC2 + OUTPUT F_GIAC2_DES S0 + CHECKTYPE NORMAL +END + +STRING F_GIAC2_DES 60 +BEGIN + PROMPT 12 5 "" + FLAGS "D" +END + +STRING F_GIAC2_FROM 23 +BEGIN + PROMPT 12 6 "Da " + FLAGS "D" + KEY 1 + USE GCG SELECT CODTAB[1,1]=#F_GIAC2 + JOIN FCG ALIAS 500 INTO CODTAB==CODTAB[1,1] + INPUT CODTAB[1,1] F_GIAC2 + INPUT CODTAB[2,25] F_GIAC2_FROM + DISPLAY "N.Liv." CODTAB[1,1] + DISPLAY "Livello@20 " 500@->S0 + DISPLAY "Codice@23" CODTAB[2,25] + DISPLAY "Descrizione@50 " GCG->S0 + OUTPUT F_GIAC2_FROM CODTAB[2,25] + CHECKTYPE SEARCH + GROUP GR_GIAC +END + +STRING F_GIAC2_TO 23 +BEGIN + PROMPT 47 6 "A " + FLAGS "D" + KEY 1 + USE GCG SELECT CODTAB[1,1]=#F_GIAC2 + JOIN FCG ALIAS 500 INTO CODTAB==CODTAB[1,1] + INPUT CODTAB[1,1] F_GIAC2 + INPUT CODTAB[2,25] F_GIAC2_TO + DISPLAY "N.Liv." CODTAB[1,1] + DISPLAY "Livello@20 " 500@->S0 + DISPLAY "Codice@23" CODTAB[2,25] + DISPLAY "Descrizione@50 " GCG->S0 + OUTPUT F_GIAC2_TO CODTAB[2,25] + CHECKTYPE SEARCH + GROUP GR_GIAC +END + +STRING F_GIAC3 1 +BEGIN + PROMPT 3 7 "3. " + USE FCG + INPUT CODTAB[1,1] F_GIAC3 + OUTPUT F_GIAC3_DES S0 + CHECKTYPE NORMAL + FLAGS "DP" +END + +STRING F_GIAC3_DES 60 +BEGIN + PROMPT 12 7 "" + FLAGS "D" +END + +STRING F_GIAC3_FROM 23 +BEGIN + PROMPT 12 8 "Da " + FLAGS "D" + KEY 1 + USE GCG SELECT CODTAB[1,1]=#F_GIAC3 + JOIN FCG ALIAS 500 INTO CODTAB==CODTAB[1,1] + INPUT CODTAB[1,1] F_GIAC3 + INPUT CODTAB[2,25] F_GIAC3_FROM + DISPLAY "N.Liv." CODTAB[1,1] + DISPLAY "Livello@20 " 500@->S0 + DISPLAY "Codice@23" CODTAB[2,25] + DISPLAY "Descrizione@50 " GCG->S0 + OUTPUT F_GIAC3_FROM CODTAB[2,25] + CHECKTYPE SEARCH + GROUP GR_GIAC +END + +STRING F_GIAC3_TO 23 +BEGIN + PROMPT 47 8 "A " + FLAGS "D" + KEY 1 + USE GCG SELECT CODTAB[1,1]=#F_GIAC3 + JOIN FCG ALIAS 500 INTO CODTAB==CODTAB[1,1] + INPUT CODTAB[1,1] F_GIAC3 + INPUT CODTAB[2,25] F_GIAC3_TO + DISPLAY "N.Liv." CODTAB[1,1] + DISPLAY "Livello@20 " 500@->S0 + DISPLAY "Codice@23" CODTAB[2,25] + DISPLAY "Descrizione@50 " GCG->S0 + OUTPUT F_GIAC3_TO CODTAB[2,25] + CHECKTYPE SEARCH + GROUP GR_GIAC +END + +STRING F_GIAC4 1 +BEGIN + PROMPT 3 9 "4. " + USE FCG + INPUT CODTAB[1,1] F_GIAC4 + OUTPUT F_GIAC4_DES S0 + CHECKTYPE NORMAL + FLAGS "DP" +END + +STRING F_GIAC4_DES 60 +BEGIN + PROMPT 12 9 "" + FLAGS "D" +END + +STRING F_GIAC4_FROM 23 +BEGIN + PROMPT 12 10 "Da " + FLAGS "D" + KEY 1 + USE GCG SELECT CODTAB[1,1]=#F_GIAC4 + JOIN FCG ALIAS 500 INTO CODTAB==CODTAB[1,1] + INPUT CODTAB[1,1] F_GIAC4 + INPUT CODTAB[2,25] F_GIAC4_FROM + DISPLAY "N.Liv." CODTAB[1,1] + DISPLAY "Livello@20 " 500@->S0 + DISPLAY "Codice@23" CODTAB[2,25] + DISPLAY "Descrizione@50 " GCG->S0 + OUTPUT F_GIAC4_FROM CODTAB[2,25] + CHECKTYPE SEARCH + GROUP GR_GIAC +END + +STRING F_GIAC4_TO 23 +BEGIN + PROMPT 47 10 "A " + FLAGS "D" + KEY 1 + USE GCG SELECT CODTAB[1,1]=#F_GIAC4 + JOIN FCG ALIAS 500 INTO CODTAB==CODTAB[1,1] + INPUT CODTAB[1,1] F_GIAC4 + INPUT CODTAB[2,25] F_GIAC4_TO + DISPLAY "N.Liv." CODTAB[1,1] + DISPLAY "Livello@20 " 500@->S0 + DISPLAY "Codice@23" CODTAB[2,25] + DISPLAY "Descrizione@50 " GCG->S0 + OUTPUT F_GIAC4_TO CODTAB[2,25] + GROUP GR_GIAC +END + +ENDPAGE + +ENDMASK + diff --git a/or/orlib.h b/or/orlib.h new file mode 100755 index 000000000..6c4ad7543 --- /dev/null +++ b/or/orlib.h @@ -0,0 +1,49 @@ +#include +#include +#include +#include +#include "../cg/cglib01.h" +#include "../ve/velib.h" +#include "../mg/mglib.h" + +class _TTotale_valuta : public TObject +{ + real _totord, _totres; + int _secnum; +public: + real& totord() { return _totord;} + real& totres() { return _totres;} + int& secnum() { return _secnum;} + _TTotale_valuta () {}; +}; + +// Form per la stampa ordini +class TOrdine_form : public TForm +{ + int _level; + TString16 + _codmag, + _livello; + bool _detail_mag, _detail_dep, + _giac_eff, _val_comp, + _normale; // Se TRUE e' una stampa normale, ovvero stampa ordini per cli/fo/agente etc. + // Se FALE e' una stampa disponibilita' articoli + TArray* _date_array; // Do not delete: e' passato dall'applicazione + TArray _totdisp; // Array di elementi per la stampa disponibilita' + TCodgiac_livelli * _codgiac; + TTable *_fcg; + TArticolo_giacenza *_art_giac; + TEsercizi_contabili *_esercizi; + TAssoc_array _totvaluta; + + protected: + virtual bool validate(TForm_item &, TToken_string &); // gestione dei messaggi estesi nei campi + const int find_period(const TDate&); + public: + bool genera_intestazione_supplementare(pagetype p, short y); + void set_options(int lev, bool mag, bool dep, bool giac_eff = FALSE, bool val_comp = FALSE, TArray* da = NULL) + { _level = lev; _detail_mag = mag; _detail_dep = dep; _giac_eff = giac_eff; _val_comp = val_comp; _date_array = da; _normale = da == NULL;} + TOrdine_form(const char* name); + virtual ~TOrdine_form() ; +}; + diff --git a/or/orlib01.cpp b/or/orlib01.cpp new file mode 100755 index 000000000..baedabcb9 --- /dev/null +++ b/or/orlib01.cpp @@ -0,0 +1,389 @@ +#include "orlib.h" +#include "or1100a.h" + +// Prima colonna quantita' nel form per stampa disponibilita' +#define COL1 4 + +TOrdine_form::TOrdine_form(const char* name) : TForm(name) +{ + _art_giac = new TArticolo_giacenza; + _esercizi = new TEsercizi_contabili; + _fcg = new TTable("FCG"); + _codgiac = new TCodgiac_livelli; +} + +TOrdine_form::~TOrdine_form() +{ + delete _codgiac; + delete _fcg; + delete _esercizi; + delete _art_giac; +} + +const int TOrdine_form::find_period(const TDate& dc) +{ + CHECK(_date_array, "Invalid date array in TOrdine_form"); + const int items = _date_array->items(); + for (int i = items-1; i >= 0; i--) // ciuccialo alla rovescia... ehehe ;) + { + TDate& dt = (TDate&)*_date_array->objptr(i); + if (dc > dt) + break; + } + return i+1; +} + +bool TOrdine_form::genera_intestazione_supplementare(pagetype p, short y) +{ + CHECK(_date_array, "L'array delle date non e' impostato."); + TPrint_section* body = exist('B', p); + if (body == NULL || !body->columnwise()) + return FALSE; + + TPrint_section* header = exist('H', p); + if (header == NULL) + return FALSE; + + const int items = _date_array->items();//body->fields(); + TForm_string* s; + TString des; + for (int j=0;jfind_field(COL1+j*2); + des = "Situaz. al "; + des << ((TDate*)_date_array->objptr(j))->string(); + des.center_just(fi.width()*2); + s = new TForm_string(header); + s->id() = -1; + s->set_x(fi.x()); + s->y() = y; + s->set_prompt(des); + s->temp() = TRUE; + header->add_field(s); + } + + return TRUE; +} + +bool TOrdine_form::validate(TForm_item &cf, TToken_string &s) +{ + const TString code(s.get(0)); + + if (code == "_ORDINE") + { + TLocalisamfile& doc = cf.form().cursor()->file(LF_DOC); + //TLocalisamfile& rdoc = cf.form().cursor()->file(LF_RIGHEDOC); + TRiga_documento& rdoc = (TRiga_documento&) cf.form().cursor()->file(LF_RIGHEDOC).curr(); + // Add custom messages here + // All the following messages takes 1 parameter: the field number to set + TString action(s.get(1)); + + if (action == "DESCRIZIONE") + { + // Scrive: Cod articolo/cod livello1/cod livello2/.../denominazione ultimo livello codifica /cod mag /cod dep + // Nel caso di stampa disponibilita' articoli stampa un pezzo della descrizione + // vera e proprio dell'articolo. + TString codart,livello, coddep, codmag; + codart = rdoc.get(RDOC_CODART); + if (_art_giac->read(rdoc.get(RDOC_CODART)) == NOERR) + { + if (_normale) + codart << " " << _art_giac->get(ANAMAG_DESCR); + else + codart = _art_giac->get(ANAMAG_DESCR); + + if (codart.len() > 40) + codart.cut(40); + } + if (_level > 0) + livello = rdoc.get(RDOC_LIVELLO); + if (livello.not_empty()) + { + for (int lev=1; lev <= _level; lev++) + { + if (!_codgiac->enabled(lev)) + continue; + const int starts = _codgiac->code_start(lev) -1; + const int length = _codgiac->code_length(lev); + codart << "/"; + codart << livello.mid(starts,length); + } + codart << " " << _codgiac->name(_level); + codart << " " << _codgiac->group_descr(livello,_level); + } + + codmag = rdoc.get(RDOC_CODMAG).left(3); + coddep = rdoc.get(RDOC_CODMAG).right(2); + if (_detail_mag && codmag.not_empty()) + codart << " Mag. " << codmag; + if (_detail_dep && coddep.not_empty()) + codart << " Dep. " << coddep; + + cf.set(codart); + } + else + if (action == "SELECTUM") + { + TString um(rdoc.get(RDOC_UMQTA)); + TString cur_um(cf.find_field("407").get()); + + if (cur_um.empty()) // Se l'unita' di misura non e' ancora stata settata prende quella principale + cf.set(um); + else + if (cur_um != um) // Se c'e' ma e' diversa dalla prec. allora setta l'unita' di misura su quella principale + if (_art_giac->read(rdoc.get(RDOC_CODART)) == NOERR) + { + // Converte i totali q.ta evasa e ordinata nella unita' di misura principale + const int index_um = _art_giac->find_um(cur_um); + const real fc = _art_giac->um().row(index_um > 0 ? index_um : 1).get("FC"); + TForm_item& qo = cf.find_field("408"); + TForm_item& qe = cf.find_field("409"); + TForm_item& qr = cf.find_field("411"); + real qtaor(qo.get()); + real qtaev(qe.get()); + real qtare(qr.get()); + + qtaor *= fc; + qtaev *= fc; + qtare *= fc; + qo.set(qtaor.string()); + qe.set(qtaev.string()); + qr.set(qtare.string()); + + cf.set(_art_giac->um().row(1).get("UM")); // UM principale + } + // TBI: + // Riga merce non a magazzino o non e' possibile reperire l'UM principale per art. + // non posso interrompere la sezione di stampa da qui, e neppure cambiare il raggruppamento... + // This seems to be a great dilemma... For now leave it as is: Somme dure e crude di quantita' + } + else + if (action == "CONVUM") // Converte cazzilli quantitativi nella unita' di misura corrente + { + TString um(rdoc.get(RDOC_UMQTA)); + TString cur_um(cf.find_field("407").get()); + + if (cur_um != um) + if (_art_giac->read(rdoc.get(RDOC_CODART)) == NOERR) + { + const real fc = _art_giac->um().row(_art_giac->find_um(cur_um)).get("FC"); + real qt(cf.get()); + qt *= fc; + cf.set(qt.string()); + } + } + else + if (action == "VALTABLE") // Comandi per stampa riepilogo per valuta + { + TString subcommand(s.get(2)); + if (subcommand == "RESET") + { + _totvaluta.destroy(); + cf.find_field("TOTVAL1").disable(); + cf.find_field("TOTVAL2").disable(); + cf.find_field("TOTVAL3").disable(); + cf.find_field("TOTVAL4").disable(); + } + else + { + const int valute = _totvaluta.items(); + TString codval(doc.get(DOC_CODVAL)); + const bool is_key = _totvaluta.is_key(codval); + const bool is_new = !is_key && valute < 4; + + if (is_new) // Aggiunge l'elemento se non c'e' + _totvaluta.add(codval,(_TTotale_valuta*)new _TTotale_valuta,is_key); + // Controlla/stampa al massimo 4 valute + if (is_key || is_new) + { + _TTotale_valuta& tv = (_TTotale_valuta&)_totvaluta[codval]; + const bool is_valord = subcommand == "VALORD"; + real& r = is_valord ? tv.totord() : tv.totres(); + TString s_id; + int i_id; + + // Abilita la sezione corrispondente e setta i valori all'interno + if (!is_key) + { + TString16 sec_name = "TOTVAL"; + sec_name << valute+1; + tv.secnum() = valute+1; + cf.find_field(sec_name).enable(); + // Setta anche il codice valuta + i_id = BODY_CODVAL + valute*10; + s_id.format("%d",i_id); + cf.find_field(s_id).set(codval); + if (valute == 0) + { + i_id--; + s_id.format("%d",i_id); + cf.find_field(s_id).set("Totali"); + } + } + const int sn = tv.secnum(); + i_id = is_valord ? BODY_TOTVALORD : BODY_TOTVALRES; + + i_id += (sn-1)*10; + s_id.format("%d",i_id); + r += ((real) cf.get()); // Somma il valore corrente + cf.find_field(s_id).set(r.string()); + } + } + } + else + if (action == "CALCDISP") // messaggi per calcolo disponibilita' + { + TString command(s.get(2)); + if (command == "RESET") // resetta la tabella + { + _totdisp.destroy(); + const real rz = ZERO; + const int items = _date_array->items(); + for (int i = 0; iread(rdoc.get(RDOC_CODART)) == NOERR) + { + _codmag = rdoc.get(RDOC_CODMAG); + _livello = rdoc.get(RDOC_LIVELLO); + } + else + cf.set("Errore in lettura articolo"); + } + else + if (command == "CALC") // Effettua il calcolo per questa riga articolo, + //cumulando nell'array le quantita', espresse sempre in UM principale + { + const bool is_ordine_cliente = doc.get(DOC_TIPOCF)[0] == 'C'; + const TString16 causmag(doc.get(DOC_CAUSMAG)); + const TString16 um(rdoc.get(RDOC_UMQTA)); + const TDate datacons(doc.get_date(RDOC_DATACONS)); + int segno = is_ordine_cliente ? -1 : +1; // default + if (causmag.not_empty()) // se la causale esiste consulta il segno + { + TCausale_magazzino cm(causmag); + segno *= cm.sgn(is_ordine_cliente ? s_ordc : s_ordf); + } + // Reperisce fattore di conversione per UM principale, + // la quantita residua + real fc = 1.00; // Se non esiste in anagrafica non effettua nessuna conversione + real qtares = rdoc.qtaresidua(); // ZIO PERA! ag völ la riga dal document + //if (_art_giac->read(rdoc.get(RDOC_CODART)) == NOERR) + fc = _art_giac->um().row(_art_giac->find_um(um)).get_real("FC"); + qtares *= fc; // Convertito in UM principale... + qtares *= segno; // mette a posto il segno... + // Trova il periodo giusto + const int index = find_period(datacons); + real& rv = (real&) _totdisp[index]; + rv += qtares; + } + else + if (command == "PRNUM") // Stampa l'unita' di misura principale + { + //if (_art_giac->read(rdoc.get(RDOC_CODART)) == NOERR) + cf.set(_art_giac->um().row(1).get("UM")); // UM principale + //else + // cf.set("#ERR"); //uhmmm + } + else + { + const int period = s.get_int(3); + //const int items = _date_array->items(); + TString16 annoes; + real giacenza, scorta_min; + annoes << _esercizi->date2esc(doc.get_date(DOC_DATADOC)); + //TString16 codmag(rdoc.get(RDOC_CODMAG)); + //TString16 livello(rdoc.get(RDOC_LIVELLO)); + const int codmag_len = (_detail_dep || _detail_mag) ? _codmag.len() : 0; + const int livello_len = _level > 0 ? _livello.len() : 0; + //if (_art_giac->read(rdoc.get(RDOC_CODART)) == NOERR) + { + // Serve l'anno esercizio del magazzino... + + // Ciclo sulle giacenze di magazzino + TRecord_array& mmgg = _art_giac->mag(annoes); + const int rows = mmgg.rows(); + // Cumula raggruppando le giacenze per lo stesso mag/dep/liv.giac + // Scurre alla ruvescia + for (int i=mmgg.last_row();i>0;i--) + { + const TRectype& rec = mmgg.row(i); // gosh!? + + //checkka se trattasi di medesimo liv giac/mag/dep in caso sia stato spec. il dettaglio + // altrimenti cumula el todo + if (codmag_len == 0 || (rec.get(MAG_CODMAG).compare(_codmag, codmag_len) == 0)) + if (livello_len == 0 || (rec.get(MAG_LIVELLO).compare(_livello, livello_len) == 0)) + { + giacenza += _art_giac->giacenza_corretta(rec, _giac_eff, _val_comp); + scorta_min = rec.get_real(MAG_SCORTAMIN); + } + } + } + for (int i = 0; i< period/*items*/; i++) + giacenza += (real&)_totdisp[i]; + if (command == "PRNGIAC") // Stampa la giacenza prevista + { + cf.set(giacenza.string()); + } + else + if (command == "PRNSOTT") // Stampa il sottoscorta + { + if (giacenza < scorta_min) + { + giacenza = scorta_min - giacenza; + cf.set(giacenza.string()); + } + else + cf.set(""); + } + // Ignore any other command + } + } + else + if (action == "PREZZONS") + { + real pns = rdoc.prezzo(TRUE,FALSE); // Prezzo netto scontato + cf.set(pns.string()); + } + else + if (action == "RAGSOC") + { + // Compone la ragione sociale (considera gli occasionali) + // Il formato è il seguente: CODICE (OCFPI) RAGIONE_SOCIALE + TString ws; + const bool print_cod = s.get_int(2); + TDocumento& documento = (TDocumento&)cf.form().cursor()->file(LF_DOC).curr(); + TCli_for& cli_for = documento.clifor(); + TOccasionale& cli_occ = documento.occas(); + const bool occasionale = cli_for.occasionale(); + if (print_cod) + ws << cli_for.get("CODCF") << " "; + if (occasionale) + { + ws << "(" << cli_occ.get("CFPI") << ") " ; + ws << cli_occ.get("RAGSOC"); + } + else + ws << cli_for.get("RAGSOC"); + cf.set(ws); + } + else + if (action == "RESIDUO") + { + real qres = rdoc.qtaresidua(); // Quantita' residua + cf.set(qres.string()); + } + else + if (action == "GIACENZA") + { + TString16 annoes; + annoes << _esercizi->date2esc(doc.get_date(DOC_DATADOC)); + const TString16 codmag(rdoc.get("CODMAG")); // Riferito al magazzino indicato sulla riga... + const TString16 livello(_level > 0 ? rdoc.get(RDOC_LIVELLO) : ""); + const real g = _art_giac->read(rdoc.get(RDOC_CODART)) == NOERR ? _art_giac->disponibilita(annoes, codmag, livello) : ZERO;// Giacenza attuale + cf.set(g.string()); + } + //Ignore any other command + } + return TForm::validate(cf, s); +} diff --git a/or/orprassi.men b/or/orprassi.men new file mode 100755 index 000000000..1c66db3d5 --- /dev/null +++ b/or/orprassi.men @@ -0,0 +1,9 @@ +[PRASSIOR_000] +Caption = "Ordini" +Picture = +Module = 33 +Flags = "" +Item_01 = "Stampa ordini", "or1.exe -0","F" +Item_02 = "Stampa disponibilita' articoli", "or1.exe -1","F" +Item_03 = "Stampa tempi di consegna", "or1.exe -2","F" +Item_04 = "Scarico e ripristino documenti", "ve5.exe -0","F" diff --git a/pr/agenti.h b/pr/agenti.h index a86ab21bc..069ff77f4 100755 --- a/pr/agenti.h +++ b/pr/agenti.h @@ -22,6 +22,10 @@ #define AGE_CODALTPR2 "CODALTPR2" #define AGE_CODALTPR3 "CODALTPR3" #define AGE_CODALTPR4 "CODALTPR4" +#define AGE_CODFISC "CODFISC" +#define AGE_MATRICOLA "MATRICOLA" +#define AGE_PLURIMAND "PLURIMAND" +#define AGE_DATACESS "DATACESS" #endif diff --git a/pr/f122.dir b/pr/f122.dir index 5d16ef609..e9fef1cda 100755 --- a/pr/f122.dir +++ b/pr/f122.dir @@ -1,3 +1,3 @@ 122 0 -$agenti|0|0|118|0|Archivio agenti||| +$agenti|7|8|151|36|Archivio agenti||| diff --git a/pr/f122.trr b/pr/f122.trr index 3b3101e27..c8b6c471a 100755 --- a/pr/f122.trr +++ b/pr/f122.trr @@ -1,5 +1,5 @@ 122 -19 +23 CODAGE|1|5|0|Codice agente RAGSOC|1|50|0|Ragioe sociale CODFORN|3|6|0|Codice fornitore relativo @@ -19,6 +19,10 @@ CODALTPR1|1|2|0|Codice archivio provvigioni 1 alternativo CODALTPR2|1|2|0|Codice archivio provvigioni 2 alternativo CODALTPR3|1|2|0|Codice archivio provvigioni 3 alternativo CODALTPR4|1|2|0|Codice archivio provvigioni 4 alternativo +CODFISC|1|16|0|Codice Fiscale +MATRICOLA|1|8|0|Matricola +PLURIMAND|8|1|0|Plurimandatario +DATACESS|5|8|0|Data cessazione rapporto 2 CODAGE| UPPER(RAGSOC)|X diff --git a/pr/pr0500a.h b/pr/pr0500a.h index 270f5bf04..5c88ba2c3 100755 --- a/pr/pr0500a.h +++ b/pr/pr0500a.h @@ -29,5 +29,8 @@ #define F_CODALTPR2 127 #define F_CODALTPR3 128 #define F_CODALTPR4 129 +#define F_MATRICOLA 130 +#define F_PLURIMAND 131 +#define F_DATACESS 132 #define G_CAPOZONA 1 diff --git a/pr/pr0500a.uml b/pr/pr0500a.uml index f45de9df7..deb5606d1 100755 --- a/pr/pr0500a.uml +++ b/pr/pr0500a.uml @@ -170,6 +170,24 @@ BEGIN WARNING "Inserire una percentuale tra 0 e 100" END +STRING F_MATRICOLA 8 +BEGIN + PROMPT 2 16 "Numero matricola " + FIELD MATRICOLA +END + +DATE F_DATACESS +BEGIN + PROMPT 2 17 "Data cessazione rapporto " + FIELD DATACESS +END + +BOOLEAN F_PLURIMAND +BEGIN + PROMPT 2 18 "Plurimandatario" + FIELD PLURIMAND +END + ENDPAGE PAGE "Ricerche" -1 -1 78 8 diff --git a/pr/pr0700.cpp b/pr/pr0700.cpp index 7128d354b..840447cc7 100755 --- a/pr/pr0700.cpp +++ b/pr/pr0700.cpp @@ -204,7 +204,8 @@ bool TGestione_provv_app::imprata_handler(TMask_field& f, KEY key) TProvvigioni_agente* pa = app()._prag; TRate_doc& rd = pa->rate(__current_key); real r(f.get()); - if (r > rd.impdoc()) + r = abs(r); + if (r > abs(rd.impdoc())) return f.error_box("L'importo della rata non puo' essere maggiore dell'importo del documento"); } return TRUE; @@ -217,7 +218,8 @@ bool TGestione_provv_app::improvv_handler(TMask_field& f, KEY key) TProvvigioni_agente* pa = app()._prag; TRate_doc& rd = pa->rate(__current_key); real r(f.get()); - if (r > rd.impprdoc()) + r = abs(r); + if (r > abs(rd.impprdoc())) return f.error_box("L'importo della provvigione non puo' essere maggiore dell'importo provvigione del documento"); } return TRUE; diff --git a/pr/pr0700b.uml b/pr/pr0700b.uml index d0c9e91af..730b50a05 100755 --- a/pr/pr0700b.uml +++ b/pr/pr0700b.uml @@ -168,16 +168,16 @@ END CURRENCY F_IMPPRDOC 18 BEGIN PROMPT 2 5 "Importo provv. doc. " - DRIVENBY F_CODVAL - NUM_EXPR {(#THIS_FIELD <= #F_IMPDOC)} + PICTURE "." + NUM_EXPR {IF ((#THIS_FIELD > 0);(#THIS_FIELD <= #F_IMPDOC);(IF ((#THIS_FIELD < 0);(#THIS_FIELD >= #F_IMPDOC);(1))))} WARNING "L'importo della provvigione deve essere minore dell'importo documento" END CURRENCY F_IMPNETDOC 18 BEGIN PROMPT 2 6 "Base di calcolo " - DRIVENBY F_CODVAL - NUM_EXPR {(#THIS_FIELD <= #F_IMPDOC)} + PICTURE "." + NUM_EXPR {IF ((#THIS_FIELD > 0);(#THIS_FIELD <= #F_IMPDOC);(IF ((THIS_FIELD < 0);(#THIS_FIELD >= #F_IMPDOC);(1))))} WARNING "L'importo della base di calcolo deve essere minore dell'importo documento" END @@ -279,16 +279,16 @@ END CURRENCY F_PAGMAT 18 BEGIN PROMPT 2 8 "Importo pagamento maturato " - DRIVENBY -F_CODVAL - NUM_EXPR {(#THIS_FIELD <= #F_IMPRATA)} + PICTURE "." + NUM_EXPR {IF ((#THIS_FIELD > 0);(#THIS_FIELD <= #F_IMPRATA);(IF ((#THIS_FIELD < 0);(#THIS_FIELD >= #F_IMPRATA);(1))))} WARNING "L'importo pagamento maturato deve essere minore dell'importo della rata" END CURRENCY F_PROVVMAT 18 BEGIN PROMPT 2 9 "Importo provvigione maturata " - DRIVENBY -F_CODVAL - NUM_EXPR {(#THIS_FIELD <= #F_IMPPROVV)} + PICTURE "." + NUM_EXPR {IF ((#THIS_FIELD > 0);(#THIS_FIELD <= #F_IMPPROVV);(IF ((#THIS_FIELD < 0);(#THIS_FIELD >= #F_IMPPROVV);(1))))} WARNING "L'importo provvigione maturata deve essere minore dell'importo della provvigione" END diff --git a/pr/pr1.cpp b/pr/pr1.cpp index bf219601b..e79aa6e89 100755 --- a/pr/pr1.cpp +++ b/pr/pr1.cpp @@ -4,8 +4,7 @@ int main(int argc,char** argv) { - const int n = argc > 1 ? atoi(argv[1]+1) : -1; - + const int n = argc > 1 ? argv[1][1]-'0' : 0; switch (n) { case 1: @@ -14,6 +13,8 @@ int main(int argc,char** argv) pr1300(argc,argv); break; // stampa schede di provvigione case 3: pr1400(argc,argv); break; // stampa statistiche + case 4: + pr1500(argc,argv); break; // stampa versamenti default: pr1100(argc,argv); break; // stampa agenti } diff --git a/pr/pr1.h b/pr/pr1.h index e3394d401..8319cc957 100755 --- a/pr/pr1.h +++ b/pr/pr1.h @@ -1,10 +1,11 @@ #ifndef __PR1_H #define __PR1_H -int pr1100(int argc, char** argv); -int pr1200(int argc, char** argv); -int pr1300(int argc, char** argv); -int pr1400(int argc, char** argv); +int pr1100(int argc, char* argv[]); +int pr1200(int argc, char* argv[]); +int pr1300(int argc, char* argv[]); +int pr1400(int argc, char* argv[]); +int pr1500(int argc, char* argv[]); #endif // __PR1_H diff --git a/pr/pr1100.cpp b/pr/pr1100.cpp index 109c7e42f..ccc9613ca 100755 --- a/pr/pr1100.cpp +++ b/pr/pr1100.cpp @@ -6,6 +6,7 @@ #include #include #include + #include "agenti.h" #include "pr1100.h" diff --git a/pr/pr1200.cpp b/pr/pr1200.cpp index 26c973fc9..dbdfe25ca 100755 --- a/pr/pr1200.cpp +++ b/pr/pr1200.cpp @@ -334,7 +334,7 @@ bool TStampa_percprovv::destroy() return TSkeleton_application::destroy(); } -int pr1200(int argc, char** argv) +int pr1200(int argc, char* argv[]) { TStampa_percprovv a; a.run(argc,argv,"Stampa % di provvigione"); diff --git a/pr/pr1300.cpp b/pr/pr1300.cpp index fd191b8ec..451f88594 100755 --- a/pr/pr1300.cpp +++ b/pr/pr1300.cpp @@ -136,7 +136,7 @@ void TStampa_schedeprovv::main_loop() } } -int pr1300(int argc, char** argv) +int pr1300(int argc, char* argv[]) { TStampa_schedeprovv a; a.run(argc,argv,"Stampa schede di provvigione"); diff --git a/pr/pr1400.cpp b/pr/pr1400.cpp index a465a60d3..9f61e1f80 100755 --- a/pr/pr1400.cpp +++ b/pr/pr1400.cpp @@ -246,7 +246,7 @@ bool TStampa_statistiche_app::destroy() return TRUE; } -int pr1400(int argc, char** argv) +int pr1400(int argc, char* argv[]) { TStampa_statistiche_app a; a.run(argc,argv,"Statistiche temporali"); diff --git a/pr/pr1500.cpp b/pr/pr1500.cpp new file mode 100755 index 000000000..7750875ac --- /dev/null +++ b/pr/pr1500.cpp @@ -0,0 +1,411 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include "provv.h" +#include "agenti.h" + +#include "pr1500a.h" + +/////////////////////////////////////////////////////////// +// Maschera principale +/////////////////////////////////////////////////////////// + +class TFirr_mask : public TAutomask +{ +protected: + virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); + +public: + void load_params(); + void save_params(); + + TFirr_mask(); + virtual ~TFirr_mask(); +}; + +bool TFirr_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) +{ + switch (o.dlg()) + { + case DLG_SAVEREC: + if (e == fe_button) + { + save_params(); + return FALSE; + } + break; + default: + break; + } + return TRUE; +} + +void TFirr_mask::load_params() +{ + TConfig cfg(CONFIG_STUDIO, "pr"); + set(F_PREVID, cfg.get("Previdenza", NULL, -1, "5.75")); + set(F_ASSIST, cfg.get("Assistenza", NULL, -1, "2.00")); + set(F_PREV_MIN, cfg.get("PrevMin", NULL, -1, "120000")); + set(F_PREV_MAX, cfg.get("PrevMax", NULL, -1, "4830000")); + + for (int i = 0; i < 3; i++) + { + set(F_FIRR_1+i, cfg.get_int("Firr", NULL, i, i+1)); + const char* def = (i == 0) ? "24000000" : "36000000"; + set(F_LIMITE_1+i, cfg.get("FirrLimit", NULL, i, def)); + } +} + +void TFirr_mask::save_params() +{ + TConfig cfg(CONFIG_STUDIO, "pr"); + cfg.set("Previdenza", get(F_PREVID)); + cfg.set("Assistenza", get(F_ASSIST)); + cfg.set("PrevMin", get(F_PREV_MIN)); + cfg.set("PrevMax", get(F_PREV_MAX)); + + for (int i = 0; i < 3; i++) + { + cfg.set("Firr", get(F_FIRR_1+i), NULL, TRUE, i); + cfg.set("FirrLimit", get(F_LIMITE_1+i), NULL, TRUE, i); + } +} + +TFirr_mask::TFirr_mask() : TAutomask("pr1500a") +{ + load_params(); +} + +TFirr_mask::~TFirr_mask() +{ } + + +/////////////////////////////////////////////////////////// +// Dati Agente +/////////////////////////////////////////////////////////// + +class TDati_agente : public TObject +{ + TString16 _codice; + TString16 _matricola; + TString16 _codfisc; + TString _ragsoc; + TDate _datacess; + bool _plurimandatario; + bool _massimale; + real _totale[5]; + real _previdenza[5]; + real _assistenza; + real _firr; + +public: + const TString& codice() const { return _codice; } + const TString& matricola() const { return _matricola; } + const TString& ragsoc() const { return _ragsoc; } + const TString& codice_fiscale() const { return _codfisc; } + const TDate& data_cessazione() const { return _datacess; } + bool massimale() const { return _massimale; } + const real& previdenza(int index) const; + const real& assistenza() const { return _assistenza; } + const real& firr() const { return _firr; } + + void add(const TRectype& provv, const TFirr_mask& m); + void crop(const TFirr_mask& m); + + TDati_agente(const char* codage); + virtual ~TDati_agente() { } +}; + +void TDati_agente::add(const TRectype& prov, const TFirr_mask& m) +{ + const TDate data = prov.get(PROV_DATASCAD); + const int index = (data.month()-1) / 3 + 1; + + real imp = prov.get(PROV_PROVVPAG); + imp += prov.get_real(PROV_PROVVMAT); + + _totale[0] += imp; + _totale[index] += imp; +} + +void TDati_agente::crop(const TFirr_mask& m) +{ + const real percprev = m.get(F_PREVID); + real prev_anno_min = m.get(F_PREV_MIN); + real prev_anno_max = m.get(F_PREV_MAX); + const real percassi = m.get(F_ASSIST); + const real firr1 = m.get(F_FIRR_1); + real limite1 = m.get(F_LIMITE_1); + const real firr2 = m.get(F_FIRR_2); + real limite2 = m.get(F_LIMITE_2); + const real firr3 = m.get(F_FIRR_3); + + if (_plurimandatario) + { + prev_anno_min /= 2.0; + prev_anno_max /= 2.0; + limite1 /= 2.0; + limite2 /= 2.0; + } + + // Calcolo previdenza + _previdenza[0] = ZERO; + _massimale = FALSE; + for (int t = 1; t <= 4; t++) + { + real prev = _totale[t] * percprev / 100.0; + const real sum = _previdenza[0] + prev; + if (sum > prev_anno_max) + { + const real extra = sum - prev_anno_max; + prev -= extra; + _massimale = TRUE; + } + _previdenza[t] = prev; + _previdenza[0] += prev; + } + if (_previdenza[0] > ZERO && _previdenza[0] < prev_anno_min) + { + const real extra = prev_anno_min - _previdenza[0]; + _previdenza[4] += extra; + _previdenza[0] = prev_anno_min; + } + + // Calcolo assistenza + _assistenza = _totale[0] * percassi / 100.0; + + // Calcolo FIRR + real tot = _totale[0]; + _firr = ZERO; + if (tot > limite2) + { + _firr += (tot-limite2) * firr3 / 100.0; + tot -= limite2; + } + if (tot > limite1) + { + _firr += (tot-limite1) * firr2 / 100.0; + tot -= limite1; + } + _firr += tot * firr1 / 100.0; +} + +const real& TDati_agente::previdenza(int index) const +{ + if (index >= 0 && index <= 4) + return _previdenza[index]; + return _previdenza[0]; +} + +TDati_agente::TDati_agente(const char* codage) +{ + _codice = codage; + const TRectype& rec = cache().get(LF_AGENTI, _codice); + + _matricola = rec.get(AGE_MATRICOLA); + if (_matricola.empty()) + _matricola = _codice; + + _ragsoc = rec.get(AGE_RAGSOC); + _plurimandatario = rec.get_bool(AGE_PLURIMAND); + _datacess = rec.get(AGE_DATACESS); + + _codfisc = rec.get(AGE_CODFISC); + if (_codfisc.empty()) + { + TString16 forn = rec.get(AGE_CODFORN); + if (forn.not_empty()) + { + forn.insert("F|"); + _codfisc = cache().get(LF_CLIFO, forn).get(CLI_COFI); + } + } +} + +/////////////////////////////////////////////////////////// +// Form di stampa +/////////////////////////////////////////////////////////// + +class TFirr_form : public TForm +{ +public: + void print_footer(); + + TFirr_form(const TFirr_mask& m); + virtual ~TFirr_form() { } +}; + +void TFirr_form::print_footer() +{ + set_last_page(TRUE); + set_footer(0, TRUE); + printer().formfeed(); +} + +TFirr_form::TFirr_form(const TFirr_mask& m) : TForm("pr1500a") +{ + TPrint_section& head = section('H'); + TPrint_section& body = section('B'); + TPrint_section& foot = section('F'); + + TString str; + str = "Stampa Contributi "; + const int periodo = m.get_int(F_PERIODO); + switch (periodo) + { + case 1 : str << "primo trimestre"; break; + case 2 : str << "secondo trimestre"; break; + case 3 : str << "terzo trimestre"; break; + case 4 : str << "quarto trimestre"; break; + default: str << "anno"; break; + } + str << ' ' << m.get_int(F_ANNO); + head.find_field(101).set(str); + + const int first = head.height()-2; + const int last = printer().formlen(); + const int horiz[] = { first+2, last-foot.height()+1, 0 }; + genera_fincatura(odd_page, first, last, horiz); + genera_intestazioni(odd_page, first+1); +} + +/////////////////////////////////////////////////////////// +// Applicazione di stampa versamenti per agenti +/////////////////////////////////////////////////////////// + +class TStampa_firr : public TSkeleton_application +{ + TArray _dati; + +protected: + virtual void main_loop(); + +public: + void compute(const TFirr_mask& m); + void print(const TFirr_mask& m); +}; + +void TStampa_firr::compute(const TFirr_mask& m) +{ + TRelation rel(LF_PROVV); + + TRectype filter_fr(LF_PROVV), filter_to(LF_PROVV); + filter_fr.put(PROV_CODAGE, m.get(F_DA_AGENTE)); + filter_to.put(PROV_CODAGE, m.get(F_AD_AGENTE)); + + const TDate data_fr( 1, 1, m.get_int(F_ANNO)); + TDate data_to(31, 12, m.get_int(F_ANNO)); + + switch (m.get_int(F_PERIODO)) + { + case 1: + data_to.set_month(3); + break; + case 2: + data_to.set_day(30); + data_to.set_month(6); + break; + case 3: + data_to.set_day(30); + data_to.set_month(9); + break; + default: + break; + } + TString filter; + filter << "(ANSI(" << PROV_DATASCAD << ")>=\"" << data_fr.string(ANSI); + filter << "\")&&(ANSI(" << PROV_DATASCAD << ")<=\"" << data_to.string(ANSI) << "\")"; + TCursor cur(&rel, filter, 2, &filter_fr, &filter_to); + + const long total = cur.items(); + cur.freeze(TRUE); + const TRectype& cur_prov = cur.curr(); + + TProgind pi(total, "Elaborazione in corso...", TRUE, TRUE); + for (cur = 0L; cur.pos() < total; ++cur) + { + pi.addstatus(1); + if (pi.iscancelled()) + break; + + const TString16 cod = cur_prov.get(PROV_CODAGE); + TDati_agente* agente = (TDati_agente*)_dati.objptr(_dati.last()); + if (agente && cod != agente->codice()) + agente = NULL; + if (agente == NULL) + { + agente = new TDati_agente(cod); + _dati.add(agente); + } + agente->add(cur_prov, m); + } +} + +void TStampa_firr::print(const TFirr_mask& m) +{ + TFirr_form form(m); + + const int periodo = m.get_int(F_PERIODO); + + TForm_item& matricola = form.find_field('B', odd_page, 101); + TForm_item& ragsoc = form.find_field('B', odd_page, 102); + TForm_item& codfisc = form.find_field('B', odd_page, 103); + TForm_item& datacess = form.find_field('B', odd_page, 104); + TForm_item& percprovv = form.find_field('B', odd_page, 105); + TForm_item& massimale = form.find_field('B', odd_page, 106); + TForm_item& previdenza = form.find_field('B', odd_page, 107); + TForm_item& assistenza = form.find_field('B', odd_page, 108); + TForm_item& firr = form.find_field('B', odd_page, 109); + + printer().open(); + for (int i = 0; i < _dati.items(); i++) + { + TDati_agente& agente = (TDati_agente&)_dati[i]; + agente.crop(m); // Ricalcola rate trimestrali + + matricola.set(agente.matricola()); + ragsoc.set(agente.ragsoc()); + codfisc.set(agente.codice_fiscale()); + datacess.set(agente.data_cessazione().string()); + percprovv.set(m.get(F_PREVID)); + previdenza.set(agente.previdenza(periodo).string()); + massimale.set(agente.massimale() ? "X" : ""); + if (periodo == 0 || periodo == 4) + { + assistenza.set(agente.assistenza().string()); + firr.set(agente.firr().string()); + } + + form.print(-1); + } + form.print_footer(); + printer().close(); +} + +void TStampa_firr::main_loop() +{ + open_files(LF_AGENTI, LF_PROVV, NULL); + + TFirr_mask m; + while (m.run() == K_ENTER) + { + _dati.destroy(); + compute(m); + if (_dati.items()) + print(m); + } +} + +int pr1500(int argc, char* argv[]) +{ + TStampa_firr a; + a.run(argc, argv, "Distinta Versamento"); + return 0; +} diff --git a/pr/pr1500a.frm b/pr/pr1500a.frm new file mode 100755 index 000000000..8875dcf3a --- /dev/null +++ b/pr/pr1500a.frm @@ -0,0 +1,121 @@ +SECTION HEADER ODD 5 + +STRINGA 101 +BEGIN + PROMPT 1 1 "" +END + +END + +SECTION BODY ODD 1 COLUMNWISE + +STRINGA 101 10 +BEGIN + SPECIAL STRINGA INTESTAZIONE "Matricola" "Matricola" + SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" + KEY "Matricola" + PROMPT 1 1 "" +END + +STRINGA 102 30 2 +BEGIN + SPECIAL STRINGA INTESTAZIONE "Ragione Sociale" "Ragione Sociale" + SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" + KEY "Ragione Sociale" + PROMPT 2 1 "" +END + +STRINGA 103 16 +BEGIN + SPECIAL STRINGA INTESTAZIONE "Codice Fiscale" "Codice Fiscale" + SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" + KEY "Codice Fiscale" + PROMPT 3 1 "" +END + +DATA 104 10 +BEGIN + SPECIAL STRINGA INTESTAZIONE "Cessazione" "Cessazione" + SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" + KEY "Cessazione" + PROMPT 4 1 "" +END + +NUMERO 105 5 2 +BEGIN + SPECIAL STRINGA INTESTAZIONE "Perc." "Perc." + SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" + KEY "Percentuale Previdenza" + PROMPT 5 1 "" + PICTURE "##,##" +END + +STRINGA 106 3 +BEGIN + SPECIAL STRINGA INTESTAZIONE "Max" "Massimale" + SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" + KEY "Massimale" + PROMPT 6 1 "" +END + +VALUTA 107 15 +BEGIN + SPECIAL STRINGA INTESTAZIONE "Previdenza" "Previdenza" + SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" + KEY "Previdenza" + PROMPT 7 1 "" + MESSAGE ADD,FO->107 +END + +VALUTA 108 15 +BEGIN + SPECIAL STRINGA INTESTAZIONE "Assistenza" "Assistenza" + SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" + KEY "Assistenza" + PROMPT 8 1 "" + MESSAGE ADD,FO->108 +END + +VALUTA 109 15 +BEGIN + SPECIAL STRINGA INTESTAZIONE "FIRR" "FIRR" + SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" + KEY "FIRR" + PROMPT 9 1 "" + MESSAGE ADD,FO->109 +END + +END + + +SECTION FOOTER ODD 3 + +STRINGA 101 10 +BEGIN + KEY "Totale" + SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" + PROMPT 2 2 "Totale" +END + + +VALUTA 107 15 +BEGIN + KEY "Previdenza" + PROMPT 82 2 "" +END + +VALUTA 108 15 +BEGIN + KEY "Assistenza" + PROMPT 98 2 "" +END + +VALUTA 109 15 +BEGIN + KEY "FIRR" + PROMPT 114 2 "" +END + +END + +END diff --git a/pr/pr1500a.h b/pr/pr1500a.h new file mode 100755 index 000000000..089597c24 --- /dev/null +++ b/pr/pr1500a.h @@ -0,0 +1,15 @@ +#define F_PERIODO 101 +#define F_ANNO 102 +#define F_DA_AGENTE 103 +#define F_AD_AGENTE 104 + +#define F_PREVID 201 +#define F_PREV_MIN 203 +#define F_PREV_MAX 204 +#define F_ASSIST 209 +#define F_FIRR_1 210 +#define F_FIRR_2 211 +#define F_FIRR_3 212 +#define F_LIMITE_1 220 +#define F_LIMITE_2 221 +#define F_LIMITE_3 222 diff --git a/pr/pr1500a.uml b/pr/pr1500a.uml new file mode 100755 index 000000000..f6781f145 --- /dev/null +++ b/pr/pr1500a.uml @@ -0,0 +1,157 @@ +#include "pr1500a.h" + +PAGE "Stampa Disitinta" -1 -1 44 12 + +RADIOBUTTON F_PERIODO 20 +BEGIN + PROMPT 1 0 "@bPeriodo " + ITEM "1|I Trimestre" + ITEM "2|II Trimestre" + ITEM "3|III Trimestre" + ITEM "4|IV Trimestre" + ITEM "A|Anno" +END + +NUMBER F_ANNO 4 +BEGIN + PROMPT 22 2 "Anno " + FLAGS "A" + CHECKTYPE REQUIRED +END + +NUMBER F_DA_AGENTE 5 +BEGIN + PROMPT 22 4 "Da Agente " + FLAGS "Z" + USE LF_AGENTI + INPUT CODAGE F_DA_AGENTE + DISPLAY "Codice" CODAGE + DISPLAY "Ragione Sociale@50" RAGSOC + OUTPUT F_DA_AGENTE CODAGE + CHECKTYPE NORMAL + ADD RUN PR0 -4 +END + +NUMBER F_AD_AGENTE 5 +BEGIN + PROMPT 22 5 "Ad Agente " + FLAGS "Z" + COPY USE F_DA_AGENTE + INPUT CODAGE F_AD_AGENTE + COPY DISPLAY F_DA_AGENTE + OUTPUT F_AD_AGENTE CODAGE + CHECKTYPE NORMAL + ADD RUN PR0 -4 +END + +BUTTON DLG_PRINT 10 2 +BEGIN + PROMPT -12 -1 "" +END + +BUTTON DLG_QUIT 10 2 +BEGIN + PROMPT -22 -1 "" +END + +ENDPAGE + +PAGE "Parametri" -1 -1 44 12 + +GROUPBOX DLG_NULL 42 4 +BEGIN + PROMPT 1 0 "@bPrevidenza" +END + +NUMBER F_PREVID 5 2 +BEGIN + PROMPT 2 1 "% Previdenza " + PICTURE ".2" + FLAGS "U" +END + +NUMBER F_ASSIST 5 2 +BEGIN + PROMPT 2 2 "% Assistenza " + PICTURE ".2" + FLAGS "U" +END + +NUMBER F_PREV_MIN 15 +BEGIN + PROMPT 22 1 "Min." + PICTURE "." + FLAGS "U" +END + +NUMBER F_PREV_MAX 15 +BEGIN + PROMPT 22 2 "Max." + PICTURE "." + FLAGS "U" +END + +GROUPBOX DLG_NULL 42 5 +BEGIN + PROMPT 1 4 "@bFIRR" +END + +NUMBER F_FIRR_1 5 2 +BEGIN + PROMPT 2 5 "% " + PICTURE ".2" + FLAGS "U" +END + +NUMBER F_LIMITE_1 15 +BEGIN + PROMPT 18 5 "Fino a " + PICTURE "." + FLAGS "U" +END + +NUMBER F_FIRR_2 5 2 +BEGIN + PROMPT 2 6 "% " + PICTURE ".2" + FLAGS "U" +END + +NUMBER F_LIMITE_2 15 +BEGIN + PROMPT 18 6 "Fino a " + PICTURE "." + FLAGS "U" + NUM_EXPR #F_LIMITE_2>=#F_LIMITE_1 + MESSAGE COPY,F_LIMITE_3 +END + +NUMBER F_FIRR_3 5 2 +BEGIN + PROMPT 2 7 "% " + PICTURE ".2" + FLAGS "U" +END + +NUMBER F_LIMITE_3 15 +BEGIN + PROMPT 18 7 "Oltre " + PICTURE "." + FLAGS "DU" +END + +BUTTON DLG_SAVEREC 10 2 +BEGIN + PROMPT -12 -1 "~Registra" + PICTURE BMP_SAVEREC + PICTURE BMP_SAVERECDN +END + +BUTTON DLG_QUIT 10 2 +BEGIN + PROMPT -22 -1 "" +END + +ENDPAGE + +ENDMASK \ No newline at end of file diff --git a/pr/prprassi.men b/pr/prprassi.men index 3bbe7df3d..fac54788c 100755 --- a/pr/prprassi.men +++ b/pr/prprassi.men @@ -32,6 +32,7 @@ Module = 0 Flags = "" Item_04 = "Stampa schede", "pr1 -2", "F" Item_05 = "Stampa statistiche", "pr1 -3", "F" +Item_06 = "Stampa distinte versamento", "pr1 -4", "F" [PRASSIPR_010] diff --git a/sc/sc0100.cpp b/sc/sc0100.cpp index 4c685ac1b..355895e35 100755 --- a/sc/sc0100.cpp +++ b/sc/sc0100.cpp @@ -40,8 +40,9 @@ TSaldaconto_app::TSaldaconto_app() bool TSaldaconto_app::create() { - open_files(LF_TAB, LF_TABCOM, LF_CLIFO, 0); + open_files(LF_TAB, LF_TABCOM, LF_CLIFO, LF_PCON, 0); open_files(LF_PARTITE, LF_SCADENZE, LF_PAGSCA, 0); + open_files(LF_CAUSALI, LF_ATTIV, 0); load_colors(); @@ -102,7 +103,7 @@ void TSaldaconto_app::load_colors() if (key.len() == 7 && key.compare("Color", 5, TRUE) == 0) { const COLOR col = conf.get_color(key); - TString* strcol = new TString(15); + TString* strcol = new TString16; strcol->format("%ld", col); _colori.add(key.mid(5), strcol); } @@ -118,7 +119,7 @@ COLOR TSaldaconto_app::type2color(char tipor, char tipoc) TString* colstr = (TString*)_colori.objptr(key); if (colstr == NULL) { - colstr = new TString(8); + colstr = new TString16; colstr->format("%ld", tipoc == 'B' ? NORMAL_BACK_COLOR : NORMAL_COLOR); _colori.add(key, colstr); } @@ -182,5 +183,6 @@ int sc0100(int argc, char* argv[]) { TSaldaconto_app* salda = new TSaldaconto_app; salda->run(argc, argv, "Gestione Saldaconto"); + delete salda; return 0; } diff --git a/sc/sc0100a.uml b/sc/sc0100a.uml index 22644b21f..94deea1ff 100755 --- a/sc/sc0100a.uml +++ b/sc/sc0100a.uml @@ -1,6 +1,6 @@ #include "sc0100a.h" -TOOLBAR "" 0 20 0 2 +TOOLBAR "" 0 19 0 3 BUTTON DLG_OK 10 2 BEGIN @@ -25,6 +25,7 @@ BEGIN MESSAGE HIDE,1@|SHOW,2@|HIDE,3@ ITEM "F|Fornitore" MESSAGE HIDE,1@|HIDE,2@|SHOW,3@ + FLAGS "P" END NUMBER F_GRUPPO 3 @@ -37,6 +38,7 @@ BEGIN OUTPUT F_GRUPPO GRUPPO CHECKTYPE REQUIRED ADD RUN cg0 -0 + FLAGS "P" END NUMBER F_CONTO 3 @@ -54,6 +56,7 @@ BEGIN OUTPUT F_CONTO CONTO CHECKTYPE REQUIRED ADD RUN cg0 -0 + FLAGS "P" END NUMBER F_SOTTOCONTO 6 diff --git a/sc/sc0100p.uml b/sc/sc0100p.uml index 9049e7be9..2f09eb191 100755 --- a/sc/sc0100p.uml +++ b/sc/sc0100p.uml @@ -125,16 +125,16 @@ BEGIN USE %DPN KEY 2 INPUT S0 E_DESCR DISPLAY "Descrizione@50" S0 - DISPLAY "Codice" CODTAB + DISPLAY "Codice@10" CODTAB COPY OUTPUT E_DESCAGG END LIST E_CLIFO 1 10 BEGIN PROMPT 1 8 "" - ITEM " |Conto" MESSAGE HIDE,1@|HIDE,2@|SHOW,3@ - ITEM "C|Cliente" MESSAGE SHOW,1@|HIDE,2@|HIDE,3@ - ITEM "F|Fornitore" MESSAGE HIDE,1@|SHOW,2@|HIDE,3@ + ITEM " |Conto" MESSAGE HIDE,1@|HIDE,2@|SHOW,4@ + ITEM "C|Cliente" MESSAGE SHOW,1@|HIDE,2@|HIDE,4@ + ITEM "F|Fornitore" MESSAGE HIDE,1@|SHOW,2@|HIDE,4@ FIELD LF_PARTITE->TIPOC FLAGS "DG" END @@ -189,7 +189,7 @@ NUMBER E_GRUPPO 3 BEGIN PROMPT 17 8 "" FLAGS "D" - GROUP 3 + GROUP 4 FIELD LF_PARTITE->GRUPPO END @@ -197,7 +197,7 @@ NUMBER E_CONTO 3 BEGIN PROMPT 22 8 "" FLAGS "D" - GROUP 3 + GROUP 4 FIELD LF_PARTITE->CONTO END @@ -212,7 +212,7 @@ BEGIN INPUT SOTTOCONTO E_SOTTOCONTO OUTPUT E_DESCONTO DESCR CHECKTYPE REQUIRED - GROUP 3 + GROUP 4 END STRING E_RAGSOCCLIENTE 50 @@ -251,7 +251,7 @@ END STRING E_DESCONTO 50 40 BEGIN PROMPT 35 8 "" - GROUP 3 + GROUP 4 FLAGS "D" END @@ -390,14 +390,14 @@ BEGIN CHECKTYPE SEARCH END -NUMBER E_CAMBIO 15 5 +NUMBER E_CAMBIO 15 6 BEGIN PROMPT 55 12 "Cambio " FIELD LF_PARTITE->CAMBIO FLAGS "RU" GROUP 3 - PICTURE ".5" - CHECKTYPE REQUIRED + PICTURE ".6" + VALIDATE REQIF_FUNC 1 E_VALUTA WARNING "Inserire il cambio o eliminare il codice valuta" END diff --git a/sc/sc3100a.h b/sc/sc3100a.h index dfa4f1337..7368777e1 100755 --- a/sc/sc3100a.h +++ b/sc/sc3100a.h @@ -1,3 +1,4 @@ #define F_CODEL 501 +#define F_DESL 502 #define DLG_COPY 601 diff --git a/sc/sc3100a.uml b/sc/sc3100a.uml index 440e2db12..d200e9983 100755 --- a/sc/sc3100a.uml +++ b/sc/sc3100a.uml @@ -2,17 +2,17 @@ #include "sc3100a.h" -PAGE "Scelta profilo" -1 -1 75 6 +PAGE "Scelta profilo" -1 -1 75 14 STRING F_BASE 8 BEGIN - PROMPT 2 1 "Profilo base " + PROMPT 2 1 "Profilo base " FLAGS "DP" END NUMBER F_CODE 4 BEGIN - PROMPT 2 2 "Codice profilo " + PROMPT 2 3 "Codice profilo " FLAGS "Z" HELP "Codice del profilo" USE LF_FORM @@ -27,7 +27,7 @@ BEGIN DISPLAY "Desc. Lingua@50" -200->S0 OUTPUT F_BASE TIPOPROF OUTPUT F_CODE CODPROF[1,4] - OUTPUT F_CODEL CODPROF[5,5] + OUTPUT F_CODEL CODPROF[5,5] OUTPUT F_DESC DESC // Simula relapp KEY 1 @@ -36,7 +36,7 @@ END STRING F_CODEL 1 BEGIN - PROMPT 40 2 "Codice lingua " + PROMPT 2 5 "Codice lingua " FLAGS "U" HELP "Codice lingua del profilo" USE %LNG @@ -44,15 +44,26 @@ BEGIN DISPLAY "Codice lingua" CODTAB DISPLAY "Decrizione@50" S0 OUTPUT F_CODEL CODTAB + OUTPUT F_DESL S0 CHECKTYPE NORMAL // Simula relapp KEY 1 FIELD CODPROF[5,5] END +STRING F_DESL 50 +BEGIN + PROMPT 2 7 "Descrizione lingua " + USE %LNG KEY 2 + INPUT S0 F_DESL + DISPLAY "Decrizione@50" S0 + DISPLAY "Codice lingua" CODTAB + COPY OUTPUT F_CODEL +END + STRING F_DESC 50 BEGIN - PROMPT 2 3 "Descrizione " + PROMPT 2 9 "Descrizione profilo " HELP "Descrizione profilo utente" USE LF_FORM KEY 2 JOIN %LNG TO LF_FORM ALIAS 200 INTO CODTAB==CODPROF[5,5] diff --git a/sv/f87.dir b/sv/f87.dir index 0703c12aa..447d36125 100755 --- a/sv/f87.dir +++ b/sv/f87.dir @@ -1,3 +1,3 @@ 87 0 -$svstat|0|0|1430|38|Archivio statistiche||| +$svstat|0|0|1450|38|Archivio statistiche||| diff --git a/sv/f87.trr b/sv/f87.trr index 886806817..727037161 100755 --- a/sv/f87.trr +++ b/sv/f87.trr @@ -4,7 +4,7 @@ CODICE|1|60|0|Codice dell'oggetto della riga LEVCODE|1|2|0|Codice del livello LIVELLO|2|2|0|Livello di totale (0: totale generale; N: riga) TIPO|1|1|0|Tipo riga (alore onfronto arget ..) -DESCR|1|30|0|Descrizione riga +DESCR|1|50|0|Descrizione riga UMQTA|1|2|0|Quantità di misura usata per le quantita' R0|4|18|3|Colonna 1 R1|4|18|3| diff --git a/sv/sv1100.cpp b/sv/sv1100.cpp index 183940999..314a99c1d 100755 --- a/sv/sv1100.cpp +++ b/sv/sv1100.cpp @@ -134,7 +134,8 @@ bool TSchede_mask::realfield_handler(TMask_field& f, KEY k) if (rd.field_type() == _realfld) { const int decimals = rel.curr().ndec(rd.field_name()); - m.set(S_IMPORTO, decimals <= 3 ? "X" : ""); + const int length = rel.curr().length(rd.field_name()); + m.set(S_IMPORTO, (decimals <= 3 && length >= 6)? "X" : ""); } else return f.error_box("E' necessario selezionare un campo numerico."); @@ -551,9 +552,19 @@ bool TStampa_schede::fill_doc(TRectype& tab, const TDocumento& doc) descr << num.postfisso(); descr << " del " << doc.data(); tab.put("S1", descr); + + const bool is_nota_credito = doc.tipo().nota_credito(); + real bs = doc.basesconto(); + real td = doc.totale_doc(); + + if (is_nota_credito) + { + bs = -bs; + td = -td; + } - put_real(tab, 0, doc.basesconto(), fc, TRUE); - put_real(tab, 1, doc.totale_doc(), fc, TRUE); + put_real(tab, 0, bs, fc, TRUE); + put_real(tab, 1, td, fc, TRUE); TSheet_field& sheet = _mask->sfield(F_SINTETICA); const int fldpos = sheet.cid2index(S_FIELD); @@ -568,7 +579,11 @@ bool TStampa_schede::fill_doc(TRectype& tab, const TDocumento& doc) if (src.blank()) break; const bool importo = row.get_char(imppos) > ' '; - const real val = doc.get(src); + real val = doc.get(src); + + if (is_nota_credito) + val = -val; + put_real(tab, r+2, val, fc, importo); } return TRUE; @@ -620,9 +635,19 @@ bool TStampa_schede::fill_rdoc(TRectype& tab, const TRiga_documento& rdoc, const } descr.cut(50); tab.put("S1", descr); + + const bool is_nota_credito = doc.tipo().nota_credito(); + real ins = rdoc.importo(TRUE, FALSE, 0); + real ils = rdoc.importo(TRUE, TRUE, 0); + + if (is_nota_credito) + { + ins = -ins; + ils = -ils; + } - put_real(tab, 0, rdoc.importo(TRUE, FALSE, 0), fc, TRUE); // importo netto scontato - put_real(tab, 1, rdoc.importo(TRUE, TRUE, 0), fc, TRUE); // importo lordo scontato + put_real(tab, 0, ins, fc, TRUE); // importo netto scontato + put_real(tab, 1, ils, fc, TRUE); // importo lordo scontato TSheet_field& sheet = _mask->sfield(F_DETTAGLIATA); TString_array& arr = sheet.rows_array(); @@ -639,6 +664,10 @@ bool TStampa_schede::fill_rdoc(TRectype& tab, const TRiga_documento& rdoc, const const bool importo = row.get_char(imppos) > ' '; real val = rdoc.get(src); + + if (is_nota_credito) + val = -val; + put_real(tab, r+2, val, fc, importo); } @@ -1357,4 +1386,4 @@ int sv1100(int argc, char* argv[]) app.run(argc, argv, "Stampa schede"); return 0; } - \ No newline at end of file + diff --git a/sv/sv1100a.uml b/sv/sv1100a.uml index 7dad7d702..6910908bf 100755 --- a/sv/sv1100a.uml +++ b/sv/sv1100a.uml @@ -103,7 +103,7 @@ END STRING F_DAAGENTE 5 BEGIN PROMPT 2 11 "Dall'agente " - FLAGS "DZ" + FLAGS "UDZ" USE LF_AGENTI INPUT CODAGE F_DAAGENTE DISPLAY "Codice" CODAGE @@ -117,7 +117,7 @@ END STRING F_ADAGENTE 5 BEGIN PROMPT 23 11 "All'agente " - FLAGS "DZ" + FLAGS "UDZ" COPY USE F_DAAGENTE INPUT CODAGE F_ADAGENTE COPY DISPLAY F_DAAGENTE diff --git a/sv/sv1200.cpp b/sv/sv1200.cpp index 760d92d22..55fa041f6 100755 --- a/sv/sv1200.cpp +++ b/sv/sv1200.cpp @@ -307,7 +307,9 @@ int TFrequenza_colonne::period2column(const TPeriodo& p) const { int diff = p - _periodo_inizio; result = diff / _multiplo; - if (p < _periodo_inizio) + // Corregge arrotondamento per periodi inferiori a _periodo_inizio + // ad esempio: -1 / 12 = 0 e non -1 (risultato corretto) + if (diff < 0 && ((diff % _multiplo) != 0)) result--; } else @@ -396,7 +398,7 @@ class TStampa_stat : public TPrint_application TString16 _valid_types;// Stringa contenente i tipi di riga da stampare // ****************** // stampa file di Output - TString _wrk_row; // stringa di lavoro per le righe di stampa + TString _wrk_row, _save_code; // stringhe di lavoro per le righe di stampa TRelation * _rel; // relazione per la stampa private: @@ -442,6 +444,7 @@ protected: virtual void on_config_change(); + void set_descr(int& row); int handle_levchange(int row,const int level); int set_rows_colonne(int row, const TRectype &strec); void set_row_atpos(char section,int row,const char * f,int pos); @@ -539,7 +542,9 @@ bool TStampa_stat::set_print(int i) reset_grplevels(); // setta header e footer int row=0; - + // resetta _save_code per stampare linee raffronti nel caso non abbiano la corrispondente linea dati + _save_code = ""; + reset_header(); reset_footer(); printer().footerlen(3); @@ -584,7 +589,7 @@ void TStampa_stat::preprocess_header() } } set_header(++row,""); - set_row_atpos('H',++row," Codice Descrizione",0); + set_row_atpos('H',++row," Codice @23gDescrizione",0); lastrow=row; for (int c=0; c < _numcol; c++) // colonne { @@ -799,6 +804,54 @@ const TString& TStampa_stat::nome_totale(int c, TString& s_park) return s_park; } + +void TStampa_stat::set_descr(int& row) +{ + TRectype& strec = current_cursor()->curr(); + TParagraph_string descr("",25); // Spezzatura manuale, per evitare righe accavallate + TString r; + const int lastlev = numlevels(); + const int level = strec.get_int(SVS_LIVELLO); + int lencode = 0; + + if (_group_recs.objptr(level+1)) + { + const TRectype& rec_grp= (const TRectype&)_group_recs[level+1]; + lencode = rec_grp.get(SVS_CODICE).len(); + } + adjust_record(strec,lencode); + partkey_name(strec.get(SVS_LEVCODE), lastlev - level - 1, r); + r.upper(0,0); + if (r.blank()) + r.cut(0); + else + r << " "; + + r << strec.get(SVS_CODICE).mid(lencode); + descr = strec.get(SVS_DESCR); + if (descr.not_empty()) + r << "@23g" << descr.get(0); + set_row_atpos('R',++row,(const char *)r,_indent[level]); + + // Seconda riga eventuale... + const int items = descr.items(); + if (items > 1) + { + r = ""; + r << descr.get(1); + // Sfrutta al massimo la seconda riga, mettendo anche il terzo elemento + // e cmq trimmando al 25o carattere + if (items > 2) + { + r << " " << descr.get(2); + if (r.len() > 25) + r.cut(25); + } + r.insert("@23g"); + set_row_atpos('R',++row,(const char *)r,_indent[level]); + } +} + void TStampa_stat::set_page(int file, int count) { // prepara la pagina di stampa @@ -823,46 +876,33 @@ void TStampa_stat::set_page(int file, int count) if (level != lastlev && printmask().get_bool(F_FLAGSTOTALI+lastlev-level)) { - TString r; - switch (*strec.get(SVS_TIPO)) { case LINEA_DATI: if (level >= _liv_riga) - { - int lencode = 0; -// if (level < lastlev) - if (_group_recs.objptr(level+1)) - { - const TRectype& rec_grp= (const TRectype&)_group_recs[level+1]; - lencode = rec_grp.get(SVS_CODICE).len(); - } - adjust_record(strec,lencode); - partkey_name(strec.get(SVS_LEVCODE), lastlev - level - 1, r); - r.upper(0,0); - if (r.blank()) - r.cut(0); - else - r << " "; - const TString & descr = strec.get(SVS_DESCR); - if (descr.not_empty()) - r << descr; - else - r << strec.get(SVS_CODICE).mid(lencode); - - //r << TString(partkey_name(strec.get(SVS_LEVCODE))).upper(0,0); -// r << ' ' << strec.get(SVS_CODICE).mid(lencode); -// r.trim(); -// r << "@13g" << strec.get(SVS_DESCR); - set_row_atpos('R',++row,(const char *)r,_indent[level]); + { + _save_code = strec.get(SVS_CODICE); + set_descr(row); } if (level == _liv_riga) row = set_rows_colonne(row, strec); break; case LINEA_RAFFRONTI: if (printmask().get_bool(F_STRAFFRONTO)) + { + if (_save_code != strec.get(SVS_CODICE)) + { + TRectype stempty(LF_SVSTAT); + stempty.put(SVS_CODICE,strec.get(SVS_CODICE)); + stempty.put(SVS_LEVCODE,strec.get(SVS_LEVCODE)); + stempty.put(SVS_LIVELLO,strec.get(SVS_LIVELLO)); + stempty.put(SVS_TIPO,strec.get(SVS_TIPO)); + set_descr(row); + row = set_rows_colonne(row, stempty); + } if (level == _liv_riga) row = set_rows_colonne(++row, strec); + } break; } } @@ -1770,12 +1810,15 @@ void TStampa_stat::genera_file(const char *outfn) TLocalisamfile riep(LF_SVRIEP); riep.set_curr(new TSVriep_record); - TSVriep_record& curr = (TSVriep_record&)(riep.curr()); + TSVriep_record& curr = (TSVriep_record&) riep.curr(); const TRecfield fr_anno(curr, SVR_ANNO); const TRecfield fr_periodo(curr, SVR_PERIODO); - curr.put(SVR_ANNO, m.get_date(F_DATARAF).year()); - curr.put(SVR_PERIODO, _stats.date2period(m.get_date(F_DATARAF))); + const bool dok = m.get_date(F_DATARAF).ok(); + const TDate dd = m.get_date(dok ? F_DATARAF : F_DATAINI); + + curr.put(SVR_ANNO, dd.year()); + curr.put(SVR_PERIODO, _stats.date2period(dd)); const int num_liv_output=s_chiave.items(); const long start_status=period2long(curr.get_int(SVR_ANNO),curr.get_int(SVR_PERIODO),_stats.frequency()); @@ -1798,7 +1841,7 @@ void TStampa_stat::genera_file(const char *outfn) for (; err == NOERR && - (curr.get_int(SVR_ANNO) <= yearfin || + (curr.get_int(SVR_ANNO) < yearfin || (curr.get_int(SVR_ANNO) == yearfin && curr.get_int(SVR_PERIODO) <= periofin)) ; err = riep.next()) @@ -1833,13 +1876,15 @@ void TStampa_stat::genera_file(const char *outfn) for (int c=max(col,0);c <= range ; c++) update_file(key,levcode,LINEA_DATI,num_liv_output-l-1,c,curr, fld, l); } - if (first_raffr !=first_col && col >= first_raffr && col<=first_raffr+_numcol_dati) // periodo da confrontare + if (first_raffr !=first_col && col >= first_raffr && colname(lev_code_num); break; case CHR_CATVEN: // cat. vendita - park="categoria di vendita"; + park="cat. ven."; break; case CHR_CLI: // cliente park="cliente "; @@ -2061,8 +2106,8 @@ const TString& TStampa_stat::get_part(TString & lev_code, TSVriep_record &riepre park.rpad(3); break; default: - fatal_box("ai chent recognaiz the code of the key part!"); - park= ""; + NFCHECK("ai chent recognaiz the code of the key part!"); + park= " "; } if (park.blank()) park.replace(' ','?'); @@ -2167,7 +2212,7 @@ const TString& TStampa_stat::get_descrpart(const char *lev_code, TSVriep_record case CHR_UMISURA: // Unità di misura return _ums->get(rieprec.get(SVR_UMQTA)).get("S0"); default: - fatal_box("ai chent recognaiz the code of the key part!"); + NFCHECK("ai chent recognaiz the code of the key part!"); return EMPTY_STRING; } } diff --git a/sv/svlib01.cpp b/sv/svlib01.cpp index bcf4a2dd6..59524a097 100755 --- a/sv/svlib01.cpp +++ b/sv/svlib01.cpp @@ -626,10 +626,10 @@ const TString & TSVriep_record::get_str(const char* fieldname) const } -void TSVriep_record::put_str(const char* fieldname, const char* val) +void TSVriep_record::put_str(const char* fieldname, const char* v) { - static TString80 chiavi; - chiavi=TRectype::get_str(SVR_CHIAVI); + const TString80 val(v); + TString80 chiavi(TRectype::get_str(SVR_CHIAVI)); if (strcmp(fieldname,SVR_CODART)==0) chiavi.overwrite(val,0); diff --git a/sv/svstat.h b/sv/svstat.h index 14807740e..ed09ffdaa 100755 --- a/sv/svstat.h +++ b/sv/svstat.h @@ -1,5 +1,5 @@ #define SVS_LEN_CODICE 60 -#define SVS_LEN_DESCR 30 +#define SVS_LEN_DESCR 50 #define SVS_CODICE "CODICE" #define SVS_LIVELLO "LIVELLO" diff --git a/ve/batbeld.h b/ve/batbeld.h index a54a2fa21..e33686677 100755 --- a/ve/batbeld.h +++ b/ve/batbeld.h @@ -70,3 +70,5 @@ #define F_RIFERIMENTI_IN_TESTA 321 #define F_IGNORA_DESCRIZIONI 330 +#define F_PREZZO_DA_ORDINE 340 + diff --git a/ve/batbeld.uml b/ve/batbeld.uml index 77c438cd8..6c6fcfd2b 100755 --- a/ve/batbeld.uml +++ b/ve/batbeld.uml @@ -8,12 +8,12 @@ PAGE "Elaborazioni differite" -1 -1 0 0 GROUPBOX DLG_NULL 78 5 BEGIN - PROMPT 1 1 "@bElaborazione" + PROMPT 1 0 "@bElaborazione" END STRING F_CODICE 8 BEGIN - PROMPT 2 2 "Codice " + PROMPT 2 1 "Codice " FLAG "U" FIELD CODTAB CHECKTYPE REQUIRED @@ -30,7 +30,7 @@ END STRING F_DESCR 50 BEGIN - PROMPT 2 3 "Descrizione " + PROMPT 2 2 "Descrizione " FIELD S0 CHECKTYPE REQUIRED WARNING "E' necessario specificare un valore" @@ -44,7 +44,7 @@ END LIST F_TIPO 50 BEGIN - PROMPT 2 4 "Tipo " + PROMPT 2 3 "Tipo " ITEM " |Esterna" ITEM "1|Consegna Ordini" ITEM "2|Fatturazione bolle" @@ -56,12 +56,12 @@ END GROUPBOX DLG_NULL 78 8 BEGIN - PROMPT 1 6 "@bDocumento originale" + PROMPT 1 5 "@bDocumento originale" END STRING F_CODNUM_I 4 BEGIN - PROMPT 2 7 "Codice numerazione " + PROMPT 2 6 "Codice numerazione " FLAGS "U" FIELD S5 USE %NUM @@ -86,73 +86,73 @@ END STRING H_DOC 50 BEGIN - PROMPT 29 6 "" + PROMPT 29 5 "" FLAGS "H" END STRING F_DOC1 4 BEGIN - PROMPT 29 7 "" + PROMPT 29 6 "" FLAGS "D" END STRING F_DOC2 4 BEGIN - PROMPT 34 7 "" + PROMPT 34 6 "" FLAGS "D" END STRING F_DOC3 4 BEGIN - PROMPT 39 7 "" + PROMPT 39 6 "" FLAGS "D" END STRING F_DOC4 4 BEGIN - PROMPT 44 7 "" + PROMPT 44 6 "" FLAGS "D" END STRING F_DOC5 4 BEGIN - PROMPT 49 7 "" + PROMPT 49 6 "" FLAGS "D" END STRING F_DOC6 4 BEGIN - PROMPT 54 7 "" + PROMPT 54 6 "" FLAGS "D" END STRING F_DOC7 4 BEGIN - PROMPT 59 7 "" + PROMPT 59 6 "" FLAGS "D" END STRING F_DOC8 4 BEGIN - PROMPT 64 7 "" + PROMPT 64 6 "" FLAGS "D" END STRING F_DOC9 4 BEGIN - PROMPT 69 7 "" + PROMPT 69 6 "" FLAGS "D" END STRING F_DOC10 4 BEGIN - PROMPT 74 7 "" + PROMPT 74 6 "" FLAGS "D" END STRING F_TIPODOC_I_1 4 BEGIN - PROMPT 2 8 "Tipo documento " + PROMPT 2 7 "Tipo documento " FLAGS "U" FIELD S2[1,4] USE %TIP @@ -167,7 +167,7 @@ END STRING F_TIPODOC_I_2 4 BEGIN - PROMPT 30 8 "" + PROMPT 30 7 "" FLAGS "U" FIELD S2[5,8] COPY USE F_TIPODOC_I_1 @@ -175,13 +175,13 @@ BEGIN COPY DISPLAY F_TIPODOC_I_1 OUTPUT F_TIPODOC_I_2 CODTAB CHECKTYPE NORMAL - STR_EXPR {(#F_CODNUM_I=="")||(#H_DOC ?=("*" +#THIS_FIELD))} + STR_EXPR {(#F_CODNUM_I=="")||(#H_DOC ?=("*" +#THIS_FIELD +"*"))} WARNING "E' necessario specificare un valore valido e previsto dalla numerazione" END STRING F_TIPODOC_I_3 4 BEGIN - PROMPT 39 8 "" + PROMPT 39 7 "" FLAGS "U" FIELD S2[9,12] COPY USE F_TIPODOC_I_1 @@ -195,7 +195,7 @@ END STRING F_TIPODOC_I_4 4 BEGIN - PROMPT 48 8 "" + PROMPT 48 7 "" FLAGS "U" FIELD S2[13,16] COPY USE F_TIPODOC_I_1 @@ -209,7 +209,7 @@ END STRING F_TIPODOC_I_5 4 BEGIN - PROMPT 57 8 "" + PROMPT 57 7 "" FLAGS "U" FIELD S2[17,20] COPY USE F_TIPODOC_I_1 @@ -223,7 +223,7 @@ END STRING F_STATO_I_DOC_I_1 1 BEGIN - PROMPT 2 9 "Stato iniziale " + PROMPT 2 8 "Stato iniziale " FLAGS "U" FIELD S7[1,1] USE %STD @@ -237,7 +237,7 @@ END STRING F_STATO_I_DOC_I_2 1 BEGIN - PROMPT 30 9 "" + PROMPT 30 8 "" FLAGS "U" COPY USE F_STATO_I_DOC_I_1 INPUT CODTAB F_STATO_I_DOC_I_2 @@ -249,7 +249,7 @@ END STRING F_STATO_I_DOC_I_3 1 BEGIN - PROMPT 39 9 "" + PROMPT 39 8 "" FLAGS "U" COPY USE F_STATO_I_DOC_I_1 INPUT CODTAB F_STATO_I_DOC_I_3 @@ -261,7 +261,7 @@ END STRING F_STATO_I_DOC_I_4 1 BEGIN - PROMPT 48 9 "" + PROMPT 48 8 "" FLAGS "U" COPY USE F_STATO_I_DOC_I_1 INPUT CODTAB F_STATO_I_DOC_I_4 @@ -273,7 +273,7 @@ END STRING F_STATO_I_DOC_I_5 1 BEGIN - PROMPT 57 9 "" + PROMPT 57 8 "" FLAGS "U" COPY USE F_STATO_I_DOC_I_1 INPUT CODTAB F_STATO_I_DOC_I_5 @@ -285,7 +285,7 @@ END STRING F_TIPODOC_I_6 4 BEGIN - PROMPT 2 10 "Tipo documento " + PROMPT 2 9 "Tipo documento " FLAGS "U" FIELD S2[21,24] COPY USE F_TIPODOC_I_1 @@ -299,7 +299,7 @@ END STRING F_TIPODOC_I_7 4 BEGIN - PROMPT 30 10 "" + PROMPT 30 9 "" FLAGS "U" FIELD S2[25,28] COPY USE F_TIPODOC_I_1 @@ -313,7 +313,7 @@ END STRING F_TIPODOC_I_8 4 BEGIN - PROMPT 39 10 "" + PROMPT 39 9 "" FLAGS "U" FIELD S2[29,32] COPY USE F_TIPODOC_I_1 @@ -327,7 +327,7 @@ END STRING F_TIPODOC_I_9 4 BEGIN - PROMPT 48 10 "" + PROMPT 48 9 "" FLAGS "U" FIELD S2[33,36] COPY USE F_TIPODOC_I_1 @@ -341,7 +341,7 @@ END STRING F_TIPODOC_I_10 4 BEGIN - PROMPT 57 10 "" + PROMPT 57 9 "" FLAGS "U" FIELD S2[37,40] COPY USE F_TIPODOC_I_1 @@ -355,7 +355,7 @@ END STRING F_STATO_I_DOC_I_6 1 BEGIN - PROMPT 2 11 "Stato iniziale " + PROMPT 2 10 "Stato iniziale " FLAGS "U" FIELD S10[1,1] COPY USE F_STATO_I_DOC_I_1 @@ -368,7 +368,7 @@ END STRING F_STATO_I_DOC_I_7 1 BEGIN - PROMPT 30 11 "" + PROMPT 30 10 "" FLAGS "U" COPY USE F_STATO_I_DOC_I_1 INPUT CODTAB F_STATO_I_DOC_I_7 @@ -380,7 +380,7 @@ END STRING F_STATO_I_DOC_I_8 1 BEGIN - PROMPT 39 11 "" + PROMPT 39 10 "" FLAGS "U" COPY USE F_STATO_I_DOC_I_1 INPUT CODTAB F_STATO_I_DOC_I_8 @@ -392,7 +392,7 @@ END STRING F_STATO_I_DOC_I_9 1 BEGIN - PROMPT 48 11 "" + PROMPT 48 10 "" FLAGS "U" COPY USE F_STATO_I_DOC_I_1 INPUT CODTAB F_STATO_I_DOC_I_9 @@ -404,7 +404,7 @@ END STRING F_STATO_I_DOC_I_10 1 BEGIN - PROMPT 57 11 "" + PROMPT 57 10 "" FLAGS "U" COPY USE F_STATO_I_DOC_I_1 INPUT CODTAB F_STATO_I_DOC_I_10 @@ -416,7 +416,7 @@ END STRING F_STATO_F_DOC_I 1 BEGIN - PROMPT 2 12 "Stato finale " + PROMPT 2 11 "Stato finale " FLAGS "U" FIELD S4 USE %STD @@ -430,12 +430,12 @@ END GROUPBOX DLG_NULL 42 5 BEGIN - PROMPT 1 14 "@bDocumento finale" + PROMPT 1 13 "@bDocumento finale" END STRING F_TIPODOC_F 4 BEGIN - PROMPT 2 15 "Tipo documento " + PROMPT 2 14 "Tipo documento " FLAGS "U" FIELD S8 CHECKTYPE REQUIRED @@ -448,7 +448,7 @@ END STRING F_STATO_F_DOC_F 1 BEGIN - PROMPT 2 16 "Stato finale " + PROMPT 2 15 "Stato finale " FLAGS "U" FIELD S9 USE %STD @@ -462,7 +462,7 @@ END STRING F_CODNUM_F 4 BEGIN - PROMPT 2 17 "Codice numerazione " + PROMPT 2 16 "Codice numerazione " FLAGS "U" FIELD S6 USE %NUM @@ -484,12 +484,12 @@ END GROUPBOX DLG_NULL 35 5 BEGIN - PROMPT 44 14 "@bTipo numerazione" + PROMPT 44 13 "@bTipo numerazione" END RADIOBUTTON F_PROVVISORIO 20 BEGIN - PROMPT 44 14 "" + PROMPT 44 13 "" ITEM " |Definitiva" ITEM "X|Provvisioria" FIELD B4 @@ -497,7 +497,7 @@ END STRING F_APPLICAZIONE 20 BEGIN - PROMPT 2 19 "Applicazione " + PROMPT 2 18 "Applicazione " FIELD S3 END @@ -505,9 +505,9 @@ ENDPAGE PAGE "Parametri per raggruppamenti" -1 -1 78 20 -GROUPBOX DLG_NULL 75 8 +GROUPBOX DLG_NULL 78 8 BEGIN - PROMPT 1 1 "Condizioni per raggruppamento documenti" + PROMPT 1 1 "@bCondizioni per raggruppamento documenti" FLAG "R" END @@ -589,15 +589,15 @@ BEGIN FIELD S1[13,13] END -GROUPBOX DLG_NULL 75 4 +GROUPBOX DLG_NULL 78 5 BEGIN - PROMPT 1 10 "Modalita' di raggruppamento delle righe" + PROMPT 1 9 "@bModalita' di raggruppamento delle righe" FLAG "R" END BOOLEAN F_SOMMA_RIGHE BEGIN - PROMPT 2 11 "Somma righe simili" + PROMPT 2 10 "Somma righe simili" MESSAGE FALSE ENABLE,F_RIFERIMENTI_IN_TESTA MESSAGE TRUE DISABLE,F_RIFERIMENTI_IN_TESTA|"X",F_RIFERIMENTI_IN_TESTA FIELD B0 @@ -605,37 +605,48 @@ END BOOLEAN F_MAGAZZINO BEGIN - PROMPT 2 12 "Magazzino" + PROMPT 2 11 "Magazzino" FIELD S1[40,40] END BOOLEAN F_IVA BEGIN - PROMPT 28 12 "Codice IVA" + PROMPT 28 11 "Codice IVA" FIELD S1[41,41] END BOOLEAN F_PREZZO BEGIN - PROMPT 56 12 "Prezzo e Sconto" + PROMPT 2 12 "Prezzo e Sconto" FIELD S1[42,42] END +BOOLEAN F_PREZZO_DA_ORDINE +BEGIN + PROMPT 28 12 "Ricava prezzo e sconto da ordine" + FIELD B4 +END + +GROUPBOX DLG_NULL 78 4 +BEGIN + PROMPT 1 14 "@bGestione descrizioni" +END + BOOLEAN F_RIFERIMENTI BEGIN - PROMPT 2 14 "Gestione riferimenti" + PROMPT 2 15 "Gestione riferimenti" FIELD B1 END BOOLEAN F_RIFERIMENTI_IN_TESTA BEGIN - PROMPT 40 14 "Tutti i riferimenti in testa" + PROMPT 40 15 "Tutti i riferimenti in testa" FIELD B2 END BOOLEAN F_IGNORA_DESCRIZIONI BEGIN - PROMPT 2 15 "Ignora righe con solo descrizione" + PROMPT 2 16 "Ignora righe con solo descrizione" FIELD B3 END diff --git a/ve/batbtip.h b/ve/batbtip.h index d5d83123b..253ab001c 100755 --- a/ve/batbtip.h +++ b/ve/batbtip.h @@ -24,6 +24,7 @@ #define F_NATURA 124 #define F_NOTACREDDEB 125 #define F_LORDO 126 +#define F_FATCOM 127 #define F_STATOF_INS 150 #define F_STATOF_ST 151 diff --git a/ve/batbtip.uml b/ve/batbtip.uml index be9a846a9..35274dfcf 100755 --- a/ve/batbtip.uml +++ b/ve/batbtip.uml @@ -10,13 +10,13 @@ PAGE "Tabella tipi di documento" -1 -1 60 14 GROUPBOX DLG_NULL 75 4 BEGIN - PROMPT 1 1 "" + PROMPT 1 0 "" FLAG "R" END STRING F_CODTAB 4 BEGIN - PROMPT 2 2 "Codice " + PROMPT 2 1 "Codice " FIELD CODTAB USE %TIP CHECKTYPE REQUIRED @@ -31,42 +31,42 @@ END STRING F_DESNUM 50 BEGIN - PROMPT 2 3 "Descrizione " + PROMPT 2 2 "Descrizione " FIELD S0 HELP "Descrizione tipo documento" USE %TIP KEY 2 CHECKTYPE REQUIRED INPUT S0 F_DESNUM DISPLAY "Descrizione@40" S0 - DISPLAY "Codice" CODTAB + DISPLAY "Codice@10" CODTAB COPY OUTPUT F_CODTAB KEY 2 END STRING F_RIFERIMENTO 50 BEGIN - PROMPT 2 5 "Riferimento " + PROMPT 2 4 "Riferimento " FIELD S1 CHECKTYPE NORMAL END STRING F_PROFILO 8 BEGIN - PROMPT 2 6 "Profilo documento " + PROMPT 2 5 "Profilo documento " FIELD S4 CHECKTYPE REQUIRED END STRING F_PSTAMPA 8 BEGIN - PROMPT 44 6 "Profilo stampa documento " + PROMPT 44 5 "Profilo stampa documento " FIELD S5 CHECKTYPE REQUIRED END NUMBER F_NCOPIE 3 BEGIN - PROMPT 2 7 "Numero di copie " + PROMPT 2 6 "Numero di copie " FIELD I0 NUM_EXPR {(#THIS_FIELD >= 0)} WARNING "Il numero di copie deve essere positivo" @@ -74,7 +74,7 @@ END LIST F_TIPO 24 BEGIN - PROMPT 2 8 "Tipo del documento " + PROMPT 32 6 "Tipo del documento " FIELD I1 ITEM "0|Altro" MESSAGE ENABLE,2@ ITEM "1|Bolla" MESSAGE CLEAR,2@ @@ -84,7 +84,7 @@ END STRING F_CODCAUS 3 BEGIN - PROMPT 2 9 "Codice causale contabile " + PROMPT 2 7 "Codice causale contabile " FIELD S6 USE LF_CAUSALI INPUT CODCAUS F_CODCAUS @@ -99,7 +99,7 @@ END STRING F_DESCAUS 50 BEGIN - PROMPT 2 10 "Descrizione " + PROMPT 2 8 "Descrizione " USE LF_CAUSALI KEY 2 INPUT DESCR F_DESCAUS DISPLAY "Descrizione@50" DESCR @@ -112,7 +112,7 @@ END STRING F_CODCAUSANT 3 BEGIN - PROMPT 2 11 "Codice causale anticipo " + PROMPT 2 9 "Codice causale anticipo " FIELD S10 USE LF_CAUSALI SELECT REG =="" INPUT CODCAUS F_CODCAUSANT @@ -127,7 +127,7 @@ END STRING F_DESCAUSANT 50 BEGIN - PROMPT 2 12 "Descrizione " + PROMPT 2 10 "Descrizione " USE LF_CAUSALI KEY 2 INPUT DESCR F_DESCAUSANT DISPLAY "Descrizione@50" DESCR @@ -140,25 +140,33 @@ END BOOLEAN F_NOTACREDDEB BEGIN - PROMPT 2 13 "Nota di credito/debito" + PROMPT 2 11 "Nota di credito/debito" FIELD B7 END BOOLEAN F_LORDO BEGIN - PROMPT 40 13 "Calcolo importi al lordo" + PROMPT 40 11 "Calcolo importi al lordo" FIELD B8 + MESSAGE TRUE CLEAR,F_FATCOM + MESSAGE FALSE ENABLE,F_FATCOM END BOOLEAN F_SPESEAUT BEGIN - PROMPT 2 14 "Addebito automatico spese cliente" + PROMPT 2 12 "Addebito automatico spese cliente" FIELD B0 END +BOOLEAN F_FATCOM +BEGIN + PROMPT 40 12 "Calcolo fattura commerciale" + FIELD B9 +END + BOOLEAN F_MOVMAG BEGIN - PROMPT 2 15 "Mov. di mag. a partire dallo stato " + PROMPT 2 13 "Mov. di mag. a partire dallo stato " FIELD B1 MESSAGE FALSE CLEAR,1@ MESSAGE TRUE ENABLE,1@ @@ -168,7 +176,7 @@ END STRING F_STATO_MOV_I 1 BEGIN - PROMPT 40 15 "" + PROMPT 40 13 "" FIELD S7 USE %STD INPUT CODTAB F_STATO_MOV_I @@ -183,7 +191,7 @@ END STRING F_STATO_MOV_F 1 BEGIN - PROMPT 42 15 "allo stato " + PROMPT 42 13 "allo stato " FIELD S8 COPY USE F_STATO_MOV_I INPUT CODTAB F_STATO_MOV_F @@ -198,14 +206,14 @@ END BOOLEAN F_SCARES BEGIN - PROMPT 58 15 "Scarica il residuo" + PROMPT 58 13 "Scarica il residuo" FIELD B4 GROUP 1 END STRING F_CAUS_MAG 5 BEGIN - PROMPT 2 16 "Codice causale magazzino " + PROMPT 2 14 "Codice causale magazzino " FIELD S9 USE %CAU INPUT CODTAB F_CAUS_MAG @@ -221,7 +229,7 @@ END STRING F_DESCAUS_MAG 50 BEGIN - PROMPT 2 17 "Descrizione " + PROMPT 2 15 "Descrizione " USE %CAU KEY 2 INPUT S0 F_DESCAUS_MAG DISPLAY "Descrizione@50" S0 @@ -234,19 +242,19 @@ END BOOLEAN F_STATV BEGIN - PROMPT 2 18 "Attivo per le statistiche di vendita" + PROMPT 2 16 "Attivo per le statistiche di vendita" FIELD B2 END BOOLEAN F_CLIFO_OPT BEGIN - PROMPT 44 18 "Cliente/Fornitore non obbligatorio" + PROMPT 44 16 "Cliente/Fornitore non obbligatorio" FIELD B5 END BOOLEAN F_PROVV BEGIN - PROMPT 2 19 "Attivo per le provvigioni" + PROMPT 2 17 "Attivo per le provvigioni" FIELD B3 MESSAGE FALSE CLEAR,3@ MESSAGE TRUE ENABLE,3@ @@ -254,7 +262,7 @@ END STRING F_STATO_PROVV 1 BEGIN - PROMPT 44 19 "Stato " + PROMPT 44 17 "Stato " FIELD S3 USE %STD INPUT CODTAB F_STATO_PROVV @@ -269,15 +277,16 @@ END BOOLEAN F_CONAI BEGIN - PROMPT 2 20 "Addebito CONAI" + PROMPT 2 18 "Addebito CONAI" FIELD B6 END NUMBER F_NATURA 1 BEGIN - PROMPT 44 20 "Natura transazione " + PROMPT 44 18 "Natura transazione " SHEET "Cod.|Descrizione@66" INPUT F_NATURA + ITEM "|" ITEM "1|Acquisto o vendita (compreso il baratto)" ITEM "2|Restituzione o sostituzione di merci" ITEM "3|Aiuti gernativi, privati o finanziati dalla comunita' europea" diff --git a/ve/f34.dir b/ve/f34.dir index a4cb97146..580e2fcd8 100755 --- a/ve/f34.dir +++ b/ve/f34.dir @@ -1,3 +1,3 @@ 34 0 -$rdoc|0|0|409|0|Righe documenti di vendita|#33|| +$rdoc|17|17|421|31|Righe documenti di vendita|NDOC*3|| diff --git a/ve/f34.trr b/ve/f34.trr index 091c0dfb8..96a4d82f8 100755 --- a/ve/f34.trr +++ b/ve/f34.trr @@ -1,5 +1,5 @@ 34 -48 +50 CODNUM|1|4|0|Codice Numeriazione ANNO|2|4|0|Anno PROVV|1|1|0|Tipo numerazione

rovvisoria efinitiva @@ -44,10 +44,12 @@ MOVMAG|3|7|0|Numero di movimento id magazzino CODMAGC|1|5|0|Codice di magazzino per causale collegata IMPIANTO|1|5|0|Codice impianto di produzione per MRP LINEA|1|5|0|Codice linea di produzione MRP +IDRIGA|3|6|0|Identificatore univoco e immutabile riga documento DACODNUM|1|4|0|Numerazione del documento originale DAANNO|2|4|0|Anno del documento originale DAPROVV|1|1|0|Provvisorieta' del documento originale DANDOC|3|7|0|Numero del documento originale +DAIDRIGA|3|6|0|Identificatore riga originale 2 -CODNUM+ANNO+PROVV+NDOC+NRIGA| +CODNUM+ANNO+PROVV+NDOC+NRIGA| CODNUM+ANNO+PROVV+CODART+LIVELLO+CODMAG|X diff --git a/ve/ve0100.cpp b/ve/ve0100.cpp index 1ef064543..4baedc54e 100755 --- a/ve/ve0100.cpp +++ b/ve/ve0100.cpp @@ -51,9 +51,19 @@ void TMotore_application::init_insert_mode( TMask& m ) // Giro per supplire alla mancanza di una TMask::set(short id, char c); char str_stato[2] = { stato, '\0' }; m.set(F_STATO, str_stato); - - const TString16 data_doc(m.get(F_DATADOC)); - + + TLocalisamfile doc(LF_DOC); + TDate data_doc(TODAY); + + doc.curr() = curdo.head(); + doc.read(_isgteq); + if (doc.eof() || doc.prev() == NOERR) + { + if (doc.curr().same_key(curdo.head(), 1, 1)) + data_doc = doc.get_date(DOC_DATADOC); + } + m.set(F_DATADOC, data_doc); + int pos = m.id2pos( F_DATACAMBIO1); if (pos >= 0 && m.fld(pos).active()) @@ -244,7 +254,7 @@ bool TMotore_application::user_create( ) { open_files(LF_DOC, LF_RIGHEDOC, LF_CONDV, LF_RCONDV, LF_ANAMAG, LF_SCONTI, LF_UMART, LF_TAB, LF_TABCOM, LF_CLIFO, LF_CFVEN, LF_INDSP, LF_OCCAS, LF_PCON, - LF_MOVMAG, LF_RMOVMAG, LF_MAG, LF_SVRIEP, LF_AGENTI, LF_PERCPROV, 0); + LF_MOVMAG, LF_RMOVMAG, LF_MAG, LF_SVRIEP, LF_AGENTI, LF_PERCPROV, LF_ATTIV, LF_CAUSALI, 0); _config_ditta = new TConfig(CONFIG_DITTA); @@ -255,8 +265,9 @@ bool TMotore_application::user_create( ) _msk = new TMask("ve0100a"); set_search_field(F_NDOC); - query_mask().set_handler( F_CODNUM, TDocumento_mask::num_handler ); - query_mask().set_handler( F_TIPODOC, TDocumento_mask::tip_handler ); + _msk->set_handler( F_CODNUM, TDocumento_mask::num_handler ); + _msk->set_handler( F_TIPODOC, TDocumento_mask::tip_handler ); + _msk->set_handler( F_NUMDOCRIF, TDocumento_mask::numdocrif_search_handler ); TConfig utente( CONFIG_USER ); _codnum = utente.get("CODNUM"); diff --git a/ve/ve0100a.uml b/ve/ve0100a.uml index e58aea96e..b1cde3d3a 100755 --- a/ve/ve0100a.uml +++ b/ve/ve0100a.uml @@ -89,6 +89,7 @@ PAGE "Estremi del documento" 1 1 60 14 DISPLAY "Provv" PROVV DISPLAY "Tipo" TIPODOC DISPLAY "N.Doc. " NDOC + DISPLAY "Stato@R" STATO DISPLAY "Data\ndocumento" DATADOC DISPLAY "C/F" TIPOCF DISPLAY "Codice" CODCF @@ -121,34 +122,39 @@ PAGE "Estremi del documento" 1 1 60 14 LIST F_TIPOCF 1 12 BEGIN PROMPT 2 4 "Tipo " - ITEM "C|Cliente" - ITEM "F|Fornitore" - KEY 2 + ITEM "C|Cliente" + ITEM "F|Fornitore" + KEY 2 END NUMBER F_CODCF 6 BEGIN - PROMPT 24 4 "Codice " - USE LF_DOC KEY 2 - JOIN LF_CLIFO INTO TIPOCF=TIPOCF CODCF==CODCF - INPUT TIPOCF F_TIPOCF SELECT - INPUT CODCF F_CODCF - INPUT PROVV F_PROVV - INPUT ANNO F_ANNO - DISPLAY "C/F" TIPOCF - DISPLAY "Codice" CODCF - DISPLAY "Num." CODNUM - DISPLAY "Anno" ANNO - DISPLAY "Provv" PROVV - DISPLAY "Tipo" TIPODOC - DISPLAY "N.Doc. " NDOC - DISPLAY "Data\ndocumento" DATADOC - DISPLAY "Ragione Sociale@50" LF_CLIFO->RAGSOC - COPY OUTPUT F_NDOC - OUTPUT F_CODNUM CODNUM - OUTPUT F_CODCF CODCF - CHECKTYPE NORMAL - KEY 2 + PROMPT 24 4 "Codice " + USE LF_DOC KEY 2 SELECT CODNUM==#F_CODNUM + JOIN LF_CLIFO INTO TIPOCF==TIPOCF CODCF==CODCF + INPUT TIPOCF F_TIPOCF SELECT + INPUT CODCF F_CODCF + INPUT PROVV F_PROVV + INPUT ANNO F_ANNO + DISPLAY "C/F" TIPOCF + DISPLAY "Codice" CODCF + DISPLAY "Num." CODNUM + DISPLAY "Anno" ANNO + DISPLAY "Provv" PROVV + DISPLAY "Tipo" TIPODOC + DISPLAY "N.Doc. " NDOC + DISPLAY "Data\ndocumento" DATADOC + DISPLAY "Ragione Sociale@50" LF_CLIFO->RAGSOC + COPY OUTPUT F_NDOC + OUTPUT F_CODCF CODCF + CHECKTYPE NORMAL + KEY 2 + END + + STRING F_NUMDOCRIF 7 + BEGIN + PROMPT 46 4 "Riferimento " + FLAGS "B" END ENDPAGE diff --git a/ve/ve0200.cpp b/ve/ve0200.cpp index 68c39802b..3a39db3d4 100755 --- a/ve/ve0200.cpp +++ b/ve/ve0200.cpp @@ -21,6 +21,7 @@ class TConf_vendite : public TConfig_application char _current; static bool check_fields(TMask_field& f, KEY k); + static bool check_fields_iva(TMask_field& f, KEY k); public: virtual bool preprocess_config (TMask& mask, TConfig& config); @@ -50,6 +51,23 @@ bool TConf_vendite::check_fields(TMask_field& f, KEY k) return TRUE; } +bool TConf_vendite::check_fields_iva(TMask_field& f, KEY k) +{ + if (k == K_ENTER) + { + TMask& m = f.mask(); + + real tot = ZERO; + + for (short i = F_EX_PERCIVA1; i <= F_EX_PERCIVA5; i+=2) + tot += m.get_real(i); + + if (tot != ZERO && tot != 100.0) + return f.error_box("La somma delle percentuali di esclusione deve dare 100 oppure 0."); + } + return TRUE; +} + bool TConf_vendite::preprocess_config (TMask& mask, TConfig& config) { disable_menu_item(M_FILE_NEW); @@ -88,6 +106,11 @@ bool TConf_vendite::preprocess_config (TMask& mask, TConfig& config) } } } + else + if (_current == '6') // solo per configurazione "f" + { + mask.set_handler(F_EX_PERCIVA1,check_fields_iva); // Basta su uno che controlla tutti all'uscita della maschera + } return TRUE; } diff --git a/ve/ve0200f.uml b/ve/ve0200f.uml index 0a17ff825..14586668a 100755 --- a/ve/ve0200f.uml +++ b/ve/ve0200f.uml @@ -277,4 +277,138 @@ END ENDPAGE +PAGE "Esclusioni IVA" 1 1 60 14 + +STRING F_EX_IVA1 4 +BEGIN + PROMPT 2 2 "Codice IVA " + USE %IVA + FLAGS "U" + INPUT CODTAB F_EX_IVA1 + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + DISPLAY "Tipo" S1 + DISPLAY "%@5" R0 + OUTPUT F_EX_IVA1 CODTAB + CHECKTYPE NORMAL + VALIDATE ZEROFILL_FUNC 2 + MESSAGE EMPTY CLEAR, F_EX_PERCIVA1 + MESSAGE ENABLE, F_EX_PERCIVA1 + FIELD EXCLUDE_IVA[1] +END + +NUMBER F_EX_PERCIVA1 6 2 +BEGIN + PROMPT 35 2 "% " + FIELD EXCLUDE_PERC[1] + NUM_EXPR {(#F_EX_PERCIVA1>=0.0)&&(#F_EX_PERCIVA1<=100.0)} + WARNING "Inserire una percentuale tra 0 e 100" +END + +STRING F_EX_IVA2 4 +BEGIN + PROMPT 2 3 "Codice IVA " + USE %IVA + FLAGS "U" + INPUT CODTAB F_EX_IVA2 + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + DISPLAY "Tipo" S1 + DISPLAY "%@5" R0 + OUTPUT F_EX_IVA2 CODTAB + CHECKTYPE NORMAL + VALIDATE ZEROFILL_FUNC 2 + FIELD EXCLUDE_IVA[2] + MESSAGE EMPTY CLEAR, F_EX_PERCIVA2 + MESSAGE ENABLE, F_EX_PERCIVA2 +END + +NUMBER F_EX_PERCIVA2 6 2 +BEGIN + PROMPT 35 3 "% " + FIELD EXCLUDE_PERC[2] + NUM_EXPR {(#F_EX_PERCIVA2>=0.0)&&(#F_EX_PERCIVA2<=100.0)} + WARNING "Inserire una percentuale tra 0 e 100" +END + +STRING F_EX_IVA3 4 +BEGIN + PROMPT 2 4 "Codice IVA " + USE %IVA + FLAGS "U" + INPUT CODTAB F_EX_IVA3 + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + DISPLAY "Tipo" S1 + DISPLAY "%@5" R0 + OUTPUT F_EX_IVA3 CODTAB + CHECKTYPE NORMAL + VALIDATE ZEROFILL_FUNC 2 + FIELD EXCLUDE_IVA[3] + MESSAGE EMPTY CLEAR, F_EX_PERCIVA3 + MESSAGE ENABLE, F_EX_PERCIVA3 +END + +NUMBER F_EX_PERCIVA3 6 2 +BEGIN + PROMPT 35 4 "% " + FIELD EXCLUDE_PERC[3] + NUM_EXPR {(#F_EX_PERCIVA3>=0.0)&&(#F_EX_PERCIVA3<=100.0)} + WARNING "Inserire una percentuale tra 0 e 100" +END + +STRING F_EX_IVA4 4 +BEGIN + PROMPT 2 5 "Codice IVA " + USE %IVA + FLAGS "U" + INPUT CODTAB F_EX_IVA4 + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + DISPLAY "Tipo" S1 + DISPLAY "%@5" R0 + OUTPUT F_EX_IVA4 CODTAB + CHECKTYPE NORMAL + VALIDATE ZEROFILL_FUNC 2 + FIELD EXCLUDE_IVA[4] + MESSAGE EMPTY CLEAR, F_EX_PERCIVA4 + MESSAGE ENABLE, F_EX_PERCIVA4 +END + +NUMBER F_EX_PERCIVA4 6 2 +BEGIN + PROMPT 35 5 "% " + FIELD EXCLUDE_PERC[4] + NUM_EXPR {(#F_EX_PERCIVA4>=0.0)&&(#F_EX_PERCIVA4<=100.0)} + WARNING "Inserire una percentuale tra 0 e 100" +END + +STRING F_EX_IVA5 4 +BEGIN + PROMPT 2 6 "Codice IVA " + USE %IVA + FLAGS "U" + INPUT CODTAB F_EX_IVA5 + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + DISPLAY "Tipo" S1 + DISPLAY "%@5" R0 + OUTPUT F_EX_IVA5 CODTAB + CHECKTYPE NORMAL + VALIDATE ZEROFILL_FUNC 2 + FIELD EXCLUDE_IVA[5] + MESSAGE EMPTY CLEAR, F_EX_PERCIVA5 + MESSAGE ENABLE, F_EX_PERCIVA5 +END + +NUMBER F_EX_PERCIVA5 6 2 +BEGIN + PROMPT 35 6 "% " + FIELD EXCLUDE_PERC[5] + NUM_EXPR {(#F_EX_PERCIVA5>=0.0)&&(#F_EX_PERCIVA5<=100.0)} + WARNING "Inserire una percentuale tra 0 e 100" +END + +ENDPAGE + ENDMASK diff --git a/ve/ve0300.cpp b/ve/ve0300.cpp index b333fd8f2..114a56dba 100755 --- a/ve/ve0300.cpp +++ b/ve/ve0300.cpp @@ -1097,7 +1097,7 @@ void TMask_generator::intestazione_pagina( ) _m->flag( "D" ); _m->end( ); - _m->control( T_NUMERO, DLG_NULL, 1 ); + _m->control( T_STRINGA, DLG_NULL, 1 ); _m->begin( ); _m->prompt( 67, 3, "Stato " ); _m->group( 8 ); @@ -1383,7 +1383,7 @@ void TMask_generator::genera( const TString& profilo ) // _m->flag( "A" ); _m->end( ); - _m->control( T_NUMERO, F_STATO, 1 ); + _m->control( T_STRINGA, F_STATO, 1 ); _m->begin( ); _m->prompt( 67, 3, "Stato " ); _m->field( "STATO" ); diff --git a/ve/ve1100.cpp b/ve/ve1100.cpp index 62002b8e7..6d908ed1c 100755 --- a/ve/ve1100.cpp +++ b/ve/ve1100.cpp @@ -318,11 +318,7 @@ void TDocumento_form::print_documento() const int righe = _doc->rows(); - if (righe < 1) - { - TPrintrow r; - pr.print(r); // Riga fasulla... - } + bool one_row_printed = FALSE; set_last_page(FALSE); // E' importante settare questo flag, per evitare "Falli di Piede" eheh :-) for (int r=1; r<=righe; r++) @@ -335,6 +331,17 @@ void TDocumento_form::print_documento() const word h = body.height(); for (word j = 0; j < h; j++) pr.print(body.row(j)); + + if (!one_row_printed) + one_row_printed = TRUE; + } + + if (!one_row_printed) + { + // Riga fasulla... per stampare l'intestazione obbligatoriamente, + // anche in caso che non vi siano righe nel documento o che siano tutte escluse + TPrintrow r; + pr.print(r); } if (_doc->tipo().add_conai() && _doc->clifor().vendite().get_bool("CONAIASS")) @@ -685,13 +692,10 @@ bool TDocumento_form::validate(TForm_item &cf, TToken_string &s) } if (in=="REGSOC") { - valore = _firmrel[LF_UNLOC].get("REGTRIB"); - const TString & vol = _firmrel[LF_UNLOC].get("VOLTRIB"); - if (vol.not_empty()) - valore << " Vol. " << vol; - const TString & fasc = _firmrel[LF_UNLOC].get("FASCTRIB"); - if (fasc.not_empty()) - valore << " Fasc. " << fasc; + valore = _firmrel[LF_UNLOC].get("REGIMP"); + valore.insert(" ", 2); valore.insert(" ", 6); + valore.insert(" ", 11); valore.insert(" ", 21); + valore.insert("Reg.Imp. ", 0); cf.set(valore); return TRUE; } @@ -1586,7 +1590,7 @@ bool TStampaDoc_application::create() _firmrel->add(LF_UNLOC,"CODDITTA=CODDITTA"); // si posiziona sulla prima unita' locale della ditta _firmrel->add(LF_COMUNI, "COM=STATORES+COMRES", 1, LF_ANAG, 100+LF_COMUNI); _firmrel->add(LF_COMUNI, "COM=STATORES+COMRF", 1, LF_ANAG, 200+LF_COMUNI); - open_files(LF_TABCOM, LF_TAB, LF_OCCAS, LF_CLIFO, LF_INDSP, LF_CFVEN, LF_MOVMAG, LF_RMOVMAG, LF_CONDV, LF_ANAMAG , LF_SVRIEP, LF_AGENTI, LF_PERCPROV, 0); + open_files(LF_TABCOM, LF_TAB, LF_OCCAS, LF_CLIFO, LF_INDSP, LF_CFVEN, LF_MOVMAG, LF_RMOVMAG, LF_CONDV, LF_ANAMAG , LF_SVRIEP, LF_AGENTI, LF_PERCPROV, LF_CAUSALI, 0); const int argc = TApplication::argc(); _is_lista = argc == 3 && argv(2)[0] == 'L'; diff --git a/ve/ve2100r.uml b/ve/ve2100r.uml index 00b91cee8..47af5e20e 100755 --- a/ve/ve2100r.uml +++ b/ve/ve2100r.uml @@ -1,4 +1,3 @@ -#include #include "ve2100r.h" TOOLBAR "" 0 20 60 2 diff --git a/ve/ve2400.cpp b/ve/ve2400.cpp index c57cd86e1..0dd5f4f9b 100755 --- a/ve/ve2400.cpp +++ b/ve/ve2400.cpp @@ -2,7 +2,7 @@ #include #include #include -#include +//#include #include #include #include @@ -448,11 +448,10 @@ bool TMask_anamag::handle_anno(TMask_field &fld, KEY k) bool TMask_anamag::handle_stoanno(TMask_field &fld, KEY k) { - TMask_anamag &mask=(TMask_anamag &)fld.mask(); - if (k == K_TAB) { - TSheet_field &fld_stomag= (TSheet_field &)fld.mask().field(F_SHEETSTOMAG); + TMask_anamag &mask=(TMask_anamag &)fld.mask(); + TSheet_field &fld_stomag= mask.sfield(F_SHEETSTOMAG); /*if (mask.get_int(F_STOANNO) >=mask.esercizi_contabili().last()) { @@ -466,11 +465,12 @@ bool TMask_anamag::handle_stoanno(TMask_field &fld, KEY k) } if ( fld.focusdirty() && mask.last_annosto>0 && mask.last_annosto!=fld.mask().get_int(F_STOANNO)) { - if ((mask.field(F_SHEETSTOMAG).dirty() || mask.info_sto_dirty()) && + if ((fld_stomag.dirty() || mask.info_sto_dirty()) && fld_stomag.items()>0 ) { if (fld.yesno_box("Vuoi salvare lo storico per l'anno %d",mask.last_annosto) && - handle_sheetstomag(fld_stomag,K_ENTER)) { + handle_sheetstomag(fld_stomag,K_ENTER)) + { fld_stomag.autosave(*mask._rel); fld_stomag.record()->write(TRUE); } @@ -481,12 +481,13 @@ bool TMask_anamag::handle_stoanno(TMask_field &fld, KEY k) mask.clear_info_sto(); fld_stomag.record()->read(*fld_stomag.putkey(*mask._rel)); fld_stomag.autoload(*mask._rel); - handle_sheetstomag(mask.field(F_SHEETSTOMAG),K_SPACE); + handle_sheetstomag(fld_stomag,K_SPACE); fld_stomag.force_update(); - } else + } + else mask.last_annosto=mask.get_int(F_STOANNORIF); } - return(TRUE); + return TRUE; } @@ -583,11 +584,11 @@ bool TMask_anamag::handle_sheet_cod(TMask_field &fld, KEY k) TMask &m= fld.mask(); // prende la maschere d'origine del campo TAssoc_array v; // istanzia l'hash table per il controllo di univocità - v.add(m.get(F_CODART)); // aggiunge all'hash table il codice articolo originale + TString80 codart = m.get(F_CODART); + v.add(codart); // aggiunge all'hash table il codice articolo originale for (int i= 0; i< items; i++) { - const TString80 codart(f.cell(i,0)); - + codart = f.cell(i,0); if (codart.blank()) return error_box("I codici alternativi non possono essere vuoti"); if (v.add(codart)) @@ -607,18 +608,19 @@ bool TMask_anamag::handle_sheetgiac(TMask_field &fld, KEY k) if (items > 0) { - TMask &m= f.mask(); // prende la maschere d'origine del campo + TMask_anamag &m= (TMask_anamag &)f.mask(); // prende la maschere d'origine del campo TAssoc_array v; // istanzia l'hash table per il controllo di univocità for (int i= 0; i< items; i++) { - TString codgiac(f.cell(i,F_CODMAG-FIRST_FIELD)); - codgiac << f.cell(i,F_CODDEP-FIRST_FIELD); - codgiac << f.cell(i,F_LIV1-FIRST_FIELD); - codgiac << f.cell(i,F_LIV2-FIRST_FIELD); - codgiac << f.cell(i,F_LIV3-FIRST_FIELD); - codgiac << f.cell(i,F_LIV4-FIRST_FIELD); + TString codgiac; + m.livelli_giac->pack_grpcode(codgiac, f.cell(i,F_LIV1-FIRST_FIELD),1); + m.livelli_giac->pack_grpcode(codgiac, f.cell(i,F_LIV2-FIRST_FIELD),2); + m.livelli_giac->pack_grpcode(codgiac, f.cell(i,F_LIV3-FIRST_FIELD),3); + m.livelli_giac->pack_grpcode(codgiac, f.cell(i,F_LIV4-FIRST_FIELD),4); + codgiac << f.cell(i,F_CODMAG-FIRST_FIELD); + codgiac << f.cell(i,F_CODDEP-FIRST_FIELD); if (codgiac.blank()) return error_box("I codici delle giacenze non possono essere vuoti"); // aggiunge all'hash table l'elemento 0 (primo) della riga corrente e controlla che non esista già @@ -814,9 +816,7 @@ bool TMask_anamag::handle_sheet_giac_valgiac(TMask_field &f, KEY k) else { q=(m.get_real(F_VRIM)+m.get_real(F_VACQ))/q; - TCurrency r(q, "_FIRM", TRUE); -// r*=1.0; -// r*=m.get_real(F_GIAC); + TPrice r(q); f.set(r.string()); } } @@ -970,7 +970,9 @@ bool TMask_anamag::handle_sheetstomag(TMask_field &fld, KEY k) return error_box("La composizione delle rimanenze non puo' comprendere anni seguenti"); } - } else if (k==K_SPACE) { + } else + if (k==K_SPACE) + { for (int i=0; i< f.items();) { TString16 codmag(f.cell(i,f.cid2index(F_STOCODMAG))); diff --git a/ve/ve2400.uml b/ve/ve2400.uml index d3564aff0..9ab593a70 100755 --- a/ve/ve2400.uml +++ b/ve/ve2400.uml @@ -25,9 +25,9 @@ BEGIN OUTPUT F_CODART CODART OUTPUT F_DESCR DESCR CHECKTYPE REQUIRED - MESSAGE EMPTY ENABLE,F_GCA - MESSAGE COPY,G_CODART@|DISABLE,F_GCA - MESSAGE COPY,F_SEARCHLAV|CHECK,F_SEARCHLAV + MESSAGE EMPTY ENABLE,F_GCA + MESSAGE COPY,G_CODART@|DISABLE,F_GCA + MESSAGE COPY,F_SEARCHLAV|CHECK,F_SEARCHLAV END STRING F_SEARCHLAV 20 @@ -138,7 +138,7 @@ END STRING F_ARTALT 20 BEGIN - PROMPT 2 7 "Articolo alternativo " + PROMPT 2 5 "Articolo alternativo " FIELD LF_ANAMAG->CODARTALT FLAG "U" USE LF_ANAMAG @@ -152,7 +152,7 @@ END STRING F_DESCRALT 50 BEGIN - PROMPT 2 8 "Descrizione art.alt. " + PROMPT 2 6 "Descrizione art.alt. " FLAG "U" USE LF_ANAMAG KEY 2 INPUT DESCR F_DESCRALT @@ -164,19 +164,19 @@ END STRING F_PRESIDIO 20 BEGIN - PROMPT 2 9 "Codice presidio m.s. " + PROMPT 2 7 "Codice presidio m.s. " FIELD LF_ANAMAG->COD_PMS FLAG "U" END TEXT DLG_NULL BEGIN - PROMPT 3 10 "Codici corrispondenti" + PROMPT 2 8 "@bCodici corrispondenti" END SPREADSHEET F_SHEETCOD 71 4 BEGIN - PROMPT 2 11 "Codici corrispondenti" + PROMPT 1 9 "Codici corrispondenti" FLAGS "A" USE LF_CODCORR KEY NRIGA INPUT CODART F_CODART @@ -186,12 +186,12 @@ END TEXT DLG_NULL BEGIN - PROMPT 3 15 "Descrizioni in lingua" + PROMPT 2 14 "@bDescrizioni in lingua" END -SPREADSHEET F_SHEETDESLIN 71 4 +SPREADSHEET F_SHEETDESLIN 71 BEGIN - PROMPT 2 16 "Descrizioni in lingua" + PROMPT 1 15 "Descrizioni in lingua" FLAGS "A" USE LF_DESLIN KEY NRIGA INPUT CODART F_CODART @@ -602,7 +602,7 @@ BEGIN PROMPT 3 4 "Unita' di misura articolo" END -SPREADSHEET F_SHEETUM 78 4 +SPREADSHEET F_SHEETUM 78 5 BEGIN PROMPT 1 5 "Unita' di misura " FLAGS "A" @@ -616,7 +616,7 @@ END STRING F_UMP 3 BEGIN - PROMPT 1 10 "U.M. peso " + PROMPT 1 11 "U.M. pesi " FIELD LF_ANAMAG->UMP FLAG "U" USE %UMS @@ -631,7 +631,7 @@ END NUMBER F_PESO 15 5 BEGIN - PROMPT 1 11 "Peso " + PROMPT 18 11 "Peso " FIELD LF_ANAMAG->PESO VALIDATE REQIF_FUNC 1 F_TARA WARNING "Necessario introdurre il peso se si è introdotta la tara" @@ -687,13 +687,13 @@ END NUMBER F_CONALL 15 5 BEGIN - PROMPT 26 16 "Alluminio " + PROMPT 27 16 "Alluminio " FIELD CONALL END NUMBER F_CONCAR 15 5 BEGIN - PROMPT 52 16 "Carta " + PROMPT 54 16 "Carta " FIELD CONCAR END @@ -705,13 +705,13 @@ END NUMBER F_CONLEG 15 5 BEGIN - PROMPT 26 17 "Legno " + PROMPT 27 17 "Legno " FIELD CONLEG END NUMBER F_CONVET 15 5 BEGIN - PROMPT 52 17 "Vetro " + PROMPT 54 17 "Vetro " FIELD CONVET END @@ -786,8 +786,8 @@ LISTBOX F_RIORDINO 20 BEGIN PROMPT 42 5 "Riordino per " FIELD LF_ANAMAG->RIORDINO - ITEM "P|punto di riordino" ITEM "F|fabbisogno" + ITEM "P|punto di riordino" ITEM "T|tempo" END @@ -882,21 +882,21 @@ END DATE F_DATAULC1 BEGIN - PROMPT 35 16 "data " + PROMPT 35 17 "data " FIELD LF_ANAMAG->DULTCOS1 END NUMBER F_NUMREGULC1 7 BEGIN FLAGS "D" - PROMPT 53 16 "movimento " + PROMPT 52 17 "movim. " FIELD LF_ANAMAG->NUMREG1 END NUMBER F_NUMRIGULC1 4 BEGIN FLAGS "D" - PROMPT 72 16 "riga " + PROMPT 68 17 "riga " FIELD LF_ANAMAG->NUMRIG1 END @@ -908,21 +908,21 @@ END DATE F_DATAULC2 BEGIN - PROMPT 35 17 "data " + PROMPT 35 18 "data " FIELD LF_ANAMAG->DULTCOS2 END NUMBER F_NUMREGULC2 7 BEGIN FLAGS "D" - PROMPT 53 17 "movimento " + PROMPT 52 18 "movim. " FIELD LF_ANAMAG->NUMREG2 END NUMBER F_NUMRIGULC2 4 BEGIN FLAGS "D" - PROMPT 72 17 "riga " + PROMPT 68 18 "riga " FIELD LF_ANAMAG->NUMRIG2 END @@ -966,7 +966,7 @@ BEGIN DISPLAY "Dal@10" D0 DISPLAY "Al@10" D1 OUTPUT F_ANNO CODTAB - CHECKTYPE NORMAL + CHECKTYPE NORMAL END STRING F_ANNORIF 4 // anno usato per il write dell'annata precedente @@ -1055,7 +1055,7 @@ BEGIN DISPLAY "Dal@10" D0 DISPLAY "Al@10" D1 OUTPUT F_STOANNO CODTAB - CHECKTYPE NORMAL + CHECKTYPE NORMAL END STRING F_STOANNORIF 4 // anno usato per il write dell'annata precedente @@ -1070,9 +1070,9 @@ BEGIN FLAGS "D" END -SPREADSHEET F_SHEETSTOMAG 77 8 +SPREADSHEET F_SHEETSTOMAG 78 8 BEGIN - PROMPT 2 7 "Composizione" + PROMPT 1 7 "Composizione" FLAGS "A" USE LF_STOMAG KEY NRIGA INPUT ANNOESRIF F_STOANNO diff --git a/ve/ve3200.cpp b/ve/ve3200.cpp index 5d140ceef..92e6e86f8 100755 --- a/ve/ve3200.cpp +++ b/ve/ve3200.cpp @@ -516,6 +516,13 @@ void TStampa_condizioni_vendita::set_page(int file, int) { } //if ((_condven=="L") || (_condven=="O")) set_row(i, "@24g#t", &_um /*FLD(LF_RCONDV, "UM")*/); // unità di misura + + if (tiporiga[0] == 'A' && _printdesagg) + { + i++; + set_row(i, "@27g#-100t", &_descragg); + } + // seconda riga: info accessorie i++; if (_filter_by_grm) diff --git a/ve/ve3200x.uml b/ve/ve3200x.uml index e41b78259..cf1686d33 100755 --- a/ve/ve3200x.uml +++ b/ve/ve3200x.uml @@ -563,8 +563,6 @@ END BOOLEAN F_RIGHECOMP // checkbox per stampa completa delle righe BEGIN PROMPT 2 11 "Righe complete" - MESSAGE TRUE ENABLE, F_PRINTDESAGG - MESSAGE FALSE DISABLE, F_PRINTDESAGG END BOOLEAN F_L_LISTVALUTA // checkbox per stampa del listino in valuta o in lire @@ -575,7 +573,6 @@ END BOOLEAN F_PRINTDESAGG //checkbox per stampa descrizione aggiuntiva articoli BEGIN PROMPT 30 10 "Descrizione aggiuntiva" - FLAGS "D" END BUTTON DLG_PRINT 9 2 diff --git a/ve/ve4100.uml b/ve/ve4100.uml index 8b08e4fa1..1a880376c 100755 --- a/ve/ve4100.uml +++ b/ve/ve4100.uml @@ -211,7 +211,7 @@ BEGIN FLAGS "U" USE LF_CONDV INPUT TIPO F_TIPO_LCO SELECT - lNPUT CATVEN F_CAT_VEN SELECT + INPUT CATVEN F_CAT_VEN SELECT INPUT TIPOCF F_TIPO_CF SELECT INPUT CODCF F_CODICE_CF INPUT COD F_CODICE_LCO diff --git a/ve/ve5300.cpp b/ve/ve5300.cpp index 319b33543..ac02fe1f7 100755 --- a/ve/ve5300.cpp +++ b/ve/ve5300.cpp @@ -62,33 +62,34 @@ int TCopydoc_mask::fill_sheet() long TCopydoc_mask::get_first_ndoc() const { - TLocalisamfile doc(LF_DOC); - TRectype& curr = doc.curr(); - - const TDate dd = get(F_TO_DATA); - const int anno = dd.year(); - const char provv = get(F_TO_PROVV)[0]; - const TString& codnum = get(F_TO_NUM); - - curr.put(DOC_PROVV, provv); - curr.put(DOC_ANNO, anno); - curr.put(DOC_CODNUM, codnum); - curr.put(DOC_NDOC, 9999999L); - - long n = 0; - - const int err = doc.read(_isgreat); - if (err != _isemptyfile) + long n = get_long(F_TO_NDOC); + if (n <= 0) { - if (err == NOERR) - doc.prev(); - if (curr.get_char(DOC_PROVV) == provv && - curr.get_int(DOC_ANNO) == anno && - curr.get(DOC_CODNUM) == codnum) - n = curr.get_long(DOC_NDOC); - } - - n++; + TLocalisamfile doc(LF_DOC); + TRectype& curr = doc.curr(); + + const TDate dd = get(F_TO_DATA); + const int anno = dd.year(); + const char provv = get(F_TO_PROVV)[0]; + const TString& codnum = get(F_TO_NUM); + + curr.put(DOC_PROVV, provv); + curr.put(DOC_ANNO, anno); + curr.put(DOC_CODNUM, codnum); + curr.put(DOC_NDOC, 9999999L); + + const int err = doc.read(_isgreat); + if (err != _isemptyfile) + { + if (err == NOERR) + doc.prev(); + if (curr.get_char(DOC_PROVV) == provv && + curr.get_int(DOC_ANNO) == anno && + curr.get(DOC_CODNUM) == codnum) + n = curr.get_long(DOC_NDOC); + } + n++; + } return n; } @@ -110,6 +111,16 @@ bool TCopydoc_mask::on_field_event(TOperable_field& o, TField_event e, long joll if (tot == 0) return error_box("Non ci sono tipi documento compatibili"); } + // Fall down + case F_FROM_FRNDOC: + case F_FROM_TONDOC: + if (e == fe_modify || e == fe_init) + { + const long docfr = get_long(F_FROM_FRNDOC); + const long docto = get_long(F_FROM_TONDOC); + reset(F_TO_NDOC); + enable(F_TO_NDOC, docfr > 0 && docfr == docto); + } break; case F_TIPI_DOC: if (e == fe_close) @@ -122,6 +133,18 @@ bool TCopydoc_mask::on_field_event(TOperable_field& o, TField_event e, long joll return error_box("Non ci sono tipi documento selezionati"); } break; + case F_TO_NDOC: + if ((e == fe_modify || e == fe_close) && !o.empty()) + { + TLocalisamfile doc(LF_DOC); + doc.put(DOC_PROVV, get(F_TO_PROVV)); + doc.put(DOC_ANNO, get_date(F_TO_DATA).year()); + doc.put(DOC_CODNUM, get(F_TO_NUM)); + doc.put(DOC_NDOC, o.get()); + if (doc.read() == NOERR) + return error_box("Il documento di destinazione esiste gia'"); + } + break; default: break; } @@ -180,10 +203,10 @@ void TCopydoc_app::main_loop() rec_from.put(DOC_ANNO, m.get(F_FROM_ANNO)); rec_from.put(DOC_CODNUM, m.get(F_FROM_NUM)); rec_from.put(DOC_PROVV, m.get(F_FROM_PROVV)); - rec_from.put(DOC_NDOC, m.get(F_NUMFR)); + rec_from.put(DOC_NDOC, m.get(F_FROM_FRNDOC)); TRectype rec_to(rec_from); - rec_to.put(DOC_NDOC, m.get(F_NUMTO)); + rec_to.put(DOC_NDOC, m.get(F_FROM_TONDOC)); // Costruisce il filtro sui tipi documento selezionati // Il pipe significa OR per le espressioni diff --git a/ve/ve5300.h b/ve/ve5300.h index 8bce8ae8d..b2a3ddf91 100755 --- a/ve/ve5300.h +++ b/ve/ve5300.h @@ -1,19 +1,20 @@ -#define F_FROM_ANNO 201 -#define F_FROM_NUM 202 -#define F_FROM_PROVV 203 -#define F_FROM_DES 204 -#define F_TIPI_DOC 205 -#define F_NUMFR 206 -#define F_NUMTO 207 -#define F_OLD_STR 208 -#define F_NEW_STR 209 -#define F_PERC 210 +#define F_FROM_ANNO 201 +#define F_FROM_NUM 202 +#define F_FROM_PROVV 203 +#define F_FROM_DES 204 +#define F_TIPI_DOC 205 +#define F_FROM_FRNDOC 206 +#define F_FROM_TONDOC 207 +#define F_OLD_STR 208 +#define F_NEW_STR 209 +#define F_PERC 210 -#define F_TO_DATA 301 -#define F_TO_NUM 302 -#define F_TO_PROVV 303 -#define F_TO_DES 304 +#define F_TO_DATA 301 +#define F_TO_NUM 302 +#define F_TO_PROVV 303 +#define F_TO_DES 304 +#define F_TO_NDOC 305 -#define F_TIPO_SEL 101 -#define F_TIPO_DOC 102 -#define F_TIPO_DES 103 +#define F_TIPO_SEL 101 +#define F_TIPO_DOC 102 +#define F_TIPO_DES 103 diff --git a/ve/ve5300a.uml b/ve/ve5300a.uml index 0bbb2e9d1..e038c4638 100755 --- a/ve/ve5300a.uml +++ b/ve/ve5300a.uml @@ -59,7 +59,7 @@ BEGIN CHECKTYPE REQUIRED END -NUMBER F_NUMFR 6 +NUMBER F_FROM_FRNDOC 6 BEGIN PROMPT 2 3 "Da numero " USE LF_DOC @@ -67,7 +67,7 @@ BEGIN INPUT ANNO F_FROM_ANNO SELECT INPUT CODNUM F_FROM_NUM SELECT INPUT PROVV F_FROM_PROVV SELECT - INPUT NDOC F_NUMFR + INPUT NDOC F_FROM_FRNDOC DISPLAY "Num." CODNUM DISPLAY "Anno" ANNO DISPLAY "Provv" PROVV @@ -77,19 +77,19 @@ BEGIN DISPLAY "C/F" TIPOCF DISPLAY "Codice" CODCF DISPLAY "Ragione Sociale@50" LF_CLIFO->RAGSOC - OUTPUT F_NUMFR NDOC + OUTPUT F_FROM_FRNDOC NDOC END -NUMBER F_NUMTO 6 +NUMBER F_FROM_TONDOC 6 BEGIN PROMPT 26 3 "A numero " - COPY USE F_NUMFR + COPY USE F_FROM_FRNDOC INPUT ANNO F_FROM_ANNO SELECT INPUT CODNUM F_FROM_NUM SELECT INPUT PROVV F_FROM_PROVV SELECT - INPUT NDOC F_NUMTO - COPY DISPLAY F_NUMFR - OUTPUT F_NUMTO NDOC + INPUT NDOC F_FROM_TONDOC + COPY DISPLAY F_FROM_FRNDOC + OUTPUT F_FROM_TONDOC NDOC END GROUPBOX DLG_NULL 76 7 @@ -104,6 +104,11 @@ BEGIN CHECKTYPE REQUIRED END +NUMBER F_TO_NDOC 6 +BEGIN + PROMPT 30 6 "Numero " +END + LIST F_TO_PROVV 1 12 BEGIN PROMPT 60 6 "" diff --git a/ve/ve6.cpp b/ve/ve6.cpp index 171fe5273..79ad856c4 100755 --- a/ve/ve6.cpp +++ b/ve/ve6.cpp @@ -1,32 +1,23 @@ -#include #include -#include - #include "ve6.h" // dichiarazioni delle procedure -#define usage "Errore - Utilizzo: %s -{1|2|3}" - int main( int argc, char** argv ) { int rt = -1; - const int r = (argc > 1) ? atoi( &argv[1][1] ) : -1; + const int r = (argc > 1) ? argv[1][1]-'0' : -1; switch (r) { - case 1: - rt = ve6100( argc, argv ); // contabilizzazione documenti - break; case 2: - rt = ve6200 (argc, argv); // creazione fatture partendo da bolle - break; + ve6200(argc, argv); break; // creazione fatture partendo da bolle case 3: - rt = ve6300 (argc, argv); // generazione effetti - break; + ve6300(argc, argv); break; // generazione effetti + case 4: + ve6400(argc, argv); break; // generazione scontrini default: - error_box( usage, argv[0] ); - break; + ve6100(argc, argv); break; // contabilizzazione documenti } exit(0); - return rt; + return 0; } diff --git a/ve/ve6.h b/ve/ve6.h index c71413b66..802d7b5d4 100755 --- a/ve/ve6.h +++ b/ve/ve6.h @@ -1,10 +1,9 @@ -// Dichiarazione delle funzioni per ve6.cpp - -#if !defined (_VE6_H) -#define _VE6_H +#ifndef __VE6_H +#define __VE6_H int ve6100 (int, char**); int ve6200 (int, char**); int ve6300 (int, char**); +int ve6400 (int, char**); #endif diff --git a/ve/ve6100.cpp b/ve/ve6100.cpp index 1ff095177..797abcb2b 100755 --- a/ve/ve6100.cpp +++ b/ve/ve6100.cpp @@ -27,15 +27,16 @@ // Scared uh? #include -#include -#include #include -#include -#include #include -#include +#include +#include +#include +#include + #include "velib.h" #include "../cg/cgsaldac.h" + #include "ve6100a.h" @@ -251,7 +252,7 @@ bool TContabilizzazione_app::create() // } open_files(LF_TABCOM, LF_TAB, LF_CLIFO, LF_OCCAS, LF_INDSP, LF_CFVEN, LF_DOC, LF_RIGHEDOC, LF_ANAMAG, LF_MOVMAG, LF_RMOVMAG, - LF_PCON, LF_CONDV, LF_SVRIEP, LF_AGENTI, LF_PERCPROV, 0); + LF_PCON, LF_CONDV, LF_SVRIEP, LF_AGENTI, LF_PERCPROV, LF_ATTIV, LF_CAUSALI, 0); _msk = new TMask("ve6100a"); _msk->set_handler(F_CODICE_ELAB,handle_cod_eld); _msk->set_handler(F_DATA_INI,handle_data_range); diff --git a/ve/ve6300.cpp b/ve/ve6300.cpp index 9e2fccea1..ddbf4fa2d 100755 --- a/ve/ve6300.cpp +++ b/ve/ve6300.cpp @@ -58,7 +58,6 @@ class TGenerazioneEffetti_app : public TApplication _group_by_agent; // raggruppa per agente TArray _file; protected: // TApplication - void open_files(int logicnum, ...); // Le 4 seguenti non hanno bisogno di commenti virtual bool menu(MENU_TAG mt); virtual bool create(); @@ -93,18 +92,6 @@ public: inline TGenerazioneEffetti_app& app() { return (TGenerazioneEffetti_app&) main_app(); } -void TGenerazioneEffetti_app::open_files(int logicnum, ...) -{ - va_list marker; - va_start(marker, logicnum); - while (logicnum > 0) - { - CHECKD(_file.objptr(logicnum) == NULL, "File gia' aperto: ", logicnum); - _file.add(new TLocalisamfile(logicnum), logicnum); - logicnum = va_arg(marker, int); - } -} - bool TGenerazioneEffetti_app::handle_data_range(TMask_field& f, KEY k) { if (k==K_ENTER && f.dirty()) @@ -215,7 +202,7 @@ bool TGenerazioneEffetti_app::create() error_box("Impossibile eseguire il programma se il modulo Effetti non e' abilitato"); return FALSE; } - open_files(LF_TABCOM, LF_TAB, LF_CLIFO, LF_OCCAS, LF_INDSP, LF_CFVEN, LF_DOC, LF_RIGHEDOC, LF_ANAMAG, LF_MOVMAG, LF_RMOVMAG, LF_CONDV, LF_SVRIEP, LF_AGENTI, LF_PERCPROV, LF_CESS, 0); + open_files(LF_TABCOM, LF_TAB, LF_CLIFO, LF_OCCAS, LF_INDSP, LF_CFVEN, LF_DOC, LF_RIGHEDOC, LF_ANAMAG, LF_MOVMAG, LF_RMOVMAG, LF_CONDV, LF_SVRIEP, LF_AGENTI, LF_PERCPROV, LF_CESS, LF_CAUSALI, 0); _msk = new TMask("ve6300a"); _msk->set_handler(F_CODICE_ELAB,handle_cod_eld); _msk->set_handler(F_DATA_INI,handle_data_range); diff --git a/ve/ve6400.cpp b/ve/ve6400.cpp new file mode 100755 index 000000000..3dbdc7606 --- /dev/null +++ b/ve/ve6400.cpp @@ -0,0 +1,326 @@ +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include "ve6400a.h" +#include "velib.h" + +/////////////////////////////////////////////////////////// +// Maschera principale +/////////////////////////////////////////////////////////// + +class TScontrino_mask : public TAutomask +{ + bool _ini_loaded; + TFilename _ini_name; + +protected: + virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); + + // Funzioni di invio ai registratori di cassa conosciuti + bool send_er400_data(bool extra); + +public: + bool load_ini(); + bool save_ini(KEY k); + + bool load_profile(); + bool save_profile(); + + bool send_data(); + + TScontrino_mask(); + virtual ~TScontrino_mask(); +}; + +bool TScontrino_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) +{ + switch (o.dlg()) + { + case DLG_SAVEREC: + if (e == fe_button) + { + if (send_data() && _ini_loaded) + stop_run(K_AUTO_ENTER); + } + break; + default: + break; + } + return TRUE; +} + +bool TScontrino_mask::load_profile() +{ + TFilename f; + f =::firm2dir(-1); // Directory dati + f.add("config"); // Directory config + f.add(source_file()); // Nome Maschera + f.ext("ini"); // Estensione + TConfig ini(f, "Main"); + set(F_REGISTRATORE, ini.get("Registratore")); + set(F_SALUTI, ini.get("Saluti", NULL, -1, "Arrivederci Grazie!")); + return TRUE; +} + +bool TScontrino_mask::save_profile() +{ + TFilename f; + f =::firm2dir(-1); // Directory dati + f.add("config"); // Directory config + f.add(source_file()); // Nome Maschera + f.ext("ini"); // Estensione + TConfig ini(f, "Main"); + ini.set("Registratore", get(F_REGISTRATORE)); + ini.set("Saluti", get(F_SALUTI)); + return TRUE; +} + +bool TScontrino_mask::load_ini() +{ + _ini_loaded = FALSE; + + const TApplication& a = main_app(); + const int argc = a.argc(); + if (argc <= 2) + return FALSE; + + TSheet_field& sheet = sfield(F_SHEET); + + const TString& arg = a.argv(2); + if ((arg[0] != '-' && arg[0] != '/') || (arg[1] != 'i' && arg[1] != 'I')) + return FALSE; + + _ini_name = arg.mid(2); + if (_ini_name.blank() && argc > 3) + _ini_name = a.argv(3); + + if (!_ini_name.exist()) + return FALSE; + + TString16 para; + para.format("%d", LF_DOC); + TString tmp; + + TDocumento doc; + + TConfig ini(_ini_name, para); + TAssoc_array& vars = ini.list_variables(); + FOR_EACH_ASSOC_STRING(vars, obj, key, str) + { + if (*str == '"') + { + tmp = str; + tmp.strip("\""); + str = tmp; + } + doc.put(key, str); + } + + const TString& cofi = doc.clifor().get(CLI_COFI); + if (cofi.not_empty()) + set(F_COFI, cofi); + else + { + const TString& piva = doc.clifor().get(CLI_PAIV); + set(F_COFI, piva); + } + + for (int i = 1; ; i++) + { + para.format("%d,%d", LF_RIGHEDOC, i); + if (!ini.set_paragraph(para)) + break; + + const TString& tiporiga = ini.get(RDOC_TIPORIGA); + TRiga_documento& rdoc = doc.new_row(tiporiga); + TAssoc_array& vars = ini.list_variables(); + FOR_EACH_ASSOC_STRING(vars, obj, key, str) + { + if (*str == '"') + { + tmp = str; + tmp.strip("\""); + str = tmp; + } + rdoc.put(key, str); + } + + if (tiporiga.not_empty() && rdoc.is_articolo()) + { + TToken_string& row = sheet.row(-1); + row = rdoc.get(RDOC_CODARTMAG); + row.add(rdoc.get(RDOC_DESCR)); + row.add(rdoc.get(RDOC_QTA)); + row.add(rdoc.prezzo(TRUE, TRUE).string()); + row.add("1"); + } + } + + _ini_loaded = sheet.items() > 0; + return _ini_loaded; +} + +bool TScontrino_mask::save_ini(KEY k) +{ + bool ok = _ini_loaded && _ini_name.exist(); + if (ok) + { + TConfig ini(_ini_name, "Main"); + ini.set("Result", k == K_ENTER ? "OK" : "CANCEL"); + ini.set("Error", "0"); + + const TRectype& eld = cache().get("%ELD", ini.get("Action")); + const TString& stato_finale = eld.get("S4"); + if (stato_finale.not_empty()) + { + TString16 para; para.format("%d", LF_DOC); + ini.set(DOC_STATO, stato_finale, para); + } + } + return ok; +} + +bool TScontrino_mask::send_er400_data(bool extra) +{ + TSheet_field& sheet = sfield(F_SHEET); + const int rows = sheet.items(); + if (rows <= 0) + return FALSE; + + TMask m("Modalita' di pagamento", 1, 26, 8); + m.add_radio(101, 0, "", 1, 0, 24, + "CASH|TICK|ASS|CARD|CRT", + "Contanti|Buoni|Assegno|Carta di Credito|Credito"); + 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) + return FALSE; + + const char* server = "Sidcomm95"; + const char* topic = server; // Ignoranza totale delle regole di buona programmazione DDE! + TDDE smart; + if (!smart.initiate(server, topic)) + return error_box("Impossibile stabilire una comunicazione DDE con %s", server); + + TString80 cmd, tmp; + + const int text_len = extra ? 18 : 15; + TParagraph_string para("", text_len); + + const int pos_descr = sheet.cid2index(F_DESCART); + const int pos_prezzo = sheet.cid2index(F_PREZZO); + const int pos_rep = sheet.cid2index(F_REPARTO); + const int pos_qta = sheet.cid2index(F_QTA); + for (int r = 0; r < rows; r++) + { + const TToken_string& row = sheet.row(r); + cmd = "[PLU,"; + + row.get(pos_descr, tmp); + if (tmp.blank()) continue; + + tmp.replace(',', ' '); tmp.replace('[', '('); tmp.replace(']', ')'); + para = tmp; + cmd << para.get(0); + + real price; row.get(pos_prezzo, price); + cmd << ',' << price; + + int rep; row.get(pos_rep, rep); + if (rep <= 0 || rep > 25) rep = 1; + cmd << ',' << rep; + + real qta; row.get(pos_qta, qta); + cmd << ',' << qta << ']'; + + smart.execute(cmd); + } + + if (extra) + { + tmp = get(F_COFI); + if (tmp.not_empty()) + { + cmd = "[CODF,"; + cmd << get(F_COFI) << ']'; + smart.execute(cmd); + } + + para = get(F_SALUTI); + if (!para.blank()) + { + for (int i = 1; i <= 2; i++) + { + tmp = para.get(); + tmp.replace(',', ' '); tmp.replace('[', '('); tmp.replace(']', ')'); + if (!tmp.blank()) + { + cmd.format("[TXT%d,%s]", i, (const char*)tmp); + smart.execute(cmd); + } + } + } + } + + cmd = "["; + cmd << m.get(101) << ']'; + smart.execute(cmd); + + smart.terminate(); + + return TRUE; +} + +bool TScontrino_mask::send_data() +{ + bool ok = FALSE; + const TString& reg = get(F_REGISTRATORE); + if (reg == "ER400") + ok = send_er400_data(TRUE); else + if (reg == "ER315") + ok = send_er400_data(FALSE); + return ok; +} + +TScontrino_mask::TScontrino_mask() + : TAutomask("ve6400a"), _ini_loaded(FALSE) +{ load_profile(); } + +TScontrino_mask::~TScontrino_mask() +{ save_profile(); } + +/////////////////////////////////////////////////////////// +// Applicazione principale +/////////////////////////////////////////////////////////// + +class TCoulthard : public TSkeleton_application +{ +public: + virtual void main_loop(); +}; + +void TCoulthard::main_loop() +{ + open_files(LF_TAB, LF_TABCOM, LF_DOC, LF_RIGHEDOC, NULL); + open_files(LF_ANAMAG, LF_CLIFO, LF_CFVEN, LF_OCCAS, NULL); + TScontrino_mask m; + const bool loaded = m.load_ini(); + KEY k = m.run(); + if (loaded) + m.save_ini(k); +} + +int ve6400(int argc, char** argv) +{ + TCoulthard app; + app.run(argc, argv, "Scontrino"); + return 0; +} diff --git a/ve/ve6400a.h b/ve/ve6400a.h new file mode 100755 index 000000000..a8d010b68 --- /dev/null +++ b/ve/ve6400a.h @@ -0,0 +1,12 @@ +#define F_REGISTRATORE 200 +#define F_COFI 201 +#define F_RAGSOC 202 +#define F_SALUTI 203 +#define F_SHEET 208 + +#define F_CODART 101 +#define F_DESCART 102 +#define F_QTA 103 +#define F_PREZZO 104 +#define F_REPARTO 105 + diff --git a/ve/ve6400a.uml b/ve/ve6400a.uml new file mode 100755 index 000000000..95d22b544 --- /dev/null +++ b/ve/ve6400a.uml @@ -0,0 +1,119 @@ +#include "ve6400a.h" + +TOOLABR "Toolbar" 0 18 0 3 + +BUTTON DLG_SAVEREC 10 2 +BEGIN + PROMPT -12 -11 "" + PICTURE BMP_SAVEREC + PICTURE BMP_SAVERECDN +END + +BUTTON DLG_QUIT 10 2 +BEGIN + PROMPT -22 -11 "" +END + +ENDPAGE + +PAGE "Scontrino" -1 -1 78 18 + +LIST F_REGISTRATORE 5 20 +BEGIN + PROMPT 1 1 "Registratore di cassa " + ITEM "ER400|ER 400 SMART" + ITEM "ER325|ER 325 IC" +END + +STRING F_COFI 16 +BEGIN + PROMPT 1 2 "Codice Fiscale o Partita IVA cliente " + FLAGS "U" +END + +SPREADSHEET F_SHEET +BEGIN + PROMPT 0 3 "" + ITEM "Articolo@20" + ITEM "Descrizione@20" + ITEM "Quantita'" + ITEM "Prezzo@15" + ITEM "Reparto" +END + +ENDPAGE + +PAGE "Opzioni" -1 -1 78 18 + +STRING F_SALUTI 50 +BEGIN + PROMPT 1 1 "Messaggio di saluto " + FLAGS "_" +END + +ENDPAGE + +ENDMASK + +PAGE "Riga Scontrino" -1 -1 40 10 + +STRING F_CODART 20 +BEGIN + PROMPT 1 1 "Articolo " + USE LF_ANAMAG + INPUT CODART F_CODART + DISPLAY "Codice@20" CODART + DISPLAY "Descrizione@50" DESCR + OUTPUT F_CODART CODART + OUTPUT F_DESCART DESCR + CHECKTYPE REQUIRED + ADD RUN ve2 -3 +END + +STRING F_DESCART 50 20 +BEGIN + PROMPT 1 2 "Descrizione " + USE LF_ANAMAG KEY 2 + INPUT DESCR F_DESCART + DISPLAY "Descrizione@50" DESCR + DISPLAY "Codice@20" CODART + COPY OUTPUT F_CODART + CHECKTYPE REQUIRED + ADD RUN ve2 -3 +END + +NUMBER F_QTA 15 5 +BEGIN + PROMPT 1 3 "Quantita' " + PICTURE ".5" +END + +NUMBER F_PREZZO 15 +BEGIN + PROMPT 1 4 "Prezzo " + PICTURE "." +END + +NUMBER F_REPARTO 2 +BEGIN + PROMPT 1 5 "Reparto " +END + +BUTTON DLG_OK 10 2 +BEGIN + PROMPT -13 -1 "" +END + +BUTTON DLG_DELREC 10 2 +BEGIN + PROMPT -23 -1 "" +END + +BUTTON DLG_CANCEL 10 2 +BEGIN + PROMPT -33 -1 "" +END + +ENDPAGE + +ENDMASK diff --git a/ve/veconf.h b/ve/veconf.h index 2f1d05c10..a6155de95 100755 --- a/ve/veconf.h +++ b/ve/veconf.h @@ -137,6 +137,16 @@ #define F_BOLLIES 130 #define F_OMDESC 131 #define F_IMPMINBOLLI 132 +#define F_EX_IVA1 133 +#define F_EX_PERCIVA1 134 +#define F_EX_IVA2 135 +#define F_EX_PERCIVA2 136 +#define F_EX_IVA3 137 +#define F_EX_PERCIVA3 138 +#define F_EX_IVA4 139 +#define F_EX_PERCIVA4 140 +#define F_EX_IVA5 141 +#define F_EX_PERCIVA5 142 // Campi per ve0200g.uml #define F_EXPLODEDB 101 diff --git a/ve/velib.h b/ve/velib.h index 795bbc431..33544784f 100755 --- a/ve/velib.h +++ b/ve/velib.h @@ -1,10 +1,6 @@ #ifndef __VELIB_H #define __VELIB_H -#ifndef __RELATION_H -#include -#endif - #ifndef __VARMASK_H #include #endif @@ -37,10 +33,6 @@ #include #endif -#ifndef __MGLIB_H -#include <..\mg\mglib.h> -#endif - #define RIGA_MERCE 'M' #define RIGA_SPESEDOC 'S' #define RIGA_PRESTAZIONI 'P' @@ -54,6 +46,7 @@ #define STD_DECIMALS 3 #define ALL_DECIMALS 883 #define AUTO_DECIMALS -883 +#define MAX_IVA_SLICES 5 class TDocumento; class TRiga_documento; @@ -77,6 +70,7 @@ real prezzo_scontato(const real& prezzo, const char * sconto); real iva(real imponibile, const TIVA & codiva,int ndec); bool ora_hndl(TMask_field& field, KEY key); +bool totdoc_hndl(TMask_field& field, KEY key); bool codcli_hndl(TMask_field& field, KEY key); bool dummy_hndl(TMask_field& field, KEY key); bool condpag_hndl(TMask_field& field, KEY key); @@ -305,6 +299,7 @@ public: bool nota_credito() const { return get_bool("B7"); } bool add_conai() const { return get_bool("B6"); } bool calcolo_lordo() const { return get_bool("B8"); } + bool fattura_commerciale() const { return get_bool("B9"); } TTipo_documento(const char* tipodoc = NULL); TTipo_documento(const TRectype& rec); @@ -437,8 +432,9 @@ public: bool sola_descrizione() const; void forza_sola_descrizione(); - void set_original_doc_key(const TDocumento& orig); - void reset_original_doc_key(); + void set_original_rdoc_key(const TRiga_documento& orig); + void reset_original_rdoc_key(); + const TRectype* find_original_rdoc() const; virtual TRiga_documento& operator =(const TRiga_documento& r) { return copy(r);} virtual TRectype& operator =(const TRectype & r); @@ -518,7 +514,6 @@ class TDocumento : public TMultiple_rectype // velib03 TRecfield *_codcf; TRecfield *_cod_occas; char _stato_originale; -// int _liv_len[4]; TCli_for _cli_for; TOccasionale _occas; @@ -561,6 +556,7 @@ protected: int write_rewrite(TBaseisamfile & f, bool re) const; virtual TDocumento & copy(const TDocumento & d); virtual TObject* dup() const { return new TDocumento(*this); } + void calc_iva_fattura_commerciale(); void update_tabella_iva(); void dirty_tabella_iva() { _tabella_iva.destroy();} static void test_firm(); @@ -571,7 +567,8 @@ protected: void init(); void check_modules(); virtual void set_variables(TExpression * e) const ; - + int set_row_ids(); + public: TCodgiac_livelli & livelli() const ; void dirty_fields(); @@ -580,7 +577,8 @@ public: TCli_for & clifor() const; TOccasionale & occas() const; const TAgente & agente() const; - + + virtual TRecord_array& body(int logicnum = 0) const; virtual TDocumento & operator =(const TDocumento & d) {return copy(d);} virtual TRectype & operator =(const TRectype & r); virtual TRectype & operator =(const char * r); @@ -591,6 +589,7 @@ public: int rows() const { return physical_rows() + ((_sconto != NULL) ? 1 : 0) + ((_esenzione != NULL) ? 1 : 0); } const TRiga_documento& operator[](int index) const { return (const TRiga_documento&)((TDocumento *)this)->row(index); } TRiga_documento& operator[](int index) { return (TRiga_documento&)row(index); } + const TRiga_documento* get_row_id(long id) const; TRiga_documento& insert_row(int row, const char *tipo = NULL); TRiga_documento& new_row(const char *tipo = NULL); @@ -631,7 +630,7 @@ public: bool modificabile() const; bool cancellabile() const; bool stampabile() const; - + bool raggruppabile() const { return get_bool("RAGGR"); } bool raggruppabile(const TDocumento& doc, TToken_string& campi) const; @@ -702,6 +701,7 @@ protected: void configura_sheet(TSheet_field& sheet); static bool ss_notify(TSheet_field& ss, int r, KEY key); + static bool ss_handler(TMask_field& f, KEY key); static TMask* ss_getmask(int numriga, TMask& fullmask); static bool occas_handler( TMask_field& f, KEY key ); @@ -735,6 +735,7 @@ public: TCodgiac_livelli& livelli() const { return *_livelli_giac; } static bool num_handler( TMask_field& f, KEY key ); static bool tip_handler( TMask_field& f, KEY key ); + static bool numdocrif_search_handler( TMask_field& f, KEY key ); TDocumento_mask(const char* tipodoc); virtual ~TDocumento_mask(); @@ -837,15 +838,15 @@ enum TTipo_elaborazione {_esterna, _consegna_ordini, _fatturazione_bolle, _conta class TParametri_elaborazione : public TObject // velib04 { - TAssoc_array _par; + TAssoc_array _par; public: - void set(const char * name, const char * val); - void set(const char * name, const real & val) { set(name, val.string());} - - const TString & get(const char * name) const ; - const real get_real(const char * name) const { return (real) get(name);} - + void set(const char * name, const char * val); + void set(const char * name, const real & val) { set(name, val.string());} + + const TString & get(const char * name) const ; + const real get_real(const char * name) const { return (real) get(name);} + TParametri_elaborazione & copy(const TParametri_elaborazione & p) { _par = p._par; return *this;} virtual TObject* dup() const { return new TParametri_elaborazione(*this); } TParametri_elaborazione & operator =(const TParametri_elaborazione & p) {return copy(p);} @@ -856,7 +857,7 @@ public: class TElaborazione : public TRectype // velib04 { - TParametri_elaborazione _parms; + TParametri_elaborazione _parms; protected: int read(const char* cod); @@ -873,6 +874,7 @@ public: bool gestione_riferimenti() const { return get_bool("B1"); } bool riferimenti_in_testa() const { return get_bool("B2"); } bool ignora_descrizioni() const { return get_bool("B3"); } + bool prezzo_da_ordine() const { return get_bool("B4"); } const TString& codice_numerazione_iniziale() const { return get("S5"); } const TString tipo_iniziale(int i) const { return get("S2").smid(i*4, 4).rtrim(); } @@ -964,8 +966,10 @@ enum error_type { caus_ant_error, counter_p_ant_error, cau_abb_error, + cau_spe_error, write_part_error, intra_mov_error, + cont_seq_error, generic_error }; @@ -999,6 +1003,7 @@ class TContabilizzazione : public TElaborazione // velib04b *_intra, *_rintra, *_occas, + *_saldi, *_docfile, *_rdocfile; @@ -1014,25 +1019,7 @@ class TContabilizzazione : public TElaborazione // velib04b *_cra, // tabella categorie ricavo articoli *_cco; // tabella categorie contabili TRelation *_clifo; // relazione dei clienti e fornitori + cfven - - // Parametri da leggere all'inizio dell'elaborazione tramite load_parameters() - bool _nump_cfg; // se TRUE prende il numero rif. partita dal numero protocollo - bool _sc_enabled;// se TRUE il saldaconto di ditta e' abilitato - bool _in_enabled;// se TRUE il modulo INTRA e' abilitato - TToken_string _search_seq; // Sequenza di ricerca del conto costo/ricavo la correttezza dell'ordinamento - // va controllata nel programma di modifica parametri: - // "" = fine ordinamento - // CF = cliente fornitore - // CA = causale - // AR = articolo (costo/ricavo) - // GM = gruppo merceologico - // SM = sottogruppo merceologico - // RF = raggruppamento fiscale - // CV = categoria di vendita - // CC = categoria contabile - // Gli utlimi 6 fanno parte della ricerca per costi ricavi, in particolare AR,GM,SM e RF - // non possono essere interrotti da CV o CC. Ad es. CA|CF|AR|CV|GM|CC|RF non e' valida come stringa - // di ricerca. + protected: // Carica i parametri dalla configurazione bool load_parameters(); @@ -1045,7 +1032,7 @@ protected: // Funzione per ricercare il conto di costo/ricavo error_type search_costo_ricavo(TBill&, const TRiga_documento&); // Funzione per aggiungere la riga iva al TAssoc_array _righe_iva - error_type add_iva_row(const TBill&, const TRiga_documento&, const int); + error_type add_iva_row(const TBill&, const TRiga_documento&, const int, const real p); // Funzione atomica per aggiungere le righe di spese d'incasso e bolli al TAssoc_array _righe_iva void calculate_spese(real&, real&, int, bool, bool, const TString & ); // Funzione per aggiungere le righe di spese d'incasso e bolli al TAssoc_array _righe_iva (chiama calculate_spese()) @@ -1082,6 +1069,8 @@ protected: error_type write_intra(TDocumento&); // Cambia lo stato del documento error_type change_doc_status(TDocumento&); + // Aggiorna i saldi: TRUE per il movimento normale, FALSE per quello di anticipo pagamento + void aggiorna_saldi(bool n); // Visualizza l'ultimo errore rilevato void display_error(TDocumento&); // Verifica se non ci sono stati errori @@ -1097,6 +1086,10 @@ public: void set_nump(const byte n) { _nump_iva = n; } void set_writeable(const bool b) { _can_write = b; } const long docs() { return _total_docs; } + + // Ritorna TRUE se il documento precedente a doc e' gia' stato contabilizzato + bool prev_contabilized(const TDocumento& doc) const; + TContabilizzazione(const char* cod); TContabilizzazione(const TRectype& rec); virtual ~TContabilizzazione(); diff --git a/ve/velib02.cpp b/ve/velib02.cpp index 4d899f86c..575e72bef 100755 --- a/ve/velib02.cpp +++ b/ve/velib02.cpp @@ -25,7 +25,10 @@ public: TCache_articoli::TCache_articoli() : TRecord_cache(LF_ANAMAG, 1) -{ } +{ + test_file_changes(); // Tieni d'occhio le modifiche sul file + set_items_limit(256); // Standard +} TObject* TCache_articoli::rec2obj(const TRectype& curr) const { @@ -275,17 +278,20 @@ void TRiga_documento::forza_sola_descrizione() { // In realta' il test serve anche a caricare la lista dei tipi riga! if (!tipo_valido() || !is_descrizione()) - { + { + TString16 cod; _tipi.restart(); for (const TObject* o = _tipi.get(); o; o = _tipi.get()) { const TTipo_riga_documento* trd = (const TTipo_riga_documento*)o; if (trd->tipo() == RIGA_DESCRIZIONI) { - put("TIPORIGA", trd->codice()); - break; + const TString& c = trd->codice(); + if (cod.empty() || c < cod) + cod = c; } } + put("TIPORIGA", cod); zero("QTA"); zero("PREZZO"); } @@ -562,7 +568,7 @@ real TRiga_documento::imponibile(bool lordo) const TDocumento_variable_field * f = (TDocumento_variable_field *) variable_field(field); CHECKS(f, "Field UNKNOWN : ", field); f->set_dirty(TRUE); - real r = get_real(field); + r = get_real(field); f->set_dirty(TRUE); } else @@ -864,19 +870,42 @@ TArticolo_giacenza * TRiga_documento::articolo() const return &(_articoli->art(codart)); } -void TRiga_documento::set_original_doc_key(const TDocumento& orig) +void TRiga_documento::set_original_rdoc_key(const TRiga_documento& orig) { - put(RDOC_DACODNUM, orig.get(DOC_CODNUM)); - put(RDOC_DAANNO, orig.get(DOC_ANNO)); - put(RDOC_DAPROVV, orig.get(DOC_PROVV)); - put(RDOC_DANDOC, orig.get(DOC_NDOC)); + put(RDOC_DACODNUM, orig.get(RDOC_CODNUM)); + put(RDOC_DAANNO, orig.get(RDOC_ANNO)); + put(RDOC_DAPROVV, orig.get(RDOC_PROVV)); + put(RDOC_DANDOC, orig.get(RDOC_NDOC)); + put(RDOC_DAIDRIGA, orig.get(RDOC_IDRIGA)); } -void TRiga_documento::reset_original_doc_key() +void TRiga_documento::reset_original_rdoc_key() { zero(RDOC_DACODNUM); zero(RDOC_DAANNO); zero(RDOC_DAPROVV); zero(RDOC_DANDOC); + zero(RDOC_DAIDRIGA); } +const TRectype* TRiga_documento::find_original_rdoc() const +{ + const long id = get_long(RDOC_DAIDRIGA); + if (id > 0L) + { + TToken_string key; + key.add(get(RDOC_DACODNUM)); + key.add(get(RDOC_DAANNO)); + key.add(get(RDOC_DAPROVV)); + key.add(get(RDOC_DANDOC)); + for (int r = 1; ; r++) + { + key.add(r, 4); + const TRectype& rec = cache().get(LF_RIGHEDOC, key); + if (rec.empty()) break; + if (rec.get_long(RDOC_IDRIGA) == id) + return &rec; + } + } + return NULL; +} diff --git a/ve/velib03.cpp b/ve/velib03.cpp index 330a4291e..741c20007 100755 --- a/ve/velib03.cpp +++ b/ve/velib03.cpp @@ -17,6 +17,7 @@ #include "../pr/prlib.h" #include "sconti.h" #include "../sv/svlib01.h" +#include "../db/dblib.h" #include @@ -1091,15 +1092,15 @@ void TDocumento::iva_esente(TString & codiva_es) const if (str_codiva.not_empty()) { - const TIVA codiva(str_codiva); - const TString & tipoiva = codiva.tipo(); - - if (tipoiva.empty()) - break; - if (tipoiva == "NI") - codiva_es = codiva.codice(); - } - } + const TIVA codiva(str_codiva); + const TString & tipoiva = codiva.tipo(); + + if (tipoiva.empty()) + break; + if (tipoiva == "NI") + codiva_es = codiva.codice(); + } + } } real TDocumento::bolli(real & imp, int ndec, TTipo_importo t) const @@ -1154,18 +1155,20 @@ real TDocumento::bolli(real & imp, int ndec, TTipo_importo t) const const real imp_spese = sp_orig * cambio + tot_bolli - iva_bolli; const real imponibile = importo - imposte - imp_spese; tot_bolli = ZERO; - real imponibile_esente; - - for (int r = physical_rows(); r > 0; r--) + if (!tipo().nota_credito()) { - const TRiga_documento& riga = ((TDocumento*)this)->row(r); - const TIVA codiva(riga.get(RDOC_CODIVA)); - - if (codiva.tipo().not_empty()) - imponibile_esente += riga.imponibile(); - } - if (imponibile_esente >= impmin_bolli) - tot_bolli = bolli_es; + real imponibile_esente; + for (int r = physical_rows(); r > 0; r--) + { + const TRiga_documento& riga = ((TDocumento*)this)->row(r); + const TIVA codiva(riga.get(RDOC_CODIVA)); + + if (codiva.tipo().not_empty()) + imponibile_esente += riga.imponibile(); + } + if (imponibile_esente >= impmin_bolli) + tot_bolli = bolli_es; + } pag.set_total(imponibile, imposte, imp_spese); pag.set_rate_auto(); @@ -1323,7 +1326,7 @@ void TDocumento::copy_contents(const TDocumento& src) const TRiga_documento& s = src[i]; TRiga_documento & r = new_row(s.tipo().codice()); copy_data(r, s); - r.set_original_doc_key(src); + r.set_original_rdoc_key(s); } } @@ -1355,19 +1358,7 @@ int TDocumento::read(TBaseisamfile& f, word op, word lockop) set_riga_esenzione(); _stato_originale = stato(); - if (is_ordine()) - { - TDate datacons(get_date(DOC_DATACONS)); - for (int i = rows(); i > 0; i--) - { - TRiga_documento & r = row(i); - TRecfield dcons(r, RDOC_DATACONS); - if (datacons == dcons) - dcons = ""; - } - } - - if (err == NOERR && tipo().statistiche() && _has_stat_ven) + if (err == NOERR && tipo_valido() && tipo().statistiche() && _has_stat_ven) { TString80 key(get(DOC_PROVV)); key << get(DOC_ANNO); key << get(DOC_CODNUM); key << get(DOC_NDOC); TObject * o = _docs_to_agg.objptr(key); @@ -1573,6 +1564,7 @@ int TDocumento::write_rewrite(TBaseisamfile & f, bool re) const } myself.update_conai(); + myself.set_row_ids(); int err = NOERR; @@ -1668,12 +1660,27 @@ int TDocumento::write_rewrite(TBaseisamfile & f, bool re) const cambio = get_real(DOC_CAMBIO); if (cambio == ZERO) cambio = 1.0; + const bool esplodente = TCausale_magazzino(mov.get(DOC_CAUSMAG)).esplodente(); + TString80 codice_riga; + TString16 caus_riga; + TDistinta_tree dist; + TString80 codart; for (i = 1; i <= rows; i++) { TRiga_documento & r = myself.row(i); - - if (r.is_articolo()) + const bool articolo = r.is_articolo(); + codart = r.get("CODARTMAG"); + codice_riga = r.get("CODART"); + if (codart.empty()) + codart = codice_riga; + caus_riga = r.get("CAUSMAG"); + bool distinta_da_esplodere = FALSE; + if (!articolo && + (codice_riga.not_empty() && + (caus_riga.not_empty() ? TCausale_magazzino(caus_riga).esplodente() : esplodente))) + distinta_da_esplodere = dist.set_root(TCodice_articolo(codice_riga)); + if (articolo || distinta_da_esplodere) { long r_num = r.get_long("MOVMAG"); if (r_num == 0) @@ -1693,17 +1700,16 @@ int TDocumento::write_rewrite(TBaseisamfile & f, bool re) const rm.put(RMOVMAG_IMPIANTO, r.get("IMPIANTO"));; rm.put(RMOVMAG_LINEA, r.get("LINEA")); rm.put(RMOVMAG_CODMAG, r.get("CODMAG")); - rm.put(RMOVMAG_CODART, r.get("CODARTMAG")); + rm.put(RMOVMAG_CODART, codart); rm.put(RMOVMAG_LIVGIAC, r.get("LIVELLO")); rm.put(RMOVMAG_UM, r.get("UMQTA")); rm.put(RMOVMAG_QUANT, qta); -// real prezzo(r.get("PREZZO")); real prezzo(r.prezzo(TRUE, FALSE)); prezzo*=cambio; rm.put(RMOVMAG_PREZZO, prezzo); - rm.put(RMOVMAG_CODCAUS, r.get("CAUSMAG")); + rm.put(RMOVMAG_CODCAUS, caus_riga); rm.put(RMOVMAG_TIPORIGA, (char) riga_dadocumento); } } @@ -1717,7 +1723,7 @@ int TDocumento::write_rewrite(TBaseisamfile & f, bool re) const { TRiga_documento & r = myself.row(i); long r_num = r.get_long("MOVMAG"); - if (r_num == num) + //if (r_num == num) per ora non ci sono movimenti diversi per righe diverse r.zero("MOVMAG"); } myself.zero("MOVMAG"); @@ -1921,7 +1927,7 @@ TProvvigioni_agente& TDocumento::calc_provvigioni(const bool generata) // // Un anticipo su di una nota di credito non dovrebbe comunque mai esistere, non ha senso. // Se esiste è un errore in inserimento da parte del cliente. - if (anticipo < tot_doc) + if (anticipo < abs(tot_doc)) { TGeneric_distrib d(anticipo, valuta ? 3 : 0); @@ -1935,12 +1941,13 @@ TProvvigioni_agente& TDocumento::calc_provvigioni(const bool generata) if (valuta) { + const TString& vl = TDocumento::valuta(); //real val1 = totimponibili * change; real val2 = pagtotimposte * change; val2.round(); real val3 = pagtotspese * change; val3.round(); real val1 = tot_doc * change; val1.round(); val1 -= val2 - val3; - pag1.set_total_valuta(pagtotimponibili, pagtotimposte, pagtotspese, change, val1, val2, val3); - pag2->set_total_valuta(provv_pag, ZERO, ZERO, change, provv_pag*change, ZERO, ZERO); + pag1.set_total_valuta(pagtotimponibili, pagtotimposte, pagtotspese, change, val1, val2, val3, vl); + pag2->set_total_valuta(provv_pag, ZERO, ZERO, change, provv_pag*change, ZERO, ZERO, vl); } else { @@ -2239,6 +2246,117 @@ real TDocumento::imponibile(bool spese, int ndec) const return val; } +void TDocumento::calc_iva_fattura_commerciale() +{ + // Calcolo iva per fatture commerciali: + // 1) effettua la sommatoria di tutti i real per ogni elementi di _tabella_iva in un TRiepilogo_iva unico + // 2) azzera _tabella_iva + // 3) scorpora in % a seconda di cio' che e' indicato in configurazione, e mette i nuovi elementi in _tabella_iva + // 4) per ogni nuovo elemento di _tabella_iva, ricalcola la relativa imposta. + TAssoc_array & table = _tabella_iva; + TRiepilogo_iva t; + static TString_array tabella_ripartizione; + const int ndec = in_valuta() ? 3 : 0; + + if (tabella_ripartizione.items() == 0) + { + TConfig cnf(CONFIG_STUDIO); + for (int k = 1; k <= MAX_IVA_SLICES; k++) + { + TToken_string* tt = new TToken_string(); + tt->add(cnf.get("EXCLUDE_PERC", "ve", k)); + tt->add(cnf.get("EXCLUDE_IVA", "ve", k)); + tabella_ripartizione.add(tt); + } + } + + // 1) + table.restart(); + for (TRiepilogo_iva * ri = (TRiepilogo_iva *) table.get(); ri != NULL; + ri = (TRiepilogo_iva *) table.get()) + { + t.imp() += ri->imp(); + t.imp_spese() += ri->imp_spese(); + t.imp_spese_row() += ri->imp_spese_row(); + t.iva_spese() += ri->iva_spese(); + t.iva_sconto() += ri->iva_sconto(); + t.sconto_perc() += ri->sconto_perc(); + t.sconto_imp() += ri->sconto_imp(); + } + // 2) + table.destroy(); + + // 3) + TArray tda; + + tda.add(new TDistrib(t.imp(), ndec)); + tda.add(new TDistrib(t.imp_spese(), ndec)); + tda.add(new TDistrib(t.imp_spese_row(), ndec)); + tda.add(new TDistrib(t.iva_spese(), ndec)); + tda.add(new TDistrib(t.iva_sconto(), ndec)); + tda.add(new TDistrib(t.sconto_perc(), ndec)); + tda.add(new TDistrib(t.sconto_imp(), ndec)); + + for (int k = 0; k < MAX_IVA_SLICES; k++) + for (int j = 0; j < 7; j++) + { + const real p (tabella_ripartizione.row(k).get(0)); + TDistrib& td = (TDistrib&) tda[j]; + td.add(p); + } + + // 4) + for (k = 0; k < MAX_IVA_SLICES; k++) + { + TString16 cod(tabella_ripartizione.row(k).get(1)); + cod.trim(); + + if (cod.empty()) + continue; + + const TIVA civa(cod); + TRiepilogo_iva * rp = (TRiepilogo_iva *) table.objptr(cod); + if (rp == NULL) + { + rp = new TRiepilogo_iva(civa); + table.add(cod, rp); + } + + for (int j = 0; j < 7; j++) + { + TDistrib& td = (TDistrib&) tda[j]; + const real rr = td.get(); + + switch (j) + { + case 0: + rp->imp() = rr; + rp->iva() = ::iva(rr, civa, ndec); + break; + case 1: + rp->imp_spese() = rr; + break; + case 2: + rp->imp_spese_row() = rr; + break; + case 3: + rp->iva_spese() = rr; + break; + case 4: + rp->iva_sconto() = rr; + break; + case 5: + rp->sconto_perc() = rr; + break; + case 6: + rp->sconto_imp() = rr; + break; + default: break; + } + } + } +} + void TDocumento::update_tabella_iva() { const int items = rows(); @@ -2255,6 +2373,7 @@ void TDocumento::update_tabella_iva() real tot_sconti; real tot_sconti_perc; const bool doc_al_lordo = tipo().calcolo_lordo(); + const bool fatt_comm = tipo().fattura_commerciale(); const int ndec = in_valuta() ? 3 : 0; TString16 codiva_es; @@ -2291,6 +2410,10 @@ void TDocumento::update_tabella_iva() tot_doc += imposta; } } + + if (table.items() == 0) + return; + if (tot_sconti != ZERO) { TGeneric_distrib d(tot_sconti, ndec); @@ -2340,6 +2463,9 @@ void TDocumento::update_tabella_iva() } } + if (fatt_comm) + calc_iva_fattura_commerciale(); + real val = spese_incasso(tot_doc, ALL_DECIMALS, _netto); TString16 codiva(codiva_es.not_empty() ? (const TString &) codiva_es : codiva_spese()); TRiepilogo_iva * ri = (TRiepilogo_iva *) table.objptr(codiva); @@ -2646,6 +2772,24 @@ TRectype & TDocumento::operator =(const char * r) return TMultiple_rectype::operator=(r); } +TRecord_array& TDocumento::body(int logicnum) const +{ + TRecord_array& r = TMultiple_rectype::body(logicnum); + + if (is_ordine()) + { + TDate datacons(get_date(DOC_DATACONS)); + for (int i = r.rows(); i > 0; i--) + { + TRectype & rec = r[i]; + TRecfield dcons(rec, RDOC_DATACONS); + if (datacons == dcons) + dcons = ""; + } + } + return r; +} + void TDocumento::update_spese_aut(TString_array & spese_aut, bool preserve_old, TSheet_field * sh) { @@ -2743,8 +2887,8 @@ real TDocumento::calc_conai_qta(int type) { const char * const __conai_art_names[] = {"CONACC", "CONALL", "CONCAR", "CONPLA", "CONLEG", "CONVET"}; const char * const __conai_cf_names[] = {"ESACC", "ESALL", "ESCAR", "ESPLA", "ESLEG", "ESVET"}; + const real perc_esenz = clifor().vendite().get(__conai_cf_names[type]); real qta = ZERO; - real perc_esenz = clifor().vendite().get(__conai_cf_names[type]); if (perc_esenz < 100.0) { @@ -2755,13 +2899,16 @@ real TDocumento::calc_conai_qta(int type) TArticolo_giacenza * art = r.articolo(); if (art != NULL) { - real row_qta = r.get_real("QTA"); + const real row_qta = r.get("QTA"); qta += row_qta*art->get_real(__conai_art_names[type]); } } - if (qta > ZERO) - qta *= (1 - perc_esenz/100.0); + if (qta > ZERO) + { + // qta *= (1 - perc_esenz/100.0); + qta = qta * (100 - perc_esenz) / 100.0; // More precise! + } } return qta; } @@ -2770,28 +2917,26 @@ void TDocumento::update_conai() { if (tipo().add_conai()) { - bool cli_add_conai = clifor().vendite().get_bool("ADDCONAI"); - TString_array conai_sp(6); - + const bool cli_add_conai = clifor().vendite().get_bool("ADDCONAI"); + + const char* conai_cod[6] = { "CODACC", "CODALL", "CODCAR", "CODPLA", "CODLEG", "CODVET" }; + const char* conai_mat[6] = { "Acciaio", "Alluminio", "Carta", "Plastica", "Legno", "Vetro" }; + TString_array conai_sp(6); // Codici spesa conai { - TConfig c(CONFIG_DITTA); - - conai_sp.add(c.get("CODACC")); - conai_sp.add(c.get("CODALL")); - conai_sp.add(c.get("CODCAR")); - conai_sp.add(c.get("CODPLA")); - conai_sp.add(c.get("CODLEG")); - conai_sp.add(c.get("CODVET")); + TConfig c(CONFIG_DITTA, "ve"); + for (int i = 0; i < 6; i++) + conai_sp.add(c.get(conai_cod[i])); } bool updated[6] = {FALSE,FALSE,FALSE,FALSE,FALSE,FALSE}; const int nrows = physical_rows(); for (int i = nrows; i > 0; i--) { - TRiga_documento & r = row(i); + TRiga_documento& r = row(i); const bool tipo_conai = r.get_char("GENTIPO") == 'C'; - - if (r.tipo().tipo() == RIGA_SPESEDOC && r.is_generata() && tipo_conai) + + // Elimina righe generate + if (tipo_conai && r.tipo().tipo() == RIGA_SPESEDOC && r.is_generata()) { const TString16 cod(r.get("CODART")); const int pos = conai_sp.find(cod); @@ -2811,23 +2956,25 @@ void TDocumento::update_conai() updated[pos] = TRUE; } } - } + } + + // Genera nuove righe if (cli_add_conai) { - TString16 cod_iva_cli = clifor().vendite().get("ASSFIS"); + const TString16 cod_iva_cli = clifor().vendite().get("ASSFIS"); TSpesa_prest sp; for (i = 0; i < 6; i++) { if (!updated[i]) { - real qta = calc_conai_qta(i); - + const real qta = calc_conai_qta(i); if (qta > ZERO) { const TString & s = conai_sp.row(i); if (sp.read(s) != NOERR) - message_box("Codice spesa %s assente", (const char *) s); + message_box("Il codice spesa CONAI %s specificato nei parametri ditta e' assente: '%s'", + conai_mat[i], (const char*)s); else { TString16 tipo(sp.tipo_riga()); @@ -2890,3 +3037,46 @@ bool TDocumento::is_nota_credito() const } return swap; } + +int TDocumento::set_row_ids() +{ + const int phrw = physical_rows(); + long maxid = 0L; + int first_needed = 0, r; + for (r = 1; r <= phrw; r++) + { + const TRiga_documento& row = physical_row(r); + const long id = row.get_long(RDOC_IDRIGA); + if (id > maxid) + maxid = id; + else + { + if (first_needed == 0) + first_needed = r; + } + } + if (first_needed > 0) + { + for (r = first_needed; r <= phrw; r++) + { + TRiga_documento& row = (TRiga_documento&)physical_row(r); + const long id = row.get_long(RDOC_IDRIGA); + if (id <= 0) + row.put(RDOC_IDRIGA, ++maxid); + } + } + return phrw; +} + +const TRiga_documento* TDocumento::get_row_id(long id) const +{ + for (int r = physical_rows(); r > 0; r--) + { + const TRiga_documento& row = physical_row(r); + if (row.get_long(RDOC_IDRIGA) == id) + return &row; + } + return NULL; +} + + diff --git a/ve/velib04.cpp b/ve/velib04.cpp index 80f8185b0..de950d66d 100755 --- a/ve/velib04.cpp +++ b/ve/velib04.cpp @@ -41,6 +41,7 @@ int TLista_documenti::read(char provv, char tipocf, long clifo, int anno, TRelation doc(LF_DOC); TRectype start(LF_DOC), stop(LF_DOC); + int anno_start, anno_stop; start.put("TIPOCF", tipocf); stop.put("TIPOCF", tipocf); @@ -51,29 +52,50 @@ int TLista_documenti::read(char provv, char tipocf, long clifo, int anno, start.put("PROVV", provv); stop.put("PROVV", provv); - start.put("ANNO", anno); - stop.put("ANNO", anno); + anno_start = anno_stop = anno; + + if (dd.ok()) + { + anno_start = dd.year(); + start.put("ANNO", anno_start); + } + + if (ad.ok()) + { + anno_stop = ad.year(); + stop.put("ANNO", anno_stop); + } if (dn > 0) { - start.put("DATADOC", num2date(provv, anno, codnum, dn)); + const TDate d(num2date(provv, anno_start, codnum, dn)); + + start.put("DATADOC", d); + start.put("ANNO", d.year()); start.put("NDOC", dn); } else { if (dd.ok() && dd > botime) start.put("DATADOC", dd); + + if (anno_start <= anno_stop) + start.put("ANNO", anno_start); } if (an > 0) { - stop.put("DATADOC", num2date(provv, anno, codnum, an)); + const TDate d(num2date(provv, anno_stop, codnum, an)); + stop.put("DATADOC", d); + stop.put("ANNO", d.year()); stop.put("NDOC", an); } else { if (ad.ok() && ad < eotime) stop.put("DATADOC", ad); + + stop.put("ANNO", anno_stop); } TString filter(16); @@ -103,7 +125,19 @@ int TLista_documenti::read(char provv, char tipocf, long clifo, int anno, { const TString16 tipodoc = head.get("TIPODOC"); const TString16 statodoc = head.get("STATO"); - if (tipidoc.get_pos(tipodoc) >= 0 && statidoc.get_pos(statodoc) >= 0) + bool match = FALSE; + + for (int i = tipidoc.items()-1; i>=0; i--) + { + if (tipodoc == tipidoc.get(i)) + if (statodoc == statidoc.get(i)) + { + match = TRUE; + break; + } + } + + if (match) { TDocumento* d = new TDocumento(head); _documenti.add(d); @@ -336,17 +370,21 @@ bool TElaborazione_esterna::elabora(TLista_documenti& doc_in, TLista_documenti& CHECK(doc_in.items() == 1, "Si deve specificare uno e un solo documento in entrata"); CHECK(doc_out.items() == 1, "Si deve specificare uno e un solo documento in uscita"); TFilename name; name.temp("ext"); + + TDocumento& d = doc_in[0]; + const int doc_fields = d.items(); + TString16 par; + { - TConfig c(name); - TDocumento & d = doc_in[0]; - int nfields = d.items(); - TString par; par.format("%d,0", LF_DOC); + TConfig c(name, "Transaction"); + c.set("Action", codice()); - for (int i = 0; i < nfields; i++) + par.format("%d", LF_DOC); + + for (int i = 0; i < doc_fields; i++) { const TString16 fname(d.fieldname(i)); TFieldref f(fname, LF_DOC); - f.write(c, par, d.get(fname)); } for (TVariable_field * v = d.first_variable_field(); v ; v = d.succ_variable_field()) @@ -354,64 +392,62 @@ bool TElaborazione_esterna::elabora(TLista_documenti& doc_in, TLista_documenti& const int rows = d.physical_rows(); if (rows > 0) { - nfields = d[1].items(); + const row_fields = d[1].items(); for (int r = 1; r <= rows; r++) { TRiga_documento row = d[r]; par.format("%d,%d", LF_RIGHEDOC, r); - for (int i = 0; i < nfields; i++) + for (int i = 0; i < row_fields; i++) { const TString16 fname(row.fieldname(i)); TFieldref f(fname, LF_RIGHEDOC); - f.write(c, par, row.get(fname)); } } } } - TString command_line(applicazione_esterna()); command_line << " -i " << name; + TString command_line(applicazione_esterna()); command_line << " /i" << name; TExternal_app app(command_line); if (app.run() == 0) { - TConfig c(name); - TDocumento & d = doc_out[0]; - int nfields = d.items(); - TString par; par.format("%d,0", LF_DOC); - - for (int i = 0; i < nfields; i++) - { - const TString16 fname(d.fieldname(i)); - TFieldref f(fname, LF_DOC); - - d.put(fname, f.read(c, par)); - } - for (TVariable_field * v = d.first_variable_field(); v ; v = d.succ_variable_field()) - v->put(c.get(v->name(), par)); - - TString_array p; - - c.list_paragraphs(p); - nfields = d[0].items(); - d.destroy_rows(); - int r = 1 ; - par.format("%d,%d", LF_RIGHEDOC, r); - while (p.find(par) >= 0) - { - TRiga_documento row = d.new_row(); - for (int i = 0; i < nfields; i++) + TConfig c(name, "Main"); + if (c.get("Result") == "SUCCESS") + { + par.format("%d", LF_DOC); + for (int i = 0; i < doc_fields; i++) { - const TString16 fname(row.fieldname(i)); - TFieldref f(fname, LF_RIGHEDOC); - - row.put(fname, f.read(c, par)); - } - r++; + const TString16 fname(d.fieldname(i)); + TFieldref f(fname, LF_DOC); + d.put(fname, f.read(c, par)); + } + for (TVariable_field * v = d.first_variable_field(); v ; v = d.succ_variable_field()) + v->put(c.get(v->name(), par)); + + TString_array p; + c.list_paragraphs(p); + d.destroy_rows(); + + int r = 1 ; par.format("%d,%d", LF_RIGHEDOC, r); - } + while (p.find(par) >= 0) + { + const TString& tiporiga = c.get(RDOC_TIPORIGA, par); + TRiga_documento& row = d.new_row(tiporiga); + for (int i = row.items()-1; i >= 0; i--) + { + const TString16 fname(row.fieldname(i)); + TFieldref f(fname, LF_RIGHEDOC); + row.put(fname, f.read(c, par)); + } + r++; + par.format("%d,%d", LF_RIGHEDOC, r); + } + return TRUE; + } } - return TRUE; + return FALSE; } /////////////////////////////////////////////////////////// diff --git a/ve/velib04a.cpp b/ve/velib04a.cpp index 2e55e5944..2bcd78f2d 100755 --- a/ve/velib04a.cpp +++ b/ve/velib04a.cpp @@ -11,13 +11,10 @@ TFatturazione_bolle::TFatturazione_bolle(const char* cod) void TFatturazione_bolle::tipi_validi(TToken_string& tipi) const { -// const TString& s2 = get("S2"); tipi.cut(0); TString16 t; for (int i = 0; i < TElaborazione::_max_tipi_doc_elab; i++) { -// t = s2.mid(i*4, 4); -// t.trim(); t = tipo_iniziale(i); if (t.not_empty()) tipi.add(t); @@ -27,13 +24,9 @@ void TFatturazione_bolle::tipi_validi(TToken_string& tipi) const void TFatturazione_bolle::stati_validi(TToken_string& stati) const { -// const TString& s7 = get("S7"); stati.cut(0); -// TString16 s; for (int i = 0; i < TElaborazione::_max_tipi_doc_elab; i++) { -// s = s7.mid(i*4, 1); -// s.trim(); const char s = stato_iniziale(i); if (s != '\0') stati.add(s); @@ -45,11 +38,9 @@ void TFatturazione_bolle::stati_validi(TToken_string& stati) const bool TFatturazione_bolle::raggruppa(TDocumento& doc_in, TDocumento& doc_out) { #ifdef DBG -// const TString tipi = get("S2"); const TString16 tipodoc = doc_in.tipo().codice(); for (int i = 0; i < TElaborazione::_max_tipi_doc_elab; i++) { -// if (tipodoc == tipi.mid(i*4, 4)) if (tipodoc == tipo_iniziale(i)) break; } @@ -63,9 +54,6 @@ bool TFatturazione_bolle::raggruppa(TDocumento& doc_in, TDocumento& doc_out) const char stato_finale_in = get_char("S4"); doc_in.stato(stato_finale_in); -// const TString& tipo_out = get("S8"); -// doc_out.put("TIPODOC", tipo_out); - const char stato_finale_out = get_char("S9"); doc_out.stato(stato_finale_out); @@ -124,13 +112,27 @@ bool TFatturazione_bolle::raggruppa(TDocumento& doc_in, TDocumento& doc_out) if (riga_uguale(1)) campi_riga.add("CODIVA"); if (riga_uguale(2)) campi_riga.add("PREZZO|SCONTO"); } - + + TRiga_documento tmp(&doc_in); for (int r = 1; r <= doc_in.physical_rows(); r++) { - const TRiga_documento& rin = doc_in[r]; - const bool rindesc = rin.sola_descrizione(); // La riga di input e' descrittiva + const TRiga_documento* rin = &doc_in[r]; + const bool rindesc = rin->sola_descrizione(); // La riga di input e' descrittiva if (ignora_desc && rindesc) continue; + + if (prezzo_da_ordine()) // Se devo copiare il prezzo originale all'ordine + { + const TRectype* row_ord = rin->find_original_rdoc(); + if (row_ord != NULL) + { + tmp = *rin; rin = &tmp; + const real ord_price = row_ord->get(RDOC_PREZZO); + const TString ord_scont = row_ord->get(RDOC_SCONTO); + tmp.put(RDOC_PREZZO, ord_price); + tmp.put(RDOC_SCONTO, ord_scont); + } + } bool elaborata = FALSE; @@ -144,9 +146,10 @@ bool TFatturazione_bolle::raggruppa(TDocumento& doc_in, TDocumento& doc_out) TRiga_documento& rout = doc_out[o]; if (rout.sola_descrizione()) // Ignora le righe descrittive continue; - if (rin.raggruppabile(rout, campi_riga)) // Se esiste una riga compatibile ... + + if (rin->raggruppabile(rout, campi_riga)) // Se esiste una riga compatibile ... { - rout += rin; // ... sommaci la quantita' ecc. + rout += *rin; // ... sommaci la quantita' ecc. elaborata = TRUE; // Ricorda di averla gia' elaborata break; } @@ -155,8 +158,8 @@ bool TFatturazione_bolle::raggruppa(TDocumento& doc_in, TDocumento& doc_out) if (!elaborata) // Se la riga non e' stata gia' sommata ... { TRiga_documento& rout = doc_out.new_row(); // ... crea una riga nuova e - doc_out.copy_data(rout, rin); // copiaci tutti i campi della riga sorgente. - rout.set_original_doc_key(doc_in); // memorizza il codice del documento originale + doc_out.copy_data(rout, *rin); // copiaci tutti i campi della riga sorgente. + rout.set_original_rdoc_key(*rin); // memorizza il codice della riga originale } } @@ -191,11 +194,11 @@ bool TFatturazione_bolle::elabora(TLista_documenti& doc_in, TLista_documenti& do { od = 0; const TString16 tipo(campione.get(DOC_TIPOCF)); - const long codice = campione.get_long(DOC_CODCF); - + const long codice = campione.get_long(DOC_CODCF); + if (tipo != doc_out[od].get(DOC_TIPOCF) || codice != doc_out[od].get_long(DOC_CODCF)) - fatal_box("Documenti incompatibili : cliente/fornitore diverso"); + return error_box("Documenti incompatibili : cliente/fornitore diverso"); } else { @@ -211,7 +214,8 @@ bool TFatturazione_bolle::elabora(TLista_documenti& doc_in, TLista_documenti& do if (od >= tot) // Se non ho trovato un documento compatibile ... { // ... creane uno nuovo (certamente compatibile) const char provv = tipo_numerazione(); - const int anno = campione.anno(); +// const int anno = campione.anno(); + const int anno = data_elab.year(); // const TString codnum = codice_numerazione_finale(); const TString16 codnum(campione.get("CODNUM")); TDocumento* new_doc = new TDocumento(provv, anno, codnum, -1); @@ -236,9 +240,12 @@ bool TFatturazione_bolle::elabora(TLista_documenti& doc_in, TLista_documenti& do for (int i = 0; i < tot; i++) // ... cerca un documento compatibile. { TDocumento & d = doc_out[i]; - d.put("CODNUM", codnum); - d.put("TIPODOC", tipo_out); + + TToken_string key; key.add(d.get(DOC_TIPOCF)); key.add(d.get(DOC_CODCF)); + const TRectype & cfven = cache().get(LF_CFVEN, key); + const TString16 tipo_cli(cfven.get(CFV_TIPODOCFAT)); + d.put("TIPODOC", tipo_cli.empty() ? tipo_out : tipo_cli); } return ok; } diff --git a/ve/velib04b.cpp b/ve/velib04b.cpp index 0c5b38bfb..1a70c2d71 100755 --- a/ve/velib04b.cpp +++ b/ve/velib04b.cpp @@ -19,6 +19,7 @@ #include "../cg/cg2101.h" #include "../cg/cg2103.h" #include "../cg/cgsaldac.h" +#include "../cg/cglib02.h" /////////////////////////////////////////////////////////// // TContabilizzazione @@ -416,7 +417,6 @@ public: void zero(){ _imp = 0.0; _iva = 0.0; _ali = 0.0; _cod_iva = "";} virtual TObject* dup() const { return new TIVA_element(*this); } TIVA_element& operator = (TIVA_element& a); - TIVA_element& add(const TRiga_documento& a, const bool sc, const int ndec); TIVA_element() { zero(); } ~TIVA_element() {}; }; @@ -428,27 +428,6 @@ TIVA_element& TIVA_element::operator=(TIVA_element& a) return *this; } -TIVA_element& TIVA_element::add(const TRiga_documento& a, const bool sc, const int ndec) -// It's horrible, I know. -{ - const TIVA& xx = a.iva(); - - if (!sc) // Al netto dello sconto - { - _imp += a.imponibile(); - _iva += a.imposta(); - } - else - { - real imponibile = a.importo(FALSE,FALSE,ndec); // Imponibile della riga al lordo dello sconto - _imp += imponibile;// Imponibile lorda - _iva += ::iva(imponibile,xx,ndec);// imposta calcolata sull'imponibile lorda - } - _ali = xx.aliquota(); - _cod_iva = xx.codice(); - return *this; -} - // Parametri da leggere all'inizio dell'elaborazione tramite load_parameters() static TBill _sco_perc_bill, _sco_imp_bill, // Conti per gli sconti a percentuale ed importi (dalla configurazione) _spin_billa, _spin_billv, @@ -458,8 +437,9 @@ static TBill _co_cliente, // conto clifo per movimento d'anticipo static bool _nump_cfg; // se TRUE prende il numero rif. partita dal numero protocollo static bool _sc_enabled; // se TRUE il saldaconto di ditta e' abilitato -static TToken_string - _search_seq; // Sequenza di ricerca del conto costo/ricavo la correttezza dell'ordinamento +static bool _in_enabled; // se TRUE l'intra e' abilitato +static TToken_string* _search_seq = NULL; + // Sequenza di ricerca del conto costo/ricavo la correttezza dell'ordinamento // va controllata nel programma di modifica parametri: // "" = fine ordinamento // CF = cliente fornitore @@ -497,6 +477,7 @@ TContabilizzazione::TContabilizzazione(const char* cod) _docfile = new TLocalisamfile(LF_DOC); _rdocfile = new TLocalisamfile(LF_RIGHEDOC); // Per far funzionare TDocumento,TPartita ecc.. _anamag = new TLocalisamfile(LF_ANAMAG); + _saldi = new TLocalisamfile(LF_SALDI); _cpg = new TTable("%CPG"); _tri = new TTable("%TRI"); @@ -533,6 +514,7 @@ TContabilizzazione::TContabilizzazione(const TRectype& rec) _docfile = new TLocalisamfile(LF_DOC); _rdocfile = new TLocalisamfile(LF_RIGHEDOC); // Per far funzionare TDocumento,TPartita ecc.. _anamag = new TLocalisamfile(LF_ANAMAG); + _saldi = new TLocalisamfile(LF_SALDI); _cpg = new TTable("%CPG"); _tri = new TTable("%TRI"); @@ -569,6 +551,7 @@ TContabilizzazione::~TContabilizzazione() delete _caa; delete _cra; delete _anamag; + delete _saldi; delete _fcaus; delete _frcaus; delete _attiv; @@ -587,16 +570,16 @@ bool TContabilizzazione::load_parameters() if (_loaded) return TRUE; - TConfig conf(CONFIG_DITTA); + TConfig conf(CONFIG_DITTA, "ve"); - _search_seq = conf.get("RICERCACR","ve"); + _search_seq = new TToken_string((const char*)conf.get("RICERCACR","ve")); // costruisce la stringa che controlla la ricerca del conto costo/ricavo // Attenzione! non esegue alcun controllo di consistenza sulla corretta sequenza // presuppone che il programma di configurazione abbia generato correttamente // il tutto. - if (_search_seq.items() == 0) + if (_search_seq->items() == 0) { error_box("Non e' abilitata alcuna ricerca per il conto di costo/ricavo in configurazione."); return FALSE; @@ -734,7 +717,18 @@ error_type TContabilizzazione::compile_head_mov(TDocumento& doc) // Istanzia la causale del documento corrente... const TTipo_documento& tipo = doc.tipo(); - const TString codcaus(tipo.causale()); + TString codcaus(tipo.causale()); + + TToken_string key; + key.add(doc.get(DOC_TIPOCF)); + key.add(doc.get(DOC_CODCF)); + + const TRectype & cfven = cache().get(LF_CFVEN, key); + const TString16 caus_cli(cfven.get(CFV_CODCAUS)); + + if (caus_cli.not_empty()) + codcaus = caus_cli; + _caus = new TCausale(codcaus,data_reg.year()); if (!_caus->ok()) { @@ -883,7 +877,7 @@ error_type TContabilizzazione::compile_head_mov(TDocumento& doc) error_type TContabilizzazione::search_costo_ricavo(TBill& conto, const TRiga_documento& r) { - const int items = _search_seq.items(); + const int items = _search_seq->items(); TLocalisamfile & cli_file = _clifo->lfile(); // YES, arriva qui dentro quando la relazione e' gia' posizionata const bool is_cli = cli_file.get(CLI_TIPOCF) == "C"; bool skip_art_related = FALSE; @@ -907,7 +901,7 @@ error_type TContabilizzazione::search_costo_ricavo(TBill& conto, const TRiga_doc // Scorre la stringa di ricerca for (int i=0;good() && iget(i); if (tok == "CF") { if (skip_clifo) continue; @@ -1010,7 +1004,7 @@ error_type TContabilizzazione::search_costo_ricavo(TBill& conto, const TRiga_doc // Scorre la stringa di ricerca ma solo per causale o CLI/FO for (int i=0;good() && iget(i); if (tok == "CF") { if (skip_clifo) continue; @@ -1041,7 +1035,7 @@ error_type TContabilizzazione::search_costo_ricavo(TBill& conto, const TRiga_doc return _error; } -error_type TContabilizzazione::add_iva_row(const TBill& conto, const TRiga_documento& r, const int ndec) +error_type TContabilizzazione::add_iva_row(const TBill& conto, const TRiga_documento& r, const int ndec, const real p) // Aggiunge le righe iva all'assoc_array di raggruppamento { TIVA_element el_tmp; @@ -1096,12 +1090,14 @@ error_type TContabilizzazione::add_iva_row(const TBill& conto, const TRiga_docum return _error; } - const real imp_om = r.imponibile_omaggio(); - + real imp_om = r.imponibile_omaggio() * p; + imp_om.round(ndec); + // Aggiunge la riga "normale" el.imp() += imp_om; - el.iva() += r.imposta(); + //el.iva() += (r.imposta() * p); + el.iva() += ::iva(imp_om,tiva,ndec); el.ali() = tiva.aliquota(); el.cod_iva() = tiva.codice(); _righe_iva.add(key,el,exists); @@ -1125,10 +1121,25 @@ error_type TContabilizzazione::add_iva_row(const TBill& conto, const TRiga_docum } else // Any other kind of row... { - el.add(r,sconto_lordo,ndec); // Inserisce la riga IVA al netto o al lordo dello sconto + //el.add(r,sconto_lordo,ndec); // Inserisce la riga IVA al netto o al lordo dello sconto + real iimmpp; + + if (!sconto_lordo) // Al netto dello sconto + iimmpp = r.imponibile() * p; + else + iimmpp = r.importo(FALSE,FALSE,ndec) * p; // Imponibile della riga al lordo dello sconto + + iimmpp.round(ndec); + el.imp() += iimmpp; + el.iva() += ::iva(iimmpp,tiva,ndec); + + el.ali() = tiva.aliquota(); + el.cod_iva() = tiva.codice(); + + _righe_iva.add(key,el,exists); // Le righe di sconto le aggiorna dopo - if (r.doc().tipo().calcolo_lordo()) + if (r.doc().tipo().calcolo_lordo()) // Si ricorda che calcolo_lordo() e fattura_commerciale() sono esclusivi. { // Totalizza per ogni codice iva il lordo if (!_totali_lordi.is_key(cod)) @@ -1143,7 +1154,8 @@ error_type TContabilizzazione::add_iva_row(const TBill& conto, const TRiga_docum { real sconto, ivasc; - sconto = - r.sconto(); // Imponibile dello sconto (positivo, quindi si cambia di segno) + sconto = - (r.sconto() * p); // Imponibile dello sconto (positivo, quindi si cambia di segno) + sconto.round(ndec); ivasc = ::iva(sconto,tiva,ndec);// imposta calcolata sullo sconto if (sconto != ZERO) // Le righe Omaggio con Addebito IVA hanno comunque sconto ZERO! @@ -1451,14 +1463,31 @@ error_type TContabilizzazione::create_total_doc_row(TDocumento& doc) error_type TContabilizzazione::compile_rows_mov(TDocumento& doc) // Compila le righe { + TString16 tiporiga, codiva1, codiva2; const int rows = doc.rows(); const int ndec = doc.in_valuta() ? 3 : 0; + const bool fat_com = doc.tipo().fattura_commerciale(); + + static TString_array tabella_ripartizione; + + if (fat_com && tabella_ripartizione.items() == 0) + { + TConfig cnf(CONFIG_STUDIO); + for (int k = 1; k <= MAX_IVA_SLICES; k++) + { + TToken_string* tt = new TToken_string(); + tt->add(cnf.get("EXCLUDE_PERC", "ve", k)); + tt->add(cnf.get("EXCLUDE_IVA", "ve", k)); + tabella_ripartizione.add(tt); + } + } + _righe_iva.destroy(); // resetta l'assoc_array delle righe di iva _totali_lordi.destroy();// resetta l'assoc_array dei totali lordi for (int i=1; good() && i<=rows; i++) // browse all this fucked document rows { - const TRiga_documento& r = doc[i]; - TString16 tiporiga(r.get(RDOC_TIPORIGA)); + TRiga_documento& r = doc[i]; + tiporiga = r.get(RDOC_TIPORIGA); _tri->put("CODTAB",tiporiga); if (_tri->read() == NOERR) // controlla l'esistenza della riga { @@ -1470,7 +1499,27 @@ error_type TContabilizzazione::compile_rows_mov(TDocumento& doc) { search_costo_ricavo(conto,r); // l'errore eventuale viene settato qui dentro if (good()) - add_iva_row(conto,r,ndec); + { + if (fat_com) + { + codiva2 = r.get(RDOC_CODIVA); // Save... + for (int j=0; j < MAX_IVA_SLICES; j++) + { + real perc(tabella_ripartizione.row(j).get(0)); + + perc /= 100.0; + codiva1 = tabella_ripartizione.row(j).get(1); + if (perc == ZERO || codiva1.trim().empty()) + continue; + + r.put(RDOC_CODIVA, codiva1); + add_iva_row(conto, r, ndec, perc); + } + r.put(RDOC_CODIVA, codiva2); //Restore + } + else + add_iva_row(conto, r, ndec, 1.0); + } } } else @@ -2176,6 +2225,7 @@ error_type TContabilizzazione::write_anticipo(TDocumento& doc) error_box("Errore %d scrivendo il movimento di anticipo pagamento %ld.",_anticipo->status(),numreg); return generic_error; } + aggiorna_saldi(FALSE); } delete _anticipo; _anticipo = NULL; @@ -2309,6 +2359,44 @@ error_type TContabilizzazione::write_intra(TDocumento& doc) return _error; } +void TContabilizzazione::aggiorna_saldi(bool n) +{ + TMovimentoPN* mv = n ? (TMovimentoPN*) _movimento : _anticipo; + + CHECK(mv, "Movimento non valido passato ad aggiorna_saldi()"); + + TLocalisamfile& mov = mv->lfile(); + + const TDate datareg(mov.get_date(MOV_DATAREG)); + + tiposal tsal = normale; + if (_caus->read(mov.get(MOV_CODCAUS),datareg.year())) + tsal = _caus->apertura() ? apertura : + (_caus->chiusura() ? chiusura : normale); + + TSaldo_agg _saldo; + + _saldo.reset(); // Inizializza saldi + _saldo.set_movprovv(FALSE); + _saldo.set_tipo_saldo(tsal); + _saldo.set_anno_es(mov.get_int(MOV_ANNOES)); + _saldo.set_num_ulmov(mov.get_long(MOV_NUMREG)); + _saldo.set_data_ulmov(datareg); + _saldo.set_movimentato(TRUE); + + const int cgitems = mv->cg_items(); + for (int i = 0; i < cgitems; i++) + { + const TRectype& r = mv->cg(i); + TImporto import(r.get_char("SEZIONE"), r.get_real("IMPORTO")); + + TBill conto; conto.get(r); + _saldo.aggiorna(conto, import, TRUE); + } + + _saldo.registra(); +} + void TContabilizzazione::display_error(TDocumento& doc) { TString msg; @@ -2422,6 +2510,11 @@ void TContabilizzazione::display_error(TDocumento& doc) msg.format("Si è verificato un errore nella scrittura del movimento intracomunitario relativamente al documento %s/%ld." "Verificare la consistenza dei files relativi ai movimenti intracomunitari.",(const char*)numerazione,numero); break; + case cont_seq_error: + msg.format("Il documento precedente al %s/%ld non e' stato contabilizzato.\n" + "E' necessario contabilizzare tutti i documenti in sequenza.", + (const char*)numerazione, numero); + break; default: // errori generici o non indicati vengono visualizzati nel punto dell'errore //msg.format("E' stato rilevato un errore generico contabilizzando il documento %s/%ld.", // (const char*)numerazione,numero); @@ -2445,6 +2538,35 @@ bool TContabilizzazione::in_enabled() const bool rt = _in_enabled; if (_caus != NULL) rt &= _caus->intra(); return rt; +} + +bool TContabilizzazione::prev_contabilized(const TDocumento& doc) const +{ + const TString16 codnum = doc.get(DOC_CODNUM); + const int anno = doc.get_int(DOC_ANNO); + const char provv = doc.get_char(DOC_PROVV); + long ndoc = doc.get_long(DOC_NDOC); + + TLocalisamfile documenti(LF_DOC); + TRectype& rec = documenti.curr(); + rec.put(DOC_CODNUM, codnum); + rec.put(DOC_ANNO, anno); + rec.put(DOC_PROVV, provv); + rec.put(DOC_NDOC, ndoc-1); + int err = rec.read(documenti); + if (err != NOERR) + { + rec.zero(); + rec.put(DOC_CODNUM, codnum); + rec.put(DOC_ANNO, anno); + rec.put(DOC_PROVV, provv); + err = rec.read(documenti, _isgteq); + return err == NOERR && rec.same_key(doc.head(), 1); + } + + const TString16 stato_doc = rec.get(DOC_STATO); + const TString16 stato_ok = stato_finale_doc_iniziale(); + return stato_doc == stato_ok; } bool TContabilizzazione::elabora(TLista_documenti& doc_in, TLista_documenti& doc_out, @@ -2465,8 +2587,7 @@ bool TContabilizzazione::elabora(TLista_documenti& doc_in, TLista_documenti& doc const int items = doc_in.items(); // Numero dei documenti in questa elaborazione for (int i = 0; i < items ; i++) // Scorriamo tutti i documenti nella lista { - TDocumento& doc = doc_in[i]; - + TDocumento& doc = doc_in[i]; msg.format("Contabilizzazione documento %s/", (const char*) doc.numerazione()); msg << doc.numero(); xvt_statbar_set(msg); @@ -2474,16 +2595,22 @@ bool TContabilizzazione::elabora(TLista_documenti& doc_in, TLista_documenti& doc _movimento = new TMovimentoPN_VE(doc.in_valuta()); - compile_head_mov(doc); + if (_can_write && !prev_contabilized(doc)) + _error = cont_seq_error; + if (good()) - compile_rows_mov(doc); + { + compile_head_mov(doc); + if (good()) + compile_rows_mov(doc); + } if (good() && _can_write) if (write_all(doc) == no_error) // Se la scrittura e' andata ok... { if (doc.get_real(DOC_IMPPAGATO) != ZERO) - if (write_anticipo(doc) != no_error) - _movimento->remove(); // Se si è verificato un errore nella scrittura dell'anticipo rimuove il movimento di prima nota + if (write_anticipo(doc) != no_error) + _movimento->remove(); // Se si è verificato un errore nella scrittura dell'anticipo rimuove il movimento di prima nota if (good() && in_enabled()) write_intra(doc); @@ -2491,7 +2618,8 @@ bool TContabilizzazione::elabora(TLista_documenti& doc_in, TLista_documenti& doc if (good()) { _total_docs++; - change_doc_status(doc); + change_doc_status(doc); + aggiorna_saldi(TRUE); } } if (_caus != NULL) diff --git a/ve/velib04c.cpp b/ve/velib04c.cpp index f00c6848c..2b0ac52c7 100755 --- a/ve/velib04c.cpp +++ b/ve/velib04c.cpp @@ -528,7 +528,7 @@ void TGenerazione_effetti::generate_bill(TDocumento& doc) // bill in inglese sig { const int nrata = is_anticipo ? i + 2: i + 1; - if (valid_type(_pagamento->tipo_rata(i))) + if (valid_type(pag.tipo_rata(i))) { effetto.zero(); reffetto.zero(); diff --git a/ve/velib04d.h b/ve/velib04d.h index 2b35ee92b..e8717a212 100755 --- a/ve/velib04d.h +++ b/ve/velib04d.h @@ -1,7 +1,18 @@ #define S_RIGACONSEGNATA 101 #define S_QTARESIDUA 102 #define S_QTADAEVADERE 103 -#define S_RIGAEVASA 104 +#define S_RIGAEVASA 104 +#define S_CODMAG 105 +#define S_CODDEP 106 +#define S_CODART 107 +#define S_LIVGIAC1 108 +#define S_LIVGIAC2 109 +#define S_LIVGIAC3 110 +#define S_LIVGIAC4 111 +#define S_DATACONS 112 +#define S_DESCR 113 +#define S_TIPORIGA 114 +#define S_NUMRIGA 115 #define F_CODNUM 201 #define F_DESNUM 202 diff --git a/ve/velib04d.uml b/ve/velib04d.uml index d61f962c5..9bccd2c87 100755 --- a/ve/velib04d.uml +++ b/ve/velib04d.uml @@ -159,13 +159,18 @@ END SPREADSHEET F_ROWS BEGIN PROMPT 0 8 "" - ITEM "@1" - ITEM "Quantita'\nresidua@13" - ITEM "Quantita'\nda evadere@13" - ITEM "Evasa@5" + ITEM "@F1" + ITEM "Quantita'\nresidua@F13" + ITEM "Quantita'\nda evadere@F13" + ITEM "Evasa@F5" ITEM "Mag@3" ITEM "Dep@3" ITEM "Codice articolo@20" + ITEM "Livello 1" + ITEM "Livello 2" + ITEM "Livello 3" + ITEM "Livello 4" + ITEM "Data cons." ITEM "Descrizione@50" ITEM "Tipo@4" END @@ -174,18 +179,18 @@ ENDPAGE ENDMASK -PAGE "Riga 1" -1 -1 66 10 +PAGE "Riga 1" -1 -1 66 13 -GROUPBOX DLG_NULL 64 6 +GROUPBOX DLG_NULL 64 8 BEGIN PROMPT 1 0 "" END -STRING 105 3 +STRING S_CODMAG 3 BEGIN PROMPT 2 1 "Magazzino " USE MAG - INPUT CODTAB 105 + INPUT CODTAB S_CODMAG OUTPUT 155 S0 CHECKTYPE NORMAL FLAGS "D" @@ -197,12 +202,12 @@ BEGIN FLAGS "D" END -STRING 106 2 +STRING S_CODDEP 2 BEGIN PROMPT 2 2 "Deposito " USE MAG - INPUT CODTAB[1,3] 105 - INPUT CODTAB[4,5] 106 + INPUT CODTAB[1,3] S_CODMAG + INPUT CODTAB[4,5] S_CODDEP OUTPUT 156 S0 CHECKTYPE NORMAL FLAGS "D" @@ -213,46 +218,81 @@ BEGIN PROMPT 17 2 "" FLAGS "D" END - - -STRING 107 20 + +STRING S_CODART 20 BEGIN PROMPT 2 3 "Articolo " FLAGS "D" END -STRING 108 50 +STRING S_LIVGIAC1 10 BEGIN - PROMPT 2 4 "Descriz. " + PROMPT 2 4 "Livello Giacen 1 " FLAGS "D" END -STRING 109 3 +STRING S_LIVGIAC2 10 BEGIN - PROMPT 49 3 "Tipo riga " + PROMPT 36 4 "Livello Giacen 2 " + FLAGS "D" +END + +STRING S_LIVGIAC3 10 +BEGIN + PROMPT 2 5 "Livello Giacen 3 " + FLAGS "D" +END + +STRING S_LIVGIAC4 10 +BEGIN + PROMPT 36 5 "Livello Giacen 4 " + FLAGS "D" +END + +STRING S_DESCR 50 +BEGIN + PROMPT 2 6 "Descriz. " + FLAGS "D" +END + +STRING S_NUMRIGA 3 +BEGIN + PROMPT 49 3 "N. " + FLAGS "D" +END + +STRING S_TIPORIGA 3 +BEGIN + PROMPT 58 3 "Tipo riga " + FLAGS "D" +END + +DATE S_DATACONS +BEGIN + PROMPT 2 8 "Data di consegna " FLAGS "D" END NUMBER S_QTARESIDUA 13 5 BEGIN - PROMPT 1 6 "Quantita' residua " + PROMPT 2 9 "Quantita' residua " FLAGS "DU" END NUMBER S_QTADAEVADERE 13 5 BEGIN - PROMPT 1 7 "Quantita' da evadere " + PROMPT 2 10 "Quantita' da evadere " FLAGS "U" END BOOLEAN S_RIGACONSEGNATA BEGIN - PROMPT 41 6 "Riga consegnata" + PROMPT 41 9 "Riga consegnata" END BOOLEAN S_RIGAEVASA BEGIN - PROMPT 41 7 "Riga evasa" + PROMPT 41 10 "Riga evasa" END BUTTON DLG_OK 10 2 diff --git a/ve/velib06.cpp b/ve/velib06.cpp index cc36a7f54..e9767d5d4 100755 --- a/ve/velib06.cpp +++ b/ve/velib06.cpp @@ -1,10 +1,11 @@ #include #include #include -#include +//#include #include #include #include +#include #include "velib.h" #include "vepriv.h" @@ -45,7 +46,8 @@ TDocumento_mask::TDocumento_mask(const char* td) _last_prog++; } - _sheet = &sfield(F_SHEET); + _sheet = &sfield(F_SHEET); + _sheet->set_handler( ss_handler ); _sheet->set_notify( ss_notify ); _sheet->set_append(FALSE); @@ -319,11 +321,17 @@ bool TDocumento_mask::on_key(KEY key) { if (key == K_SHIFT + K_F12) { - TMask_field& stato = field(F_STATO); -// stato.enable(!stato.enabled()); - stato.enable(); - enable(DLG_SAVEREC); - enable(DLG_DELREC); + TRelation r(LF_DOC); + r.curr()=doc(); + if (::user_can_write(&r)) + { + TMask_field& stato = field(F_STATO); + stato.enable(); + enable(DLG_SAVEREC); + enable(DLG_DELREC); + } else + warning_box("L'utente %s non puo' modificare questo documento", + (const char*)user()); return TRUE; } return TVariable_mask::on_key(key); @@ -790,7 +798,20 @@ void TDocumento_mask::update_giacenza() /////////////////////////////////////////////////////////// // Handlers and notifiers -/////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////// + +bool TDocumento_mask::ss_handler(TMask_field& f, KEY key) +{ + bool ok = TRUE; + if (key == K_ENTER && f.mask().insert_mode()) + { + TSheet_field& ss = (TSheet_field&)f; + if (ss.items() == 0) + ok = yesno_box("Il documento e' privo di righe:\n" + "Si desidera continuare ugualmente?"); + } + return ok; +} bool TDocumento_mask::ss_notify( TSheet_field& ss, int r, KEY key ) { @@ -857,7 +878,7 @@ bool TDocumento_mask::ss_notify( TSheet_field& ss, int r, KEY key ) riga.put("CODMAG", s); riga.autoload(ss); ss.check_row(r); - ss.select(r); + ss.select(r, 1); } else if ( key == K_TAB ) // ingresso nella riga @@ -980,7 +1001,14 @@ class TElabora_mask : public TMask { TMask * _main; TLista_elaborazioni _elab; - // @access Public Member + +// @access Protected Member +protected: + TString _art_filter, _liv_filter; + static TElabora_mask* _myself; + static bool article_filter(const TRelation* rel); + +// @access Public Member public: void update_list(); void update_ndoc_filter(bool is_tipo_elaborazione = FALSE); @@ -989,13 +1017,16 @@ public: static bool tipo_elaborazione_handler( TMask_field& f, KEY key ); static bool tipo_documento_handler( TMask_field& f, KEY key ); static bool codnum_handler( TMask_field& f, KEY key ); + static bool codart_handler( TMask_field& f, KEY key ); static bool list_elab_handler( TMask_field& f, KEY key ); // @cmember Costruttore (crea la maschera leggendo la descrizione dal file .msk) - TElabora_mask(const char* title, TMask * main_mask); + TElabora_mask(TMask * main_mask); // @cmember Distruttore virtual ~TElabora_mask() {} }; +TElabora_mask* TElabora_mask::_myself = NULL; + void TElabora_mask::update_list() { TString_array elabs; @@ -1005,11 +1036,16 @@ void TElabora_mask::update_list() const TString16 stato_elab(get(F_STATODOC_ELAB)); const bool from_elab = !get_bool(F_TYPE); int items = 0; - + + bool agg_test = FALSE; if (from_elab) items = _elab.select(elabs, tipo, stato,"",""/*tipo_elab, stato_elab*/) ; else - items = _elab.select(elabs, tipo_elab, stato_elab, tipo, stato) ; + { + items = _elab.select(elabs, tipo_elab, stato_elab, tipo, stato); + agg_test = _main->sfield(F_SHEET).items() == 0; + } + set(F_UPDATE_HEADER, agg_test ? "X" : ""); const bool ok = items > 0; @@ -1030,11 +1066,11 @@ void TElabora_mask::update_list() f.replace_items(codes, descrs); const TElaborazione * e = curr_elab(); if (e && e->tipo() == _consegna_ordini) - show(-GRP_ART); + show(-GRP_ART); else { - reset(-GRP_ART); - hide(-GRP_ART); + reset(-GRP_ART); + hide(-GRP_ART); } } @@ -1102,10 +1138,10 @@ bool TElabora_mask::elabora() if (e->tipo() == _consegna_ordini) { - TParametri_elaborazione & p = e->params(); - p.set("ARTICOLO", get(F_CODART)); - p.set("UM", get(F_UMQTA)); - p.set("QUANTITA", get(F_QTA)); + TParametri_elaborazione& p = e->params(); + p.set("ARTICOLO", get(F_CODART)); + p.set("UM", get(F_UMQTA)); + p.set("QUANTITA", get(F_QTA)); } if (from_elab) { @@ -1141,19 +1177,19 @@ bool TElabora_mask::elabora() } if (e->tipo() == _consegna_ordini) { - TParametri_elaborazione & p = e->params(); - - if (p.get("ARTICOLO").not_empty()) - { - real qta = get_real(F_QTA); - if (qta > ZERO) - { - real qta_evasa = p.get_real("QUANTITA"); - - qta -= qta_evasa; - set(F_QTA, qta); - } - } + TParametri_elaborazione & p = e->params(); + + if (p.get("ARTICOLO").not_empty()) + { + real qta = get_real(F_QTA); + if (qta > ZERO) + { + real qta_evasa = p.get_real("QUANTITA"); + + qta -= qta_evasa; + set(F_QTA, qta); + } + } } delete newdoc; @@ -1164,9 +1200,41 @@ bool TElabora_mask::elabora() TElaborazione * TElabora_mask::curr_elab() { const TString16 cod_elab(get(F_ELAB)); - return cod_elab.not_empty() ? &_elab[cod_elab] : NULL; + return cod_elab.not_empty() ? &_elab[cod_elab] : NULL; } +bool TElabora_mask::article_filter(const TRelation* rel) +{ + bool yes = FALSE; + TElabora_mask& m = *_myself; + TLocalisamfile rdoc(LF_RIGHEDOC); + rdoc.put(RDOC_CODNUM, rel->curr().get(DOC_CODNUM)); + rdoc.put(RDOC_ANNO, rel->curr().get(DOC_ANNO)); + rdoc.put(RDOC_PROVV, rel->curr().get(DOC_PROVV)); + rdoc.put(RDOC_NDOC, rel->curr().get(DOC_NDOC)); + rdoc.put(RDOC_NRIGA, 1); + int next_riga = 1; + for (int err = rdoc.read(); err == NOERR; err = rdoc.next()) + { + const int nriga = rdoc.get_int(RDOC_NRIGA); + if (nriga != next_riga) + break; + next_riga++; + const bool evasa= rdoc.get_bool(RDOC_RIGAEVASA); + const TString& codart = rdoc.get(RDOC_CODART); + if (!evasa && codart == m._art_filter) + { + const real residuo = rdoc.get_real(RDOC_QTA)-rdoc.get_real(RDOC_QTAEVASA); + if (residuo > ZERO) + { + yes = TRUE; + break; + } + } + } + return yes; +} + void TElabora_mask::update_ndoc_filter(bool is_tipo_elaborazione) { TString filter(80); @@ -1177,8 +1245,8 @@ void TElabora_mask::update_ndoc_filter(bool is_tipo_elaborazione) enable(-1, to_elab /*&& e != NULL*/); - if (!to_elab && is_tipo_elaborazione ) - reset(-1); + if (!to_elab && is_tipo_elaborazione ) + reset(-1); if (e != NULL) { if (to_elab) @@ -1190,9 +1258,9 @@ void TElabora_mask::update_ndoc_filter(bool is_tipo_elaborazione) if (tipo.not_empty()) { filter << format("&&(TIPODOC==\"%s\")", (const char *)tipo); - const int stato = get_int(F_STATODOC_ELAB); + const char* stato = get(F_STATODOC_ELAB); if (stato != 0) - filter << format("&&(STATO==\"%d\")", stato); + filter << format("&&(STATO==\"%s\")", stato); else { bool almost_one = FALSE; @@ -1216,12 +1284,12 @@ void TElabora_mask::update_ndoc_filter(bool is_tipo_elaborazione) { // tipo_in1=tipo_in; // stato_in1=stato_in; - set(F_CODNUM_ELAB, num_in); - field(F_CODNUM_ELAB).check(); - set(F_TIPODOC_ELAB , tipo_in); - field(F_TIPODOC_ELAB).check(); - set(F_STATODOC_ELAB, format("%c",stato_in)); - field(F_STATODOC_ELAB).check(); + set(F_CODNUM_ELAB, num_in); + field(F_CODNUM_ELAB).check(); + set(F_TIPODOC_ELAB , tipo_in); + field(F_TIPODOC_ELAB).check(); + set(F_STATODOC_ELAB, format("%c",stato_in)); + field(F_STATODOC_ELAB).check(); } } if (almost_one) @@ -1254,12 +1322,12 @@ void TElabora_mask::update_ndoc_filter(bool is_tipo_elaborazione) { // tipo_in1=tipo_in; // stato_in1=stato_in; - set(F_CODNUM_ELAB, num_in); - field(F_CODNUM_ELAB).check(); - set(F_TIPODOC_ELAB , tipo_in); - field(F_TIPODOC_ELAB).check(); - set(F_STATODOC_ELAB, format("%c",stato_in)); - field(F_STATODOC_ELAB).check(); + set(F_CODNUM_ELAB, num_in); + field(F_CODNUM_ELAB).check(); + set(F_TIPODOC_ELAB , tipo_in); + field(F_TIPODOC_ELAB).check(); + set(F_STATODOC_ELAB, format("%c",stato_in)); + field(F_STATODOC_ELAB).check(); } } } @@ -1289,8 +1357,17 @@ void TElabora_mask::update_ndoc_filter(bool is_tipo_elaborazione) set(F_STATODOC_ELAB, stato_fin); field(F_STATODOC_ELAB).check(); } - } - efield(F_NDOC_ELAB).browse()->set_filter(filter); + } + + TBrowse& brew = *efield(F_NDOC_ELAB).browse(); + brew.set_filter(filter); + + _art_filter = get(F_CODART); + if (_art_filter.not_empty() && to_elab) + brew.cursor()->set_filterfunction(article_filter); + else + brew.cursor()->set_filterfunction(NULL); + } bool TElabora_mask::tipo_elaborazione_handler( TMask_field& f, KEY key ) @@ -1327,6 +1404,16 @@ bool TElabora_mask::codnum_handler( TMask_field& f, KEY key ) return TRUE; } +bool TElabora_mask::codart_handler( TMask_field& f, KEY key ) +{ + if (key != K_ENTER && f.to_check(key, TRUE)) + { + TElabora_mask & m = (TElabora_mask &) f.mask(); + m.update_ndoc_filter(); + } + return TRUE; +} + bool TElabora_mask::list_elab_handler( TMask_field& f, KEY key ) { if (key == K_SPACE) @@ -1337,13 +1424,16 @@ bool TElabora_mask::list_elab_handler( TMask_field& f, KEY key ) return TRUE; } -TElabora_mask::TElabora_mask(const char* title, TMask * main_mask) - : TMask(title), _main(main_mask) -{ +TElabora_mask::TElabora_mask(TMask * main_mask) + : TMask("ve0100b"), _main(main_mask) +{ + _myself = this; + set_handler(F_TYPE, tipo_elaborazione_handler); set_handler(F_TIPODOC_ELAB, tipo_documento_handler); set_handler(F_STATODOC_ELAB, tipo_documento_handler); set_handler(F_CODNUM_ELAB, codnum_handler); + set_handler(F_CODART, codart_handler); set_handler(F_ELAB, list_elab_handler); set(F_ANNO_ELAB, _main->get(F_ANNO)); @@ -1358,7 +1448,7 @@ bool TDocumento_mask::elabora_handler( TMask_field& f, KEY key ) TDocumento_mask& m = (TDocumento_mask&)f.mask(); if (m.check_fields()) // Check values { - TElabora_mask* selection = new TElabora_mask("ve0100b", &m); // No woman no stack + TElabora_mask* selection = new TElabora_mask(&m); // No woman no stack bool update_mask = FALSE; while (selection->run() != K_ESC) { @@ -1366,7 +1456,7 @@ bool TDocumento_mask::elabora_handler( TMask_field& f, KEY key ) update_mask |= selection->elabora(); } if (update_mask) - m.doc2mask(FALSE); + m.doc2mask(FALSE); delete selection; } } @@ -1387,6 +1477,9 @@ void TDocumento_mask::user_set_handler(int fieldid, int index) case 1: set_handler( fieldid, ora_hndl ); break; + case 2: + set_handler( fieldid, totdoc_hndl ); + break; case 3: set_handler( fieldid, dummy_hndl ); break; @@ -1411,7 +1504,7 @@ bool TDocumento_mask::num_handler( TMask_field& f, KEY key ) // Propone il primo tipo di documento come default m.set( F_TIPODOC, cod_num.tipo_doc(0)); m.send_key( K_TAB, F_TIPODOC ); - // Se per questa numerazione h abilitata le numerazione provvisoria + // Se per questa numerazione e' abilitata le numerazione provvisoria if (cod_num.num_provv()) { // Setta di default la numerazione provvisoria diff --git a/ve/velib06a.cpp b/ve/velib06a.cpp index cd99540ef..3313e2144 100755 --- a/ve/velib06a.cpp +++ b/ve/velib06a.cpp @@ -1,5 +1,6 @@ #include #include +#include #include #include "velib.h" @@ -33,8 +34,29 @@ #include "../mg/codcorr.h" #include "../mg/deslin.h" #include "../mg/umart.h" +#include "velib.h" #define MAX_VIS_RATE 5 +bool totdoc_hndl( TMask_field& field, KEY key ) + +{ + if (key == K_ENTER) + { + TDocumento_mask & m = (TDocumento_mask &) field.mask(); + const real totdoc = m.doc().totale_doc(); + const real totdoc_check(field.get()); + + + if (totdoc != totdoc_check) + { + const TString16 tchk(totdoc_check.string()); + + return yesno_box("Il totale documento digitato (%s) non corrisponde\nal totale documento (%s) calcolato,\n devo registrare ugualmente", + (const char *) tchk, totdoc.string()); + } + } + return TRUE; +} bool ora_hndl( TMask_field& field, KEY key ) { @@ -90,7 +112,7 @@ bool condpag_hndl( TMask_field& field, KEY key ) doc.put(DOC_TIPOCF, m.get(F_TIPOCF)); doc.put(DOC_CODCF, m.get(F_CODCF)); TPagamento& pag = doc.pagamento(); - pag.set_total(100, 10, 10); + pag.set_total(real(100), real(10), real(10)); pag.set_rate_auto(); int numrate = pag.n_rate( ); @@ -131,7 +153,7 @@ bool note_hndl( TMask_field& f, KEY key ) const bool reg_disabled = note.get_bool("B0"); if (reg_disabled) - message_box("Registrazione disbilitata : %s", (const char *) note.get("S0")); + message_box("Registrazione disabilitata : %s", (const char *) note.get("S0")); m.enable(DLG_SAVEREC, !reg_disabled); } } @@ -154,35 +176,26 @@ bool data_hndl( TMask_field& field, KEY key ) if (m.id2pos(F_DATACAMBIO1) >= 0) m.set(F_DATACAMBIO1, field.get(), TRUE); } - if (field.to_check(key,TRUE)) + if (key == K_ENTER || field.to_check(key)) { TDate datadoc(m.get(F_DATADOC)); + if (!datadoc.ok()) + return field.error_box("La data documento deve essere comunque indicata."); + const TCodice_numerazione codnum(m.get(F_CODNUM)); if (codnum.dont_test_datadoc()) - return datadoc.ok() ? TRUE : field.error_box("La data documento deve essere comunque indicata."); + return TRUE; // Non devo fare altri test TLocalisamfile doc(LF_DOC); doc.curr() = m.doc().head(); bool same_key = FALSE; - doc.read(); + doc.read(_isgteq); if (doc.eof() || doc.prev() == NOERR) { TDate dataprev = doc.get_date(DOC_DATADOC); same_key = doc.curr().same_key(m.doc().head(), 1, 1); - if (!same_key) - { - TDate oggi(TODAY); - dataprev = oggi; - } - - if (!datadoc.ok()) - { - datadoc = dataprev; - field.set(dataprev.string()); - } - if (same_key && datadoc < dataprev) return field.error_box("Data documento inferiore alla data del documento precedente"); } @@ -320,36 +333,34 @@ bool codmag_coll_handler( TMask_field& f, KEY key ) void upd_colli_peso_tara(TMask & m, TRectype & a) { - real qta = m.get_real(FR_QTA) * curr_fc; + const real qta = m.get_real(FR_QTA) * curr_fc; + const real ppcollo = a.get_real(ANAMAG_PPCOLLO); + + real ncolli = ppcollo != ZERO ? qta / ppcollo : (real)1.0; + ncolli.ceil(0); int pos = m.id2pos(FR_NCOLLI); - if (pos >= 0) - { - real ppcollo = a.get_real(ANAMAG_PPCOLLO); + if (pos >= 0) if (ppcollo != ZERO) - { - real ncolli = qta / ppcollo; - - ncolli.ceil(0); m.fld(pos).set(ncolli.string()); - } - } + else + m.fld(pos).reset(); + pos = m.id2pos(FR_TARA); if (pos >= 0) { - const real tara = qta * a.get_real(ANAMAG_PESO); - + const real tara = ncolli * a.get_real(ANAMAG_TARA); m.fld(pos).set(tara.string()); } pos = m.id2pos(FR_PNETTO); if (pos >= 0) { - const real peso = qta * a.get_real(ANAMAG_TARA); - + const real peso = qta * a.get_real(ANAMAG_PESO); m.fld(pos).set(peso.string()); } } + bool codart_handler(TMask_field& f, KEY key ) { TMask& row_mask = f.mask(); @@ -518,7 +529,7 @@ bool codart_handler(TMask_field& f, KEY key ) TProgind pi(items, "Esplosione in corso...",FALSE, TRUE); int row = current_doc_row; - const TString16 tiporiga(curr_row.tipo().codice()); + const TString16 tiporiga(curr_row.tipo().codice()); TString_array& str_arr = sh.rows_array(); @@ -939,4 +950,33 @@ bool sppr_handler( TMask_field& f, KEY key ) return TRUE; } +bool TDocumento_mask::numdocrif_search_handler(TMask_field& f, KEY key) +{ + if (key == K_F9) + { + TMask& m = f.mask(); + TRectype filtrec(LF_DOC); + filtrec.put(DOC_TIPOCF, m.get(F_TIPOCF)); + filtrec.put(DOC_CODCF, m.get(F_CODCF)); + filtrec.put(DOC_PROVV, m.get(F_PROVV)); + filtrec.put(DOC_ANNO, m.get(F_ANNO)); + + TRelation rel(LF_DOC); + rel.add(LF_CLIFO, "TIPOCF==TIPOCF|CODCF==CODCF"); + TSorted_cursor cur(&rel, "TIPOCF|CODCF|PROVV|ANNO|CODNUM|NUMDOCRIF", "", 2, &filtrec, &filtrec); + + TCursor_sheet sheet(&cur, "TIPOCF|CODCF|ANNO|CODNUM|NUMDOCRIF|DATADOCRIF|NDOC|20->RAGSOC", + "Documento di riferimento", + "Tipo|Codice|Anno|Numeraz|Docum.Rif.|Data@10|Documento|Ragione Sociale@50", + 0, 1); + if (sheet.run() == K_ENTER) + { + const TString16 ndoc = sheet.row(-1).get(6); + m.set(F_NDOC, ndoc); + m.stop_run(K_AUTO_ENTER); + } + } + + return TRUE; +} diff --git a/ve/verig13.uml b/ve/verig13.uml index 6c3b096f1..1db530bdc 100755 --- a/ve/verig13.uml +++ b/ve/verig13.uml @@ -15,7 +15,7 @@ DEFINE_FIELD(CODMAG) DEFINE_FIELD(DESMAG) DEFINE_FIELD(CODDEP) DEFINE_FIELD(DESDEP) -DEFINE_FIELD(CODALT) +DEFINE_FIELD(CODART) DEFINE_FIELD(DESCRART) DEFINE_FIELD(UMQTA) DEFINE_FIELD(QTA) @@ -26,8 +26,8 @@ DEFINE_FIELD(DATACONS) F_POS(PREZZO, 42, 9,"Prezzo " ) DEFINE_FIELD(SCONTO) F_POS(SCONTO, 2, 11,"Sconto " ) -DEFINE_FIELD(PERCPROV) -F_POS(PERCPROV, 42, 11,"Provvigione" ) +DEFINE_FIELD(IMPFISUN) +DEFINE_FIELD(IMPFISSO) DEFINE_FIELD(CODIVA) F_POS(CODIVA, 2, 13,"Cod. IVA " ) DEFINE_FIELD(DESIVA) diff --git a/ve/verig14.uml b/ve/verig14.uml index 1db530bdc..6c3b096f1 100755 --- a/ve/verig14.uml +++ b/ve/verig14.uml @@ -15,7 +15,7 @@ DEFINE_FIELD(CODMAG) DEFINE_FIELD(DESMAG) DEFINE_FIELD(CODDEP) DEFINE_FIELD(DESDEP) -DEFINE_FIELD(CODART) +DEFINE_FIELD(CODALT) DEFINE_FIELD(DESCRART) DEFINE_FIELD(UMQTA) DEFINE_FIELD(QTA) @@ -26,8 +26,8 @@ DEFINE_FIELD(DATACONS) F_POS(PREZZO, 42, 9,"Prezzo " ) DEFINE_FIELD(SCONTO) F_POS(SCONTO, 2, 11,"Sconto " ) -DEFINE_FIELD(IMPFISUN) -DEFINE_FIELD(IMPFISSO) +DEFINE_FIELD(PERCPROV) +F_POS(PERCPROV, 42, 11,"Provvigione" ) DEFINE_FIELD(CODIVA) F_POS(CODIVA, 2, 13,"Cod. IVA " ) DEFINE_FIELD(DESIVA) diff --git a/ve/vetabcom.txt b/ve/vetabcom.txt index 24eb228a0..3709adeab 100755 --- a/ve/vetabcom.txt +++ b/ve/vetabcom.txt @@ -21,7 +21,7 @@ FRD|BOLLI|Spese bolli|BOLLI(_TOTDOC, 1, 0)||###.###.###.##@,@@@||||||||||||||||| FRD|IMPONIBILI|Totale imponibili|IMPONIBILI(1)||###.###.###.##@,@@@|||||||||||||||||||||||||||||||||||||||||||||||||X| | | | | | | | | | FRD|IMPOSTE|Totale imposte|IMPOSTE(1)||###.###.###.##@,@@@||||||||||||||||||||||||0.00|0.00|0.00|0.00|0.00|0.00|0.00|0.00|0.00|0.00|0.00000|0.00000|0.00000|0.00000|0.00000|||||||||||X| | | | | | | | | | FRD|OMAGGI|Valore omaggi|SOMMA("PREZZONS*QTA","TIPO()=='O'")||###.###.###.##@,@@@|||||||||||||||||||||||||||||||||||||||||||||||||X| | | | | | | | | | -FRD|SCONTOD|Totale sconti di riga|SOMMA("SCONTOR")||###.###.###.##@,@@@||||||||||||||||||||||||0.00|0.00|0.00|0.00|0.00|0.00|0.00|0.00|0.00|0.00|0.00000|0.00000|0.00000|0.00000|0.00000|||||||||||X| | | | | | | | | | +FRD|SCONTOD|Totale sconti di riga|SOMMA("SCONTOR","TIPO()!='C'")||###.###.###.##@,@@@||||||||||||||||||||||||0.00|0.00|0.00|0.00|0.00|0.00|0.00|0.00|0.00|0.00|0.00000|0.00000|0.00000|0.00000|0.00000|||||||||||X| | | | | | | | | | FRD|SCONTOT|Totale sconti di testa|-SOMMA("IMPONIBILE()","TIPO()=='C'")||###.###.###.##@,@@@|||||||||||||||||||||||||||||||||||||||||||||||||X| | | | | | | | | | FRD|SPESE|Totale spese da addebitare|SOMMA("IMPONIBILE()","TIPO()=='S'")||###.###.###.##@,@@@|||||||||||||||||||||||||||||||||||||||||||||||||X| | | | | | | | | | FRD|SPESGEN|Spese generali in %|SOMMA("IMPONIBILE()","TIPORIGA=='04'")||###.###.###.##@,@@@|||||||||||||||||||||||||||||||||||||||||||||||||X| | | | | | | | | | @@ -43,7 +43,7 @@ FRR|PREZZONN|Prezzo netto non scontato|PREZZO()||###.###.##@,@@@|||||||||||||||| FRR|PREZZONS|Prezzo netto scontato|PREZZO(1)||###.###.##@,@@@||||||||||||||||||||||||0.00|0.00|0.00|0.00|0.00|0.00|0.00|0.00|0.00|0.00|0.00000|0.00000|0.00000|0.00000|0.00000|||||||||||X| | | | | | | | | | FRR|PROVVR|Provvigione riga|PROVV()||###.###.###.##@,@@@||||||||||||||||||||||||0.00|0.00|0.00|0.00|0.00|0.00|0.00|0.00|0.00|0.00|0.00000|0.00000|0.00000|0.00000|0.00000|||||||||||X| | | | | | | | | | FRR|SCONTOR|Sconto riga|SCONTO()||###.###.###.##@,@@@||||||||||||||||||||||||0.00|0.00|0.00|0.00|0.00|0.00|0.00|0.00|0.00|0.00|0.00000|0.00000|0.00000|0.00000|0.00000|||||||||||X| | | | | | | | | | -FRR|PROVVF|Provvigione fissa|IF(IMPFISUN="X";IMPFISSO*QTA;IMPFISSO)||###.###.###.##@,@@@|||||||||||||||||||||||||||||||||||||||||||||||||X|X||||||||| +FRR|PROVVF|Provvigione fissa|IF(NUM(IMPFISUN=="X");IMPFISSO*QTA;IMPFISSO)||###.###.###.##@,@@@|||||||||||||||||||||||||||||||||||||||||||||||||X|X||||||||| MSP|D|Destinatario|||||||||||||||||||||||||||||||||||||||||||||||||||| | | | | | | | | | | MSP|M|Mittente|||||||||||||||||||||||||||||||||||||||||||||||||||| | | | | | | | | | | MSP|V|Vettore|||||||||||||||||||||||||||||||||||||||||||||||||||| | | | | | | | | | | @@ -80,6 +80,6 @@ TRI|06|Prestazioni|||||||P||||||||||||||||||||||||||||||||||||||||||||| | | | | TRI|07|Sconto ad importo|||||||C||||||||||||||||||||||||||||||||||||||||||||| | | | | | | | | | | TRI|08|Sconto percentuale|||||||C||||||||||||||||||||||||||||||||||||||||||||| | | | | | | | | | | TRI|09|Riga omaggio|||||||O||||||||||||||||||||||||||||||||||||||||||||| | | | | | | | | | | -TRI|13|Merce con ricerca per codice corrispondente|||||||M||||||||||||||||||||||||||||||||||||||||||||| | | | | | | | | | | -TRI|14|Merce con provvigione fissa|||||||M||||||||||||||||||||||||||||||||||||||||||||||||||||||| +TRI|13|Merce con provvigione fissa|||||||M||||||||||||||||||||||||||||||||||||||||||||||||||||||| +TRI|14|Merce con ricerca per codice corrispondente|||||||M||||||||||||||||||||||||||||||||||||||||||||| | | | | | | | | | |