diff --git a/include/controls.cpp b/include/controls.cpp index b690cf3d7..089a05287 100755 --- a/include/controls.cpp +++ b/include/controls.cpp @@ -10,7 +10,7 @@ #include -COLOR MASK_BACK_COLOR = COLOR_DKCYAN; +/* COLOR MASK_BACK_COLOR = COLOR_DKCYAN; COLOR MASK_LIGHT_COLOR = COLOR_CYAN; COLOR MASK_DARK_COLOR = COLOR_GRAY; COLOR BTN_BACK_COLOR = COLOR_LTGRAY; @@ -23,8 +23,23 @@ COLOR DISABLED_COLOR = COLOR_GRAY; COLOR DISABLED_BACK_COLOR = MASK_BACK_COLOR; COLOR FOCUS_COLOR = NORMAL_COLOR; COLOR FOCUS_BACK_COLOR = COLOR_CYAN; -bool CAMPI_SCAVATI = FALSE; -bool AUTOSELECT = FALSE; +BOOLEAN CAMPI_SCAVATI = FALSE; +BOOLEAN AUTOSELECT = FALSE; */ +COLOR MASK_BACK_COLOR = COLOR_LTGRAY; +COLOR MASK_LIGHT_COLOR = COLOR_WHITE; +COLOR MASK_DARK_COLOR = COLOR_GRAY; +COLOR BTN_BACK_COLOR = COLOR_LTGRAY; +COLOR BTN_LIGHT_COLOR = COLOR_WHITE; +COLOR BTN_DARK_COLOR = COLOR_GRAY; +COLOR TOOL_BACK_COLOR = COLOR_GRAY; +COLOR NORMAL_COLOR = COLOR_BLACK; +COLOR NORMAL_BACK_COLOR = COLOR_WHITE; +COLOR DISABLED_COLOR = COLOR_DKGRAY; +COLOR DISABLED_BACK_COLOR = MASK_BACK_COLOR; +COLOR FOCUS_COLOR = NORMAL_COLOR; +COLOR FOCUS_BACK_COLOR = COLOR_YELLOW; +BOOLEAN CAMPI_SCAVATI = FALSE; +BOOLEAN AUTOSELECT = FALSE; #ifndef STX_DATA // Very deep hacking diff --git a/include/defmask.h b/include/defmask.h index d935230e7..4f7178683 100755 --- a/include/defmask.h +++ b/include/defmask.h @@ -29,6 +29,7 @@ #define DLG_SETPRINT 25 /* TAG del bottone Imposta Stampa */ #define DLG_RECALC 26 /* TAG del bottone Ricalcola */ #define DLG_ELABORA 27 /* TAG del bottone */ +#define DLG_F8 27 /* TAG del bottone */ #define DLG_FAX 28 /* TAG del bottone */ #define DLG_EMAIL 29 /* TAG del bottone */ #define DLG_USER 100 /* TAG del primo controllo definito dall'utente */ diff --git a/include/form.cpp b/include/form.cpp index 54e513291..e36dfb142 100755 --- a/include/form.cpp +++ b/include/form.cpp @@ -317,7 +317,8 @@ void TForm_flags::read_from(const TMask& m) // TForm_item /////////////////////////////////////////////////////////// TForm_item::TForm_item(TPrint_section* section) -: _section(section), _x(-1), _y(-1), _width(0), _height(0), _id(0), _ofs(0), +: _section(section), _x(-1), _y(-1), _width(0), + _height(0),_effective_height(0), _id(0), _ofs(0), _temp(FALSE) {} @@ -1229,11 +1230,13 @@ bool TForm_subsection::update() bool TForm_subsection::print_body(sec_print_mode showfields) { - const bool at_newpage=(atnewpage() || printer().rows_left() < (word)height()); + const bool at_newpage=(atnewpage() || printer().rows_left() < (word)minheight()); bool ok = FALSE; TCursor* cur = form().cursor(); TRelation* rel = (TRelation* )form().relation(); + set_effective_height(0); // resetta l'altezza della sottosezione al suo "minimo" + if (!enabled() ) return FALSE; @@ -1257,9 +1260,9 @@ bool TForm_subsection::print_body(sec_print_mode showfields) _ssec.set_repeat_count(0); if (_condexpr) { // sottosezione di raggruppamenti su file int i = 0; - TString group_expr((const char *)(_section->eval_expr(*_condexpr,_file_id))); + TString group_expr(_section->eval_expr(*_condexpr,_file_id).as_string()); bool again=TRUE; - while (again && group_expr==(const char *)(_section->eval_expr(*_condexpr,_file_id))) + while (again && group_expr==_section->eval_expr(*_condexpr,_file_id).as_string()) { form().match_result(_file_id); if (!_bigskip || i==0) @@ -1600,6 +1603,19 @@ void TForm_string::put_paragraph(const char* s) string_at(x()+plen, _y+i, s+plen); } _effective_height = i; + TForm_subsection *subsec= section().subsection_above(); + if (subsec) + { + // aggiorno l'altezza effettiva della sottosezione + if (effective_height() > 1) + { + // il campo si è "espanso" + const int last_y=effective_height()+y()-1; + if (last_y > subsec->height()) + subsec->set_effective_height(last_y); + } + } + } else { @@ -2334,6 +2350,10 @@ TMask* TPrint_section::_msk = NULL; word TPrint_section::height() const { word h = _height; + if (subsection_above() && (word)subsection_above()->effective_height() > h) + { + h = subsection_above()->effective_height(); + } if (int(h) < 0) // Can't write h < 0! { if (section_type() == 'F') @@ -2346,7 +2366,7 @@ word TPrint_section::height() const if (h == 0) h = 0xFFFF - _height + 1; // Same as abs(_height) } - } + } return h; } @@ -2401,7 +2421,7 @@ void TPrint_section::insert_field(int n, TForm_item* f) _item.insert(f,n); } -inline void TPrint_section::add_field(TForm_item* f) +void TPrint_section::add_field(TForm_item* f) { _item.add(f); } @@ -2534,7 +2554,7 @@ word TPrint_section::subs_height() const if (subsections()) { fss=subsection(0); - h=subsection(0)->height(); + h=subsection(0)->minheight(); h+=subsection(0)->printsection().subs_height(); // ricorsione... } return h; @@ -4071,12 +4091,13 @@ bool TPrint_section::update_and_print(const sec_print_mode show_fields, bool new last_printed_row=print_rows(show_fields,last_printed_row,last_hpos); // process subsection - if (ss.enabled()) + if (ss.enabled()) ok |= ss.print_body(show_fields) ; } } // ... loop for each field const word hgt = height(); + if (print_rows(show_fields,last_printed_row,hgt) > 0 && show_fields==printmode_normal) ok = TRUE; // print footers @@ -4566,8 +4587,10 @@ bool TForm::print( { pr.formlen(height()); } - pr.set_char_size(_fontsize); // Set font name and size - pr.set_fontname(_fontname); // according to current form + if (_fontsize != 0) + pr.set_char_size(_fontsize); // Set font name and size + if (_fontname.not_empty()) + pr.set_fontname(_fontname); // according to current form const bool was_open = pr.isopen(); set_last_page(FALSE); // non e' l'ultima pagina @@ -4849,7 +4872,7 @@ bool TForm::validate(TForm_item &cf, TToken_string &s) TForm_item &fi= cf.find_field(var); rval.setvar(j, fi.get()); // il valore corrente del campo viene settato nell'espressione } - file->put(fld, (const char *)rval); // scrive il risultato dell'espressione nel campo del file + file->put(fld, rval.as_string()); // scrive il risultato dell'espressione nel campo del file } if (file->read()== NOERR) { // tenta una lettura del file @@ -4961,7 +4984,7 @@ bool TForm::validate(TForm_item &cf, TToken_string &s) else if (align== "MIDDLE") cf.y()= fi.y()+ fi.effective_height()/2; else - if (align== "BOTTOM") cf.y()= fi.y()+ fi.effective_height()-1; + if (align== "BOTTOM") cf.y()= fi.y()+ (fi.effective_height() ? fi.effective_height()-1 : 0); else if (align== "LEFT") cf.set_x(fi.x()); else @@ -4991,9 +5014,8 @@ bool TForm::validate(TForm_item &cf, TToken_string &s) int comma = s.find(','); TExpression rval(s.mid(comma+1),code[1]=='N' ? _numexpr:_strexpr,TRUE); cf.section().eval_expr(rval); - const char *res = (const char *)rval; if (!rval.error()) - cf.set(res); + cf.set(rval.as_string()); return TRUE; } @@ -5284,8 +5306,8 @@ void TForm::init() _cursor= NULL; _rel_desc= NULL; _isnew= FALSE; - _fontname= "Roman 17cpi"; - _fontsize= 12; + _fontname= ""; + _fontsize= 0; _x= 0; _y= 0; _char_to_pos= '\0'; diff --git a/include/form.h b/include/form.h index df5df91dd..b8dbdac40 100755 --- a/include/form.h +++ b/include/form.h @@ -608,7 +608,7 @@ public: { tab(0); return _nfld; } // @cmember Ritorna l'altezza della sezione word height() const ; - // @cmember Ritorna l'altezza minima delle sottosezioni + // @cmember Ritorna l'altezza minima delle sottosezioni (non più usato) word subs_height() const ; // @cmember Ritorna l'offset della prima colonna word ofspc() const @@ -804,6 +804,9 @@ public: // @cmember Ritorna l'altezza effettiva del campo virtual int effective_height() const { return _effective_height; } + // @cmember Imposta l'altezza effettiva del campo + virtual void set_effective_height(int val) + { _effective_height=val; } // @cmember Formatta la stringa

. Funzione che per default non fa nulla. // Ridefinita solo per TForm_number e TForm_string. virtual void apply_format(TString & s) const {} @@ -1024,6 +1027,12 @@ public: virtual bool parse(TScanner& s); virtual bool update(); virtual bool edit(TMask& m); + // @cmember Ritorna l'altezza (in caratteri) + virtual int height() const + {return _ssec.height();} + // @cmember Ritorna l'altezza minima (in caratteri) + int minheight() const + {return _height;} virtual const char* class_name() const { return "SEZIONE"; } virtual bool is_section() const { return TRUE; } diff --git a/include/isam.cpp b/include/isam.cpp index c369b4cf6..ead524ee1 100755 --- a/include/isam.cpp +++ b/include/isam.cpp @@ -1545,7 +1545,7 @@ void TSystemisamfile::makelc(TRectype& rec) for (int k = 0; k < e.numvar(); k++) e.setvar(k, get(e.varname(k))); - f.write(e, rec); + f.write(e.as_string(), rec); } } @@ -1766,11 +1766,9 @@ int TSystemisamfile::update( prefix().update_recdes(num()); if (toconvert) - { packindex(); - if (err == NOERR) - err = exec_convapp(lev, FALSE); // Post - conversion - } + if (err == NOERR) + err = exec_convapp(lev, FALSE); // Post - conversion } } diff --git a/include/isamrpc.cpp b/include/isamrpc.cpp index 1fb14cd54..ea1246d63 100755 --- a/include/isamrpc.cpp +++ b/include/isamrpc.cpp @@ -23,7 +23,7 @@ bool rpc_Start() { delete _client; _client = NULL; - ok = error_box("Errore di inizializzazione del socket client"); + ok = error_box("Errore di inizializzazione del socket client."); } } return ok; diff --git a/include/maskfld.h b/include/maskfld.h index b04518d29..bc13a19f1 100755 --- a/include/maskfld.h +++ b/include/maskfld.h @@ -11,7 +11,7 @@ #ifndef __SCANNER_H #include -#endif +#endif class TControl; // __CONTROL_H class TText_control; @@ -913,6 +913,10 @@ public: const TString& get_filter() const { return _filter;} + // @cmember Cambia il filtro della browse + void set_filter(const char * filter) + { _filter = filter;} + // @cmember Controlla la validita' del campo bool check(CheckTime = RUNNING_CHECK); // @cmember Controlla se il campo puo' essere vuoto diff --git a/include/multirec.cpp b/include/multirec.cpp index 55abc2abd..facee2d44 100755 --- a/include/multirec.cpp +++ b/include/multirec.cpp @@ -297,6 +297,30 @@ int TMultiple_rectype::loaded_rows(int logicnum) const return r->rows(); } +// @mfunc confronta due record multipli +int TMultiple_rectype::compare(const TSortable& s) const +{ + int res = TRectype::compare(s); + TMultiple_rectype & m = (TMultiple_rectype &) s; + for (int i = 0 ; res == 0 && i < _nfiles; i++) + { + int logicnum = _logicnums[i]; + TRecord_array & r = body(logicnum); + TRecord_array & r1 = m.body(logicnum); + res = r.rows() - r1.rows(); + if (res == 0 && r.rows() > 0 && r1.rows() > 0) + { + for (int j = r.last_row(), k = r1.last_row(); res == 0 && j > 0 && k > 0; j = r.pred_row(j), k = r1.pred_row(k)) + { + res = j - k; + if (res == 0) + res = r[j] != r1[j]; + } + } + } + return res; +} + int TMultiple_rectype::remove(TBaseisamfile & f) const { int err = NOERR; diff --git a/include/netsock.h b/include/netsock.h index 75ac7522f..edb124e68 100755 --- a/include/netsock.h +++ b/include/netsock.h @@ -36,7 +36,7 @@ class TSocketClient : public TLanClient { BYTE* m_pData; DWORD m_dwSize; - + protected: // TLanManager virtual BOOL Boot(); virtual BOOL ShutDown(); diff --git a/include/prassi.aut b/include/prassi.aut index 3099730f9..4c96c1b9e 100755 --- a/include/prassi.aut +++ b/include/prassi.aut @@ -1,7 +1,7 @@ ba Base -74 Modello 740 -75 Modello 750 -76 Modello 760 +74 +75 +76 77 Modello 770 iv Gestione IVA se Contabilita' Semplificata @@ -19,8 +19,8 @@ at AVIS Provinciale in Elenchi Intracomunitari po Gestione Penna Ottica ab Analisi di bilancio -ni Nota Integrativa -nr Nota Integrativa Ridotta +ni +nr pc Parcellazione af Autoformazione gi Gestione ICI diff --git a/include/printer.cpp b/include/printer.cpp index 8fd9b33e0..5c4ee24de 100755 --- a/include/printer.cpp +++ b/include/printer.cpp @@ -952,9 +952,7 @@ void TPrinter::init_formlen( int w; while (mincol < maxcol ) { - - w = xvt_dwin_get_text_width(prwin, (char*)(const char*)spc, _formwidth); - + w = xvt_dwin_get_text_width(prwin, (char*)(const char*)spc, _formwidth); if (w < pw) mincol = _formwidth+1; else diff --git a/include/progind.cpp b/include/progind.cpp index bb5b0b6af..56d91374e 100755 --- a/include/progind.cpp +++ b/include/progind.cpp @@ -205,7 +205,7 @@ bool TProgind::setstatus(long l) { CHECK(l >= 0, "Bad progind status"); const long old_perc = _status * 100L / _max; - _status = l > _max ? _max : l; + _status = l > _max ? _max : l; const long new_perc = _status * 100L / _max; const bool tictac = new_perc != old_perc; if (tictac) diff --git a/include/rdoc.h b/include/rdoc.h index 87baf460c..483b71789 100755 --- a/include/rdoc.h +++ b/include/rdoc.h @@ -20,6 +20,11 @@ #define RDOC_PREZZO "PREZZO" #define RDOC_UMQTA "UMQTA" #define RDOC_QTA "QTA" +#define RDOC_QTAGG1 "QTAGG1" +#define RDOC_QTAGG2 "QTAGG2" +#define RDOC_QTAGG3 "QTAGG3" +#define RDOC_QTAGG4 "QTAGG4" +#define RDOC_QTAGG5 "QTAGG5" #define RDOC_QTAEVASA "QTAEVASA" #define RDOC_RIGAEVASA "RIGAEVASA" #define RDOC_TARA "TARA" diff --git a/include/real.cpp b/include/real.cpp index e9c1ecc50..ed6d83bb7 100755 --- a/include/real.cpp +++ b/include/real.cpp @@ -82,8 +82,8 @@ real& real::operator *= (long double b) } real& real::operator /= (long double b) -{ - CHECK(b != 0.0, "Disivision by zero"); +{ + CHECK(b != 0.0, "Division by zero"); _dec /= b; return *this; } @@ -346,6 +346,7 @@ HIDDEN real __tmp_real; real::real () { dzero (ptr ()); + trail(); } real::real (const real & b) @@ -389,6 +390,8 @@ real::real (const char *s) atod (ptr (), (char *) s); else dzero (ptr ()); + + trail(); } real& real::operator =(const real & b) @@ -550,6 +553,7 @@ istream & operator >> ( { in >> __string; atod (a.ptr (), __string); + a.trail(); return in; } diff --git a/include/real.h b/include/real.h index b40be0583..399af6dca 100755 --- a/include/real.h +++ b/include/real.h @@ -29,8 +29,6 @@ protected: // @cmember Permette di stampare l'oggetto virtual void print_on(ostream& out) const; - // @access Protected Member -protected: // @cmember Duplica il numero reale (vedi classe ) virtual TObject* dup() const; // @cmember Traduce in lettere il numero reale @@ -164,6 +162,8 @@ protected: // @access Protected Member protected: + // @cmember Permette di stampare l'oggetto + virtual void print_on(ostream& out) const; // @cmember Duplica il numero reale (vedi classe ) virtual TObject* dup() const; diff --git a/include/recarray.h b/include/recarray.h index abcb19e08..9aa6a9106 100755 --- a/include/recarray.h +++ b/include/recarray.h @@ -147,6 +147,7 @@ class TFile_cache : public TObject TToken_string _code; TString16 _filecode; TLocalisamfile* _file; + TString16 _filecode; int _key; long _last_firm; int _error; diff --git a/include/relapp.cpp b/include/relapp.cpp index 4fe5d3c59..11169b84b 100755 --- a/include/relapp.cpp +++ b/include/relapp.cpp @@ -316,9 +316,6 @@ void TRelation_application::query_mode( set_mode(MODE_QUERY); init_query_mode(*_mask); } - - if (_curr_transaction.not_empty()) - ini2query_mask(); } @@ -358,6 +355,7 @@ void TRelation_application::insert_mode() init_insert_mode(*_mask); + // ....possibilmente spostare questa chiamata ..... if (_curr_transaction == TRANSACTION_INSERT) ini2insert_mask(); } @@ -396,6 +394,7 @@ bool TRelation_application::modify_mode() get_relation()->save_status(); init_modify_mode(*_mask); + // ....possibilmente spostare questa chiamata ..... if (_curr_transaction == TRANSACTION_MODIFY) ini2insert_mask(); return TRUE; @@ -861,6 +860,10 @@ void TRelation_application::main_loop() // ciclo delle transazioni _recins = -1; + // imposta la maschera in query mode + query_mode(); + _mask->open_modal(); + // Provoca l'autopremimento per il messaggio di LINK if (_lnflag) { @@ -882,9 +885,9 @@ void TRelation_application::main_loop() _mask->send_key(K_AUTO_ENTER, 0); } } - - query_mode(); - _mask->open_modal(); + + if (_curr_transaction.not_empty()) + ini2query_mask(); do { @@ -1252,13 +1255,15 @@ bool TRelation_application::parse_command_line() ini.upper(); if (ini.left(2) == "-I" || ini.left(2) == "/I") { + TString16 ininame(ini.mid(2)); + CHECK(!ininame.blank(),"Manca l'indicazione della transazione. Il nome va indicato di seguito al -i, senza interporre spaziatura."); if (ini.find('*')>=0) { // metachars: - list_files(ini.mid(2), _trans_ini); + list_files(ininame, _trans_ini); } else - _trans_ini.add(ini.mid(2)); + _trans_ini.add(ininame); break; } } diff --git a/include/relation.cpp b/include/relation.cpp index bc8813364..8ef0b421a 100755 --- a/include/relation.cpp +++ b/include/relation.cpp @@ -1875,6 +1875,19 @@ const char* TFieldref::read(TConfig& ini, const char* defpar) const if (_to < l && _to > 0) buffer.cut(_to); if (_from > 0) buffer.ltrim(_from); } + else + { + // Gestisce valori tra virgolette + const int last = buffer.len()-1; + if (last > 0) + { + if ((buffer[0] == '"' || buffer[0] == '\'') && buffer[0] == buffer[last]) + { + buffer.ltrim(1); + buffer.rtrim(1); + } + } + } return buffer; } @@ -1891,8 +1904,16 @@ void TFieldref::write(TConfig& ini, const char* defpar, const char* val) const ini.set(_name, buffer, para); } else - { - ini.set(_name, val, para); + { + if (strchr(val,' ') != NULL) // Controlla se c'e' bisogno di virgolette + { + const char virg = strchr(val, '"') ? '\'' : '"'; + buffer.cut(0); + buffer << virg << val << virg; + ini.set(_name, buffer, para); + } + else + ini.set(_name, val, para); } } diff --git a/include/stack.cpp b/include/stack.cpp index ba9da8ea8..46f19a2e2 100755 --- a/include/stack.cpp +++ b/include/stack.cpp @@ -36,3 +36,4 @@ bool TStack::destroy_base() if (_sp > 0) _sp--; return _data.destroy(0, TRUE); } + diff --git a/include/validate.cpp b/include/validate.cpp index cb1b7fb0d..e4b026e83 100755 --- a/include/validate.cpp +++ b/include/validate.cpp @@ -545,7 +545,7 @@ HIDDEN bool _numcalc_val(TMask_field& f, KEY k) const int fldid = atoi(s); e.setvar(i, fldid == 0 ? f.get() : f.mask().get(fldid)); } - const TFixed_string s((const char*)e); + const TFixed_string s(e.as_string()); f.set(s); return TRUE; } @@ -568,7 +568,7 @@ HIDDEN bool _strcalc_val(TMask_field& f, KEY k) const int fldid = atoi(s); e.setvar(i, fldid == 0 ? f.get() : f.mask().get(fldid)); } - TFixed_string s((const char*) e); + TFixed_string s( e.as_string()); f.set(s); return TRUE; } diff --git a/include/varmask.cpp b/include/varmask.cpp index 968f24a47..6b439f821 100755 --- a/include/varmask.cpp +++ b/include/varmask.cpp @@ -53,6 +53,11 @@ TVariable_mask::TVariable_mask(const char* name, int num, int max) : TMask() } +TVariable_mask::TVariable_mask() : TMask() +{ +} + + TMask& TVariable_sheet_field::sheet_mask() const { TMask & m = TSheet_field::sheet_mask(); diff --git a/include/varmask.h b/include/varmask.h index 652ad0c91..3d4c8c5f8 100755 --- a/include/varmask.h +++ b/include/varmask.h @@ -39,7 +39,8 @@ public: virtual void enable(short fld_id, bool on = TRUE); // @cmember Legge il campo da file virtual TMask_field* parse_field(TScanner& scanner); - + // @cmember Costruttore (crea la maschera leggendo la descrizione dal file .msk) + TVariable_mask( ); // @cmember Costruttore (crea la maschera leggendo la descrizione dal file .msk) TVariable_mask( const char* name, int num = 0, int max = MAX_PAGES); // @cmember Distruttore diff --git a/include/window.cpp b/include/window.cpp index 51a2b396a..e19099aba 100755 --- a/include/window.cpp +++ b/include/window.cpp @@ -1165,7 +1165,7 @@ WINDOW TScroll_window::create(short x, short y, short dx, short dy, } PNT TScroll_window::log2dev(long x, long y) const -{ +{ if (_autoscroll) { if (_pixmap) diff --git a/include/window.h b/include/window.h index e1593b4e8..aa261b784 100755 --- a/include/window.h +++ b/include/window.h @@ -200,6 +200,9 @@ public: // @cmember Distruttore virtual ~TWindow(); + // @cmember Ritorna l'handler della finestra padre + WINDOW parent() const; + // @cmember Ritorna l'identificatore della classe finestra virtual word class_id() const; diff --git a/mg/batbcau.h b/mg/batbcau.h index f7f9662c8..5d262cb72 100755 --- a/mg/batbcau.h +++ b/mg/batbcau.h @@ -30,6 +30,9 @@ #define F_UPDTULC 137 #define F_CODICE2 138 #define F_DESCAU2 139 +#define F_DIBAEXPLOSION 140 +#define F_DEFAULTMAG 141 +#define F_DEFAULTDEP 142 #define G_SGNVAL 20 #define G_SGNQTA 21 diff --git a/mg/batbcau.uml b/mg/batbcau.uml index 97df729fe..ee93bc0b7 100755 --- a/mg/batbcau.uml +++ b/mg/batbcau.uml @@ -147,6 +147,37 @@ BEGIN WARNING "La causale collegata deve essere una causale senza ulteriori collegamenti" END +BOOL F_DIBAEXPLOSION +BEGIN + FIELD B3 + PROMPT 2 17 "Esplodi mediante Distinta Base" +END + +STRING F_DEFAULTMAG 3 +BEGIN + PROMPT 2 19 "Magazzino di default " + FIELD S10[1,3] + USE MAG SELECT CODTAB[4,5]=="" + INPUT CODTAB F_DEFAULTMAG + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_DEFAULTMAG CODTAB + MESSAGE EMPTY DISABLE,F_DEFAULTDEP + MESSAGE ENABLE,F_DEFAULTDEP +END + +STRING F_DEFAULTDEP 2 +BEGIN + PROMPT 2 20 "Deposito di default " + FIELD S10[4,5] + USE MAG SELECT CODTAB[4,5]!="" + INPUT CODTAB[1,3] F_DEFAULTMAG + INPUT CODTAB[4,5] F_DEFAULTDEP + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_DEFAULTMAG CODTAB[1,3] + OUTPUT F_DEFAULTDEP CODTAB[4,5] +END ENDPAGE PAGE "Movimentazione campi" 11 60 14 diff --git a/mg/batbfca.h b/mg/batbfca.h index dbdd018a0..4d5954992 100755 --- a/mg/batbfca.h +++ b/mg/batbfca.h @@ -1,11 +1,10 @@ // ARTICOLI -#define F_CODLIV 101 -#define F_DESLIV 102 -#define F_FORMLIV 103 +#define F_CODLIV 101 +#define F_DESLIV 102 +#define F_FORMLIV 103 +#define F_CODGROUP 104 +#define F_DESGROUP 105 +#define F_LENFORM 106 -#define F_CODGROUP 104 -#define F_DESGROUP 105 -#define F_LENFORM 106 - -#define F_NEXTLIV 107 -#define F_CHECKLIV 108 +#define F_NEXTLIV 107 +#define F_CHECKLIV 108 diff --git a/mg/batbfcg.h b/mg/batbfcg.h index 962654060..e4ed354d2 100755 --- a/mg/batbfcg.h +++ b/mg/batbfcg.h @@ -1,5 +1,10 @@ -#define F_CODLIV 101 -#define F_DESLIV 102 -#define F_FORMLIV 103 -#define F_CODGROUP 104 -#define F_DESGROUP 105 +// giacenze +#define F_CODLIV 101 +#define F_DESLIV 102 +#define F_FORMLIV 103 +#define F_CODGROUP 104 +#define F_DESGROUP 105 +#define F_LENFORM 106 + +#define F_AUTOINSERT 107 +#define F_CODICEADATA 108 diff --git a/mg/batbfcg.uml b/mg/batbfcg.uml index c0b5f058e..9f1f2b58f 100755 --- a/mg/batbfcg.uml +++ b/mg/batbfcg.uml @@ -1,4 +1,4 @@ -#include "batbfca.h" +#include "batbfcg.h" TOOLBAR "" 0 20 60 2 #include ENDPAGE @@ -51,6 +51,19 @@ BEGIN CHECKTYPE REQUIRED END +BOOLEAN F_AUTOINSERT +BEGIN + PROMPT 7 8 "Abilita auto inserimento" + FIELD B0 +END + +BOOLEAN F_CODICEADATA +BEGIN + PROMPT 7 8 "Codice come data" + FLAG "H" + FIELD B1 +END + NUMBER F_LENFORM 2 BEGIN PROMPT 2 100 "" @@ -59,6 +72,7 @@ BEGIN END + ENDPAGE diff --git a/mg/batbgcg.uml b/mg/batbgcg.uml index 8c60aab0e..bb99306ca 100755 --- a/mg/batbgcg.uml +++ b/mg/batbgcg.uml @@ -1,4 +1,4 @@ -#include "batbfca.h" +#include "batbfcG.h" TOOLBAR "" 0 20 60 2 #include @@ -20,10 +20,19 @@ BEGIN OUTPUT F_CODLIV CODTAB OUTPUT F_DESLIV S0 OUTPUT F_FORMLIV S1 + OUTPUT F_AUTOINSERT B0 CHECKTYPE FORCED ADD NONE END +BOOL F_AUTOINSERT +BEGIN + PROMPT 1 1 "" + FLAG "HG" + MESSAGE TRUE NORMAL,F_DESGROUP + MESSAGE FALSE REQUIRED,F_DESGROUP +END + // descrizione parte del formato codice STRING F_DESLIV 50 BEGIN @@ -79,7 +88,7 @@ BEGIN DISPLAY "Livello@20 " 500@->S0 DISPLAY "Codice@23" CODTAB[2,25] COPY OUTPUT F_CODGROUP - CHECKTYPE REQUIRED + CHECKTYPE REQUIRED END ENDPAGE diff --git a/mg/f111.dir b/mg/f111.dir index 406e4dcb1..e2e71eeb8 100755 --- a/mg/f111.dir +++ b/mg/f111.dir @@ -1,3 +1,3 @@ 111 0 -$rmovmag|0|0|94|0|Righe movimenti di magazzino||| +$rmovmag|136|150|95|0|Righe movimenti di magazzino||| diff --git a/mg/f111.trr b/mg/f111.trr index ab575d5e4..efe4edda1 100755 --- a/mg/f111.trr +++ b/mg/f111.trr @@ -1,5 +1,5 @@ 111 -10 +11 NUMREG|3|7|0|Numero di registrazione NRIG|2|4|0|Numero di riga CODMAG|1|5|0|Codice magazzino e deposito @@ -10,6 +10,7 @@ QUANT|4|15|5|Quantita' PREZZO|4|18|3|Prezzo CAUS|1|6|0|Causale di magazzino della riga AUTOMATICA|1|1|0|Flag di riga automatica +ESPLOSA|8|1|0|Flag di riga esplosa (da DiBa) 2 NUMREG+NRIG| CODART+LIVGIAC+CODMAG+NUMREG|X diff --git a/mg/mg0100.cpp b/mg/mg0100.cpp index 2536e3276..a1f8974c3 100755 --- a/mg/mg0100.cpp +++ b/mg/mg0100.cpp @@ -1,6 +1,7 @@ // gestione tabelle di magazzino #include #include +#include #include "batbcau.h" #include "batbfca.h" #include "..\ve\batbmag.h" @@ -20,7 +21,9 @@ class TMask_tabmag : public TMask static bool singlemag_handler(TMask_field &, KEY); // handler static bool sumsign_handler(TMask_field &, KEY); // handler static bool format_handler(TMask_field &, KEY); // handler dei metacaratteri - static bool codliv_handler(TMask_field &, KEY); // handler del numero formato + static bool formatgiac_handler(TMask_field &, KEY); // handler dei metacaratteri + static bool codlivart_handler(TMask_field &, KEY); // handler del numero formato articoli + static bool codlivgiac_handler(TMask_field &, KEY); // handler del numero formato giacenze static bool codgrp_handler(TMask_field &, KEY); // handler del numero formato static bool numlivart_handler(TMask_field &, KEY); // handler del numero formato @@ -55,6 +58,8 @@ TMask_tabmag::TMask_tabmag(const char * _maskname,const TString16 &tabname): } else if (tabname == "%CAU") { + if (!main_app().has_module(DBAUT)) + hide(F_DIBAEXPLOSION); set_handler(F_SGNGIAC, sumsign_handler); } else if (tabname == "FCA") // FORMATO CODICE ARTICOLI @@ -63,7 +68,7 @@ TMask_tabmag::TMask_tabmag(const char * _maskname,const TString16 &tabname): aux_tabf = new TTable("FCA"); metach= new TMetachar(""); set_handler(F_FORMLIV, format_handler); - set_handler(F_CODLIV, codliv_handler); + set_handler(F_CODLIV, codlivart_handler); } else if (tabname == "GCA") // GRUPPI CODICE ARTICOLI { @@ -76,8 +81,8 @@ TMask_tabmag::TMask_tabmag(const char * _maskname,const TString16 &tabname): cod_liv = new TCodgiac_livelli; metach = new TMetachar("") ; aux_tabf = new TTable("FCG"); - set_handler(F_FORMLIV, format_handler); - set_handler(F_CODLIV, codliv_handler); + set_handler(F_FORMLIV, formatgiac_handler); + set_handler(F_CODLIV, codlivgiac_handler); } else if (tabname == "GCG") // GRUPPI CODICE GIACENZE { @@ -143,37 +148,70 @@ bool TMask_tabmag::format_handler(TMask_field& f, KEY k) if (k == K_TAB && f.focusdirty()) { TString s(f.get()); - TMask_tabmag & myself=((TMask_tabmag &)f.mask()); - TTable * aux_tabf=myself.aux_tabf; + TMask_tabmag & mask=((TMask_tabmag &)f.mask()); + TTable * aux_tabf=mask.aux_tabf; s.strip_spaces(); f.set(s); aux_tabf->zero(); - aux_tabf->put("CODTAB",myself.get_int(F_CODLIV)+1); + aux_tabf->put("CODTAB",mask.get_int(F_CODLIV)+1); if (aux_tabf->read()==NOERR) { // non è l'ultimo livello: solo caratteri obbligatori - if (myself.metach->has_opzchars(s)) + if (mask.metach->has_opzchars(s)) { f.error_box("I caratteri di formato opzionali ('%s') sono consentiti solo per l'ultimo livello", - myself.metach->opz_chars()); + mask.metach->opz_chars()); return FALSE; } } - // setta il campo con la lunghezza massima della stringa di formato - //myself.field(F_LENFORM).set(myself.metach->maxstrlen(f.get())); } return TRUE; } -// HANDLER DEL CODICE LIVELLO -bool TMask_tabmag::codliv_handler(TMask_field& f, KEY k) +// HANDLER DEL FORMATO DEL LIVELLO +bool TMask_tabmag::formatgiac_handler(TMask_field& f, KEY k) { if (k == K_TAB && f.focusdirty()) { - TMask_tabmag & myself=((TMask_tabmag &)f.mask()); - TTable * aux_tabf=myself.aux_tabf; + const int maxlen=15; + int total_len=0; + TString s(f.get()); + TMask_tabmag & mask=((TMask_tabmag &)f.mask()); + TTable * aux_tabf=mask.aux_tabf; + + s.strip_spaces(); + f.set(s); + mask.set(F_LENFORM,mask.metach->maxstrlen(s)); + + aux_tabf->zero(); + aux_tabf->put("CODTAB",1); + if (aux_tabf->read()==NOERR) + { + do { + if (aux_tabf->get_int("CODTAB") != mask.get_int(F_CODLIV)) + total_len+=aux_tabf->get_int("I0"); + } while (aux_tabf->next()==NOERR); + } + total_len+=mask.get_int(F_LENFORM); + if (total_len > maxlen) + { + f.error_box("La somma delle lunghezze dei codici \n dei livelli di giacenza eccede \nil massimo consentito di %d caratteri",maxlen); + return FALSE; + } + } + return TRUE; +} + + +// HANDLER DEL CODICE LIVELLO +bool TMask_tabmag::codlivart_handler(TMask_field& f, KEY k) +{ + if (k == K_TAB && f.focusdirty()) + { + TMask_tabmag & mask=((TMask_tabmag &)f.mask()); + TTable * aux_tabf=mask.aux_tabf; int codliv=atoi((const char *)f.get()); if (codliv>1) @@ -187,7 +225,7 @@ bool TMask_tabmag::codliv_handler(TMask_field& f, KEY k) TString prevformat(aux_tabf->get("S1")); aux_tabf->zero(); aux_tabf->put("CODTAB",codliv+1); - if (aux_tabf->read()!=NOERR && myself.metach->has_opzchars(prevformat)) + if (aux_tabf->read()!=NOERR && mask.metach->has_opzchars(prevformat)) { f.error_box("Il livello precedente include caratteri opzionali nel formato\ne non puo' divenire un livello intermedio"); return FALSE; @@ -202,14 +240,39 @@ bool TMask_tabmag::codliv_handler(TMask_field& f, KEY k) } +// HANDLER DEL CODICE LIVELLO +bool TMask_tabmag::codlivgiac_handler(TMask_field& f, KEY k) +{ + if (k == K_TAB && f.focusdirty()) + { + TMask_tabmag & mask=((TMask_tabmag &)f.mask()); + TTable * aux_tabf=mask.aux_tabf; + int codliv=atoi((const char *)f.get()); + + if (codliv>1) + // Non è il primo codice + { + aux_tabf->zero(); + aux_tabf->put("CODTAB",codliv-1); + if (aux_tabf->read()!=NOERR) + // non esiste un precedente + { + f.error_box("Non si possono inserire salti nel livello del codice"); + return FALSE; + } + } + } + return TRUE; +} + // gestisce l'introduzione del codice del livello articoli bool TMask_tabmag::numlivart_handler(TMask_field& f, KEY k) { if ((k == K_TAB && f.focusdirty())||k == K_ENTER ) { - TMask_tabmag & myself=((TMask_tabmag &)f.mask()); + TMask_tabmag & mask=((TMask_tabmag &)f.mask()); - if (myself.get_int(F_CODLIV)==myself.cod_liv->last_level()) + if (mask.get_int(F_CODLIV)==mask.cod_liv->last_level()) // non esiste un seguente { f.error_box("Non è possibile definire gruppi per l'ultimo livello di codice articolo"); @@ -226,15 +289,15 @@ bool TMask_tabmag::codgrp_handler(TMask_field& f, KEY k) { if ((k == K_TAB && f.focusdirty() )||k == K_ENTER ) { - TMask_tabmag & myself=((TMask_tabmag &)f.mask()); + TMask_tabmag & mask=((TMask_tabmag &)f.mask()); - if (!myself.cod_liv->enabled()) + if (!mask.cod_liv->enabled()) { f.error_box("Livelli del codice non abilitati"); return FALSE; } - if (!f.empty() && !(myself.cod_liv->fit_to_format(f.get(),myself.get_int(F_CODLIV)))) + if (!f.empty() && !(mask.cod_liv->fit_to_format(f.get(),mask.get_int(F_CODLIV)))) { f.error_box("Codice non corrispondente al formato previsto"); return FALSE; diff --git a/mg/mg1100.cpp b/mg/mg1100.cpp index 4678c7048..b9222b3c6 100755 --- a/mg/mg1100.cpp +++ b/mg/mg1100.cpp @@ -11,13 +11,18 @@ #include "..\ve\veconf.h" #include "mg1100.h" +#ifndef __DBLIB_H +#include "..\db\dblib.h" +#endif + //******************** //******************** // maschera dell'applicazione "Gestione interattiva movimenti di magazzino" // -class TMask_movmag: public TMask { +class TMask_movmag: public TMask +{ static TRecord_cache cache_causali; TMov_mag * mov_mag; TCodgiac_livelli * livelli_giac; // oggetto gestione livelli di giacenza @@ -26,7 +31,10 @@ class TMask_movmag: public TMask { bool price_proposed; real proposed_price(const char * codart, real quant,const char * causrig); - bool update_rigamov (int r, const char * old_codcaus); + // aggiorna la riga di magazzino aggiungendo righe automatiche o esplosioni + bool update_rigamov (int r, const char * old_codcaus, const char * old_codart, const real & old_quant); + bool add_autorows (int r, const char * old_codcaus, const char * old_codart, const real & old_quant); + bool add_explrows (int r); TMagazzini _magazzini; static bool notify_righe(TSheet_field & fld_righe, int item, KEY k); // notify delle righe di sheet @@ -92,7 +100,6 @@ TMask_movmag::~TMask_movmag() { } - // item varies from 1 to items() void TMask_movmag::sheetrighe_get(TSheet_field &fld_righe, int item) { @@ -127,14 +134,20 @@ void TMask_movmag::sheetrighe_put(TSheet_field &fld_righe, int item) bool TMask_movmag::handle_righe(TMask_field &f, KEY k) { - if (k == K_ENTER) { - TSheet_field & ss=(TSheet_field & )f; - for (int i=0; i< ss.items(); i++) + if (k == K_ENTER) + { + TSheet_field& ss=(TSheet_field & )f; + const int column = ss.cid2index(F_CODMAG); + + if (ss.column_enabled(column)) { - if (*ss.cell(i,ss.cid2index(F_CODMAG)) ==' ') + for (int i = 0; i < ss.items(); i++) { - f.error_box("Nella riga %d manca l'indicazione del magazzino ",i+1); - return FALSE; + if (*ss.cell(i,column) <= ' ') + { + f.error_box("Nella riga %d manca l'indicazione del magazzino ",i+1); + return FALSE; + } } } } @@ -145,16 +158,16 @@ bool TMask_movmag::notify_righe(TSheet_field & ss, int r, KEY key) { TMask_movmag &m=(TMask_movmag &)ss.mask(); static TString16 old_codcaus; + static TString old_codart(20); + static real old_quant(1); if ( key == K_DEL ) // Cancellazione { if (*ss.cell(r,ss.cid2index( F_AUTOMATICA))==riga_automatica) return FALSE; // can't remove auto lines directly - if (r < ss.items()-1) + while (r < ss.items()-1 && *ss.cell(r+1,ss.cid2index( F_AUTOMATICA))==riga_automatica) { - if (*ss.cell(r+1,ss.cid2index( F_AUTOMATICA))==riga_automatica) - { - ss.destroy(r + 1); - } + // autoremove automatic lines along with the original one + ss.destroy(r+1); } } else if (key == K_INS) { // Inserimento @@ -171,9 +184,10 @@ bool TMask_movmag::notify_righe(TSheet_field & ss, int r, KEY key) 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); } else if (key == K_ENTER) { - if (m.update_rigamov(r,old_codcaus)) + if (m.update_rigamov(r,old_codcaus,old_codart,old_quant)) ss.select(r+1); } return TRUE; @@ -207,46 +221,155 @@ bool TMask_movmag::handle_righeprezzo2(TMask_field &f, KEY k) return TRUE; } -bool TMask_movmag::update_rigamov (int r, const char * old_codcaus) +bool TMask_movmag::update_rigamov (int r, const char * old_codcaus, const char * old_codart, const real & old_quant) { + bool added_some=add_autorows(r, old_codcaus, old_codart, old_quant); + if (added_some) + add_explrows(r+1); + added_some |=add_explrows(r); + return added_some; +} + +bool TMask_movmag::add_autorows (int r, const char * old_codcaus, const char * old_codart, const real & old_quant) +{ + bool added_some=FALSE; TSheet_field & ss=(TSheet_field & )field(F_RIGHE); - + real new_factor(ss.cell(r,ss.cid2index(F_QUANT))); + new_factor = old_quant.is_zero() ? ZERO : new_factor / old_quant; TString16 new_codcaus(ss.cell(r,ss.cid2index(F_CAUSRIG))); 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); - if (*cau.caus_collegata()!='\0') + bool rimuovi_righe_coll=FALSE; + bool inserisci_righe_coll=*cau.caus_collegata()!='\0'; + if (inserisci_righe_coll) { + // ******************************* // deve esserci una riga collegata - TString16 codmag,coddep; - real prezzo(ss.cell(r,ss.cid2index(F_PREZZO))); - if (r < ss.items()-1 && *ss.cell(r+1,ss.cid2index( F_AUTOMATICA)) != riga_automatica) + 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() + && 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 + if (*oldcau.caus_collegata()!='\0') // ho cambiato causale, passando ad una che non ha collegamenti + rimuovi_righe_coll=TRUE; + // ****************** + if (rimuovi_righe_coll) + { + while (r < ss.items()-1 + && *ss.cell(r+1,ss.cid2index( F_AUTOMATICA)) == riga_automatica) + ss.destroy(r + 1); + } + + // ****************** + if (inserisci_righe_coll) + { + TCausale_magazzino &cau_coll =(TCausale_magazzino &)cache_causali.get(cau.caus_collegata()); + TString tmpstr; + int offset=1; +#define COPIA_SU_AUTO(colnum) {tmpstr=(ss.row(r).get(ss.cid2index(colnum))); ss.row(r+offset).add(tmpstr,ss.cid2index(colnum));} + if ((r == ss.items()-1 || r < ss.items()-1 && *ss.cell(r+1,ss.cid2index( F_AUTOMATICA)) != riga_automatica)) { // manca, la inserisco - ss.insert(r+1); - ss.row(r+1)=ss.row(r); - } else { - ss.row(r+1)=ss.row(r); - } - //codmag=ss.cell(r,ss.cid2index(F_CODMAG)); - //coddep=ss.cell(r,ss.cid2index(F_CODDEP)); - //ss.row(r+1).add(codmag,ss.cid2index(F_CODMAG)); - //ss.row(r+1).add(coddep,ss.cid2index(F_CODDEP)); - ss.row(r+1).add(prezzo.string(),ss.cid2index(F_PREZZO)); - - ss.row(r+1).add(cau.caus_collegata(),ss.cid2index(F_CAUSRIG)); - ss.row(r+1).add(TString(1,riga_automatica),ss.cid2index(F_AUTOMATICA)); - ss.check_row(r+1); - ss.force_update(r+1); - return TRUE; - } else - if (*oldcau.caus_collegata()!='\0') + ss.insert(r+offset); + ss.row(r+offset)=ss.row(r); + ss.row(r+offset).add(TString(1,riga_automatica),ss.cid2index(F_AUTOMATICA)); + if (cau_coll.has_default_mag()) + ss.row(r+1).add(cau_coll.default_mag(),ss.cid2index(F_CODMAG)); + if (cau_coll.has_default_dep()) + ss.row(r+1).add(cau_coll.default_mag(),ss.cid2index(F_CODDEP)); + COPIA_SU_AUTO(F_PREZZO); + added_some= TRUE; + } + while (r+offset < ss.items() && *ss.cell(r+offset,ss.cid2index( F_AUTOMATICA))==riga_automatica) { - // scollega la vecchia riga - ss.destroy(r + 1); + // riporta eventuali cambiamenti della riga "Master" sulle righe automatice + if (*ss.cell(r+offset,ss.cid2index( F_ESPLOSA)) <=' ') + { + COPIA_SU_AUTO(F_CODART); + COPIA_SU_AUTO(F_LIV1); + COPIA_SU_AUTO(F_LIV2); + COPIA_SU_AUTO(F_LIV3); + COPIA_SU_AUTO(F_LIV4); + COPIA_SU_AUTO(F_UM); + COPIA_SU_AUTO(F_QUANT); + ss.row(r+offset).add(cau.caus_collegata(),ss.cid2index(F_CAUSRIG)); + ss.check_row(r+offset); + ss.force_update(r+offset); + } else { + if (new_factor != 1.0) + { + real q(ss.row(r+offset).get(ss.cid2index(F_QUANT))); + q*=new_factor; + tmpstr=q.string(); + ss.row(r+offset).add(tmpstr,ss.cid2index(F_QUANT)); + ss.force_update(r+offset); + } + } + + offset++; } - return FALSE; + } + return added_some; +} + +bool TMask_movmag::add_explrows(int r) +{ + TSheet_field & sheet=(TSheet_field & )field(F_RIGHE); + TString16 new_codcaus(sheet.cell(r,sheet.cid2index(F_CAUSRIG))); + if (new_codcaus.blank()) + new_codcaus=get(F_CODCAUS); + + bool added_some=FALSE; + + TCausale_magazzino &cau =(TCausale_magazzino &)cache_causali.get(new_codcaus); + if (cau.esplodente() && *sheet.cell(r,sheet.cid2index(F_ESPLOSA)) == ' ') + { + TDistinta_tree distinta; + TArray boom; + // ******************************* + // c'e' una riga di movimento esplodente non ancora esplosa: + // va sostituita con n righe esplose + TString codmag; + real prezzo,quant; + distinta.set_root(sheet.cell(r,sheet.cid2index(F_CODART))); + distinta.explode(boom); + for (int newrow=0; newrow < boom.items() ; newrow++) + { + 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)); + } + 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" + sheet.destroy(r); + } + return added_some; } real TMask_movmag::proposed_price(const char *codart, @@ -293,7 +416,7 @@ bool TMask_movmag::handle_codcaus(TMask_field &fld, KEY k) for (int i=0; i< ss.items(); i++) { if (*ss.cell(i,ss.cid2index(F_CAUSRIG)) ==' ') - added_some &=(m.update_rigamov(i,old_codcaus)); + added_some &=(m.update_rigamov(i,old_codcaus,ss.cell(i,ss.cid2index(F_CODART)), real(ss.cell(i,ss.cid2index(F_QUANT))))); } if (added_some) { @@ -324,7 +447,8 @@ bool TMask_movmag::handle_datacomp(TMask_field &fld, KEY k) -class TApp_movmag: public TRelation_application { +class TApp_movmag: public TRelation_application +{ TArray used_files; TMask_movmag *_msk; // maschera principale TCodgiac_livelli * _livelli_giac;// oggetto handler per i livelli di giacenza @@ -338,6 +462,7 @@ class TApp_movmag: public TRelation_application { virtual const char *get_next_key(); TString16 _nextcod; + public: TApp_movmag() {}; virtual ~TApp_movmag() {}; @@ -380,14 +505,15 @@ bool TApp_movmag::user_destroy() // autonumerazione const char *TApp_movmag::get_next_key() { - return _nextcod.format("%d|%s",F_NUMREG,((TMov_mag &)_rel->curr()).get_next_key()); + const char* nk = ((TMov_mag &)_rel->curr()).get_next_key(); + return _nextcod.format("%d|%s",F_NUMREG, nk); } int mg1100(int argc, char* argv[]) { TApp_movmag a; - a.run(argc, argv, "Movimenti di magazzino"); + exit(0); return 0; } diff --git a/mg/mg1100.uml b/mg/mg1100.uml index 411355893..9c61ebe4b 100755 --- a/mg/mg1100.uml +++ b/mg/mg1100.uml @@ -135,79 +135,51 @@ BEGIN GROUP G_DEFMOV END - -LISTBOX F_TIPOCONDV 1 12 +RADIOBUTTON F_TIPOCF 15 BEGIN - FIELD TIPOCV - PROMPT 2 10 "Condizione di vendita " - ITEM " |Nessuna" - MESSAGE CLEAR,F_CATVEN - MESSAGE RESET,F_CODLIST|RESET,F_CODCONTR|RESET,F_CODOFF - MESSAGE HIDE,F_CODLIST|HIDE,F_CODCONTR|HIDE,F_CODOFF|CLEAR,F_TIPOCF - ITEM "L|Listino" - MESSAGE ENABLE,F_CATVEN - MESSAGE SHOW,F_CODLIST|HIDE,F_CODCONTR|HIDE,F_CODOFF - MESSAGE RESET,F_CODCONTR|RESET,F_CODOFF|CLEAR,F_TIPOCF - ITEM "C|Contratto" - MESSAGE CLEAR,F_CATVEN - MESSAGE HIDE,F_CODLIST|SHOW,F_CODCONTR|HIDE,F_CODOFF - MESSAGE RESET,F_CODLIST|RESET,F_CODOFF|ENABLE,F_TIPOCF - ITEM "O|Offerta" - MESSAGE CLEAR,F_CATVEN - MESSAGE HIDE,F_CODLIST|HIDE,F_CODCONTR|SHOW,F_CODOFF - MESSAGE RESET,F_CODLIST|RESET,F_CODCONTR|CLEAR,F_TIPOCF - -// GROUP G_DEFMOV -END - -LISTBOX F_TIPOCF 20 -BEGIN - PROMPT 42 10 "relativo a " + PROMPT 2 8 "" FLAGS "G" FIELD TIPOCF - ITEM " |" + ITEM " |Nessuno" MESSAGE HIDE,F_CODCLI|HIDE,F_CODFOR|HIDE,F_RAGSOC|RESET,F_CODCF|HIDE,F_CODCF - ITEM "C|cliente" + ITEM "C|Cliente" MESSAGE SHOW,F_CODCF|SHOW,F_CODCLI|HIDE,F_CODFOR|SHOW,F_RAGSOC|CHECK,F_CODCONTR - ITEM "F|fornitore" + ITEM "F|Fornitore" MESSAGE SHOW,F_CODCF|HIDE,F_CODCLI|SHOW,F_CODFOR|SHOW,F_RAGSOC|CHECK,F_CODCONTR - GROUP G_DEFMOV END +TEXT F_CODCLI +BEGIN + PROMPT 20 10 "Codice cliente " +END + +TEXT F_CODFOR +BEGIN + PROMPT 20 10 "Codice fornitore " +END + // agisce anche quando l'utente non entra in gioco (settaggio da contratto...) NUMBER F_CODCF 6 BEGIN // FLAGS "UHG" FIELD CODCF - PROMPT 19 12 "" + PROMPT 37 10 "" USE LF_CLIFO - INPUT TIPOCF F_TIPOCF - INPUT CODCF F_CODCF + INPUT TIPOCF F_TIPOCF SELECT + INPUT CODCF F_CODCF DISPLAY "Codice " CODCF DISPLAY "Ragione sociale@50" RAGSOC OUTPUT F_CODCF CODCF -// OUTPUT F_CODCLI CODCF -// OUTPUT F_CODFOR CODCF OUTPUT F_RAGSOC RAGSOC CHECKTYPE NORMAL END -TEXT F_CODCLI -BEGIN - PROMPT 2 12 "Codice cliente " -END - -TEXT F_CODFOR -BEGIN - PROMPT 2 12 "Codice fornitore " -END - // esegue i controlli e ricopia i valori del codice sia in CLI che in FOR -STRING F_RAGSOC 50 40 +STRING F_RAGSOC 50 30 BEGIN - PROMPT 30 12 "" + PROMPT 48 12 "" USE LF_CLIFO KEY 2 INPUT TIPOCF F_TIPOCF SELECT INPUT RAGSOC F_RAGSOC @@ -216,11 +188,35 @@ BEGIN OUTPUT F_CODCF CODCF GROUP G_DEFMOV END + +LISTBOX F_TIPOCONDV 1 12 +BEGIN + FIELD TIPOCV + PROMPT 2 12 "Condizione di vendita " + ITEM " |Nessuna" + MESSAGE CLEAR,F_CATVEN + MESSAGE RESET,F_CODLIST|RESET,F_CODCONTR|RESET,F_CODOFF + MESSAGE HIDE,F_CODLIST|HIDE,F_CODCONTR|HIDE,F_CODOFF + ITEM "L|Listino" + MESSAGE ENABLE,F_CATVEN + MESSAGE SHOW,F_CODLIST|HIDE,F_CODCONTR|HIDE,F_CODOFF + MESSAGE RESET,F_CODCONTR|RESET,F_CODOFF + ITEM "C|Contratto" + MESSAGE CLEAR,F_CATVEN + MESSAGE HIDE,F_CODLIST|SHOW,F_CODCONTR|HIDE,F_CODOFF + MESSAGE RESET,F_CODLIST|RESET,F_CODOFF + ITEM "O|Offerta" + MESSAGE CLEAR,F_CATVEN + MESSAGE HIDE,F_CODLIST|HIDE,F_CODCONTR|SHOW,F_CODOFF + MESSAGE RESET,F_CODLIST|RESET,F_CODCONTR + +// GROUP G_DEFMOV +END STRING F_CATVEN 2 BEGIN FLAGS "DU" - PROMPT 2 13 "Cat.ven." + PROMPT 2 14 "Cat.ven." FIELD CATVEN USE CVE INPUT CODTAB F_CATVEN @@ -234,7 +230,7 @@ END STRING F_CODLIST 3 BEGIN FLAGS "U" - PROMPT 20 13 "Codice listino " + PROMPT 2 16 "Codice listino " FIELD CODCONDV USE LF_CONDV INPUT TIPO "L" @@ -254,7 +250,7 @@ END STRING F_CODCONTR 3 BEGIN FLAGS "U" - PROMPT 20 13 "Codice contratto " + PROMPT 2 16 "Codice contratto " FIELD CODCONDV USE LF_CONDV INPUT TIPO "C" @@ -277,7 +273,7 @@ END STRING F_CODOFF 3 BEGIN FLAGS "U" - PROMPT 20 13 "Codice offerta " + PROMPT 2 16 "Codice offerta " FIELD CODCONDV USE LF_CONDV INPUT TIPO "O" @@ -337,9 +333,9 @@ BEGIN GROUP G_DEFMOV END -SPREADSHEET F_RIGHE 77 12 +SPREADSHEET F_RIGHE BEGIN - PROMPT 2 7 "RIGHE DI MOVIMENTO" + PROMPT 0 7 "RIGHE DI MOVIMENTO" FLAGS "AI" //USE LF_RMOVMAG KEY NRIG //INPUT NUMREG F_NUMREG @@ -358,7 +354,8 @@ BEGIN ITEM "Causale" END - ENDPAGE + ENDMASK + #include "mg1100a.uml" diff --git a/mg/mg1100a.h b/mg/mg1100a.h index 88084c75d..158d7b127 100755 --- a/mg/mg1100a.h +++ b/mg/mg1100a.h @@ -12,6 +12,7 @@ #define F_QUANT 111 #define F_PREZZO 112 #define F_CAUSRIG 113 +#define F_ESPLOSA 120 // colonne non visibili dello Sheet #define F_DESMAG 150 @@ -22,4 +23,4 @@ #define F_VALORE 156 #define F_DESCAUSRIG 157 -#define G_NOAUTO 1 \ No newline at end of file +#define G_NOAUTO 1 diff --git a/mg/mg1100a.uml b/mg/mg1100a.uml index 555bb6c33..f0631f744 100755 --- a/mg/mg1100a.uml +++ b/mg/mg1100a.uml @@ -33,13 +33,15 @@ STRING F_CODART 20 BEGIN PROMPT 2 2 "Codice articolo " FIELD CODART - FLAGS "U" + FLAGS "UG" USE LF_ANAMAG + JOIN LF_UMART INTO CODART==CODART NRIGA==1 INPUT CODART F_CODART DISPLAY "Codice@20" CODART DISPLAY "Descrizione@50" DESCR OUTPUT F_CODART CODART OUTPUT F_DESART DESCR + OUTPUT F_UM LF_UMART->UM CHECKTYPE REQUIRED GROUP G_NOAUTO ADD RUN ve2 -3 @@ -50,6 +52,7 @@ BEGIN PROMPT 2 3 "Descrizione " FLAGS "U" USE LF_ANAMAG KEY 2 + JOIN LF_UMART INTO CODART==CODART NRIGA==1 INPUT DESCR F_DESART DISPLAY "Descrizione@50" DESCR DISPLAY "Codice@20" CODART @@ -75,6 +78,22 @@ BEGIN CHECKTYPE REQUIRED END +STRING F_DESMAG 50 +BEGIN + PROMPT 22 5 "" + USE MAG KEY 2 SELECT CODTAB[4,5]=="" + INPUT S0 F_DESMAG + DISPLAY "Denominazione mag.@50" S0 + DISPLAY "Cod. magazzino" CODTAB[1,3] + DISPLAY "Cod. deposito" CODTAB[4,5] + OUTPUT F_CODMAG CODTAB[1,3] + CHECKTYPE NORMAL + MESSAGE EMPTY CHECK,F_CODMAG +// GUIDO!!!!!!!!!!!!!!!!! in che ordine vengono eseguiti gli output +// a cascata??? perchè mi ritrovo il coddep cancellato??? +END + + STRING F_CODDEP 2 BEGIN PROMPT 2 6 "Deposito " @@ -94,22 +113,6 @@ BEGIN WARNING "Indicare il deposito" END -STRING F_DESMAG 50 -BEGIN - PROMPT 22 5 "" - USE MAG KEY 2 SELECT CODTAB[4,5]=="" - INPUT S0 F_DESMAG - DISPLAY "Denominazione mag.@50" S0 - DISPLAY "Cod. magazzino" CODTAB[1,3] - DISPLAY "Cod. deposito" CODTAB[4,5] - OUTPUT F_CODMAG CODTAB[1,3] - CHECKTYPE NORMAL - MESSAGE EMPTY CHECK,F_CODMAG -// GUIDO!!!!!!!!!!!!!!!!! in che ordine vengono eseguiti gli output -// a cascata??? perchè mi ritrovo il coddep cancellato??? -END - - STRING F_DESDEP 50 BEGIN PROMPT 22 6 "" @@ -135,7 +138,8 @@ BOOLEAN H_GESTGIA BEGIN PROMPT 1 1 "" FLAGS "HG" - MESSAGE TRUE ENABLE,F_CODDEP|CHECK,F_CODDEP|SHOW,F_DESDEP +// MESSAGE TRUE ENABLE,F_CODDEP|CHECK,F_CODDEP|SHOW,F_DESDEP + MESSAGE TRUE ENABLE,F_CODDEP|SHOW,F_DESDEP MESSAGE FALSE RESET,F_CODDEP|RESET,F_DESDEP|DISABLE,F_CODDEP|HIDE,F_DESDEP END @@ -262,6 +266,14 @@ BEGIN PROMPT 42 16 "" END +BOOL F_ESPLOSA +BEGIN + FLAGS "GH" + FIELD ESPLOSA + PROMPT 2 18 "" +END + + ENDPAGE ENDMASK diff --git a/mg/mg1200.cpp b/mg/mg1200.cpp index c4f6904aa..9aaafd10e 100755 --- a/mg/mg1200.cpp +++ b/mg/mg1200.cpp @@ -77,12 +77,7 @@ public: bool TApp_rebuildbalances::create() { - used_files= new TArray; - used_files->add(new TLocalisamfile(LF_ANAMAG)); - used_files->add(new TLocalisamfile(LF_UMART)); - used_files->add(new TLocalisamfile(LF_MAG)); - used_files->add(new TLocalisamfile(LF_MOVMAG)); - used_files->add(new TLocalisamfile(LF_RMOVMAG)); + open_files(LF_ANAMAG,LF_UMART,LF_MAG,LF_MOVMAG,LF_RMOVMAG,LF_TABCOM,LF_STOMAG,0); TSkeleton_application::create(); return TRUE; } @@ -106,8 +101,8 @@ void TApp_rebuildbalances::main_loop() TMask_buildmov m; while (m.run()==K_ENTER) { - if (!rebuild_balances(m.get(F_ANNOES)/*, TRUE*/)) - error_box("Ricostruzione saldi incompleta o errata. Ripetere"); + if (!rebuild_balances(m.get(F_ANNOES))) + warning_box("A causa degli errori riscontrati i saldi di magazzino \npotrebbero non essere stati del tutto aggiornati. \nProcedere ad una nuova operazione di ''Ricostruzione saldi''"); } } diff --git a/mg/mg1400.cpp b/mg/mg1400.cpp index 1b21b786c..87e996a76 100755 --- a/mg/mg1400.cpp +++ b/mg/mg1400.cpp @@ -112,16 +112,19 @@ bool TMask_openclose::handle_what(TMask_field &fld, KEY k) return TRUE; } + // Corrispondenza elementi di _movimenti: -/* elemento 0 : movimento con causale di rimanenze iniziali - elemento 1 : " " " In conto lav. - elemento 2 : " " " A conto lav. - elemento 3 : " " " In prod. fin. - elemento 4 : " " " In prod. comp. - elemento 5 : " " " Ordinato fornitori - elemento 6 : " " " Ordinato clienti - elemento 7 e successivi: tutte le righe in eccesso a MAX_ROWS -*/ +#define CAUS_A_RIMIN 0 // movimento con causale di rimanenze iniziali +#define CAUS_A_INCL 1 // " " " In conto lav. +#define CAUS_A_ACL 2 // " " " A conto lav. +#define CAUS_A_INPRF 3 // " " " In prod. fin. +#define CAUS_A_INPRC 4 // " " " In prod. comp. +#define CAUS_A_ORDF 5 // " " " Ordinato fornitori +#define CAUS_A_ORDC 6 // " " " Ordinato clienti +// elemento 7 e successivi: tutte le righe in eccesso a MAX_ROWS + + + class TApp_openclose : public TSkeleton_application { @@ -141,7 +144,8 @@ class TApp_openclose : public TSkeleton_application TDate _date_to_close; TDate _date_to_open; action _what; - TTipo_valorizz _calctype, _stotype; // Stotype sta per sto-cazzo + bool _valorizza_comp; + TTipo_valorizz _calctype,_stotype; // Stotype sta per sto-cazzo: valorizzazione per lo storico protected: virtual bool create(); @@ -157,6 +161,7 @@ public: virtual ~TApp_openclose() {}; }; + bool TApp_openclose::create() { _msk = new TMask_openclose(has_module(ORAUT)); @@ -169,6 +174,7 @@ bool TApp_openclose::create() return TSkeleton_application::create(); } + bool TApp_openclose::destroy() { delete _msk; @@ -181,6 +187,7 @@ bool TApp_openclose::destroy() return TSkeleton_application::destroy(); } + void TApp_openclose::compila_movimento(TMov_mag& currmov, TArticolo_giacenza& art, TRectype& rec, const int caus) { // Aggiorna la testata se il movimento e' nuovo (non ha righe) @@ -194,7 +201,8 @@ void TApp_openclose::compila_movimento(TMov_mag& currmov, TArticolo_giacenza& ar } // Aggiunge una nuova riga al movimento corrente - TString codmag(rec.get(MAG_CODMAG)); + TString codmagdep(rec.get(MAG_CODMAG)); + TString codmag(codmagdep);codmag.cut(3); TString codart(rec.get(MAG_CODART)); TString livello(rec.get(MAG_LIVELLO)); @@ -202,12 +210,16 @@ void TApp_openclose::compila_movimento(TMov_mag& currmov, TArticolo_giacenza& ar // switch sul tipo di causale per settare quantita' e prezzo: switch (caus) { - case 0: // Rimanenze iniziali + case CAUS_A_RIMIN: // Rimanenze iniziali { - qta = rec.get_real(MAG_GIAC) + rec.get_real(MAG_PRODFIN)-rec.get_real(MAG_PRODCOMP) - + rec.get_real(MAG_ACL) - rec.get_real(MAG_INCL); // ??corretta da AcL, IncL e InProdF ?? + qta = rec.get_real(MAG_GIAC) + rec.get_real(MAG_ACL) - rec.get_real(MAG_INCL); // ??corretta da AcL, IncL e InProdF ?? + if (!_valorizza_comp) + qta += rec.get_real(MAG_PRODFIN)-rec.get_real(MAG_PRODCOMP); switch (_calctype) { + case valorizz_costmediopond: + val = art.costo_mediopond(_es_to_close, codmag, livello); + break; case valorizz_costmedio: val = art.costo_medio(_es_to_close, codmag, livello); break; @@ -247,24 +259,24 @@ void TApp_openclose::compila_movimento(TMov_mag& currmov, TArticolo_giacenza& ar prezzo = val/qta; } break; - case 1: // In conto lav. + case CAUS_A_INCL: // In conto lav. qta = rec.get_real(MAG_INCL); break; - case 2: // A conto lav. + case CAUS_A_ACL: // A conto lav. qta = rec.get_real(MAG_ACL); break; - case 3: // In prod. fin. + case CAUS_A_INPRF: // In prod. fin. qta = rec.get_real(MAG_PRODFIN); break; - case 4: // In prod. com. + case CAUS_A_INPRC: // In prod. com. qta = rec.get_real(MAG_PRODCOMP); break; - case 5: // Ord. forn. + case CAUS_A_ORDF: // Ord. forn. qta = rec.get_real(MAG_ORDF); val = rec.get_real(MAG_VALORDF); prezzo = val/qta; break; - case 6: // Ord. cli. + case CAUS_A_ORDC: // Ord. cli. qta = rec.get_real(MAG_ORDC); val = rec.get_real(MAG_VALORDC); prezzo = val/qta; @@ -279,7 +291,7 @@ void TApp_openclose::compila_movimento(TMov_mag& currmov, TArticolo_giacenza& ar const int r = ums.first_row(); if (r > 0) riga.put(RMOVMAG_UM, (ums[r]).get(UMART_UM)); - riga.put(RMOVMAG_CODMAG, codmag); + riga.put(RMOVMAG_CODMAG, codmagdep); riga.put(RMOVMAG_CODART, codart); riga.put(RMOVMAG_LIVGIAC, livello); // La causale di riga va messa solo se e' diversa da quella di testata! @@ -288,25 +300,24 @@ void TApp_openclose::compila_movimento(TMov_mag& currmov, TArticolo_giacenza& ar } } + // Chiude l'esercizio selezionato (in base al flag lo fa provvisoriamente o definitivamente) // L'unica differenza sta nella creazione dei movimenti d'apertura nel caso di chiusura definitiva void TApp_openclose::chiudi_esercizio() { - TArticolo_giacenza artgiac; TRelation rel(LF_ANAMAG); TCursor cur(&rel); + rel.lfile().set_curr(new TArticolo_giacenza()); // setta il Multirec come current della relazione + TString descr1, descr2; int err = NOERR; TTable esc("ESC"); - rel.lfile().set_curr((TRectype*)&artgiac); - const long items = cur.items(); 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..."; - TProgind *prog = new TProgind(items, descr2, FALSE, TRUE, 10); // cose specifiche per chiusura definitiva... // Reperisce l'ultimo movimento di magazzino per il numero di registrazione @@ -315,6 +326,8 @@ void TApp_openclose::chiudi_esercizio() // Indici per i movimenti. Crea i movimenti di base (uno per ogni causale) int indici[7], last = 6; if (_what == definitiva) + { + for (int j=0; j < 7; j++) { _movimenti.add(new TMov_mag); @@ -324,10 +337,10 @@ void TApp_openclose::chiudi_esercizio() indici[j] = j; } - // Ciclo per i fottuti articoli - for (cur = 0L; cur.ok(); cur +=1) - { - if (_what == definitiva) + const long max_art = cur.items(); + TProgind *prog = new TProgind(max_art, descr2, FALSE, TRUE, 10); + // Ciclo per i fottuti articoli + for (cur = 0L; cur.ok(); cur +=1) { // Scorre i saldi del vecchio esercizio per questo TArticolo_giacenza // compilando un array di almeno 7 TMov_mag @@ -362,28 +375,14 @@ void TApp_openclose::chiudi_esercizio() compila_movimento(currmov, art, rec, i); } } + prog->addstatus(1L); } - else - { - // calcola il valore delle rimanenze finali dell'esercizio vecchio - // e riporta il record con l'anno esercizio nuovo. - ((TArticolo_giacenza&)cur.curr()).riporta_saldi(_es_to_close, _es_to_open, _calctype, _catven, _codlis); - } - // Aggiornamento storico.... - prog->addstatus(1L); - } - delete prog; - - // Vi sarebbe l'azzeramento saldi dell'esercizio nuovo, (in caso di chiusura definitiva) - // ma e' gia' fatta alla fine perche' dopo la ricostruzione movimenti l'esercizio vecchio - // e' marcato come chiuso. - - if (_what == definitiva) - { - // Scorre i movimenti generati ed effettua la scrittura - const int items = _movimenti.items(); - prog = new TProgind(items, "Scrittura movimenti in corso...",FALSE,TRUE,10); - for (int i=0; err == NOERR && iaddstatus(1L); TMov_mag& mov = (TMov_mag&) _movimenti[i]; @@ -394,6 +393,8 @@ void TApp_openclose::chiudi_esercizio() } delete prog; + // ************** + // chiude l'esercizio if (err == NOERR) { // Marca l'esercizio come chiuso @@ -414,10 +415,11 @@ void TApp_openclose::chiudi_esercizio() _movimenti.destroy(); } - // La ricostruzione dei saldi e' comune in entrambi i casi (definitiva o provvisoria) + // A questo punto l'esercizio vecchio e' marcato come chiuso in base al tipo di chiusura + // (definitiva o provvisoria); La ricostruzione dei saldi e' comune in entrambi i casi: // la rebuild_balances() deve sapere da sola se azzerare o meno le giacenze // a seconda che l'esercizio precedente sia chiuso (AZZERA) o no (NON AZZERARE). - rebuild_balances(_es_to_open); + rebuild_balances(_es_to_open, _calctype, _catven, _codlis); } @@ -450,6 +452,7 @@ void TApp_openclose::main_loop() _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); _catven = _msk->get(F_CATVEN); for (short xx = F_CAURIM; xx <= F_CAUORC; xx++) // legge le causali impostate @@ -458,6 +461,7 @@ void TApp_openclose::main_loop() } } + int mg1400(int argc, char* argv[]) { TApp_openclose a; diff --git a/mg/mg1400.h b/mg/mg1400.h index 52868b288..6e84e3d66 100755 --- a/mg/mg1400.h +++ b/mg/mg1400.h @@ -14,4 +14,5 @@ #define F_CATVEN 114 #define F_LIST 115 #define F_WHAT 116 +#define F_VALCOMP 117 diff --git a/mg/mg1400.uml b/mg/mg1400.uml index 46b8651ad..fdfe3c61f 100755 --- a/mg/mg1400.uml +++ b/mg/mg1400.uml @@ -1,6 +1,6 @@ #include "mg1400.h" -PAGE "Chiusura/Apertura esercizio" -1 -1 75 15 +PAGE "Chiusura/Apertura esercizio" -1 -1 75 17 RADIOBUTTON F_WHAT 20 BEGIN @@ -31,18 +31,19 @@ BEGIN FLAGS "DRZ" END -LISTBOX F_VALORIZZAZIONE 20 +LISTBOX F_VALORIZZAZIONE 30 BEGIN PROMPT 2 5 "Valorizzazione " - ITEM "0|Al costo medio" MESSAGE HIDE,2@|ENABLE,3@ - ITEM "1|All'ultimo costo" MESSAGE HIDE,2@|ENABLE,3@ - ITEM "2|Alla media dei costi" MESSAGE HIDE,2@|ENABLE,3@ - ITEM "3|Al prezzo di listino" MESSAGE SHOW,2@|ENABLE,3@ - ITEM "4|Al costo standard" MESSAGE HIDE,2@|ENABLE,3@ - ITEM "5|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 "7|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@|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 "6|L.I.F.O. annuale" MESSAGE HIDE,2@|DISABLE,3@|COPY,F_STOMET + ITEM "7|F.I.F.O. annuale" MESSAGE HIDE,2@|DISABLE,3@|COPY,F_STOMET + ITEM "8|L.I.F.O. storico" MESSAGE HIDE,2@|DISABLE,3@|COPY,F_STOMET + ITEM "9|F.I.F.O. storico" MESSAGE HIDE,2@|DISABLE,3@|COPY,F_STOMET /* TBI LIFO/FIFO ragionieristico ITEM "9|L.I.F.O. ragionieristico" MESSAGE HIDE,2@|DISABLE,3@|COPY,F_STOMET @@ -50,7 +51,7 @@ BEGIN */ END -LISTBOX F_STOMET 20 +LISTBOX F_STOMET 30 BEGIN PROMPT 2 6 "Storico " ITEM "5|L.I.F.O. annuale" @@ -118,6 +119,8 @@ BEGIN DISPLAY "Descrizione@50" S0 OUTPUT F_CAURIM CODTAB CHECKTYPE REQUIRED + WARNING "La causale deve avere i segni: GIAC+ RIMIN+" + ADD RUN MG0 -0 %CAU GROUP 4 END @@ -131,6 +134,8 @@ BEGIN DISPLAY "Descrizione@50" S0 OUTPUT F_CAUICL CODTAB CHECKTYPE REQUIRED + WARNING "La causale deve avere i segni: GIAC+, INCL+" + ADD RUN MG0 -0 %CAU GROUP 4 END @@ -144,6 +149,8 @@ BEGIN DISPLAY "Descrizione@50" S0 OUTPUT F_CAUACL CODTAB CHECKTYPE REQUIRED + WARNING "La causale deve avere i segni: GIAC-, ACL+" + ADD RUN MG0 -0 %CAU GROUP 4 END @@ -157,7 +164,9 @@ BEGIN DISPLAY "Descrizione@50" S0 OUTPUT F_CAUPRF CODTAB CHECKTYPE REQUIRED + WARNING "La causale deve avere i segni: GIAC-, PRODF+" GROUP 4 + ADD RUN MG0 -0 %CAU END STRING F_CAUPRC 5 @@ -170,7 +179,9 @@ BEGIN DISPLAY "Descrizione@50" S0 OUTPUT F_CAUPRC CODTAB CHECKTYPE REQUIRED + WARNING "La causale deve avere i segni: GIAC+, PRODC+" GROUP 4 + ADD RUN MG0 -0 %CAU END STRING F_CAUORF 5 @@ -183,7 +194,9 @@ BEGIN DISPLAY "Descrizione@50" S0 OUTPUT F_CAUORF CODTAB CHECKTYPE REQUIRED + WARNING "La causale deve avere il segno: ORDF+" GROUP 1 4 + ADD RUN MG0 -0 %CAU END STRING F_CAUORC 5 @@ -196,7 +209,17 @@ BEGIN DISPLAY "Descrizione@50" S0 OUTPUT F_CAUORC CODTAB CHECKTYPE REQUIRED + WARNING "La causale deve avere il segno: ORDC+" GROUP 1 4 + ADD RUN MG0 -0 %CAU +END + +LIST F_VALCOMP 40 +BEGIN + PROMPT 3 13 "Valorizzo " + ITEM "C|i componenti impegnati in produzione" + ITEM "F|i finiti in fase di produzione" + GROUP 4 END BUTTON DLG_OK 10 2 diff --git a/mg/mg3100.cpp b/mg/mg3100.cpp index 93c06a1df..15afd145d 100755 --- a/mg/mg3100.cpp +++ b/mg/mg3100.cpp @@ -79,7 +79,6 @@ TStampadatist_mask::TStampadatist_mask(): set_handler(F_TOLIVELLOART, handle_liv); set_handler(F_TOLIVELLOGIAC, handle_liv); set_handler(F_ORDINE, handle_ragg); - set_handler(F_DETTAGLIODEP, handle_ragg); set_handler(F_ORDINEART,handle_subord); if (!artlev().enabled()) { TMask_field &f1=field(F_RAGGCODICE); @@ -110,7 +109,7 @@ bool TStampadatist_mask::handle_subord(TMask_field &fld, KEY k) { fraggcod.enable();m.send_key(K_SPACE,F_RAGGCODICE); } else { - if (!m.get_bool(F_TOTALIDEPOSITI) || !m.get_bool(F_DETTAGLIODEP)) + if (!m.get_bool(F_DETTAGLIODEP)) { fraggcod.reset(); fraggcod.disable(); fragggiac.reset(); fragggiac.disable(); @@ -145,14 +144,14 @@ bool TStampadatist_mask::handle_liv(TMask_field &fld, KEY k) TOperable_field &ftotmag=(TOperable_field &)fld.mask().field(F_TOTALIMAGAZZINI); TOperable_field &fdettmag=(TOperable_field &)fld.mask().field(F_DETTAGLIOMAG); TOperable_field &fdettgiac=(TOperable_field &)fld.mask().field(F_RAGGLIVGIAC); + if (fld.mask().get_int(F_TOLIVELLOART)) + { + fdettgiac.reset(); + fdettgiac.disable(); + } else + fdettgiac.enable(); if (fld.mask().get(F_ORDINE)=="A") { - if (fld.mask().get_int(F_TOLIVELLOART)) - { - fdettgiac.reset(); - fdettgiac.disable(); - } else - fdettgiac.enable(); if (fld.mask().get_int(F_TOLIVELLOART) || fld.mask().get_int(F_TOLIVELLOGIAC)) { // raggruppamenti prima del dettaglio magazzini @@ -180,7 +179,7 @@ bool TStampadatist_mask::handle_ragg(TMask_field &fld, KEY k) if (fld.mask().get(F_ORDINE)=="M") { ftotmag.enable(); - if (!fld.mask().get_bool(F_TOTALIDEPOSITI) || !fld.mask().get_bool(F_DETTAGLIODEP)) + if (!fld.mask().get_bool(F_DETTAGLIODEP)) { fraggcod.reset(); fraggcod.disable(); fragggiac.reset(); fragggiac.disable(); @@ -306,8 +305,12 @@ void TStampa_datistorici::setprint_permagazzini() TRUE, _mask->get_bool(F_TOTALIDEPOSITI), _mask->get_bool(F_DETTAGLIODEP)); - _form->find_field('B',odd_page,FF_DIVDEPOSITI).enable(_mask->get_bool(F_TOTALIDEPOSITI)); + if (!_mask->get_bool(F_TOTALIDEPOSITI)) + { + ((TSorted_cursor *)_cur)->change_order("ANNOES|CODMAG[1,3]|CODART|LIVELLO"); + _form->find_field('B',odd_page,"GRUPPI_DEPOSITO").setcondition("CODMAG[1,3]",_strexpr); + } TString16 ena=((_mask->get_bool(F_STAMPAGIAC) && *_mask->get(F_FILTRO)!='S')? "1": "0"); _form->find_field('H',odd_page,FF_FLAGGIAC).set(ena ); _form->find_field('B',odd_page,FF_FLAGGIAC).set(ena); @@ -443,16 +446,21 @@ void TStampa_datistorici::setprint_perarticoli() case 'M': _cur->setkey(3); darec.put("GRMERC",_mask->get(F_DACATMER)); - darec.put("CODART",_mask->get(F_DAART)); arec.put("GRMERC",_mask->get(F_ACATMER)); - arec.put("CODART",_mask->get(F_AART)); _form->find_field('B',odd_page,"H_CATMER").show(); _form->find_field('B',odd_page,"TOT_CATMER").show(); _form->setcatmer(TRUE); + if (!_mask->get(F_DAART).blank()) + { srangea << "da \"" << _mask->get(F_DAART) << "\" "; + cfilter << "(CODART[1," << _mask->get(F_DAART).len() << "]>=" <<'"' << _mask->get(F_AART)<< "\")&&" ; + } if (!_mask->get(F_AART).blank()) + { srangea << "fino a \"" << _mask->get(F_AART) << "\""; + cfilter << "(CODART[1," << _mask->get(F_AART).len() << "]<=" <<'"' << _mask->get(F_AART)<< "\")&&" ; + } if (!_mask->get(F_DACATMER).blank()) srangecm << "da \"" << _mask->get(F_DACATMER) << "\" "; if (!_mask->get(F_ACATMER).blank()) @@ -492,7 +500,11 @@ void TStampa_datistorici::setprint_perarticoli() TSortedfile *mag; mag= new TSortedfile(LF_MAG,NULL,sortexp,filter,1); _cur->relation()->replace(mag,1,joinexp); - _cur->setfilter(cfilter); + if (cfilter.not_empty()) + { + cfilter.cut(cfilter.len()-2); + _cur->setfilter(cfilter); + } _cur->setregion(darec,arec); } diff --git a/mg/mg3100.uml b/mg/mg3100.uml index b02cdf935..35b9c528f 100755 --- a/mg/mg3100.uml +++ b/mg/mg3100.uml @@ -52,26 +52,26 @@ END LISTBOX F_ORDINE 10 BEGIN PROMPT 2 2 "Ordinamento " - ITEM "A|articoli" - MESSAGE ENABLE,F_ORDINEART|HIDE,F_TOTALIDEPOSITI|HIDE,F_DETTAGLIODEP - MESSAGE SHOW,F_TOTALIMAGAZZINI|SHOW,F_DETTAGLIOMAG - ITEM "M|magazzini" - MESSAGE "C",F_ORDINEART|K_SPACE,F_ORDINEART|DISABLE,F_ORDINEART|SHOW,G_CODART@|HIDE,G_DESART@ - MESSAGE SHOW,F_TOTALIDEPOSITI|SHOW,F_DETTAGLIODEP - MESSAGE HIDE,F_TOTALIMAGAZZINI|HIDE,F_DETTAGLIOMAG + ITEM "A|articoli" + MESSAGE ENABLE,F_ORDINEART|HIDE,F_TOTALIDEPOSITI|"X",F_DETTAGLIODEP + MESSAGE SHOW,F_TOTALIMAGAZZINI|SHOW,F_DETTAGLIOMAG + ITEM "M|magazzini" + MESSAGE "C",F_ORDINEART|K_SPACE,F_ORDINEART|DISABLE,F_ORDINEART|SHOW,G_CODART@|HIDE,G_DESART@ + MESSAGE SHOW,F_TOTALIDEPOSITI|"X",F_DETTAGLIODEP + MESSAGE HIDE,F_TOTALIMAGAZZINI|HIDE,F_DETTAGLIOMAG END LISTBOX F_ORDINEART 20 BEGIN - FLAGS "G" - PROMPT 34 2 "sotto-ordinamento " - ITEM "C|codice" - MESSAGE HIDE,G_CATMER@|ENABLE,G_CODART@|HIDE,G_DESART@ - ITEM "D|descrizione" - MESSAGE HIDE,G_CATMER@|DISABLE,G_CODART@|SHOW,G_DESART@ - ITEM "M|gruppo merc./codice" - MESSAGE SHOW,G_CATMER@|ENABLE,G_CODART@|HIDE,G_DESART@ + FLAGS "G" + PROMPT 34 2 "Sotto-ordinamento " + ITEM "C|codice" + MESSAGE HIDE,G_CATMER@|ENABLE,G_CODART@|HIDE,G_DESART@ + ITEM "D|descrizione" + MESSAGE HIDE,G_CATMER@|DISABLE,G_CODART@|SHOW,G_DESART@ + ITEM "M|gruppo merc./codice" + MESSAGE SHOW,G_CATMER@|ENABLE,G_CODART@|HIDE,G_DESART@ END NUMBER F_ANNOES 4 @@ -88,59 +88,63 @@ BEGIN ADD NONE END -LISTBOX F_FILTRO 20 +LISTBOX F_FILTRO 30 BEGIN - FLAGS "G" - PROMPT 45 3 "Filtro " - ITEM "T|tutto" - ITEM "S|sotto scorta" - ITEM "P|positivi" - ITEM "N|negativi" - ITEM "0|non nulli" + FLAGS "G" + PROMPT 34 3 "Stampo " + ITEM "0|solo giacenze non nulle" + ITEM "P|solo giacenze positive" + ITEM "N|solo giacenze negativie" + ITEM "S|solo articoli sotto scorta" + ITEM "T|tutto" END STRING F_DAART 20 BEGIN PROMPT 2 5 "Dall'articolo " - FLAGS "U" - USE LF_ANAMAG - INPUT CODART F_DAART - DISPLAY "Codice" CODART - DISPLAY "Descr@50" DESCR - OUTPUT F_DAART CODART - GROUP G_CODART + FLAGS "U" + USE LF_ANAMAG + INPUT CODART F_DAART + DISPLAY "Codice@20" CODART + DISPLAY "Descr@50" DESCR + OUTPUT F_DAART CODART + OUTPUT F_DADES DESCR + GROUP G_CODART END STRING F_AART 20 BEGIN PROMPT 2 6 " all'articolo " - FLAGS "U" - COPY USE F_DAART - INPUT CODART F_AART - COPY DISPLAY F_DAART - OUTPUT F_AART CODART - GROUP G_CODART + FLAGS "U" + COPY USE F_DAART + INPUT CODART F_AART + COPY DISPLAY F_DAART + OUTPUT F_AART CODART + OUTPUT F_ADES DESCR + GROUP G_CODART END STRING F_DADES 50 BEGIN PROMPT 2 5 "Dall'articolo " - FLAGS "U" - USE LF_ANAMAG KEY 2 - INPUT DESCR F_DADES - DISPLAY "Descr@50" DESCR - DISPLAY "Codice" CODART - OUTPUT F_DADES DESCR - GROUP G_DESART + FLAGS "U" + USE LF_ANAMAG KEY 2 + INPUT DESCR F_DADES + DISPLAY "Descr@50" DESCR + DISPLAY "Codice@20" CODART + OUTPUT F_DAART CODART + OUTPUT F_DADES DESCR + GROUP G_DESART END STRING F_ADES 50 BEGIN PROMPT 2 6 " all'articolo " - FLAGS "U" - COPY USE F_DADES - INPUT DESCR F_ADES - COPY DISPLAY F_DADES - OUTPUT F_ADES DESCR - GROUP G_DESART + FLAGS "U" + COPY USE F_DADES + INPUT DESCR F_ADES + COPY DISPLAY F_DADES + OUTPUT F_ADES DESCR + OUTPUT F_AART CODART + GROUP G_DESART END @@ -192,16 +196,17 @@ END BOOL F_TOTALIDEPOSITI BEGIN - PROMPT 2 13 "Stampo i totali depositi" - MESSAGE TRUE ENABLE,F_DETTAGLIODEP - MESSAGE FALSE "",F_DETTAGLIODEP|DISABLE,F_DETTAGLIODEP + PROMPT 2 13 "Suddivido per depositi" +// MESSAGE TRUE ENABLE,F_DETTAGLIODEP +// MESSAGE FALSE "",F_DETTAGLIODEP|DISABLE,F_DETTAGLIODEP END BOOL F_DETTAGLIODEP BEGIN - PROMPT 42 13 "Stampa il dettaglio depositi" - MESSAGE TRUE ENABLE,F_RAGGLIVGIAC|ENABLE,F_RAGGCODICE - MESSAGE FALSE CLEAR,F_RAGGLIVGIAC|K_SPACE,F_RAGGLIVGIAC|CLEAR,F_RAGGCODICE|K_SPACE,F_RAGGCODICE + FLAGS "HD" + PROMPT 42 13 "Dettaglio i depositi" + MESSAGE TRUE ENABLE,F_RAGGLIVGIAC|ENABLE,F_RAGGCODICE + MESSAGE FALSE CLEAR,F_RAGGLIVGIAC|K_SPACE,F_RAGGLIVGIAC|CLEAR,F_RAGGCODICE|K_SPACE,F_RAGGCODICE FLAGS "D" END diff --git a/mg/mg3100a.frm b/mg/mg3100a.frm index 48d8113fa..60b34c08b 100755 --- a/mg/mg3100a.frm +++ b/mg/mg3100a.frm @@ -141,7 +141,7 @@ END STRINGA 7 40 BEGIN KEY "H1" - PROMPT 31 6 "Descrizione" + PROMPT 23 6 "Descrizione" END STRINGA 7 40 BEGIN @@ -151,7 +151,7 @@ END STRINGA 8 12 BEGIN KEY "H1" - PROMPT 68 6 "Giac." + PROMPT 64 6 "Giac." GROUP FG_RIGAPREZZI END STRINGA 8 12 @@ -294,7 +294,7 @@ SECTION BODY ODD 0 COLUMNWISE STRINGA 11 20 1 BEGIN KEY "Codice CATMER" - PROMPT 2 1 "Cat. merc." + PROMPT 2 1 "Gruppo merc. " MESSAGE _USER,CODCATMER|COPY,1551 END STRINGA 12 70 1 @@ -329,7 +329,7 @@ SECTION BODY ODD 0 COLUMNWISE PROMPT 2 1 "" MESSAGE _USER,CODGRUPPOART,1|COPY,1451 END - STRINGA 17 30 2 + STRINGA 17 70 BEGIN KEY "CODICE GRUPPO" PROMPT 3 1 "" @@ -352,7 +352,7 @@ SECTION BODY ODD 0 COLUMNWISE PROMPT 2 1 "" MESSAGE _USER,CODGRUPPOART,2|COPY,1351 END - STRINGA 17 30 2 + STRINGA 17 70 BEGIN KEY "CODICE GRUPPO" PROMPT 3 1 "" @@ -376,7 +376,7 @@ SECTION BODY ODD 0 COLUMNWISE PROMPT 2 1 "" MESSAGE _USER,CODGRUPPOART,3|COPY,1251 END - STRINGA 17 30 2 + STRINGA 17 70 BEGIN KEY "CODICE GRUPPO" PROMPT 3 1 "" @@ -399,7 +399,7 @@ SECTION BODY ODD 0 COLUMNWISE PROMPT 2 1 "" MESSAGE _USER,CODGRUPPOART,4|COPY,1151 END - STRINGA 17 30 2 + STRINGA 17 70 BEGIN KEY "CODICE GRUPPO" PROMPT 3 1 "" @@ -422,7 +422,7 @@ SECTION BODY ODD 0 COLUMNWISE PROMPT 2 1 "" MESSAGE _USER,CODGRUPPOART,5|COPY,1051 END - STRINGA 17 30 2 + STRINGA 17 70 BEGIN KEY "CODICE GRUPPO" PROMPT 3 1 "" @@ -445,7 +445,7 @@ SECTION BODY ODD 0 COLUMNWISE PROMPT 2 1 "" MESSAGE _USER,CODGRUPPOART,6|COPY,951 END - STRINGA 17 30 2 + STRINGA 17 70 BEGIN KEY "CODICE GRUPPO" PROMPT 3 1 "" @@ -468,7 +468,7 @@ SECTION BODY ODD 0 COLUMNWISE PROMPT 2 1 "" MESSAGE _USER,CODGRUPPOART,7|COPY,851 END - STRINGA 17 30 2 + STRINGA 17 70 BEGIN KEY "CODICE GRUPPO" PROMPT 3 1 "" @@ -492,7 +492,7 @@ SECTION BODY ODD 0 COLUMNWISE PROMPT 2 1 "" MESSAGE _USER,CODGRUPPOART,8|COPY,751 END - STRINGA 17 30 2 + STRINGA 17 70 BEGIN KEY "CODICE GRUPPO" PROMPT 3 1 "" @@ -516,7 +516,7 @@ SECTION BODY ODD 0 COLUMNWISE FIELD CODART MESSAGE COPY,651 END - STRINGA 21 30 2 + STRINGA 21 70 BEGIN KEY "DESCR.articolo" PROMPT 3 1 "" @@ -913,7 +913,7 @@ SECTION BODY ODD 0 COLUMNWISE KEY "Livello giac4" PROMPT 2 1 "" END - STRINGA 250 30 2 + STRINGA 250 30 BEGIN PROMPT 3 1 "" END @@ -1015,7 +1015,7 @@ SECTION BODY ODD 0 COLUMNWISE KEY "" PROMPT 2 1 "" END - STRINGA 350 30 2 + STRINGA 350 30 BEGIN KEY "" PROMPT 3 1 "" @@ -1118,7 +1118,7 @@ SECTION BODY ODD 0 COLUMNWISE KEY "" PROMPT 2 1 "" END - STRINGA 450 30 2 + STRINGA 450 30 BEGIN KEY "" PROMPT 3 1 "" @@ -1219,7 +1219,7 @@ SECTION BODY ODD 0 COLUMNWISE KEY "" PROMPT 2 1 "" END - STRINGA 550 30 2 + STRINGA 550 30 BEGIN KEY "" PROMPT 3 1 "" @@ -1322,7 +1322,7 @@ SECTION BODY ODD 0 COLUMNWISE KEY "" PROMPT 2 1 "" END - STRINGA 650 30 2 + STRINGA 650 30 BEGIN KEY "" PROMPT 3 1 "" @@ -2241,13 +2241,13 @@ SECTION BODY ODD 0 COLUMNWISE END // GRUPPI_CATMER - SECTION TOT_CATMER 1 1 1 FOOTER - STRINGA 1551 20 1 + SECTION TOT_CATMER 1 1 2 GROUP + STRINGA 1551 20 BEGIN KEY "" - PROMPT 2 1 "" + PROMPT 2 1 "Totale gr.merc." END - STRINGA 1550 30 1 + STRINGA 1550 30 BEGIN KEY "" PROMPT 3 1 "" diff --git a/mg/mg3100aa.frm b/mg/mg3100aa.frm index edf4dd7e6..ef2a9c2e2 100755 --- a/mg/mg3100aa.frm +++ b/mg/mg3100aa.frm @@ -151,7 +151,7 @@ END STRINGA 8 12 BEGIN KEY "H1" - PROMPT 68 6 "Giac." + PROMPT 64 6 "Giac." GROUP FG_RIGAPREZZI END STRINGA 8 12 @@ -294,7 +294,7 @@ SECTION BODY ODD 0 COLUMNWISE STRINGA 11 20 1 BEGIN KEY "Codice CATMER" - PROMPT 2 1 "Cat. merc." + PROMPT 2 1 "Gruppo merc. " MESSAGE _USER,CODCATMER|COPY,1551 END STRINGA 12 70 1 @@ -329,7 +329,7 @@ SECTION BODY ODD 0 COLUMNWISE PROMPT 2 1 "" MESSAGE _USER,CODGRUPPOART,1|COPY,1451 END - STRINGA 17 30 2 + STRINGA 17 70 BEGIN KEY "CODICE GRUPPO" PROMPT 3 1 "" @@ -352,7 +352,7 @@ SECTION BODY ODD 0 COLUMNWISE PROMPT 2 1 "" MESSAGE _USER,CODGRUPPOART,2|COPY,1351 END - STRINGA 17 30 2 + STRINGA 17 70 BEGIN KEY "CODICE GRUPPO" PROMPT 3 1 "" @@ -376,7 +376,7 @@ SECTION BODY ODD 0 COLUMNWISE PROMPT 2 1 "" MESSAGE _USER,CODGRUPPOART,3|COPY,1251 END - STRINGA 17 30 2 + STRINGA 17 70 BEGIN KEY "CODICE GRUPPO" PROMPT 3 1 "" @@ -399,7 +399,7 @@ SECTION BODY ODD 0 COLUMNWISE PROMPT 2 1 "" MESSAGE _USER,CODGRUPPOART,4|COPY,1151 END - STRINGA 17 30 2 + STRINGA 17 70 BEGIN KEY "CODICE GRUPPO" PROMPT 3 1 "" @@ -422,7 +422,7 @@ SECTION BODY ODD 0 COLUMNWISE PROMPT 2 1 "" MESSAGE _USER,CODGRUPPOART,5|COPY,1051 END - STRINGA 17 30 2 + STRINGA 17 70 BEGIN KEY "CODICE GRUPPO" PROMPT 3 1 "" @@ -445,7 +445,7 @@ SECTION BODY ODD 0 COLUMNWISE PROMPT 2 1 "" MESSAGE _USER,CODGRUPPOART,6|COPY,951 END - STRINGA 17 30 2 + STRINGA 17 70 BEGIN KEY "CODICE GRUPPO" PROMPT 3 1 "" @@ -468,7 +468,7 @@ SECTION BODY ODD 0 COLUMNWISE PROMPT 2 1 "" MESSAGE _USER,CODGRUPPOART,7|COPY,851 END - STRINGA 17 30 2 + STRINGA 17 70 BEGIN KEY "CODICE GRUPPO" PROMPT 3 1 "" @@ -492,7 +492,7 @@ SECTION BODY ODD 0 COLUMNWISE PROMPT 2 1 "" MESSAGE _USER,CODGRUPPOART,8|COPY,751 END - STRINGA 17 30 2 + STRINGA 17 70 BEGIN KEY "CODICE GRUPPO" PROMPT 3 1 "" @@ -516,7 +516,7 @@ SECTION BODY ODD 0 COLUMNWISE FIELD CODART MESSAGE COPY,651 END - STRINGA 21 30 2 + STRINGA 21 70 BEGIN KEY "DESCR.articolo" PROMPT 3 1 "" @@ -913,7 +913,7 @@ SECTION BODY ODD 0 COLUMNWISE KEY "Livello giac4" PROMPT 2 1 "" END - STRINGA 250 30 2 + STRINGA 250 30 BEGIN PROMPT 3 1 "" END @@ -1015,7 +1015,7 @@ SECTION BODY ODD 0 COLUMNWISE KEY "" PROMPT 2 1 "" END - STRINGA 350 30 2 + STRINGA 350 30 BEGIN KEY "" PROMPT 3 1 "" @@ -1118,7 +1118,7 @@ SECTION BODY ODD 0 COLUMNWISE KEY "" PROMPT 2 1 "" END - STRINGA 450 30 2 + STRINGA 450 30 BEGIN KEY "" PROMPT 3 1 "" @@ -1219,7 +1219,7 @@ SECTION BODY ODD 0 COLUMNWISE KEY "" PROMPT 2 1 "" END - STRINGA 550 30 2 + STRINGA 550 30 BEGIN KEY "" PROMPT 3 1 "" @@ -1322,7 +1322,7 @@ SECTION BODY ODD 0 COLUMNWISE KEY "" PROMPT 2 1 "" END - STRINGA 650 30 2 + STRINGA 650 30 BEGIN KEY "" PROMPT 3 1 "" @@ -2241,13 +2241,13 @@ SECTION BODY ODD 0 COLUMNWISE END // GRUPPI_CATMER - SECTION TOT_CATMER 1 1 1 group - STRINGA 1551 20 1 + SECTION TOT_CATMER 1 1 2 GROUP + STRINGA 1551 20 BEGIN KEY "" - PROMPT 2 1 "" + PROMPT 2 1 "Totale gr.merc." END - STRINGA 1550 30 1 + STRINGA 1550 30 BEGIN KEY "" PROMPT 3 1 "" diff --git a/mg/mg3100b.frm b/mg/mg3100b.frm index 1d01d2bd5..e24578b94 100755 --- a/mg/mg3100b.frm +++ b/mg/mg3100b.frm @@ -1,15 +1,15 @@ #include "mg3frm.h" -USE 109 KEY 2 -JOIN 47 TO 109 INTO CODART==CODART -JOIN MAG TO 109 ALIAS 500 INTO CODTAB==CODMAG[1,3] -JOIN MAG TO 109 ALIAS 501 INTO CODTAB==CODMAG -JOIN 49 TO 47 INTO CODART==CODART +USE LF_MAG KEY 2 BY ANNOES CODMAG CODART LIVELLO +JOIN LF_ANAMAG TO LF_MAG INTO CODART==CODART +JOIN MAG TO LF_MAG ALIAS 500 INTO CODTAB==CODMAG[1,3] +JOIN MAG TO LF_MAG ALIAS 501 INTO CODTAB==CODMAG +JOIN LF_UMART TO LF_ANAMAG INTO CODART==CODART END DESCRIPTION BEGIN 47->* "Anagrafica articoli" - 109->* "Archivio Giacenze" + LF_MAG->* "Archivio Giacenze" MAG->* "Tabella magazzini" 49->* "Unità di misura articoli" END @@ -298,7 +298,7 @@ SECTION BODY ODD 0 COLUMNWISE END END - SECTION GRUPPI_MAGAZZINO 1 0 0 FILE 109 GROUP CODMAG[1,3] + SECTION GRUPPI_MAGAZZINO 1 0 0 FILE LF_MAG GROUP CODMAG[1,3] LIST FF_DIVDEPOSITI BEGIN FLAGS "H" @@ -321,7 +321,7 @@ SECTION BODY ODD 0 COLUMNWISE STRINGA 60 20 1 BEGIN KEY "CODDEP" - PROMPT 2 1 "Deposito " + PROMPT 2 1 "Deposito " FIELD 501@->CODTAB[4,5] MESSAGE COPY,51 END @@ -334,7 +334,7 @@ SECTION BODY ODD 0 COLUMNWISE END END - SECTION GRUPPI_DEPOSITO 1 0 0 FILE 109 GROUP CODMAG[1,5] + SECTION GRUPPI_DEPOSITO 1 0 0 FILE LF_MAG GROUP CODMAG[1,5] STRINGA 60 40 1 BEGIN FLAGS "H" @@ -349,7 +349,7 @@ SECTION BODY ODD 0 COLUMNWISE PROMPT 2 1 "" MESSAGE _USER,CODGRUPPOART,1|COPY,1451 END - STRINGA 17 30 2 + STRINGA 17 70 BEGIN KEY "CODICE GRUPPO1" PROMPT 3 1 "" @@ -357,7 +357,7 @@ SECTION BODY ODD 0 COLUMNWISE END END - SECTION GRUPPI_CODART1 1 0 0 FILE 109 GROUP CODART + SECTION GRUPPI_CODART1 1 0 0 FILE LF_MAG GROUP CODART STRINGA 60 20 1 BEGIN FLAGS "H" @@ -372,7 +372,7 @@ SECTION BODY ODD 0 COLUMNWISE PROMPT 2 1 "" MESSAGE _USER,CODGRUPPOART,2|COPY,1351 END - STRINGA 17 30 2 + STRINGA 17 70 BEGIN KEY "CODICE GRUPPO" PROMPT 3 1 "" @@ -380,7 +380,7 @@ SECTION BODY ODD 0 COLUMNWISE END END - SECTION GRUPPI_CODART2 1 0 0 FILE 109 GROUP CODART + SECTION GRUPPI_CODART2 1 0 0 FILE LF_MAG GROUP CODART STRINGA 60 20 1 BEGIN FLAGS "H" @@ -395,7 +395,7 @@ SECTION BODY ODD 0 COLUMNWISE PROMPT 2 1 "" MESSAGE _USER,CODGRUPPOART,3|COPY,1251 END - STRINGA 17 30 2 + STRINGA 17 70 BEGIN KEY "CODICE GRUPPO" PROMPT 3 1 "" @@ -403,7 +403,7 @@ SECTION BODY ODD 0 COLUMNWISE END END - SECTION GRUPPI_CODART3 1 0 0 FILE 109 GROUP CODART + SECTION GRUPPI_CODART3 1 0 0 FILE LF_MAG GROUP CODART STRINGA 60 20 1 BEGIN FLAGS "H" @@ -418,7 +418,7 @@ SECTION BODY ODD 0 COLUMNWISE PROMPT 2 1 "" MESSAGE _USER,CODGRUPPOART,4|COPY,1151 END - STRINGA 17 30 2 + STRINGA 17 70 BEGIN KEY "CODICE GRUPPO" PROMPT 3 1 "" @@ -426,7 +426,7 @@ SECTION BODY ODD 0 COLUMNWISE END END - SECTION GRUPPI_CODART4 1 0 0 FILE 109 GROUP CODART + SECTION GRUPPI_CODART4 1 0 0 FILE LF_MAG GROUP CODART STRINGA 60 20 1 BEGIN FLAGS "H" @@ -441,7 +441,7 @@ SECTION BODY ODD 0 COLUMNWISE PROMPT 2 1 "" MESSAGE _USER,CODGRUPPOART,5|COPY,1051 END - STRINGA 17 30 2 + STRINGA 17 70 BEGIN KEY "CODICE GRUPPO" PROMPT 3 1 "" @@ -449,7 +449,7 @@ SECTION BODY ODD 0 COLUMNWISE END END - SECTION GRUPPI_CODART5 1 0 0 FILE 109 GROUP CODART + SECTION GRUPPI_CODART5 1 0 0 FILE LF_MAG GROUP CODART STRINGA 60 20 1 BEGIN FLAGS "H" @@ -464,7 +464,7 @@ SECTION BODY ODD 0 COLUMNWISE PROMPT 2 1 "" MESSAGE _USER,CODGRUPPOART,6|COPY,951 END - STRINGA 17 30 2 + STRINGA 17 70 BEGIN KEY "CODICE GRUPPO" PROMPT 3 1 "" @@ -472,7 +472,7 @@ SECTION BODY ODD 0 COLUMNWISE END END - SECTION GRUPPI_CODART6 1 0 0 FILE 109 GROUP CODART + SECTION GRUPPI_CODART6 1 0 0 FILE LF_MAG GROUP CODART STRINGA 60 20 1 BEGIN FLAGS "H" @@ -487,7 +487,7 @@ SECTION BODY ODD 0 COLUMNWISE PROMPT 2 1 "" MESSAGE _USER,CODGRUPPOART,7|COPY,851 END - STRINGA 17 30 2 + STRINGA 17 70 BEGIN KEY "CODICE GRUPPO" PROMPT 3 1 "" @@ -495,7 +495,7 @@ SECTION BODY ODD 0 COLUMNWISE END END - SECTION GRUPPI_CODART7 1 0 0 FILE 109 GROUP CODART + SECTION GRUPPI_CODART7 1 0 0 FILE LF_MAG GROUP CODART STRINGA 60 20 1 BEGIN FLAGS "H" @@ -511,7 +511,7 @@ SECTION BODY ODD 0 COLUMNWISE PROMPT 2 1 "" MESSAGE _USER,CODGRUPPOART,8|COPY,751 END - STRINGA 17 30 2 + STRINGA 17 70 BEGIN KEY "CODICE GRUPPO" PROMPT 3 1 "" @@ -519,7 +519,7 @@ SECTION BODY ODD 0 COLUMNWISE END END - SECTION GRUPPI_CODART8 1 0 0 FILE 109 GROUP CODART + SECTION GRUPPI_CODART8 1 0 0 FILE LF_MAG GROUP CODART STRINGA 60 20 1 BEGIN FLAGS "H" @@ -535,11 +535,11 @@ SECTION BODY ODD 0 COLUMNWISE FIELD CODART MESSAGE COPY,651 END - STRINGA 21 30 2 + STRINGA 21 70 BEGIN KEY "DESCR.articolo" PROMPT 3 1 "" - FIELD 47->DESCR + FIELD LF_ANAMAG->DESCR MESSAGE COPY,650 END NUMERO 22 12 @@ -559,7 +559,7 @@ SECTION BODY ODD 0 COLUMNWISE END END - SECTION ARTICOLO 1 0 0 FILE 109 GROUP CODART + SECTION ARTICOLO 1 0 0 FILE LF_MAG GROUP CODART STRINGA 60 20 1 BEGIN FLAGS "H" @@ -582,7 +582,7 @@ SECTION BODY ODD 0 COLUMNWISE END END - SECTION GRUPPI_LIVGIAC1 1 0 0 FILE 109 GROUP LIVELLO + SECTION GRUPPI_LIVGIAC1 1 0 0 FILE LF_MAG GROUP LIVELLO STRINGA 60 20 1 BEGIN FLAGS "H" @@ -605,7 +605,7 @@ SECTION BODY ODD 0 COLUMNWISE END END - SECTION GRUPPI_LIVGIAC2 1 0 0 FILE 109 GROUP LIVELLO + SECTION GRUPPI_LIVGIAC2 1 0 0 FILE LF_MAG GROUP LIVELLO STRINGA 60 20 1 BEGIN FLAGS "H" @@ -629,7 +629,7 @@ SECTION BODY ODD 0 COLUMNWISE END END - SECTION GRUPPI_LIVGIAC3 1 0 0 FILE 109 GROUP LIVELLO + SECTION GRUPPI_LIVGIAC3 1 0 0 FILE LF_MAG GROUP LIVELLO STRINGA 60 20 1 BEGIN FLAGS "H" @@ -640,11 +640,12 @@ SECTION BODY ODD 0 COLUMNWISE SECTION H_GLIVGIAC4 1 1 1 GROUP END // GGIAC4 - SECTION GRUPPI_LIVGIAC4 1 0 0 FILE 109 GROUP LIVELLO + SECTION GRUPPI_LIVGIAC4 1 0 0 STR_EXPR LIVELLO + // SEZIONE PRESENTE SOLO PER UNIFORMIT… CON LA STAMPA PER ARTICOLI END // GGIAC4 SECTION TOT_GLIVGIAC4 1 1 1 GROUP - STRINGA 250 35 2 - BEGIN + STRINGA 250 30 + BEGIN PROMPT 3 1 "" MESSAGE _USER,GRUPPOGIAC,4 END @@ -658,26 +659,26 @@ SECTION BODY ODD 0 COLUMNWISE BEGIN KEY "UM" PROMPT 5 1 "" - FIELD 49->UM - MESSAGE COPY,353 - END - - NUMERO 241 12 - BEGIN - KEY "ACQ" + FIELD LF_UMART->UM + MESSAGE COPY,353 + END + + NUMERO 241 12 + BEGIN + KEY "ACQ" PROMPT 6 1 "" - PICTURE "########,@#" - MESSAGE ADD,341 - FIELD 109->ACQ + PICTURE "########,@#" + MESSAGE ADD,341 + FIELD LF_MAG->ACQ GROUP FG_RIGAVALORI END NUMERO 242 12 BEGIN KEY "VALACQ" PROMPT 7 1 "" - PICTURE "###.###.##@" - MESSAGE ADD,342 - FIELD 109->VALACQ + PICTURE "###.###.##@" + MESSAGE ADD,342 + FIELD LF_MAG->VALACQ GROUP FG_VALORI FG_RIGAVALORI END NUMERO 282 12 @@ -693,9 +694,9 @@ SECTION BODY ODD 0 COLUMNWISE BEGIN KEY "ven" PROMPT 8 1 "" - PICTURE "########,@#" - MESSAGE ADD,343 - FIELD 109->VEN + PICTURE "########,@#" + MESSAGE ADD,343 + FIELD LF_MAG->VEN GROUP FG_RIGAVALORI END NUMERO 244 12 @@ -705,11 +706,11 @@ SECTION BODY ODD 0 COLUMNWISE PICTURE "###.###.##@" MESSAGE ADD,344 GROUP FG_VALORI FG_RIGAVALORI - FIELD 109->VALVEN - END - NUMERO 284 12 - BEGIN - KEY "VALven" + FIELD LF_MAG->VALVEN + END + NUMERO 284 12 + BEGIN + KEY "VALven" PROMPT 9 1 "" PICTURE "#######,@##" MESSAGE _NUMEXPR,#244/#243 @@ -721,17 +722,17 @@ SECTION BODY ODD 0 COLUMNWISE KEY "rim" PROMPT 10 1 "" PICTURE "########,@#" - MESSAGE ADD,345 - FIELD 109->RIM + MESSAGE ADD,345 + FIELD LF_MAG->RIM GROUP FG_RIGAVALORI END NUMERO 246 12 BEGIN KEY "VALrim" PROMPT 11 1 "" - PICTURE "###.###.##@" - MESSAGE ADD,346 - FIELD 109->VALRIM + PICTURE "###.###.##@" + MESSAGE ADD,346 + FIELD LF_MAG->VALRIM GROUP FG_VALORI FG_RIGAVALORI END NUMERO 286 12 @@ -748,8 +749,8 @@ SECTION BODY ODD 0 COLUMNWISE KEY "giac" PROMPT 12 1 "" PICTURE "########,@#" - FIELD 109->GIAC - MESSAGE ADD,347 + FIELD LF_MAG->GIAC + MESSAGE ADD,347 GROUP FG_RIGAVALORI END NUMERO 248 12 @@ -757,23 +758,23 @@ SECTION BODY ODD 0 COLUMNWISE KEY "scorta-giac" PROMPT 12 1 "" PICTURE "#######@,@#" - MESSAGE _NUMEXPR,109->SCORTAMIN-109->GIAC|ADD,347 + MESSAGE _NUMEXPR,LF_MAG->SCORTAMIN-LF_MAG->GIAC|ADD,347 GROUP FG_RIGAVALORI END /*NUMERO 249 12 BEGIN KEY "giac" PROMPT 6 1 "" - PICTURE "########,@#" - FIELD 109->GIAC - MESSAGE ADD,341 - GROUP 2 FG_RIGAPREZZI + PICTURE "########,@#" + FIELD LF_MAG->GIAC + MESSAGE ADD,341 + GROUP 2 FG_RIGAPREZZI END*/ END // tot ggiac4 END // GGIAC3 SECTION TOT_GLIVGIAC3 1 1 1 GROUP - STRINGA 350 35 2 + STRINGA 350 30 BEGIN KEY "" PROMPT 3 1 "" @@ -876,7 +877,7 @@ SECTION BODY ODD 0 COLUMNWISE END // GGIAC2 SECTION TOT_GLIVGIAC2 1 1 1 GROUP - STRINGA 450 35 2 + STRINGA 450 30 BEGIN KEY "" PROMPT 3 1 "" @@ -978,7 +979,7 @@ SECTION BODY ODD 0 COLUMNWISE END // tot ggiac2 END // GGIAC1 SECTION TOT_GLIVGIAC1 1 1 1 GROUP - STRINGA 550 35 2 + STRINGA 550 30 BEGIN KEY "" PROMPT 3 1 "" @@ -1081,7 +1082,7 @@ SECTION BODY ODD 0 COLUMNWISE END // FILE GIACENZE SECTION TOT_ARTICOLO 1 1 1 GROUP - STRINGA 650 30 2 + STRINGA 650 30 BEGIN KEY "" PROMPT 3 1 "" @@ -2133,7 +2134,7 @@ SECTION BODY ODD 0 COLUMNWISE PROMPT 6 1 "-------------------------------------------------------------------------------------------------" END END - STRINGA 150 30 2 + STRINGA 150 30 BEGIN KEY "Magazzino" PROMPT 3 1 "" diff --git a/mg/mg3200.cpp b/mg/mg3200.cpp index f570caeea..e9df717fc 100755 --- a/mg/mg3200.cpp +++ b/mg/mg3200.cpp @@ -52,7 +52,7 @@ bool TStampadisp_mask::handle_subord(TMask_field &fld, KEY k) if (fld.mask().get(F_ORDINE)=="A") fraggcod.enable(); else { - if (!fld.mask().get_bool(F_TOTALIDEPOSITI) || !fld.mask().get_bool(F_DETTAGLIODEP)) + if (!fld.mask().get_bool(F_DETTAGLIODEP)) { fraggcod.reset(); fraggcod.disable(); fragggiac.reset(); fragggiac.disable(); @@ -108,7 +108,7 @@ bool TStampadisp_mask::handle_ragg(TMask_field &fld, KEY k) if (m.get(F_ORDINE)=="M") { ftotmag.enable(); - if (!m.get_bool(F_TOTALIDEPOSITI) || !m.get_bool(F_DETTAGLIODEP)) + if (!m.get_bool(F_DETTAGLIODEP)) { fraggcod.reset(); fraggcod.disable(); fragggiac.reset(); fragggiac.disable(); @@ -177,16 +177,32 @@ void TStampa_disp::setprint_permagazzini() TRectype darec(LF_MAG),arec(LF_MAG); TString cfilter,sortexp,joinexp; _form = new TForm_stampemg("mg3200b", ""); - _cur = _form->cursor(); + _cur = _form->cursor(); + TSorted_cursor & cur= (TSorted_cursor & )*_cur; + // ******************** + // range di stampa articoli // setta il filtro sul cursore + TForm_item & rangea=_form->find_field('H',odd_page,FF_RANGEARTIC); + TString srangea; + if (*_mask->get(F_DAART)) + { cfilter << "(CODART[1," << _mask->get(F_DAART).len() << "]>=" <<'"' << _mask->get(F_DAART)<< "\")&&" ; + srangea << "da \"" << _mask->get(F_DAART) << "\" "; + } if (*_mask->get(F_AART)) + { cfilter << "(CODART[1," << _mask->get(F_AART).len() << "]<=" <<'"' << _mask->get(F_AART)<< "\")&&" ; + srangea << "fino a \"" << _mask->get(F_AART) << "\""; + } if (cfilter.not_empty()) cfilter.cut(cfilter.len()-2); - // abilita/disabilita le sezioni dei totali + rangea.set(srangea.empty() ? "Tutti gli articoli" : format("Articoli %s",(const char *)srangea)); + // *************** + // gestione dei livelli di raggruppamento e di detaglio + // (abilita/disabilita le sezioni dei totali/header) + _form->setdett_permag( _mask->get_bool(F_RAGGCODICE), _mask->get_int(F_FROMLIVELLOART), @@ -198,12 +214,28 @@ void TStampa_disp::setprint_permagazzini() _mask->get_bool(F_TOTALIDEPOSITI), _mask->get_bool(F_DETTAGLIODEP)); + if (!_mask->get_bool(F_TOTALIDEPOSITI)) + { + cur.change_order("ANNOES|CODMAG[1,3]|CODART|LIVELLO"); + _form->find_field('B',odd_page,"GRUPPI_DEPOSITO").setcondition("CODMAG[1,3]",_strexpr); + } + // ******************** + // range di stampa magazzini + TForm_item & rangem=_form->find_field('H',odd_page,FF_RANGEMAGAZ); + TString srangem; + darec.put("ANNOES",_mask->get(F_ANNOES)); - darec.put("CODMAG",_mask->get(F_DAMAG)); arec.put("ANNOES",_mask->get(F_ANNOES)); + darec.put("CODMAG",_mask->get(F_DAMAG)); arec.put("CODMAG",_mask->get(F_AMAG)); - _cur->setfilter(cfilter); - _cur->setregion(darec,arec); + if (*_mask->get(F_DAMAG)) + srangem << "da \"" << _mask->get(F_DAMAG) << "\" "; + if (*_mask->get(F_AMAG)) + srangem << "fino a \"" << _mask->get(F_AMAG) << "\" "; + rangem.set(srangem.empty() ? "Tutti i magazzini" : format("Magazzini %s",(const char *)srangem)); + + cur.setfilter(cfilter); + cur.setregion(darec,arec); } // ORDINAMENTO @@ -279,16 +311,20 @@ void TStampa_disp::setprint_perarticoli() case 'M': _cur->setkey(3); darec.put("GRMERC",_mask->get(F_DACATMER)); - darec.put("CODART",_mask->get(F_DAART)); arec.put("GRMERC",_mask->get(F_ACATMER)); - arec.put("CODART",_mask->get(F_AART)); _form->find_field('B',odd_page,"H_CATMER").show(); _form->find_field('B',odd_page,"TOT_CATMER").show(); _form->setcatmer(TRUE); if (!_mask->get(F_DAART).blank()) + { srangea << "da \"" << _mask->get(F_DAART) << "\" "; + cfilter << "(CODART[1," << _mask->get(F_DAART).len() << "]>=" <<'"' << _mask->get(F_AART)<< "\")&&" ; + } if (!_mask->get(F_AART).blank()) + { srangea << "fino a \"" << _mask->get(F_AART) << "\""; + cfilter << "(CODART[1," << _mask->get(F_AART).len() << "]<=" <<'"' << _mask->get(F_AART)<< "\")&&" ; + } if (!_mask->get(F_DACATMER).blank()) srangecm << "da \"" << _mask->get(F_DACATMER) << "\" "; if (!_mask->get(F_ACATMER).blank()) @@ -314,7 +350,11 @@ void TStampa_disp::setprint_perarticoli() TSortedfile *mag; mag= new TSortedfile(LF_MAG,NULL,sortexp,filter,1); _cur->relation()->replace(mag,1,joinexp); - _cur->setfilter(cfilter); + if (cfilter.not_empty()) + { + cfilter.cut(cfilter.len()-2); + _cur->setfilter(cfilter); + } _cur->setregion(darec,arec); } diff --git a/mg/mg3200.frm b/mg/mg3200.frm index 1899e4920..7b24b837d 100755 --- a/mg/mg3200.frm +++ b/mg/mg3200.frm @@ -19,11 +19,11 @@ END GENERAL BEGIN OFFSET 0 0 - FONT "Courier New" - SIZE 8 - CARATTERE "X" - INIZIALE 5 2 - FINALE 133 +// FONT "Courier New" +// SIZE 8 +// CARATTERE "X" +// INIZIALE 5 2 +// FINALE 133 END SECTION HEADER ODD 5 diff --git a/mg/mg3200.uml b/mg/mg3200.uml index 87884719e..9626859ca 100755 --- a/mg/mg3200.uml +++ b/mg/mg3200.uml @@ -5,11 +5,11 @@ LISTBOX F_ORDINE 10 BEGIN PROMPT 2 1 "Ordinamento " ITEM "A|articoli" - MESSAGE ENABLE,F_ORDINEART|HIDE,F_TOTALIDEPOSITI|HIDE,F_DETTAGLIODEP + MESSAGE ENABLE,F_ORDINEART|HIDE,F_TOTALIDEPOSITI|"X",F_DETTAGLIODEP MESSAGE SHOW,F_TOTALIMAGAZZINI|SHOW,F_DETTAGLIOMAG ITEM "M|magazzini" MESSAGE "C",F_ORDINEART|K_SPACE,F_ORDINEART|DISABLE,F_ORDINEART|SHOW,G_CODART@|HIDE,G_DESART@ - MESSAGE SHOW,F_TOTALIDEPOSITI|SHOW,F_DETTAGLIODEP + MESSAGE SHOW,F_TOTALIDEPOSITI|"X",F_DETTAGLIODEP MESSAGE HIDE,F_TOTALIMAGAZZINI|HIDE,F_DETTAGLIOMAG END @@ -49,6 +49,7 @@ BEGIN DISPLAY "Codice" CODART DISPLAY "Descr@50" DESCR OUTPUT F_DAART CODART + OUTPUT F_DADES DESCR GROUP G_CODART END @@ -60,6 +61,7 @@ BEGIN INPUT CODART F_AART COPY DISPLAY F_DAART OUTPUT F_AART CODART + OUTPUT F_ADES DESCR GROUP G_CODART END @@ -72,6 +74,7 @@ BEGIN DISPLAY "Descr@50" DESCR DISPLAY "Codice" CODART OUTPUT F_DADES DESCR + OUTPUT F_DAART CODART GROUP G_DESART END @@ -83,6 +86,7 @@ BEGIN INPUT DESCR F_ADES COPY DISPLAY F_DADES OUTPUT F_ADES DESCR + OUTPUT F_AART CODART GROUP G_DESART END @@ -133,15 +137,16 @@ END BOOL F_TOTALIDEPOSITI BEGIN - PROMPT 2 12 "Stampo i totali depositi" - MESSAGE TRUE ENABLE,F_DETTAGLIODEP - MESSAGE FALSE CLEAR,F_DETTAGLIODEP|K_SPACE,F_DETTAGLIODEP + PROMPT 2 12 "Suddivido per depositi" +// MESSAGE TRUE ENABLE,F_DETTAGLIODEP +// MESSAGE FALSE CLEAR,F_DETTAGLIODEP|K_SPACE,F_DETTAGLIODEP END BOOL F_DETTAGLIODEP BEGIN - PROMPT 42 12 "Stampa il dettaglio depositi" - MESSAGE TRUE ENABLE,F_RAGGLIVGIAC|ENABLE,F_RAGGCODICE + FLAGS "DH" + PROMPT 42 12 "Dettaglio i depositi" + MESSAGE TRUE ENABLE,F_RAGGLIVGIAC|ENABLE,F_RAGGCODICE MESSAGE FALSE CLEAR,F_RAGGLIVGIAC|K_SPACE,F_RAGGLIVGIAC|CLEAR,F_RAGGCODICE|K_SPACE,F_RAGGCODICE END diff --git a/mg/mg3200a.frm b/mg/mg3200a.frm index fb345a3fa..12f4ed3ce 100755 --- a/mg/mg3200a.frm +++ b/mg/mg3200a.frm @@ -57,19 +57,19 @@ BEGIN PROMPT 55 2 "Stampa disponibilita'" END -STRINGA FF_RANGEARTIC 40 +STRINGA FF_RANGEARTIC 120 BEGIN KEY "RANGE" PROMPT 1 3 "" END -STRINGA FF_RANGEMAGAZ 40 +STRINGA FF_RANGEMAGAZ 70 BEGIN KEY "RANGE" PROMPT 1 4 "" END -STRINGA FF_RANGECATMER 40 +STRINGA FF_RANGECATMER 70 BEGIN KEY "RANGE" PROMPT 55 4 "" @@ -148,14 +148,14 @@ END SECTION BODY ODD 0 COLUMNWISE - SECTION H_CATMER 1 1 2 HEADER + SECTION H_CATMER 1 2 1 GROUP STRINGA 11 20 1 BEGIN KEY "CATMER" - PROMPT 2 1 "" + PROMPT 2 1 "Gruppo merc. " MESSAGE _USER,CODCATMER|COPY,1551 END - STRINGA 12 30 2 + STRINGA 12 70 BEGIN KEY "CODICE CATMER" PROMPT 3 1 "" @@ -187,7 +187,7 @@ SECTION BODY ODD 0 COLUMNWISE PROMPT 2 1 "" MESSAGE _USER,CODGRUPPOART,1|COPY,1451 END - STRINGA 17 30 2 + STRINGA 17 70 BEGIN KEY "CODICE GRUPPO" PROMPT 3 1 "" @@ -210,7 +210,7 @@ SECTION BODY ODD 0 COLUMNWISE PROMPT 2 1 "" MESSAGE _USER,CODGRUPPOART,2|COPY,1351 END - STRINGA 17 30 2 + STRINGA 17 70 BEGIN KEY "CODICE GRUPPO" PROMPT 3 1 "" @@ -233,7 +233,7 @@ SECTION BODY ODD 0 COLUMNWISE PROMPT 2 1 "" MESSAGE _USER,CODGRUPPOART,3|COPY,1251 END - STRINGA 17 30 2 + STRINGA 17 70 BEGIN KEY "CODICE GRUPPO" PROMPT 3 1 "" @@ -256,7 +256,7 @@ SECTION BODY ODD 0 COLUMNWISE PROMPT 2 1 "" MESSAGE _USER,CODGRUPPOART,4|COPY,1151 END - STRINGA 17 30 2 + STRINGA 17 70 BEGIN KEY "CODICE GRUPPO" PROMPT 3 1 "" @@ -279,7 +279,7 @@ SECTION BODY ODD 0 COLUMNWISE PROMPT 2 1 "" MESSAGE _USER,CODGRUPPOART,5|COPY,1051 END - STRINGA 17 30 2 + STRINGA 17 70 BEGIN KEY "CODICE GRUPPO" PROMPT 3 1 "" @@ -302,7 +302,7 @@ SECTION BODY ODD 0 COLUMNWISE PROMPT 2 1 "" MESSAGE _USER,CODGRUPPOART,6|COPY,951 END - STRINGA 17 30 2 + STRINGA 17 70 BEGIN KEY "CODICE GRUPPO" PROMPT 3 1 "" @@ -325,7 +325,7 @@ SECTION BODY ODD 0 COLUMNWISE PROMPT 2 1 "" MESSAGE _USER,CODGRUPPOART,7|COPY,851 END - STRINGA 17 30 2 + STRINGA 17 70 BEGIN KEY "CODICE GRUPPO" PROMPT 3 1 "" @@ -349,7 +349,7 @@ SECTION BODY ODD 0 COLUMNWISE PROMPT 2 1 "" MESSAGE _USER,CODGRUPPOART,8|COPY,751 END - STRINGA 17 30 2 + STRINGA 17 70 BEGIN KEY "CODICE GRUPPO" PROMPT 3 1 "" @@ -373,7 +373,7 @@ SECTION BODY ODD 0 COLUMNWISE FIELD CODART MESSAGE COPY,651 END - STRINGA 21 30 2 + STRINGA 21 70 BEGIN KEY "DESCR.articolo" PROMPT 3 1 "" @@ -477,15 +477,23 @@ SECTION BODY ODD 0 COLUMNWISE END SECTION GRUPPI_LIVGIAC4 1 0 0 FILE LF_MAG GROUP CODART - STRINGA 60 20 + STRINGA 60 70 + BEGIN + FLAGS "H" + KEY "MAGAZZ" + PROMPT 3 1 "" + FIELD 500@->s0 + MESSAGE RESET,1@|COPY,150 + END + STRINGA 60 30 BEGIN FLAGS "H" KEY "MAGAZZ" PROMPT 2 1 "" - FIELD 500@->s0 - MESSAGE RESET,1@|COPY,150 + FIELD 500@->CODTAB[1,3] + MESSAGE COPY,151 END - SECTION H_MAGAZZINO 1 1 1 HEADER + SECTION H_MAGAZZINO 1 0 0 GROUP SECTION H_MAGAZZINO_NODEP 1 0 0 STR_EXPR 500@->B0!="X" // DIVISIONE IN DEPOSITI STRINGA 60 20 BEGIN @@ -498,21 +506,28 @@ SECTION BODY ODD 0 COLUMNWISE STRINGA 60 20 BEGIN KEY "codice magazzino" - FIELD 500@->s0 - PROMPT 2 1 " Magazzino " + FIELD 500@->CODTAB[1,3] + PROMPT 2 1 " Magazzino " MESSAGE SHOW,TOT_DEPOSITO END + STRINGA 60 70 + BEGIN + KEY "magazzino" + FIELD 500@->s0 + PROMPT 3 1 "" + END END END SECTION GRUPPI_MAGAZZINO 1 0 0 FILE LF_MAG GROUP CODMAG[1,3] - SECTION H_DEPOSITO 1 0 0 HEADER + SECTION H_DEPOSITO 1 0 0 GROUP END SECTION TOT_DEPOSITO 1 1 1 GROUP STRINGA 51 20 BEGIN KEY "CODICE" - PROMPT 2 1 " Deposito" + PROMPT 2 1 " Deposito " + FIELD 501@->CODTAB[4,5] END STRINGA 52 30 BEGIN @@ -607,7 +622,7 @@ SECTION BODY ODD 0 COLUMNWISE STRINGA 151 20 BEGIN KEY "Magazzino" - PROMPT 2 1 " Totale mag." + PROMPT 2 1 " Totale mag. " END STRINGA 153 3 BEGIN @@ -683,7 +698,7 @@ SECTION BODY ODD 0 COLUMNWISE END // GGIAC4 SECTION TOT_GLIVGIAC4 1 1 1 GROUP - STRINGA 250 30 2 + STRINGA 250 30 BEGIN PROMPT 3 1 "" END @@ -766,7 +781,7 @@ SECTION BODY ODD 0 COLUMNWISE END // GGIAC3 SECTION TOT_GLIVGIAC3 1 1 1 GROUP - STRINGA 350 30 2 + STRINGA 350 30 BEGIN KEY "" PROMPT 3 1 "" @@ -850,7 +865,7 @@ SECTION BODY ODD 0 COLUMNWISE END // GGIAC2 SECTION TOT_GLIVGIAC2 1 1 1 GROUP - STRINGA 450 30 2 + STRINGA 450 30 BEGIN KEY "" PROMPT 3 1 "" @@ -933,7 +948,7 @@ SECTION BODY ODD 0 COLUMNWISE END // tot ggiac2 END // GGIAC1 SECTION TOT_GLIVGIAC1 1 1 1 GROUP - STRINGA 550 30 2 + STRINGA 550 30 BEGIN KEY "" PROMPT 3 1 "" @@ -1016,8 +1031,8 @@ SECTION BODY ODD 0 COLUMNWISE END // tot ggiac1 END // FILE GIACENZE - SECTION TOT_ARTICOLO 1 1 1 FOOTER - STRINGA 650 30 2 + SECTION TOT_ARTICOLO 1 1 1 GROUP // FOOTER + STRINGA 650 30 BEGIN KEY "" PROMPT 3 1 "" @@ -1102,8 +1117,8 @@ SECTION BODY ODD 0 COLUMNWISE END // TOT ART END // GART8 - SECTION TOT_GART8 1 1 1 FOOTER - STRINGA 750 30 2 + SECTION TOT_GART8 1 1 1 GROUP // FOOTER + STRINGA 750 30 BEGIN KEY "" PROMPT 3 1 "" @@ -1186,8 +1201,8 @@ SECTION BODY ODD 0 COLUMNWISE END // tot gart8 END // GART7 - SECTION TOT_GART7 1 1 1 FOOTER - STRINGA 850 30 2 + SECTION TOT_GART7 1 1 1 GROUP // FOOTER + STRINGA 850 30 BEGIN KEY "" PROMPT 3 1 "" @@ -1270,8 +1285,8 @@ SECTION BODY ODD 0 COLUMNWISE END // tot gart7 END // GART6 - SECTION TOT_GART6 1 1 1 FOOTER - STRINGA 950 30 2 + SECTION TOT_GART6 1 1 1 GROUP // FOOTER + STRINGA 950 30 BEGIN KEY "" PROMPT 3 1 "" @@ -1354,8 +1369,8 @@ SECTION BODY ODD 0 COLUMNWISE END // tot gart6 END // GART5 - SECTION TOT_GART5 1 1 1 FOOTER - STRINGA 1050 30 2 + SECTION TOT_GART5 1 1 1 GROUP // FOOTER + STRINGA 1050 30 BEGIN KEY "" PROMPT 3 1 "" @@ -1438,8 +1453,8 @@ SECTION BODY ODD 0 COLUMNWISE END // tot gart5 END // GART4 - SECTION TOT_GART4 1 1 1 FOOTER - STRINGA 1150 30 2 + SECTION TOT_GART4 1 1 1 GROUP // FOOTER + STRINGA 1150 30 BEGIN KEY "" PROMPT 3 1 "" @@ -1522,8 +1537,8 @@ SECTION BODY ODD 0 COLUMNWISE END // tot gart4 END // GART3 - SECTION TOT_GART3 1 1 1 FOOTER - STRINGA 1250 30 2 + SECTION TOT_GART3 1 1 1 GROUP // FOOTER + STRINGA 1250 30 BEGIN KEY "" PROMPT 3 1 "" @@ -1606,8 +1621,8 @@ SECTION BODY ODD 0 COLUMNWISE END // tot gart3 END // GART2 - SECTION TOT_GART2 1 1 1 FOOTER - STRINGA 1350 30 2 + SECTION TOT_GART2 1 1 1 GROUP // FOOTER + STRINGA 1350 30 BEGIN KEY "" PROMPT 3 1 "" @@ -1690,8 +1705,8 @@ SECTION BODY ODD 0 COLUMNWISE END // tot gart2 END // GART1 - SECTION TOT_GART1 1 1 1 FOOTER - STRINGA 1450 30 2 + SECTION TOT_GART1 1 1 1 GROUP // FOOTER + STRINGA 1450 30 BEGIN KEY "" PROMPT 3 1 "" @@ -1774,16 +1789,16 @@ SECTION BODY ODD 0 COLUMNWISE END // tot gart1 END // GRUPPI_CATMER - SECTION TOT_CATMER 1 1 1 FOOTER - STRINGA 1550 30 2 - BEGIN - KEY "" - PROMPT 3 1 "" - END + SECTION TOT_CATMER 1 1 2 GROUP // FOOTER STRINGA 1551 20 BEGIN KEY "" - PROMPT 2 1 "" + PROMPT 2 1 "Totale gr.merc." + END + STRINGA 1550 30 + BEGIN + KEY "" + PROMPT 3 1 "" END STRINGA 1553 3 BEGIN diff --git a/mg/mg3200b.frm b/mg/mg3200b.frm index 43d61a723..a42899d46 100755 --- a/mg/mg3200b.frm +++ b/mg/mg3200b.frm @@ -1,5 +1,5 @@ #include "mg3frm.h" -USE LF_MAG KEY 2 +USE LF_MAG KEY 2 BY ANNOES CODMAG CODART LIVELLO JOIN LF_ANAMAG TO LF_MAG INTO CODART==CODART JOIN MAG TO LF_MAG ALIAS 500 INTO CODTAB==CODMAG[1,3] JOIN MAG TO LF_MAG ALIAS 501 INTO CODTAB==CODMAG @@ -25,7 +25,7 @@ SECTION GRAPHIC BEGIN END -SECTION HEADER ODD 5 +SECTION HEADER ODD 7 STRINGA 1 40 1 BEGIN @@ -54,73 +54,86 @@ BEGIN PROMPT 55 2 "Stampa disponibilita'" END -STRINGA 5 146 +STRINGA FF_RANGEARTIC 120 BEGIN - KEY "Separatore (iniziale)" - PROMPT 1 3 "------------------------------------------------------------------------------------------------------------------------------------------------------" + KEY "RANGE" + PROMPT 1 3 "" END - STRINGA 6 20 - BEGIN - KEY "H1" - PROMPT 2 4 "Codice" - END - STRINGA 7 40 - BEGIN - KEY "H1" - PROMPT 24 4 "Descrizione" - END - STRINGA 7 40 - BEGIN - KEY "H1" - PROMPT 45 4 "UM" - END - STRINGA 8 12 - BEGIN - KEY "H1" - PROMPT 55 4 "Giac." - END - STRINGA 9 12 - BEGIN - KEY "H1" - PROMPT 67 4 "Ord.F." - END - STRINGA 10 12 - BEGIN - KEY "H1" - PROMPT 79 4 "Ord.C." - END - STRINGA 11 12 - BEGIN - KEY "H1" - PROMPT 91 4 "A c.lav." - END - STRINGA 12 12 - BEGIN - KEY "H1" - PROMPT 103 4 "In c.lav." - END - STRINGA 13 12 - BEGIN - KEY "H1" - PROMPT 116 4 "Prod.F." - END - STRINGA 14 12 - BEGIN - KEY "H1" - PROMPT 128 4 "Prod.C." - END - STRINGA 15 12 - BEGIN - KEY "H1" - PROMPT 139 4 "Disp." - END +STRINGA FF_RANGEMAGAZ 70 +BEGIN + KEY "RANGE" + PROMPT 1 4 "" +END - STRINGA 17 146 - BEGIN - KEY "Separatore (iniziale)" - PROMPT 1 5 "------------------------------------------------------------------------------------------------------------------------------------------------------" - END + +STRINGA 5 151 +BEGIN + KEY "Separatore (iniziale)" + PROMPT 1 5 "-----------------------------------------------------------------------------------------------------------------------------------------------------------" +END + + STRINGA 6 20 + BEGIN + KEY "H1" + PROMPT 2 6 "Codice" + END + STRINGA 7 40 + BEGIN + KEY "H1" + PROMPT 23 6 "Descrizione" + END + STRINGA 7 40 + BEGIN + KEY "H1" + PROMPT 54 6 "UM" + END + STRINGA 8 12 + BEGIN + KEY "H1" + PROMPT 63 6 "Giac." + END + STRINGA 9 12 + BEGIN + KEY "H1" + PROMPT 74 6 "Ord.F." + END + STRINGA 10 12 + BEGIN + KEY "H1" + PROMPT 86 6 "Ord.C." + END + STRINGA 11 12 + BEGIN + KEY "H1" + PROMPT 96 6 "A c.lav." + END + STRINGA 12 12 + BEGIN + KEY "H1" + PROMPT 107 6 "In c.lav." + END + STRINGA 13 12 + BEGIN + KEY "H1" + PROMPT 121 6 "Prod.F." + END + STRINGA 14 12 + BEGIN + KEY "H1" + PROMPT 133 6 "Prod.C." + END + STRINGA 15 12 + BEGIN + KEY "H1" + PROMPT 147 6 "Disp." + END + + STRINGA 17 151 + BEGIN + KEY "Separatore (iniziale)" + PROMPT 1 7 "-----------------------------------------------------------------------------------------------------------------------------------------------------------" + END END @@ -137,7 +150,7 @@ SECTION BODY ODD 0 COLUMNWISE STRINGA 60 20 1 BEGIN KEY "codice magazzino" - PROMPT 2 1 "Magazzino " + PROMPT 2 1 "Magazzino " FIELD 500@->CODTAB MESSAGE COPY,151 END @@ -173,7 +186,7 @@ SECTION BODY ODD 0 COLUMNWISE STRINGA 60 20 1 BEGIN KEY "codice dep" - PROMPT 2 1 "Deposito " + PROMPT 2 1 "Deposito " FIELD 501@->CODTAB[4,5] MESSAGE COPY,51 END @@ -186,7 +199,7 @@ SECTION BODY ODD 0 COLUMNWISE END END - SECTION GRUPPI_DEPOSITO 1 0 0 FILE LF_MAG GROUP CODMAG[1,5] + SECTION GRUPPI_DEPOSITO 1 0 0 FILE LF_MAG GROUP CODMAG[1,5] STRINGA 60 40 1 BEGIN FLAGS "H" @@ -469,7 +482,8 @@ SECTION BODY ODD 0 COLUMNWISE SECTION GRUPPI_LIVGIAC3 1 0 0 FILE LF_MAG GROUP LIVELLO SECTION H_GLIVGIAC4 1 1 1 GROUP END - SECTION GRUPPI_LIVGIAC4 1 0 0 FILE LF_MAG GROUP LIVELLO + SECTION GRUPPI_LIVGIAC4 1 0 0 STR_EXPR LIVELLO + // SEZIONE PRESENTE SOLO PER UNIFORMIT… CON LA STAMPA PER ARTICOLI END SECTION TOT_GLIVGIAC4 1 1 1 GROUP @@ -1577,13 +1591,13 @@ SECTION BODY ODD 0 COLUMNWISE STRINGA 77 BEGIN KEY "giac" - PROMPT 52 1 "----------------------------------------------------------------------------------------------------" + PROMPT 52 1 "---------------------------------------------------------------------------------------------------------" END END STRINGA 51 20 BEGIN KEY "CODICE" - PROMPT 2 1 "Totale dep." + PROMPT 2 1 "Totale dep. " END STRINGA 50 30 BEGIN @@ -1635,6 +1649,7 @@ SECTION BODY ODD 0 COLUMNWISE PROMPT 10 1 "" PICTURE "########,@#" MESSAGE _USER,VALIDATE_UM,53|ADD,145 + GROUP 15 END NUMERO 46 11 BEGIN @@ -1668,7 +1683,7 @@ SECTION BODY ODD 0 COLUMNWISE STRINGA 77 BEGIN KEY "giac" - PROMPT 50 1 "----------------------------------------------------------------------------------------------------" + PROMPT 50 1 "---------------------------------------------------------------------------------------------------------" END END STRINGA 150 30 1 @@ -1679,7 +1694,7 @@ SECTION BODY ODD 0 COLUMNWISE STRINGA 151 20 1 BEGIN KEY "Magazzino" - PROMPT 2 1 "Totale mag." + PROMPT 2 1 "Totale mag. " END STRINGA 153 3 BEGIN diff --git a/mg/mg3300.cpp b/mg/mg3300.cpp index 8783dca27..61860b565 100755 --- a/mg/mg3300.cpp +++ b/mg/mg3300.cpp @@ -217,10 +217,10 @@ void TForm_schedemag::setdett_permag(bool sudd_dep,bool show_dett,int livart,int { *_rmov_raggcond << "+CODMAG[4,5]"; _rmov_sortexp->add("CODMAG[4,5]"); - if (show_dett) - { - ragg_exprs(livart,livgiac); - } + } + if (show_dett) + { + ragg_exprs(livart,livgiac); } TForm_subsection &s=(TForm_subsection &)find_field('B',odd_page,"GRUPPI_RMOVMAG"); diff --git a/mg/mg3300.uml b/mg/mg3300.uml index b9e1676d9..afc89d93a 100755 --- a/mg/mg3300.uml +++ b/mg/mg3300.uml @@ -18,11 +18,11 @@ BEGIN PROMPT 2 2 "Ordinamento " ITEM "A|articoli" MESSAGE ENABLE,F_ORDINEART - MESSAGE HIDE,F_DETTAGLIOMAG|HIDE,F_DETTAGLIODEP + MESSAGE HIDE,F_DETTAGLIOMAG|"X",F_DETTAGLIODEP MESSAGE SHOW,F_SUDDIV_MAGAZZINI|SHOW,F_SUDDIV_DEPOSITI ITEM "M|magazzini" MESSAGE "C",F_ORDINEART|K_SPACE,F_ORDINEART|DISABLE,F_ORDINEART|SHOW,G_CODART@|HIDE,G_DESART@ - MESSAGE SHOW,F_DETTAGLIOMAG|SHOW,F_DETTAGLIODEP + MESSAGE SHOW,F_DETTAGLIOMAG|"X",F_DETTAGLIODEP MESSAGE HIDE,F_SUDDIV_MAGAZZINI|HIDE,F_SUDDIV_DEPOSITI END @@ -174,15 +174,15 @@ END BOOL F_DETTAGLIOMAG BEGIN - PROMPT 2 11 "Suddivido per depositi" - MESSAGE TRUE ENABLE,F_DETTAGLIODEP - MESSAGE FALSE CLEAR,F_DETTAGLIODEP + PROMPT 2 12 "Suddivido per depositi" +// MESSAGE TRUE ENABLE,F_DETTAGLIODEP +// MESSAGE FALSE CLEAR,F_DETTAGLIODEP END BOOL F_DETTAGLIODEP BEGIN - FLAGS "D" - PROMPT 2 12 "Dettaglio i depositi" + FLAGS "DH" + PROMPT 42 12 "Dettaglio i depositi" END diff --git a/mg/mg3300b.frm b/mg/mg3300b.frm index 781b89678..b1f9f23d7 100755 --- a/mg/mg3300b.frm +++ b/mg/mg3300b.frm @@ -120,21 +120,34 @@ SECTION BODY ODD 2 SECTION HEADER_MAG 1 2 2 GROUP FLAGS "N" - STRINGA 22 50 1 + STRINGA 22 20 1 BEGIN KEY "mag" PROMPT 1 1 "Magazzino " + FIELD 500@->CODTAB[1,3] + END + STRINGA 22 50 1 + BEGIN + KEY "mag" + PROMPT 15 1 "" FIELD 500@->S0 END SECTION HEADER_DEP 2 0 0 GROUP SECTION HEADER_DEP_VERO 1 1 1 STR_EXPR 500@->B0=="X" - STRINGA 23 50 1 + STRINGA 23 20 1 BEGIN KEY "dep" PROMPT 3 1 "Deposito " + FIELD 501@->CODTAB[4,5] + END + STRINGA 23 50 1 + BEGIN + KEY "dep" + PROMPT 15 1 "" FIELD 501@->S0 END END + END // HEADER deposito SECTION HEADER_ARTICOLO 2 1 1 GROUP STRINGA 10 20 1 BEGIN @@ -164,7 +177,6 @@ SECTION BODY ODD 2 END END // HEADER livgiac END //HEADER articolo - END // HEADER deposito STRINGA 24 50 1 BEGIN KEY "dep" diff --git a/mg/mg3500.frm b/mg/mg3500.frm index 74afc4fbc..cf6044529 100755 --- a/mg/mg3500.frm +++ b/mg/mg3500.frm @@ -1,9 +1,7 @@ -#define LF_UMART2 349 #define LF_TAB_MAG 500 USE LF_ANAMAG KEY 1 JOIN LF_STOMAG TO LF_ANAMAG INTO ANNOESRIF==1996 CODART==CODART JOIN LF_UMART TO LF_ANAMAG INTO CODART==CODART -JOIN LF_UMART TO LF_STOMAG KEY 2 ALIAS LF_UMART2 INTO CODART==CODART UM==UM JOIN MAG TO LF_STOMAG ALIAS LF_TAB_MAG INTO CODTAB==CODMAG[1,3] END @@ -18,7 +16,7 @@ END GENERAL BEGIN OFFSET 0 1 - FONT "Courier New" +// FONT "Courier New" // SIZE 10 END @@ -65,25 +63,26 @@ END END -SECTION BODY ODD 1 +SECTION BODY ODD 0 - SECTION H_ARTICOLO 1 3 1 HEADER - STRINGA 11 20 - BEGIN - KEY "CODART" - PROMPT 2 1 "Articolo " - FIELD LF_ANAMAG->CODART - END - STRINGA 12 50 - BEGIN - KEY "DESCR" - PROMPT 33 1 "" - FIELD LF_ANAMAG->DESCR - END - END SECTION GRUPPI_ARTICOLO 1 0 0 COLUMNWISE FILE LF_STOMAG + SECTION H_ARTICOLO 1 3 1 GROUP + STRINGA 11 20 + BEGIN + KEY "CODART" + PROMPT 2 1 "Articolo " + FIELD LF_ANAMAG->CODART + END + STRINGA 12 50 + BEGIN + KEY "DESCR" + PROMPT 33 1 "" + FIELD LF_ANAMAG->DESCR + END + END + SECTION BODY_MAG 1 1 1 COLUMNWISE FILE LF_STOMAG GROUP CODART SECTION HD_MAG 1 2 1 NORMAL GROUP STRINGA 11 20 @@ -95,7 +94,7 @@ SECTION BODY ODD 1 STRINGA 12 50 BEGIN KEY "DESCR" - PROMPT 33 1 "" + PROMPT 23 1 "" FIELD LF_TAB_MAG@->S0 END END // HD MAG @@ -106,10 +105,10 @@ SECTION BODY ODD 1 KEY "offset" PROMPT 1 1 "" END - NUMERO 13 6 + NUMERO 13 10 BEGIN KEY "ANNO" - PROMPT 2 1 "Anno" + PROMPT 2 1 " Anno" END STRINGA 15 12 BEGIN @@ -129,7 +128,7 @@ SECTION BODY ODD 1 KEY "offset" PROMPT 1 1 "" END - NUMERO 14 6 + NUMERO 14 10 BEGIN KEY "ANNO" PROMPT 2 1 "" @@ -140,20 +139,50 @@ SECTION BODY ODD 1 KEY "QUANT" PROMPT 4 1 "" PICTURE "###.###,@@@" - MESSAGE _NUMEXPR,LF_STOMAG->QUANT*LF_UMART2@->FC + FIELD LF_STOMAG->QUANT + MESSAGE ADD,115 END NUMERO 16 12 BEGIN KEY "VALORE" PROMPT 5 1 "" PICTURE "###.###.###" - MESSAGE _NUMEXPR,LF_STOMAG->VALORE*LF_UMART2@->FC + FIELD LF_STOMAG->VALORE + MESSAGE ADD,116 END END // body anni - END // body anni - END // gruppi anni dello stesso articolo + END // gruppi anni dello stesso articolo + SECTION FOOTER_ANNI 1 1 1 COLUMNWISE GROUP + NUMERO 13 15 + BEGIN + KEY "offset" + PROMPT 1 1 "" + END + NUMERO 14 10 + BEGIN + KEY "ANNO" + PROMPT 2 1 " Totale" + END + NUMERO 115 12 + BEGIN + KEY "QUANT" + PROMPT 4 1 "" + PICTURE "###.###,@@@" + END + NUMERO 116 12 + BEGIN + KEY "VALORE" + PROMPT 5 1 "" + PICTURE "###.###.###" + END + + END // body anni + + + END // CICLO sul file di storico + END // section body, loop anamag SECTION FOOTER ODD 2 diff --git a/mg/mg4100.frm b/mg/mg4100.frm index bb552d7da..61e886e70 100755 --- a/mg/mg4100.frm +++ b/mg/mg4100.frm @@ -22,7 +22,7 @@ END GENERAL BEGIN OFFSET 0 1 - FONT "Courier New" +// FONT "Courier New" // SIZE 10 END @@ -274,7 +274,7 @@ SECTION BODY ODD 1 NUMERO 10 BEGIN KEY "totale mov" - PROMPT 86 3 "Totale valore movimentato: " + PROMPT 85 3 "Totale valore movimentato: " PICTURE "##.###.###.##@" END diff --git a/mg/mg4200.cpp b/mg/mg4200.cpp index 7c92c2f97..a79f08be6 100755 --- a/mg/mg4200.cpp +++ b/mg/mg4200.cpp @@ -123,32 +123,38 @@ bool TForm_inventario::valorizzazione(TForm_item &cf, TTipo_valorizz t) if (t==valorizz_coststd) { v=curr_art().costo_standard(annoes).string(); } + if (t==valorizz_costmediopond) { + TString codmag(magrec.get(MAG_CODMAG));codmag.cut(3); + const TString livello(magrec.get(MAG_LIVELLO)); + v=curr_art().costo_mediopond(annoes,codmag,livello).string(); + } if (t==valorizz_costmedio) { - const TString codmag(magrec.get(MAG_CODMAG)); + TString codmag(magrec.get(MAG_CODMAG));codmag.cut(3); const TString livello(magrec.get(MAG_LIVELLO)); v=curr_art().costo_medio(annoes,codmag,livello).string(); } if (t==valorizz_LIFO) { - const TString codmag(magrec.get(MAG_CODMAG)); + TString codmag(magrec.get(MAG_CODMAG));codmag.cut(3); const TString livello(magrec.get(MAG_LIVELLO)); v=curr_art().LIFO(annoes,codmag,livello, _giaceff,_valcomp).string(); } if (t==valorizz_FIFO) { - const TString codmag(magrec.get(MAG_CODMAG)); + TString codmag(magrec.get(MAG_CODMAG));codmag.cut(3); const TString livello(magrec.get(MAG_LIVELLO)); v=curr_art().FIFO(annoes,codmag,livello, _giaceff,_valcomp).string(); } if (t==valorizz_LIFOa) { - const TString codmag(magrec.get(MAG_CODMAG)); + TString codmag(magrec.get(MAG_CODMAG));codmag.cut(3); const TString livello(magrec.get(MAG_LIVELLO)); v=curr_art().LIFO_annuale(annoes,codmag,livello, _giaceff,_valcomp).string(); } if (t==valorizz_FIFOa) { - const TString codmag(magrec.get(MAG_CODMAG)); + TString codmag(magrec.get(MAG_CODMAG));codmag.cut(3); const TString livello(magrec.get(MAG_LIVELLO)); v=curr_art().FIFO_annuale(annoes,codmag,livello, _giaceff,_valcomp).string(); } - cf.set(((real)(v * curr_art().giacenza_corretta(magrec,_giaceff,_valcomp))).string()); + cf.set(v.string()); + //* curr_art().giacenza_corretta(magrec,_giaceff,_valcomp) return TRUE; } @@ -199,7 +205,7 @@ TStampainv_mask::TStampainv_mask(): set_handler(F_TOLIVELLOART, handle_liv); set_handler(F_TOLIVELLOGIAC, handle_liv); set_handler(F_ORDINE, handle_ragg); - set_handler(F_DETTAGLIODEP, handle_ragg); + //set_handler(F_DETTAGLIODEP, handle_ragg); set_handler(F_DETTAGLIOMAG, handle_ragg); set_handler(F_ORDINEART,handle_subord); set_handler(F_CODLISTINO, handle_codlist); @@ -216,7 +222,7 @@ bool TStampainv_mask::handle_subord(TMask_field &fld, KEY k) if (fld.mask().get(F_ORDINE)=="A") fraggcod.enable(); else { - if (!fld.mask().get_bool(F_DETTAGLIOMAG) || !fld.mask().get_bool(F_DETTAGLIODEP)) + if (!fld.mask().get_bool(F_DETTAGLIODEP)) { fraggcod.reset(); fraggcod.disable(); fragggiac.reset(); fragggiac.disable(); @@ -263,7 +269,7 @@ bool TStampainv_mask::handle_ragg(TMask_field &fld, KEY k) if (fld.mask().get(F_ORDINE)=="M") { ftotmag.enable(); - if (!fld.mask().get_bool(F_DETTAGLIOMAG) || !fld.mask().get_bool(F_DETTAGLIODEP)) + if (!fld.mask().get_bool(F_DETTAGLIODEP)) { fraggcod.reset(); fraggcod.disable(); fragggiac.reset(); fragggiac.disable(); @@ -375,7 +381,13 @@ void TStampa_inventario::setprint_permagazzini() _form->setdett_permag( _mask->get_bool(F_RAGGCODICE),_mask->get_int(F_FROMLIVELLOART),_mask->get_int(F_TOLIVELLOART), _mask->get_bool(F_RAGGLIVGIAC),_mask->get_int(F_FROMLIVELLOGIAC),_mask->get_int(F_TOLIVELLOGIAC), - TRUE,_mask->get_bool(F_DETTAGLIOMAG),_mask->get_bool(F_DETTAGLIODEP)); + TRUE,_mask->get_bool(F_TOTALIDEPOSITI),_mask->get_bool(F_DETTAGLIODEP)); + + if (!_mask->get_bool(F_TOTALIDEPOSITI)) + { + ((TSorted_cursor *)_cur)->change_order("ANNOES|CODMAG[1,3]|CODART|LIVELLO"); + _form->find_field('B',odd_page,"GRUPPI_DEPOSITO").setcondition("CODMAG[1,3]",_strexpr); + } darec.put("ANNOES",_mask->get(F_ANNOES)); darec.put("CODMAG",_mask->get(F_DAMAG)); @@ -405,7 +417,7 @@ void TStampa_inventario::setprint_perarticoli() if (filter.not_empty()) filter.cut(filter.len()-2); - _mask->set_livellicodice(); + //_mask->set_livellicodice(); switch (subordine) { case 'C': @@ -438,7 +450,7 @@ void TStampa_inventario::setprint_perarticoli() _form->setdett_perart( _mask->get_bool(F_RAGGCODICE),_mask->get_int(F_FROMLIVELLOART),_mask->get_int(F_TOLIVELLOART), _mask->get_bool(F_RAGGLIVGIAC),_mask->get_int(F_FROMLIVELLOGIAC),_mask->get_int(F_TOLIVELLOGIAC), - _mask->get_bool(F_TOTALIMAGAZZINI),_mask->get_bool(F_TOTALIDEPOSITI)); + _mask->get_bool(F_TOTALIMAGAZZINI),_mask->get_bool(F_DETTAGLIOMAG)); /* if (*_mask->get(F_FILTRO)=='N') _form->find_field('B',odd_page,"TOT_DEPOSITO").setcondition("GIAC!=0"); if (*_mask->get(F_FILTRO)=='+') diff --git a/mg/mg4200.uml b/mg/mg4200.uml index 71cc36aa0..d4ccad69d 100755 --- a/mg/mg4200.uml +++ b/mg/mg4200.uml @@ -7,10 +7,10 @@ BEGIN PROMPT 2 1 "Ordinamento " ITEM "A|articoli" MESSAGE ENABLE,F_ORDINEART - MESSAGE SHOW,F_TOTALIMAGAZZINI|SHOW,F_TOTALIDEPOSITI|"X",F_DETTAGLIOMAG|"X",F_DETTAGLIODEP|HIDE,F_DETTAGLIODEP|HIDE,F_DETTAGLIOMAG + MESSAGE "X",F_DETTAGLIODEP|SHOW,F_TOTALIMAGAZZINI|SHOW,F_DETTAGLIOMAG|HIDE,F_TOTALIDEPOSITI ITEM "M|magazzini" MESSAGE "C",F_ORDINEART|K_SPACE,F_ORDINEART|DISABLE,F_ORDINEART|SHOW,G_CODART@|HIDE,G_DESART@ - MESSAGE SHOW,F_DETTAGLIOMAG|HIDE,F_TOTALIMAGAZZINI|SHOW,F_DETTAGLIODEP|HIDE,F_TOTALIDEPOSITI + MESSAGE SHOW,F_TOTALIDEPOSITI|HIDE,F_TOTALIMAGAZZINI|HIDE,F_DETTAGLIOMAG END @@ -54,7 +54,7 @@ BEGIN PROMPT 2 3 "Valorizza solo " ITEM "C|i componenti impegnati" ITEM "F|i finiti in produzione" - HELP "finiti =(giac+INPRODF-INPRODC)" + HELP "finiti =(giac+INPRODF-INPRODC)" END @@ -157,16 +157,17 @@ BEGIN GROUP G_CATMER END -BOOL F_DETTAGLIOMAG +BOOL F_TOTALIDEPOSITI BEGIN - PROMPT 2 7 "Stampa i depositi" - MESSAGE TRUE ENABLE,F_DETTAGLIODEP - MESSAGE FALSE CLEAR,F_DETTAGLIODEP|K_SPACE,F_DETTAGLIODEP + PROMPT 2 7 "Suddivido per depositi" +// MESSAGE TRUE ENABLE,F_DETTAGLIODEP +// MESSAGE FALSE CLEAR,F_DETTAGLIODEP|K_SPACE,F_DETTAGLIODEP END BOOL F_DETTAGLIODEP BEGIN - PROMPT 42 7 "Stampa il dettaglio depositi" + FLAGS "DH" + PROMPT 42 7 "Dettaglia i depositi" MESSAGE TRUE ENABLE,F_RAGGCODICE|ENABLE,F_RAGGLIVGIAC MESSAGE FALSE CLEAR,F_RAGGCODICE|K_SPACE,F_RAGGCODICE|CLEAR,F_RAGGLIVGIAC|K_SPACE,F_RAGGLIVGIAC END @@ -245,11 +246,11 @@ END BOOL F_TOTALIMAGAZZINI BEGIN PROMPT 2 10 "Stampa i totali di magazzino" - MESSAGE TRUE ENABLE,F_TOTALIDEPOSITI - MESSAGE FALSE CLEAR,F_TOTALIDEPOSITI + MESSAGE TRUE ENABLE,F_DETTAGLIOMAG + MESSAGE FALSE CLEAR,F_DETTAGLIOMAG END -BOOL F_TOTALIDEPOSITI +BOOL F_DETTAGLIOMAG BEGIN PROMPT 42 10 "Stampa i totali di deposito" END @@ -257,85 +258,91 @@ END LIST F_VAL1 20 BEGIN PROMPT 2 12 "Valorizz. 1 " + ITEM "6|Costo medio ponder." ITEM "1|Ultimo costo" ITEM "2|Media ultimi costi" ITEM "3|Prezzo di listino" ITEM "4|Costo standard" ITEM "5|Costo medio" - ITEM "6|FIFO annuale" - ITEM "7|LIFO annuale" - ITEM "8|FIFO" - ITEM "9|LIFO" + ITEM "7|FIFO annuale" + ITEM "8|LIFO annuale" + ITEM "9|FIFO" + ITEM "10|LIFO" END LIST F_VAL2 20 BEGIN PROMPT 2 13 "Valorizz. 2 " ITEM "|" + ITEM "6|Costo medio ponder." ITEM "1|Ultimo costo" ITEM "2|Media ultimi costi" ITEM "3|Prezzo di listino" ITEM "4|Costo standard" ITEM "5|Costo medio" - ITEM "6|FIFO annuale" - ITEM "7|LIFO annuale" - ITEM "8|FIFO" - ITEM "9|LIFO" + ITEM "7|FIFO annuale" + ITEM "8|LIFO annuale" + ITEM "9|FIFO" + ITEM "10|LIFO" END LIST F_VAL3 20 BEGIN PROMPT 2 14 "Valorizz. 3 " ITEM "|" + ITEM "6|Costo medio ponder." ITEM "1|Ultimo costo" ITEM "2|Media ultimi costi" ITEM "3|Prezzo di listino" ITEM "4|Costo standard" ITEM "5|Costo medio" - ITEM "6|FIFO annuale" - ITEM "7|LIFO annuale" - ITEM "8|FIFO" - ITEM "9|LIFO" + ITEM "7|FIFO annuale" + ITEM "8|LIFO annuale" + ITEM "9|FIFO" + ITEM "10|LIFO" END LIST F_VAL4 20 BEGIN PROMPT 42 12 "Valorizz. 4 " ITEM "|" + ITEM "6|Costo medio ponder." ITEM "1|Ultimo costo" ITEM "2|Media ultimi costi" ITEM "3|Prezzo di listino" ITEM "4|Costo standard" ITEM "5|Costo medio" - ITEM "6|FIFO annuale" - ITEM "7|LIFO annuale" - ITEM "8|FIFO" - ITEM "9|LIFO" + ITEM "7|FIFO annuale" + ITEM "8|LIFO annuale" + ITEM "9|FIFO" + ITEM "10|LIFO" END LIST F_VAL5 20 BEGIN PROMPT 42 13 "Valorizz. 5 " ITEM "|" + ITEM "6|Costo medio ponder." ITEM "1|Ultimo costo" ITEM "2|Media ultimi costi" ITEM "3|Prezzo di listino" ITEM "4|Costo standard" ITEM "5|Costo medio" - ITEM "6|FIFO annuale" - ITEM "7|LIFO annuale" - ITEM "8|FIFO" - ITEM "9|LIFO" + ITEM "7|FIFO annuale" + ITEM "8|LIFO annuale" + ITEM "9|FIFO" + ITEM "10|LIFO" END LIST F_VAL6 20 BEGIN PROMPT 42 14 "Valorizz. 6 " ITEM "|" + ITEM "6|Costo medio ponder." ITEM "1|Ultimo costo" ITEM "2|Media ultimi costi" ITEM "3|Prezzo di listino" ITEM "4|Costo standard" ITEM "5|Costo medio" - ITEM "6|FIFO annuale" - ITEM "7|LIFO annuale" - ITEM "8|FIFO" - ITEM "9|LIFO" + ITEM "7|FIFO annuale" + ITEM "8|LIFO annuale" + ITEM "9|FIFO" + ITEM "10|LIFO" END GROUPBOX DLG_NULL 78 3 diff --git a/mg/mg4200a.frm b/mg/mg4200a.frm index d13c9e88c..420a8d113 100755 --- a/mg/mg4200a.frm +++ b/mg/mg4200a.frm @@ -21,7 +21,7 @@ GENERAL BEGIN OFFSET 0 1 // Let the user be free to choose the font&size: - FONT "Courier New" +// FONT "Courier New" // SIZE 10 END @@ -254,7 +254,7 @@ SECTION BODY ODD 0 COLUMNWISE PROMPT 2 1 "" MESSAGE _USER,CODCATMER END - STRINGA 12 30 2 + STRINGA 12 70 BEGIN KEY "CODICE CATMER" PROMPT 3 1 "" @@ -286,7 +286,7 @@ SECTION BODY ODD 0 COLUMNWISE PROMPT 2 1 "" MESSAGE _USER,CODGRUPPOART,1|COPY,1451 END - STRINGA 17 30 2 + STRINGA 17 70 BEGIN KEY "CODICE GRUPPO" PROMPT 3 1 "" @@ -309,7 +309,7 @@ SECTION BODY ODD 0 COLUMNWISE PROMPT 2 1 "" MESSAGE _USER,CODGRUPPOART,2|COPY,1351 END - STRINGA 17 30 2 + STRINGA 17 70 BEGIN KEY "CODICE GRUPPO" PROMPT 3 1 "" @@ -332,7 +332,7 @@ SECTION BODY ODD 0 COLUMNWISE PROMPT 2 1 "" MESSAGE _USER,CODGRUPPOART,3|COPY,1251 END - STRINGA 17 30 2 + STRINGA 17 70 BEGIN KEY "CODICE GRUPPO" PROMPT 3 1 "" @@ -355,7 +355,7 @@ SECTION BODY ODD 0 COLUMNWISE PROMPT 2 1 "" MESSAGE _USER,CODGRUPPOART,4|COPY,1151 END - STRINGA 17 30 2 + STRINGA 17 70 BEGIN KEY "CODICE GRUPPO" PROMPT 3 1 "" @@ -378,7 +378,7 @@ SECTION BODY ODD 0 COLUMNWISE PROMPT 2 1 "" MESSAGE _USER,CODGRUPPOART,5|COPY,1051 END - STRINGA 17 30 2 + STRINGA 17 70 BEGIN KEY "CODICE GRUPPO" PROMPT 3 1 "" @@ -401,7 +401,7 @@ SECTION BODY ODD 0 COLUMNWISE PROMPT 2 1 "" MESSAGE _USER,CODGRUPPOART,6|COPY,951 END - STRINGA 17 30 2 + STRINGA 17 70 BEGIN KEY "CODICE GRUPPO" PROMPT 3 1 "" @@ -424,7 +424,7 @@ SECTION BODY ODD 0 COLUMNWISE PROMPT 2 1 "" MESSAGE _USER,CODGRUPPOART,7|COPY,851 END - STRINGA 17 30 2 + STRINGA 17 70 BEGIN KEY "CODICE GRUPPO" PROMPT 3 1 "" @@ -448,7 +448,7 @@ SECTION BODY ODD 0 COLUMNWISE PROMPT 2 1 "" MESSAGE _USER,CODGRUPPOART,8|COPY,751 END - STRINGA 17 30 2 + STRINGA 17 70 BEGIN KEY "CODICE GRUPPO" PROMPT 3 1 "" @@ -472,7 +472,7 @@ SECTION BODY ODD 0 COLUMNWISE FIELD CODART MESSAGE COPY,651 END - STRINGA 21 30 2 + STRINGA 21 70 BEGIN KEY "DESCR.articolo" PROMPT 3 1 "" @@ -604,14 +604,14 @@ SECTION BODY ODD 0 COLUMNWISE END END SECTION H_MAGAZZINO_DEP 1 1 1 STR_EXPR 500@->B0=="X" // DIVISIONE IN DEPOSITI - STRINGA 60 40 1 + STRINGA 60 20 1 BEGIN KEY "codice magazzino" FIELD 500@->CODTAB PROMPT 2 1 " Magazzino " MESSAGE SHOW,TOT_DEPOSITO END - STRINGA 60 40 1 + STRINGA 60 70 1 BEGIN KEY "magazzino" FIELD 500@->s0 @@ -650,106 +650,112 @@ SECTION BODY ODD 0 COLUMNWISE PICTURE "########,@##" MESSAGE _USER,GIAC|ADD,141 END - NUMERO 42 15 - BEGIN - KEY "VAL1" - PROMPT 7 1 "" - PICTURE "##.###.###.##@" - MESSAGE _USER,VAL1|ADD,142 - END + NUMERO 82 12 BEGIN KEY "VAL1M" PROMPT 8 1 "" PICTURE "###.###.##@" - MESSAGE _NUMEXPR,#42/#41 + MESSAGE _USER,VAL1 GROUP FG_COL1 END + NUMERO 42 15 + BEGIN + KEY "VAL1" + PROMPT 7 1 "" + PICTURE "##.###.###.##@" + MESSAGE _NUMEXPR,#82*#41|ADD,142 + END + + NUMERO 83 12 + BEGIN + KEY "VAL2M" + PROMPT 10 1 "" + PICTURE "###.###.##@" + MESSAGE _USER,VAL2 + GROUP FG_COL2 + END NUMERO 43 15 BEGIN KEY "VAL2" PROMPT 9 1 "" PICTURE "##.###.###.##@" - MESSAGE _USER,VAL2|ADD,143 + MESSAGE _NUMEXPR,#83*#41|ADD,143 GROUP FG_COL2 END - NUMERO 83 12 + + NUMERO 84 12 BEGIN - KEY "VAL2M" - PROMPT 10 1 "" + KEY "VAL3M" + PROMPT 12 1 "" PICTURE "###.###.##@" - MESSAGE _NUMEXPR,#43/#41 - GROUP FG_COL2 + MESSAGE _USER,VAL3 + GROUP FG_COL3 END NUMERO 44 15 BEGIN KEY "VAL3" PROMPT 11 1 "" PICTURE "##.###.###.##@" - MESSAGE _USER,VAL3|ADD,144 + MESSAGE _NUMEXPR,#84*#41|ADD,144 GROUP FG_COL3 END - NUMERO 84 12 + + NUMERO 85 12 BEGIN - KEY "VAL3M" - PROMPT 12 1 "" + KEY "VAL4M" + PROMPT 14 1 "" PICTURE "###.###.##@" - MESSAGE _NUMEXPR,#44/#41 - GROUP FG_COL3 + MESSAGE _USER,VAL4 + GROUP FG_COL4 END NUMERO 45 15 BEGIN KEY "VAL4" PROMPT 13 1 "" PICTURE "##.###.###.##@" - MESSAGE _USER,VAL4|ADD,145 + MESSAGE _NUMEXPR,#85*#41|ADD,145 GROUP FG_COL4 END - NUMERO 85 12 + + NUMERO 86 12 BEGIN - KEY "VAL4M" - PROMPT 14 1 "" + KEY "VAL5M" + PROMPT 16 1 "" PICTURE "###.###.##@" - MESSAGE _NUMEXPR,#45/#41 - GROUP FG_COL4 + MESSAGE _USER,VAL5 + GROUP FG_COL5 END NUMERO 46 15 BEGIN KEY "VAL5" PROMPT 15 1 "" PICTURE "##.###.###.##@" - MESSAGE _USER,VAL5|ADD,146 + MESSAGE _NUMEXPR,#86*#41|ADD,146 GROUP FG_COL5 END - NUMERO 86 12 + + NUMERO 87 12 BEGIN - KEY "VAL5M" - PROMPT 16 1 "" + KEY "VAL6M" + PROMPT 18 1 "" PICTURE "###.###.##@" - MESSAGE _NUMEXPR,#46/#41 - GROUP FG_COL5 + MESSAGE _USER,VAL6 + GROUP FG_COL6 END NUMERO 47 15 BEGIN KEY "VAL6" PROMPT 17 1 "" PICTURE "##.###.###.##@" - MESSAGE _USER,VAL6|ADD,147 - GROUP FG_COL6 - END - NUMERO 87 12 - BEGIN - KEY "VAL6M" - PROMPT 18 1 "" - PICTURE "###.###.##@" - MESSAGE _NUMEXPR,#47/#41 + MESSAGE _NUMEXPR,#87*#41|ADD,147 GROUP FG_COL6 END END // depositi dello stesso magazzino END // MAGAZZ - SECTION TOT_MAGAZZINO 1 1 1 FOOTER + SECTION TOT_MAGAZZINO 1 1 1 GROUP STRINGA 150 30 1 BEGI KEY "Magazzino" @@ -814,15 +820,15 @@ SECTION BODY ODD 0 COLUMNWISE MESSAGE ADD,244 GROUP 1 FG_COL3 END - NUMERO 184 15 + NUMERO 184 12 BEGIN KEY "VAL1" PROMPT 12 1 "" - PICTURE "##.###.###.##@" + PICTURE "###.###.##@" MESSAGE _NUMEXPR,#144/#141 GROUP 1 FG_COL3 END - NUMERO 145 12 + NUMERO 145 15 BEGIN KEY "VAL4" PROMPT 13 1 "" @@ -873,7 +879,7 @@ SECTION BODY ODD 0 COLUMNWISE END // tot magazz END // GGIAC4 - SECTION TOT_GLIVGIAC4 1 1 1 FOOTER + SECTION TOT_GLIVGIAC4 1 1 1 GROUP STRINGA 250 30 BEGIN PROMPT 3 1 "" @@ -996,7 +1002,7 @@ SECTION BODY ODD 0 COLUMNWISE END // tot ggiac4 END // GGIAC3 - SECTION TOT_GLIVGIAC3 1 1 1 FOOTER + SECTION TOT_GLIVGIAC3 1 1 1 GROUP STRINGA 350 30 BEGIN KEY "" @@ -1120,7 +1126,7 @@ SECTION BODY ODD 0 COLUMNWISE END // tot ggiac3 END // GGIAC2 - SECTION TOT_GLIVGIAC2 1 1 1 FOOTER + SECTION TOT_GLIVGIAC2 1 1 1 GROUP STRINGA 450 30 BEGIN KEY "" @@ -1243,7 +1249,7 @@ SECTION BODY ODD 0 COLUMNWISE END END // tot ggiac2 END // GGIAC1 - SECTION TOT_GLIVGIAC1 1 1 1 FOOTER + SECTION TOT_GLIVGIAC1 1 1 1 GROUP STRINGA 550 30 BEGIN KEY "" diff --git a/mg/mg4200aa.frm b/mg/mg4200aa.frm index f7dcccd6a..05c0c2144 100755 --- a/mg/mg4200aa.frm +++ b/mg/mg4200aa.frm @@ -21,7 +21,7 @@ GENERAL BEGIN OFFSET 0 1 // Let the user be free to choose the font&size: - FONT "Courier New" +// FONT "Courier New" // SIZE 10 END @@ -254,7 +254,7 @@ SECTION BODY ODD 0 COLUMNWISE PROMPT 2 1 "" MESSAGE _USER,CODCATMER END - STRINGA 12 30 2 + STRINGA 12 70 BEGIN KEY "CODICE CATMER" PROMPT 3 1 "" @@ -286,7 +286,7 @@ SECTION BODY ODD 0 COLUMNWISE PROMPT 2 1 "" MESSAGE _USER,CODGRUPPOART,1|COPY,1451 END - STRINGA 17 30 2 + STRINGA 17 70 BEGIN KEY "CODICE GRUPPO" PROMPT 3 1 "" @@ -309,7 +309,7 @@ SECTION BODY ODD 0 COLUMNWISE PROMPT 2 1 "" MESSAGE _USER,CODGRUPPOART,2|COPY,1351 END - STRINGA 17 30 2 + STRINGA 17 70 BEGIN KEY "CODICE GRUPPO" PROMPT 3 1 "" @@ -332,7 +332,7 @@ SECTION BODY ODD 0 COLUMNWISE PROMPT 2 1 "" MESSAGE _USER,CODGRUPPOART,3|COPY,1251 END - STRINGA 17 30 2 + STRINGA 17 70 BEGIN KEY "CODICE GRUPPO" PROMPT 3 1 "" @@ -355,7 +355,7 @@ SECTION BODY ODD 0 COLUMNWISE PROMPT 2 1 "" MESSAGE _USER,CODGRUPPOART,4|COPY,1151 END - STRINGA 17 30 2 + STRINGA 17 70 BEGIN KEY "CODICE GRUPPO" PROMPT 3 1 "" @@ -378,7 +378,7 @@ SECTION BODY ODD 0 COLUMNWISE PROMPT 2 1 "" MESSAGE _USER,CODGRUPPOART,5|COPY,1051 END - STRINGA 17 30 2 + STRINGA 17 70 BEGIN KEY "CODICE GRUPPO" PROMPT 3 1 "" @@ -401,7 +401,7 @@ SECTION BODY ODD 0 COLUMNWISE PROMPT 2 1 "" MESSAGE _USER,CODGRUPPOART,6|COPY,951 END - STRINGA 17 30 2 + STRINGA 17 70 BEGIN KEY "CODICE GRUPPO" PROMPT 3 1 "" @@ -424,7 +424,7 @@ SECTION BODY ODD 0 COLUMNWISE PROMPT 2 1 "" MESSAGE _USER,CODGRUPPOART,7|COPY,851 END - STRINGA 17 30 2 + STRINGA 17 70 BEGIN KEY "CODICE GRUPPO" PROMPT 3 1 "" @@ -448,7 +448,7 @@ SECTION BODY ODD 0 COLUMNWISE PROMPT 2 1 "" MESSAGE _USER,CODGRUPPOART,8|COPY,751 END - STRINGA 17 30 2 + STRINGA 17 70 BEGIN KEY "CODICE GRUPPO" PROMPT 3 1 "" @@ -472,7 +472,7 @@ SECTION BODY ODD 0 COLUMNWISE FIELD CODART MESSAGE COPY,651 END - STRINGA 21 30 2 + STRINGA 21 70 BEGIN KEY "DESCR.articolo" PROMPT 3 1 "" @@ -604,14 +604,14 @@ SECTION BODY ODD 0 COLUMNWISE END END SECTION H_MAGAZZINO_DEP 1 1 1 STR_EXPR 500@->B0=="X" // DIVISIONE IN DEPOSITI - STRINGA 60 40 1 + STRINGA 60 20 1 BEGIN KEY "codice magazzino" FIELD 500@->CODTAB PROMPT 2 1 " Magazzino " MESSAGE SHOW,TOT_DEPOSITO END - STRINGA 60 40 1 + STRINGA 60 70 1 BEGIN KEY "magazzino" FIELD 500@->s0 @@ -650,99 +650,105 @@ SECTION BODY ODD 0 COLUMNWISE PICTURE "########,@##" MESSAGE _USER,GIAC|ADD,141 END - NUMERO 42 15 - BEGIN - KEY "VAL1" - PROMPT 7 1 "" - PICTURE "##.###.###.##@" - MESSAGE _USER,VAL1|ADD,142 - END + NUMERO 82 12 BEGIN KEY "VAL1M" PROMPT 8 1 "" PICTURE "###.###.##@" - MESSAGE _NUMEXPR,#42/#41 + MESSAGE _USER,VAL1 GROUP FG_COL1 END + NUMERO 42 15 + BEGIN + KEY "VAL1" + PROMPT 7 1 "" + PICTURE "##.###.###.##@" + MESSAGE _NUMEXPR,#82*#41|ADD,142 + END + + NUMERO 83 12 + BEGIN + KEY "VAL2M" + PROMPT 10 1 "" + PICTURE "###.###.##@" + MESSAGE _USER,VAL2 + GROUP FG_COL2 + END NUMERO 43 15 BEGIN KEY "VAL2" PROMPT 9 1 "" PICTURE "##.###.###.##@" - MESSAGE _USER,VAL2|ADD,143 + MESSAGE _NUMEXPR,#83*#41|ADD,143 GROUP FG_COL2 END - NUMERO 83 12 + + NUMERO 84 12 BEGIN - KEY "VAL2M" - PROMPT 10 1 "" + KEY "VAL3M" + PROMPT 12 1 "" PICTURE "###.###.##@" - MESSAGE _NUMEXPR,#43/#41 - GROUP FG_COL2 + MESSAGE _USER,VAL3 + GROUP FG_COL3 END NUMERO 44 15 BEGIN KEY "VAL3" PROMPT 11 1 "" PICTURE "##.###.###.##@" - MESSAGE _USER,VAL3|ADD,144 + MESSAGE _NUMEXPR,#84*#41|ADD,144 GROUP FG_COL3 END - NUMERO 84 12 + + NUMERO 85 12 BEGIN - KEY "VAL3M" - PROMPT 12 1 "" + KEY "VAL4M" + PROMPT 14 1 "" PICTURE "###.###.##@" - MESSAGE _NUMEXPR,#44/#41 - GROUP FG_COL3 + MESSAGE _USER,VAL4 + GROUP FG_COL4 END NUMERO 45 15 BEGIN KEY "VAL4" PROMPT 13 1 "" PICTURE "##.###.###.##@" - MESSAGE _USER,VAL4|ADD,145 + MESSAGE _NUMEXPR,#85*#41|ADD,145 GROUP FG_COL4 END - NUMERO 85 12 + + NUMERO 86 12 BEGIN - KEY "VAL4M" - PROMPT 14 1 "" + KEY "VAL5M" + PROMPT 16 1 "" PICTURE "###.###.##@" - MESSAGE _NUMEXPR,#45/#41 - GROUP FG_COL4 + MESSAGE _USER,VAL5 + GROUP FG_COL5 END NUMERO 46 15 BEGIN KEY "VAL5" PROMPT 15 1 "" PICTURE "##.###.###.##@" - MESSAGE _USER,VAL5|ADD,146 + MESSAGE _NUMEXPR,#86*#41|ADD,146 GROUP FG_COL5 END - NUMERO 86 12 + + NUMERO 87 12 BEGIN - KEY "VAL5M" - PROMPT 16 1 "" + KEY "VAL6M" + PROMPT 18 1 "" PICTURE "###.###.##@" - MESSAGE _NUMEXPR,#46/#41 - GROUP FG_COL5 + MESSAGE _USER,VAL6 + GROUP FG_COL6 END NUMERO 47 15 BEGIN KEY "VAL6" PROMPT 17 1 "" PICTURE "##.###.###.##@" - MESSAGE _USER,VAL6|ADD,147 - GROUP FG_COL6 - END - NUMERO 87 12 - BEGIN - KEY "VAL6M" - PROMPT 18 1 "" - PICTURE "###.###.##@" - MESSAGE _NUMEXPR,#47/#41 + MESSAGE _NUMEXPR,#87*#41|ADD,147 GROUP FG_COL6 END END // depositi dello stesso magazzino @@ -814,15 +820,15 @@ SECTION BODY ODD 0 COLUMNWISE MESSAGE ADD,244 GROUP 1 FG_COL3 END - NUMERO 184 15 + NUMERO 184 12 BEGIN KEY "VAL1" PROMPT 12 1 "" - PICTURE "##.###.###.##@" + PICTURE "###.###.##@" MESSAGE _NUMEXPR,#144/#141 GROUP 1 FG_COL3 END - NUMERO 145 12 + NUMERO 145 15 BEGIN KEY "VAL4" PROMPT 13 1 "" diff --git a/mg/mg4200b.frm b/mg/mg4200b.frm index 4d86647f6..9d238bb13 100755 --- a/mg/mg4200b.frm +++ b/mg/mg4200b.frm @@ -1,5 +1,5 @@ #include "mg4frm.h" -USE LF_MAG KEY 2 +USE LF_MAG KEY 2 BY ANNOES CODMAG[1,3] CODART LIVELLO CODMAG[4,5] JOIN LF_ANAMAG TO LF_MAG INTO CODART==CODART JOIN MAG TO LF_MAG ALIAS 500 INTO CODTAB==CODMAG[1,3] JOIN MAG TO LF_MAG ALIAS 501 INTO CODTAB==CODMAG @@ -17,7 +17,7 @@ END GENERAL BEGIN OFFSET 0 1 - FONT "Courier New" +// FONT "Courier New" // Let the user be free to choose the font size: // SIZE 10 END @@ -255,7 +255,7 @@ SECTION BODY ODD 1 COLUMNWISE STRINGA 60 20 1 BEGIN KEY "codice magazzino" - PROMPT 2 1 "Magazzino " + PROMPT 2 1 "Magazzino " FIELD 500@->CODTAB MESSAGE COPY,151 END @@ -268,6 +268,13 @@ SECTION BODY ODD 1 COLUMNWISE END END SECTION GRUPPI_MAGAZZINO 1 0 0 FILE LF_MAG GROUP CODMAG[1,3] + STRINGA 60 40 1 + BEGIN + FLAGS "H" + KEY "" + PROMPT 2 1 "" + MESSAGE RESET,15@ + END LIST FF_DIVDEPOSITI BEGIN FLAGS "H" @@ -282,8 +289,8 @@ SECTION BODY ODD 1 COLUMNWISE SECTION H_DEPOSITO 1 1 1 STR_EXPR #FF_DIVDEPOSITI=="X" STRINGA 60 20 1 BEGIN - KEY "codice magazzino" - PROMPT 2 1 "Deposito " + KEY "codice deposito" + PROMPT 2 1 "Deposito " FIELD 501@->CODTAB[4,5] MESSAGE COPY,51 END @@ -611,100 +618,106 @@ SECTION BODY ODD 1 COLUMNWISE MESSAGE _USER,GIAC|ADD,341 GROUP 2 END - NUMERO 242 15 - BEGIN - KEY "VAL1" - PROMPT 7 1 "" - PICTURE "##.###.###.##@" - MESSAGE _USER,VAL1|ADD,342 - GROUP 2 - END + NUMERO 282 12 BEGIN KEY "VAL_MEDIO" PROMPT 8 1 "" PICTURE "###.###.##@" - MESSAGE _NUMEXPR,#242/#241 + MESSAGE _USER,VAL1 GROUP 2 FG_COL1 END + NUMERO 242 15 + BEGIN + KEY "VAL1" + PROMPT 7 1 "" + PICTURE "##.###.###.##@" + MESSAGE _NUMEXPR,#282*#241|ADD,342 + GROUP 2 + END + + NUMERO 283 12 + BEGIN + KEY "VAL_MEDIO" + PROMPT 10 1 "" + PICTURE "###.###.##@" + MESSAGE _USER,VAL2 + GROUP 2 FG_COL2 + END NUMERO 243 15 BEGIN KEY "VAL2" PROMPT 9 1 "" PICTURE "##.###.###.##@" - MESSAGE _USER,VAL2|ADD,343 + MESSAGE _NUMEXPR,#283*#241|ADD,343 GROUP 2 FG_COL2 END - NUMERO 283 12 + + NUMERO 284 12 BEGIN KEY "VAL_MEDIO" - PROMPT 10 1 "" + PROMPT 12 1 "" PICTURE "###.###.##@" - MESSAGE _NUMEXPR,#243/#241 - GROUP 2 FG_COL2 + MESSAGE _USER,VAL3 + GROUP 2 FG_COL3 END NUMERO 244 15 BEGIN KEY "VAL3" PROMPT 11 1 "" PICTURE "##.###.###.##@" - MESSAGE _USER,VAL3|ADD,344 + MESSAGE _NUMEXPR,#284*#241|ADD,344 GROUP 2 FG_COL3 END - NUMERO 284 12 + + NUMERO 285 12 BEGIN KEY "VAL_MEDIO" - PROMPT 12 1 "" + PROMPT 14 1 "" PICTURE "###.###.##@" - MESSAGE _NUMEXPR,#244/#241 - GROUP 2 FG_COL3 + MESSAGE _USER,VAL4 + GROUP 2 FG_COL4 END NUMERO 245 15 BEGIN KEY "COL4" PROMPT 13 1 "" PICTURE "##.###.###.##@" - MESSAGE _USER,VAL4|ADD,345 + MESSAGE _NUMEXPR,#285*#241|ADD,345 GROUP 2 FG_COL4 END - NUMERO 285 12 + + NUMERO 286 12 BEGIN KEY "VAL_MEDIO" - PROMPT 14 1 "" + PROMPT 16 1 "" PICTURE "###.###.##@" - MESSAGE _NUMEXPR,#245/#241 - GROUP 2 FG_COL4 + MESSAGE _USER,VAL5 + GROUP 2 FG_COL5 END NUMERO 246 15 BEGIN KEY "COL5" PROMPT 15 1 "" PICTURE "##.###.###.##@" - MESSAGE _USER,VAL5|ADD,346 + MESSAGE _NUMEXPR,#286*#241|ADD,346 GROUP 2 FG_COL5 END - NUMERO 286 12 + + NUMERO 287 12 BEGIN KEY "VAL_MEDIO" - PROMPT 16 1 "" + PROMPT 18 1 "" PICTURE "###.###.##@" - MESSAGE _NUMEXPR,#246/#241 - GROUP 2 FG_COL5 + MESSAGE _USER,VAL6 + GROUP 2 FG_COL6 END NUMERO 247 15 BEGIN KEY "COL6" PROMPT 17 1 "" PICTURE "##.###.###.##@" - MESSAGE _USER,VAL6|ADD,347 - GROUP 2 FG_COL6 - END - NUMERO 287 12 - BEGIN - KEY "VAL_MEDIO" - PROMPT 18 1 "" - PICTURE "###.###.##@" - MESSAGE _NUMEXPR,#246/#241 + MESSAGE _NUMEXPR,#287*#241|ADD,347 GROUP 2 FG_COL6 END END // tot ggiac4 @@ -993,7 +1006,7 @@ SECTION BODY ODD 1 COLUMNWISE NUMERO 582 12 BEGIN KEY "VAL_MEDIO" - PROMPT 18 1 "" + PROMPT 8 1 "" PICTURE "###.###.##@" MESSAGE _NUMEXPR,#542/#541 GROUP 5 FG_COL1 @@ -1001,7 +1014,7 @@ SECTION BODY ODD 1 COLUMNWISE NUMERO 543 15 BEGIN KEY "COL2" - PROMPT 8 1 "" + PROMPT 9 1 "" PICTURE "##.###.###.##@" MESSAGE ADD,643 GROUP 5 FG_COL2 @@ -1009,7 +1022,7 @@ SECTION BODY ODD 1 COLUMNWISE NUMERO 583 12 BEGIN KEY "VAL_MEDIO" - PROMPT 18 1 "" + PROMPT 10 1 "" PICTURE "###.###.##@" MESSAGE _NUMEXPR,#543/#541 GROUP 5 FG_COL2 @@ -1017,7 +1030,7 @@ SECTION BODY ODD 1 COLUMNWISE NUMERO 544 15 BEGIN KEY "COL3" - PROMPT 9 1 "" + PROMPT 11 1 "" PICTURE "##.###.###.##@" MESSAGE ADD,644 GROUP 5 FG_COL3 @@ -1025,7 +1038,7 @@ SECTION BODY ODD 1 COLUMNWISE NUMERO 584 12 BEGIN KEY "VAL_MEDIO" - PROMPT 18 1 "" + PROMPT 12 1 "" PICTURE "###.###.##@" MESSAGE _NUMEXPR,#544/#541 GROUP 5 FG_COL3 @@ -1033,7 +1046,7 @@ SECTION BODY ODD 1 COLUMNWISE NUMERO 545 15 BEGIN KEY "COL4" - PROMPT 10 1 "" + PROMPT 13 1 "" PICTURE "##.###.###.##@" MESSAGE ADD,645 GROUP 5 FG_COL4 @@ -1041,7 +1054,7 @@ SECTION BODY ODD 1 COLUMNWISE NUMERO 585 12 BEGIN KEY "VAL_MEDIO" - PROMPT 18 1 "" + PROMPT 14 1 "" PICTURE "###.###.##@" MESSAGE _NUMEXPR,#545/#541 GROUP 5 FG_COL4 @@ -1049,7 +1062,7 @@ SECTION BODY ODD 1 COLUMNWISE NUMERO 546 15 BEGIN KEY "COL5" - PROMPT 11 1 "" + PROMPT 15 1 "" PICTURE "##.###.###.##@" MESSAGE ADD,646 GROUP 5 FG_COL5 @@ -1057,7 +1070,7 @@ SECTION BODY ODD 1 COLUMNWISE NUMERO 586 12 BEGIN KEY "VAL_MEDIO" - PROMPT 18 1 "" + PROMPT 16 1 "" PICTURE "###.###.##@" MESSAGE _NUMEXPR,#546/#541 GROUP 5 FG_COL5 @@ -1065,7 +1078,7 @@ SECTION BODY ODD 1 COLUMNWISE NUMERO 547 15 BEGIN KEY "giac" - PROMPT 12 1 "" + PROMPT 17 1 "" PICTURE "##.###.###.##@" MESSAGE ADD,647 GROUP 5 FG_COL6 @@ -1861,7 +1874,7 @@ SECTION BODY ODD 1 COLUMNWISE NUMERO 1282 12 BEGIN KEY "VALMEDIO" - PROMPT 18 1 "" + PROMPT 8 1 "" PICTURE "###.###.##@" MESSAGE _NUMEXPR,#1242/#1241 GROUP 12 FG_COL1 @@ -1869,7 +1882,7 @@ SECTION BODY ODD 1 COLUMNWISE NUMERO 1243 15 BEGIN KEY "COL2" - PROMPT 8 1 "" + PROMPT 9 1 "" PICTURE "##.###.###.##@" MESSAGE ADD,1343 GROUP 12 FG_COL2 @@ -1877,7 +1890,7 @@ SECTION BODY ODD 1 COLUMNWISE NUMERO 1283 12 BEGIN KEY "VALMEDIO" - PROMPT 18 1 "" + PROMPT 10 1 "" PICTURE "###.###.##@" MESSAGE _NUMEXPR,#1243/#1241 GROUP 12 FG_COL2 @@ -1885,7 +1898,7 @@ SECTION BODY ODD 1 COLUMNWISE NUMERO 1244 15 BEGIN KEY "COL3" - PROMPT 9 1 "" + PROMPT 11 1 "" PICTURE "##.###.###.##@" MESSAGE ADD,1344 GROUP 12 FG_COL3 @@ -1893,7 +1906,7 @@ SECTION BODY ODD 1 COLUMNWISE NUMERO 1284 12 BEGIN KEY "VALMEDIO" - PROMPT 18 1 "" + PROMPT 12 1 "" PICTURE "###.###.##@" MESSAGE _NUMEXPR,#1244/#1241 GROUP 12 FG_COL3 @@ -1901,7 +1914,7 @@ SECTION BODY ODD 1 COLUMNWISE NUMERO 1245 15 BEGIN KEY "COL4" - PROMPT 10 1 "" + PROMPT 13 1 "" PICTURE "##.###.###.##@" MESSAGE ADD,1345 GROUP 12 FG_COL4 @@ -1909,7 +1922,7 @@ SECTION BODY ODD 1 COLUMNWISE NUMERO 1285 12 BEGIN KEY "VALMEDIO" - PROMPT 18 1 "" + PROMPT 14 1 "" PICTURE "###.###.##@" MESSAGE _NUMEXPR,#1245/#1241 GROUP 12 FG_COL4 @@ -1917,7 +1930,7 @@ SECTION BODY ODD 1 COLUMNWISE NUMERO 1246 15 BEGIN KEY "COL5" - PROMPT 11 1 "" + PROMPT 15 1 "" PICTURE "##.###.###.##@" MESSAGE ADD,1346 GROUP 12 FG_COL5 @@ -1925,7 +1938,7 @@ SECTION BODY ODD 1 COLUMNWISE NUMERO 1286 12 BEGIN KEY "VALMEDIO" - PROMPT 18 1 "" + PROMPT 16 1 "" PICTURE "###.###.##@" MESSAGE _NUMEXPR,#1246/#1241 GROUP 12 FG_COL5 @@ -1933,7 +1946,7 @@ SECTION BODY ODD 1 COLUMNWISE NUMERO 1247 15 BEGIN KEY "giac" - PROMPT 12 1 "" + PROMPT 17 1 "" PICTURE "##.###.###.##@" MESSAGE ADD,1347 GROUP 12 FG_COL6 @@ -2209,7 +2222,7 @@ SECTION BODY ODD 1 COLUMNWISE STRINGA 51 20 BEGIN KEY "CODICE" - PROMPT 2 1 " Deposito" + PROMPT 2 1 "Deposito " END STRINGA 50 30 BEGIN @@ -2228,6 +2241,7 @@ SECTION BODY ODD 1 COLUMNWISE PROMPT 6 1 "" PICTURE "########,@##" MESSAGE _USER,VALIDATE_UM,53|ADD,141 + GROUP 15 END NUMERO 42 15 BEGIN @@ -2327,6 +2341,7 @@ SECTION BODY ODD 1 COLUMNWISE END END // tot depositi END // MAGAZZ + SECTION TOT_MAGAZZINO 1 1 1 GROUP STRINGA 150 30 BEGIN @@ -2357,7 +2372,6 @@ SECTION BODY ODD 1 COLUMNWISE KEY "VAL1" PROMPT 7 1 "" PICTURE "##.###.###.##@" - MESSAGE ADD,242 GROUP 1 END NUMERO 182 12 @@ -2373,7 +2387,6 @@ SECTION BODY ODD 1 COLUMNWISE KEY "VAL2" PROMPT 9 1 "" PICTURE "##.###.###.##@" - MESSAGE ADD,243 GROUP 1 FG_COL2 END NUMERO 183 12 @@ -2389,23 +2402,21 @@ SECTION BODY ODD 1 COLUMNWISE KEY "VAL3" PROMPT 11 1 "" PICTURE "##.###.###.##@" - MESSAGE ADD,244 GROUP 1 FG_COL3 END - NUMERO 184 15 + NUMERO 184 12 BEGIN KEY "VAL1" PROMPT 12 1 "" - PICTURE "##.###.###.##@" + PICTURE "###.###.##@" MESSAGE _NUMEXPR,#144/#141 GROUP 1 FG_COL3 END - NUMERO 145 12 + NUMERO 145 15 BEGIN KEY "VAL4" PROMPT 13 1 "" PICTURE "##.###.###.##@" - MESSAGE ADD,245 GROUP 1 FG_COL4 END NUMERO 185 12 @@ -2421,7 +2432,6 @@ SECTION BODY ODD 1 COLUMNWISE KEY "VAL5" PROMPT 15 1 "" PICTURE "##.###.###.##@" - MESSAGE ADD,246 GROUP 1 FG_COL5 END NUMERO 186 12 @@ -2437,7 +2447,6 @@ SECTION BODY ODD 1 COLUMNWISE KEY "VAL6" PROMPT 17 1 "" PICTURE "##.###.###.##@" - MESSAGE ADD,247 GROUP 1 FG_COL6 END NUMERO 187 12 diff --git a/mg/mg4300.frm b/mg/mg4300.frm index bf6605c78..37da1048b 100755 --- a/mg/mg4300.frm +++ b/mg/mg4300.frm @@ -21,8 +21,8 @@ END GENERAL BEGIN OFFSET 0 1 - FONT "Courier New" - SIZE 10 + //FONT "Courier New" + //SIZE 10 END SECTION HEADER ODD 5 @@ -62,11 +62,11 @@ SECTION HEADER ODD 5 END NUMBER 8 12 BEGIN - PROMPT 57 4 "Prezzo" + PROMPT 63 4 "Prezzo" END NUMBER 9 12 BEGIN - PROMPT 69 4 "Valore" + PROMPT 76 4 "Valore" END STRINGA 5 80 BEGIN @@ -82,7 +82,7 @@ SECTION BODY ODD 2 MESSAGE RESET,3@ END - STRINGA 101 70 + STRINGA 101 150 BEGIN FLAGS "H" PROMPT 1 1 "" @@ -154,7 +154,7 @@ SECTION BODY ODD 2 SECTION TOTALI_RAGG_FISC 1 1 1 NUMEXPR #FF_QTARAGGFIS!=0 SECTION HEADER_RAGG_CRONO 1 2 1 NUMEXPR #FF_NUMLINEE=0 - STRINGA FF_INFORAGGCRO 48 + STRINGA FF_INFORAGGCRO 150 BEGIN PROMPT 1 1 "" MESSAGE _USER,INCNUMREGST @@ -165,7 +165,7 @@ SECTION BODY ODD 2 PROMPT 10 1 "Causale: " FIELD LF_MOVMAG->CODCAUS // == FIELD ALIAS_CAUSALI@->CODTAB END - STRINGA 101 30 + STRINGA 101 50 BEGIN PROMPT 31 1 "" FIELD ALIAS_CAUSALI@->S0 diff --git a/mg/mginst.ini b/mg/mginst.ini index 814a87424..8c5f33b1a 100755 --- a/mg/mginst.ini +++ b/mg/mginst.ini @@ -1,9 +1,9 @@ [mg] -Data = 08-05-1998 +Data = 08-06-1998 Descrizione = Magazzino Dischi = 1 Moduli = ba,ve9,cg9 -Patch = 26 +Patch = 53 PostProcess = PreProcess = Prezzo(1) = 900,300 @@ -17,7 +17,7 @@ Versione = 19980103 [mg0] File(0) = mg00.bmp File(1) = mgarea.men -Patch = 26 +Patch = 53 Versione = 19980103 [mg1] @@ -26,48 +26,50 @@ File(3) = batbfcg.msk File(4) = batbgcg.msk File(5) = batbubi.msk File(6) = mg01.bmp -File(7) = mg1.exe -File(8) = mg1100.msk +File(7) = mg1.exe|X +File(8) = mg1100.msk|X File(9) = mg1200.msk File(10) = mg1400.msk -File(11) = mg3.exe -File(12) = mg3100.msk -File(13) = mg3100a.frm -File(14) = mg3100b.frm -File(15) = mg3200.msk -File(16) = mg3200a.frm -File(17) = mg3200b.frm -File(18) = mg3300.msk -File(19) = mg3300a.frm -File(20) = mg3300b.frm -File(21) = mg3400.msk -File(22) = mg3400a.frm -File(23) = mg3400b.frm -File(24) = mg3500.frm -File(25) = mg3500.msk -File(26) = mg4.exe -File(27) = mg4100.frm -File(28) = mg4100.msk -File(29) = mg4200.msk -File(30) = mg4200a.frm -File(31) = mg4200b.frm -File(32) = mg4300.frm -File(33) = mg4300.msk -File(34) = mgprassi.men -File(35) = tab_fcg.frm -Patch = 26 +File(11) = mg3.exe|X +File(12) = mg3100.msk|X +File(13) = mg3100a.frm|X +File(14) = mg3100aa.frm|X +File(15) = mg3100b.frm|X +File(16) = mg3200.msk|X +File(17) = mg3200a.frm|X +File(18) = mg3200b.frm|X +File(19) = mg3300.msk|X +File(20) = mg3300a.frm|X +File(21) = mg3300b.frm|X +File(22) = mg3400.msk +File(23) = mg3400a.frm +File(24) = mg3400b.frm +File(25) = mg3500.frm +File(26) = mg3500.msk +File(27) = mg4.exe|X +File(28) = mg4100.frm|X +File(29) = mg4100.msk +File(30) = mg4200.msk|X +File(31) = mg4200a.frm|X +File(32) = mg4200aa.frm|X +File(33) = mg4200b.frm|X +File(34) = mg4300.frm +File(35) = mg4300.msk +File(36) = mgprassi.men +File(37) = tab_fcg.frm +Patch = 53 Versione = 19980103 [mg9] -File(36) = mgprassi.hlp|X -File(37) = recdesc\f109.dir -File(38) = recdesc\f109.trr -File(39) = recdesc\f110.dir -File(40) = recdesc\f110.trr -File(41) = recdesc\f111.dir -File(42) = recdesc\f111.trr -File(43) = recdesc\f114.dir -File(44) = recdesc\f114.trr -Patch = 26 +File(38) = mgprassi.hlp +File(39) = recdesc\f109.dir +File(40) = recdesc\f109.trr +File(41) = recdesc\f110.dir +File(42) = recdesc\f110.trr +File(43) = recdesc\f111.dir +File(44) = recdesc\f111.trr +File(45) = recdesc\f114.dir +File(46) = recdesc\f114.trr +Patch = 53 Versione = 19980103 diff --git a/mg/mglib.h b/mg/mglib.h index bf49074c4..792de75e8 100755 --- a/mg/mglib.h +++ b/mg/mglib.h @@ -52,9 +52,9 @@ class TSheet_field; typedef enum { - riga_nongenerata=' ', - riga_automatica='A', - riga_dadocumento='D' + riga_dadocumento='D', // derivata da documento + riga_automatica='A', // generata da causale collegata + riga_nongenerata=' ' // immissione direttta del mov. } TTipo_rigamovmag; char * Nome_valorizz[]; @@ -64,6 +64,7 @@ typedef enum { valorizz_przlist, valorizz_coststd, valorizz_costmedio, + valorizz_costmediopond, valorizz_FIFOa, valorizz_LIFOa, valorizz_FIFO, @@ -155,12 +156,15 @@ public: // Si suppone che i saldi siano coerenti con i movimenti (effettuare una rebuild_balances() // di oldes. bool riporta_saldi(const char * oldes, const char* newes, const TTipo_valorizz tipo, const char * catven ,const char * codlist); + // La seguente funzione azzera tutti i saldi di mgazzino per l'esercizio cod_es + bool azzera_saldi(const char * cod_es); real ultimo_costo(const char * annoes) const; real media_costi(const char * annoes) const; real prezzo_listino(const char * annoes, const char * catven ,const char * codlist) const; real costo_standard(const char * annoes) const; real costo_medio(const char * annoes, const char * codmag, const char * livello) const; + real costo_mediopond(const char * annoes, const char * codmag, const char * livello) const; real LIFO_annuale(const char * annoes, const char * codmag, const char * livello, bool giacenza_effettiva = TRUE, bool valorizza_componenti = TRUE) const; real FIFO_annuale(const char * annoes, const char * codmag, const char * livello, @@ -222,6 +226,8 @@ class TCodice_livelli : public TObject { long _last_firm; + bool _autoinsert[MANY_MAG_LEV]; + bool _codiceadata[MANY_MAG_LEV]; int _code_length[MANY_MAG_LEV]; TString _name[MANY_MAG_LEV]; TString _picture[MANY_MAG_LEV]; @@ -257,8 +263,11 @@ public: const int code_start(int levnum) const ; // Ritorna la lunghezza del codice compatto fino a quel livello const int packed_length(int levnum) const ; + // Restituisce se esiste il gruppo dato il codice compatto + const int group_search(const char * packed_code, int levnum) const; // Restituisce la descrizione del gruppo dato il codice compatto const TString & group_descr(const char * packed_code, int levnum) 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; @@ -270,6 +279,10 @@ public: 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 + const bool autoinsert (int levnum) const ; + // Ritorna se il codice del livello rappresenta una data + const bool codiceadata(int levnum) const ; /* bool has_mandchars(const char * pattern); bool has_opzchars(const char * pattern); @@ -366,9 +379,15 @@ public: const TString & raggfisc() {return get("S8");} const TString & caus_collegata() {return get("S9");} int sgn(TTipo_saldomag fieldname) ; - bool update_qta() {return !get_bool("B1");} - bool update_val() {return !get_bool("B0");} - bool update_ultcos() {return get_bool("B2");} + bool update_qta() const {return !get_bool("B1");} + bool update_val() const {return !get_bool("B0");} + bool update_ultcos() const {return get_bool("B2");} + bool esplodente() const {return get_bool("B3");} + const TString & default_magdep() const {return get("S10");} + bool has_default_mag() const {return get("S10")[0]>' ';} + bool has_default_dep() const {return get("S10")[3]>' ';} + const char *default_mag() const {return get("S10").sub(1,3);} + const char *default_dep() const {return get("S10").sub(4,5);} bool is_fiscale(); TCausale_magazzino(const char * codice); virtual ~TCausale_magazzino() {} @@ -425,6 +444,12 @@ protected: // @member: restituisce il prezzo della riga automatica accoppiata a virtual const char * prezzo_rauto(int r) {return NULL;} + // aggiunge le righe automatiche e da esplosione + void add_extrarows() const; + // aggiunge le righe automatiche + bool add_autorows() const; + // aggiunge le righe da esplosione + bool add_explrows() const; public: // IO ad alto livello const char *get_next_key() ; @@ -444,7 +469,10 @@ public: }; -bool rebuild_balances(const TString16 annoes/*, bool reset_giac=FALSE*/); +bool rebuild_balances(const TString16 annoes, + const TTipo_valorizz tipo=valorizz_costmediopond, + const char* catven=NULL, + const char* codlis=NULL); #define FORM_MAXGIACLEV 4 // numero di livelli giacenza nel form #define FORM_MAXARTLEV 8 // numero di livelli codice nel form @@ -593,3 +621,4 @@ public: }; #endif //__MGLIB_H + diff --git a/mg/mglib01.cpp b/mg/mglib01.cpp index 589373e0b..bcf579e67 100755 --- a/mg/mglib01.cpp +++ b/mg/mglib01.cpp @@ -127,7 +127,7 @@ bool TStateset::is_empty() const bool TStateset::is_member(int e) const { - return ((e< MAXSTATES && e>=0) ? (_container[e] != 0) : FALSE ); + return (e >= 0 && e < MAXSTATES) ? (_container[e] != 0) : FALSE; } int TStateset::get_first() @@ -622,6 +622,8 @@ void TCodice_livelli::load(bool enabled, const char *tabname,const char *tabgrp) _name[i]=""; _code_length[i]=0; _picture[i]=""; + _autoinsert[i]=FALSE; + _codiceadata[i]=FALSE; } if (_lev_enabled) { @@ -630,6 +632,8 @@ void TCodice_livelli::load(bool enabled, const char *tabname,const char *tabgrp) { _name[i]=_tabformato.get("S0"); _picture[i]=_tabformato.get("S1"); + _autoinsert[i]=_tabformato.get_bool("B0"); + _codiceadata[i]=_tabformato.get_bool("B1"); _code_length[i]=TMetachar::maxstrlen(_picture[i]); _last_level=i+1; e = _tabformato.next(); @@ -710,6 +714,22 @@ const TString & TCodice_livelli::name(int levnum) const return(_name[0]); // empty } + +const bool TCodice_livelli::autoinsert(int levnum) const +{ + if (levnum<=MANY_MAG_LEV && levnum>=0) + return _autoinsert[levnum]; + else + return FALSE; +} +const bool TCodice_livelli::codiceadata(int levnum) const +{ + if (levnum<=MANY_MAG_LEV && levnum>=0) + return _codiceadata[levnum]; + else + return FALSE; +} + const TString & TCodice_livelli::picture(int levnum) const { if (levnum<=MANY_MAG_LEV && levnum>0) @@ -754,6 +774,13 @@ const TString & TCodice_livelli::group_descr(const char * packed_code, int levnu return _gruppi->decode(build_tabcode(packed_code,levnum)); } +const int TCodice_livelli::group_search(const char * packed_code, int levnum) const +{ + _gruppi->decode(build_tabcode(packed_code,levnum)); + return _gruppi->io_result(); +} + + void TCodice_livelli::set_sheetcolumn(TSheet_field &fld_righe,int field, int lev) const { if (enabled(lev)) diff --git a/mg/mglib02.cpp b/mg/mglib02.cpp index b9438f633..8fc10bbb7 100755 --- a/mg/mglib02.cpp +++ b/mg/mglib02.cpp @@ -5,9 +5,14 @@ #include #include +#include #include #include "mglib.h" +#include "anamag.h" +#include "mag.h" + +#ifndef __CGLIB01_H #include "..\cg\cglib01.h" #include "..\ve\veconf.h" @@ -16,7 +21,8 @@ char * Nome_valorizz[]= { "Ultimo costo", "Media ultimi costi", "Prezzo di listino", - "Costo standard", "Costo medio" , + "Costo standard", "Costo medio acquisto" , + "Costo medio ponderato" , "FIFO annuale", "LIFO annuale", "FIFO", "LIFO", "FIFO Ragionieristico", "LIFO Ragionieristico" @@ -369,6 +375,34 @@ TRecord_array & TArticolo_giacenza::storico(const char * annoesrif) const HIDDEN int last_esercizio = -1; +bool TArticolo_giacenza::azzera_saldi(const char * cod_es) +{ + TRecord_array& rec_arr = TArticolo_giacenza::mag(cod_es); + + const int last = rec_arr.last_row(); + for (int r = last;r > 0 ; r = rec_arr.pred_row(r)) // Scorre le righe + { + TRectype& mag = rec_arr[r]; + + mag.put(MAG_GIAC,0); + mag.put(MAG_RIM,0);mag.put(MAG_VALRIM,0); + mag.put(MAG_ACQ,0);mag.put(MAG_VALACQ,0); + mag.put(MAG_ENT,0);mag.put(MAG_VALENT,0); + mag.put(MAG_VEN,0);mag.put(MAG_VALVEN,0); + mag.put(MAG_USC,0);mag.put(MAG_VALUSC,0); + mag.put(MAG_ORDF,0);mag.put(MAG_VALORDF,0); + mag.put(MAG_ORDC,0);mag.put(MAG_VALORDC,0); + mag.put(MAG_SCARTI,0);mag.put(MAG_VALSCARTI,0); + mag.put(MAG_PRODCOMP,0); + mag.put(MAG_PRODFIN,0); + mag.put(MAG_INCL,0); + mag.put(MAG_ACL,0); + mag.put(MAG_NLABEL,0); + } + return rec_arr.write(TRUE) == NOERR; +} + + bool TArticolo_giacenza::riporta_saldi(const char * oldes, const char* newes, const TTipo_valorizz tipo, const char* catven, const char* codlis) { TString codes(newes), mag, liv; @@ -380,7 +414,7 @@ bool TArticolo_giacenza::riporta_saldi(const char * oldes, const char* newes, co for (int r = last;r > 0 ; r = rec_arr.pred_row(r)) // Scorre le righe { TRectype& rec = rec_arr[r]; - mag = rec.get(MAG_CODMAG); + mag = rec.get(MAG_CODMAG); mag.cut(3); liv = rec.get(MAG_LIVELLO); giac = rec.get_real(MAG_GIAC); inpf = rec.get_real(MAG_PRODFIN); @@ -393,6 +427,9 @@ bool TArticolo_giacenza::riporta_saldi(const char * oldes, const char* newes, co case valorizz_costmedio: val = costo_medio(oldes, mag, liv); break; + case valorizz_costmediopond: + val = costo_mediopond(oldes, mag, liv); + break; case valorizz_ultcos: val = ultimo_costo(oldes); break; @@ -519,8 +556,12 @@ real TArticolo_giacenza::costo_medio(const char * annoes, const char * codmag, c { real acq; real valacq; + + CHECK(strlen(codmag)<=3, "Non è più possibile avere valorizzazione a livello di deposito"); + TRecord_array & rmag = mag(annoes); - for (int i = find_mag(annoes, codmag, livello); i > 0; i = find_mag(annoes, codmag, livello, i)) + for (int i = find_mag(annoes, codmag, livello); i > 0; + i = find_mag(annoes, codmag, livello, i)) { const TRectype & rec = rmag.row(i); @@ -530,10 +571,34 @@ real TArticolo_giacenza::costo_medio(const char * annoes, const char * codmag, c return acq == ZERO ? costo_standard(annoes) : valacq / acq; } +// costo medio ponderato per periodi pari alla durata dell'esercizio +real TArticolo_giacenza::costo_mediopond(const char * annoes, const char * codmag, const char * livello) const +{ + real acq; + real valacq; + + CHECK(strlen(codmag)<=3, "Non è più possibile avere valorizzazione a livello di deposito"); + + TRecord_array & rmag = mag(annoes); + for (int i = find_mag(annoes, codmag, livello); i > 0; i = find_mag(annoes, codmag, livello, i)) + { + const TRectype & rec = rmag.row(i); + + acq += rec.get_real(MAG_ACQ) ; + acq += rec.get_real(MAG_RIM) ; + valacq += rec.get_real(MAG_VALACQ); + valacq += rec.get_real(MAG_VALRIM); + } + return acq == ZERO ? costo_standard(annoes) : valacq / acq; +} + + real TArticolo_giacenza::LIFO_annuale(const char * annoes, const char * codmag, const char * livello, - bool giacenza_effettiva, bool valorizza_componenti) const + bool giac_eff, bool valorizza_componenti) const { + CHECK(strlen(codmag)<=3, "Non è più possibile avere valorizzazione a livello di deposito"); + real rim; real valrim; real acq; @@ -548,7 +613,7 @@ real TArticolo_giacenza::LIFO_annuale(const char * annoes, const char * codmag, valrim += rec.get_real(MAG_VALRIM); acq += rec.get_real(MAG_ACQ); valacq += rec.get_real(MAG_VALACQ); - giacenza += giacenza_corretta(rec,giacenza_effettiva,valorizza_componenti); + giacenza += giacenza_corretta(rec,giac_eff,valorizza_componenti); } if (giacenza <= ZERO) return ZERO; @@ -558,8 +623,9 @@ real TArticolo_giacenza::LIFO_annuale(const char * annoes, const char * codmag, } real TArticolo_giacenza::FIFO_annuale(const char * annoes, const char * codmag, const char * livello, - bool giacenza_effettiva, bool valorizza_componenti) const + bool giac_eff, bool valorizza_componenti) const { + CHECK(strlen(codmag)<=3, "Non è più possibile avere valorizzazione a livello di deposito"); real rim; real valrim; real acq; @@ -574,14 +640,7 @@ real TArticolo_giacenza::FIFO_annuale(const char * annoes, const char * codmag, valrim += rec.get_real(MAG_VALRIM); acq += rec.get_real(MAG_ACQ); valacq += rec.get_real(MAG_VALACQ); - giacenza += rec.get_real(MAG_GIAC); - if (giacenza_effettiva) - { - giacenza += rec.get_real(MAG_INCL); - giacenza -= rec.get_real(MAG_ACL); - giacenza += valorizza_componenti ? rec.get_real(MAG_PRODCOMP) : rec.get_real(MAG_PRODFIN); - - } + giacenza += giacenza_corretta(rec,giac_eff,valorizza_componenti); } if (giacenza <= ZERO) return ZERO; @@ -592,8 +651,9 @@ real TArticolo_giacenza::FIFO_annuale(const char * annoes, const char * codmag, } real TArticolo_giacenza::LIFO(const char * annoes, const char * codmag, const char * livello, - bool giacenza_effettiva, bool valorizza_componenti) const + bool giac_eff, bool valorizza_componenti) const { + CHECK(strlen(codmag)<=3, "Non è più possibile avere valorizzazione a livello di deposito"); real rim; real valrim; real acq; @@ -608,14 +668,7 @@ real TArticolo_giacenza::LIFO(const char * annoes, const char * codmag, const ch valrim += rec.get_real(MAG_VALRIM); acq += rec.get_real(MAG_ACQ); valacq += rec.get_real(MAG_VALACQ); - giacenza += rec.get_real(MAG_GIAC); - if (giacenza_effettiva) - { - giacenza += rec.get_real(MAG_INCL); - giacenza -= rec.get_real(MAG_ACL); - giacenza += valorizza_componenti ? rec.get_real(MAG_PRODCOMP) : rec.get_real(MAG_PRODFIN); - - } + giacenza += giacenza_corretta(rec,giac_eff,valorizza_componenti); } if (giacenza <= ZERO) @@ -647,8 +700,9 @@ real TArticolo_giacenza::LIFO(const char * annoes, const char * codmag, const ch } real TArticolo_giacenza::FIFO(const char * annoes, const char * codmag, const char * livello, - bool giacenza_effettiva, bool valorizza_componenti) const + bool giac_eff, bool valorizza_componenti) const { + CHECK(strlen(codmag)<=3, "Non è più possibile avere valorizzazione a livello di deposito"); real rim; real valrim; real acq; @@ -663,14 +717,7 @@ real TArticolo_giacenza::FIFO(const char * annoes, const char * codmag, const ch valrim += rec.get_real(MAG_VALRIM); acq += rec.get_real(MAG_ACQ); valacq += rec.get_real(MAG_VALACQ); - giacenza += rec.get_real(MAG_GIAC); - if (giacenza_effettiva) - { - giacenza += rec.get_real(MAG_INCL); - giacenza -= rec.get_real(MAG_ACL); - giacenza += valorizza_componenti ? rec.get_real(MAG_PRODCOMP) : rec.get_real(MAG_PRODFIN); - - } + giacenza += giacenza_corretta(rec,giac_eff,valorizza_componenti); } if (giacenza <= ZERO) @@ -711,22 +758,25 @@ real TArticolo_giacenza::FIFO(const char * annoes, const char * codmag, const ch } real TArticolo_giacenza::FIFO_ragionieristico(const char * annoes, const char * codmag, const char * livello, - bool giacenza_effettiva, bool valorizza_componenti) const + bool giac_eff, bool valorizza_componenti) const { + CHECK(strlen(codmag)<=3, "Non è più possibile avere valorizzazione a livello di deposito"); return ZERO; // da implementare } real TArticolo_giacenza::LIFO_ragionieristico(const char * annoes, const char * codmag, const char * livello, - bool giacenza_effettiva, bool valorizza_componenti) const + bool giac_eff, bool valorizza_componenti) const { + CHECK(strlen(codmag)<=3, "Non è più possibile avere valorizzazione a livello di deposito"); return ZERO; // da implementare } -real TArticolo_giacenza::giacenza_corretta(const TRectype & rec ,bool giacenza_effettiva,bool valorizza_componenti) const +// calcola la giacenza corretta dai campi Conto Lavoro e Produzione +real TArticolo_giacenza::giacenza_corretta(const TRectype & rec ,bool giac_eff,bool valorizza_componenti) const { CHECK(rec.num() == LF_MAG, "Il record passato deve essere di LF_MAG"); real giacenza(rec.get_real(MAG_GIAC)); - if (giacenza_effettiva) + if (giac_eff) { giacenza += rec.get_real(MAG_INCL); giacenza -= rec.get_real(MAG_ACL); @@ -924,662 +974,3 @@ TCondizione_vendita::TCondizione_vendita(TConfig * ditta, { } - -// ********************* -// movimenti di magazzino - -// causali - -int TCausale_magazzino::sgn(TTipo_saldomag tiposaldo) -{ - static TString80 segni; - segni=get("S2"); - switch (tiposaldo) - { - case s_giac: - return atoi(segni.mid(0,2)); - case s_acq: - return atoi(segni.mid(2,2)); - case s_ent: - return atoi(segni.mid(4,2)); - case s_ven: - return atoi(segni.mid(6,2)); - case s_usc: - return atoi(segni.mid(8,2)); - case s_ordc: - return atoi(segni.mid(10,2)); - case s_ordf: - return atoi(segni.mid(12,2)); - case s_incl: - return atoi(segni.mid(14,2)); - case s_acl: - return atoi(segni.mid(16,2)); - case s_prodc: - return atoi(segni.mid(18,2)); - case s_prodf: - return atoi(segni.mid(20,2)); - case s_rim: - return atoi(segni.mid(22,2)); - case s_scart: - return atoi(segni.mid(24,2)); - case s_label: - return atoi(segni.mid(26,2)); - case s_user1: - return atoi(segni.mid(28,2)); - case s_user2: - return atoi(segni.mid(30,2)); - case s_user3: - return atoi(segni.mid(32,2)); - case s_user4: - return atoi(segni.mid(34,2)); - case s_user5: - return atoi(segni.mid(36,2)); - case s_user6: - return atoi(segni.mid(38,2)); - default: - return 0; - } -} - -bool TCausale_magazzino::is_fiscale() -{ - return (tipomov()=='S' || tipomov()=='C' ); -} - - -TCausale_magazzino::TCausale_magazzino(const char * codice): - TRectype(LF_TABCOM) -{ - TTable f("%CAU"); - - settab("CAU"); - put("CODTAB", codice); - if (TRectype::read(f) != NOERR) - zero(); -} - -// movimenti -// dati della linea di movimento di magazzino -class TLine_movmag : public TObject -{ - TString16 _codcaus; - TString16 _um; - real _quant; - real _prezzo; -public: - const TString16 &codcaus() const {return _codcaus;} - const TString16 &um() const {return _um;} - const real &quant() const {return _quant;} - const real &prezzo() const {return _prezzo;} - void set(const TString16 cau,const TString16 um,const real q, const real p); - int operator==(TLine_movmag &); - - virtual TObject* dup() const {return new TLine_movmag(*this);}; - - TLine_movmag() {}; - TLine_movmag(const TLine_movmag &); - virtual ~TLine_movmag() {}; -}; - -void TLine_movmag ::set(const TString16 cau,const TString16 um,const real q, const real p) -{ - _codcaus=cau; - _um=um; - _quant=q; - _prezzo=p; -} - -TLine_movmag ::TLine_movmag(const TLine_movmag &l) -{ - _codcaus=l._codcaus; - _um=l._um; - _quant=l._quant; - _prezzo=l._prezzo; -} - -int TLine_movmag::operator==(TLine_movmag &l) -{ - return (_codcaus==l._codcaus)&&(_um==l._um)&&(_quant==l._quant)&&(_prezzo==l._prezzo); -} - - -// ******************************** -// TMov_mag - -TRecord_cache TMov_mag::cache_causali("%CAU"); - -TMov_mag::TMov_mag() : - TMultiple_rectype(LF_MOVMAG), - lines_to_add(), lines_to_subtract() -{ - add_file(LF_RMOVMAG,"NRIG"); -} - -TMov_mag::~TMov_mag() -{ -} - - -void TMov_mag::zero(char c) -{ - TMultiple_rectype::zero(c); - - lines_to_add.destroy(); - lines_to_subtract.destroy(); -} - -// valuta il valore della chiave per un nuovo record -bool TMov_mag::renum() -{ - put("NUMREG",get_next_key()); - return TRUE; -} - -// copia la chiave dal file principale a quello delle righe -void TMov_mag::set_body_key(TRectype & rowrec) -{ - rowrec.put("NUMREG",get("NUMREG")); -} - - -void TMov_mag::synchronize_bodies() -{ - TMultiple_rectype::synchronize_bodies(); - // reset delle strutture per il controlli delle variazioni dei saldi - if (autoload_enabled()) - { - _annoes=get("ANNOES"); - lines_to_add.destroy(); - lines_to_subtract.destroy(); - const int nrows = rows(); - for (int i = 1; i<= nrows; i++) - line_deleted(line2key(i), line2data(i)); - } -} - - -int TMov_mag::remove(TBaseisamfile& f) const -{ - int res; - if ((res=TMultiple_rectype::remove(f))==NOERR ) - // effettua la variazione dei saldi - ((TMov_mag *)this)->update_balances(); - return res; -} - - -void TMov_mag::add_automatiche() -{ - for (int r = rows(); r > 0; r--) - { - TRecord_array & b = body(); - TRectype & row = b[r]; - TString16 codcaus(row.get(RMOVMAG_CODCAUS)); - if (codcaus.empty()) - codcaus=get(MOVMAG_CODCAUS); - TCausale_magazzino & cau=(TCausale_magazzino & )cache_causali.get(codcaus); - codcaus=cau.caus_collegata(); - if (codcaus.not_empty()) - { - // deve esserci una riga collegata - if (!b.exist(r + 1) || b[r + 1].get_char(RMOVMAG_TIPORIGA) != riga_automatica) - { - // manca, la inserisco - TRectype * linea_auto = new TRectype(row); - const char * codmag = codmag_rauto(r); - if (codmag != NULL) - linea_auto->put(RMOVMAG_CODMAG, codmag); - const char * prezzo = prezzo_rauto(r); - if (prezzo != NULL) - linea_auto->put(RMOVMAG_PREZZO, prezzo); - linea_auto->put(RMOVMAG_NRIG, r+1); - linea_auto->put(RMOVMAG_TIPORIGA, (char) riga_automatica); - linea_auto->put(RMOVMAG_CODCAUS, codcaus); - b.insert_row(linea_auto); - } - } - } // ciclo righe -} - -int TMov_mag::write(TBaseisamfile& f) const -{ - int res; - TMov_mag &myself=((TMov_mag &)*this); - myself.add_automatiche(); - - const int nrows = rows(); - - for (int i = 1; i <= nrows; i++) - myself.line_inserted(line2key(i), line2data(i)); - if ((res=TMultiple_rectype::write(f))==NOERR ) - // effettua la variazione dei saldi - myself.update_balances(); - return res; -} - -int TMov_mag::rewrite(TBaseisamfile& f) const -{ - int res; - ((TMov_mag *)this)->add_automatiche(); - // memorizza le variazioni - - const int nrows = rows(); - - for (int i = 1; i <= nrows; i++) - ((TMov_mag *)this)->line_inserted(line2key(i), line2data(i)); - if ((res=TMultiple_rectype::rewrite(f))==NOERR ) - // effettua la variazione dei saldi - ((TMov_mag *)this)->update_balances(); - return res; -} - -const char *TMov_mag::get_next_key() -{ - static TString16 nextcod; - TLocalisamfile f(LF_MOVMAG); - f.last(); - int a=atoi(f.get(MOVMAG_NUMREG))+1; - return nextcod.format("%d",a); -} - -//******* -// gestione delle variazione dei saldi -// -// -int TMov_mag::force_update_bal() -{ - int res; - - // reset delle strutture per il controlli delle variazioni dei saldi - _annoes=get(MOVMAG_ANNOES); - lines_to_add.destroy(); - lines_to_subtract.destroy(); - - // memorizza le variazioni - const int nrows = rows(); - - for (int i= 1; i <= nrows; i++) - line_inserted(line2key(i), line2data(i)); - res=update_balances(); - return res; -} - -// restituisce il valore dei dati -TLine_movmag & TMov_mag::line2data(int nrig) const -{ - static TLine_movmag line; - TRecord_array & b = body(); - - line.set(b.row(nrig).get(RMOVMAG_CODCAUS).blank() ? get(MOVMAG_CODCAUS) : b.row(nrig).get(RMOVMAG_CODCAUS) , - b.row(nrig).get(RMOVMAG_UM), - b.row(nrig).get_real(RMOVMAG_QUANT), - b.row(nrig).get_real(RMOVMAG_PREZZO)); - return line; -} - -TToken_string & TMov_mag::line2key(int numriga) const -{ - static TToken_string _key; - TRecord_array & b = body(); - TString16 nr; - - nr << numriga; - _key.cut(0); - _key.add(b.row(numriga).get(RMOVMAG_CODART)); - _key.add(b.row(numriga).get(RMOVMAG_CODMAG)); - _key.add(b.row(numriga).get(RMOVMAG_LIVGIAC)); - _key.add(nr); - return _key; -} - -TString TMov_mag::key2field(TToken_string &key,const char *fieldname) -{ - if (strcmp(fieldname,"CODART")==0) - return key.get(0); - if (strcmp(fieldname,"CODMAG")==0) - return key.get(1); - if (strcmp(fieldname,"LIVGIAC")==0) - return key.get(2); - CHECKS(FALSE, "Nome di campo non appartenente al file righe mov ", fieldname); - return ""; -} - - -int TMov_mag::line_inserted(TToken_string &k,TLine_movmag &r) -{ - if (_annoes != get("ANNOES")) - lines_to_add.add(k,r); - else - { - if (lines_to_subtract.is_key(k)&& (TLine_movmag &)lines_to_subtract[k]==r) - // modifica annullata - lines_to_subtract.remove(k); - else - // linea modificata - lines_to_add.add(k,r); - } - return 0; -} - -int TMov_mag::line_deleted(TToken_string &k,TLine_movmag &r) -{ - if (_annoes != get("ANNOES")) - lines_to_subtract.add(k,r); - else - { - if (lines_to_add.is_key(k)&& r==(TLine_movmag &)lines_to_add[k] ) - // modifica annullata - lines_to_add.remove(k); - else - // linea modificata - lines_to_subtract.add(k,r); - } - return 0; -} - -bool TMov_mag::unlock_anamag(const char *codart) -{ - TLocalisamfile anamag(LF_ANAMAG); - - anamag.put("CODART",codart); - return (anamag.read(_isequal,_unlock)==NOERR); -} - -bool TMov_mag::lock_anamag(const char *codart) -{ - TLocalisamfile anamag(LF_ANAMAG); - - anamag.put("CODART",codart); - - bool insert_new=TRUE; - TString mess; - - mess << "Il record di anagrafica dell'articolo ''"<< codart << "'' risulta essere già in uso.\n Interrompo ?"; - - TTimed_breakbox bbox((const char *)mess,10); - - do - { - if (anamag.read(_isequal,_testandlock)==NOERR) - return TRUE; - } while (bbox.run()!=K_ESC); - return FALSE; -} - - -void TMov_mag::giac_putkey(TLocalisamfile & mag,TString16 annoes,TToken_string curr_key) -{ - mag.zero(' '); - mag.put("ANNOES",annoes); - mag.put("CODMAG",key2field(curr_key,"CODMAG")); - mag.put("CODART",key2field(curr_key,"CODART")); - mag.put("LIVELLO",key2field(curr_key,"LIVGIAC")); -} - - -// aggiorna tutti i saldi in base alle modifiche fatte. -// il lock su anagrafica dovrebbe garantire il lock su tutte le -// giacenze dell'articolo -int TMov_mag::update_balances() -{ - bool updated_bal=TRUE; - TLocalisamfile mag(LF_MAG); - - mag.setkey(2); - - TString_array keys_to_add,keys_to_remove; - - ((TMov_mag *)this)->lines_to_add.get_keys(keys_to_add); - ((TMov_mag *)this)->lines_to_subtract.get_keys(keys_to_remove); - - // aggiunge i saldi nuovi - keys_to_add.sort(); - - TToken_string * curr_key=(TToken_string *)keys_to_add.first_item(); - - while (curr_key) - { - curr_art.read((const char *)key2field(*curr_key,"CODART")); - if (curr_art.lock_and_prompt()) - { - // lock gained - TLine_movmag & line_mov=(TLine_movmag &)lines_to_add[*curr_key]; - TCausale_magazzino & causmag=(TCausale_magazzino &)cache_causali.get(line_mov.codcaus()); - - if (causmag.update_ultcos()) - { - curr_art.update_ultcosti(line_mov.prezzo(),get_date("DATACOMP")); - curr_art.rewrite(); - } - giac_putkey(mag,get("ANNOES"),*curr_key); - if (mag.read()!=NOERR) - { - // non trovato: aggiungo - giac_putkey(mag,get("ANNOES"),*curr_key); - mag.put("NRIGA",1+curr_art.mag(get("ANNOES")).rows()); - mag.write(); - } - // modifica questo record (e lo sblocca) - update_balances(mag.curr(), line_mov, +1); - /*// ottimizzazione :(cerca di sfruttare la lettura fatta per un eventuale saldo vecchio) - // ciò causa la modifica dell'oggetto TMov_mag (il metodo non è più const) - if (_annoes == get("ANNOES") - && lines_to_subtract.is_key(*curr_key)) { - update_balances(mag.curr(),(TLine_movmag &)lines_to_subtract[*curr_key],-1); - ((TMov_mag *)this)->lines_to_add.remove(*curr_key); - ((TMov_mag *)this)->lines_to_subtract.remove(*curr_key); - }*/ - mag.rewrite(); - // conclude la TRANSAZIONE prima di sbloccare il record dell'articolo - TToken_string *rem_key=(TToken_string *)keys_to_remove.first_item(); - while ( rem_key) - { - if (key2field(*rem_key,"CODART")==key2field(*curr_key,"CODART")) { - giac_putkey(mag,_annoes,*rem_key); - if (mag.read()==NOERR) - { - update_balances(mag.curr(),(TLine_movmag &)lines_to_subtract[*rem_key],-1); - mag.rewrite(); - } - keys_to_remove.remove_item(); - } - rem_key=(TToken_string *)keys_to_remove.succ_item(); - } - curr_art.unlock(); - } - else - updated_bal=FALSE; - curr_key=(TToken_string *)keys_to_add.succ_item(); - } - // togli i saldi vecchi - curr_key=(TToken_string *)keys_to_remove.first_item(); - - while (curr_key) - { - curr_art.read((const char *)key2field(*curr_key,"CODART")); - if (curr_art.lock_and_prompt()) - { - giac_putkey(mag,_annoes,*curr_key); - // modifica questo record (e lo sblocca) - if (mag.read()==NOERR) - { - update_balances(mag.curr(),(TLine_movmag &)lines_to_subtract[*curr_key],-1); - mag.rewrite(); - } - curr_art.unlock(); - } - else - updated_bal=FALSE; - curr_key=(TToken_string *)keys_to_remove.succ_item(); - } - if (!updated_bal) - { - // saldi non aggiornati - warning_box("I saldi di magazzino non sono stati del tutto aggiornati. \nProcedere ad una operazione di ''Ricostruzione saldi''"); - } - return updated_bal; -} - -// aggiorna i saldi del record corrente -// in base alla causale e alla modifica fatta (con segno + o -) -int TMov_mag::update_balances(TRectype & magrec, const TLine_movmag &l,int rett_sign) -{ - TCausale_magazzino & caus=(TCausale_magazzino &)cache_causali.get(l.codcaus()); - TLocalisamfile umart(LF_UMART); - real diff,diff_val; - - umart.setkey(2); - umart.put(UMART_CODART,magrec.get(MAG_CODART)); - 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(); - if (caus.update_qta()) - { - update_balance(magrec,"GIAC",diff* (real)caus.sgn(s_giac)); // update .. - update_balance(magrec,"ACQ",diff* (real)caus.sgn(s_acq)); // update .. - update_balance(magrec,"ENT",diff* (real)caus.sgn(s_ent)); - update_balance(magrec,"VEN",diff* (real)caus.sgn(s_ven)); - update_balance(magrec,"USC",diff* (real)caus.sgn(s_usc)); - update_balance(magrec,"ORDC",diff* (real)caus.sgn(s_ordc)); - update_balance(magrec,"ORDF",diff* (real)caus.sgn(s_ordf)); - update_balance(magrec,"RIM",diff* (real)caus.sgn(s_rim)); - update_balance(magrec,"SCARTI",diff* (real)caus.sgn(s_scart)); - update_balance(magrec,"INCL",diff* (real)caus.sgn(s_incl)); - update_balance(magrec,"ACL",diff* (real)caus.sgn(s_acl)); - update_balance(magrec,"PRODCOMP",diff* (real)caus.sgn(s_prodc)); - update_balance(magrec,"PRODFIN",diff* (real)caus.sgn(s_prodf)); - update_balance(magrec,"NLABEL",diff* (real)caus.sgn(s_label)); - update_balance(magrec,"USER1",diff* (real)caus.sgn(s_user1)); - update_balance(magrec,"USER2",diff* (real)caus.sgn(s_user2)); - update_balance(magrec,"USER3",diff* (real)caus.sgn(s_user3)); - update_balance(magrec,"USER4",diff* (real)caus.sgn(s_user4)); - update_balance(magrec,"USER5",diff* (real)caus.sgn(s_user5)); - update_balance(magrec,"USER6",diff* (real)caus.sgn(s_user6)); - } - if (caus.update_val()) - { - update_balance(magrec,"VALACQ",diff_val* (real)caus.sgn(s_acq)); // update .. - update_balance(magrec,"VALENT",diff_val* (real)caus.sgn(s_ent)); - update_balance(magrec,"VALVEN",diff_val* (real)caus.sgn(s_ven)); - update_balance(magrec,"VALUSC",diff_val* (real)caus.sgn(s_usc)); - update_balance(magrec,"VALORDC",diff_val* (real)caus.sgn(s_ordc)); - update_balance(magrec,"VALORDF",diff_val* (real)caus.sgn(s_ordf)); - update_balance(magrec,"VALRIM",diff_val* (real)caus.sgn(s_rim)); - update_balance(magrec,"VALSCARTI",diff_val* (real)caus.sgn(s_scart)); - update_balance(magrec,"USERVAL1",diff* (real)caus.sgn(s_user1)); - update_balance(magrec,"USERVAL2",diff* (real)caus.sgn(s_user2)); - update_balance(magrec,"USERVAL3",diff* (real)caus.sgn(s_user3)); - update_balance(magrec,"USERVAL4",diff* (real)caus.sgn(s_user4)); - update_balance(magrec,"USERVAL5",diff* (real)caus.sgn(s_user5)); - update_balance(magrec,"USERVAL6",diff* (real)caus.sgn(s_user6)); - } - return 0; -} - - -void TMov_mag::update_balance(TRectype & magrec, const char * fieldname, real diff) const -{ - magrec.put(fieldname,magrec.get_real(fieldname)+diff); -} - -HIDDEN TEsercizi_contabili _esercizi; - -int TMov_mag::codice_esercizio(TDate &d) -{ - return _esercizi.date2esc(d); -} - -//********************** -bool rebuild_balances(const TString16 annoes/*, bool reset_giac*/) -{ - TArray used_files; - - used_files.add(new TLocalisamfile(LF_RMOVMAG),LF_RMOVMAG); - used_files.add(new TLocalisamfile(LF_MOVMAG),LF_MOVMAG); - used_files.add(new TTable("%CAU"),5); - - TMov_mag * m_m= new TMov_mag; // record del movimento di magazzino - // relazione con un solo file (LF_MOVMAG) ma col record Head_Body - TRelation rel(LF_MOVMAG); - - rel.lfile().set_curr(m_m); - bool ok = TRUE; - - TLocalisamfile mag(LF_MAG); - - // Il flag di reset delle giacenze viene impostato in base alla chiusura dell'esercizio - // precedente - // Aggiorna il cazzillo per caricare eventuali date di chiusura e altre amenita' simili - _esercizi.update(); - - const int pred_es = _esercizi.pred(atoi(annoes)); - const bool reset_giac = pred_es != 0 ? _esercizi.esercizio(pred_es).chiusura_mag() != TDate(NULLDATE) : TRUE; - - if (reset_giac) - { - // azzera tutte giacenze (ciclo sulle giacenze) - mag.put("ANNOES",annoes); - mag.read(_isgteq); - TString information; - //TIndwin idle(40,"Azzeramento saldi in corso...", FALSE); - TProgind idle(40,"Azzeramento saldi in corso...", FALSE,FALSE); - while (!mag.eof() && annoes==mag.get("ANNOES")) - { - TString currcode(mag.get("CODART")); - TArticolo articolo(currcode); - //information="Azzeramento saldi articolo: "; - //information << articolo.codice(); - //idle.set_text(information); - //do_events(); - if (articolo.lock_and_prompt()) - { - while (!mag.eof() && currcode==mag.get("CODART")) - { - mag.put("GIAC",0); - mag.put("RIM",0);mag.put("VALRIM",0); - mag.put("ACQ",0);mag.put("VALACQ",0); - mag.put("ENT",0);mag.put("VALENT",0); - mag.put("VEN",0);mag.put("VALVEN",0); - mag.put("USC",0);mag.put("VALUSC",0); - mag.put("ORDF",0);mag.put("VALORDF",0); - mag.put("ORDC",0);mag.put("VALORDC",0); - mag.put("SCARTI",0);mag.put("VALSCARTI",0); - mag.put("PRODCOMP",0); - mag.put("PRODFIN",0); - mag.put("INCL",0); - mag.put("ACL",0); - mag.put("NLABEL",0); - mag.rewrite(); - mag.next(); - } - articolo.unlock(); - } - else - { - ok=FALSE; - mag.next(); - } - } - } - // ricostruisce i saldi (ciclo sui movimenti) - TString filterexpr; - filterexpr << LF_MOVMAG << "->ANNOES==" << annoes; - TCursor cur(&rel,filterexpr); // cursore filtrato - - TProgind barra_mov(cur.items(),"Ricostruzione saldi", TRUE, TRUE, 60); - - for (long i=0; i +#include + +#include "mglib.h" +#include "movmag.h" +#include "rmovmag.h" + +#ifndef __CGLIB01_H +#include "..\cg\cglib01.h" +#endif +#ifndef __DBLIB_H +#include "..\db\dblib.h" +#endif + + +// ********************* +// movimenti di magazzino + +// causali + +int TCausale_magazzino::sgn(TTipo_saldomag tiposaldo) +{ + static TString *segni=NULL; if (segni==NULL) segni=new TString80; + *segni=get("S2"); + switch (tiposaldo) + { + case s_giac: + return atoi(segni->mid(0,2)); + case s_acq: + return atoi(segni->mid(2,2)); + case s_ent: + return atoi(segni->mid(4,2)); + case s_ven: + return atoi(segni->mid(6,2)); + case s_usc: + return atoi(segni->mid(8,2)); + case s_ordc: + return atoi(segni->mid(10,2)); + case s_ordf: + return atoi(segni->mid(12,2)); + case s_incl: + return atoi(segni->mid(14,2)); + case s_acl: + return atoi(segni->mid(16,2)); + case s_prodc: + return atoi(segni->mid(18,2)); + case s_prodf: + return atoi(segni->mid(20,2)); + case s_rim: + return atoi(segni->mid(22,2)); + case s_scart: + return atoi(segni->mid(24,2)); + case s_label: + return atoi(segni->mid(26,2)); + case s_user1: + return atoi(segni->mid(28,2)); + case s_user2: + return atoi(segni->mid(30,2)); + case s_user3: + return atoi(segni->mid(32,2)); + case s_user4: + return atoi(segni->mid(34,2)); + case s_user5: + return atoi(segni->mid(36,2)); + case s_user6: + return atoi(segni->mid(38,2)); + default: + return 0; + } +} + +bool TCausale_magazzino::is_fiscale() +{ + return (tipomov()=='S' || tipomov()=='C' ); +} + + +TCausale_magazzino::TCausale_magazzino(const char * codice): + TRectype(LF_TABCOM) +{ + TTable f("%CAU"); + + settab("CAU"); + put("CODTAB", codice); + if (TRectype::read(f) != NOERR) + zero(); +} + +// movimenti +// dati della linea di movimento di magazzino +class TLine_movmag : public TObject +{ + TString16 _codcaus; + TString16 _um; + real _quant; + real _prezzo; +public: + const TString16 &codcaus() const {return _codcaus;} + const TString16 &um() const {return _um;} + const real &quant() const {return _quant;} + const real &prezzo() const {return _prezzo;} + void set(const TString16 cau,const TString16 um,const real q, const real p); + int operator==(TLine_movmag &); + + virtual TObject* dup() const {return new TLine_movmag(*this);}; + + TLine_movmag() {}; + TLine_movmag(const TLine_movmag &); + virtual ~TLine_movmag() {}; +}; + +void TLine_movmag ::set(const TString16 cau,const TString16 um,const real q, const real p) +{ + _codcaus=cau; + _um=um; + _quant=q; + _prezzo=p; +} + +TLine_movmag ::TLine_movmag(const TLine_movmag &l) +{ + _codcaus=l._codcaus; + _um=l._um; + _quant=l._quant; + _prezzo=l._prezzo; +} + +int TLine_movmag::operator==(TLine_movmag &l) +{ + return (_codcaus==l._codcaus)&&(_um==l._um)&&(_quant==l._quant)&&(_prezzo==l._prezzo); +} + + +// ******************************** +// TMov_mag + +TRecord_cache TMov_mag::cache_causali("%CAU"); + +TMov_mag::TMov_mag() : + TMultiple_rectype(LF_MOVMAG), + lines_to_add(), lines_to_subtract() +{ + add_file(LF_RMOVMAG,"NRIG"); +} + +TMov_mag::~TMov_mag() +{ +} + + +void TMov_mag::zero(char c) +{ + TMultiple_rectype::zero(c); + + lines_to_add.destroy(); + lines_to_subtract.destroy(); +} + +// valuta il valore della chiave per un nuovo record +bool TMov_mag::renum() +{ + put(MOVMAG_NUMREG,get_next_key()); + return TRUE; +} + +// copia la chiave dal file principale a quello delle righe +void TMov_mag::set_body_key(TRectype & rowrec) +{ + rowrec.put(RMOVMAG_NUMREG,get(MOVMAG_NUMREG)); +} + + +void TMov_mag::synchronize_bodies() +{ + TMultiple_rectype::synchronize_bodies(); + // reset delle strutture per il controlli delle variazioni dei saldi + if (autoload_enabled()) + { + _annoes=get(MOVMAG_ANNOES); + lines_to_add.destroy(); + lines_to_subtract.destroy(); + const int nrows = rows(); + for (int i = 1; i<= nrows; i++) + line_deleted(line2key(i), line2data(i)); + } +} + + +int TMov_mag::remove(TBaseisamfile& f) const +{ + int res; + if ((res=TMultiple_rectype::remove(f))==NOERR ) + // effettua la variazione dei saldi + ((TMov_mag *)this)->update_balances(); + return res; +} + + +void TMov_mag::add_extrarows() const +{ + add_autorows(); + if (add_explrows()) + add_autorows(); +} +bool TMov_mag::add_autorows() const +{ + bool added=FALSE; + // aggiunge le righe automatiche + for (int r = rows(); r > 0; r--) + { + TRecord_array & b = body(); + TRectype & row = b[r]; + TString16 codcaus(row.get(RMOVMAG_CODCAUS)); + if (codcaus.empty()) + codcaus=get(MOVMAG_CODCAUS); + TCausale_magazzino & cau=(TCausale_magazzino & )cache_causali.get(codcaus); + codcaus=cau.caus_collegata(); + if (codcaus.not_empty()) + { + TCausale_magazzino & cau_coll=(TCausale_magazzino & )cache_causali.get(codcaus); +// if (!cau_coll.esplodente()) + { + // deve esserci una riga collegata + if (!b.exist(r + 1) || b[r + 1].get_char(RMOVMAG_TIPORIGA) != riga_automatica) + { + // manca, la inserisco + TRectype * linea_auto = new TRectype(row); + const char * codmag = cau_coll.default_magdep(); + if (codmag != NULL) + linea_auto->put(RMOVMAG_CODMAG, codmag); + const char * prezzo = prezzo_rauto(r); + if (prezzo != NULL) + linea_auto->put(RMOVMAG_PREZZO, prezzo); + linea_auto->put(RMOVMAG_NRIG, r+1); + linea_auto->put(RMOVMAG_TIPORIGA, (char) riga_automatica); + linea_auto->put(RMOVMAG_CODCAUS, codcaus); + b.insert_row(linea_auto); + added=TRUE; + } + } + } + } // ciclo righe + return added; +} + +bool TMov_mag::add_explrows() const +{ + TDistinta_tree distinta; + TArray boom; + bool added=FALSE; + // aggiunge le righe da explosione distinta + for (int r = rows(); r > 0; r--) + { + TRecord_array & b = body(); + TRectype & row = b[r]; + TString16 codcaus(row.get(RMOVMAG_CODCAUS)); + if (codcaus.empty()) + codcaus=get(MOVMAG_CODCAUS); + TCausale_magazzino & cau=(TCausale_magazzino & )cache_causali.get(codcaus); + if (cau.esplodente() && !b[r].get_bool(RMOVMAG_ESPLOSA)) + { + // devono esserci n righe automatiche esplose + //if (!b.exist(r + 1) || !b[r + 1].get_bool(RMOVMAG_ESPLOSA)) + { + // mancano le righe, le inserisco + distinta.set_root(row.get(RMOVMAG_CODART)); + distinta.explode(boom); + TString codmag(codmag_rauto(r)); + real prezzo(prezzo_rauto(r)); + TRectype * linea_auto; + for (int newrow=0; newrow < boom.items() ; newrow++) + { + TRiga_esplosione & riga_esp=(TRiga_esplosione & )(boom[newrow]); + linea_auto = new TRectype(row); + linea_auto->put(RMOVMAG_CODART, riga_esp.articolo()); + linea_auto->put(RMOVMAG_UM, riga_esp.um()); + linea_auto->put(RMOVMAG_QUANT, riga_esp.val()*row.get_real(RMOVMAG_QUANT)); + if (codmag.not_empty()) + linea_auto->put(RMOVMAG_CODMAG, codmag); + if (!prezzo.is_zero()) + linea_auto->put(RMOVMAG_PREZZO, prezzo); + linea_auto->put(RMOVMAG_NRIG, r+1+newrow); + linea_auto->put(RMOVMAG_ESPLOSA, TRUE); + //linea_auto->put(RMOVMAG_TIPORIGA, (char) riga_automatica); + //linea_auto->put(RMOVMAG_CODCAUS, codcaus); + b.insert_row(linea_auto); + added=TRUE; + } + } + // ora ci sono, mi basta eliminare la riga "padre" + b.destroy_row(r,TRUE); + } + } // ciclo righe + return added; +} + + +int TMov_mag::write(TBaseisamfile& f) const +{ + int res; + add_extrarows(); + TMov_mag &myself=((TMov_mag &)*this); + + const int nrows = rows(); + + for (int i = 1; i <= nrows; i++) + myself.line_inserted(line2key(i), line2data(i)); + if ((res=TMultiple_rectype::write(f))==NOERR ) + // effettua la variazione dei saldi + myself.update_balances(); + return res; +} + +int TMov_mag::rewrite(TBaseisamfile& f) const +{ + int res; + add_extrarows(); + // memorizza le variazioni + + const int nrows = rows(); + + for (int i = 1; i <= nrows; i++) + ((TMov_mag *)this)->line_inserted(line2key(i), line2data(i)); + if ((res=TMultiple_rectype::rewrite(f))==NOERR ) + // effettua la variazione dei saldi + ((TMov_mag *)this)->update_balances(); + return res; +} + +const char *TMov_mag::get_next_key() +{ + static TString16 nextcod; + TLocalisamfile f(LF_MOVMAG); + f.last(); + int a=atoi(f.get(MOVMAG_NUMREG))+1; + return nextcod.format("%d",a); +} + +//******* +// gestione delle variazione dei saldi +// +// +int TMov_mag::force_update_bal() +{ + int res; + + // reset delle strutture per il controlli delle variazioni dei saldi + _annoes=get(MOVMAG_ANNOES); + lines_to_add.destroy(); + lines_to_subtract.destroy(); + + // memorizza le variazioni + const int nrows = rows(); + + for (int i= 1; i <= nrows; i++) + line_inserted(line2key(i), line2data(i)); + res=update_balances(); + return res; +} + +// restituisce il valore dei dati +TLine_movmag & TMov_mag::line2data(int nrig) const +{ + static TLine_movmag line; + TRecord_array & b = body(); + + line.set(b.row(nrig).get(RMOVMAG_CODCAUS).blank() ? get(MOVMAG_CODCAUS) : b.row(nrig).get(RMOVMAG_CODCAUS) , + b.row(nrig).get(RMOVMAG_UM), + b.row(nrig).get_real(RMOVMAG_QUANT), + b.row(nrig).get_real(RMOVMAG_PREZZO)); + return line; +} + +TToken_string & TMov_mag::line2key(int numriga) const +{ + static TToken_string _key; + TRecord_array & b = body(); + TString16 nr; + + nr << numriga; + _key.cut(0); + _key.add(b.row(numriga).get(RMOVMAG_CODART)); + _key.add(b.row(numriga).get(RMOVMAG_CODMAG)); + _key.add(b.row(numriga).get(RMOVMAG_LIVGIAC)); + _key.add(nr); + return _key; +} + +TString TMov_mag::key2field(TToken_string &key,const char *fieldname) +{ + if (strcmp(fieldname,RMOVMAG_CODART)==0) + return key.get(0); + if (strcmp(fieldname,RMOVMAG_CODMAG)==0) + return key.get(1); + if (strcmp(fieldname,RMOVMAG_LIVGIAC)==0) + return key.get(2); + CHECKS(FALSE, "Nome di campo non appartenente al file righe mov ", fieldname); + return ""; +} + + +int TMov_mag::line_inserted(TToken_string &k,TLine_movmag &r) +{ + if (_annoes != get(MOVMAG_ANNOES)) + lines_to_add.add(k,r); + else + { + if (lines_to_subtract.is_key(k)&& (TLine_movmag &)lines_to_subtract[k]==r) + // modifica annullata + lines_to_subtract.remove(k); + else + // linea modificata + lines_to_add.add(k,r); + } + return 0; +} + +int TMov_mag::line_deleted(TToken_string &k,TLine_movmag &r) +{ + if (_annoes != get(MOVMAG_ANNOES)) + lines_to_subtract.add(k,r); + else + { + if (lines_to_add.is_key(k)&& r==(TLine_movmag &)lines_to_add[k] ) + // modifica annullata + lines_to_add.remove(k); + else + // linea modificata + lines_to_subtract.add(k,r); + } + return 0; +} + +bool TMov_mag::unlock_anamag(const char *codart) +{ + TLocalisamfile anamag(LF_ANAMAG); + + anamag.put(ANAMAG_CODART,codart); + return (anamag.read(_isequal,_unlock)==NOERR); +} + +bool TMov_mag::lock_anamag(const char *codart) +{ + TLocalisamfile anamag(LF_ANAMAG); + + anamag.put(ANAMAG_CODART,codart); + + bool insert_new=TRUE; + TString mess; + + mess << "Il record di anagrafica dell'articolo ''"<< codart << "'' risulta essere già in uso."; + + TTimed_breakbox bbox((const char *)mess,10); + + do + { + if (anamag.read(_isequal,_testandlock)==NOERR) + return TRUE; + } while (bbox.run()!=K_ESC); + return FALSE; +} + + +void TMov_mag::giac_putkey(TLocalisamfile & mag,TString16 annoes,TToken_string curr_key) +{ + mag.zero(' '); + mag.put(MAG_ANNOES,annoes); + mag.put(MAG_CODMAG,key2field(curr_key,RMOVMAG_CODMAG)); + mag.put(MAG_CODART,key2field(curr_key,RMOVMAG_CODART)); + mag.put(MAG_LIVELLO,key2field(curr_key,RMOVMAG_LIVGIAC)); +} + + +// aggiorna tutti i saldi in base alle modifiche fatte. +// il lock su anagrafica dovrebbe garantire il lock su tutte le +// giacenze dell'articolo +int TMov_mag::update_balances() +{ + bool updated_bal=TRUE; + TLocalisamfile mag(LF_MAG); + + mag.setkey(2); + + TString_array keys_to_add,keys_to_remove; + + ((TMov_mag *)this)->lines_to_add.get_keys(keys_to_add); + ((TMov_mag *)this)->lines_to_subtract.get_keys(keys_to_remove); + + // aggiunge i saldi nuovi + keys_to_add.sort(); + + TToken_string * curr_key=(TToken_string *)keys_to_add.first_item(); + + while (curr_key) + { + const TString cod(key2field(*curr_key,RMOVMAG_CODART)) ; + + if (curr_art.lock_and_prompt(cod)) + { + // lock gained + TLine_movmag & line_mov=(TLine_movmag &)lines_to_add[*curr_key]; + TCausale_magazzino & causmag=(TCausale_magazzino &)cache_causali.get(line_mov.codcaus()); + + if (causmag.update_ultcos()) + { + curr_art.update_ultcosti(line_mov.prezzo(),get_date("DATACOMP")); + curr_art.rewrite(); + } + giac_putkey(mag,get(MOVMAG_ANNOES),*curr_key); + if (mag.read()!=NOERR) + { + // non trovato: aggiungo + giac_putkey(mag,get(MOVMAG_ANNOES),*curr_key); + mag.put(MAG_NRIGA,1+curr_art.mag(get(MOVMAG_ANNOES)).rows()); + mag.write(); + } + // modifica questo record (e lo sblocca) + update_balances(mag.curr(), line_mov, +1); + /*// ottimizzazione :(cerca di sfruttare la lettura fatta per un eventuale saldo vecchio) + // ciò causa la modifica dell'oggetto TMov_mag (il metodo non è più const) + if (_annoes == get("ANNOES") + && lines_to_subtract.is_key(*curr_key)) { + update_balances(mag.curr(),(TLine_movmag &)lines_to_subtract[*curr_key],-1); + ((TMov_mag *)this)->lines_to_add.remove(*curr_key); + ((TMov_mag *)this)->lines_to_subtract.remove(*curr_key); + }*/ + mag.rewrite(); + // conclude la TRANSAZIONE prima di sbloccare il record dell'articolo + TToken_string *rem_key=(TToken_string *)keys_to_remove.first_item(); + while ( rem_key) + { + if (key2field(*rem_key,RMOVMAG_CODART)==key2field(*curr_key,RMOVMAG_CODART)) { + giac_putkey(mag,_annoes,*rem_key); + if (mag.read()==NOERR) + { + update_balances(mag.curr(),(TLine_movmag &)lines_to_subtract[*rem_key],-1); + mag.rewrite(); + } + keys_to_remove.remove_item(); + } + rem_key=(TToken_string *)keys_to_remove.succ_item(); + } + curr_art.unlock(); + } + else + updated_bal=FALSE; + curr_key=(TToken_string *)keys_to_add.succ_item(); + } + // togli i saldi vecchi + curr_key=(TToken_string *)keys_to_remove.first_item(); + + while (curr_key) + { + if (curr_art.lock_and_prompt((const char *)key2field(*curr_key,RMOVMAG_CODART))) + { + giac_putkey(mag,_annoes,*curr_key); + // modifica questo record (e lo sblocca) + if (mag.read()==NOERR) + { + update_balances(mag.curr(),(TLine_movmag &)lines_to_subtract[*curr_key],-1); + mag.rewrite(); + } + curr_art.unlock(); + } + else + updated_bal=FALSE; + curr_key=(TToken_string *)keys_to_remove.succ_item(); + } + return updated_bal; +} + +// aggiorna i saldi del record corrente +// in base alla causale e alla modifica fatta (con segno + o -) +int TMov_mag::update_balances(TRectype & magrec, const TLine_movmag &l,int rett_sign) +{ + TCausale_magazzino & caus=(TCausale_magazzino &)cache_causali.get(l.codcaus()); + TLocalisamfile umart(LF_UMART); + real diff,diff_val; + + umart.setkey(2); + umart.put(UMART_CODART,magrec.get(MAG_CODART)); + 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(); + if (caus.update_qta()) + { + update_balance(magrec,"GIAC",diff* (real)caus.sgn(s_giac)); // update .. + update_balance(magrec,"ACQ",diff* (real)caus.sgn(s_acq)); // update .. + update_balance(magrec,"ENT",diff* (real)caus.sgn(s_ent)); + update_balance(magrec,"VEN",diff* (real)caus.sgn(s_ven)); + update_balance(magrec,"USC",diff* (real)caus.sgn(s_usc)); + update_balance(magrec,"ORDC",diff* (real)caus.sgn(s_ordc)); + update_balance(magrec,"ORDF",diff* (real)caus.sgn(s_ordf)); + update_balance(magrec,"RIM",diff* (real)caus.sgn(s_rim)); + update_balance(magrec,"SCARTI",diff* (real)caus.sgn(s_scart)); + update_balance(magrec,"INCL",diff* (real)caus.sgn(s_incl)); + update_balance(magrec,"ACL",diff* (real)caus.sgn(s_acl)); + update_balance(magrec,"PRODCOMP",diff* (real)caus.sgn(s_prodc)); + update_balance(magrec,"PRODFIN",diff* (real)caus.sgn(s_prodf)); + update_balance(magrec,"NLABEL",diff* (real)caus.sgn(s_label)); + update_balance(magrec,"USER1",diff* (real)caus.sgn(s_user1)); + update_balance(magrec,"USER2",diff* (real)caus.sgn(s_user2)); + update_balance(magrec,"USER3",diff* (real)caus.sgn(s_user3)); + update_balance(magrec,"USER4",diff* (real)caus.sgn(s_user4)); + update_balance(magrec,"USER5",diff* (real)caus.sgn(s_user5)); + update_balance(magrec,"USER6",diff* (real)caus.sgn(s_user6)); + } + if (caus.update_val()) + { + update_balance(magrec,"VALACQ",diff_val* (real)caus.sgn(s_acq)); // update .. + update_balance(magrec,"VALENT",diff_val* (real)caus.sgn(s_ent)); + update_balance(magrec,"VALVEN",diff_val* (real)caus.sgn(s_ven)); + update_balance(magrec,"VALUSC",diff_val* (real)caus.sgn(s_usc)); + update_balance(magrec,"VALORDC",diff_val* (real)caus.sgn(s_ordc)); + update_balance(magrec,"VALORDF",diff_val* (real)caus.sgn(s_ordf)); + update_balance(magrec,"VALRIM",diff_val* (real)caus.sgn(s_rim)); + update_balance(magrec,"VALSCARTI",diff_val* (real)caus.sgn(s_scart)); + update_balance(magrec,"USERVAL1",diff* (real)caus.sgn(s_user1)); + update_balance(magrec,"USERVAL2",diff* (real)caus.sgn(s_user2)); + update_balance(magrec,"USERVAL3",diff* (real)caus.sgn(s_user3)); + update_balance(magrec,"USERVAL4",diff* (real)caus.sgn(s_user4)); + update_balance(magrec,"USERVAL5",diff* (real)caus.sgn(s_user5)); + update_balance(magrec,"USERVAL6",diff* (real)caus.sgn(s_user6)); + } + return 0; +} + + +void TMov_mag::update_balance(TRectype & magrec, const char * fieldname, real diff) const +{ + magrec.put(fieldname,magrec.get_real(fieldname)+diff); +} + +HIDDEN TEsercizi_contabili _esercizi; + +int TMov_mag::codice_esercizio(TDate &d) +{ + return _esercizi.date2esc(d); +} + + +void zero_balances(TRectype & mag) +{ + mag.put(MAG_GIAC,0); + mag.put(MAG_RIM,0);mag.put(MAG_VALRIM,0); + mag.put(MAG_ACQ,0);mag.put(MAG_VALACQ,0); + mag.put(MAG_ENT,0);mag.put(MAG_VALENT,0); + mag.put(MAG_VEN,0);mag.put(MAG_VALVEN,0); + mag.put(MAG_USC,0);mag.put(MAG_VALUSC,0); + mag.put(MAG_ORDF,0);mag.put(MAG_VALORDF,0); + mag.put(MAG_ORDC,0);mag.put(MAG_VALORDC,0); + mag.put(MAG_SCARTI,0);mag.put(MAG_VALSCARTI,0); + mag.put(MAG_PRODCOMP,0); + mag.put(MAG_PRODFIN,0); + mag.put(MAG_INCL,0); + mag.put(MAG_ACL,0); + mag.put(MAG_NLABEL,0); +} + +void copy_oldbalances(TRectype & oldmag,TRectype & mag) +{ + mag.put(MAG_GIAC,oldmag.get(MAG_GIAC)); + mag.put(MAG_RIM,oldmag.get(MAG_RIM)); + mag.put(MAG_VALRIM,oldmag.get(MAG_VALRIM)); + mag.put(MAG_ACQ,0); + mag.put(MAG_VALACQ,0); + mag.put(MAG_ENT,0); + mag.put(MAG_VALENT,0); + mag.put(MAG_VEN,0); + mag.put(MAG_VALVEN,0); + mag.put(MAG_USC,0); + mag.put(MAG_VALUSC,0); + mag.put(MAG_ORDF,oldmag.get(MAG_ORDF)); + mag.put(MAG_VALORDF,oldmag.get(MAG_VALORDF)); + mag.put(MAG_ORDC,oldmag.get(MAG_ORDC)); + mag.put(MAG_VALORDC,oldmag.get(MAG_VALORDC)); + mag.put(MAG_SCARTI,0); + mag.put(MAG_VALSCARTI,0); + mag.put(MAG_PRODCOMP,oldmag.get(MAG_PRODCOMP)); + mag.put(MAG_PRODFIN,oldmag.get(MAG_PRODFIN)); + mag.put(MAG_INCL,oldmag.get(MAG_INCL)); + mag.put(MAG_ACL,oldmag.get(MAG_ACL)); + mag.put(MAG_NLABEL,0); +} + + + +//********************** +bool rebuild_balances(const TString16 annoes, + const TTipo_valorizz tipo_valorizz, const char* catven, const char* codlis) +{ + + TRelation rel(LF_MOVMAG); // relazione con un solo file (LF_MOVMAG) ma col record Head_Body + TMov_mag * m_m= new TMov_mag; // record del movimento di magazzino + rel.lfile().set_curr(m_m); + + TRelation rel2(LF_ANAMAG); // relazione con un solo file (LF_ANAMAG) ma col record Head_Body + TArticolo_giacenza * a_g= new TArticolo_giacenza; // record dell'articolo di magazzino + rel2.lfile().set_curr(a_g); + + int ok=TRUE; + // Aggiorna il cazzillo per caricare eventuali date di chiusura e altre amenita' simili + _esercizi.update(); + + 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; + + TString information; + // azzera tutte giacenze (ciclo sulle giacenze) + TCursor cur2(&rel2); + const long maxart=cur2.objects(); + + information.format("Ricostruzione saldi esercizio %s: azzeramento...",(const char *)annoes); + TProgind barra_art(maxart,information, TRUE, TRUE, 60); + for (long a=0; aANNOES==" << annoes; + TCursor cur(&rel,filterexpr); // cursore filtrato + + const long maxmov=cur.objects(); + information.format("Ricostruzione saldi esercizio %s: ricalcolo ...",(const char *)annoes); + TProgind barra_mov(maxmov,information,TRUE, TRUE, 60); + + for (long m=0; mlast_level(); - return setdettaglio(showdett,fromlivart,livart,fromlivgiac,livgiac,FALSE); } diff --git a/mg/rmovmag.h b/mg/rmovmag.h index dfb105c32..7061f4aae 100755 --- a/mg/rmovmag.h +++ b/mg/rmovmag.h @@ -11,5 +11,6 @@ #define RMOVMAG_PREZZO "PREZZO" #define RMOVMAG_CODCAUS "CAUS" #define RMOVMAG_TIPORIGA "AUTOMATICA" +#define RMOVMAG_ESPLOSA "ESPLOSA" #endif diff --git a/ve/batbeld.h b/ve/batbeld.h index b0e0692f4..a54a2fa21 100755 --- a/ve/batbeld.h +++ b/ve/batbeld.h @@ -6,7 +6,6 @@ #define F_CODNUM_F 105 #define F_TIPODOC_I_1 111 #define F_STATO_I_DOC_I_1 121 -#define F_STATO_F_DOC_I 131 #define F_TIPODOC_I_2 112 #define F_STATO_I_DOC_I_2 122 #define F_TIPODOC_I_3 113 @@ -15,18 +14,39 @@ #define F_STATO_I_DOC_I_4 124 #define F_TIPODOC_I_5 115 #define F_STATO_I_DOC_I_5 125 +#define F_TIPODOC_I_6 116 +#define F_STATO_I_DOC_I_6 126 +#define F_TIPODOC_I_7 117 +#define F_STATO_I_DOC_I_7 127 +#define F_TIPODOC_I_8 118 +#define F_STATO_I_DOC_I_8 128 +#define F_TIPODOC_I_9 119 +#define F_STATO_I_DOC_I_9 129 +#define F_TIPODOC_I_10 120 +#define F_STATO_I_DOC_I_10 130 + +#define F_STATO_F_DOC_I 139 + #define F_TIPODOC_F 140 #define F_STATO_F_DOC_F 141 + + #define F_DOC1 151 #define F_DOC2 152 #define F_DOC3 153 #define F_DOC4 154 #define F_DOC5 155 -#define F_ATTIVA_PROVVISORIO 160 -#define F_PROVVISORIO 161 -#define F_APPLICAZIONE 162 -#define F_INTERATTIVO 163 -#define F_INSERT_MODE 164 +#define F_DOC6 156 +#define F_DOC7 157 +#define F_DOC8 158 +#define F_DOC9 159 +#define F_DOC10 160 +#define F_ATTIVA_PROVVISORIO 161 +#define F_PROVVISORIO 162 +#define F_APPLICAZIONE 163 +#define F_INTERATTIVO 164 +#define F_INSERT_MODE 165 +#define H_DOC 166 #define F_CAMBIO 201 #define F_SCONTO 202 @@ -40,6 +60,7 @@ #define F_PORTO 210 #define F_TRASPORTO 211 #define F_VETTORI 212 +#define F_DESTINAZIONE 213 #define F_SOMMA_RIGHE 301 #define F_MAGAZZINO 310 diff --git a/ve/batbeld.uml b/ve/batbeld.uml index e35e140d3..7e028d276 100755 --- a/ve/batbeld.uml +++ b/ve/batbeld.uml @@ -54,7 +54,7 @@ BEGIN FIELD I0 END -GROUPBOX DLG_NULL 78 6 +GROUPBOX DLG_NULL 78 8 BEGIN PROMPT 1 6 "@bDocumento originale" END @@ -74,40 +74,82 @@ BEGIN OUTPUT F_DOC3 S2[9,12] OUTPUT F_DOC4 S2[13,16] OUTPUT F_DOC5 S2[17,20] + OUTPUT F_DOC6 S2[21,24] + OUTPUT F_DOC7 S2[25,28] + OUTPUT F_DOC8 S2[29,32] + OUTPUT F_DOC9 S2[33,36] + OUTPUT F_DOC10 S2[37,40] + OUTPUT H_DOC S2 CHECKTYPE NORMAL WARNING "Numerazione errata" END +STRING H_DOC 50 +BEGIN + PROMPT 29 6 "" + FLAGS "H" +END + STRING F_DOC1 4 BEGIN - PROMPT 30 7 "" + PROMPT 29 7 "" FLAGS "D" END STRING F_DOC2 4 BEGIN - PROMPT 36 7 "" + PROMPT 34 7 "" FLAGS "D" END STRING F_DOC3 4 BEGIN - PROMPT 42 7 "" + PROMPT 39 7 "" FLAGS "D" END STRING F_DOC4 4 BEGIN - PROMPT 48 7 "" + PROMPT 44 7 "" FLAGS "D" END STRING F_DOC5 4 +BEGIN + PROMPT 49 7 "" + FLAGS "D" +END + +STRING F_DOC6 4 BEGIN PROMPT 54 7 "" FLAGS "D" END +STRING F_DOC7 4 +BEGIN + PROMPT 59 7 "" + FLAGS "D" +END + +STRING F_DOC8 4 +BEGIN + PROMPT 64 7 "" + FLAGS "D" +END + +STRING F_DOC9 4 +BEGIN + PROMPT 69 7 "" + FLAGS "D" +END + +STRING F_DOC10 4 +BEGIN + PROMPT 74 7 "" + FLAGS "D" +END + STRING F_TIPODOC_I_1 4 BEGIN PROMPT 2 8 "Tipo documento " @@ -119,7 +161,7 @@ BEGIN DISPLAY "Tipo documento@50" S0 OUTPUT F_TIPODOC_I_1 CODTAB CHECKTYPE REQUIRED - STR_EXPR {(#F_CODNUM_I=="")||(#THIS_FIELD==#F_DOC1)||(#THIS_FIELD==#F_DOC2)||(#THIS_FIELD==#F_DOC3)||(#THIS_FIELD==#F_DOC4)||(#THIS_FIELD==#F_DOC5)} + STR_EXPR {(#F_CODNUM_I=="")||(#H_DOC ?=("*" +#THIS_FIELD +"*"))} WARNING "E' necessario specificare un valore valido e previsto dalla numerazione" END @@ -133,7 +175,7 @@ BEGIN COPY DISPLAY F_TIPODOC_I_1 OUTPUT F_TIPODOC_I_2 CODTAB CHECKTYPE NORMAL - STR_EXPR {(#F_CODNUM_I=="")||(#THIS_FIELD=="")||(#THIS_FIELD==#F_DOC1)||(#THIS_FIELD==#F_DOC2)||(#THIS_FIELD==#F_DOC3)||(#THIS_FIELD==#F_DOC4)||(#THIS_FIELD==#F_DOC5)} + STR_EXPR {(#F_CODNUM_I=="")||(#H_DOC ?=("*" +#THIS_FIELD))} WARNING "E' necessario specificare un valore valido e previsto dalla numerazione" END @@ -147,7 +189,7 @@ BEGIN COPY DISPLAY F_TIPODOC_I_1 OUTPUT F_TIPODOC_I_3 CODTAB CHECKTYPE NORMAL - STR_EXPR {(#F_CODNUM_I=="")||(#THIS_FIELD=="")||(#THIS_FIELD==#F_DOC1)||(#THIS_FIELD==#F_DOC2)||(#THIS_FIELD==#F_DOC3)||(#THIS_FIELD==#F_DOC4)||(#THIS_FIELD==#F_DOC5)} + STR_EXPR {(#F_CODNUM_I=="")||(#H_DOC ?=("*" +#THIS_FIELD +"*"))} WARNING "E' necessario specificare un valore valido e previsto dalla numerazione" END @@ -155,13 +197,13 @@ STRING F_TIPODOC_I_4 4 BEGIN PROMPT 48 8 "" FLAGS "U" - FIELD S2[13,15] + FIELD S2[13,16] COPY USE F_TIPODOC_I_1 INPUT CODTAB F_TIPODOC_I_4 COPY DISPLAY F_TIPODOC_I_1 OUTPUT F_TIPODOC_I_4 CODTAB CHECKTYPE NORMAL - STR_EXPR {(#F_CODNUM_I=="")||(#THIS_FIELD=="")||(#THIS_FIELD==#F_DOC1)||(#THIS_FIELD==#F_DOC2)||(#THIS_FIELD==#F_DOC3)||(#THIS_FIELD==#F_DOC4)||(#THIS_FIELD==#F_DOC5)} + STR_EXPR {(#F_CODNUM_I=="")||(#H_DOC ?=("*" +#THIS_FIELD +"*"))} WARNING "E' necessario specificare un valore valido e previsto dalla numerazione" END @@ -169,13 +211,13 @@ STRING F_TIPODOC_I_5 4 BEGIN PROMPT 57 8 "" FLAGS "U" - FIELD S2[16,19] + FIELD S2[17,20] COPY USE F_TIPODOC_I_1 INPUT CODTAB F_TIPODOC_I_4 COPY DISPLAY F_TIPODOC_I_1 OUTPUT F_TIPODOC_I_4 CODTAB CHECKTYPE NORMAL - STR_EXPR {(#F_CODNUM_I=="")||(#THIS_FIELD=="")||(#THIS_FIELD==#F_DOC1)||(#THIS_FIELD==#F_DOC2)||(#THIS_FIELD==#F_DOC3)||(#THIS_FIELD==#F_DOC4)||(#THIS_FIELD==#F_DOC5)} + STR_EXPR {(#F_CODNUM_I=="")||(#H_DOC ?=("*" +#THIS_FIELD +"*"))} WARNING "E' necessario specificare un valore valido e previsto dalla numerazione" END @@ -197,10 +239,9 @@ STRING F_STATO_I_DOC_I_2 1 BEGIN PROMPT 30 9 "" FLAGS "U" - USE %STD + COPY USE F_STATO_I_DOC_I_1 INPUT CODTAB F_STATO_I_DOC_I_2 - DISPLAY "Stato" CODTAB - DISPLAY "Descrizione@50" S0 + COPY DISPLAY F_STATO_I_DOC_I_1 OUTPUT F_STATO_I_DOC_I_2 CODTAB CHECKTYPE NORMAL FIELD S7[2,2] @@ -210,10 +251,9 @@ STRING F_STATO_I_DOC_I_3 1 BEGIN PROMPT 39 9 "" FLAGS "U" - USE %STD + COPY USE F_STATO_I_DOC_I_1 INPUT CODTAB F_STATO_I_DOC_I_3 - DISPLAY "Stato" CODTAB - DISPLAY "Descrizione@50" S0 + COPY DISPLAY F_STATO_I_DOC_I_1 OUTPUT F_STATO_I_DOC_I_3 CODTAB CHECKTYPE NORMAL FIELD S7[3,3] @@ -223,10 +263,9 @@ STRING F_STATO_I_DOC_I_4 1 BEGIN PROMPT 48 9 "" FLAGS "U" - USE %STD + COPY USE F_STATO_I_DOC_I_1 INPUT CODTAB F_STATO_I_DOC_I_4 - DISPLAY "Stato" CODTAB - DISPLAY "Descrizione@50" S0 + COPY DISPLAY F_STATO_I_DOC_I_1 OUTPUT F_STATO_I_DOC_I_4 CODTAB CHECKTYPE NORMAL FIELD S7[4,4] @@ -236,18 +275,148 @@ STRING F_STATO_I_DOC_I_5 1 BEGIN PROMPT 57 9 "" FLAGS "U" - USE %STD + COPY USE F_STATO_I_DOC_I_1 INPUT CODTAB F_STATO_I_DOC_I_5 - DISPLAY "Stato" CODTAB - DISPLAY "Descrizione@50" S0 + COPY DISPLAY F_STATO_I_DOC_I_1 OUTPUT F_STATO_I_DOC_I_5 CODTAB CHECKTYPE NORMAL FIELD S7[5,5] END +STRING F_TIPODOC_I_6 4 +BEGIN + PROMPT 2 10 "Tipo documento " + FLAGS "U" + FIELD S2[21,24] + COPY USE F_TIPODOC_I_1 + INPUT CODTAB F_TIPODOC_I_6 + COPY DISPLAY F_TIPODOC_I_1 + OUTPUT F_TIPODOC_I_6 CODTAB + CHECKTYPE NORMAL + 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_7 4 +BEGIN + PROMPT 30 10 "" + FLAGS "U" + FIELD S2[25,28] + COPY USE F_TIPODOC_I_1 + INPUT CODTAB F_TIPODOC_I_7 + COPY DISPLAY F_TIPODOC_I_1 + OUTPUT F_TIPODOC_I_7 CODTAB + CHECKTYPE NORMAL + 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_8 4 +BEGIN + PROMPT 39 10 "" + FLAGS "U" + FIELD S2[29,32] + COPY USE F_TIPODOC_I_1 + INPUT CODTAB F_TIPODOC_I_8 + COPY DISPLAY F_TIPODOC_I_1 + OUTPUT F_TIPODOC_I_8 CODTAB + CHECKTYPE NORMAL + 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_9 4 +BEGIN + PROMPT 48 10 "" + FLAGS "U" + FIELD S2[33,36] + COPY USE F_TIPODOC_I_1 + INPUT CODTAB F_TIPODOC_I_9 + COPY DISPLAY F_TIPODOC_I_1 + OUTPUT F_TIPODOC_I_9 CODTAB + CHECKTYPE NORMAL + 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_10 4 +BEGIN + PROMPT 57 10 "" + FLAGS "U" + FIELD S2[37,40] + COPY USE F_TIPODOC_I_1 + INPUT CODTAB F_TIPODOC_I_10 + COPY DISPLAY F_TIPODOC_I_1 + OUTPUT F_TIPODOC_I_10 CODTAB + CHECKTYPE NORMAL + STR_EXPR {(#F_CODNUM_I=="")||(#H_DOC ?=("*" +#THIS_FIELD +"*"))} + WARNING "E' necessario specificare un valore valido e previsto dalla numerazione" +END + +STRING F_STATO_I_DOC_I_6 1 +BEGIN + PROMPT 2 11 "Stato iniziale " + FLAGS "U" + FIELD S10[1,1] + COPY USE F_STATO_I_DOC_I_1 + INPUT CODTAB F_STATO_I_DOC_I_6 + COPY DISPLAY F_STATO_I_DOC_I_1 + OUTPUT F_STATO_I_DOC_I_6 CODTAB + CHECKTYPE NORMAL + WARNING "E' necessario specificare uno stato iniziale" +END + +STRING F_STATO_I_DOC_I_7 1 +BEGIN + PROMPT 30 11 "" + FLAGS "U" + COPY USE F_STATO_I_DOC_I_1 + INPUT CODTAB F_STATO_I_DOC_I_7 + COPY DISPLAY F_STATO_I_DOC_I_1 + OUTPUT F_STATO_I_DOC_I_7 CODTAB + CHECKTYPE NORMAL + FIELD S10[2,2] +END + +STRING F_STATO_I_DOC_I_8 1 +BEGIN + PROMPT 39 11 "" + FLAGS "U" + COPY USE F_STATO_I_DOC_I_1 + INPUT CODTAB F_STATO_I_DOC_I_8 + COPY DISPLAY F_STATO_I_DOC_I_1 + OUTPUT F_STATO_I_DOC_I_8 CODTAB + CHECKTYPE NORMAL + FIELD S10[3,3] +END + +STRING F_STATO_I_DOC_I_9 1 +BEGIN + PROMPT 48 11 "" + FLAGS "U" + COPY USE F_STATO_I_DOC_I_1 + INPUT CODTAB F_STATO_I_DOC_I_9 + COPY DISPLAY F_STATO_I_DOC_I_1 + OUTPUT F_STATO_I_DOC_I_9 CODTAB + CHECKTYPE NORMAL + FIELD S10[4,4] +END + +STRING F_STATO_I_DOC_I_10 1 +BEGIN + PROMPT 57 11 "" + FLAGS "U" + COPY USE F_STATO_I_DOC_I_1 + INPUT CODTAB F_STATO_I_DOC_I_10 + COPY DISPLAY F_STATO_I_DOC_I_1 + OUTPUT F_STATO_I_DOC_I_10 CODTAB + CHECKTYPE NORMAL + FIELD S10[5,5] +END + STRING F_STATO_F_DOC_I 1 BEGIN - PROMPT 2 10 "Stato finale " + PROMPT 2 12 "Stato finale " FLAGS "U" FIELD S4 USE %STD @@ -259,14 +428,14 @@ BEGIN WARNING "E' necessario specificare uno stato finale" END -GROUPBOX DLG_NULL 78 6 +GROUPBOX DLG_NULL 42 5 BEGIN - PROMPT 1 12 "@bDocumento finale" + PROMPT 1 14 "@bDocumento finale" END STRING F_TIPODOC_F 4 BEGIN - PROMPT 2 13 "Tipo documento " + PROMPT 2 15 "Tipo documento " FLAGS "U" FIELD S8 CHECKTYPE REQUIRED @@ -279,7 +448,7 @@ END STRING F_STATO_F_DOC_F 1 BEGIN - PROMPT 2 14 "Stato finale " + PROMPT 2 16 "Stato finale " FLAGS "U" FIELD S9 USE %STD @@ -293,7 +462,7 @@ END STRING F_CODNUM_F 4 BEGIN - PROMPT 2 15 "Codice numerazione " + PROMPT 2 17 "Codice numerazione " FLAGS "U" FIELD S6 USE %NUM @@ -313,9 +482,14 @@ BEGIN MESSAGE TRUE ENABLE,F_PROVVISORIO END +GROUPBOX DLG_NULL 35 5 +BEGIN + PROMPT 44 14 "@bTipo numerazione" +END + RADIOBUTTON F_PROVVISORIO 20 BEGIN - PROMPT 42 13 "Tipo numerazione" + PROMPT 44 14 "" ITEM " |Definitiva" ITEM "X|Provvisioria" FIELD B4 @@ -323,7 +497,7 @@ END STRING F_APPLICAZIONE 20 BEGIN - PROMPT 2 18 "Applicazione " + PROMPT 2 19 "Applicazione " FIELD S3 END @@ -363,7 +537,7 @@ END BOOLEAN F_SPEDIZIONE BEGIN - PROMPT 2 6 "Modalita' di spedizione" + PROMPT 2 6 "Modalita'di spedizione" FIELD S1[9,9] END @@ -375,40 +549,46 @@ END BOOLEAN F_CONDPAG BEGIN - PROMP 40 2 "Condizione di pagamento" + PROMP 28 2 "Condizione di pagamento" FIELD S1[5,5] END BOOLEAN F_BANCA BEGIN - PROMPT 40 3 "Banca di appoggio" + PROMPT 28 3 "Banca di appoggio" FIELD S1[6,6] END BOOLEAN F_LISTINO BEGIN - PROMPT 40 4 "Listino" + PROMPT 28 4 "Listino" FIELD S1[7,7] END BOOLEAN F_AGENTE BEGIN - PROMP 40 5 "Agente" + PROMP 28 5 "Agente" FIELD S1[8,8] END BOOLEAN F_TRASPORTO BEGIN - PROMPT 40 6 "Causale di trasporto" + PROMPT 28 6 "Causale di trasporto" FIELD S1[11,11] END BOOLEAN F_VETTORI BEGIN - PROMPT 40 7 "Vettori" + PROMPT 28 7 "Vettori" FIELD S1[12,12] END +BOOLEAN F_DESTINAZIONE +BEGIN + PROMPT 56 2 "Destinazione" + FIELD S1[13,13] +END + GROUPBOX DLG_NULL 75 4 BEGIN PROMPT 1 10 "Modalita' di raggruppamento delle righe" diff --git a/ve/batbtip.h b/ve/batbtip.h index 44e0e3c8d..49acd768e 100755 --- a/ve/batbtip.h +++ b/ve/batbtip.h @@ -16,6 +16,9 @@ #define F_STATV 116 #define F_PROVV 117 #define F_STATO_PROVV 118 +#define F_SCARES 119 +#define F_CODCAUSANT 120 +#define F_DESCAUSANT 121 #define F_STATOF_INS 150 #define F_STATOF_ST 151 diff --git a/ve/batbtip.uml b/ve/batbtip.uml index 2d1134d02..8c2b6e32f 100755 --- a/ve/batbtip.uml +++ b/ve/batbtip.uml @@ -45,28 +45,28 @@ END STRING F_RIFERIMENTO 50 BEGIN - PROMPT 2 6 "Riferimento " + PROMPT 2 5 "Riferimento " FIELD S1 CHECKTYPE NORMAL END STRING F_PROFILO 8 BEGIN - PROMPT 2 8 "Profilo documento " + PROMPT 2 6 "Profilo documento " FIELD S4 CHECKTYPE REQUIRED END STRING F_PSTAMPA 8 BEGIN - PROMPT 2 9 "Profilo stampa documento " + PROMPT 2 7 "Profilo stampa documento " FIELD S5 CHECKTYPE REQUIRED END NUMBER F_NCOPIE 3 BEGIN - PROMPT 2 10 "Numero di copie " + PROMPT 2 8 "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 12 "Tipo del documento " + PROMPT 2 9 "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 13 "Codice causale contabile " + PROMPT 2 10 "Codice causale contabile " FIELD S6 USE LF_CAUSALI INPUT CODCAUS F_CODCAUS @@ -99,7 +99,7 @@ END STRING F_DESCAUS 50 BEGIN - PROMPT 2 14 "Descrizione " + PROMPT 2 11 "Descrizione " USE LF_CAUSALI KEY 2 INPUT DESCR F_DESCAUS DISPLAY "Descrizione@50" DESCR @@ -110,6 +110,34 @@ BEGIN GROUP 2 END +STRING F_CODCAUSANT 3 +BEGIN + PROMPT 2 12 "Codice causale anticipo " + FIELD S10 + USE LF_CAUSALI SELECT REG =="" + INPUT CODCAUS F_CODCAUSANT + DISPLAY "Codice" CODCAUS + DISPLAY "Descrizione@50" DESCR + OUTPUT F_CODCAUSANT CODCAUS + OUTPUT F_DESCAUSANT DESCR + CHECKTYPE NORMAL + FLAG "U" + GROUP 2 +END + +STRING F_DESCAUSANT 50 +BEGIN + PROMPT 2 13 "Descrizione " + USE LF_CAUSALI KEY 2 + INPUT DESCR F_DESCAUSANT + DISPLAY "Descrizione@50" DESCR + DISPLAY "Codice" CODCAUS + OUTPUT F_DESCAUSANT DESCR + OUTPUT F_CODCAUSANT CODCAUS + CHECKTYPE NORMAL + GROUP 2 +END + BOOLEAN F_SPESEAUT BEGIN PROMPT 2 15 "Addebito automatico spese cliente" @@ -118,7 +146,7 @@ END BOOLEAN F_MOVMAG BEGIN - PROMPT 2 16 "Movimenti di magazzino a partire dallo stato " + PROMPT 2 16 "Mov. di mag. a partire dallo stato " FIELD B1 MESSAGE FALSE CLEAR,1@ MESSAGE TRUE ENABLE,1@ @@ -128,7 +156,7 @@ END STRING F_STATO_MOV_I 1 BEGIN - PROMPT 50 16 "" + PROMPT 40 16 "" FIELD S7 USE %STD INPUT CODTAB F_STATO_MOV_I @@ -143,7 +171,7 @@ END STRING F_STATO_MOV_F 1 BEGIN - PROMPT 54 16 "allo stato " + PROMPT 42 16 "allo stato " FIELD S8 COPY USE F_STATO_MOV_I INPUT CODTAB F_STATO_MOV_F @@ -156,6 +184,13 @@ BEGIN WARNING "Stato finale impossibile" END +BOOLEAN F_SCARES +BEGIN + PROMPT 58 16 "Scarica il residuo" + FIELD B4 + GROUP 1 +END + STRING F_CAUS_MAG 5 BEGIN PROMPT 2 17 "Codice causale magazzino " diff --git a/ve/bollac.src b/ve/bollac.src index 9f4cee1cd..5be3ae70a 100755 --- a/ve/bollac.src +++ b/ve/bollac.src @@ -7,8 +7,6 @@ // Descrizione a caratteri del documento TYPE=Bolla di vendita // Dove sono le risorse per il documento -MSKFILE=BOLLAC -FRMFILE=BOLLAC.FRM // modifica CAMPICALC=TOTMER|TOTPRE|SPESE|SPESINC|BOLLI|IMPONIBILI|IMPOSTE|TOTDOC|SCONTOD|SCONTOT|OMAGGI|PROVVD CALCOLI=BASESCONTO @@ -85,8 +83,8 @@ DENCOMSP = S_DISABILITATO //900 PROVCOMSP = S_DISABILITATO //900 STATOSP = S_DISABILITATO //900 DESSTATOSP = S_DISABILITATO //900 -DATADOCRIF = S_NASCOSTO //1000 -NUMDOCRIF = S_NASCOSTO //1000 +DATADOCRIF = S_NORMALE //1000 +NUMDOCRIF = S_NORMALE //1000 CODAGVIS = S_NASCOSTO //1110 DESAGVIS = S_NASCOSTO //1110 CODAG = S_NORMALE //1100 @@ -113,7 +111,7 @@ NCOPIE = S_NASCOSTO //1600 GRPARTENZA = S_NORMALE //1700 DATAPART = S_NORMALE //1700 ORAPART = S_NORMALE //1700 -IMPPAGATO = S_NASCOSTO //1800 +IMPPAGATO = S_NORMALE //1800 ACCSALDO = S_NASCOSTO //1800 DOC1 = S_NASCOSTO //1900 DOC2 = S_NASCOSTO //1900 @@ -199,7 +197,7 @@ NHANDLER=0 820 = S_NORMALE 830 = S_NORMALE 900 = S_NORMALE -1000 = S_NASCOSTO +1000 = S_NORMALE 1100 = S_NORMALE 1200 = S_NORMALE 1210 = S_NORMALE @@ -225,33 +223,33 @@ NHANDLER=0 [ORDINEGRUPPI] NGROUPS=30 1=100 -2=200 -3=300 -4=400 -5=500 -6=600 -7=700 -8=800 -9=810 -10=820 -11=830 -12=900 -13=1100 -14=1200 -15=1500 -16=1210 -17=1300 -18=1400 -19=1800 -20=1900 -21=2100 -22=2300 -23=2200 -24=2800 -25=2700 -26=2710 -27=1700 -28=2500 -29=2400 +2=2500 +3=200 +4=300 +5=400 +6=500 +7=600 +8=700 +9=2400 +10=2300 +11=800 +12=810 +13=820 +14=830 +15=900 +16=1100 +17=1200 +18=1500 +19=1210 +20=1300 +21=1400 +22=2100 +23=2800 +24=2700 +25=2710 +26=1700 +27=1800 +28=2200 +29=1000 30=2900 diff --git a/ve/clifor.cpp b/ve/clifor.cpp index 5f7538ca6..bd2ae676e 100755 --- a/ve/clifor.cpp +++ b/ve/clifor.cpp @@ -35,8 +35,7 @@ int TCli_for::write_rewrite(TBaseisamfile& f, bool re) const return err; } -TRectype & TCli_for::vendite() const - +TRectype& TCli_for::vendite() const { const char t = tipo(); const long c = codice(); @@ -44,32 +43,37 @@ TRectype & TCli_for::vendite() const if (_ven_rec.empty() || t != *(const char *) (*_ven_tipo) || c != (long) *_ven_codice) { TLocalisamfile v(LF_CFVEN); + TRectype& vr = ((TCli_for *)this)->_ven_rec; // fool const - ((TCli_for *)this)->_ven_rec.zero(); - ((TCli_for *)this)->_ven_rec.put(CFV_TIPOCF,t); - ((TCli_for *)this)->_ven_rec.put(CFV_CODCF, c); - TRectype v_rec(_ven_rec); - - if (((TCli_for *)this)->_ven_rec.read(v) != NOERR) - ((TCli_for *)this)->_ven_rec = v_rec; + vr.zero(); + vr.put(CFV_TIPOCF,t); + vr.put(CFV_CODCF, c); + const TRectype v_rec(vr); + if (vr.read(v) != NOERR) + vr = v_rec; } return (TRectype &) _ven_rec; } -int TCli_for::read(TRectype & rec, word op, word lockop) +int TCli_for::read(const TRectype & rec, word op, word lockop) { - int err = TMultiple_rectype::read(rec, op, lockop); - _ven_rec.zero(); + int err = TMultiple_rectype::read(rec, op, lockop); return err; } int TCli_for::read(char tipo, long codice, word op, word lockop) { + int err = NOERR; + _ven_rec.zero(); zero(); - put(CLI_TIPOCF, tipo); - put(CLI_CODCF, codice); - return TMultiple_rectype::read(op, lockop); + if (tipo > ' ' && codice > 0L) + { + put(CLI_TIPOCF, tipo); + put(CLI_CODCF, codice); + err = TMultiple_rectype::read(op, lockop); + } + return err; } int TCli_for::remove(TBaseisamfile& f) const @@ -89,7 +93,8 @@ TCli_for::TCli_for(char tipo, long codice) : TMultiple_rectype( LF_CLIFO ), _ven _ven_tipo = new TRecfield(_ven_rec, CFV_TIPOCF); _ven_codice = new TRecfield(_ven_rec, CFV_CODCF); add_file(LF_INDSP, IND_CODIND); - read(tipo, codice); + if (tipo > ' ' && codice > 0L) + read(tipo, codice); } TCli_for::TCli_for(const TRectype & rec) : TMultiple_rectype(rec), _ven_rec(LF_CFVEN) @@ -99,7 +104,7 @@ TCli_for::TCli_for(const TRectype & rec) : TMultiple_rectype(rec), _ven_rec(LF_C _ven_tipo = new TRecfield(_ven_rec, CFV_TIPOCF); _ven_codice = new TRecfield(_ven_rec, CFV_CODCF); add_file(LF_INDSP, IND_CODIND); - read((TRectype &) rec); + read(rec); } TCli_for::TCli_for(const TCli_for & c) : TMultiple_rectype(c), _ven_rec(c._ven_rec) diff --git a/ve/clifor.h b/ve/clifor.h index cc5146411..38a321246 100755 --- a/ve/clifor.h +++ b/ve/clifor.h @@ -59,7 +59,7 @@ public: long codice() const { return (long) *_codice; } bool ok() const { return !empty();} - virtual int read(TRectype & rec, word op = _isequal, word lockop = _nolock); + virtual int read(const TRectype& rec, word op = _isequal, word lockop = _nolock); int read(char tipo, long codice, word op = _isequal, word lockop = _nolock); virtual int remove(TBaseisamfile& f) const; diff --git a/ve/f33.dir b/ve/f33.dir index e4f908bb0..49e7cb211 100755 --- a/ve/f33.dir +++ b/ve/f33.dir @@ -1,3 +1,3 @@ 33 0 -$doc|0|0|418|31|Documenti di vendita|NDOC|| +$doc|0|0|419|31|Documenti di vendita|NDOC|| diff --git a/ve/f33.trr b/ve/f33.trr index ed38a35a5..cfd81ca92 100755 --- a/ve/f33.trr +++ b/ve/f33.trr @@ -1,5 +1,5 @@ 33 -69 +71 CODNUM|1|4|0|Codice della numerazione ANNO|2|4|0|Anno PROVV|1|1|0|Tipo numerazione

rovvisorio efinitivo @@ -69,6 +69,8 @@ G1|11|10|0|Campo generale 1 DATAAGG|5|8|0|Data ultimo aggiornamento UTENTE|1|10|0|Utente ultimo aggiornamento COLL_GOLEM|11|10|0|Collegamento lista di GOLEM +DATACONS|5|8|0|Data di consegna +DOCEVASO|8|1|0|Ordine evaso 3 PROVV+ANNO+CODNUM+NDOC| TIPOCF+CODCF+PROVV+ANNO+DATADOC+CODNUM+NDOC|X diff --git a/ve/f34.dir b/ve/f34.dir index e31cd2c4a..26f201d3f 100755 --- a/ve/f34.dir +++ b/ve/f34.dir @@ -1,3 +1,3 @@ 34 0 -$rdoc|0|0|314|31|Righe documenti di vendita|NDOC*3|| +$rdoc|0|0|381|31|Righe documenti di vendita|NDOC*3|| diff --git a/ve/f34.trr b/ve/f34.trr index 3c5843f47..7ded9f15d 100755 --- a/ve/f34.trr +++ b/ve/f34.trr @@ -1,5 +1,5 @@ 34 -36 +41 CODNUM|1|4|0|Codice Numeriazione ANNO|2|4|0|Anno PROVV|1|1|0|Tipo numerazione

rovvisoria efinitiva @@ -18,8 +18,13 @@ DESCLUNGA|8|1|0|Descrizione estesa caricata DESCEST|11|10|0|Descrizione estesa PREZZO|4|18|2|Prezzo o valore UMQTA|1|2|0|Unita di misura -QTA|4|11|3|Quantita' -QTAEVASA|4|11|3|Quantita' evasa +QTA|4|13|5|Quantita' +QTAEVASA|4|13|5|Quantita' evasa +QTAGG1|4|13|5|1a quantita' aggiuntiva +QTAGG2|4|13|5|2a quantita' aggiuntiva +QTAGG3|4|13|5|3a quantita' aggiuntiva +QTAGG4|4|13|5|4a quantita' aggiuntiva +QTAGG5|4|13|5|5a quantita' aggiuntiva RIGAEVASA|8|1|0|Riga evasa TARA|4|15|2|Tara PNETTO|4|15|2|Peso netto @@ -33,7 +38,7 @@ CODIVA|1|4|0|Codice IVA ADDIVA|8|1|0|Addebito IVA ASPBENI|1|2|0|Aspetto dei beni PSPESA|4|5|2|Percentuale di spesa -CAUSMAG|1|6|0|Causale di magazzino +CAUSMAG|1|4|0|Causale di magazzino MOVMAG|3|7|0|Numero di movimento id magazzino CODMAGC|1|5|0|Codice di magazzino per causale collegata 1 diff --git a/ve/fatturaa.src b/ve/fatturaa.src index 04fc5de0f..1bb39b8b0 100755 --- a/ve/fatturaa.src +++ b/ve/fatturaa.src @@ -6,12 +6,10 @@ [MAIN] // Descrizione a caratteri del documento TYPE=Fattura accompagnatoria -// Dove sono le risorse per il documento -MSKFILE=FATTURAA -FRMFILE=FATTURAA.FRM // modifica -CAMPICALC=TOTMER|TOTPRE|SPESE|SPESINC|BOLLI|IMPONIBILI|IMPOSTE|TOTDOC|SCONTOD|SCONTOT|OMAGGI|PROVVD +CAMPICALC=TOTMER|TOTPRE|SPESE|SPESINC|SPESIMB|SPESTRA|BOLLI|IMPONIBILI|IMPOSTE|TOTDOC|SCONTOD|SCONTOT|OMAGGI|TOTPROVV CALCOLI=BASESCONTO +TOTPROVV = // modifica // Indica se il documento è indirizzato ad un cliente o ad un fornitore TIPOCF=C @@ -86,12 +84,14 @@ DENCOMSP = S_DISABILITATO //900 PROVCOMSP = S_DISABILITATO //900 STATOSP = S_DISABILITATO //900 DESSTATOSP = S_DISABILITATO //900 -DATADOCRIF = S_NASCOSTO //1000 -NUMDOCRIF = S_NASCOSTO //1000 +DATADOCRIF = S_NORMALE //1000 +NUMDOCRIF = S_NORMALE //1000 CODAGVIS = S_NASCOSTO //1110 DESAGVIS = S_NASCOSTO //1110 CODAG = S_NORMALE //1100 DESAG = S_NORMALE //1100 +CODZON = S_NORMALE //1100 +DESZON = S_NORMALE //1100 CODSPMEZZO = S_OBBLIGATORIO //1200 DESSPMEZZO = S_NORMALE //1200 CODPORTO = S_NORMALE //1210 @@ -134,7 +134,12 @@ PNETTO = S_NORMALE //2700 DESUMPNETTO = S_NASCOSTO //2700 NCOLLI = S_NORMALE //2800 BLANK = S_DISABILITATO //4000 -//NOTECLI = S_NORMALE //2500 +CODNOTE = S_NORMALE //2500 +NOTECLI = S_NORMALE //2500 +CAUSMAG = S_OBBLIGATORIO //2900 +CAUSMAGC = S_DISABILITATO //2900 +DESCRMAG = S_NORMALE //2900 +DESCRMAGC = S_DISABILITATO //2900 [DEFAULT] NDEFAULTS=1 @@ -188,7 +193,7 @@ NHANDLER=0 820 = S_NORMALE 830 = S_NORMALE 900 = S_NORMALE -1000 = S_NASCOSTO +1000 = S_NORMALE 1100 = S_NORMALE 1200 = S_NORMALE 1210 = S_NORMALE @@ -208,43 +213,37 @@ NHANDLER=0 2700 = S_NORMALE 2710 = S_NORMALE 2800 = S_NORMALE -2900 = S_NASCOSTO -3000 = S_NORMALE -3200 = S_NORMALE -3400 = S_NORMALE +2900 = S_NORMALE [ORDINEGRUPPI] -NGROUPS=32 +NGROUPS=30 1=100 -2=200 -3=300 -4=400 -5=500 -6=600 -7=700 -8=800 -9=810 -10=820 -11=830 -12=900 -13=1100 -14=1200 -15=1210 -16=1300 -17=1400 -18=1700 -19=2100 -20=2700 -21=2710 -22=2800 -23=1500 -24=1800 -25=2200 -26=2300 -27=2400 -28=3000 -29=3200 -30=2500 -31=3400 -32=1600 - +2=2500 +3=200 +4=300 +5=400 +6=500 +7=600 +8=700 +9=2400 +10=2300 +11=800 +12=810 +13=820 +14=830 +15=900 +16=1100 +17=1200 +18=1500 +19=1210 +20=1300 +21=1400 +22=2100 +23=2800 +24=2700 +25=2710 +26=1700 +27=1800 +28=2200 +29=1000 +30=2900 diff --git a/ve/fatturac.src b/ve/fatturac.src index 846cfd6bc..07e38d58c 100755 --- a/ve/fatturac.src +++ b/ve/fatturac.src @@ -96,7 +96,9 @@ DOC3 = S_NASCOSTO //1900 IMPNETTI = S_NORMALE //2200 RAGGREFF = S_NORMALE //2300 SPESEINC = S_NORMALE //2400 -ADDBOLLI = S_NORMALE //2500 +ADDBOLLI = S_NORMALE //2400 +CODNOTE = S_NORMALE //2500 +NOTECLI = S_NORMALE //2500 CAUSMAG = S_OBBLIGATORIO //2900 CAUSMAGC = S_DISABILITATO //2900 DESCRMAG = S_NORMALE //2900 @@ -166,30 +168,32 @@ NHANDLER=0 2200 = S_NORMALE 2300 = S_NORMALE 2400 = S_NORMALE +2500 = S_NORMALE 2900 = S_NORMALE 4000 = S_NORMALE [ORDINEGRUPPI] NGROUPS=22 1=100 -2=200 -3=300 -4=400 -5=500 -6=600 -7=700 -8=800 -9=810 -10=820 -11=830 -12=1000 -13=1100 -14=1210 -15=1400 -16=1800 -17=1900 -18=2200 -20=2300 -21=2400 +2=2500 +3=200 +4=300 +5=400 +6=500 +7=600 +8=700 +9=2400 +10=2300 +11=800 +12=810 +13=820 +14=830 +15=1100 +16=1210 +17=1400 +18=1800 +19=1900 +20=2200 +21=1000 22=2900 diff --git a/ve/listadoc.frm b/ve/listadoc.frm index a1c02914d..72b8ba09f 100755 --- a/ve/listadoc.frm +++ b/ve/listadoc.frm @@ -12,8 +12,13 @@ END GENERAL BEGIN OFFSET 0 0 - FONT "Courier New" - SIZE 12 +// FONT "Courier New" +// SIZE 12 +END + + +SECTION GRAPHIC +BEGIN END SECTION HEADER ODD 6 diff --git a/ve/ordinec.src b/ve/ordinec.src index 6bee0e352..e717fc917 100755 --- a/ve/ordinec.src +++ b/ve/ordinec.src @@ -131,83 +131,64 @@ CODCONT2 = S_NORMALE DESCONT = S_DISABILITATO //810 CODCAMP = S_NORMALE DESCAMP = S_DISABILITATO //820 -SCONTOPERC = S_NORMALE +SCONTOPERC = S_NORMALE //830 GRINDSPED = S_NORMALE //900 -CODINDSP = S_NORMALE +CODINDSP = S_NORMALE //900 RAGSOCSP = S_DISABILITATO //900 -INDSP = S_DISABILITATO -CIVSP = S_DISABILITATO -LOCALITASP = S_DISABILITATO -CAPSP = S_DISABILITATO -COMSP = S_DISABILITATO -DENCOMSP = S_DISABILITATO -PROVCOMSP = S_DISABILITATO -STATOSP = S_DISABILITATO -DESSTATOSP = S_DISABILITATO -DATADOCRIF = S_NORMALE -NUMDOCRIF = S_NORMALE -CODAGVIS = S_NASCOSTO -DESAGVIS = S_NASCOSTO //1110 -CODAG = S_NORMALE +INDSP = S_DISABILITATO //900 +CIVSP = S_DISABILITATO //900 +LOCALITASP = S_DISABILITATO //900 +CAPSP = S_DISABILITATO //900 +COMSP = S_DISABILITATO //900 +DENCOMSP = S_DISABILITATO //900 +PROVCOMSP = S_DISABILITATO //900 +STATOSP = S_DISABILITATO //900 +DESSTATOSP = S_DISABILITATO //900 +DATADOCRIF = S_NORMALE //1000 +NUMDOCRIF = S_NOCHECK //1000 +CODAG = S_NORMALE //1100 DESAG = S_NORMALE //1100 CODZON = S_NORMALE //1100 DESZON = S_NORMALE //1100 -CODSPMEZZO = S_OBBLIGATORIO +CODSPMEZZO = S_OBBLIGATORIO //1200 DESSPMEZZO = S_NORMALE //1200 -CODPORTO = S_NORMALE +CODPORTO = S_NORMALE //1210 DESPORTO = S_NORMALE //1210 -CODNOTESP1 = S_NORMALE +CODNOTESP1 = S_NORMALE //1300 DESNOTESP1 = S_NORMALE //1300 -CODNOTESP2 = S_NORMALE +CODNOTESP2 = S_NASCOSTO //1300 DESNOTESP2 = S_NASCOSTO //1300 -CAUSTRASP = S_OBBLIGATORIO -DENCAUSTRASP = S_NORMALE -CODVETT1 = S_NASCOSTO -CODVETT2 = S_NASCOSTO -CODVETT3 = S_NASCOSTO -NOMEVETT1 = S_NASCOSTO -NOMEVETT2 = S_NASCOSTO -NOMEVETT3 = S_NASCOSTO -NCOPIE = S_OBBLIGATORIO -DATAPART = S_NASCOSTO -ORAPART = S_NASCOSTO -IMPPAGATO = S_NASCOSTO -ACCSALDO = S_NASCOSTO -DOC1 = S_NASCOSTO -DOC2 = S_NASCOSTO -DOC3 = S_NASCOSTO -DATACONS = S_OBBLIGATORIO -ASPBENI1 = S_NASCOSTO -DESCRBENI1 = S_NASCOSTO -ASPBENI2 = S_NASCOSTO -DESCRBENI2 = S_NASCOSTO -IMPNETTI = S_NASCOSTO -RAGGREFF = S_NASCOSTO -SPESEINC = S_NASCOSTO -ADDBRB = S_NASCOSTO -ADDBTR = S_NASCOSTO -ADDBDE = S_NASCOSTO -CODIVABRB = S_NASCOSTO -CODIVABTR = S_NASCOSTO -CODIVABTRE = S_NASCOSTO -CODIVABDE = S_NASCOSTO - -// fine modifiche - -UMTARA = S_NASCOSTO -TARA = S_NASCOSTO -DESUMTARA = S_NASCOSTO -UMPNETTO = S_NASCOSTO -PNETTO = S_NASCOSTO -DESUMPNETTO = S_NASCOSTO -NCOLLI = S_NASCOSTO -CAUSMAG1 = S_NASCOSTO -DESCRMAG1 = S_NASCOSTO -CAUSMAG2 = S_NASCOSTO -DESCRMAG2 = S_NASCOSTO - -//RAGGR = S_NORMALE -//RAGSOCSP = S_NORMALE +CAUSTRASP = S_NORMALE //1400 +DENCAUSTRASP = S_NORMALE //1400 +CODVETT1 = S_NORMALE //1500 +CODVETT2 = S_NASCOSTO //1500 +CODVETT3 = S_NASCOSTO //1500 +NOMEVETT1 = S_NORMALE //1500 +NOMEVETT2 = S_NASCOSTO //1500 +NOMEVETT3 = S_NASCOSTO //1500 +NCOPIE = S_NASCOSTO //1600 +IMPPAGATO = S_NORMALE //1800 +ACCSALDO = S_NASCOSTO //1800 +DOC1 = S_NASCOSTO //1900 +DOC2 = S_NASCOSTO //1900 +DOC3 = S_NASCOSTO //1900 +ASPBENI1 = S_OBBLIGATORIO //2100 +DESCRBENI1 = S_NORMALE //2100 +ASPBENI2 = S_NASCOSTO //2100 +DESCRBENI2 = S_NASCOSTO //2100 +IMPNETTI = S_NORMALE //2200 +RAGGR = S_NORMALE //2300 +RAGGREFF = S_NORMALE //2300 +SPESEINC = S_NORMALE //2400 +ADDBOLLI = S_NORMALE //2400 +CODNOTE = S_NORMALE //2500 +NOTECLI = S_NORMALE //2500 +CAUSMAG = S_OBBLIGATORIO //2900 +CAUSMAGC = S_DISABILITATO //2900 +DESCRMAG = S_NORMALE //2900 +DESCRMAGC = S_DISABILITATO //2900 +DATACONS = S_NORMALE //2000 +BLANK = S_DISABILITATO //4000 [DEFAULT] // NDEFAULTS=1 @@ -246,25 +227,57 @@ NHANDLER=0 600 = S_NASCOSTO 700 = S_NORMALE 800 = S_NORMALE -900 = S_NASCOSTO -1000 = S_NASCOSTO -1100 = S_NASCOSTO -1200 = S_NASCOSTO -1300 = S_NASCOSTO -1400 = S_NASCOSTO -1500 = S_NASCOSTO -1600 = S_NORMALE -1700 = S_NASCOSTO -1800 = S_NASCOSTO -1900 = S_NASCOSTO +810 = S_NORMALE +820 = S_NORMALE +830 = S_NORMALE +900 = S_NORMALE +1000 = S_NORMALE +1100 = S_NORMALE +1200 = S_NORMALE +1210 = S_NORMALE +1300 = S_NORMALE +1400 = S_NORMALE +1500 = S_NORMALE +1600 = S_NASCOSTO +1800 = S_NORMALE +1900 = S_NORMALE 2000 = S_NORMALE -2100 = S_NASCOSTO -2200 = S_NASCOSTO -2300 = S_NASCOSTO -2400 = S_NASCOSTO -2500 = S_NASCOSTO -2600 = S_NASCOSTO -2700 = S_NASCOSTO -2800 = S_NASCOSTO -2900 = S_NASCOSTO +2100 = S_NORMALE +2200 = S_NORMALE +2300 = S_NORMALE +2400 = S_NORMALE +2500 = S_NORMALE +2900 = S_NORMALE +4000 = S_NORMALE + +[ORDINEGRUPPI] +NGROUPS=27 +1=100 +2=2500 +3=200 +4=300 +5=400 +6=500 +7=600 +8=700 +9=2400 +10=2300 +11=800 +12=810 +13=820 +14=830 +15=900 +16=1100 +17=1200 +18=1500 +19=1210 +20=1300 +21=1400 +22=2100 +23=1800 +24=2200 +25=1000 +26=2900 +27=2000 + diff --git a/ve/ordinef.src b/ve/ordinef.src index cf238dd7f..f0bdf1536 100755 --- a/ve/ordinef.src +++ b/ve/ordinef.src @@ -84,127 +84,139 @@ COFI = S_DISABILITATO STATOPAIV = S_DISABILITATO PAIVA = S_DISABILITATO GOLEM = S_NORMALE -INDCF = S_DISABILITATO -CIVCF = S_DISABILITATO -LOCALITACF = S_DISABILITATO -// aggiunti 6 -CAPCF = S_DISABILITATO -PROVCOM = S_DISABILITATO -COMCF = S_DISABILITATO -DENCOM = S_DISABILITATO -STATOCF = S_DISABILITATO -DESSTATOCF = S_DISABILITATO -CODVAL1 = S_NORMALE -CODVAL2 = S_NORMALE -NOME_VAL1 = S_NORMALE -NOME_VAL2 = S_NORMALE -CAMBIO = S_NORMALE -// aggiunto -DATA_CAMBIO1 = S_DISABILITATO -DATA_CAMBIO2 = S_DISABILITATO -CODLIN = S_NORMALE -DESLIN = S_DISABILITATO -CODPAG = S_OBBLIGATORIO -DESCODPAG = S_DISABILITATO -DATAINSC = S_NORMALE -//AGGIUNTE 5 -DATASCAD1 = S_DISABILITATO -DATASCAD2 = S_DISABILITATO -DATASCAD3 = S_DISABILITATO -DATASCAD4 = S_DISABILITATO -DATASCAD5 = S_DISABILITATO -CODABIA = S_NASCOSTO -CODCABA = S_NASCOSTO -DESBANAPP = S_NASCOSTO -CODABIP = S_NORMALE -CODCABP = S_NORMALE -DESBANPRE = S_DISABILITATO -CODLIST1 = S_OBBLIGATORIO -CODLIST2 = S_OBBLIGATORIO -DESLIST = S_DISABILITATO -// ???????????????????? ******** -CODCONT1 = S_NASCOSTO -CODCONT2 = S_NASCOSTO -CODCAMP = S_NASCOSTO -SCONTOPERC = S_NASCOSTO -CODINDSP = S_NASCOSTO -INDSP = S_NASCOSTO -CIVSP = S_NASCOSTO -LOCALITASP = S_NASCOSTO -// AGGIUNTI 6 -CAPSP = S_NASCOSTO -COMSP = S_NASCOSTO -DENCOMSP = S_NASCOSTO -PROVCOMSP = S_NASCOSTO -STATOSP = S_NASCOSTO -DESSTATOSP = S_NASCOSTO -DATADOCRIF = S_NASCOSTO -NUMDOCRIF = S_NASCOSTO -CODAGVIS = S_NASCOSTO -CODAG = S_NASCOSTO -CODSPMEZZO = S_NASCOSTO -CODPORTO = S_NASCOSTO -PORTO = S_NASCOSTO -CODNOTESP1 = S_NASCOSTO -CODNOTESP2 = S_NASCOSTO -CAUSTRASP = S_NASCOSTO -DENCAUSTRASP = S_NASCOSTO -CODVETT1 = S_NASCOSTO -CODVETT2 = S_NASCOSTO -CODVETT3 = S_NASCOSTO -NOMEVETT1 = S_NASCOSTO -NOMEVETT2 = S_NASCOSTO -NOMEVETT3 = S_NASCOSTO -NCOPIE = S_OBBLIGATORIO -DATAPART = S_NASCOSTO -ORAPART = S_NASCOSTO -IMPPAGATO = S_NASCOSTO -ACCSALDO = S_NASCOSTO -DOC1 = S_NASCOSTO -DOC2 = S_NASCOSTO -DOC3 = S_NASCOSTO -DATACONS = S_OBBLIGATORIO -ASPBENI1 = S_NASCOSTO -DESCRBENI1 = S_NASCOSTO -ASPBENI2 = S_NASCOSTO -DESCRBENI2 = S_NASCOSTO -IMPNETTI = S_NASCOSTO -RAGGREFF = S_NASCOSTO -SPESEINC = S_NASCOSTO -ADDBRB = S_NASCOSTO -ADDBTR = S_NASCOSTO -ADDBDE = S_NASCOSTO -CODIVABRB = S_NASCOSTO -CODIVABTR = S_NASCOSTO -CODIVABTRE = S_NASCOSTO -CODIVABDE = S_NASCOSTO - -// fine modifiche - -UMTARA = S_NASCOSTO -TARA = S_NASCOSTO -DESUMTARA = S_NASCOSTO -UMPNETTO = S_NASCOSTO -PNETTO = S_NASCOSTO -DESUMPNETTO = S_NASCOSTO -NCOLLI = S_NASCOSTO -CAUSMAG1 = S_NASCOSTO -DESCRMAG1 = S_NASCOSTO -CAUSMAG2 = S_NASCOSTO -DESCRMAG2 = S_NASCOSTO - -//RAGGR = S_NORMALE -//RAGSOCSP = S_NORMALE +GRRECAPITO = S_NORMALE //100 +INDCF = S_DISABILITATO //100 +CIVCF = S_DISABILITATO //100 +LOCALITACF = S_DISABILITATO //100 +CAPCF = S_DISABILITATO //100 +PROVCOM = S_DISABILITATO //100 +COMCF = S_DISABILITATO //100 +DENCOM = S_DISABILITATO //100 +STATOCF = S_DISABILITATO //100 +DESSTATOCF = S_DISABILITATO //100 +CODVAL1 = S_NORMALE //200 +CODVAL2 = S_NORMALE //200 +NOME_VAL1 = S_NORMALE //200 +NOME_VAL2 = S_NORMALE //200 +CAMBIO = S_NORMALE //200 +DATA_CAMBIO1 = S_NORMALE //200 +DATA_CAMBIO2 = S_NORMALE //200 +CODLIN = S_NORMALE //300 +DESLIN = S_NORMALE //300 +CODPAG = S_OBBLIGATORIO //400 +DESCODPAG = S_NORMALE //400 +GRSCADENZE = S_NORMALE //500 +DATAINSC = S_NORMALE //500 +DATASCAD1 = S_DISABILITATO //500 +DATASCAD2 = S_DISABILITATO //500 +DATASCAD3 = S_DISABILITATO //500 +DATASCAD4 = S_DISABILITATO //500 +DATASCAD5 = S_DISABILITATO //500 +CODABIA = S_OBBLIGATORIO //600 +CODCABA = S_OBBLIGATORIO //600 +DESBANAPP = S_NORMALE //600 +CODABIP = S_NORMALE //700 +CODCABP = S_NORMALE //700 +DESBANPRE = S_NORMALE //700 +CATVEN = S_NORMALE //800 +DESCATVEN = S_DISABILITATO //800 +CODLIST1 = S_NORMALE //800 +CODLIST2 = S_NORMALE //800 +DESLIST = S_DISABILITATO //800 +CODCONT1 = S_NORMALE //810 +CODCONT2 = S_NORMALE //810 +DESCONT = S_DISABILITATO //810 +CODCAMP = S_NORMALE //820 +DESCAMP = S_DISABILITATO //820 +SCONTOPERC = S_NORMALE //830 +GRINDSPED = S_NORMALE //900 +CODINDSP = S_NORMALE //900 +RAGSOCSP = S_DISABILITATO //900 +INDSP = S_DISABILITATO //900 +CIVSP = S_DISABILITATO //900 +LOCALITASP = S_DISABILITATO //900 +CAPSP = S_DISABILITATO //900 +COMSP = S_DISABILITATO //900 +DENCOMSP = S_DISABILITATO //900 +PROVCOMSP = S_DISABILITATO //900 +STATOSP = S_DISABILITATO //900 +DESSTATOSP = S_DISABILITATO //900 +DATADOCRIF = S_NASCOSTO //1000 +NUMDOCRIF = S_NASCOSTO //1000 +CODAGVIS = S_NASCOSTO //1110 +DESAGVIS = S_NASCOSTO //1110 +CODAG = S_NORMALE //1100 +DESAG = S_NORMALE //1100 +CODSPMEZZO = S_OBBLIGATORIO //1200 +DESSPMEZZO = S_NORMALE //1200 +CODPORTO = S_NORMALE //1210 +DESPORTO = S_NORMALE //1210 +CODNOTESP1 = S_NORMALE //1300 +DESNOTESP1 = S_NORMALE //1300 +CODNOTESP2 = S_NASCOSTO //1300 +DESNOTESP2 = S_NASCOSTO //1300 +CAUSTRASP = S_OBBLIGATORIO //1400 +DENCAUSTRASP = S_NORMALE //1400 +CODVETT1 = S_NORMALE //1500 +CODVETT2 = S_NASCOSTO //1500 +CODVETT3 = S_NASCOSTO //1500 +NOMEVETT1 = S_NORMALE //1500 +NOMEVETT2 = S_NASCOSTO //1500 +NOMEVETT3 = S_NASCOSTO //1500 +NCOPIE = S_NASCOSTO //1600 +GRPARTENZA = S_NORMALE //1700 +DATAPART = S_NORMALE //1700 +ORAPART = S_NORMALE //1700 +IMPPAGATO = S_NORMALE //1800 +ACCSALDO = S_NORMALE //1800 +DOC1 = S_NASCOSTO //1900 +DOC2 = S_NASCOSTO //1900 +DOC3 = S_NASCOSTO //1900 +DATACONS = S_NASCOSTO //2000 +ASPBENI1 = S_OBBLIGATORIO //2100 +DESCRBENI1 = S_NORMALE //2100 +ASPBENI2 = S_NASCOSTO //2100 +DESCRBENI2 = S_NASCOSTO //2100 +IMPNETTI = S_NORMALE //2200 +RAGGREFF = S_NORMALE //2300 +SPESEINC = S_NORMALE //2400 +ADDBOLLI = S_NORMALE //2400 +UMTARA = S_NORMALE //2710 +TARA = S_NORMALE //2710 +DESUMTARA = S_NASCOSTO //2710 +UMPNETTO = S_NORMALE //2700 +PNETTO = S_NORMALE //2700 +DESUMPNETTO = S_NASCOSTO //2700 +NCOLLI = S_NORMALE //2800 +DATACONS = S_NORMALE //2000 +CAUSMAG = S_NORMALE //2900 +DESCRMAG = S_DISABILITATO //2900 +CAUSMAGC = S_DISABILITATO //2900 +DESCRMAGC = S_DISABILITATO //2900 +BLANK = S_DISABILITATO //4000 [SHEET] -NCOLS=4 -1=2 -2=5 -3=6||30 -4=9 -5=10 -6=13 -7=8 +NCOLS=20 +1=FR_CODMAG +2=FR_CODDEP +3=FR_CODART +4=FR_LIV1 +5=FR_LIV2 +6=FR_LIV3 +7=FR_LIV4 +8=FR_DESCR +9=FR_UMQTA +10=FR_QTA +11=FR_QTAEVASA +12=FR_RIGAEVASA +13=FR_PREZZO +14=FR_SCONTO +15=FR_PERCPROV +16=FR_CODIVA +17=FR_ADDIVA +18=FR_CAUS +19=FR_CODMAGC +20=FR_CODDEPC [RIGHE] NTIPIRIGA=3 @@ -241,13 +253,53 @@ NHANDLER=0 1800 = S_NASCOSTO 1900 = S_NASCOSTO 2000 = S_NORMALE -2100 = S_NASCOSTO -2200 = S_NASCOSTO -2300 = S_NASCOSTO -2400 = S_NASCOSTO -2500 = S_NASCOSTO -2600 = S_NASCOSTO -2700 = S_NASCOSTO -2800 = S_NASCOSTO -2900 = S_NASCOSTO +2100 = S_NORMALE +2200 = S_NORMALE +2300 = S_NORMALE +2400 = S_NORMALE +2500 = S_NORMALE +2700 = S_NORMALE +2710 = S_NORMALE +2800 = S_NORMALE +2900 = S_NORMALE +3000 = S_NORMALE +3200 = S_NORMALE +3400 = S_NORMALE + +[ORDINEGRUPPI] +NGROUPS=34 +1=100 +2=200 +3=300 +4=400 +5=500 +6=600 +7=700 +8=800 +9=810 +10=820 +11=830 +12=900 +13=1100 +14=1200 +15=1210 +16=1300 +17=1400 +18=1700 +19=2100 +20=2700 +21=2710 +22=2800 +23=1500 +24=1800 +25=2200 +26=2300 +27=2400 +28=3000 +29=3200 +30=2500 +31=3400 +32=1600 +33=2000 +34=2900 diff --git a/ve/sconti.cpp b/ve/sconti.cpp index c0fb659ce..f95099031 100755 --- a/ve/sconti.cpp +++ b/ve/sconti.cpp @@ -106,7 +106,8 @@ void TCond_vendita::set_iva(const TString & codiva) bool TCond_vendita::cerca( int tiporicerca ) { - if( config_ditta().get_bool( "GES", "ve", tiporicerca ) ) + TConfig config_ditta(CONFIG_DITTA, "ve"); + if( config_ditta.get_bool( "GES", "ve", tiporicerca ) ) { // Se h attiva la gestione contratti ... _condv.setkey( 1 ); @@ -120,7 +121,7 @@ bool TCond_vendita::cerca( int tiporicerca ) if (codcont.empty()) return FALSE; _condv.put("TIPO", "C"); - if(config_ditta().get_bool("GESCONCC", "ve")) + if(config_ditta.get_bool("GESCONCC", "ve")) { _condv.put("TIPOCF", clifo().tipo()); _condv.put("CODCF", clifo().codice()); @@ -137,7 +138,7 @@ bool TCond_vendita::cerca( int tiporicerca ) _condv.put("TIPO", "L"); // Se in ditta h abilitata la gestione della categoria di vendita in chiave // al listino, la carico con gioia - if( config_ditta().get_bool("GESLISCV", "ve")) + if( config_ditta.get_bool("GESLISCV", "ve")) _condv.put("CATVEN", testa().get(F_CATVEN)); _condv.put("COD", codlist); } @@ -195,18 +196,18 @@ bool TCond_vendita::cerca( int tiporicerca ) } break; case 'R': - _rcondv.put("CODRIGA", anamag().get( "RAGGFIS")); + _rcondv.put("CODRIGA", _anamag.get( "RAGGFIS")); _rcondv.read(); break; case 'S': { - _rcondv.put( "CODRIGA", anamag().get("GRMERC")); + _rcondv.put( "CODRIGA", _anamag.get("GRMERC")); _rcondv.read( ); } break; case 'G': { - _rcondv.put( "CODRIGA", anamag().get("GRMERC").left(3)); + _rcondv.put( "CODRIGA", _anamag.get("GRMERC").left(3)); _rcondv.read( ); } break; @@ -253,7 +254,7 @@ real TCond_vendita::get_percprovv(char tipoprovv, const TString & codpr, TLocali val = age.get_real(AGE_PERCPROVV); break; case 'M': - val = anamag().get_real(ANAMAG_PERCPROVV); + val = _anamag.get_real(ANAMAG_PERCPROVV); break; case 'C': val = clifo().vendite().get_real(CFV_PERCPROVV); @@ -324,17 +325,17 @@ real TCond_vendita::get_percprovv(char tipoprovv, const TString & codpr, TLocali campo.rpad(riga().field(FR_CODARTMAG).size()); break; case 'E': - campo = anamag().get(ANAMAG_GRMERC); - campo.rpad(anamag().curr().length(ANAMAG_GRMERC)); + campo = _anamag.get(ANAMAG_GRMERC); + campo.rpad(_anamag.curr().length(ANAMAG_GRMERC)); campo.cut(3); break; case 'R': - campo = anamag().get(ANAMAG_GRMERC); - campo.rpad(anamag().curr().length(ANAMAG_GRMERC)); + campo = _anamag.get(ANAMAG_GRMERC); + campo.rpad(_anamag.curr().length(ANAMAG_GRMERC)); break; case 'F': - campo = anamag().get(ANAMAG_RAGGFIS); - campo.rpad(anamag().curr().length(ANAMAG_RAGGFIS)); + campo = _anamag.get(ANAMAG_RAGGFIS); + campo.rpad(_anamag.curr().length(ANAMAG_RAGGFIS)); break; default: campo.cut(0); @@ -361,17 +362,17 @@ real TCond_vendita::get_percprovv(char tipoprovv, const TString & codpr, TLocali void TCond_vendita::ricerca(bool load_um_only, bool load_scagl_only) { - TString codart = anamag().get(ANAMAG_CODART); + TString codart = _anamag.get(ANAMAG_CODART); const TString codriga = riga().get( FR_CODARTMAG ); _ivarid = clifo().vendite().get_bool(CFV_IVARID); _load_mask = !load_um_only && !load_scagl_only; - if(anamag().bad() || codriga != codart ) + if(_anamag.bad() || codriga != codart ) { - anamag().setkey(1); - anamag().put("CODART", codriga); - if (anamag().read() != NOERR) + _anamag.setkey(1); + _anamag.put("CODART", codriga); + if (_anamag.read() != NOERR) { set_prezzo(ZERO); set_sconto(""); @@ -380,16 +381,16 @@ void TCond_vendita::ricerca(bool load_um_only, bool load_scagl_only) return; } } - codart = umart().get( "CODART" ); + codart = _umart.get( "CODART" ); const TString16 umriga(riga().get(FR_UMQTA)); - const TString16 um(umart().get("UM")); - if (umart().bad() || codart != codriga || um != umriga) + const TString16 um(_umart.get("UM")); + if (_umart.bad() || codart != codriga || um != umriga) { - umart().setkey(2); - umart().put("CODART", codriga); - umart().put("UM", um); - if (umart().read != NOERR) - umart().zero(); + _umart.setkey(2); + _umart.put("CODART", codriga); + _umart.put("UM", umriga); + if (_umart.read() != NOERR) + _umart.zero(); } const bool found_condv = cerca(A_CONTRATTI) || cerca(A_OFFERTE) || cerca(A_LISTINI); @@ -404,17 +405,18 @@ void TCond_vendita::ricerca(bool load_um_only, bool load_scagl_only) _load_mask = !load_um_only && !load_scagl_only; } else - set_prezzo(umart().get_real("PREZZO")); + set_prezzo(_umart.get_real("PREZZO")); if (_ivarid) - set_iva(anamag().get(ANAMAG_CODIVAR)); + set_iva(_anamag.get(ANAMAG_CODIVAR)); else - set_iva(anamag().get(ANAMAG_CODIVA)); + set_iva(_anamag.get(ANAMAG_CODIVA)); - const char gestione = config_ditta().get_char( "GESSCORIGA", "ve" ); - const bool sco_scagl = config_ditta().get_bool("GESCOSCA", "ve"); - const bool sco_um_gest = config_ditta().get_bool("GESSCORIGAUM", "ve"); + TConfig config_ditta(CONFIG_DITTA, "ve"); + const char gestione = config_ditta.get_char( "GESSCORIGA", "ve" ); + const bool sco_scagl = config_ditta.get_bool("GESCOSCA", "ve"); + const bool sco_um_gest = config_ditta.get_bool("GESSCORIGAUM", "ve"); switch (gestione) { @@ -432,17 +434,17 @@ void TCond_vendita::ricerca(bool load_um_only, bool load_scagl_only) _load_mask = !load_um_only && !load_scagl_only; } else - set_sconto(anamag().get("SCONTO")); + set_sconto(_anamag.get("SCONTO")); break; case 'A': { // Posiziono l'anagrafica - const char rigakey = config_ditta().get_char( "SCORIGAKEY", "ve" ); + const char rigakey = config_ditta.get_char( "SCORIGAKEY", "ve" ); _sconti.setkey(1); _sconti.put("TIPO", "R"); - if( config_ditta().get_bool("GESSCORIGACV", "ve")) - _sconti.put("CODCAT", clifo().vendite().get(CFV_CATVEN)); + if( config_ditta.get_bool("GESSCORIGACV", "ve")) + _sconti.put("CODCAT", testa().get(F_CATVEN)); if (sco_um_gest) _sconti.put("UM", riga().get( FR_UMQTA)); _sconti.put("TIPORIGA", rigakey); @@ -457,18 +459,18 @@ void TCond_vendita::ricerca(bool load_um_only, bool load_scagl_only) _sconti.read(); break; case 'R': - _sconti.put("CODART", anamag().get("RAGGFIS")); - _sconti.read(); + _sconti.put("CODART", _anamag.get("RAGGFIS")); + _sconti.read(); break; case 'C': { - _sconti.put( "CODART", anamag().get("GRMERC")); + _sconti.put( "CODART", _anamag.get("GRMERC")); _sconti.read( ); } break; case 'L': { - _sconti.put("CODART", anamag().get("GRMERC").left(3)); + _sconti.put("CODART", _anamag.get("GRMERC").left(3)); _sconti.read(); } break; @@ -533,7 +535,7 @@ void TCond_vendita::ricerca(bool load_um_only, bool load_scagl_only) real percprovv = ZERO; if (seqric[0] == '-') - seqric = config_ditta().get( "AGETIPOPERC", "ve" ); + seqric = config_ditta.get( "AGETIPOPERC", "ve" ); int len = seqric.len(); @@ -663,11 +665,11 @@ void TCond_vendita::update_omaggi(bool full) } } -TCond_vendita::TCond_vendita(TCli_for * clifo, TConfig * ditta, TDocumento_mask * testa, TMask * riga, - TLocalisamfile * anamag, TLocalisamfile * umart) - : _clifo(clifo), _testa(testa), _riga(riga), +TCond_vendita::TCond_vendita(TDocumento_mask * testa, TMask * riga) + : _testa(testa), _riga(riga), _condv( LF_CONDV ), _rcondv( LF_RCONDV ), _sconti( LF_SCONTI ), - _anamag(anamag), _umart(umart), _config_ditta(ditta), _ivarid(FALSE) + _anamag(LF_ANAMAG), _umart(LF_UMART), + _ivarid(FALSE), _load_mask(FALSE) { } diff --git a/ve/sconti.h b/ve/sconti.h index b28327141..032a64a58 100755 --- a/ve/sconti.h +++ b/ve/sconti.h @@ -22,15 +22,15 @@ class TCond_vendita : public TObject real _prezzo; real _provv; real _molt_sconto; - TCli_for * _clifo; TLocalisamfile _condv; TLocalisamfile _rcondv; - TLocalisamfile * _anamag; + TLocalisamfile _anamag; TLocalisamfile _sconti; - TLocalisamfile * _umart; - TConfig * _config_ditta; - TDocumento_mask * _testa; - TMask * _riga; + TLocalisamfile _umart; + + TDocumento_mask* _testa; + TMask* _riga; + bool _load_mask; bool cerca(int tiporicerca); @@ -43,14 +43,11 @@ protected: void set_iva(const TString & codiva); void update_omaggi(bool full); - TConfig & config_ditta() const { CHECK(_config_ditta, "Configurazione ditta non inizializzata"); return * _config_ditta; } TDocumento_mask & testa() const { CHECK(_testa, "Maschera testata non inizializzata"); return * _testa; } - TMask & riga() const { CHECK(_testa, "Maschera testata non inizializzata"); return * _riga; } - TLocalisamfile & anamag() const { CHECK(_anamag, "Anagrafica di magazzino non inizializzata") ; return *_anamag; } - TLocalisamfile & umart() const { CHECK(_umart, "Anagrafica di unita' di misura magazzino non inizializzata") ; return *_umart; } + TMask & riga() const { CHECK(_riga, "Maschera riga non inizializzata"); return * _riga; } public: - TCli_for & clifo() const { CHECK(_clifo, "Cliente/fornitore non inizializzato"); return * _clifo; } + TCli_for & clifo() const { return _testa->doc().clifor(); } bool set_sconto( const char * exp, bool signal = FALSE ); const TString& get_sconto() const { return _sconto; } real sconto_val() const { return _molt_sconto;} @@ -59,17 +56,15 @@ public: real get_percprovv(char tipoprovv, const TString & codpr, TLocalisamfile & age) const; const TString & get_iva() const { return _codiva; } - void set_clifo( TCli_for * clifo) { _clifo = clifo; } - void set_config( TConfig * ditta) { _config_ditta = ditta; } +// void set_clifo( TCli_for * clifo) { _clifo = clifo; } +// void set_config( TConfig * ditta) { _config_ditta = ditta; } void set_testa( TDocumento_mask * testa ){ _testa = testa; } void set_riga( TMask * riga ){ _riga = riga; } - void set_anamag(TLocalisamfile & anamag) { _anamag = &anamag; } - void set_umart(TLocalisamfile & umart) { _umart = &umart; } + void ricerca(bool load_um_only = FALSE, bool load_scagl_only = FALSE); bool gestum() const { return _condv.get_bool("GESTUM"); } - TCond_vendita(TCli_for * clifo = NULL, TConfig * _ditta = NULL, TDocumento_mask * testa = NULL, TMask * riga = NULL, - TLocalisamfile * anamag = NULL, TLocalisamfile * umart = NULL); + TCond_vendita(TDocumento_mask* testa, TMask* riga); virtual ~TCond_vendita() {} }; diff --git a/ve/scontid.frm b/ve/scontid.frm index 67b5ecbbe..8bf4b7412 100755 --- a/ve/scontid.frm +++ b/ve/scontid.frm @@ -11,8 +11,8 @@ END GENERAL BEGIN OFFSET 0 0 - FONT "Courier New" - SIZE 12 +// FONT "Courier New" +// SIZE 12 END diff --git a/ve/scontii.frm b/ve/scontii.frm index 67b48f3e4..9e6c3aeda 100755 --- a/ve/scontii.frm +++ b/ve/scontii.frm @@ -20,8 +20,8 @@ END GENERAL BEGIN OFFSET 0 0 - FONT "Courier New" - SIZE 12 +// FONT "Courier New" +// SIZE 12 END diff --git a/ve/scontir.frm b/ve/scontir.frm index a2465c46e..6c522c3e1 100755 --- a/ve/scontir.frm +++ b/ve/scontir.frm @@ -17,8 +17,8 @@ END GENERAL BEGIN OFFSET 0 0 - FONT "Courier New" - SIZE 12 +// FONT "Courier New" +// SIZE 12 END diff --git a/ve/ve0100.cpp b/ve/ve0100.cpp index 57b8bc678..d90a7f0b8 100755 --- a/ve/ve0100.cpp +++ b/ve/ve0100.cpp @@ -1,55 +1,58 @@ -#include "ve0100.h" -#include "ve0100b1.h" -#include "ve0100o.h" -#include "veini.h" - #include -#include +#include #include -#include +#include + +#include "ve0100.h" +#include "veini.h" #include "veuml.h" #include "veuml1.h" #include "verig.h" #include "sconti.h" -#include "utility.h" #include "..\mg\mglib.h" - void TMotore_application::init_query_mode( TMask& m ) { - _msk->set( F_CODNUM, _codnum); + disable_menu_item(M_FILE_PRINT); + + _msk->set(F_CODNUM, _codnum); _msk->field(F_CODNUM).set_focusdirty(TRUE); _msk->field(F_CODNUM).on_key(K_TAB); _msk->field(F_CODNUM).set_dirty(FALSE); - - _msk->set( F_TIPODOC, _tipodoc, TRUE); + _msk->set(F_TIPODOC, _tipodoc, TRUE); } void TMotore_application::init_insert_mode( TMask& m ) { - TString tipocf( "A" ); - tipocf[ 0 ] = app().tipocf(); - const TString16 codnum(m.get(F_CODNUM)); const int anno = m.get_int(F_ANNO); const char provv = m.get(F_PROVV)[0]; const long numdoc = m.get_long(F_NDOC); - _doc->read(provv, anno, codnum, numdoc); - _doc->set_tipo(m.get(F_TIPODOC)); + TDocumento_mask& dm = (TDocumento_mask&)m; + TDocumento& curdo = dm.doc(); + + curdo.read(provv, anno, codnum, numdoc); + curdo.set_tipo(m.get(F_TIPODOC)); + + const char stato = curdo.tipo().stato_finale_inserimento(); + curdo.stato(stato); _codnum = codnum; _tipodoc = m.get(F_TIPODOC); - m.field(F_CODNUM).set_focusdirty(TRUE); m.field(F_CODNUM).on_key(K_TAB); m.field(F_TIPODOC).set_focusdirty(TRUE); m.field(F_TIPODOC).on_key(K_TAB); - m.set(F_STATO, _doc->stato()); - const TString16 data_doc(m.get( F_DATADOC)); + + // 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)); int pos = m.id2pos( F_DATACAMBIO1); @@ -59,46 +62,41 @@ void TMotore_application::init_insert_mode( TMask& m ) m.fld(pos).dirty(); } m.disable(DLG_PRINT); - _occas_mask->reset( ); pos = m.id2pos(F_CAUSMAG); if (pos >= 0) { - m.fld(pos).set(doc().tipo().caus_mov()); + m.fld(pos).set(curdo.tipo().caus_mov()); m.fld(pos).dirty(); } - const int ndefaults = pro( ).get_int( "NDEFAULTS", "DEFAULT" ); // prof - - for( int i = 1; i <= ndefaults; i++ ) + TConfig& prof = curdo.tipo().profile(); + const int ndefaults = prof.get_int("NDEFAULTS", "DEFAULT"); // prof + for( int i = 1; i <= ndefaults; i++) { TString16 chiave; chiave.format( "%d", i ); - TToken_string valore( pro( ).get( chiave, "DEFAULT" ) ); + TToken_string valore( prof.get( chiave, "DEFAULT" ) ); int campo( valore.get_int( 0 ) ); TString default_val( valore.get( 1 ) ); m.set( campo, default_val, TRUE ); } + + m.disable(DLG_ELABORA); } void TMotore_application::init_modify_mode( TMask& m ) { + enable_menu_item(M_FILE_PRINT); m.enable(DLG_PRINT); -} - -void TMotore_application::update_profile() -{ - TFilename fn(_doc->tipo().profile_name()); - - fn.ext("ini"); - if (_pro && _pro->name() != fn) + m.enable(DLG_ELABORA); + m.disable(F_STATO); + if (!doc().modificabile()) { - delete _pro; - _pro = NULL; + warning_box("Documento non modificabile."); + m.disable(DLG_SAVEREC); } - if (_pro == NULL) - _pro = new TConfig( fn ); } int TMotore_application::user_function(int index) @@ -108,495 +106,13 @@ int TMotore_application::user_function(int index) case 1: break; default: - yesnofatal_box( "Chiamata ad una procedura utente non definita: %d", index ); + yesnofatal_box("Chiamata ad una procedura utente non definita: %d", index); return NOERR; break; } return NOERR; } -// Funzione che dato il profilo di riga ottiene la maschera -// Serve per ottenere una maschera diversa per ogni riga -TMask * TMotore_application::ss_getmask( int numriga, TMask& fullmask) -{ - const int n = numriga + 1; - if (n <= app()._doc->physical_rows()) - { - TRiga_documento & riga = (*(app()._doc))[numriga + 1]; - - return ((TTipo_riga_documento &)riga.tipo()).mask(); - } - else - return &fullmask; -} - -void TMotore_application::user_set_handler( int fieldid, int index, TMask* m ) -{ - if ( !m ) - m = &edit_mask( ); - switch( index ) - { - case 1: - m->set_handler( fieldid, ora_hndl ); - break; - case 3: - m->set_handler( fieldid, dummy_hndl ); - break; - default: - CHECK( FALSE, "Tentativo di installare un handler non definito" ); - break; - } -} - -bool TMotore_application::ss_handler( TSheet_field& ss, int r, KEY key ) - -{ - if ( key == K_ENTER ) // modifica - { - TRiga_documento & riga = (*(app()._doc))[r + 1]; - - riga.autosave(ss); - } - else - if ( key == K_DEL ) // Cancellazione - { - app()._doc->destroy_row(r + 1, TRUE); - if (r < app()._doc->rows()) - { - TRiga_documento & riga = (*(app()._doc))[r + 1]; - if (riga.is_omaggio() && riga.is_generata()) - { - ss.destroy(r + 1); - app()._doc->destroy_row(r + 1, TRUE); - } - } - } - else - if (key == K_INS) // Inserimento - { - if (r < app()._doc->rows()) - { - TRiga_documento & riga = (*(app()._doc))[r + 1]; - if (riga.is_omaggio() && riga.is_generata()) - return FALSE; - } - TMask & emask = app().edit_mask(); - app()._doc->insert_row(r + 1, emask.get( F_LBTIPORIGA )); - } - else - if (key == K_CTRL + K_INS) - { - TRiga_documento & riga = (*(app()._doc))[r + 1]; - TRectype & ven_rec = app().doc().clifor().vendite(); - TString16 s(ven_rec.get(CFV_CODMAG)); - if (s.not_empty()) - { - s.left_just(3); - s << ven_rec.get(CFV_CODDEP); - } - else - { - s = app()._std_mag; - s.left_just(3); - s << app()._std_dep; - } - riga.put("CODMAG", s); - riga.autoload(ss); - ss.check_row(r); - ss.select(r); - } - else - if ( key == K_TAB ) // modifica - set_curr_um(ss.sheet_mask()); - - return TRUE; -} - -bool TMotore_application::num_handler( TMask_field& f, KEY key ) -{ - // Ottengo la maschera - TMask& m = f.mask( ); - - if (key == K_TAB && f.to_check(key, TRUE)) - { - TTable & tabnum = ((TTable &) ((TEdit_field &)f).browse()->cursor()->file()); - if ( tabnum.good()) - { - if (app()._cod_num) - delete app()._cod_num; - app()._cod_num = new TCodice_numerazione(tabnum.curr()); - TCodice_numerazione * c = app()._cod_num; - m.set( F_DESNUM, c->descrizione()); - // Propone il primo tipo di documento come default - m.set( F_TIPODOC, c->tipo_doc(0)); - m.send_key( K_TAB, F_TIPODOC ); - // Se per questa numerazione h abilitata le numerazione provvisoria - if (c->num_provv()) - { - // Setta di default la numerazione provvisoria - m.set( F_PROVV, "P" ); - // Abilita il campo per la selezione della numerazione - m.enable( F_PROVV ); - } - else // Altrimenti ... - { - // Setta la numerazione a definitiva - m.set( F_PROVV, "D" ); - // Disabilita il campo per la selezione della numerazione - m.disable( F_PROVV ); - } - } - else - { - m.set( F_DESNUM, "" ); - m.set( F_TIPODOC, "" ); - } - } - return TRUE; -} - -HIDDEN bool elab_hndl( TMask_field & f, KEY key ) -{ - if (f.to_check(key, TRUE)) - { - const int id = f.dlg(); - } - return TRUE; -} - -class TElabora_mask : public TMask -{ - TMask * _main; - static TLista_elaborazioni _elab; - // @access Public Member -public: - void update_list(); - void elabora(); - static bool tipo_elaborazione_handler( TMask_field& f, KEY key ); - static bool tipo_documento_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); - // @cmember Distruttore - virtual ~TElabora_mask() {} -}; - -void TElabora_mask::update_list() -{ - TString_array elabs; - const TString16 tipo(_main->get(F_TIPODOC)); - const TString16 stato(_main->get(F_STATO)); - const TString16 tipo_elab(get(F_TIPODOC_ELAB)); - const TString16 stato_elab(get(F_STATODOC_ELAB)); - const bool from_elab = !get_bool(F_TYPE); - int items = 0; - - if (from_elab) - items = _elab.select(elabs, tipo, stato, tipo_elab, stato_elab) ; - else - items = _elab.select(elabs, tipo_elab, stato_elab, tipo, stato) ; - - const bool ok = items > 0; - - enable(DLG_OK, ok); - enable(F_ELAB, ok); - - TList_field & f = (TList_field &) field(F_ELAB); - TToken_string codes; - TToken_string descrs; - - - if (ok) - for (int i = 0; i < items; i++) - { - codes.add(format("%s", (const char *)_elab[elabs.row(i)].codice())); - descrs.add((const char *)_elab[elabs.row(i)].descrizione()); - } - f.replace_items(codes, descrs); -} - - -TLista_elaborazioni TElabora_mask::_elab; - -void TElabora_mask::elabora() - -{ - TLista_documenti in; - TLista_documenti out; - TDocumento & app_doc = ((TDocumento_mask *)_main)->doc(); - long numdoc = get_long(F_NDOC_ELAB); - - TDocumento d(*get(F_PROVV_ELAB), get_int(F_ANNO_ELAB), get(F_CODNUM_ELAB), numdoc, new TCond_vendita()); - - if (numdoc <= 0) - { - TDocumento::copy_data(d.head(), app_doc.head()); - d.put(DOC_TIPODOC, get(F_TIPODOC_ELAB)); - } - - const bool from_elab = !get_bool(F_TYPE); - const TString16 cod_elab(get(F_ELAB)); - - if (from_elab) - { - in.add(app_doc); - out.add(d); - if (_elab[cod_elab].elabora(in, out, TDate(TODAY), TRUE)) - { - if (out[0] != d) - out.rewrite(); - if (in[0] != app_doc) - { - in.rewrite(); - app_doc = in[0]; - } - } - } - else - { - out.add(app_doc); - in.add(d); - if (_elab[cod_elab].elabora(in, out, TDate(TODAY), TRUE)) - { - if (out[0] != app_doc) - { - out.rewrite(); - app_doc = out[0]; - } - if (in[0] != d) - in.rewrite(); - } - } - -} - -bool TElabora_mask::tipo_elaborazione_handler( TMask_field& f, KEY key ) -{ - if (key == K_SPACE) - ((TElabora_mask&)f.mask()).update_list(); - return TRUE; -} - -bool TElabora_mask::tipo_documento_handler( TMask_field& f, KEY key ) -{ - if (f.to_check(key, TRUE)) - ((TElabora_mask&)f.mask()).update_list(); - return TRUE; -} - -TElabora_mask::TElabora_mask(const char* title, TMask * main_mask) - : TMask(title), _main(main_mask) -{ - set_handler(F_TYPE, tipo_elaborazione_handler); - set_handler(F_TIPODOC_ELAB, tipo_documento_handler); - set_handler(F_STATODOC_ELAB, tipo_documento_handler); -} - -bool TMotore_application::elabora_handler( TMask_field& f, KEY key ) -{ - if (key == K_SPACE) - { - if (app().save(TRUE)) // Registra il record corrente - { - TElabora_mask selection("ve0100b", &f.mask()); - bool ok = FALSE; - - selection.set(F_ANNO_ELAB, f.mask().get(F_ANNO)); - selection.set(F_TIPOCF_ELAB, f.mask().get(F_TIPOCF)); - selection.set(F_CODCF_ELAB, f.mask().get(F_CODCF)); - if (selection.run() == K_ENTER) - selection.elabora(); - } - - } - return TRUE; -} - -bool TMotore_application::codlist_handler( TMask_field& f, KEY key ) -{ - if (key == K_TAB && f.focusdirty()) - { - TLocalisamfile & list = ((TEdit_field &) f).browse()->cursor()->file(); - const TDate datadoc(f.mask().get(F_DATADOC)); - const TDate datascad(list.get_date("VALFIN")); - - if (datascad.ok() && datadoc > datascad) - { - const TString16 codsucc(list.get("CODLISSUCC")); - - if (codsucc.empty()) - return error_box("Listino scaduto il %s", datascad.string()); - else - { - f.set(codsucc); - f.set_focusdirty(); - ((TEdit_field &)f).check(); - } - } - } - return TRUE; -} - -bool TMotore_application::codcont_handler( TMask_field& f, KEY key ) -{ - if (key == K_TAB && f.focusdirty()) - { - TLocalisamfile & cont = ((TEdit_field &) f).browse()->cursor()->file(); - const TDate datadoc(f.mask().get(F_DATADOC)); - const TDate datascad(cont.get_date("VALFIN")); - - if (datascad.ok() && datadoc > datascad) - return error_box("Contratto scaduto il %s", datascad.string()); - } - return TRUE; -} - -bool TMotore_application::codcamp_handler( TMask_field& f, KEY key ) -{ - if (key == K_TAB && f.focusdirty()) - { - TLocalisamfile & camp = ((TEdit_field &) f).browse()->cursor()->file(); - const TDate datadoc(f.mask().get(F_DATADOC)); - const TDate datascad(camp.get_date("VALFIN")); - - if (datascad.ok() && datadoc > datascad) - return error_box("Offerta scaduta il %s", datascad.string()); - } - return TRUE; -} - -bool TMotore_application::print_handler( TMask_field& f, KEY key ) - -{ - if (key == K_SPACE) - { - TMask& m = f.mask(); - - if (app().save(TRUE)) // Registra il record corrente - { - TString commandline("ve1 -0 "); - - commandline << m.get(F_CODNUM) << " " << m.get(F_ANNO) << " "; - commandline << m.get(F_PROVV) << " " << m.get(F_NDOC); - - TExternal_app interattivo( commandline ); - - interattivo.run(); - if (app().doc().stampabile()) - { - const char s[2] = {app().doc().tipo().stato_finale_stampa(), '\0'}; - - m.set(F_STATO, s, TRUE); - } - } - } - return TRUE; -} - -bool TMotore_application::occas_code_handler(TMask_field& f, KEY key) -{ - if (key == K_TAB && f.focusdirty()) - { - const char* code = f.get(); - if (*code) - { - TRelation occas(LF_OCCAS); - occas.lfile().put("CFPI", code); - if (occas.read(_isequal) == NOERR) - { - f.mask().autoload(occas); - f.mask().send_key(K_TAB, O_COMUNE); // Forza decodifica comuni - f.mask().send_key(K_TAB, O_COMUNENAS); - } - } - } - return TRUE; -} - -bool TMotore_application::occas_handler( TMask_field& f, KEY key ) -{ - TDocumento_mask & m = (TDocumento_mask &)f.mask(); - if ( key == K_SPACE && m.is_running( ) ) - { - TDocumento & doc = app().doc(); - TMask * occ_m = app()._occas_mask; - TOccasionale & occ = doc.occas(); - TCli_for & cli_for = doc.clifor(); - for (int i = occ_m->fields() - 1; i >= 0; i--) - { - TMask_field & f = occ_m->fld(i); - const TFieldref * c = f.field(); - if (c) - f.set(c->read(occ)); - } - if (occ_m->run() != K_ESC) - { - const TString80 ocfpi(occ_m->get(O_CODICE)); - doc.put("OCFPI", ocfpi); - m.set(F_OCFPI, ocfpi); - for (int i = occ_m->fields() - 1; i >= 0; i--) - { - TMask_field & f = occ_m->fld(i); - TFieldref * c = (TFieldref *) f.field(); - if (c) - c->write(f.get(), occ); - } - m.occ2mask(occ); - } - f.set_focus( ); - } - return TRUE; -} - - -bool TMotore_application::tip_handler( TMask_field& f, KEY key ) -{ - TMask& m = f.mask( ); - if ( key == K_TAB && m.is_running( ) && m.get(F_TIPODOC).not_empty()) - { - const TString16 tipo(f.get()); - TCodice_numerazione * c = app()._cod_num; - int last = c->ntipi_doc(); - for (int i = 0; i < last; i++ ) - { - const TString16 curtipo(c->tipo_doc(i)); - if (curtipo == tipo) - return TRUE; - } - return message_box( "Tipo non valido per la numerazione selezionata!" ); - } - return TRUE; -} - - -bool TMotore_application::clifo_handler( TMask_field& f, KEY key ) -{ - if (key != K_ENTER && f.to_check(key, TRUE)) - { - TDocumento & d = app().doc(); - TDocumento_mask & m = (TDocumento_mask &) f.mask(); - const TString & val = f.get(); - - d.put("TIPOCF", app().tipocf()); - d.put("CODCF", atol(val)); - - app().doc().clifor().put(CLI_CODCF, ""); // force reload - TCli_for & cli_for = app().doc().clifor(); - TOccasionale & occas = app().doc().occas(); - - if ( cli_for.get_bool("SOSPESO") ) - return f.error_box( "Il codice '%ld' e' sospeso e non puo' essere utilizzato", atol(val) ); - m.cli2mask(cli_for, occas, *(app()._config_ditta)); - if (cli_for.occasionale()) - { - if(m.id2pos(F_OCCASEDIT) > 0 && f.to_check(key) && *(occas.codice()) == '\0') - m.send_key( K_SPACE, F_OCCASEDIT ); // Lancia maschera occasionali - } - else - app().doc().zero("OCFPI"); - } - return TRUE; -} - bool TMotore_application::changing_mask( int mode ) { static int lastmode = NO_MODE; @@ -606,70 +122,6 @@ bool TMotore_application::changing_mask( int mode ) return change; } -void TMotore_application::configura_sheet( TSheet_field& sheet, TConfig& config ) -{ - TBit_array to_delete(MAX_COLUMNS); - to_delete.set(); - int ncols = config.get_int( "NCOLS", "SHEET" ); - for ( int i = 1; i <= ncols; i ++ ) - { - TString col; - col.format( "%d", i ); - TToken_string sheet_col( config.get( col, "SHEET" ) ); - const int field_id = sheet_col.get_int(0); - const int coltomove = sheet.cid2index(field_id); - to_delete.reset(coltomove); - - const TString descr(sheet_col.get( 1 )); - - if (descr.not_empty() ) - sheet.set_column_header( field_id, descr); - - const int size( sheet_col.get_int(2)); - - if (size != 0) - sheet.set_column_width( field_id, size); - - } - to_delete.reset(0); - to_delete.reset(1); - if (!to_delete[sheet.cid2index(FR_CODDEP)]) - sheet.enable_column(FR_CODDEP, _ges_dep && _ges_mag); - if (!to_delete[sheet.cid2index(FR_CODMAG)]) - sheet.enable_column(FR_CODMAG, _ges_mag); - if (!to_delete[sheet.cid2index(FR_CODDEPC)]) - sheet.enable_column(FR_CODDEPC, _ges_dep && _ges_mag); - if (!to_delete[sheet.cid2index(FR_CODMAGC)]) - sheet.enable_column(FR_CODMAGC, _ges_mag); - to_delete.set(sheet.cid2index(FR_CODARTMAG)); - to_delete.set(sheet.cid2index(FR_CHECKED)); - - const int sconto_col = sheet.cid2index(FR_SCONTO); - if (to_delete[sconto_col] == FALSE) - { - const bool del = (_config_ditta->get("GESSCORIGA") == "N"); - - to_delete.set(sconto_col, del); - } - - for ( i = MAX_COLUMNS - 1; i >= 0; i-- ) - if( to_delete[i] ) - { - sheet.enable_column( i + FIRST_FIELD, FALSE); - sheet.delete_column( i + FIRST_FIELD); - } - -/* for ( i = 1; i <= ncols; i ++ ) - { - TString col; - col.format( "%d", i ); - TToken_string sheet_col( config.get( col, "SHEET" ) ); - const int field_id = sheet_col.get_int(0); - - sheet.move_column(field_id, i); - } */ -} - TMask* TMotore_application::get_mask( int mode ) { switch ( mode ) @@ -678,170 +130,15 @@ TMask* TMotore_application::get_mask( int mode ) case MODE_MOD: { const TString16 tipodoc(_msk->get(F_TIPODOC)); + _docmsk = (TDocumento_mask*)_doc_masks.objptr(tipodoc); - TDocumento_mask * msk1 = (TDocumento_mask *) _doc_masks.objptr(tipodoc); - - _doc->set_tipo(tipodoc); - update_profile(); - - TString tipocf( app( ).pro( ).get( "TIPOCF", "MAIN" ) ); //prof - app( ).tipocf( tipocf[ 0 ] ); - if (msk1 == NULL) + if (_docmsk == NULL) { - msk1 = new TDocumento_mask(_doc->tipo().mask_name(), _doc, _rel); // prof - _doc_masks.add(tipodoc, msk1); - _sheet = &( TSheet_field& )msk1->field( F_SHEET ); - sheet( ).set_notify( ss_handler ); - sheet().set_append(FALSE); - TList_field& listbox = ( TList_field& ) msk1->field( F_LBTIPORIGA ); - const int numtr = app( ).pro( ).get_int( "NTIPIRIGA", "RIGHE" ); //prof - TToken_string keys, descrs; - TRiga_documento r(_doc); - - for ( int i = 1; i <= numtr; i ++ ) - { - TString16 var; - - var.format("%d", i); - TString tiporiga(app().pro().get(var, "RIGHE")); // pro - r.set_tipo(tiporiga); - keys.add(r.tipo().codice()); - descrs.add(r.tipo().descrizione()); - } - listbox.replace_items( keys, descrs ); - configura_sheet( *_sheet, *_pro ); - ((TVariable_sheet_field&)sheet()).set_getmask( ss_getmask ); - if (msk1->id2pos( F_OCCASEDIT ) > 0 ) - msk1->set_handler( F_OCCASEDIT, occas_handler ); - msk1->set_handler( F_CODCF, clifo_handler ); - msk1->set_handler( F_CODPAG, condpag_hndl ); - msk1->set_handler( F_DATAINSC, condpag_hndl ); - msk1->set_handler( F_CODNOTE, note_hndl ); - msk1->set_handler( F_DATADOC, data_hndl ); - msk1->set_handler( F_CODLIST, codlist_handler ); - msk1->set_handler( F_CODLIST1, codlist_handler ); - msk1->set_handler( F_CODCONT, codcont_handler ); - msk1->set_handler( F_CODCONT1, codcont_handler ); - msk1->set_handler( F_CODCAMP, codcamp_handler ); - msk1->set_handler( 99, elabora_handler ); // cazzo !!!!!! - msk1->set_handler( DLG_PRINT, print_handler ); - int numhandler = pro( ).get_int( "NHANDLER", "HANDLERS" ); // prof - for ( i = 1; i <= numhandler; i ++ ) - { - TString chiave; - chiave.format( "%d", i ); - TToken_string riga = pro( ).get( chiave, "HANDLERS" ); - user_set_handler( riga.get_int( 0 ), riga.get_int( 1 ) ); - } - - TCodgiac_livelli l; - - for ( i = MAX_GIAC_LEVEL; i > 0; i--) - { - const short pos = _sheet->cid2index(FR_LIV1 + i -1); - if (l.enabled(i)) - { - const TString & header = l.name(i); - const int len = header.len() + 1; - const int f_len = l.code_length(i); - _doc->set_liv_giac_len(i, f_len); - - _sheet->set_column_header(pos, l.name(i)); - _sheet->set_column_width(pos, (len > f_len ? len : f_len) * 8); - } - else - { - _sheet->delete_column(pos); - _doc->set_liv_giac_len(i, 0); - } - } - -// configurazione campi - - const bool gesval = _config_ditta->get_bool("GESVAL"); - const bool gescambi = _config_ditta->get_bool("GESVALAC"); - - if (gesval) - { - msk1->show(F_CODVAL, !gescambi); - msk1->show(F_DATACAMBIO, !gescambi); - msk1->show(F_NOMEVAL, !gescambi); - msk1->show(F_CODVAL1, gescambi); - msk1->show(F_DATACAMBIO1, gescambi); - msk1->show(F_NOMEVAL1, gescambi); - msk1->show(F_CAMBIO); - } - else - { - msk1->disable(F_CODVAL); - msk1->disable(F_DATACAMBIO); - msk1->disable(F_NOMEVAL); - msk1->hide(F_CODVAL1); - msk1->hide(F_DATACAMBIO1); - msk1->hide(F_NOMEVAL1); - msk1->disable(F_CAMBIO); - } - - const bool geslin = _config_ditta->get_bool("GESLIN"); - - msk1->enable(F_CODLIN, geslin); - msk1->enable(F_DESLIN, geslin); - - const bool geslis = _config_ditta->get_bool("GES", "ve", 1); - const bool gesliscatven = _config_ditta->get_bool("GESLISCV"); - - if (geslis) - { - msk1->show(F_CODLIST, !gesliscatven); - msk1->show(F_CODLIST1, gesliscatven); - } - else - { - msk1->disable(F_CODLIST); - msk1->hide(F_CODLIST1); - } - - const bool gescontr = _config_ditta->get_bool("GES", "ve", 2); - const bool gescontrcli = _config_ditta->get_bool("GESCONCC"); - - if (gescontr) - { - - msk1->show(F_CODCONT1, gescontrcli); - msk1->show(F_CODCONT, !gescontrcli); - } - else - { - msk1->disable(F_CODCONT); - msk1->hide(F_CODCONT1); - } - - const bool gesoff = _config_ditta->get_bool("GES", "ve", 3); - - msk1->enable(F_CODCAMP, gesoff); - - const bool gessco = _config_ditta->get_char("GESSCO") != 'N'; - - msk1->enable(F_SCONTOPERC, gessco); - - const bool gesage = _config_ditta->get_bool("GESAGE"); - - msk1->enable(F_CODAG, gesage); - msk1->enable(F_DESAG, gesage); - msk1->enable(F_CODAGVIS, gesage); - msk1->enable(F_DESAGVIS, gesage); - const bool has_movmag = app().has_module(MGAUT, CHK_DONGLE) && _doc->tipo().mov_mag(); - short pos = msk1->id2pos(F_CAUSMAG); - if (pos >= 0) - msk1->fld(pos).show(has_movmag); - pos = msk1->id2pos(F_DESCRMAG); - if (pos >= 0) - msk1->fld(pos).show(has_movmag); + _docmsk = new TDocumento_mask(tipodoc); + _doc_masks.add(tipodoc, _docmsk); } - else - _sheet = &( TSheet_field& )edit_mask( ).field( F_SHEET ); - return msk1; } + return _docmsk; break; default: return _msk; @@ -849,16 +146,17 @@ TMask* TMotore_application::get_mask( int mode ) } } -bool TMotore_application::get_next_key(TToken_string& key) -{ - TMask& m = curr_mask(); - - // Se per questa numerazione h abilitata le numerazione automatica - if( _cod_num->auto_num()) +const char* TMotore_application::get_next_key( ) +{ + TMask& m = curr_mask( ); + TCodice_numerazione cod_num(m.get(F_CODNUM)); + + // Se per questa numerazione h abilitata le numerazione automatica + if( cod_num.auto_num()) { TLocalisamfile doc(LF_DOC); doc.zero(); - doc.put("CODNUM", _cod_num->codice()); + doc.put("CODNUM", cod_num.codice()); doc.put("ANNO", m.get(F_ANNO)); doc.put("PROVV", m.get(F_PROVV)); @@ -879,41 +177,27 @@ bool TMotore_application::get_next_key(TToken_string& key) int TMotore_application::read( TMask& m ) { // m.autoload(*_rel); - TRelation_application::read(m); - *_doc = (TDocumento &) _rel->curr(); - _codnum = m.get(F_CODNUM); - _tipodoc = m.get(F_TIPODOC); - ((TDocumento_mask &)m).cli2mask(app().doc().clifor(), app().doc().occas(), *(app()._config_ditta)); + TRelation_application::read(m); + doc() = (TDocumento &)_rel->curr(); + _codnum = m.get(F_CODNUM); + _tipodoc = m.get(F_TIPODOC); - TSheet_field& f = ( TSheet_field& ) m.field( F_SHEET ); + ((TDocumento_mask &)m).doc2mask(); - f.destroy( ); - const int rows = _doc->physical_rows(); - for (int i = 1; i <= rows; i++) - { - f.insert(-1, FALSE); - TToken_string & r = f.row(i -1); - TRiga_documento & rec = (*_doc)[i]; - - rec.autoload(f); - f.check_row(i - 1); - } - return NOERR; + return NOERR; } int TMotore_application::write( const TMask& m ) // C 90 { - TDocumento & doc = (TDocumento &) _rel->curr(); - - doc = *_doc; + TDocumento& d = (TDocumento&) _rel->curr(); + d = ((TDocumento_mask&)m).doc(); return TRelation_application::write(m); } int TMotore_application::rewrite( const TMask& m ) // C 90 { - TDocumento & doc = (TDocumento &) _rel->curr(); - - doc = *_doc; + TDocumento& d = (TDocumento &) _rel->curr(); + d = ((TDocumento_mask&)m).doc(); return TRelation_application::rewrite(m); } @@ -974,7 +258,7 @@ void TMotore_application::on_firm_change() if (_config_ditta != NULL) delete _config_ditta; _config_ditta = new TConfig(CONFIG_DITTA); - condv().set_config(_config_ditta); +// condv().set_config(_config_ditta); _doc_masks.destroy(); TApplication::on_firm_change(); } @@ -986,37 +270,19 @@ bool TMotore_application::user_create( ) // Metto in relazione testata e righe _rel = new TRelation( LF_DOC ); open_files(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_MOVMAG, LF_RMOVMAG, 0); - _doc = new TDocumento; + LF_CFVEN, LF_INDSP, LF_OCCAS, LF_MOVMAG, LF_RMOVMAG, LF_SVRIEP, LF_AGENTI, LF_PERCPROV, 0); _rel->lfile().set_curr(new TDocumento); - _cod_num = NULL; - _condv = new TCond_vendita(&doc().clifor(), _config_ditta); - _doc->set_condv(_condv); - ((TDocumento &) _rel->curr()).set_condv(_condv); _msk = new TMask("ve0100a"); set_search_field(F_NDOC); - query_mask().set_handler( F_CODNUM, num_handler ); - query_mask().set_handler( F_TIPODOC, tip_handler ); - _occas_mask = new TMask("ve0100o"); - _occas_mask->set_handler( O_CODICE, occas_code_handler ); + query_mask().set_handler( F_CODNUM, TDocumento_mask::num_handler ); + query_mask().set_handler( F_TIPODOC, TDocumento_mask::tip_handler ); + TConfig utente( CONFIG_USER ); - _codnum = utente.get("CODNUM"); _tipodoc = utente.get("TIPODOC"); - - // La maschera di inserimento/modifica per ora non la so! - // Viene letta dal profilo non appena trovato il record - - TMagazzini m; - - _ges_mag = m.gestmag(); - _ges_dep = m.gestdep(); - - _std_mag = m.standardmag(); - _std_dep = m.standarddep(); - + return TRUE; } @@ -1032,13 +298,10 @@ bool TMotore_application::user_destroy( ) // Distruggo la maschera di modifica if ( _msk != NULL ) delete _msk; - if (_cod_num) - delete _cod_num; // Distruggo la relazione - delete _doc; delete _rel; - delete _condv; +// delete _condv; return TRUE; } @@ -1076,7 +339,7 @@ void TMotore_application::ini2mask(TConfig& ini, TMask& msk, bool query) if (tr.read(tipo) == NOERR) { // Crea una nuova riga documento - TRiga_documento& rec = _doc->new_row(tipo); + TRiga_documento& rec = doc().new_row(tipo); // Riempie i campi della nuova riga TAssoc_array& var = ini.list_variables(); FOR_EACH_ASSOC_STRING(var, obj, key, val) @@ -1097,7 +360,26 @@ void TMotore_application::ini2mask(TConfig& ini, TMask& msk, bool query) } } +void TMotore_application::print() +{ + if (save(TRUE)) // Registra il record corrente + { + TString commandline("ve1 -0 "); + TDocumento_mask& m = edit_mask(); + commandline << m.get(F_CODNUM) << ' ' << m.get(F_ANNO) << ' '; + commandline << m.get(F_PROVV) << ' ' << m.get(F_NDOC); + + TExternal_app interattivo( commandline ); + interattivo.run(); + + if (m.doc().stampabile()) + { + const char s[2] = { m.doc().tipo().stato_finale_stampa(), '\0'}; + m.set(F_STATO, s, TRUE); + } + } +} int ve0100( int argc, char** argv ) { diff --git a/ve/ve0100.h b/ve/ve0100.h index 9507f939f..89c808226 100755 --- a/ve/ve0100.h +++ b/ve/ve0100.h @@ -16,39 +16,23 @@ class TMotore_application : public TRelation_application { TArray _file; // Tutti i fiels da usare - TDocumento * _doc; - TCodice_numerazione * _cod_num; - // Puntatore al profilo del documento caricato - TConfig * _pro; - TConfig * _config_ditta; + TConfig * _config_ditta; // Puntatore alla maschera di ricerca TMask * _msk; - TMask * _occas_mask; + TDocumento_mask * _docmsk; +// TMask * _occas_mask; // puntatore alla relazione TRelation * _rel; - // Puntatore allo sheet delle righe documento - TSheet_field * _sheet; - TCond_vendita * _condv; - - // Indica se il documento ha come soggetto un liente o un ornitore - char _tipocf; TString16 _codnum; TString16 _tipodoc; - bool _ges_mag; - bool _ges_dep; - - TString16 _std_mag; - TString16 _std_dep; - // Array di maschere documento TAssoc_array _doc_masks; - TLista_elaborazioni _elab; // Ridefinizione dei metodi virtuali virtual bool user_create( ); @@ -61,7 +45,7 @@ class TMotore_application : public TRelation_application virtual int read( TMask& m ); virtual int write( const TMask& m ); virtual int rewrite( const TMask& m ); - virtual void ini2mask(TConfig& ini, TMask& msk, bool query); + virtual void print(); // Funzioni da associare ad ogni procedura int user_function( int index ); @@ -74,35 +58,11 @@ protected: void close_files() { _file.destroy(); } virtual void on_firm_change(); - // Procedure e funzioni per la gestione della maschera e dei files - void update_profile(); - // Procedure e funzioni per la gestione degli stati int stato_corrente( ); - // Handle che ritorna la maschera per le righe - static TMask * ss_getmask( int numriga, TMask& fullmask); - - // Handler che gestisce la richiesta del tipo riga in inserimento - static bool ss_handler( TSheet_field& ss, int r, KEY key ); - // Handler per la maschera di ricerca static bool ndoc_handler( TMask_field& f, KEY key ); - static bool num_handler( TMask_field& f, KEY key ); - static bool tip_handler( TMask_field& f, KEY key ); - static bool occas_code_handler(TMask_field& f, KEY key); - - // Handler per la maschera di modifica - static bool clifo_handler( TMask_field& f, KEY key ); - static bool occas_handler( TMask_field& f, KEY key ); - static bool elabora_handler( TMask_field& f, KEY key ); - static bool codlist_handler( TMask_field& f, KEY key ); - static bool codcont_handler( TMask_field& f, KEY key ); - static bool codcamp_handler( TMask_field& f, KEY key ); - static bool print_handler( TMask_field& f, KEY key ); - - // Configurazione dello sheet dato il profilo - void configura_sheet( TSheet_field& sheet, TConfig& config ); // caricamento Inifile void ini2mask(TConfig& ini, TMask& m, bool query); @@ -112,18 +72,18 @@ public: // Funzioni di accesso alle variabili private - TConfig & pro() { CHECK( _pro, "Profilo del documento nullo!" ); return *_pro; } - const TFilename & proname() { return _pro->name(); } TMask & query_mask() { CHECK( _msk, "Maschera di ricerca nulla!" ); return *_msk; } - TMask & edit_mask() { return (TMask &) _doc_masks[_doc->tipo().codice()]; } + TDocumento_mask & edit_mask() { CHECK( _docmsk, "Maschera di edit nulla!" ); return *_docmsk; } TRelation & rel() { CHECK( _rel, "Relazione nulla!" ); return *_rel; } - TSheet_field & sheet() { CHECK( _sheet, "Sheet nullo!" ); return *_sheet; } - TCond_vendita & condv() { return *_condv; } + TSheet_field & sheet() { return edit_mask().sheet(); } TConfig & config_ditta() {return *_config_ditta; } - TLista_elaborazioni & elab() { return _elab; } - TDocumento & doc() {return *_doc; } + TDocumento & doc() {return edit_mask().doc(); } // Operazione + TMotore_application( ) { } + virtual ~TMotore_application( ) { } + + virtual const char* get_next_key( ); const char tipocf( ) { return _tipocf; } void tipocf( const char tcf ) { _tipocf = tcf; } diff --git a/ve/ve0100a.uml b/ve/ve0100a.uml index 3176d80da..da7a32cf8 100755 --- a/ve/ve0100a.uml +++ b/ve/ve0100a.uml @@ -8,12 +8,12 @@ PAGE "Gestione documenti" 1 1 60 14 GROUPBOX DLG_NULL 78 5 BEGIN - PROMPT 1 0 "" + PROMPT 1 0 "Estremi del documento" END STRING F_CODNUM 4 BEGIN - PROMPT 2 1 "Cod. num. " + PROMPT 2 1 "Numerazione " FIELD CODNUM HELP "Codice numerazione" USE %NUM @@ -42,7 +42,7 @@ PAGE "Gestione documenti" 1 1 60 14 STRING F_TIPODOC 4 BEGIN - PROMPT 2 2 "Tipo doc. " + PROMPT 2 2 "Tipo " FIELD TIPODOC HELP "Codice tipo documento" USE %TIP @@ -77,9 +77,10 @@ PAGE "Gestione documenti" 1 1 60 14 NUMBER F_NDOC 6 BEGIN - PROMPT 24 3 "Numero doc. " + PROMPT 24 3 "Numero " FIELD NDOC - USE LF_DOC + USE LF_DOC + JOIN LF_CLIFO TO LF_DOC INTO TIPOCF==TIPOCF CODCF==CODCF INPUT ANNO F_ANNO SELECT INPUT PROVV F_PROVV SELECT INPUT CODNUM F_CODNUM SELECT @@ -89,6 +90,10 @@ PAGE "Gestione documenti" 1 1 60 14 DISPLAY "Provv" PROVV DISPLAY "Tipo" TIPODOC DISPLAY "N.Doc. " NDOC + DISPLAY "Data\ndocumento" DATADOC + DISPLAY "C/F" TIPOCF + DISPLAY "Codice" CODCF + DISPLAY "Ragione Sociale@50" LF_CLIFO->RAGSOC OUTPUT F_NDOC NDOC OUTPUT F_STATO STATO OUTPUT F_TIPODOC TIPODOC diff --git a/ve/ve0100b.uml b/ve/ve0100b.uml index 8edbe8da3..47a02cfc4 100755 --- a/ve/ve0100b.uml +++ b/ve/ve0100b.uml @@ -128,7 +128,8 @@ END NUMBER F_NDOC_ELAB 6 BEGIN PROMPT 24 11 "Numero doc. " - USE LF_DOC SELECT (TIPOCF==#F_TIPOCF_ELAB)&&(CODCF==#F_CODCF_ELAB) + USE LF_DOC + JOIN LF_CLIFO TO LF_DOC INTO TIPOCF==TIPOCF CODCF==CODCF INPUT PROVV F_PROVV_ELAB SELECT INPUT ANNO F_ANNO_ELAB SELECT INPUT CODNUM F_CODNUM_ELAB SELECT @@ -138,10 +139,15 @@ BEGIN DISPLAY "Provv" PROVV DISPLAY "Tipo" TIPODOC DISPLAY "N.Doc. " NDOC + DISPLAY "Data\ndocumento" DATADOC + DISPLAY "C/F" TIPOCF + DISPLAY "Codice" CODCF + DISPLAY "Ragione Sociale@50" LF_CLIFO->RAGSOC OUTPUT F_NDOC_ELAB NDOC CHECKTYPE NORMAL FLAG "R" WARNING "Documento inesistente o incompatibile" + ADD RUN ve0 -1 END LISTBOX F_PROVV_ELAB 14 diff --git a/ve/ve0300.cpp b/ve/ve0300.cpp index 53fb57bcd..09f0b0d73 100755 --- a/ve/ve0300.cpp +++ b/ve/ve0300.cpp @@ -1475,34 +1475,232 @@ void TMask_generator::genera( const TString& profilo ) if ( _m->_pageopen == TRUE ) { _m->end( ); - intestazione_pagina( ); - } - - - // Generazione del listbox per i tipi di riga da aggiungere nello sheet - _m->control ( T_LISTA, F_LBTIPORIGA, 30 ); - _m->begin( ); - _m->prompt( 2, 6, "Tipo riga da aggiungere " ); - _m->end( ); - - // Generazione dello sheet : vedi il profilo - TScanner sheet_in( "ve0300b.dat" ); - _m->_out << "SPREADSHEET " << F_SHEET << "\n"; - _m->begin( ); - _m->prompt( 2, 7 ); - do_events(); - for( i = 0; i < _tab0300b.items( ); i ++ ) - genera_item_sheet( _tab0300b.row( i ) ); - _m->end( ); - - _m->end( ); - - // Generazione pagina dei piedi - { - TToken_string s(_pro->get("CAMPICALC", "MAIN")); - const bool usefiles = _tablefile.empty(); - - if (s.not_empty()) + + _m->control( T_BOTTONE, DLG_DELREC, 1002 ); + _m->begin( ); + _m->prompt( -25, -1, "~Elimina" ); + _m->message( "EXIT,127" ); + _m->end( ); + + _m->control( T_BOTTONE, DLG_ELABORA, 1002 ); + _m->begin( ); + _m->prompt( -35, -1, "E~labora" ); + // _m->message( "EXIT,345" ); + _m->end( ); + + _m->control( T_BOTTONE, DLG_PRINT, 1002 ); + _m->begin( ); + _m->prompt( -45, -1 ); + _m->message( "EXIT,20082" ); + _m->end( ); + + _m->control( T_BOTTONE, DLG_CANCEL, 1002 ); + _m->begin( ); + _m->prompt( -55, -1 ); + _m->message( "EXIT,27" ); + _m->end( ); + + // End della toolbar + _m->end( ); + + + do_events(); + // Header della prima pagina + + _m->pagina( _m->page( )); + + _m->control( T_CORNICE, DLG_NULL, 7806 ); + _m->begin( ); + _m->prompt( 1, 0, "" ); + _m->end( ); + + _m->control( T_STRINGA, F_CODNUM, 4 ); + _m->begin( ); + _m->prompt( 2, 1, "Cod. num. " ); + _m->field("CODNUM"); + _m->use("%NUM", 1); + temp_s.format("CODTAB %d", F_CODNUM); + _m->input(temp_s); + _m->display("\"Codice\" CODTAB~\"Descrizione@50\" S0"); + temp_s.format("%d S0", F_DESNUM); + _m->output(temp_s); + _m->check(S_NORMALE); + _m->flag( "GDU" ); + _m->message( "CO,2@" ); + _m->end( ); + + _m->control( T_STRINGA, F_DESNUM, 50 ); + _m->begin( ); + _m->prompt( 24, 1 ); + _m->flag( "GD" ); + _m->message( "CO,3@" ); + _m->end( ); + + _m->control( T_STRINGA, F_TIPODOC, 4 ); + _m->begin( ); + _m->field( "TIPODOC" ); + _m->prompt( 2, 2, "Tipo doc. " ); + _m->use("%TIP" , 1); + temp_s.format("CODTAB %d", F_TIPODOC); + _m->input(temp_s); + _m->display("\"Codice\" CODTAB~\"Descrizione@50\" S0"); + temp_s.format("%d S0", F_DESTIPODOC); + _m->output(temp_s); + _m->check(S_NORMALE); + _m->flag( "GDU" ); + _m->message( "CO,4@" ); + _m->end( ); + + _m->control( T_LISTA, F_TIPOCF, 9 ); + _m->begin( ); + _m->prompt( 100, 100, "" ); + _m->field( "TIPOCF" ); + if ( tipocf == "C" ) + _m->item("C|Cliente"); + else + _m->item("F|Fornitore"); + _m->flag( "D" ); + _m->end( ); + + _m->control( T_STRINGA, F_PROVV, 1 ); + _m->begin( ); + _m->prompt( 100, 100, "

" ); + _m->field( "PROVV" ); + _m->flag( "D" ); + _m->end( ); + + _m->control( T_STRINGA, F_DESTIPODOC, 50 ); + _m->begin( ); + _m->prompt( 24, 2 ); + _m->flag( "GD" ); + _m->message( "CO,5@" ); + _m->end( ); + + _m->control( T_STRINGA, F_ANNO, 4 ); + _m->begin( ); + _m->prompt( 2, 3, "Esercizio " ); + _m->field( "ANNO" ); + _m->flag( "GD" ); + _m->message( "CO,9@" ); + _m->end( ); + + _m->control( T_NUMERO, F_NDOC, 6 ); + _m->begin( ); + _m->prompt( 24, 3, "Numero doc. " ); + _m->field( "NDOC" ); + _m->message( "CO,6@" ); + _m->flag( "GDR" ); + _m->end( ); + + _m->control( T_DATA, F_DATADOC ); + _m->begin( ); + _m->prompt( 46, 3, "Data " ); + _m->field( "DATADOC" ); + TString m("CO,7@"); + _m->message(m); +// _m->flag( "A" ); + _m->end( ); + + _m->control( T_NUMERO, F_STATO, 1 ); + _m->begin( ); + _m->prompt( 67, 3, "Stato " ); + _m->field( "STATO" ); + _m->message( "CO,8@" ); + _m->flag( "DG" ); + _m->end( ); + + _m->control( T_STRINGA, F_CODCF, 6 ); + _m->begin( ); + if ( tipocf == "C" ) + { + _m->prompt( 2, 4, "Cliente " ); + _m->warning( "Cliente assente" ); + _m->help( "Codice del cliente del documento" ); + } + else + { + _m->prompt( 2, 4, "Fornitore " ); + _m->warning( "Fornitore assente" ); + _m->help( "Codice del fornitore del documento" ); + } + _m->flag( "R" ); + _m->field( "CODCF" ); + _m->group( 1 ); + _m->use( LF_CLIFO, 1 ); + temp_s.format( "TIPOCF \"%s\"~CODCF %d", (const char *)tipocf, F_CODCF); + _m->input( temp_s ); + _m->display( "\"Codice\" CODCF~\"Ragione Sociale@50\" RAGSOC~\"Partita IVA@12\" PAIV~\"Sospeso\" SOSPESO" ); + temp_s.format( "%d CODCF~%d RAGSOC", F_CODCF, F_RAGSOC ); + _m->output( temp_s ); + _m->check( S_OBBLIGATORIO ); + temp_s.format( "ADD RU cg0 -1 %s", (const char *)tipocf); + _m->outline( temp_s ); + _m->message( "CO,10@" ); + _m->end( ); + + _m->control( T_STRINGA, F_RAGSOC, 50 ); + _m->begin( ); + if ( tipocf == "C" ) + { + _m->warning( "Cliente assente" ); + _m->help( "Ragione sociale del cliente del documento" ); + } + else + { + _m->warning( "Fornitore assente" ); + _m->help( "Ragione sociale del fornitore del documento" ); + } + _m->prompt( 24, 4, "" ); + _m->group( 1 ); + _m->use( LF_CLIFO, 2 ); + temp_s.format( "TIPOCF \"%s\"~RAGSOC %d", (const char *)tipocf, F_RAGSOC ); + _m->input( temp_s ); + _m->display( "\"Ragione Sociale@50\" RAGSOC~\"Partita IVA@12\" PAIV~\"Codice\" CODCF" ); + temp_s.format( "%d CODCF~%d RAGSOC", F_CODCF, F_RAGSOC ); + _m->output( temp_s ); + _m->check( S_OBBLIGATORIO ); + temp_s.format( "ADD RU cg0 -1 %s", (const char *)tipocf); + _m->outline( temp_s ); + _m->message( "CO,11@" ); + _m->end( ); + _m->line( MASK_FIRST_LINE ); + + _m->_pageopen = TRUE; + + // Generazione + + // Scorro l'array dei gruppi, e ne creo una copia ordinata + // con solo i gruppi visibili + + TArray sortedgroups; + TString16 chiave, chiavegruppo; + last = _pro->get_int( "NGROUPS", "ORDINEGRUPPI" ); + for( i = 1; i <= last; i ++ ) + { + do_events(); + chiave.format( "%d", i ); + const TString key(_pro->get( chiave, "ORDINEGRUPPI" )); + + if (key.not_empty()) + { + if (isdigit(key[0])) + { + chiavegruppo.GROUPKEY(atoi(key)); + if( _gruppi.is_key( chiavegruppo ) ) + sortedgroups.add( _gruppi[ (chiavegruppo) ] ); + } + else + sortedgroups.add(key); + } + } + + TString80 message; + + message.format("Generazione profilo : %s", (const char *) profilo); + _bar = new TProgind(sortedgroups.items(), message, FALSE, TRUE); + sortedgroups.for_each( genera_gruppo ); + delete _bar; + if ( _m->_pageopen == TRUE ) { intestazione_pagina( ); TTable* frd = NULL; diff --git a/ve/ve0300a.src b/ve/ve0300a.src index b826b2d14..3a2dc37f3 100755 --- a/ve/ve0300a.src +++ b/ve/ve0300a.src @@ -1195,7 +1195,7 @@ Y=0 FIELDNAME=CODNOTE MSKID=F_CODNOTE TYPE=T_STRINGA -PROMPT="Cod.Note " +PROMPT="Cod. Note " SIZE=2 USE=%NOT INPUT=CODTAB F_CODNOTE @@ -1310,7 +1310,8 @@ Y=0 FIELDNAME=DATACONS MSKID=F_DATACONS TYPE=T_DATA -PROMPT="Data consegna " +PROMPT="Data consegna " +SPECIAL=CH REQUIRED [ASPBENI1] GROUP=2100 @@ -1386,7 +1387,7 @@ Y=0 FIELDNAME=PERCSPINC MSKID=151 TYPE=T_NUMERO -PROMPT="% spese incasso " +PROMPT="% spese incasso " SIZE=602 [ADDBOLLI] diff --git a/ve/ve1100.cpp b/ve/ve1100.cpp index f69d445d8..3b67fddab 100755 --- a/ve/ve1100.cpp +++ b/ve/ve1100.cpp @@ -73,7 +73,7 @@ class TDocumento_form : public TForm TTable *_tip; TRelation &_firmrel; // relazione di gestione dei dati della ditta corrente TString _module; // codice del modulo di carta associato a questo al form - TCond_vendita * _condv; + TString_array _exclude_array_t; // array di tipi riga da escludere dalla stampa TString_array _exclude_array_a; // array di articoli da escludere dalla stampa TDocumentoEsteso * _doc; // Documento da stampare @@ -165,9 +165,10 @@ TDocumento_form::TDocumento_form(TRectype&/*TDocumentoEsteso**/ doc, TRelation& read(nomeform); _cli_loaded= FALSE; _is_lista = FALSE; - _condv = new TCond_vendita(NULL); - _doc = new TDocumentoEsteso(doc, _condv); // istanzia TDocumentoEsteso - _condv->set_clifo(&_doc->clifor()); +// _doc = new TDocumentoEsteso(doc, _condv); // istanzia TDocumentoEsteso +// _condv = new TCond_vendita(NULL); +// _condv->set_clifo(&_doc->clifor()); + _doc = new TDocumentoEsteso(doc); // istanzia TDocumentoEsteso _docfile = new TDocisamfile(_doc); _rdocfile = new TRDocisamfile(_doc); relation()->replace(_docfile,0); @@ -852,6 +853,7 @@ class TStampaDoc_application: public TApplication TRelation *_firmrel; // puntatore alla relazione che gestisce i dati della ditta corrente TDocumento_form *_form; // puntatore al form di stampa TArray _file; + TMask * _selection_mask; protected: void open_files(int logicnum, ...); @@ -886,17 +888,31 @@ void TStampaDoc_application::print_selected() doc.put(DOC_CODNUM, _codnum); // compone la chiave per il record di inizio cursore doc.put(DOC_ANNO, _anno); - doc.put(DOC_PROVV, _provv); - doc.put(DOC_NDOC, _dalnum); - if (!order_by_num) doc.put(DOC_DATADOC, _dadata); + doc.put(DOC_PROVV, _provv); + arec = doc.curr(); + if (order_by_num) + doc.put(DOC_NDOC, _dalnum); + else + doc.put(DOC_DATADOC, _dadata); doc.setkey(_key); doc.read(); // trova il record iniziale darec = doc.curr(); - doc.put(DOC_NDOC, _alnum); - if (!order_by_num) doc.put(DOC_DATADOC, _adata); - int err = doc.read(); // trova il record finale - if (err == _iseof) doc.last(); - else if (err == _iskeynotfound) doc.prev(); + doc.curr() = arec; + if (order_by_num) + { + doc.put(DOC_NDOC, _alnum); + if (doc.read() == _iskeynotfound) // trova il record finale + doc.prev(); + } + else + { + doc.put(DOC_DATADOC, _adata); // trova il record finale + doc.put(DOC_NDOC, 999999L); + int err = doc.read(_isgteq); + if (err == NOERR) + err = doc.prev(); + } + arec = doc.curr(); if (arec < darec) @@ -1074,6 +1090,7 @@ bool TStampaDoc_application::date2num_handler(TMask_field& f, KEY key) bool TStampaDoc_application::range_handler(TMask_field& f, KEY key) { bool rt = TRUE; + TMask& m = f.mask(); if (key == K_TAB && f.focusdirty()) { const long lim_sup = atol(f.get()); @@ -1108,7 +1125,16 @@ bool TStampaDoc_application::create() const int argc = TApplication::argc(); _is_lista = argc == 3 && argv(2)[0] == 'L'; - on_firm_change(); + on_firm_change(); + _selection_mask = new TMask("ve1100a"); + _selection_mask->set_handler(F_DA_DATADOC, date2num_handler); + _selection_mask->set_handler(F_A_DATADOC, date2num_handler); + _selection_mask->set_handler(F_A_NDOC, range_handler); + if (_is_lista) + { + _selection_mask->hide(F_NCOPIE); + _selection_mask->set_caption("Lista Documenti"); + } if (argc>3) { // lettura dei parametri iniziali dalla linea di comando _codnum= argv(2); // il primo parametro è il codice di numerazione @@ -1149,6 +1175,7 @@ bool TStampaDoc_application::create() bool TStampaDoc_application::destroy() { delete _firmrel; // distruzione della relazione di gestione della ditta corrente + delete _selection_mask; return TApplication::destroy(); } @@ -1161,17 +1188,9 @@ void TStampaDoc_application::on_firm_change() bool TStampaDoc_application::select() { - TMask m("ve1100a"); + TMask & m = * _selection_mask; - if (_is_lista) - { - m.hide(F_NCOPIE); - m.set_caption("Lista Documenti"); - } - TString wdate; - m.set_handler(F_DA_DATADOC, date2num_handler); - m.set_handler(F_A_DATADOC, date2num_handler); - m.set_handler(F_A_NDOC, range_handler); + m.reset(); if (m.run() == K_ENTER) { _codnum= m.get(F_CODNUM); // lettura dei dati dalla maschera @@ -1180,15 +1199,18 @@ bool TStampaDoc_application::select() _dalnum= m.get_long(F_DA_NDOC); _alnum= m.get_long(F_A_NDOC); _ncopie = m.get_int(F_NCOPIE); - if (_alnum == 0) _alnum = 9999999L; - wdate = m.get(F_DA_DATADOC); - if (wdate.not_empty()) _dadata = wdate; - else _dadata = botime; - wdate = m.get(F_A_DATADOC); - if (wdate.not_empty()) _adata = wdate; - else _adata = eotime; - _key = BY_NUM_KEY; - if (m.get(F_DATA_O_NUM) != "N") _key = BY_DATE_KEY; + if (_alnum == 0) + _alnum = 9999999L; + _dadata = m.get_date(F_DA_DATADOC); + if (!_dadata.ok()) + _dadata = botime; + _adata = m.get_date(F_A_DATADOC); + if (!_adata.ok()) + _adata = eotime; + if (m.get(F_DATA_O_NUM) == "N") + _key = BY_NUM_KEY; + else + _key = BY_DATE_KEY; return TRUE; } else return FALSE; } diff --git a/ve/ve1100a.uml b/ve/ve1100a.uml index 5eae6adeb..3c900d96a 100755 --- a/ve/ve1100a.uml +++ b/ve/ve1100a.uml @@ -1,59 +1,65 @@ #include "ve1100.h" -PAGE "Stampa Documenti Vendita" -1 -1 40 20 +PAGE "Stampa Documenti Vendita" -1 -1 60 14 STRING F_CODNUM 4 4 BEGIN - PROMPT 1 1 "Codice Num. " - FLAG "U" - USE %NUM - INPUT CODTAB F_CODNUM - DISPLAY "Cod. Num." CODTAB - DISPLAY "Descrizione@50" S0 - OUTPUT F_CODNUM CODTAB - CHECKTYPE NORMAL + PROMPT 1 1 "Codice numerazione " + FLAG "UP" + USE %NUM + INPUT CODTAB F_CODNUM + DISPLAY "Cod. Num." CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_CODNUM CODTAB + CHECKTYPE NORMAL END NUMBER F_ANNO 4 0 BEGIN - PROMPT 26 1 "Anno " - CHECKTYPE REQUIRED + PROMPT 38 1 "Anno " + FLAG "P" + CHECKTYPE REQUIRED END LIST F_PROVV 12 BEGIN - PROMPT 1 3 "Tipo numerazione " - ITEM "P|Provvisoria" + PROMPT 1 2 "Tipo numerazione " ITEM "D|Definitiva" + ITEM "P|Provvisoria" + FLAG "P" END NUMBER F_NCOPIE 3 BEGIN - PROMPT 1 4 "Numero copie " + PROMPT 38 2 "Numero copie " NUM_EXPR {(#THIS_FIELD >= 0)} + FLAG "P" WARNING "Il numero di copie deve essere positivo" END -RADIOBUTTON F_DATA_O_NUM 38 +RADIOBUTTON F_DATA_O_NUM 58 BEGIN - PROMPT 1 5 "Selezione su " - ITEM "N|Numero documento" MESSAGE ENABLE,1@|CLEAR,2@ - ITEM "D|Data documento" MESSAGE ENABLE,2@|CLEAR,1@ + PROMPT 1 4 "Selezione su " + ITEM "N|Numero documento" MESSAGE SHOW,1@|HIDE,2@ + ITEM "D|Data documento" MESSAGE SHOW,2@|HIDE,1@ + FLAG "P" END -GROUPBOX DLG_NULL 38 5 +GROUPBOX DLG_NULL 58 5 BEGIN - PROMPT 1 9 "Selezione per numero" + PROMPT 1 8 "Selezione per numero" + GROUP 1 END -GROUPBOX DLG_NULL 38 5 +GROUPBOX DLG_NULL 58 5 BEGIN - PROMPT 1 14 "Selezione per data" + PROMPT 1 8 "Selezione per data" + GROUP 2 END NUMBER F_DA_NDOC 7 0 BEGIN - PROMPT 2 10 "Dal num. " + PROMPT 2 9 "Dal numero " USE 33 JOIN 20 INTO CODCF=CODCF TIPOCF=TIPOCF JOIN 13 TO 20 INTO COM=COMCF @@ -72,7 +78,7 @@ END NUMBER F_A_NDOC 7 0 BEGIN - PROMPT 2 12 "Al num. " + PROMPT 2 11 "Al numero " USE 33 JOIN 20 INTO CODCF=CODCF TIPOCF=TIPOCF JOIN 13 TO 20 INTO COM=COMCF @@ -92,7 +98,7 @@ END DATE F_DA_DATADOC BEGIN - PROMPT 2 15 "Dalla data " + PROMPT 2 9 "Dalla data " USE 33 KEY 3 SELECT (PROVV==#F_PROVV) && (ANNO==#F_ANNO) && (CODNUM==#F_CODNUM) JOIN 20 INTO CODCF=CODCF TIPOCF=TIPOCF JOIN 13 TO 20 INTO COM=COMCF @@ -112,7 +118,7 @@ END DATE F_A_DATADOC BEGIN - PROMPT 2 17 "Alla data " + PROMPT 2 11 "Alla data " USE 33 KEY 3 SELECT (PROVV==#F_PROVV) && (ANNO==#F_ANNO) && (CODNUM==#F_CODNUM) JOIN 20 INTO CODCF=CODCF TIPOCF=TIPOCF JOIN 13 TO 20 INTO COM=COMCF diff --git a/ve/ve2.cpp b/ve/ve2.cpp index 6e0e0b60c..4f992654e 100755 --- a/ve/ve2.cpp +++ b/ve/ve2.cpp @@ -1,4 +1,3 @@ - #include #include @@ -7,18 +6,17 @@ extern int ve2200(int argc, char* argv[]); // testate listini/contratti/offerte extern int ve2300(int argc, char* argv[]); // righe listini/contratti/offerte extern int ve2400(int argc, char* argv[]); // anagrafica di magazzino - - -int main( int argc, char** argv) { - int rt= -1; - const int r= (argc>1)?(atoi(&argv[1][1])):(-1); - - switch (r) { - case 0: rt = ve2100(argc, argv); break; - case 1: rt = ve2200(argc, argv); break; - case 2: rt = ve2300(argc, argv); break; - case 3: rt = ve2400(argc, argv); break; - default: error_box("Sintassi: %s -[0 [R|D|I] | 1 [L|C|O] | 2 [L|C|O] | 3]", argv[0]); break; - } - return (rt); +int main( int argc, char** argv) +{ + const int r = (argc>1)?(atoi(&argv[1][1])):(-1); + switch (r) + { + case 0: ve2100(argc, argv); break; + case 1: ve2200(argc, argv); break; + case 2: ve2300(argc, argv); break; + case 3: ve2400(argc, argv); break; + default: error_box("Sintassi: %s -[0 [R|D|I] | 1 [L|C|O] | 2 [L|C|O] | 3]", argv[0]); break; + } + exit(0); + return 0; } diff --git a/ve/ve2300x.uml b/ve/ve2300x.uml index b4bf78054..0978facb2 100755 --- a/ve/ve2300x.uml +++ b/ve/ve2300x.uml @@ -200,7 +200,7 @@ BEGIN DISPLAY "Descrizione@50" S0 OUTPUT F_R_CODRIGA_G CODTAB[1,3] OUTPUT F_R_DESRIGA_G S0 - MESSAGE COPY,F_R_CODRIGA_A +// MESSAGE COPY,F_R_CODRIGA_A CHECKTYPE FORCED END @@ -223,7 +223,7 @@ BEGIN DISPLAY "Descrizione@50" S0 OUTPUT F_R_CODRIGA_S CODTAB OUTPUT F_R_DESRIGA_S S0 - MESSAGE COPY,F_R_CODRIGA_A +// MESSAGE COPY,F_R_CODRIGA_A CHECKTYPE FORCED END @@ -245,7 +245,7 @@ BEGIN DISPLAY "Descrizione@50" S0 OUTPUT F_R_CODRIGA_R CODTAB OUTPUT F_R_DESRIGA_R S0 - MESSAGE COPY,F_R_CODRIGA_A +// MESSAGE COPY,F_R_CODRIGA_A CHECKTYPE FORCED END diff --git a/ve/ve5.cpp b/ve/ve5.cpp index 2553f07e5..11fc5d6e5 100755 --- a/ve/ve5.cpp +++ b/ve/ve5.cpp @@ -1,22 +1,15 @@ #include -#include - #include "ve5.h" -#define MAIN - int main(int argc, char** argv) { const int k = argc > 1 ? atoi(argv[1]+1) : 0; switch(k) { - case 0: - ve5100(argc, argv); - break; - default: - error_box("Applicazione sconosciuta: %s %s.", argv[0], argv[1]); - break; + case 1 : ve5200(argc, argv); break; + default: ve5100(argc, argv); break; } + exit(0); return 0; } diff --git a/ve/ve5.h b/ve/ve5.h index f65b1f256..4aed3a0b9 100755 --- a/ve/ve5.h +++ b/ve/ve5.h @@ -1,15 +1,8 @@ #ifndef __VE5_H #define __VE5_H -#ifdef MAIN -#define extern -#endif - -int ve5100(int argc, char**); - -#ifdef MAIN -#undef extern -#endif +int ve5100(int argc, char* argv[]); +int ve5200(int argc, char* argv[]); #endif diff --git a/ve/ve5100.cpp b/ve/ve5100.cpp index f5b0b01a2..e14a5ee99 100755 --- a/ve/ve5100.cpp +++ b/ve/ve5100.cpp @@ -17,7 +17,6 @@ class TDeletedoc_app : public TApplication { TArchive _arc; - TArray _to_zap; // Array contenente le chiavi dei documenti da eliminare TString _desc, _last_std; char _unit; TFilename _tmp_dir; @@ -31,8 +30,8 @@ class TDeletedoc_app : public TApplication protected: - void backup_delete_doc(); // Backup e cancellazione dei documenti da eliminare - void restore_doc(); // Ripristino documenti da disco + void backup_delete_doc(int op, int who); // Backup e cancellazione dei documenti da eliminare + void restore_doc(); // Ripristino documenti da disco void create_tmp_files(bool create=TRUE); void delete_tmp_files(bool remove=TRUE); virtual bool create(); @@ -55,9 +54,8 @@ bool TDeletedoc_app::state_handler(TMask& m, KEY k) return TRUE; } -void TDeletedoc_app::backup_delete_doc() +void TDeletedoc_app::backup_delete_doc(int op, int who) { - TRecnotype total = 0; TDocumento documento; TIsamfile doc(LF_DOC); @@ -71,74 +69,107 @@ void TDeletedoc_app::backup_delete_doc() " Nessun documento cancellato. Errore %d.",err); return; } - create_tmp_files(); + + if (op & 0x2) + create_tmp_files(); + + TString_array to_zap; // Array contenente le chiavi dei documenti da eliminare + TRecnotype total = 0; + doc.zero(); // Scorre il file dei documenti { - TProgind p(10, "Ricerca e copia dei documenti da eliminare...", TRUE, FALSE, 10); - for (doc.first();doc.good() && !p.iscancelled();doc.read(_isgreat)) + TProgind p(doc.items(), "Ricerca dei documenti ...", TRUE, TRUE); + for (int scanerr = doc.first(); + scanerr == NOERR && !p.iscancelled(); + scanerr = doc.next()) { + p.addstatus(1); documento.read(doc.curr()); - bool to_delete = TRUE; - if (doc.get("STATO") != _last_std) to_delete = FALSE; + bool to_delete = FALSE; + + if (who & 0x1) + { + if (doc.get(DOC_STATO) == _last_std) + to_delete = TRUE; + } + if (who & 0x2) + { + if (doc.get_bool(DOC_DOCEVASO)) + to_delete = TRUE; + } - if (to_delete && !p.iscancelled()) // Se TRUE il puo' essere eliminato! + if (to_delete) // Se TRUE il puo' essere eliminato! { // Memorizza la chiave 1 del documento in un array - TToken_string id(30); - id = doc.get("PROVV"); - id.add(doc.get("ANNO")); - id.add(doc.get("CODNUM")); - id.add(doc.get("NDOC")); - _to_zap.add(id); - err = _tdoc->write(doc.curr()); - const int rows = documento.rows(); - // Memorizza le righe del documento sui file temporanei - for (int x=1;err==NOERR && x<=rows;x++) - err=_trdoc->write(documento[x]); + if (op & 0x1) + { + TToken_string id(30); + id = doc.get(DOC_PROVV); + id.add(doc.get(DOC_ANNO)); + id.add(doc.get(DOC_CODNUM)); + id.add(doc.get(DOC_NDOC)); + to_zap.add(id); + } + if (op & 0x2) + { + err = _tdoc->write(doc.curr()); + const int rows = documento.rows(); + // Memorizza le righe del documento sui file temporanei + for (int x = 1; err == NOERR && x <= rows; x++) + err = _trdoc->write(documento[x]); + } + else + err = NOERR; total++; } } // end of for - if (p.iscancelled()) total=0; + if (p.iscancelled()) + total = 0; } - if (total != 0) - if (err==NOERR) + if (total != 0) { - const char * dir = &_tmp_dir[1]; - delete_tmp_files(FALSE); //Close tmp files only - bool rt = _arc.backup(dir,_unit,_desc,FALSE);// Backup dei documenti da eliminare, prefix unnecessary - create_tmp_files(FALSE); // Reopen tmp files. - if (rt) + if (err==NOERR) { - // Effettiva cancellazione dei documenti - TString80 caption("Cancellazione di "); - caption.add_plural(total, "documento"); - if (!yesno_box(caption)) - _to_zap.destroy(); - else + bool rt = TRUE; + if (op & 0x2) { - TProgind pi(total, caption, FALSE, TRUE, 10); - const int items = _to_zap.items(); - for (int i = 0; i < items; i++) - { - TToken_string& id = (TToken_string&)_to_zap[i]; - id.restart(); - const char provv = id.get_char(); - const int anno = id.get_int(); - const TString16 codnum = id.get(); - const long numdoc = id.get_int(); - documento.read(provv,anno,codnum,numdoc); - documento.remove(); - pi.addstatus(1); - } + const char * dir = &_tmp_dir[1]; + delete_tmp_files(FALSE); //Close tmp files only + rt = _arc.backup(dir,_unit,_desc);// Backup dei documenti da eliminare, prefix unnecessary + create_tmp_files(FALSE); // Reopen tmp files. } - } + if (rt & (op & 0x1)) + { + // Effettiva cancellazione dei documenti + TString caption("Confermare la cancellazione di "); + caption.add_plural(total, "documento"); + if (yesno_box(caption)) + { + TProgind pi(total, caption, FALSE, TRUE, 10); + for (int i = 0; i < to_zap.items(); i++) + { + TToken_string& id = to_zap.row(i); + id.restart(); + const char provv = id.get_char(); + const int anno = id.get_int(); + const TString16 codnum = id.get(); + const long numdoc = id.get_int(); + documento.read(provv,anno,codnum,numdoc); + documento.TMultiple_rectype::remove(); + pi.addstatus(1); + } + } + } + } + else + error_box("Errore %d scrivendo sui files temporanei." + " La cancellazione dei documenti chiuse non verra' effettuata.",err); } - else - error_box("Errore %d scrivendo sui files temporanei." - " La cancellazione dei documenti chiusi non verra' effettuata.",err); - delete_tmp_files(); // Physical remove of tmp files + if (op & 0x2) + delete_tmp_files(); // Physical remove of tmp files + doc.close(); } @@ -156,11 +187,11 @@ void TDeletedoc_app::restore_doc() return ; } const char* dir =& _tmp_dir[1]; // Cut out % sign - if (_arc.restore(dir,_unit,FALSE,FALSE)) + if (_arc.restore(dir,_unit,FALSE)) { create_tmp_files(FALSE); // In realta' ci sono gia' const TRecnotype items = _tdoc->items() + _trdoc->items(); - TProgind pi(items, "Ripristino documenti eliminati", FALSE, TRUE, 10); + TProgind pi(items, "Ripristino documenti archiviati", FALSE, TRUE, 10); for (_tdoc->first();_tdoc->good() && err==NOERR;_tdoc->next()) { @@ -191,9 +222,9 @@ void TDeletedoc_app::restore_doc() void TDeletedoc_app::create_tmp_files(bool create) { TFilename tf(_tmp_dir); - tf << "/" << "f1"; + tf.add("f1"); _tdoc = new TIsamtempfile(LF_DOC,tf,create); - tf.rtrim(1);tf << "2"; + tf.rtrim(1); tf << "2"; _trdoc = new TIsamtempfile(LF_RIGHEDOC,tf,create); } @@ -206,23 +237,32 @@ void TDeletedoc_app::delete_tmp_files(bool remove) } delete _tdoc; delete _trdoc; + _tdoc = NULL; + _trdoc = NULL; } bool TDeletedoc_app::create() { TApplication::create(); + _tmp_dir.temp(); _tmp_dir = _tmp_dir.path(); _tmp_dir << "VE"; if (!fexist(_tmp_dir)) make_dir(_tmp_dir); _tmp_dir.insert("%"); // Add % sign + dispatch_e_menu(BAR_ITEM(1)); _clifo = new TLocalisamfile(LF_CLIFO); _cfven = new TLocalisamfile(LF_CFVEN); _doc = new TLocalisamfile(LF_DOC); _rdoc = new TLocalisamfile(LF_RIGHEDOC); - _tab = new TLocalisamfile(LF_TAB); + _tab = new TLocalisamfile(LF_TAB); _occas = new TLocalisamfile(LF_OCCAS); + + TTable std("%STD"); + std.last(); // Reperisce lo stato eliminabile + _last_std = std.get("CODTAB"); + return TRUE; } @@ -242,32 +282,29 @@ bool TDeletedoc_app::destroy() bool TDeletedoc_app::menu(MENU_TAG) { TMask m("ve5100a"); - - TTable std("%STD"); - - std.last(); // Reperisce lo stato eliminabile - - _last_std = std.get("CODTAB"); - - m.set(F_STATUS,_last_std); - m.set(F_STADESC,std.get("S0")); m.set_handler(state_handler); + + m.set(F_STATUS,_last_std); while (m.run() != K_QUIT) { _unit = m.get(F_UNIT)[0]; _desc = m.get(F_DESC); const int scelta = m.get_int(F_OPERAZIONE); - if (scelta == 1) - backup_delete_doc(); - else - restore_doc(); + const int cosa = m.get_int(F_DOCUMENTI); + switch (scelta) + { + case 1 : backup_delete_doc(0x1, cosa); break; + case 2 : backup_delete_doc(0x2, cosa); break; + case 3 : backup_delete_doc(0x3, cosa); break; + default: restore_doc(); break; + } } return FALSE; } -int ve5100(int argc, char** argv) +int ve5100(int argc, char* argv[]) { TDeletedoc_app a; a.run(argc, argv, "Eliminazione documenti"); diff --git a/ve/ve5100a.h b/ve/ve5100a.h index 1d62bb8f7..5e6d69a66 100755 --- a/ve/ve5100a.h +++ b/ve/ve5100a.h @@ -1,7 +1,7 @@ - #define F_STATUS 101 #define F_DESC 102 #define F_UNIT 103 #define F_STADESC 104 #define F_OPERAZIONE 105 +#define F_DOCUMENTI 106 diff --git a/ve/ve5100a.uml b/ve/ve5100a.uml index ecb1e9433..9eb3e7853 100755 --- a/ve/ve5100a.uml +++ b/ve/ve5100a.uml @@ -1,21 +1,43 @@ #include "ve5100a.h" -PAGE "Eliminazione documenti" -1 -1 62 11 +PAGE "Eliminazione/Archiviazione documenti" -1 -1 61 11 -RADIOBUTTON F_OPERAZIONE 28 +RADIOBUTTON F_OPERAZIONE 1 34 BEGIN - PROMPT 1 1 "Operazione da eseguire" - ITEM "1|Eliminazione documenti" - MESSAGE ENABLE,F_DESC - ITEM "2|Ripristino documenti" - MESSAGE DISABLE,F_DESC - HELP "Scegli l'operazione da eseguire" + PROMPT 1 1 "Operazione" + ITEM "1|Eliminazione" + MESSAGE DISABLE,F_DESC|DISABLE,F_UNIT + ITEM "2|Archiviazione" + MESSAGE ENABLE,F_DESC|ENABLE,F_UNIT + ITEM "3|Eliminazione e archiviazione" + MESSAGE ENABLE,F_DESC|ENABLE,F_UNIT + ITEM "4|Ripristino" + MESSAGE DISABLE,F_DESC|ENABLE,F_UNIT END +RADIOBUTTON F_DOCUMENTI 1 24 +BEGIN + PROMPT 36 1 "Documenti" + ITEM "1|Eliminabili" + ITEM "2|Evasi" + ITEM "3|Entrambi" +END + +LIST F_UNIT 2 +BEGIN + PROMPT 38 6 "Unita' di backup " + ITEM "A|A:" + ITEM "B|B:" +END + +STRING F_DESC 50 36 +BEGIN + PROMPT 2 7 "Descrizione backup " +END STRING F_STATUS 1 BEGIN - PROMPT 2 5 "Stato eliminabile " + PROMPT 2 8 "Stato eliminabile " USE %STD INPUT CODTAB F_STATUS DISPLAY "Stato documento" CODTAB @@ -29,23 +51,10 @@ END STRING F_STADESC 32 BEGIN - PROMPT 27 5 "" + PROMPT 27 8 "" FLAGS "D" END -LIST F_UNIT 2 -BEGIN - PROMPT 2 6 "Unita' di backup " - ITEM "A|A:" - ITEM "B|B:" -END - -STRING F_DESC 50 36 -BEGIN - PROMPT 2 7 "Descrizione backup " - GROUP 1 -END - BUTTON DLG_OK 10 2 BEGIN PROMPT -12 -1 "" diff --git a/ve/ve5200.cpp b/ve/ve5200.cpp new file mode 100755 index 000000000..0d4f99792 --- /dev/null +++ b/ve/ve5200.cpp @@ -0,0 +1,100 @@ +#include +#include +#include +#include +#include + +#include "ve5200.h" +#include "velib.h" + +class TStatus_mask : public TMask +{ +public: + TStatus_mask() : TMask("ve5200") { } + virtual ~TStatus_mask() { } +}; + + +class TStatus_change : public TSkeleton_application +{ + TArray _file; +protected: // TSkeleton_application + virtual void main_loop(); + void open_files(int logicnum, ...); + virtual bool create(); + +public: + TStatus_change() { } + virtual ~TStatus_change() { } +}; + +void TStatus_change::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 TStatus_change::create() +{ + TApplication::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_CONDV, LF_SVRIEP, LF_AGENTI, LF_PERCPROV, LF_CESS, 0); + dispatch_e_menu(BAR_ITEM(1)); + return TRUE; +} + +void TStatus_change::main_loop() +{ + TStatus_mask m; + while (m.run() == K_ENTER) + { + TRelation rel(LF_DOC); + m.autosave(rel); + + const TRectype recini(rel.curr()); + const TRectype recfin(rel.curr()); + + TString filter; + filter << DOC_STATO << "==" << m.get(F_INIZIALE); + + TCursor cur(&rel, filter, 1, &recini, &recfin); + const long total = cur.items(); + if (total > 0) + { + TString msg = "Confermare l'aggiornamento di "; + msg.add_plural(total, "documento"); + if (yesno_box(msg)) + { + TProgind pi(total, "Elaborazione in corso...", TRUE, TRUE, 60); + const char finale = m.get(F_FINALE)[0]; + TDocumento* doc = new TDocumento; + rel.lfile().set_curr(doc); + for (cur = 0; cur.pos() < total && !pi.iscancelled(); ++cur) + { + doc->put(DOC_STATO, finale); + doc->rewrite(); + } + + // Forza l'aggiornamento dell'indice del cursore + TEdit_field& ef = m.efield(F_DANUMERO); + TCursor* cur = ef.browse()->cursor(); + filter = cur->filter(); + cur->setfilter(""); + cur->setfilter(filter); + } + } + } +} + +int ve5200(int argc, char* argv[]) +{ + TStatus_change a; + a.run(argc, argv, "Aggiornamento stato"); + return 0; +} + diff --git a/ve/ve5200.h b/ve/ve5200.h new file mode 100755 index 000000000..be6722890 --- /dev/null +++ b/ve/ve5200.h @@ -0,0 +1,13 @@ +#define F_PROVVIS 101 +#define F_ANNO 102 +#define F_CODNUM 103 +#define F_DESNUM 104 +#define F_INIZIALE 105 +#define F_DESCINI 106 +#define F_FINALE 107 +#define F_DESCFIN 108 +#define F_DANUMERO 109 +#define F_ANUMERO 110 +#define F_DACLIFO 111 +#define F_ACLIFO 112 + diff --git a/ve/ve5200.uml b/ve/ve5200.uml new file mode 100755 index 000000000..3e8ec252a --- /dev/null +++ b/ve/ve5200.uml @@ -0,0 +1,161 @@ +#include +#include "ve5200.h" + +PAGE "Cambiamento stato documenti" -1 -1 72 15 + +GROUPBOX DLG_NULL 70 4 +BEGIN + PROMPT 1 1 "Numerazione" +END + +RADIOBUTTON F_PROVVIS 35 +BEGIN + PROMPT 1 1 "" + ITEM "D|Definitiva" + ITEM "P|Provvisoria" + FLAGS "Z" + FIELD PROVV +END + +NUMBER F_ANNO 4 +BEGIN + PROMPT 59 2 "Anno " + FLAGS "AU" + CHECKTYPE REQUIRED + FIELD ANNO +END + +STRING F_CODNUM 4 +BEGIN + PROMPT 2 3 "Codice " + USE %NUM + FLAGS "U" + INPUT CODTAB F_CODNUM + DISPLAY "Codice Num." CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_CODNUM CODTAB + OUTPUT F_DESNUM S0 + CHECKTYPE REQUIRED + FIELD CODNUM +END + +STRING F_DESNUM 50 +BEGIN + PROMPT 16 3 "" + USE %NUM KEY 2 + INPUT S0 F_DESNUM + DISPLAY "Descrizione@50" S0 + DISPLAY "Codice Num." CODTAB + COPY OUTPUT F_CODNUM + CHECKTYPE REQUIRED +END + +GROUPBOX DLG_NULL 70 4 +BEGIN + PROMPT 1 5 "Stato" +END + +STRING F_INIZIALE 1 +BEGIN + PROMPT 2 6 "Iniziale " + USE %STD + INPUT CODTAB F_INIZIALE + DISPLAY "Stato documento" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_INIZIALE CODTAB + OUTPUT F_DESCINI S0 + CHECKTYPE REQUIRED +END + +STRING F_DESCINI 50 52 +BEGIN + PROMPT 16 6 "" + FLAGS "D" +END + +STRING F_FINALE 1 +BEGIN + PROMPT 2 7 "Finale " + COPY USE F_INIZIALE + INPUT CODTAB F_FINALE + DISPLAY "Stato documento" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_FINALE CODTAB + OUTPUT F_DESCFIN S0 + CHECKTYPE REQUIRED + NUM_EXPR (#F_FINALE!=#F_INIZIALE) + WARNING "Lo stato finale deve essere diverso da quello iniziale" +END + +STRING F_DESCFIN 50 52 +BEGIN + PROMPT 16 7 "" + FLAGS "D" +END + +GROUPBOX DLG_NULL 70 4 +BEGIN + PROMPT 1 9 "Intervallo" +END + +NUMBER F_DANUMERO 7 +BEGIN + PROMPT 2 10 "Da " + USE LF_DOC SELECT STATO==#F_INIZIALE + JOIN LF_CLIFO INTO TIPOCF==TIPOCF CODCF==CODCF + INPUT ANNO F_ANNO SELECT + INPUT PROVV F_PROVVIS SELECT + INPUT CODNUM F_CODNUM SELECT + INPUT NDOC F_DANUMERO + DISPLAY "Num." CODNUM + DISPLAY "Anno" ANNO + DISPLAY "Provv" PROVV + DISPLAY "Tipo" TIPODOC + DISPLAY "N.Doc. " NDOC + DISPLAY "Ragione Sociale@50" LF_CLIFO->RAGSOC + OUTPUT F_DANUMERO NDOC + CHECKTYPE SEARCH + FLAGS "U" +END + +STRING F_DACLIFO 50 52 +BEGIN + PROMPT 16 10 "" + FLAGS "D" +END + +NUMBER F_ANUMERO 7 +BEGIN + PROMPT 2 11 "A " + COPY USE F_DANUMERO + INPUT ANNO F_ANNO SELECT + INPUT PROVV F_PROVVIS SELECT + INPUT CODNUM F_CODNUM SELECT + INPUT NDOC F_ANUMERO + COPY DISPLAY F_DANUMERO + OUTPUT F_ANUMERO NDOC + CHECKTYPE SEARCH + NUM_EXPR (#F_ANUMERO==0)||(#F_ANUMERO>=#F_DANUMERO) + WARNING "Il numero finale deve essere maggiore di quello iniziale" +END + +STRING F_ACLIFO 50 52 +BEGIN + PROMPT 16 11 "" + FLAGS "D" +END + +BUTTON DLG_CANCEL 10 2 +BEGIN + PROMPT -12 -1 "" +END + +BUTTON DLG_OK 10 2 +BEGIN + PROMPT -22 -1 "" +END + +ENDPAGE + +ENDMASK + diff --git a/ve/ve6100.cpp b/ve/ve6100.cpp index 179a8164e..67bd2ce9e 100755 --- a/ve/ve6100.cpp +++ b/ve/ve6100.cpp @@ -1,4 +1,4 @@ -// ve6100.cpp: programma di contabilizzazione documenti +\// ve6100.cpp: programma di contabilizzazione documenti // Orgiastica visione... // L'anatra del dubbio dalle labbra di Vermouth. //****************************************************************************** @@ -185,24 +185,32 @@ void TContabilizzazione_app::build_num_sheet() { _num_sheet->destroy(); - TTable eld("%ELD"); +// TTable eld("%ELD"); TTable num("%NUM"); TString s1,s2,s3; - TString16 tipon1,tipon2,tipon3,tipon4,tipon5; // tipi documento validi per la numerazione +// TString16 tipon1,tipon2,tipon3,tipon4,tipon5,tipon6,tipon7,tipon8,tipon9,tipon10; // tipi documento validi per la numerazione long pos; - eld.put("CODTAB",_cod_el); - if (eld.read() == NOERR) +// eld.put("CODTAB",_cod_el); + TContabilizzazione* cont = new TContabilizzazione(_cod_el); +// if (eld.read() == NOERR) + if (!cont->empty()) { TToken_string t; - s1.format("%-20s",(const char*)eld.get("S2")); - s3 = eld.get("S7"); - for (int i=0;i<5;i++) + TString16 tipo; +// s1 = eld.get("S2"); +// s3 = eld.get("S7"); + for (int i=0;itipo_iniziale(i); + if (tipo.not_empty()) + { + t = tipo; + t.add(cont->stato_iniziale(i)); // Stato iniziale + _tipi_doc.add(t); // Aggiunge questo tipo documento alla lista + } } for (pos=0,num.first();num.good();num.next(),pos++) // scorre tutte le numerazioni possibili { @@ -212,24 +220,44 @@ void TContabilizzazione_app::build_num_sheet() t.add(num.get("S0")); _num_sheet->add(t); s2 = num.get("S2"); // reperisce i tipi documento validi per questa numerazione - tipon1 = s2.mid(0,4); +/* tipon1 = s2.mid(0,4); tipon2 = s2.mid(4,4); tipon3 = s2.mid(8,4); tipon4 = s2.mid(12,4); tipon5 = s2.mid(16,4); - const int n1 = s1.find(tipon1); + tipon6 = s2.mid(20,4); + tipon7 = s2.mid(24,4); + tipon8 = s2.mid(28,4); + tipon9 = s2.mid(32,4); + tipon10 = s2.mid(36,4); */ + bool found = FALSE; + for (int i = _tipi_doc.last(); !found && i >= 0; i--) + found |= s2.find(((TToken_string &)_tipi_doc[i]).get(0)) >= 0; + if (found) + _num_sheet->enable_row(pos); + else + _num_sheet->disable_row(pos); +/* const int n1 = s1.find(tipon1); const int n2 = s1.find(tipon2); const int n3 = s1.find(tipon3); const int n4 = s1.find(tipon4); const int n5 = s1.find(tipon5); + const int n6 = s1.find(tipon6); + const int n7 = s1.find(tipon7); + const int n8 = s1.find(tipon8); + const int n9 = s1.find(tipon9); + const int n10 = s1.find(tipon10); if ((tipon1.empty() || n1<0) && (tipon2.empty() || n2<0) && - (tipon3.empty() || n3<0) && (tipon4.empty() || n4<0) && - (tipon5.empty() || n5<0)) + (tipon3.empty() || n3<0) && (tipon4.empty() || n4<0) && + (tipon5.empty() || n5<0) && (tipon6.empty() || n6<0) && + (tipon7.empty() || n7<0) && (tipon8.empty() || n8<0) && + (tipon9.empty() || n9<0) && (tipon10.empty() || n10<0)) _num_sheet->disable_row(pos); else - _num_sheet->enable_row(pos); + _num_sheet->enable_row(pos);*/ } } + delete cont; } bool TContabilizzazione_app::doc_tipo_stato_ok(TDocumento* doc) @@ -259,12 +287,12 @@ void TContabilizzazione_app::on_config_change() bool TContabilizzazione_app::create() { TApplication::create(); - if (!has_module(CGAUT)) - { - error_box("Impossibile eseguire il programma se il modulo Contabilita' Generale non e' abilitato"); - return FALSE; - } - open_files(LF_TABCOM, LF_CLIFO, LF_CFVEN, LF_DOC, LF_RIGHEDOC, LF_OCCAS, 0); +// if (!has_module(CGAUT)) +// { +// error_box("Impossibile eseguire il programma se il modulo Contabilita' Generale 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, 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 8b758c401..ff882b095 100755 --- a/ve/ve6300.cpp +++ b/ve/ve6300.cpp @@ -160,25 +160,34 @@ void TGenerazioneEffetti_app::build_num_sheet() { _num_sheet->destroy(); - TTable eld("%ELD"); +// TTable eld("%ELD"); TTable num("%NUM"); TString s1,s2,s3; - TString16 tipon1,tipon2,tipon3,tipon4,tipon5; // tipi documento validi per la numerazione +// TString16 tipon1,tipon2,tipon3,tipon4,tipon5, tipon6,tipon7,tipon8,tipon9,tipon10; // tipi documento validi per la numerazione long pos; - eld.put("CODTAB",_cod_el); - if (eld.read() == NOERR) +// eld.put("CODTAB",_cod_el); + TContabilizzazione* cont = new TContabilizzazione(_cod_el); +// if (eld.read() == NOERR) + if (!cont->empty()) { TToken_string t; - s1.format("%-20s",(const char*)eld.get("S2")); - s3 = eld.get("S7"); - _final_doc_status = eld.get("S4")[0]; - for (int i=0;i<5;i++) + TString16 tipo; +// s1 = eld.get("S2"); +// s3 = eld.get("S7"); +// _final_doc_status = eld.get("S4")[0]; + _final_doc_status = cont->stato_finale()[0]; + for (int i=0;itipo_iniziale(i); + if (tipo.not_empty()) + { + t = tipo; + t.add(cont->stato_iniziale(i)); // Stato iniziale + _tipi_doc.add(t); // Aggiunge questo tipo documento alla lista + } } for (pos=0,num.first();num.good();num.next(),pos++) // scorre tutte le numerazioni possibili { @@ -188,24 +197,44 @@ void TGenerazioneEffetti_app::build_num_sheet() t.add(num.get("S0")); _num_sheet->add(t); s2 = num.get("S2"); // reperisce i tipi documento validi per questa numerazione - tipon1 = s2.mid(0,4); +/* tipon1 = s2.mid(0,4); tipon2 = s2.mid(4,4); tipon3 = s2.mid(8,4); tipon4 = s2.mid(12,4); tipon5 = s2.mid(16,4); - const int n1 = s1.find(tipon1); + tipon6 = s2.mid(20,4); + tipon7 = s2.mid(24,4); + tipon8 = s2.mid(28,4); + tipon9 = s2.mid(32,4); + tipon10 = s2.mid(36,4); */ + bool found = FALSE; + for (int i = _tipi_doc.last(); !found && i >= 0; i--) + found |= s2.find(((TToken_string &)_tipi_doc[i]).get(0)) >= 0; + if (found) + _num_sheet->enable_row(pos); + else + _num_sheet->disable_row(pos); +/* const int n1 = s1.find(tipon1); const int n2 = s1.find(tipon2); const int n3 = s1.find(tipon3); const int n4 = s1.find(tipon4); const int n5 = s1.find(tipon5); + const int n6 = s1.find(tipon6); + const int n7 = s1.find(tipon7); + const int n8 = s1.find(tipon8); + const int n9 = s1.find(tipon9); + const int n10 = s1.find(tipon10); if ((tipon1.empty() || n1<0) && (tipon2.empty() || n2<0) && - (tipon3.empty() || n3<0) && (tipon4.empty() || n4<0) && - (tipon5.empty() || n5<0)) + (tipon3.empty() || n3<0) && (tipon4.empty() || n4<0) && + (tipon5.empty() || n5<0) && (tipon6.empty() || n6<0) && + (tipon7.empty() || n7<0) && (tipon8.empty() || n8<0) && + (tipon9.empty() || n9<0) && (tipon10.empty() || n10<0)) _num_sheet->disable_row(pos); else - _num_sheet->enable_row(pos); + _num_sheet->enable_row(pos);*/ } } + delete cont; } bool TGenerazioneEffetti_app::create() diff --git a/ve/veacc.frm b/ve/veacc.frm index 123e3123b..5a7d6b68c 100755 --- a/ve/veacc.frm +++ b/ve/veacc.frm @@ -1,4 +1,3 @@ - USE 33 JOIN 34 INTO CODNUM==CODNUM ANNO==ANNO PROVV==PROVV NDOC==NDOC JOIN 17 TO 33 INTO TIPOCF==TIPOCF CODCF==CODCF @@ -7,11 +6,11 @@ JOIN 16 TO 33 INTO TIPOCF==TIPOCF CODCF==CODCF CODIND==CODINDSP JOIN 16 TO 17 ALIAS 116 INTO TIPOCF==TIPOCF CODCF==CODCF CODIND==CODINDSP JOIN 47 INTO CODART==CODART JOIN %CPG TO 33 ALIAS 201 INTO CODTAB==CODPAG -JOIN 122 TO 33 ALIAS 202 INTO CODTAB==CODAG +JOIN 122 TO 33 ALIAS 202 INTO CODAGE==CODAG JOIN %POR TO 33 ALIAS 203 INTO CODTAB==CODPORTO JOIN %BAN TO 33 ALIAS 204 INTO CODTAB==CODABIA+CODCABA JOIN %VET TO 33 ALIAS 205 INTO CODTAB==CODVETT1 -JOIN %ASP TO 33 ALIAS 206 INTO CODTAB==ASPBENI1 +JOIN %ABE TO 33 ALIAS 206 INTO CODTAB==ASPBENI1 END DESCRIPTION @@ -36,11 +35,11 @@ BEGIN OFFSET 0 0 FONT "Courier New" SIZE 12 - MODULE BUFFETTI_FATTURA_ACCOMPAGNATORIA_01 + MODULE "BUFFETTI_FATTURA_ACCOMPAGNATORIA_01" PRI_DECIMALS 0 3 QTA_DECIMALS 3 3 IMP_DECIMALS 0 3 - EXCLUDE "," + EXCLUDE "08," END SECTION HEADER ODD 27 @@ -48,294 +47,311 @@ SECTION HEADER ODD 27 STRINGA 1 36 1 BEGIN KEY "nome ditta" - PROMPT 5 1 "" + PROMPT 5 6 "" MESSAGE _DITTA,!RAGSOC END STRINGA 2 36 1 BEGIN KEY "indirizzo ditta" - PROMPT 5 2 "" + PROMPT 5 7 "" MESSAGE _DITTA,!IND END STRINGA 3 5 1 BEGIN KEY "cap ditta" - PROMPT 5 3 "" + PROMPT 5 8 "" MESSAGE _DITTA,!CAP END STRINGA 4 30 1 BEGIN KEY "comune ditta" - PROMPT 12 3 "" + PROMPT 12 8 "" MESSAGE _DITTA,!COM END STRINGA 5 5 1 BEGIN KEY "scritta p.iva" - PROMPT 5 4 "P.IVA" + PROMPT 5 9 "P.IVA" END STRINGA 6 16 1 BEGIN KEY "partita iva ditta" - PROMPT 11 4 "" + PROMPT 11 9 "" MESSAGE _DITTA,!IVA END STRINGA 7 9 1 BEGIN KEY "scritta cod.fisc." - PROMPT 5 5 "COD.FISC" + PROMPT 5 10 "COD.FISC" END STRINGA 8 16 1 BEGIN KEY "codice fiscale ditta" - PROMPT 15 5 "" + PROMPT 15 10 "" MESSAGE _DITTA,!CF END NUMERO 9 30 1 BEGIN KEY "reg.soc.trib...." - PROMPT 5 6 "REG.SOC.TRIB.R.E. " + PROMPT 5 11 "REG.SOC.TRIB.R.E. " MESSAGE _DITTA,!REGSOC + FLAGS "D" END NUMERO 10 30 1 BEGIN KEY "c.c.i.a.a. 143011" - PROMPT 5 7 "C.C.I.A.A. " + PROMPT 5 12 "C.C.I.A.A. " MESSAGE _DITTA,!CCIAA + FLAGS "D" END -STRINGA 11 36 2 +STRINGA 11 37 2 BEGIN - KEY "destinatario, ditta" - PROMPT 44 10 "" + KEY "Cliente ,rag.soc" + PROMPT 44 7 "" MESSAGE _CLIENTE,!RAGSOC END -STRINGA 12 36 2 +STRINGA 12 37 1 BEGIN - KEY "destinatario, indirizzo" - PROMPT 44 12 "" + KEY "Cliente, indirizzo" + PROMPT 44 9 "" MESSAGE _CLIENTE,!INDNUM END -STRINGA 13 5 1 +STRINGA 13 37 1 BEGIN - KEY "destinatario, cap" - PROMPT 44 14 "" + KEY "cliente localita" + PROMPT 44 10 "" + MESSAGE _CLIENTE,LOCALITACF +END + +STRINGA 14 5 1 +BEGIN + KEY "Cliente, cap" + PROMPT 44 11 "" MESSAGE _CLIENTE,CAPCF END -STRINGA 14 30 2 +STRINGA 15 30 2 BEGIN - KEY "destinatario, comune" - PROMPT 50 14 "" + KEY "Cliente, comune" + PROMPT 50 11 "" MESSAGE _CLIENTE,!COM->DENCOM END -STRINGA 15 2 1 +STRINGA 16 2 1 BEGIN - KEY "destinatario, provincia" - PROMPT 77 15 "" + KEY "Cliente, provincia" + PROMPT 77 12 "" MESSAGE _CLIENTE,!COM->PROVCOM END -STRINGA 16 10 1 +STRING 17 37 2 BEGIN - KEY "data bolla" - PROMPT 58 19 "" - FIELD DATADOC + KEY "destinazione, rag.soc." + PROMPT 44 14 "" + FIELD 16->RAGSOC END -STRINGA 17 7 -BEGIN - KEY "numero bolla" - PROMPT 67 19 "" - FIELD 33->NDOC -END - -STRINGA 18 30 1 +STRINGA 18 37 1 BEGIN KEY "destinazione, indirizzo" - PROMPT 1 10 "" + PROMPT 44 16 "" FIELD 16->INDIR END -STRINGA 19 30 1 +STRINGA 19 35 1 +BEGIN + KEY "destinazione localita" + PROMPT 44 17 "" + FIELD 16->LOCALITA +END + +STRINGA 20 5 1 BEGIN KEY "destinazione, cap" - PROMPT 1 12 "" + PROMPT 44 18 "" FIELD 16->CAP END -STRINGA 20 50 1 +STRINGA 21 50 1 BEGIN FLAGS "H" PROMPT 1 1 "" FIELD 16->COM END -STRINGA 21 30 1 +STRINGA 22 30 2 BEGIN KEY "destinazione, comune" - PROMPT 1 14 "" - MESSAGE _ISAMREAD,13,COM=#20,DENCOM + PROMPT 50 18 "" + MESSAGE _ISAMREAD,13,COM=#21,DENCOM END -STRINGA 22 2 1 +STRINGA 23 2 1 BEGIN KEY "destinazione, provincia" - PROMPT 31 14 "" - MESSAGE _ISAMREAD,13,COM=#20,PROVCOM + PROMPT 77 19 "" + MESSAGE _ISAMREAD,13,COM=#21,PROVCOM END -STRINGA 23 26 1 -BEGIN - KEY "ordine" - PROMPT 1 19 "" - FIELD NUMDOCRIF -END - -DATA 24 10 -BEGIN - KEY "data conferma" - PROMPT 28 19 "" - FIELD DATADOCRIF - FORMAT "1444-" -END - -STRINGA 25 48 1 -BEGIN - KEY "condizioni di pagamento" - PROMPT 1 21 "" - FIELD 201@->S0 -END - -STRINGA 26 29 1 -BEGIN - KEY "banca d'appoggio" - PROMPT 50 21 "" - FIELD 204@->S0 -END - -STRINGA 27 8 1 -BEGIN - KEY "codice cliente" - PROMPT 5 23 "" - FIELD CODCF -END - -STRINGA 28 16 1 -BEGIN - KEY "partita iva cliente" - PROMPT 16 23 "" - MESSAGE _CLIENTE,PIVA -END - -STRINGA 29 25 1 -BEGIN - KEY "porto" - PROMPT 35 23 "" - FIELD 203@->S0 -END - -STRINGA 29 3 1 +STRINGA 24 3 1 BEGIN KEY "codice agente" - PROMPT 1 23 "" + PROMPT 4 25 "" FIELD CODAG END -STRING 30 28 +STRINGA 25 7 1 BEGIN - KEY "nome agente" - PROMPT 5 23 "" - FIELD 202@->S0 + KEY "codice cliente" + PROMPT 8 25 "" + FIELD CODCF END -STRINGA 31 21 1 +STRINGA 26 11 1 BEGIN - KEY "vettore" - PROMPT 59 23 "" + KEY "partita iva cliente" + PROMPT 19 25 "" + MESSAGE _CLIENTE,PIVA +END + +STRINGA 27 16 1 +BEGIN + KEY "codice fiscale cliente" + PROMPT 31 25 "" + MESSAGE _CLIENTE,COFI +END + +DATA 28 8 1 +BEGIN + KEY "data documento" + PROMPT 60 21 "" + FIELD DATADOC + FORMAT "1442-" +END + +STRINGA 29 7 +BEGIN + KEY "numero documento" + PROMPT 71 21 "" + FIELD 33->NDOC +END + +STRINGA 30 2 +BEGIN + KEY "Numero di pagina" + PROMPT 81 21 "" + MESSAGE _PAGENO +END + +STRINGA 31 48 1 +BEGIN + KEY "condizioni di pagamento" + PROMPT 4 23 "" + FIELD 201@->S0 +END + +STRINGA 32 28 1 +BEGIN + KEY "banca d'appoggio" + PROMPT 54 23 "" + FIELD 204@->S0 +END + +NUMERO 33 7 1 +BEGIN + KEY "ordine" + PROMPT 4 21 "" + FIELD 33->NUMDOCRIF +END + +DATA 34 10 1 +BEGIN + KEY "data conferma" + PROMPT 26 21 "" + FIELD 33->DATADOCRIF + FORMAT "1444-" END END SECTION BODY ODD 5 -STRINGA 51 13 1 +STRINGA 51 12 1 BEGIN KEY "codice articolo" - PROMPT 1 1 "" + PROMPT 3 1 "" FIELD 34->CODART END -STRINGA 52 30 4 +STRINGA 52 18 4 BEGIN KEY "descrizione articolo" - PROMPT 17 1 "" + PROMPT 16 1 "" MESSAGE _DESCRIGA END STRINGA 53 2 BEGIN KEY "unita' di misura" - PROMPT 46 1 "" + PROMPT 36 1 "" FIELD 34->UMQTA MESSAGE _ALIGN,#52,BOTTOM END -NUMBER 54 10 +NUMBER 54 12 BEGIN KEY "quantita'" - PROMPT 49 1 "" - PICTURE "######" + PROMPT 40 1 "" + PICTURE "###.###.###" GROUP 30 FIELD 34->QTA MESSAGE _ALIGN,#52,BOTTOM END -NUMBER 55 15 +NUMBER 55 8 BEGIN KEY "prezzo unitario" - PROMPT 59 1 "" - PICTURE "###.###.###.###" + PROMPT 57 1 "" + PICTURE "########" GROUP 29 FIELD 34->PREZZO MESSAGE _ALIGN,#52,BOTTOM END -STRINGA 56 20 +STRINGA 56 3 BEGIN KEY "sconto" - PROMPT 75 1 "" + PROMPT 66 1 "" FIELD 34->SCONTO MESSAGE _ALIGN,#52,BOTTOM END -NUMBER 57 15 +NUMBER 57 9 BEGIN KEY "importo netto" - PROMPT 68 1 "" - FLAGS "H" + PROMPT 70 1 "" GROUP 29 - FIELD 34->IMPNN - PICTURE "###.###.###.###" + FIELD 34->IMPNS + PICTURE "#.###.###" MESSAGE _ALIGN,#52,BOTTOM END -STRINGA 58 3 1 +STRINGA 58 2 1 BEGIN KEY "iva" - PROMPT 81 1 "" + PROMPT 80 1 "" FIELD 34->CODIVA MESSAGE _ALIGN,#52,BOTTOM END @@ -375,294 +391,449 @@ END END -SECTION FOOTER LAST 19 +SECTION FOOTER ODD -46 STRINGA 81 5 1 BEGIN KEY "messaggio 'segue' in coda" - PROMPT 68 19 "SEGUE" + PROMPT 70 12 "SEGUE" END END -SECTION FOOTER ODD 19 +SECTION FOOTER LAST -46 -NUMBER 101 15 +NUMBER 101 12 +BEGIN + KEY "totale importi netti (non scontati)" + PROMPT 4 3 "" + FIELD TOTMER + PICTURE "###.###.###" + GROUP 31 +END + +STRING 102 6 +BEGIN + KEY "sconto %" + PROMPT 20 3 "" + FIELD 33->SCONTOPERC +END + +NUMBER 103 12 +BEGIN + KEY "totale sconto testa" + PROMPT 28 3 "" + FIELD SCONTOT + PICTURE "###.###.###" + GROUP 31 +END + +NUMBER 104 12 BEGIN KEY "spese di trasporto" - PROMPT 43 52 "" - MESSAGE _TOTAL_CODA,SPTRAS - PICTURE "###.###.###.###" + PROMPT 42 3 "" + FIELD SPESTRA + PICTURE "###.###.###" GROUP 31 END -NUMBER 102 115 -BEGIN - KEY "spese di incasso" - PROMPT 55 50 "" - MESSAGE _TOTAL_CODA,SPINC - PICTURE "###.###.###.###" - GROUP 31 -END - -NUMBER 103 15 -BEGIN - KEY "spese bolli" - PROMPT 55 52 "" - MESSAGE _TOTAL_CODA,SPIMB - PICTURE "###.###.###.###" - GROUP 31 -END - -STRINGA 104 21 1 -BEGIN - KEY "descrizione altri 1" - PROMPT 22 48 "" -END - -STRINGA 105 12 1 -BEGIN - KEY "imponibile 1" - PROMPT 4 48 "" -END - -STRINGA 106 3 1 -BEGIN - KEY "iva 1" - PROMPT 17 48 "" -END - -STRINGA 107 11 1 -BEGIN - KEY "imposta 1" - PROMPT 22 48 "" -END - -STRINGA 108 21 1 -BEGIN - KEY "descrizione altri 2" - PROMPT 22 49 "" -END - -STRINGA 109 12 1 -BEGIN - KEY "imponibile 2" - PROMPT 4 49 "" -END - -STRINGA 110 3 1 -BEGIN - KEY "iva 2" - PROMPT 17 49 "" -END - -STRINGA 111 11 1 -BEGIN - KEY "imposta 2" - PROMPT 22 49 "" -END - -STRINGA 112 21 1 -BEGIN - KEY "descrizione altri 3" - PROMPT 22 50 "" -END - -STRINGA 113 12 1 -BEGIN - KEY "imponibile 3" - PROMPT 4 50 "" -END - -STRINGA 114 3 1 -BEGIN - KEY "iva 3" - PROMPT 17 50 "" -END - -STRINGA 115 11 1 -BEGIN - KEY "imposta 3" - PROMPT 22 50 "" -END - -STRINGA 116 21 1 -BEGIN - KEY "descrizione altri 4" - PROMPT 22 51 "" -END - -STRINGA 117 12 1 -BEGIN - KEY "imponibile 4" - PROMPT 4 51 "" -END - -STRINGA 118 3 1 -BEGIN - KEY "iva 4" - PROMPT 17 51 "" -END - -STRINGA 119 11 1 -BEGIN - KEY "imposta 4" - PROMPT 22 51 "" -END - -STRINGA 120 21 1 -BEGIN - KEY "descrizione altri 5" - PROMPT 22 52 "" -END - -STRINGA 121 12 1 -BEGIN - KEY "imponibile 5" - PROMPT 4 52 "" -END - -STRINGA 122 3 1 -BEGIN - KEY "iva 5" - PROMPT 17 52 "" -END - -STRINGA 123 11 1 -BEGIN - KEY "imposta 5" - PROMPT 22 52 "" -END - -STRINGA 124 6 1 -BEGIN - KEY "stampa totali" - PROMPT 1 54 "" -END - -STRINGA 125 12 1 -BEGIN - KEY "totale imponibile" - PROMPT 4 54 "" -END - -STRINGA 126 11 1 -BEGIN - KEY "totale imposta" - PROMPT 22 54 "" -END - -STRINGA 127 11 1 -BEGIN - KEY "totale importi netti" - PROMPT 68 48 "" -END - -STRINGA 128 11 1 +NUMBER 105 12 BEGIN KEY "spese di imballo" - PROMPT 43 50 "" + PROMPT 56 3 "" + FIELD SPESIMB + PICTURE "###.###.###" + GROUP 31 END -STRINGA 129 2 1 +NUMBER 106 12 BEGIN - KEY "cancella 'iva' per sp. tras" - PROMPT 43 51 "" + KEY "Totale spese" + PROMPT 70 3 "" + FIELD SPESE + PICTURE "###.###.###" + GROUP 31 END -STRINGA 130 8 1 +STRING 107 2 BEGIN - KEY "scritta spese di trasporto" - PROMPT 45 51 "" + KEY "codice iva 1" + PROMPT 3 5 "" + MESSAGE _RIEPILOGOIVA,1,COD,0 END -STRINGA 131 11 1 +NUMBER 108 12 +BEGIN + KEY "imponibile 1" + PROMPT 6 5 "" + MESSAGE _RIEPILOGOIVA,1,IMP,0 + PICTURE "###.###.###" + GROUP 31 +END + +NUMBER 109 2 +BEGIN + KEY "iva 1" + PROMPT 19 5 "" + MESSAGE _RIEPILOGOIVA,1,ALI,0 + PICTURE "##" +END + +NUMBER 110 10 +BEGIN + KEY "imposta 1" + PROMPT 22 5 "" + MESSAGE _RIEPILOGOIVA,1,IVA,1 + PICTURE "##.###.###" + GROUP 31 +END + +STRING 111 2 +BEGIN + KEY "codice iva 2" + PROMPT 3 6 "" + MESSAGE _RIEPILOGOIVA,1,COD,0 +END + +NUMBER 112 12 +BEGIN + KEY "imponibile 2" + PROMPT 6 6 "" + MESSAGE _RIEPILOGOIVA,1,IMP,0 + PICTURE "###.###.###" + GROUP 31 +END + +NUMBER 113 2 +BEGIN + KEY "iva 2" + PROMPT 19 6 "" + MESSAGE _RIEPILOGOIVA,1,ALI,0 + PICTURE "##" +END + +NUMBER 114 10 +BEGIN + KEY "imposta 2" + PROMPT 22 6 "" + MESSAGE _RIEPILOGOIVA,1,IVA,1 + PICTURE "##.###.###" + GROUP 31 +END + +STRING 115 2 +BEGIN + KEY "codice iva 3" + PROMPT 3 7 "" + MESSAGE _RIEPILOGOIVA,30,COD,0 +END + +NUMBER 116 12 +BEGIN + KEY "imponibile 3" + PROMPT 6 7 "" + MESSAGE _RIEPILOGOIVA,30,IMP,0 + PICTURE "###.###.###" + GROUP 31 +END + +STRINGA 117 45 +BEGIN + KEY "descrizione altri 3" + PROMPT 35 7 "" + MESSAGE _RIEPILOGOIVA,30,DES,1 +END + +STRING 118 2 +BEGIN + KEY "codice iva 4" + PROMPT 3 8 "" + MESSAGE _RIEPILOGOIVA,30,COD,0 +END + +NUMBER 119 12 +BEGIN + KEY "imponibile 4" + PROMPT 6 8 "" + MESSAGE _RIEPILOGOIVA,30,IMP,0 + PICTURE "###.###.###" + GROUP 31 +END + +STRINGA 120 45 +BEGIN + KEY "descrizione altri 4" + PROMPT 35 8 "" + MESSAGE _RIEPILOGOIVA,30,DES,1 +END + +NUMBER 121 15 +BEGIN + KEY "totale imponibile" + PROMPT 3 10 "" + MESSAGE _TOTIMPONIBILI,29 + PICTURE "##.###.###.###" + GROUP 31 +END + +NUMBER 122 14 BEGIN KEY "totale imposta" - PROMPT 68 52 "" + PROMPT 19 10 "" + FIELD IMPOSTE + PICTURE "#.###.###.###" + GROUP 31 END -STRINGA 132 11 1 +NUMBER 123 10 +BEGIN + KEY "totale esenti" + PROMPT 35 10 "" + MESSAGE _TOTIMPONIBILI,28 + PICTURE "##.###.###" + GROUP 31 +END + +NUMBER 124 8 +BEGIN + KEY "spese di incasso" + PROMPT 54 10 "" + FIELD SPESINC + PICTURE "###.###" + GROUP 31 +END + +NUMBER 125 5 +BEGIN + KEY "spese bolli" + PROMPT 63 10 "" + FIELD BOLLI + PICTURE "#####" + GROUP 31 +END + +NUMBER 126 12 BEGIN KEY "totale fattura" - PROMPT 68 54 "" + PROMPT 70 10 "" + FIELD TOTDOC + PICTURE "###.###.###" + GROUP 31 END -LISTA 133 1 1 +DATA 127 8 +BEGIN + KEY "scadenza pagamento 1" + PROMPT 3 14 "" + MESSAGE _SCADENZE,DATA,0 + FORMAT "1442-" +END + +NUMBER 128 11 +BEGIN + KEY "importo scadenza 1" + PROMPT 12 14 "" + MESSAGE _SCADENZE,IMPORTO,1 + PICTURE "###.###.###" + GROUP 31 +END + +DATA 129 8 +BEGIN + KEY "scadenza pagamento 2" + PROMPT 25 14 "" + MESSAGE _SCADENZE,DATA,0 + FORMAT "1442-" +END + +NUMBER 130 11 +BEGIN + KEY "importo scadenza 2" + PROMPT 34 14 "" + MESSAGE _SCADENZE,IMPORTO,1 + PICTURE "###.###.###" + GROUP 31 +END + +DATA 131 8 +BEGIN + KEY "scadenza pagamento 3" + PROMPT 47 14 "" + MESSAGE _SCADENZE,DATA,0 + FORMAT "1442-" +END + +NUMBER 132 11 +BEGIN + KEY "importo scadenza 3" + PROMPT 56 14 "" + MESSAGE _SCADENZE,IMPORTO,1 + PICTURE "###.###.###" + GROUP 31 +END + +DATA 133 8 +BEGIN + KEY "scadenza pagamento 4" + PROMPT 3 15 "" + MESSAGE _SCADENZE,DATA,0 + FORMAT "1442-" +END + +NUMBER 134 11 +BEGIN + KEY "importo scadenza 4" + PROMPT 12 15 "" + MESSAGE _SCADENZE,IMPORTO,1 + PICTURE "###.###.###" + GROUP 31 +END + +DATA 135 8 +BEGIN + KEY "scadenza pagamento 5" + PROMPT 25 15 "" + MESSAGE _SCADENZE,DATA,0 + FORMAT "1442-" +END + +NUMBER 136 11 +BEGIN + KEY "importo scadenza 5" + PROMPT 34 15 "" + MESSAGE _SCADENZE,IMPORTO,1 + PICTURE "###.###.###" + GROUP 31 +END + +NUMBER 137 12 +BEGIN + KEY "netto a pagare" + PROMPT 70 15 "" + FIELD TOTDOC + PICTURE "###.###.###" + GROUP 31 +END + +LIST 138 1 1 BEGIN KEY "trasporto a cura del mitt." - PROMPT 1 57 "" - ITEM "|" - ITEM "M|x" + PROMPT 4 17 "" FIELD CODSPMEZZO + ITEM "|" MESSAGE DISABLE,6@|ENABLE,5@ + ITEM "D| " + ITEM "M|X" MESSAGE DISABLE,6@|ENABLE,5@ + ITEM "V| " END -LISTA 134 1 1 +LIST 139 1 1 BEGIN KEY "trasporto a cura del dest." - PROMPT 7 57 "" - ITEM "|" - ITEM "D|x" + PROMPT 7 14 "" FIELD CODSPMEZZO + ITEM "|" MESSAGE DISABLE,6@|ENABLE,5@ + ITEM "D|X" MESSAGE DISABLE,6@|ENABLE,5@ + ITEM "M| " + ITEM "V| " END -STRINGA 135 1 1 +LIST 140 1 1 BEGIN KEY "trasporto a cura del vett." - PROMPT 15 57 "" - ITEM "|" - ITEM "V|x" + PROMPT 25 25 "" FIELD CODSPMEZZO + ITEM "|" // default + ITEM "D| " + ITEM "M| " + ITEM "V|X" MESSAGE DISABLE,5@|ENABLE,6@ END -DATA 136 8 1 +STRING 141 19 1 BEGIN - KEY "data inizio trasporto" - PROMPT 45 57 "" - FIELD DATAPART - FORMAT "1444-" -END - -STRINGA 137 5 1 -BEGIN - KEY "ora inizio trasporto" - PROMPT 57 57 "" - FIELD ORAPART -END - -STRINGA 138 40 1 -BEGIN - KEY "nominativo vettore" - PROMPT 1 59 "" - FIELD 205@->S0 -END - -STRINGA 139 40 1 -BEGIN - KEY "indirizzo vettore" - PROMPT 1 60 "" - FIELD 205@->S1 -END - -STRINGA 140 41 1 -BEGIN - KEY "aspetto esteriore dei beni" - PROMPT 1 63 "" + KEY "aspetto beni" + PROMPT 32 17 "" FIELD 206@->S0 END -STRINGA 141 12 1 +STRING 142 5 1 +BEGIN + KEY "colli" + PROMPT 52 17 "" + FIELD NCOLLI +END + +STRING 143 7 1 BEGIN KEY "peso" - PROMPT 44 63 "" + PROMPT 60 17 "" FIELD PNETTO END -STRINGA 142 8 1 +STRING 144 35 1 BEGIN - KEY "colli" - PROMPT 57 63 "" - FIELD NCOLLI + KEY "nome vettore" + PROMPT 3 19 "" + FIELD 205@->S0 +END + +STRING 145 35 1 +BEGIN + KEY "indirizzo vettore" + PROMPT 3 20 "" + FIELD 205@->S1[1,35] +END + +STRING 146 45 1 +BEGIN + KEY "localita' vettore" + PROMPT 3 21 "" + FIELD 205@->S1[46,70] + FLAGS "D" +END + +STRING 147 5 1 +BEGIN + KEY "CAP vettore" + PROMPT 3 21 "" + FIELD 205@->S7 +END + +STRING 148 5 1 +BEGIN + KEY "Codice comune vettore" + PROMPT 1 1 "" + FIELD 205@->S9 + FLAGS "H" +END + +STRING 149 25 1 +BEGIN + KEY "Denominazione comune vettore" + PROMPT 9 21 "" + MESSAGE _ISAMREAD,13,COM=#148,DENCOM +END + +STRING 150 2 1 +BEGIN + KEY "Provincia comune vettore" + PROMPT 37 21 "" + MESSAGE _ISAMREAD,13,COM=#148,PROVCOM +END + +DATA 151 8 +BEGIN + KEY "data inizio trasporto" + PROMPT 40 19 "" + FIELD DATAPART + FORMAT "1442-" +END + +STRING 152 5 1 +BEGIN + KEY "ora inizio trasporto" + PROMPT 49 19 "" + PICTURE "## ##" + FIELD ORAPART END END diff --git a/ve/vearea.men b/ve/vearea.men index 4d35ff994..b8757caf4 100755 --- a/ve/vearea.men +++ b/ve/vearea.men @@ -21,6 +21,8 @@ Item_01 = "Tabelle", [ACQVEN_002] Item_02 = "Stampa Tabelle", [ACQVEN_007] Item_03 = "Archivi di base", [ACQVEN_012] Item_04 = "Stampe archivi di base", [ACQVEN_013] +Item_05 = "Archivi contabili", [ACQVEN_023] +Item_06 = "Stampe archivi contabili", [ACQVEN_024] [ACQVEN_002] Caption = "Tabelle" @@ -192,7 +194,8 @@ Caption = "Servizi" Picture = Module = 0 Flags = "" -Item_09 = "Modifica valori", "ve4 -0", "F" +Item_01 = "Modifica valori", "ve4 -0", "F" +Item_02 = "Invio", [ACQVEN_025] [ACQVEN_022] Caption = "Configurazione magazzino" @@ -202,3 +205,33 @@ Flags = "" Item_01 = "Parametri di magazzino", "mg0 -2 -1", "F" Item_02 = "Formato codice articoli", "mg0 -0 FCA", "F" +[ACQVEN_023] +Caption = "Archivi contabili" +Picture = +Module = 0 +Flags = "" +Item_01 = "Registri", "ba3 -0 reg", "" +Item_02 = "Piano dei conti", "cg0 -0", "F" +Item_03 = "Causali", "cg0 -4", "F" + +[ACQVEN_024] +Caption = "Stampa archivi contabili" +Picture = +Module = 0 +Flags = "" +Item_01 = "Registri", "ba3 -1 reg", "" +Item_02 = "Piano dei conti", "cg1 -0", "F" +Item_03 = "Causali", "cg1 -6", "F" + +[ACQVEN_025] +Caption = "Invio" +Picture = +Module = 0 +Flags = "" +Item_01 = "Tabella studio per invio", "cg6 -4 %INS", "F" +Item_02 = "Tabella ditta per invio", "cg6 -4 %IND", "F" +Item_03 = "Invio contabilita' a sistema", "cg6 -8 S", "F" +Item_04 = "Invio contabilita' a PC", "cg6 -8 P", "F" +Item_05 = "Ripristino movimenti da inviare", "cg6 -8 R", "F" +Item_06 = "Eliminazione file invio", "cg6 -8 C", "FP" + diff --git a/ve/vebol.frm b/ve/vebol.frm index c2cb81644..257785783 100755 --- a/ve/vebol.frm +++ b/ve/vebol.frm @@ -531,6 +531,7 @@ END // !IND indirizzo // !NUM numero civico // !INDNUM indirizzo + numero civico +// !INDSPED indirizzo spedizione + numero civico // !TEL primo numero di telefono (con prefisso) // !TEL2 secondo numero di telefono (con prefisso) // !TEL3 terzo numero di telefono (con prefisso) diff --git a/ve/vebolbmp.frm b/ve/vebolbmp.frm index 4b4544045..c4311691e 100755 --- a/ve/vebolbmp.frm +++ b/ve/vebolbmp.frm @@ -540,6 +540,7 @@ END // !IND indirizzo // !NUM numero civico // !INDNUM indirizzo + numero civico +// !INDSPED indirizzo spedizione + numero civico // !TEL primo numero di telefono (con prefisso) // !TEL2 secondo numero di telefono (con prefisso) // !TEL3 terzo numero di telefono (con prefisso) diff --git a/ve/vefat.frm b/ve/vefat.frm index f56be3ff1..b870005ac 100755 --- a/ve/vefat.frm +++ b/ve/vefat.frm @@ -793,6 +793,7 @@ END // !IND indirizzo // !NUM numero civico // !INDNUM indirizzo + numero civico +// !INDSPED indirizzo spedizione + numero civico // !TEL primo numero di telefono (con prefisso) // !TEL2 secondo numero di telefono (con prefisso) // !TEL3 terzo numero di telefono (con prefisso) diff --git a/ve/vefatbmp.frm b/ve/vefatbmp.frm index dbd4949d2..2555a6d02 100755 --- a/ve/vefatbmp.frm +++ b/ve/vefatbmp.frm @@ -800,6 +800,7 @@ END // !IND indirizzo // !NUM numero civico // !INDNUM indirizzo + numero civico +// !INDSPED indirizzo spedizione + numero civico // !TEL primo numero di telefono (con prefisso) // !TEL2 secondo numero di telefono (con prefisso) // !TEL3 terzo numero di telefono (con prefisso) diff --git a/ve/veinst.ini b/ve/veinst.ini index 746344d2b..d36175bda 100755 --- a/ve/veinst.ini +++ b/ve/veinst.ini @@ -1,9 +1,9 @@ [ve] -Data = 08-05-1998 +Data = 10-06-1998 Descrizione = Vendite Dischi = 1 Moduli = ba,cg9,pr9,mg9,sv9 -Patch = 25 +Patch = 59 PostProcess = bainst -0 VE PreProcess = Prezzo(1) = 900,300 @@ -17,7 +17,7 @@ Versione = 19980103 [ve0] File(0) = ve00.bmp File(1) = vearea.men -Patch = 25 +Patch = 59 Versione = 19980103 [ve1] @@ -55,7 +55,7 @@ File(32) = ve6200a.msk File(33) = ve6300a.msk File(34) = veprassi.hlp File(35) = veprassi.men -Patch = 25 +Patch = 59 Versione = 19980103 [ve2] @@ -63,7 +63,7 @@ File(36) = recdesc\f33.dir File(37) = recdesc\f33.trr File(38) = recdesc\f34.dir File(39) = recdesc\f34.trr -Patch = 25 +Patch = 59 Versione = 19980103 [ve3] @@ -105,7 +105,7 @@ File(74) = verig08.ini File(75) = verig08.msk File(76) = verig09.ini File(77) = verig09.msk -Patch = 25 +Patch = 59 Versione = 19980103 [ve9] @@ -180,40 +180,41 @@ File(145) = recdesc\f53.trr File(146) = tab_fca.frm File(147) = ve0.exe File(148) = ve0100a.msk -File(149) = ve0100o.msk -File(150) = ve0200a.msk -File(151) = ve0200b.msk -File(152) = ve0200c.msk -File(153) = ve0200d.msk -File(154) = ve0200e.msk -File(155) = ve0200f.msk -File(156) = ve0300a.ini -File(157) = ve0300b.dat -File(158) = ve0300c.ini -File(159) = ve2.exe -File(160) = ve2100.msk -File(161) = ve2100d.msk -File(162) = ve2100i.msk -File(163) = ve2100r.msk -File(164) = ve2200.msk -File(165) = ve2200x.msk -File(166) = ve2300.msk -File(167) = ve2300x.msk -File(168) = ve2400.msk -File(169) = ve2400a.msk -File(170) = ve2400b.msk -File(171) = ve2400c.msk -File(172) = ve3.exe -File(173) = ve3100.msk -File(174) = ve3100d.msk -File(175) = ve3100i.msk -File(176) = ve3100r.msk -File(177) = ve3200.msk -File(178) = ve3200x.msk -File(179) = ve3300.msk -File(180) = ve3400.msk -File(181) = ve4.exe -File(182) = ve4100.msk -Patch = 25 +File(149) = ve0100b.msk +File(150) = ve0100o.msk +File(151) = ve0200a.msk +File(152) = ve0200b.msk +File(153) = ve0200c.msk +File(154) = ve0200d.msk +File(155) = ve0200e.msk +File(156) = ve0200f.msk +File(157) = ve0300a.ini +File(158) = ve0300b.dat +File(159) = ve0300c.ini +File(160) = ve2.exe +File(161) = ve2100.msk +File(162) = ve2100d.msk +File(163) = ve2100i.msk +File(164) = ve2100r.msk +File(165) = ve2200.msk +File(166) = ve2200x.msk +File(167) = ve2300.msk +File(168) = ve2300x.msk +File(169) = ve2400.msk +File(170) = ve2400a.msk +File(171) = ve2400b.msk +File(172) = ve2400c.msk +File(173) = ve3.exe +File(174) = ve3100.msk +File(175) = ve3100d.msk +File(176) = ve3100i.msk +File(177) = ve3100r.msk +File(178) = ve3200.msk +File(179) = ve3200x.msk +File(180) = ve3300.msk +File(181) = ve3400.msk +File(182) = ve4.exe +File(183) = ve4100.msk +Patch = 59 Versione = 19980103 diff --git a/ve/velib.h b/ve/velib.h index 93753bf81..b1f56288d 100755 --- a/ve/velib.h +++ b/ve/velib.h @@ -106,7 +106,7 @@ class TDocumento_variable_field : public TVariable_field // @ cmember Costruttore con un variable_field TDocumento_variable_field(const TVariable_field & f) : TVariable_field(f), _dirty(TRUE) {} // @ cmember Distruttore - ~TDocumento_variable_field() {} + virtual ~TDocumento_variable_field() {} }; class TSpesa_prest : public TRectype // velib01 @@ -168,20 +168,22 @@ protected: public: // @cmember Duplica l'espressione virtual TObject* dup() const; + // @cmember Assegna il documento corrente - void set_doc(TDocumento * doc) { _doc = doc; } + void set_doc(TDocumento* doc) { _doc = doc; } // @cmember Assegna il documento corrente - void set_row(TRiga_documento * row) { _row = row; } + void set_row(TRiga_documento* row) { _row = row; } // @cmember Costruttore (assegna l'estressione e il suo tipo) TExpr_documento(const char* expression, TTypeexp type = _numexpr, - TDocumento * doc = NULL, TRiga_documento * row = NULL); + TDocumento* doc = NULL, TRiga_documento * row = NULL); // @cmember Costruttore (assegna il tipo dell'istruzione) TExpr_documento(TTypeexp type = _numexpr, - TDocumento * doc = NULL, TRiga_documento * row = NULL) + TDocumento* doc = NULL, TRiga_documento* row = NULL) : TExpression(type), _doc(doc), _row(row) {} // @cmember Costruttore di copia TExpr_documento(const TExpr_documento & expr) : TExpression(expr), _doc(expr._doc), _row(expr._row) {} + // @cmember Distruttore virtual ~TExpr_documento() {} }; @@ -202,7 +204,7 @@ public: public: const TString& codice() const { return get("CODTAB");} const TString& name() const { return codice();} - TExpr_documento * expr() const { return _expr ? new TExpr_documento(*_expr) : NULL;} + TExpr_documento* expr() const { return _expr;} const TString& descrizione() const { return get("S0"); } const TString& expr_string() const { return get("S1"); } @@ -226,7 +228,12 @@ class TTipo_documento : public TRectype // velib03 TString16 _basesconto; TString16 _spese; TString16 _totprovv; - + TString16 _valore; + TString16 _totvalres; + TString16 _totvalore; + + TConfig* _profile; + protected: void read_formule(); int read(const char* tipodoc); @@ -236,6 +243,10 @@ public: public: const TString& profile_name() const { return get("S4");} + TConfig& profile() const; + + char tipocf() const { return profile().get_char("TIPOCF", "MAIN"); } + const TString& mask_name() const { return get("S4");} const TString& causale() const { return get("S6"); } int tipo() const { return get_int("I1"); } @@ -255,6 +266,9 @@ public: const TString & basesconto() const { return _basesconto;} const TString & spese() const { return _spese;} const TString & totprovv() const { return _totprovv;} + const TString & valore() const { return _valore;} + const TString & totvalres() const { return _totvalres;} + const TString & totvalore() const { return _totvalore;} bool mov_mag() const { return get_bool("B1"); } bool statistiche() const { return get_bool("B2"); } bool provvigioni() const { return get_bool("B3"); } @@ -262,12 +276,14 @@ public: const char stato_mov_finale() const {return get_char("S8"); } const char stato_provvigioni() const {return get_char("S3"); } const TString & caus_mov() const {return get("S9"); } + const TString & caus_anticipo() const {return get("S10"); } const char stato_finale_inserimento() const {return get("S2")[0]; } const char stato_finale_stampa() const {return get("S2")[1]; } const TString & stati_iniziali_modifica() const {return get("S2").mid(9,20); } const TString & stati_iniziali_cancellazione() const {return get("S2").mid(29,20); } const TString & stati_iniziali_stampa() const {return get("S2").mid(49,20); } bool stato_with_mov_mag(const char stato) const; + bool scarica_residuo() const { return is_ordine() || get_bool("B4"); } TFormula_documento * first_formula() { return succ_formula(TRUE); } TFormula_documento * succ_formula(bool restart = FALSE); @@ -285,7 +301,7 @@ class TCodice_numerazione : public TRectype int _status; public: - TObject* dup() const { return new TCodice_numerazione(codice()); } + TObject* dup() const { return new TCodice_numerazione(*this); } public: int read(const char * cod); @@ -307,12 +323,14 @@ public: class TTipo_riga_documento : public TRectype // velib02 { - static TAssoc_array _formule_riga; TToken_string _formule; TString16 _name; TString16 _imponibile; TString16 _provv; + TString16 _qtares; + TString16 _rigavalore; + TString16 _rigavalres; TVariable_mask * _mask; protected: @@ -328,12 +346,15 @@ public: const TString& mask_name() const { return profile_name();} const TString& codice() const { return get("CODTAB");} bool mask_loaded() const { return _mask != NULL; } - TVariable_mask* mask(); + TVariable_mask* mask() const; const TString& descrizione() const { return get("S0"); } char tipo() const { return get_char("S7"); } const TString& imponibile() const { return _imponibile;} const TString& provv() const { return _provv;} + const TString& qtares() const { return _qtares;} + const TString& rigavalore() const { return _rigavalore;} + const TString& rigavalres() const { return _rigavalres;} TFormula_documento* first_formula() { return succ_formula(TRUE); } TFormula_documento* succ_formula(bool restart = FALSE); @@ -379,6 +400,7 @@ public: bool is_descrizione() const { return tipo().tipo() == 'D';} bool is_articolo() const; bool is_checked() const { return get_bool(RDOC_CHECKED);} + bool is_evadibile() const { return is_merce() || is_omaggio() || is_spese() || is_prestazione(); } void checked(bool on = TRUE) { put(RDOC_CHECKED, (bool)on); } void unchecked() { checked(FALSE); } // @cmember Assegna il documento corrente @@ -421,7 +443,8 @@ public: real provvigione(int ndec = AUTO_DECIMALS) const; real quantita() const { return get_real(RDOC_QTA); } - + real qtaresidua() const; + real valore(bool totale, int ndec) const; TRiga_documento(TDocumento* doc, const char* tipo = NULL); TRiga_documento(const TRiga_documento & row); @@ -487,7 +510,6 @@ class TDocumento : public TMultiple_rectype // velib03 static short _has_provv; int _liv_len[4]; - TCond_vendita * _condv; TCli_for _cli_for; TProvvigioni_agente* _provv_agente; TOccasionale _occas; @@ -500,6 +522,8 @@ protected: virtual TRectype * new_body_record(int logicnum = 0) { return new TRiga_documento(this); } TRiga_documento & row(int index); + const TRiga_documento& physical_row(int index) const; + long get_next_key(char provv, int anno, const char* codnum) const; virtual void put_str(const char* fieldname, const char* val); long renum_ndoc(long numdoc = 0); @@ -509,7 +533,7 @@ protected: void set_riga_esenzione(); int write_rewrite(TBaseisamfile & f, bool re) const; virtual TDocumento & copy(const TDocumento & d); - TObject* dup() const { return new TDocumento(*this); } + virtual TObject* dup() const { return new TDocumento(*this); } void update_tabella_iva(); void dirty_tabella_iva() { _tabella_iva.destroy();} static void test_firm(); @@ -521,11 +545,9 @@ public: void dirty_fields(); TAssoc_array & tabella_iva() { update_tabella_iva(); return _tabella_iva; } - TCond_vendita & condv() const {CHECK(_condv, "Condizioni di vendita nulle"); return *_condv;} TCli_for & clifor() const; TOccasionale & occas() const; const TAgente & agente() const; - void set_condv(TCond_vendita * condv) { _condv = condv; } virtual TDocumento & operator =(const TDocumento & d) {return copy(d);} virtual TRectype & operator =(const TRectype & r); @@ -600,6 +622,7 @@ public: real basesconto() const; real spese() const; real provvigione(int ndec = AUTO_DECIMALS) const; + real valore(bool totale, int ndec = AUTO_DECIMALS) const; TPagamento & pagamento(); @@ -609,36 +632,64 @@ public: bool is_fattura() const { return tipo_valido() && tipo().is_fattura(); } bool is_bolla() const { return tipo_valido() && tipo().is_bolla(); } bool is_ordine() const { return tipo_valido() && tipo().is_ordine(); } - + bool is_evaso() const; + TDocumento (); TDocumento (const TDocumento & d); - TDocumento(char provv, int anno, const char* codnum, long numdoc, - TCond_vendita * condv = NULL); - TDocumento(const TRectype& doc, TCond_vendita * condv = NULL); + TDocumento(char provv, int anno, const char* codnum, long numdoc); + TDocumento(const TRectype& doc); virtual ~TDocumento(); }; class TDocumento_mask : public TVariable_mask // velib06 { - int _progs_page; // pagina in cui cominciano i progressivi - int _last_prog; // numero dell'ultimo progressivo - TDocumento * _doc; // documento - TRelation * _rel; + int _progs_page; // pagina in cui cominciano i progressivi + int _last_prog; // numero dell'ultimo progressivo + TSheet_field* _sheet; // Spreadsheet + TDocumento _doc; // documento + + TCond_vendita* _condv; // condizioni di vendita + + bool _ges_mag, _ges_dep; + TString _std_mag, _std_dep; protected: virtual void next_page(int p); - void sconto_testa2mask( TCli_for & c, TConfig & ditta ); - void spese2mask(TCli_for & c); + void sconto_testa2mask(); + void spese2mask(); + + void configura_sheet(TSheet_field& sheet, TConfig& config); + static bool ss_notify(TSheet_field& ss, int r, KEY key); + static TMask* ss_getmask(int numriga, TMask& fullmask); + + static bool occas_handler( TMask_field& f, KEY key ); + static bool occas_code_handler( TMask_field& f, KEY key ); + static bool clifo_handler( TMask_field& f, KEY key ); + static bool print_handler( TMask_field& f, KEY key ); + static bool elabora_handler( TMask_field& f, KEY key ); + static bool codlist_handler( TMask_field& f, KEY key ); + static bool codcont_handler( TMask_field& f, KEY key ); + static bool codcamp_handler( TMask_field& f, KEY key ); + void user_set_handler( int fieldid, int index); public: virtual bool on_key(KEY key); - TDocumento & doc() const {CHECK(_doc, "Documento nullo"); return *_doc;} - TCond_vendita & condv() const { return doc().condv();} - void cli2mask( TCli_for & c, TOccasionale & o, TConfig & ditta); - void occ2mask(TOccasionale & o); - TDocumento_mask(const char* name, TDocumento * _doc, TRelation * rel, int num = 0, int max = MAX_PAGES); - virtual ~TDocumento_mask() {} + TDocumento& doc() { return _doc; } + const TDocumento& doc() const { return _doc; } + TCond_vendita & condv() const; + + void occ2mask(); + void cli2mask(); + void doc2mask(); + void mask2doc(); + + TSheet_field& sheet() const { return *_sheet; } + static bool num_handler( TMask_field& f, KEY key ); + static bool tip_handler( TMask_field& f, KEY key ); + + TDocumento_mask(const char* tipodoc); + virtual ~TDocumento_mask(); }; class TLista_documenti : public TObject // velib04 @@ -658,14 +709,14 @@ public: int rewrite() const { return write(TRUE); } int add(TDocumento* doc) { return _documenti.add(doc); } - int add(const TDocumento & doc) { return _documenti.add(doc); } + int add(const TDocumento& doc) { return _documenti.add(doc); } const TDocumento& operator[] (int n) const { return doc(n); } TDocumento& operator[] (int n) { return (TDocumento&)_documenti[n]; } int items() const { return _documenti.items(); } TLista_documenti() { } - virtual ~TLista_documenti() { } + virtual ~TLista_documenti() {}; }; class TLista_clifo : public TObject // velib04 @@ -738,10 +789,13 @@ enum TTipo_elaborazione {_esterna, _consegna_ordini, _fatturazione_bolle, _conta class TElaborazione : public TRectype // velib04 { + + protected: int read(const char* cod); public: + enum {_max_tipi_doc_elab = 10}; const TString& codice() const { return get("CODTAB"); } const TString& descrizione() const { return get("S0"); } const TTipo_elaborazione tipo() const { return (TTipo_elaborazione) get_int("I0"); } @@ -754,7 +808,7 @@ public: bool ignora_descrizioni() const { return get_bool("B3"); } const TString tipo_iniziale(int i) const { return get("S2").smid(i*4, 4).rtrim(); } - const char stato_iniziale(int i) const { return get("S7")[i]; } + const char stato_iniziale(int i) const { return i < 5 ? get("S7")[i] : get("S10")[i - 5]; } const TString& tipo_finale() const { return get("S8"); } const TString& stato_finale() const { return get("S9"); } @@ -770,18 +824,18 @@ public: virtual ~TElaborazione() { } }; -class TEsterna : public TElaborazione // velib04 +class TElaborazione_esterna : public TElaborazione // velib04 { public: virtual bool elabora(TLista_documenti& doc_in, TLista_documenti& doc_out, const TDate& data_elab, bool interattivo = FALSE); - TEsterna(const char* cod); - TEsterna(const TRectype& rec) : TElaborazione(rec) { } - virtual ~TEsterna() { } + TElaborazione_esterna(const char* cod); + TElaborazione_esterna(const TRectype& rec) : TElaborazione(rec) { } + virtual ~TElaborazione_esterna() { } }; -class TConsegna_ordini : public TElaborazione // velib05 +class TConsegna_ordini : public TElaborazione // velib04d { public: virtual bool elabora(TLista_documenti& doc_in, TLista_documenti& doc_out, @@ -832,6 +886,10 @@ enum error_type { write_error, scadenze_error, bank_error, + caus_ant_error, + counter_p_ant_error, + cau_abb_error, + write_part_error, generic_error }; @@ -897,6 +955,10 @@ class TContabilizzazione : public TElaborazione // velib04b protected: // Carica i parametri dalla configurazione bool load_parameters(); + // Testa il fatto che il documento sia una nota di credito/debito + bool test_swap(); + // Ritorna l'ultimo numero di registrazione disponibile dei movimenti di prima nota + error_type get_next_reg_num(long &); // Compila la testata del movimento error_type compile_head_mov(TDocumento&); // Funzione per ricercare il conto di costo/ricavo @@ -921,6 +983,20 @@ protected: error_type write_scadenze(TDocumento&); // scrive il movimento e le scadenze error_type write_all(TDocumento&); + // restituisce la sezione per sto cliente + char sezione() const; + // Cerca il conto cliente per il movimento d'anticipo + error_type search_clifo_bill(); + // Cerca il conto di contropartita per il movimento d'anticipo + error_type search_counter_bill(TString16 &); + // compila la testata del movimento di anticipo + error_type compile_head_anticipo(TDocumento&); + // compila le righe del movimento di anticipo + error_type compile_rows_anticipo(TDocumento&); + // compila e scrive il pagamento del movimento di anticipo + error_type write_pagamento_anticipo(TDocumento&); + // scrive il movimento di anticipo pagamento + error_type write_anticipo(TDocumento&); // Cambia lo stato del documento error_type change_doc_status(TDocumento&); // Visualizza l'ultimo errore rilevato @@ -1055,7 +1131,6 @@ class TDocumentoEsteso : public TDocumento int _scadenze_current; // indice per identificare l'elementi corrente sull'array (-1 se non ha ancora calcolato) public: - // Funzioni per il riepilogo IVA const bool summary_compiled() { return _sum_filter > -1; } @@ -1090,11 +1165,11 @@ public: // Funzioni per settare i parametri void set_decimals(dec_parm & parm) { _parm = parm ; } - void set_condv(TCli_for * cli); // Cambia le condizioni di vendita - TDocumentoEsteso (const TRectype & rec, dec_parm & parm, TCond_vendita * condv = NULL) ; - TDocumentoEsteso (const TRectype & rec, TCond_vendita * condv = NULL) ; +// void set_condv(TCli_for * cli); // Cambia le condizioni di vendita + TDocumentoEsteso (const TRectype & rec, dec_parm & parm) ; + TDocumentoEsteso (const TRectype & rec) ; TDocumentoEsteso () ; - ~TDocumentoEsteso(); + virtual ~TDocumentoEsteso(); }; diff --git a/ve/velib01.cpp b/ve/velib01.cpp index 947419a6a..ade366af7 100755 --- a/ve/velib01.cpp +++ b/ve/velib01.cpp @@ -5,11 +5,13 @@ HIDDEN const real CENTO(100.0); // costante per evitare la chiamata dei costrutt TSpesa_prest::TSpesa_prest(const char* codice, char tipo) : TRectype(LF_TAB) -{ - settab(tipo == RIGA_SPESEDOC ? "SPP" : "PRS"); +{ + const bool spesa = tipo == RIGA_SPESEDOC; + + settab(spesa ? "SPP" : "PRS"); if (codice && *codice) - if (read(codice) != NOERR) - yesnofatal_box("Tipo spesa assente : %s", codice); + if (read(codice) != NOERR) + error_box(spesa ? "Spesa %s assente" : "Prestazione %s assente", codice); } TSpesa_prest::TSpesa_prest(const TRectype& rec) @@ -22,7 +24,10 @@ int TSpesa_prest::read(const char* codice) zero(); TTable t(get("COD")); put("CODTAB", codice); + TRectype r(*this); int err = TRectype::read(t); + if (err != NOERR) + *this = r; return err; } diff --git a/ve/velib01a.cpp b/ve/velib01a.cpp index 2b0789894..9b681a7c4 100755 --- a/ve/velib01a.cpp +++ b/ve/velib01a.cpp @@ -111,12 +111,15 @@ bool note_hndl( TMask_field& f, KEY key ) note.put("CODTAB", cod); if (note.read() != NOERR) note.zero(); - } - const bool reg_disabled = note.get_bool("B0"); - - if (reg_disabled) - message_box("Registrazione disbilitata : %s", (const char *) note.get("S0")); - m.enable(DLG_SAVEREC, !reg_disabled); + } + if (m.doc().modificabile() || m.field(DLG_SAVEREC).enabled()) + { + const bool reg_disabled = note.get_bool("B0"); + + if (reg_disabled) + message_box("Registrazione disbilitata : %s", (const char *) note.get("S0")); + m.enable(DLG_SAVEREC, !reg_disabled); + } } return TRUE; } @@ -126,21 +129,44 @@ bool data_hndl( TMask_field& field, KEY key ) { TDocumento_mask& m = (TDocumento_mask &) field.mask( ); if (field.to_check(key)) - { - TEdit_field & e = m.efield(F_DATAINSC); - e.set_dirty(); - e.on_hit(); - } - if (key == K_ENTER && field.dirty()) - { + { + if (m.id2pos(F_DATAINSC) >= 0) + { + TEdit_field & e = m.efield(F_DATAINSC); + e.set_dirty(); + e.on_hit(); + } + + if (m.id2pos(F_DATACAMBIO1) >= 0) + m.set(F_DATACAMBIO1, field.get(), TRUE); + } + if (field.to_check(key,TRUE)) + { TLocalisamfile doc(LF_DOC); - const TDate datadoc(m.get(F_DATADOC)); + TDate datadoc(m.get(F_DATADOC)); doc.curr() = m.doc().head(); const TString16 codnum(doc.get(DOC_CODNUM)); const int anno = doc.get_int(DOC_ANNO); const char tipo_num = doc.get_char(DOC_PROVV); + + doc.read(); + if (doc.prev() == NOERR) + { + const TDate dataprev = doc.get_date(DOC_DATADOC); + if (!datadoc.ok()) + { + datadoc = dataprev; + field.set(dataprev.string()); + } + if (codnum == doc.get(DOC_CODNUM) && + anno == doc.get_int(DOC_ANNO) && + tipo_num == doc.get_char(DOC_PROVV) && + datadoc < dataprev) + return field.error_box("Data documento inferiore alla data del documento precedente"); + } + doc.curr() = m.doc().head(); if (doc.read(_isgreat) == NOERR && codnum == doc.get(DOC_CODNUM) && anno == doc.get_int(DOC_ANNO) && @@ -148,14 +174,6 @@ bool data_hndl( TMask_field& field, KEY key ) datadoc > doc.get_date(DOC_DATADOC)) return field.error_box("Data documento superiore alla data del documento successivo"); - doc.curr() = m.doc().head(); - doc.read(); - if (doc.prev() == NOERR && - codnum == doc.get(DOC_CODNUM) && - anno == doc.get_int(DOC_ANNO) && - tipo_num == doc.get_char(DOC_PROVV) && - datadoc < doc.get_date(DOC_DATADOC)) - return field.error_box("Data documento inferiore alla data del documento precedente"); } return TRUE; } @@ -279,8 +297,9 @@ bool codart_handler( TMask_field& f, KEY key ) TLocalisamfile & anamag = ((TEdit_field &) f).browse()->cursor()->file(); TLocalisamfile & umart = ((TEdit_field &) row_mask.field(FR_UMQTA)).browse()->cursor()->file(); - condv.set_anamag(anamag); - condv.set_umart(umart); +// condv.set_anamag(anamag); +// condv.set_umart(umart); + TString80 codart(f.get()); anamag.setkey(1); anamag.put(ANAMAG_CODART, codart); @@ -408,10 +427,10 @@ bool umart_handler( TMask_field& f, KEY key ) TLocalisamfile & umart = ((TEdit_field &) f).browse()->cursor()->file(); TCond_vendita & condv = mask.condv(); - condv.set_testa(&mask); - condv.set_riga(&row_mask); - condv.set_anamag(anamag); - condv.set_umart(umart); +// condv.set_testa(&mask); +// condv.set_riga(&row_mask); +// condv.set_anamag(anamag); +// condv.set_umart(umart); const TString16 um(f.get()); real fc(1.0); @@ -478,15 +497,55 @@ bool qta_handler( TMask_field& f, KEY key ) { TMask& row_mask = f.mask( ); TDocumento_mask & mask = (TDocumento_mask &) row_mask.get_sheet()->mask(); - TLocalisamfile & anamag = ((TEdit_field &) row_mask.field(FR_CODART)).browse()->cursor()->file(); - TLocalisamfile & umart = ((TEdit_field &) row_mask.field(FR_UMQTA)).browse()->cursor()->file(); +// TLocalisamfile & anamag = ((TEdit_field &) row_mask.field(FR_CODART)).browse()->cursor()->file(); +// TLocalisamfile & umart = ((TEdit_field &) row_mask.field(FR_UMQTA)).browse()->cursor()->file(); TCond_vendita & condv = mask.condv(); - condv.set_testa(&mask); - condv.set_riga(&row_mask); - condv.set_anamag(anamag); - condv.set_umart(umart); +// condv.set_testa(&mask); +// condv.set_riga(&row_mask); +// condv.set_anamag(anamag); +// condv.set_umart(umart); condv.ricerca(FALSE, TRUE); + return qta_handler(f, key); + } + return TRUE; +} + +bool qta_handler( TMask_field& f, KEY key ) +{ + // Se qualcuno cerca di modificare la maschera + if ( key == K_TAB && f.focusdirty()) + { + TMask& row_mask = f.mask( ); + const real qta_evasa = row_mask.get_real(FR_QTAEVASA); + const real qta(f.get()); + + if (qta_evasa > 0 && qta_evasa >= qta) + { + row_mask.set(FR_RIGAEVASA, "X"); + row_mask.disable(FR_RIGAEVASA); + } + else + row_mask.enable(FR_RIGAEVASA); + } + return TRUE; +} + +bool qta_evasa_handler( TMask_field& f, KEY key ) +{ + if (f.to_check(key)) + { + TMask& row_mask = f.mask( ); + const real qta_evasa(f.get()); + const real qta = row_mask.get_real(FR_QTA); + + if (qta_evasa > 0 && qta_evasa >= qta) + { + row_mask.set(FR_RIGAEVASA, "X"); + row_mask.disable(FR_RIGAEVASA); + } + else + row_mask.enable(FR_RIGAEVASA); } return TRUE; } @@ -615,19 +674,25 @@ int TExpr_documento::parse_user_func(const char * name, int nparms) const if (strcmp(name, "PROVV") == 0) return nparms < 2 ? _provv : -1; else - if (strcmp(name, "TIPO") == 0) - return nparms == 0 ? _tipo : -1; - else - if (strcmp(name, "IMPONIBILI") == 0) - return nparms < 3 ? _imponibili : -1; - else - if (strcmp(name, "IMPOSTE") == 0) - return nparms < 3 ? _imposte : -1; + if (strcmp(name, "QTARES") == 0) + return nparms < 2 ? _qtares : -1; + else + if (strcmp(name, "VALDOC") == 0) + return nparms < 3 ? _valdoc : -1; + else + if (strcmp(name, "TIPO") == 0) + return nparms == 0 ? _tipo : -1; else - if (strcmp(name, "TOTPROVV") == 0) - return nparms < 3 ? _totprovv : -1; - else - return -1; + if (strcmp(name, "IMPONIBILI") == 0) + return nparms < 3 ? _imponibili : -1; + else + if (strcmp(name, "IMPOSTE") == 0) + return nparms < 3 ? _imposte : -1; + else + if (strcmp(name, "TOTPROVV") == 0) + return nparms < 3 ? _totprovv : -1; + else + return -1; } void TExpr_documento::evaluate_user_func(int index, int nparms, TEval_stack & stack, TTypeexp type) const @@ -648,7 +713,7 @@ void TExpr_documento::evaluate_user_func(int index, int nparms, TEval_stack & st const int nvars = expr.numvar(); const int nrows = _doc->rows(); - for (int i = nrows; i > 0 ; i--) + for (int i = nrows; i > 0; i--) { TRiga_documento & riga = (TRiga_documento &) (*_doc)[i]; @@ -668,7 +733,7 @@ void TExpr_documento::evaluate_user_func(int index, int nparms, TEval_stack & st expr.setvar(j, f.read(riga)); } expr.set_row(&riga); - somma += (const real&)expr; + somma += expr.as_real(); } } } @@ -835,6 +900,42 @@ void TExpr_documento::evaluate_user_func(int index, int nparms, TEval_stack & st val = ZERO; } break; + case _qtares: + { + int ndec = AUTO_DECIMALS; + + if (nparms > 0) + ndec = (int) stack.peek_real().integer(); + else + stack.push(ZERO); + real & val = stack.peek_real(); + + if (_row) + val = _row->qtaresidua(); + else + val = ZERO; + } + break; + case _valdoc: + { + int ndec = AUTO_DECIMALS; + bool totale = TRUE; // Totale o residuo per documento + + if (nparms > 1) + ndec = (int)stack.pop_real().integer(); + if (nparms > 0) + totale = !stack.peek_real().is_zero(); + else + stack.push(ZERO); + + real & r = stack.peek_real(); + + if (_doc) + r = _doc->valore(totale, ndec); + else + r = ZERO; + } + break; case _tipo: { TString s; diff --git a/ve/velib02.cpp b/ve/velib02.cpp index 6d3783815..18df636b2 100755 --- a/ve/velib02.cpp +++ b/ve/velib02.cpp @@ -6,6 +6,11 @@ #include "verig.h" #include "sconti.h" +#endif + +#ifndef __RDOC_H +#include "rdoc.h" +#endif /////////////////////////////////////////////////////////// // Tipo riga di un documento @@ -72,6 +77,36 @@ void TTipo_riga_documento::read_formule() _formule.add(_imponibile); _provv = profile.get("PROVV", "MAIN"); + + _qtares = profile.get("QTARES", "MAIN"); + if (_qtares.empty()) + _qtares = "QTARES"; + + frr.put("CODTAB", _qtares); + if (frr.read() != NOERR) + _formule_riga.add(_qtares, new TFormula_documento(_riga, _qtares, "QTARES()"), TRUE); + if (_formule.find(_qtares) < 0) + _formule.add(_qtares); + + _rigavalres = profile.get("RIGAVALRES", "MAIN"); + if (_rigavalres.empty()) + _rigavalres = "RIGAVALRES"; + + _rigavalore = profile.get("RIGAVALORE", "MAIN"); + if (_rigavalore.empty()) + _rigavalore = "RIGAVALORE"; + + frr.put("CODTAB", _rigavalres); + if (frr.read() != NOERR) + _formule_riga.add(_rigavalres, new TFormula_documento(_riga, _rigavalres, "QTARES()*PREZZO(1,0)"), TRUE); + if (_formule.find(_rigavalres) < 0) + _formule.add(_rigavalres); + + frr.put("CODTAB", _rigavalore); + if (frr.read() != NOERR) + _formule_riga.add(_rigavalore, new TFormula_documento(_riga, _rigavalore, "QTA*PREZZO(1,0)"), TRUE); + if (_formule.find(_rigavalore) < 0) + _formule.add(_rigavalore); } TFormula_documento * TTipo_riga_documento::succ_formula(bool restart) @@ -100,14 +135,15 @@ TFormula_documento * TTipo_riga_documento::succ_formula(bool restart) return NULL; } -TVariable_mask * TTipo_riga_documento::mask() +TVariable_mask * TTipo_riga_documento::mask() const { if (mask_loaded()) return _mask; - _mask = new TVariable_mask(mask_name()); - TFilename proname(profile_name()); - proname.ext( "ini" ); + ((TTipo_riga_documento*)this)->_mask = new TVariable_mask(mask_name()); + + TFilename proname(profile_name()); + proname.ext("ini"); TConfig pro( proname ); int numhandler = pro.get_int( "NHANDLER", "HANDLERS" ); @@ -197,7 +233,7 @@ TRiga_documento::TRiga_documento(const TRiga_documento& rec, TDocumento* doc, const TTipo_riga_documento& TRiga_documento::tipo() const { - const TString16 tiporig(get("TIPORIGA")); + const TString16 tiporig(get(RDOC_TIPORIGA)); CHECK(tiporig.not_empty(), "Tipo riga documento nullo"); TTipo_riga_documento* o = (TTipo_riga_documento*)_tipi.objptr(tiporig); if (o == NULL) @@ -352,7 +388,7 @@ TRiga_documento& TRiga_documento::operator +=(const TRiga_documento& r) void TRiga_documento::set_fields(TAuto_variable_rectype & rec) { - if (get("TIPORIGA").not_empty()) + if (get(RDOC_TIPORIGA).not_empty()) { TTipo_riga_documento & tipo_riga = (TTipo_riga_documento &) tipo(); @@ -429,8 +465,8 @@ real TRiga_documento::importo(bool scontato, bool lordo, int ndec) const break; case RIGA_SCONTI: { - TCond_vendita cv ; cv.set_sconto(get("SCONTO")); - + TCond_vendita cv(NULL, NULL); + cv.set_sconto(get("SCONTO")); if (cv.get_sconto().not_empty()) c = _scontoperc; else @@ -522,6 +558,34 @@ real TRiga_documento::provvigione(int ndec) const return val; } +real TRiga_documento::qtaresidua() const +{ + real val; + + if (!get_bool(RDOC_RIGAEVASA)) + { + val = get_real(RDOC_QTA) - get_real(RDOC_QTAEVASA); + if (val < ZERO) + val = ZERO; + } + return val; +} + +real TRiga_documento::valore(bool totale, int ndec) const +{ + real val; + + if (ndec == AUTO_DECIMALS) + ndec = doc().in_valuta() ? 3 : 0; + + const TString16 field(totale ? tipo().rigavalore() : tipo().rigavalres()); + + if (field.not_empty()) + val = get_real(field); + val.round(ndec); + return val; +} + void TRiga_documento::dirty_fields(bool dirty_document) { for (TDocumento_variable_field * f = (TDocumento_variable_field *) first_variable_field(); @@ -552,7 +616,6 @@ void TRiga_documento::put_str(const char* fieldname, const char* val) if (strcmp(fieldname, RDOC_TIPORIGA) == 0) { const TString16 v(val); - if (TRectype::get(RDOC_TIPORIGA) != v) { TAuto_variable_rectype::put_str(fieldname, v); @@ -567,7 +630,7 @@ void TRiga_documento::put_str(const char* fieldname, const char* val) TAuto_variable_rectype::put_str(fieldname, val); dirty_fields(); } -} +} bool TRiga_documento::is_articolo() const { @@ -577,7 +640,7 @@ bool TRiga_documento::is_articolo() const void TRiga_documento::zero(const char * fieldname) { - if (strcmp(fieldname, "TIPORIGA") == 0) + if (strcmp(fieldname, RDOC_TIPORIGA) == 0) reset_fields(*this); TAuto_variable_rectype::zero(fieldname); dirty_fields(); @@ -654,6 +717,11 @@ void TRiga_documento::autosave(TSheet_field & f) put( "CODMAGC", codmagc); put( "CODARTMAG", row.get( f.cid2index(FR_CODARTMAG )) ); put( "CHECKED", row.get( f.cid2index(FR_CHECKED )) ); + put( RDOC_QTAGG1, row.get( f.cid2index(FR_QTAGG1 )) ); + put( RDOC_QTAGG2, row.get( f.cid2index(FR_QTAGG2 )) ); + put( RDOC_QTAGG3, row.get( f.cid2index(FR_QTAGG3 )) ); + put( RDOC_QTAGG4, row.get( f.cid2index(FR_QTAGG4 )) ); + put( RDOC_QTAGG5, row.get( f.cid2index(FR_QTAGG5 )) ); } } @@ -702,8 +770,8 @@ void TRiga_documento::autoload(TSheet_field & f) row.add(s, f.cid2index(FR_DESCR )); row.add( get( "UMQTA" ), f.cid2index(FR_UMQTA )); row.add( get( "PREZZO" ), f.cid2index(FR_PREZZO )); - TMask * m = ((TTipo_riga_documento &)tipo()).mask(); - const int pos = m->id2pos(FR_QTA); +// TMask * m = ((TTipo_riga_documento &)tipo()).mask(); +// const int pos = m->id2pos(FR_QTA); row.add( get( "QTA" ), f.cid2index(FR_QTA )); row.add( get( "QTAEVASA" ), f.cid2index(FR_QTAEVASA )); row.add( get( "RIGAEVASA" ), f.cid2index(FR_RIGAEVASA )); @@ -723,5 +791,10 @@ void TRiga_documento::autoload(TSheet_field & f) row.add( codmagc.mid(3), f.cid2index(FR_CODDEPC )); row.add( get( "CODARTMAG" ), f.cid2index(FR_CODARTMAG)); row.add( get( "CHECKED" ), f.cid2index(FR_CHECKED)); + row.add( get( RDOC_QTAGG1), f.cid2index(FR_QTAGG1)); + row.add( get( RDOC_QTAGG2), f.cid2index(FR_QTAGG2)); + row.add( get( RDOC_QTAGG3), f.cid2index(FR_QTAGG3)); + row.add( get( RDOC_QTAGG4) , f.cid2index(FR_QTAGG4)); + row.add( get( RDOC_QTAGG5) , f.cid2index(FR_QTAGG5)); } diff --git a/ve/velib03.cpp b/ve/velib03.cpp index c94a135b8..3004d44c1 100755 --- a/ve/velib03.cpp +++ b/ve/velib03.cpp @@ -1,32 +1,23 @@ -#include -#include +#include #include -//#include +#include +#include +#include #include "velib.h" #include "vepriv.h" #include -#ifndef __VEUML_H #include "veuml.h" -#endif - -#ifndef __VEINI_H #include "veini.h" -#endif -#ifndef __MGLIB_H #include "../mg/mglib.h" -#endif #ifndef __SCONTI_H #include "sconti.h" #endif -#ifndef __MODAUT_H -#include -#endif #ifndef __SVLIB01_H #include "../sv/svlib01.h" @@ -36,11 +27,16 @@ #include "../cg/cglib01.h" #endif +#ifndef __CG2103_H +#include "../cg/cg2103.h" +#endif + #ifndef __PRLIB_H #include "../pr/prlib.h" #endif #include "../mg/movmag.h" + /////////////////////////////////////////////////////////// // Movimento di magazzino /////////////////////////////////////////////////////////// @@ -79,7 +75,7 @@ const char * TMov_mag_doc::codmag_rauto(int r) const TAssoc_array TTipo_documento::_formule_documento; TTipo_documento::TTipo_documento(const char* tipodoc) - : TRectype(LF_TABCOM) + : TRectype(LF_TABCOM), _profile(NULL) { settab("TIP"); if (tipodoc && *tipodoc) @@ -87,13 +83,16 @@ TTipo_documento::TTipo_documento(const char* tipodoc) } TTipo_documento::TTipo_documento(const TRectype& rec) - : TRectype(rec) + : TRectype(rec), _profile(NULL) { read_formule(); } TTipo_documento::~TTipo_documento() -{ } +{ + if (_profile) + delete _profile; +} int TTipo_documento::read(const char* tipodoc) { @@ -108,18 +107,24 @@ int TTipo_documento::read(const char* tipodoc) return err; } -void TTipo_documento::read_formule() +TConfig& TTipo_documento::profile() const +{ + if (_profile == NULL) + { + TFilename pn = profile_name(); + pn.ext("ini"); + ((TTipo_documento*)this)->_profile = new TConfig(pn); + } + return *_profile; +} +void TTipo_documento::read_formule() { - TFilename prof(profile_name()); + TConfig& prof = profile(); - prof.ext("ini"); - - TConfig profile(prof); - - _formule = profile.get("CAMPICALC", "MAIN"); - _formule.add(profile.get("CALCOLI", "MAIN")); - _totale = profile.get("TOTALE", "MAIN"); + _formule = prof.get("CAMPICALC", "MAIN"); + _formule.add(prof.get("CALCOLI", "MAIN")); + _totale = prof.get("TOTALE", "MAIN"); if (_totale.empty()) _totale = "TOTDOC"; @@ -133,7 +138,7 @@ void TTipo_documento::read_formule() _totale_netto = "_"; _totale_netto << _totale; - _basesconto = profile.get("BASESCONTO", "MAIN"); + _basesconto = prof.get("BASESCONTO", "MAIN"); if (_basesconto.empty()) _basesconto = "BASESCONTO"; @@ -143,7 +148,7 @@ void TTipo_documento::read_formule() if (_formule.find(_basesconto) < 0) _formule.add(_basesconto); - _spese = profile.get("SPESE", "MAIN"); + _spese = prof.get("SPESE", "MAIN"); if (_spese.empty()) _spese = "SPESE"; @@ -152,9 +157,30 @@ void TTipo_documento::read_formule() _formule_documento.add(_spese, new TFormula_documento(_documento, _spese, "SOMMA(\"IMPONIBILE()\", \"TIPO() == 'S'\")"), TRUE); if (_formule.find(_spese) < 0) _formule.add(_spese); + + _totvalres = prof.get("TOTVALRES", "MAIN"); + if (_totvalres.empty()) + _totvalres = "TOTVALRES"; + + _totvalore = prof.get("TOTVALORE", "MAIN"); + if (_totvalore.empty()) + _totvalore = "TOTVALORE"; + + frd.put("CODTAB", _totvalres); + if (frd.read() != NOERR) + _formule_documento.add(_totvalres, new TFormula_documento(_documento, _totvalres, "VALDOC(0)"), TRUE); + if (_formule.find(_totvalres) < 0) + _formule.add(_totvalres); + + frd.put("CODTAB", _totvalore); + if (frd.read() != NOERR) + _formule_documento.add(_totvalore, new TFormula_documento(_documento, _totvalore, "VALDOC(1)"), TRUE); + if (_formule.find(_totvalore) < 0) + _formule.add(_totvalore); + if (provvigioni()) { - TString80 campo(profile.get("TOTPROVV", "MAIN")); + TString80 campo(prof.get("TOTPROVV", "MAIN")); if (campo.empty()) campo = "TOTPROVV"; @@ -277,8 +303,8 @@ short TDocumento::_has_stat_ven = 3; short TDocumento::_has_provv = 3; TDocumento::TDocumento() - : TMultiple_rectype(LF_DOC), _condv(NULL), - _sconto(NULL), _esenzione(NULL), _stato_originale(' ') + : TMultiple_rectype(LF_DOC), _sconto(NULL), + _esenzione(NULL), _stato_originale(' ') { add_file(LF_RIGHEDOC, "NRIGA"); _tipocf = new TRecfield(*this, "TIPOCF"); @@ -289,11 +315,11 @@ TDocumento::TDocumento() for (int i = 3 ; i >= 0; i--) _liv_len[i] = 0; check_modules(); - } +} TDocumento::TDocumento(const TDocumento & d) - : TMultiple_rectype(LF_DOC), _condv(NULL), - _sconto(NULL), _esenzione(NULL), _stato_originale(' ') + : TMultiple_rectype(LF_DOC), _sconto(NULL), + _esenzione(NULL), _stato_originale(' ') { add_file(LF_RIGHEDOC, "NRIGA"); _tipocf = new TRecfield(*this, "TIPOCF"); @@ -305,9 +331,8 @@ TDocumento::TDocumento(const TDocumento & d) copy(d); } -TDocumento::TDocumento(char provv, int anno, const char* codnum, long numdoc, - TCond_vendita * condv) - : TMultiple_rectype(LF_DOC), _condv(condv), _sconto(NULL), +TDocumento::TDocumento(char provv, int anno, const char* codnum, long numdoc) + : TMultiple_rectype(LF_DOC), _sconto(NULL), _esenzione(NULL), _stato_originale(' ') { add_file(LF_RIGHEDOC, "NRIGA"); @@ -328,8 +353,8 @@ TDocumento::TDocumento(char provv, int anno, const char* codnum, long numdoc, _liv_len[i] = 0; } -TDocumento::TDocumento(const TRectype& rec, TCond_vendita * condv) - : TMultiple_rectype(LF_DOC), _condv(condv), _sconto(NULL), _provv_agente(NULL), +TDocumento::TDocumento(const TRectype& rec) + : TMultiple_rectype(LF_DOC), _sconto(NULL), _provv_agente(NULL), _esenzione(NULL), _stato_originale(' ') { add_file(LF_RIGHEDOC, "NRIGA"); @@ -366,9 +391,9 @@ void TDocumento::check_modules() { if (_has_mag == 3) { - _has_mag = main_app().has_module(MGAUT, CHK_DONGLE); - _has_stat_ven = main_app().has_module(SVAUT, CHK_DONGLE); - _has_provv = main_app().has_module(PRAUT, CHK_DONGLE); + _has_mag = dongle().active(MGAUT); + _has_stat_ven = dongle().active(SVAUT); + _has_provv = dongle().active(PRAUT); } } @@ -440,7 +465,6 @@ real TDocumento::bolli(real & imp, int ndec, TTipo_importo t) const static TArray imp_bolli; static int nscagl; TLocalisamfile clifo(LF_CLIFO); - short estero = 2; if (get_bool("ADDBOLLI")) @@ -663,6 +687,19 @@ int TDocumento::read(TBaseisamfile& f, word op, word lockop) if (is_fattura()) 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) { TString80 key(get(DOC_PROVV)); key << get(DOC_ANNO); key << get(DOC_CODNUM); key << get(DOC_NDOC); @@ -723,12 +760,31 @@ void TDocumento::set_riga_sconto() { if (_sconto == NULL) { - static TString _tipo_riga_sc; + static TString16 _tipo_riga_sc; if (_tipo_riga_sc.empty()) { TConfig conf(CONFIG_STUDIO); - _tipo_riga_sc = conf.get("TRSCONTI", "ve"); + // Se non esiste il tipo riga lo cerca, lo setta di default ed avvisa + if (_tipo_riga_sc.empty()) + { + TTable tri("%TRI"); + for (tri.first(); tri.good(); tri.next()) + { + if (tri.get("S7") == "C") + { + _tipo_riga_sc = tri.get("CODTAB"); // Prende il primo tipo SCONTO che trova... + break; + } + } + if (_tipo_riga_sc.not_empty()) + { + conf.set("TRSCONTI", _tipo_riga_sc, "ve"); + warning_box("Il tipo riga sconti di testa non risultava impostato.\n L'applicazione usera' automaticamente il tipo %s", (const char*) _tipo_riga_sc); + } + else + error_box("Il tipo riga sconti di testa non risulta impostato.\nImpossibile reperire un tipo riga di default. \nVerificare la correttezza dei tipi riga."); + } } _sconto = new TRiga_documento(this, _tipo_riga_sc); _sconto->put("DESCR","Sconto"); @@ -766,19 +822,18 @@ void TDocumento::set_riga_esenzione() } else { - static TString _tipo_riga_es; + static TString16 _tipo_riga_es; static real _bollo_es; if (_tipo_riga_es.empty()) { - TConfig conf(CONFIG_STUDIO); - + TConfig conf(CONFIG_STUDIO); _tipo_riga_es = conf.get("TRESENZ", "ve"); _bollo_es = (real)conf.get("BOLLIES", "ve"); + CHECK(_tipo_riga_es.not_empty(), "Manca TRESENZ nel PRASSIS.INI"); } if (_esenzione == NULL) _esenzione = new TRiga_documento(this, _tipo_riga_es); - TString d(256); - d = "Fattura non imponibile come da vostra dichiarazion"; + TString d(256); d.format("Fattura non imponibile come da vostra dichiarazione"); _esenzione->put( "DESCR", d); @@ -800,8 +855,7 @@ void TDocumento::dirty_fields() dirty_tabella_iva(); for (int i = loaded_rows(); i > 0; i--) { - TRiga_documento & r = (TRiga_documento &) row(i); - + TRiga_documento & r = (TRiga_documento &) row(i); if (r.doc_dependent()) r.dirty_fields(FALSE); } @@ -821,12 +875,12 @@ int TDocumento::write_rewrite(TBaseisamfile & f, bool re) const else { if (_stato_originale == stato()) - if (!modificabile() && !yesno_box("Documento non modificabile,\n vuoi continuare ugualmente")) + if (!modificabile() && !yesno_box("Documento non modificabile,\nSi desidera continuare ugualmente")) return NOERR; myself._stato_originale = stato(); } - const bool check_movmag = main_app().has_module(MGAUT, CHK_DONGLE) && tipo().mov_mag(); + const bool check_movmag = dongle().active(MGAUT) && tipo().mov_mag(); const char stato_doc(stato()); const bool do_movmag = tipo().stato_with_mov_mag(stato_doc); @@ -868,7 +922,9 @@ int TDocumento::write_rewrite(TBaseisamfile & f, bool re) const myself.put("MOVMAG", num); } if (num > 0) - { + { + const bool scarica_residuo = tipo().scarica_residuo(); + mov.put(MOVMAG_NUMREG, num); while (mov.read(m, _isequal, _testandlock) == _islocked) message_box("Movimento di magazzino in uso da parte di un'altro utente"); @@ -938,7 +994,9 @@ int TDocumento::write_rewrite(TBaseisamfile & f, bool re) const r.put("MOVMAG", r_num); } - if (r_num == num) + const real qta = scarica_residuo ? r.qtaresidua(): r.quantita(); + + if (r_num == num && qta != ZERO) { TRectype & rm = mov.insert_row(j++); @@ -946,7 +1004,8 @@ int TDocumento::write_rewrite(TBaseisamfile & f, bool re) const rm.put(RMOVMAG_CODART, r.get("CODARTMAG")); rm.put(RMOVMAG_LIVGIAC, r.get("LIVELLO")); rm.put(RMOVMAG_UM, r.get("UMQTA")); - rm.put(RMOVMAG_QUANT, r.get("QTA")); + + rm.put(RMOVMAG_QUANT, qta); rm.put(RMOVMAG_PREZZO, r.get("PREZZO")); rm.put(RMOVMAG_CODCAUS, r.get("CAUSMAG")); rm.put(RMOVMAG_TIPORIGA, (char) riga_dadocumento); @@ -974,6 +1033,9 @@ int TDocumento::write_rewrite(TBaseisamfile & f, bool re) const TLocalisamfile anamag(LF_ANAMAG); TLocalisamfile codalt(LF_CODCORR); codalt.setkey(2); + bool docevaso = TRUE; + TDate datacons(get_date(DOC_DATACONS)); + for (int i = rows; i > 0; i--) { TRiga_documento & r = myself.row(i); @@ -991,8 +1053,17 @@ int TDocumento::write_rewrite(TBaseisamfile & f, bool re) const } r.checked(); } + if (is_ordine() && r.is_evadibile()) + { + docevaso &= r.get_bool(RDOC_RIGAEVASA); + const TDate dcons = r.get(RDOC_DATACONS); + if (!dcons.ok()) + r.put(RDOC_DATACONS, datacons); + } } - } + if (is_ordine()) + ((TDocumento *)this)->put(DOC_DOCEVASO, docevaso); // Tutte le righe evase -> doc evaso + } // Almeno una riga aperta -> doc aperto err = TMultiple_rectype::write_rewrite(f, re); @@ -1032,7 +1103,7 @@ int TDocumento::remove(TBaseisamfile& f) const { if (!cancellabile() && !yesno_box("Documento non cancellabile,\n vuoi continuare ugualmente")) return NOERR; - const bool check_movmag = main_app().has_module(MGAUT, CHK_DONGLE) && tipo().mov_mag(); + const bool check_movmag = dongle().active(MGAUT) && tipo().mov_mag(); if (check_movmag) { @@ -1087,8 +1158,10 @@ TProvvigioni_agente& TDocumento::calc_provvigioni(const bool generata) if (!yesno_box("Dati agente %s in uso da un altro utente. Riprovo?", (const char*) agente)) return *_provv_agente; - const real perc = _provv_agente->perc_fatt(); - const real tot_provv = provvigione(); + const real perc = _provv_agente->perc_fatt(); + real tot_doc(totale_doc()); + real tot_netto(totale_netto()); + real tot_provv = provvigione(); real provv_fat = (tot_provv / 100.0) * perc; // Provvigione sul fatturato (rata 0) provv_fat.round(); real provv_pag = tot_provv - provv_fat; // Provvigione sul pagato (da suddivere secondo il pagamento) @@ -1099,8 +1172,30 @@ TProvvigioni_agente& TDocumento::calc_provvigioni(const bool generata) TPagamento* pag2 = new TPagamento(pag1.code(), datadoc.string()); // Per rate documento real totspese = spese(); real totimposte = imposta(); - real totimponibili = totale_doc() - totimposte - totspese; + real totimponibili = tot_doc - totimposte - totspese; const bool valuta = in_valuta(); + + const TString16 codcaus(tipo().causale()); + if (codcaus.not_empty()) + { + TLocalisamfile caus(LF_CAUSALI); + TLocalisamfile rcaus(LF_RCAUSALI); + TCausale c(codcaus, datadoc.year()); + const char sez = c.sezione_clifo(); + const bool swap = (c.reg().iva() == iva_vendite) ^ sez == 'D'; + if (swap) + { + tot_doc = -tot_doc; + tot_netto = -tot_netto; + tot_provv = -tot_provv; + provv_fat = -provv_fat; + provv_pag = -provv_pag; + totspese = -totspese; + totimposte = -totimposte; + totimponibili = -totimponibili; + } + } + if (valuta) { real val1 = totimponibili * change; @@ -1124,8 +1219,8 @@ TProvvigioni_agente& TDocumento::calc_provvigioni(const bool generata) TToken_string t; t.add(anno); t.add(codnum);t.add(ndoc); - t.add(datadoc.string()); t.add(totale_doc().string()); - t.add(tot_provv.string());t.add(totale_netto().string()); + t.add(datadoc.string()); t.add(tot_doc.string()); + t.add(tot_provv.string());t.add(tot_netto.string()); t.add(codcf()); t.add(TDocumento::valuta());t.add(change.string()); t.add(get(DOC_DATACAMBIO)); @@ -1186,28 +1281,31 @@ TRiga_documento & TDocumento::row(int index) return *r; } +const TRiga_documento& TDocumento::physical_row(int index) const +{ + TRecord_array & b = body(); + return (TRiga_documento&)b.row(index, FALSE); +} + long TDocumento::get_next_key(char provv, int anno, const char* codnum) const { - static long n = 0; + long n = 0; - if (n == 0) + TLocalisamfile doc(LF_DOC); + TRectype& curr = doc.curr(); + set_key(curr, provv, anno, codnum, 9999999L); + + const int err = doc.read(_isgreat); + + if (err != _isemptyfile) { - TLocalisamfile doc(LF_DOC); - TRectype& curr = doc.curr(); - set_key(curr, provv, anno, codnum, 9999999L); - - const int err = doc.read(_isgreat); - - if (err != _isemptyfile) - { - if (err == NOERR) - doc.prev(); - if (curr.get_char("PROVV") == provv && - curr.get_int("ANNO") == anno && - curr.get("CODNUM") == codnum) - n = curr.get_long("NDOC"); - } - } + if (err == NOERR) + doc.prev(); + if (curr.get_char("PROVV") == provv && + curr.get_int("ANNO") == anno && + curr.get("CODNUM") == codnum) + n = curr.get_long("NDOC"); + } n++; return n; @@ -1557,6 +1655,19 @@ real TDocumento::provvigione(int ndec) const return val; } +real TDocumento::valore(bool totale, int ndec) const +{ + real val; + + for (int i=rows(); i>0; i--) + { + TRiga_documento &r = ((TRiga_documento &) ((TDocumento *)this)->row(i)); + if (r.is_merce() || r.is_spese() || r.is_prestazione()) + val += r.valore(totale, ndec); + } + return val; +} + void TDocumento::put_str(const char* fieldname, const char* val) { if (strcmp(fieldname, "TIPODOC") == 0) @@ -1646,7 +1757,7 @@ TDocumento & TDocumento::copy(const TDocumento & d) set_riga_sconto(); if (is_fattura()) set_riga_esenzione(); - set_condv(d._condv); +// set_condv(d._condv); return *this; } @@ -1752,3 +1863,14 @@ void TDocumento::update_spese_aut(TString_array & spese_aut, bool preserve_old, put("SPESEUPD", TRUE); } +bool TDocumento::is_evaso() const +{ + bool ok = is_ordine() || is_generic(); + for (int r = 1; ok && r <= physical_rows(); r++) + { + const TRiga_documento& riga = physical_row(r); + if (riga.is_evadibile()) + ok = riga.get_bool(RDOC_RIGAEVASA); + } + return ok; +} diff --git a/ve/velib04.cpp b/ve/velib04.cpp index 9915299a4..36efb8d84 100755 --- a/ve/velib04.cpp +++ b/ve/velib04.cpp @@ -9,6 +9,8 @@ #include #endif + + /////////////////////////////////////////////////////////// // Lista di documenti /////////////////////////////////////////////////////////// @@ -294,15 +296,15 @@ int TElaborazione::read(const char* cod) } /////////////////////////////////////////////////////////// -// TEsterna +// TElaborazione_esterna /////////////////////////////////////////////////////////// -TEsterna::TEsterna(const char* cod) - : TElaborazione(cod) +TElaborazione_esterna::TElaborazione_esterna(const char* cod) + : TElaborazione(cod) { } -bool TEsterna::elabora(TLista_documenti& doc_in, TLista_documenti& doc_out, +bool TElaborazione_esterna::elabora(TLista_documenti& doc_in, TLista_documenti& doc_out, const TDate& data_elab, bool interattivo) { CHECK(doc_in.items() == 1, "Si deve specificare uno e un solo documento in entrata"); @@ -386,39 +388,25 @@ bool TEsterna::elabora(TLista_documenti& doc_in, TLista_documenti& doc_out, return TRUE; } -/////////////////////////////////////////////////////////// -// TConsegna ordini -/////////////////////////////////////////////////////////// - -TConsegna_ordini::TConsegna_ordini(const char* cod) - : TElaborazione(cod) -{ -} - -bool TConsegna_ordini::elabora(TLista_documenti& doc_in, TLista_documenti& doc_out, - const TDate& data_elab, bool interattivo) -{ - return TRUE; -} - /////////////////////////////////////////////////////////// // TCopia_documento /////////////////////////////////////////////////////////// TCopia_documento::TCopia_documento(const char* cod) - : TElaborazione(cod) + : TElaborazione(cod) { } bool TCopia_documento::elabora(TLista_documenti& doc_in, TLista_documenti& doc_out, const TDate& data_elab, bool interattivo) { - 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"); - TDocumento & doc_src = doc_in[0]; - TDocumento & doc_dest = doc_out[0]; - - doc_dest.copy_contents(doc_src); + CHECK(doc_in.items() == doc_out.items(), "Si deve specificare un numero uguale di documenti in entrata ed in uscita"); + for (int d = 0; d < doc_in.items(); d++) + { + TDocumento & doc_src = doc_in[d]; + TDocumento & doc_dest = doc_out[d]; + doc_dest.copy_contents(doc_src); + } return TRUE; } @@ -440,7 +428,7 @@ void TLista_elaborazioni::read() switch (eld.curr().get_int("I0")) { case _esterna : - el = new TEsterna(eld.curr()); + el = new TElaborazione_esterna(eld.curr()); break; case _consegna_ordini: el = new TConsegna_ordini(eld.curr()); @@ -475,7 +463,7 @@ int TLista_elaborazioni::select(TString_array & result, const char * tipo_inizia bool ok = FALSE; TString ti; if ((tipo_iniziale && *tipo_iniziale) && (stato_iniziale && *stato_iniziale)) - for (int i = 0; !ok && i < 5; i++) + for (int i = 0; !ok && i < TElaborazione::_max_tipi_doc_elab; i++) { ti = el->tipo_iniziale(i); const char si = el->stato_iniziale(i); diff --git a/ve/velib04a.cpp b/ve/velib04a.cpp index 42034546d..c53ddfacf 100755 --- a/ve/velib04a.cpp +++ b/ve/velib04a.cpp @@ -11,13 +11,14 @@ TFatturazione_bolle::TFatturazione_bolle(const char* cod) void TFatturazione_bolle::tipi_validi(TToken_string& tipi) const { - const TString& s2 = get("S2"); +// const TString& s2 = get("S2"); tipi.cut(0); TString16 t; - for (int i = 0; i < 5; i++) + for (int i = 0; i < TElaborazione::_max_tipi_doc_elab; i++) { - t = s2.mid(i*4, 4); - t.trim(); +// t = s2.mid(i*4, 4); +// t.trim(); + t = tipo_iniziale(i); if (t.not_empty()) tipi.add(t); } @@ -26,14 +27,15 @@ void TFatturazione_bolle::tipi_validi(TToken_string& tipi) const void TFatturazione_bolle::stati_validi(TToken_string& stati) const { - const TString& s7 = get("S7"); +// const TString& s7 = get("S7"); stati.cut(0); TString16 s; - for (int i = 0; i < 5; i++) + for (int i = 0; i < TElaborazione::_max_tipi_doc_elab; i++) { - s = s7.mid(i*4, 1); - s.trim(); - if (s.not_empty()) +// s = s7.mid(i*4, 1); +// s.trim(); + const char s = stato_iniziale(i); + if (s != '\0') stati.add(s); } CHECK(!stati.empty_items(), "Nessuno stato documento valido"); @@ -43,14 +45,15 @@ 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 TString& tipodoc = doc_in.tipo().codice(); - for (int i = 0; i < 5; i++) +// 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 == tipi.mid(i*4, 4)) + if (tipodoc == tipo_iniziale(i)) break; } - if (i >= 5) + if (i >= TElaborazione::_max_tipi_doc_elab) { NFCHECK("Tipo documento non valido: '%s'", (const char*)tipodoc); return FALSE; @@ -87,7 +90,7 @@ bool TFatturazione_bolle::raggruppa(TDocumento& doc_in, TDocumento& doc_out) riferimento << " del " << doc_in.data().string(); // Setta la descrizione se vuota - if (rout.get("DESCR").empty()) + if (rout.get("DESCR").empty()) rout.put("DESCR", riferimento); else { @@ -95,7 +98,13 @@ bool TFatturazione_bolle::raggruppa(TDocumento& doc_in, TDocumento& doc_out) TString memo(1024); memo = rout.get("DESCEST"); if (memo.empty()) + { + TString80 rif(rout.get("DESCR")); + + rif << '\n'; + rout.put("DESCR", rif); rout.put("DESCLUNGA", "X"); + } else memo << '\n'; memo << riferimento; @@ -164,7 +173,8 @@ bool TFatturazione_bolle::elabora(TLista_documenti& doc_in, TLista_documenti& do // Uguali opzionalmente const char* cond[] = { "CAMBIO", "SCONTO", "TIPODOC", "CODNUM", "CODPAG", "CODABIA|CODCABA", "CODLIST", "CODAG", - "CODSPMEZZO", "CODPORTO", "CAUSTRASP", "CODVETT1|CODVETT2|CODVETT3", + "CODSPMEZZO", "CODPORTO", "CAUSTRASP", "CODVETT1|CODVETT2|CODVETT3", + "CODINDSP", NULL }; for (int u = 0; cond[u]; u++) diff --git a/ve/velib04b.cpp b/ve/velib04b.cpp index bf71fdcd2..ff5656ed1 100755 --- a/ve/velib04b.cpp +++ b/ve/velib04b.cpp @@ -449,10 +449,14 @@ TIVA_element& TIVA_element::add(const TRiga_documento& a, const bool sc, const i static TBill _sco_perc_bill, _sco_imp_bill, // Conti per gli sconti a percentuale ed importi (dalla configurazione) _spin_billa, _spin_billv, _spbo_billa, _spbo_billv; +static TBill _co_cliente, // conto clifo per movimento d'anticipo + _co_controp; // conto di contropartita per il movimetno d'anticipo + static bool _contsclor; // Contabilizza sconti al netto o al lordo (sconti suddiviso per ogni contropartita) static TEsercizi_contabili _esc; // Per sapere a quale esercizio appartiene il documento static TCausale *_caus = NULL; // causale del documento corrente -static TMovimentoPN_VE *_movimento = NULL; // Movimento di prima nota +static TMovimentoPN_VE *_movimento = NULL; // Movimento di prima nota documento vendita +static TMovimentoPN *_anticipo = NULL; // Movimento di prima nota relativamente all'anticipo indicato sul documento TContabilizzazione::TContabilizzazione(const char* cod) : TElaborazione(cod), _auto_data(FALSE), _nump_iva(2) @@ -598,6 +602,30 @@ bool TContabilizzazione::load_parameters() return TRUE; } +bool TContabilizzazione::test_swap() +{ + const char sez = _caus->sezione_clifo(); + const bool s = (_caus->reg().iva() == iva_vendite) ^ sez == 'D'; + return s; +} + + +error_type TContabilizzazione::get_next_reg_num(long& nr) +{ + // reperisce l'ultimo numero di registrazione disponibile + _error = no_error; + TLocalisamfile& mov = _movimento->lfile(); + nr = 1L; + if (!mov.empty()) + { + mov.last(); + nr = mov.get_long(MOV_NUMREG) + 1L; + if (mov.status() != NOERR || nr < 1) + _error = nr_reg_error; + } + return _error; +} + error_type TContabilizzazione::compile_head_mov(TDocumento& doc) // Compila la testata { @@ -627,17 +655,10 @@ error_type TContabilizzazione::compile_head_mov(TDocumento& doc) } // reperisce l'ultimo numero di registrazione disponibile - long numreg = 1L; - if (!mov.empty()) - { - mov.last(); - numreg = mov.get_long(MOV_NUMREG) + 1L; - if (mov.status() != NOERR || numreg < 1) - { - _error = nr_reg_error; - return _error; - } - } + long numreg; + _error = get_next_reg_num(numreg); + if (_error != no_error) + return _error; TCodice_numerazione cod_num(doc.numerazione()); // calcola il numero documento aggiungendo l'eventuale prefisso/postfisso. @@ -1457,7 +1478,8 @@ error_type TContabilizzazione::write_scadenze(TDocumento& doc) if (newgame != NULL) // Se non ho cancellato il numero partita ... { if (!newgame->write()) // Salva nuova partita - error_box("Si e' verificato un errore scrivendo le scadenze del documento."); + //error_box("Si e' verificato un errore scrivendo le scadenze del documento."); + _error = write_part_error; delete newgame; } @@ -1486,6 +1508,378 @@ error_type TContabilizzazione::write_all(TDocumento& doc) return no_error; } +error_type TContabilizzazione::compile_head_anticipo(TDocumento& doc) +{ + TString descr; + TString16 codcaus = doc.tipo().caus_anticipo(); + long nr = 1L; + TDate datareg(_movimento->lfile().get_date(MOV_DATAREG)); + + if (get_next_reg_num(nr) != no_error) + return nr_reg_error; + + if (!_caus->read(codcaus,datareg.year())) + return caus_ant_error; + + _anticipo = new TMovimentoPN; + TRectype& head = _anticipo->lfile().curr(); + head = _movimento->lfile().curr(); // Copia tutti i campi... + head.put(MOV_NUMREG,nr); + head.zero(MOV_DATA74TER); + head.put(MOV_TIPODOC,_caus->tipo_doc()); + head.put(MOV_CODCAUS,_caus->codice()); + descr = doc.get_bool(DOC_ACCSALDO) ? "Saldo fattura" : "Acconto fattura"; + descr << " n. " << doc.numero(); + descr << " del " << doc.get_date(DOC_DATADOC).string(); + head.put(MOV_DESCR,descr); + head.put(MOV_TIPOMOV,char(_caus->tipomov()+'0')); + head.zero(MOV_REG); + head.zero(MOV_PROTIVA); + head.zero(MOV_CODPAG); + head.zero(MOV_CORRLIRE); + head.zero(MOV_CORRVALUTA); + TString codval = head.get(MOV_CODVALI); + real cambio = head.get_real(MOV_CAMBIOI); + head.zero(MOV_CODVALI); + head.zero(MOV_CAMBIOI); + if (sc_enabled()) + { + real p(doc.get_real(DOC_IMPPAGATO)); + real plit = p * cambio; + if (codval.not_empty() && codval != "LIT") + { + head.put(MOV_TOTDOC,plit); + head.put(MOV_TOTDOCVAL,p); + } + else + { + head.put(MOV_TOTDOC,p); + head.zero(MOV_TOTDOCVAL); + } + } + else + { + head.zero(MOV_TOTDOC); + head.zero(MOV_TOTDOCVAL); + } + return no_error; +} + +char TContabilizzazione::sezione() const +{ + char sezione = ' '; + const char tipoc = _co_cliente.tipo(); + + tipo_movimento tm = (tipo_movimento)_caus->tipomov(); + sezione = _caus->sezione(1); // Usa la sezione della causale + + if (sezione <= ' ') // Se non c'e' la sezione bell'e' ch'e' pronta + { + if (tm == tm_fattura || tm == tm_insoluto) // calcola in base al tipo movimento e + sezione = (tipoc == 'C') ? 'D' : 'A'; // al tipo cliente/fornitore + else + sezione = (tipoc == 'C') ? 'A' : 'D'; + } + return sezione; +} + +error_type TContabilizzazione::search_clifo_bill() +{ + _error = no_error; + TLocalisamfile& clifo = _clifo->lfile(); + const long codcf = clifo.get_long(CLI_CODCF); + const char tipocf = clifo.get_char(CLI_TIPOCF); + _co_cliente.set(0,0,0); + _co_cliente.set(clifo.get_int(CLI_GRUPPO),clifo.get_int(CLI_CONTO),codcf,tipocf); + if (!_co_cliente.ok()) // se non e' valido, reperiscilo dalla riga #1 della causale + { + _caus->bill(1,_co_cliente); // conto della riga 1 + _co_cliente.codclifo() = codcf; + if (!_co_cliente.ok()) + _error = clifo_error; + } + return _error; +} + +error_type TContabilizzazione::search_counter_bill(TString16 & codpag) +{ + _error = no_error; + // cerca il conto relativo alla riga di causale: + // 1 Rimessa diretta o contanti (banca) riga 2 + // 2 Tratta riga 3 + // 3 Ricevuta bancaria riga 4 + // 4 Cessione riga 5 + // 5 Paghero' riga 6 + // 6 Lettera di credito riga 7 + // 7 Tratta accettata riga 8 + // 8 Rapporti interban. diretti riga 2 + // 9 Bonifici riga 2 + // Se il saldaconto e' attivo prende il conto relativo al tipo pagamento + // Altrimenti sempre la riga 2 + if (sc_enabled()) + { + + TPagamento * pagamento = new TPagamento(codpag); + int tipopag = pagamento->tipo_rata(0); // Quello della prima rata... prolly is right .. ;P + _caus->bill(tipopag>0 && tipopag<8 ? tipopag+1:2,_co_controp); + if (!_co_controp.ok()) + _caus->bill(2,_co_controp); + delete pagamento; + } + else + _caus->bill(2,_co_controp); + if (!_co_controp.ok()) + _error = counter_p_ant_error; + return _error; +} + +error_type TContabilizzazione::compile_rows_anticipo(TDocumento& doc) +{ + // Per compilare le righe ci si ispira alla contabilizzazione effetti + // per reperire il conto clienti si guarda prima sul record cliente + // e poi al limite la riga della causale + // per il conto di contropartita se non c'e' il saldaconto lo si prende dalla + // seconda riga. Se il saldaconto esiste si consulta la riga relativa al + // tipo di pagamento. + TString16 codpag(doc.get(DOC_CODPAG)); + if (search_clifo_bill() == no_error && search_counter_bill(codpag) == no_error) + { + const real importo = doc.get_real(DOC_IMPPAGATO); + TLocalisamfile& mov = _anticipo->lfile(); + TDate datareg = mov.get_long(MOV_DATAREG); + TString16 codes = mov.get(MOV_ANNOES); + const long numreg = mov.get_long(MOV_NUMREG); + TRectype& c_rec = _anticipo->cg(0); + // setta i valori per la riga cliente + c_rec.put(RMV_ANNOES,codes); + c_rec.put(RMV_DATAREG,datareg); + c_rec.put(RMV_NUMREG,numreg); + c_rec.put(RMV_NUMRIG,1); + c_rec.put(RMV_SEZIONE,_caus->sezione_clifo()); + c_rec.put(RMV_TIPOC,_co_cliente.tipo()); + c_rec.put(RMV_GRUPPO,_co_cliente.gruppo()); + c_rec.put(RMV_CONTO,_co_cliente.conto()); + c_rec.put(RMV_SOTTOCONTO,_co_cliente.sottoconto()); + c_rec.put(RMV_GRUPPOC,_co_controp.gruppo()); + c_rec.put(RMV_CONTOC,_co_controp.conto()); + c_rec.put(RMV_SOTTOCONTOC,_co_controp.sottoconto()); + c_rec.put(RMV_ROWTYPE,sc_enabled() ? "K" : " "); + c_rec.put(RMV_IMPORTO, importo); + + TRectype& co_rec = _anticipo->cg(1); + // setta i valori per la riga contropartita + co_rec = c_rec; // Swappa i conti ed il numero di riga + co_rec.put(RMV_NUMRIG,2); + co_rec.put(RMV_TIPOC,""); + co_rec.put(RMV_SEZIONE,_caus->sezione_clifo() == 'A' ? 'D' : 'A'); + co_rec.put(RMV_GRUPPO,_co_controp.gruppo()); + co_rec.put(RMV_CONTO,_co_controp.conto()); + co_rec.put(RMV_SOTTOCONTO,_co_controp.sottoconto()); + co_rec.put(RMV_TIPOCC,_co_cliente.tipo()); + co_rec.put(RMV_GRUPPOC,_co_cliente.gruppo()); + co_rec.put(RMV_CONTOC,_co_cliente.conto()); + co_rec.put(RMV_SOTTOCONTOC,_co_cliente.sottoconto()); + co_rec.put(RMV_ROWTYPE,sc_enabled() ? "I" : " "); + } + return _error; +} + +error_type TContabilizzazione::write_pagamento_anticipo(TDocumento& doc) +{ + TLocalisamfile& mov = _anticipo->lfile(); + const int anno = mov.get_date(MOV_DATAREG).year(); + TString numpart(mov.get(MOV_NUMDOC)); // Nessun controllo se prot.iva o numdoc xche' tanto proviene dal mov precedentemente scritto + TPartita * partita = new TPartita(_co_cliente,anno,numpart); + TRiga_partite& riga_part = partita->new_row(); + // Compila la riga di partita per il pagamento + riga_part.put(PART_TIPOMOV,_caus->tipomov()); + riga_part.put(PART_TIPOPAG, 1 ); // Pagamento in contanti-> tipo 1 + riga_part.put(PART_NREG,mov.get_long(MOV_NUMREG)); + riga_part.put(PART_NUMRIG,1); // Riferimento alla riga 1 del movimento + riga_part.put(PART_DATAREG,mov.get_date(MOV_DATAREG)); + riga_part.put(PART_DATADOC,mov.get_date(MOV_DATADOC)); + riga_part.put(PART_DATAPAG,mov.get_date(MOV_DATADOC)); + riga_part.put(PART_NUMDOC,numpart); // E' lo stesso riferimento + riga_part.put(PART_SEZ,sezione()); + + real impval; + real imp = doc.get_real(DOC_IMPPAGATO); + real cambio = doc.get_real(DOC_CAMBIO); + TString16 val(doc.get(DOC_CODVAL)); + TDate datacam(doc.get_date(DOC_DATACAMBIO)); + const bool valuta = val.not_empty(); + if (valuta) + { + impval = imp; + imp *= cambio; + } + riga_part.put(PART_IMPORTO,imp); + riga_part.put(PART_IMPORTOVAL,impval); + riga_part.put(PART_IMPTOTDOC,imp); + riga_part.put(PART_IMPTOTVAL,impval); + riga_part.put(PART_CODVAL,val); + riga_part.put(PART_CAMBIO,cambio); + riga_part.put(PART_DATACAM,doc.get_date(DOC_DATACAMBIO)); + riga_part.put(PART_TIPOCF,_co_cliente.tipo()); + riga_part.put(PART_SOTTOCONTO,_co_cliente.sottoconto()); + riga_part.put(PART_DESCR, mov.get(MOV_DESCR)); + + // Compila la riga di pagamento: + // reperire il numero della riga partita (nrigp) appena aggiunta + int nriga = (int) TPartita::UNASSIGNED, nrigp = riga_part.get_int(PART_NRIGA); + // Cerca la riga di partita con riferimento alla fattura che si sta pagando + for (int r = partita->last(); r > 0; r = partita->pred(r)) + { + TRiga_partite& rpart = partita->riga(r); + if (rpart.is_fattura() && rpart.get(PART_NUMDOC) == numpart) + { + nriga = r; + break; + } + } + // Scorre le scadenze di questa fattura, e ne completa il pagamento partendo + // dalla rata piu' vecchia. + TRiga_partite& rpp = partita->riga(nriga); + real abb; + real& ipp = valuta ? impval : imp; + TValuta tval(val, datacam, cambio); + char old_ap, new_ap; + TImporto old_abb, old_diffcam, + new_abb, new_diffcam; + const int nrate = rpp.rate(); + const bool is_saldo_doc = doc.get_bool(DOC_ACCSALDO); + char s_a; + for (int i=1; i<=nrate; i++) + { + TRiga_scadenze& rs = rpp.rata(i); + real res = rs.residuo(valuta).valore(); // Sul residuo da pagare per questa rata + TRectype& riga_pagamento = partita->pagamento(nriga,i,nrigp); // Nuova riga di pagamento + // Compila la riga... e scala l'importo residuo partendo dalla piu' vecchia + // setta i flags di saldato/acconto + // ANNO, NUMPART, NRIGA, NRATA, NRIGP dovrebbero essere gia' compilati + riga_pagamento.put(PAGSCA_TIPOC,_co_cliente.tipo()); + riga_pagamento.put(PAGSCA_SOTTOCONTO,_co_cliente.sottoconto()); + s_a = 'S'; + if (ipp <= ZERO) + ipp = ZERO; + if (res > ipp || i == nrate) // sull'ultima rata mette tutto il resto... + { + res = ipp; + imp = 0.0; + if (!is_saldo_doc) + s_a = 'A'; + } + else + ipp -= res; + riga_pagamento.put(PAGSCA_ACCSAL, s_a); + riga_pagamento.put(valuta ? PAGSCA_IMPORTOVAL : PAGSCA_IMPORTO, res); + + if (valuta) + riga_pagamento.put(PAGSCA_IMPORTO, ((real)(res*cambio)).round()); + riga_pagamento.put(PAGSCA_TIPOCC,_co_controp.tipo()); + riga_pagamento.put(PAGSCA_GRUPPOC,_co_controp.gruppo()); + riga_pagamento.put(PAGSCA_CONTOC,_co_controp.conto()); + riga_pagamento.put(PAGSCA_SOTTOCONTC,_co_controp.sottoconto()); + + TRectype rp(riga_pagamento); + if (is_saldo_doc) + rp.put(PAGSCA_ACCSAL, 'S'); + + partita->modifica_pagamento(rp, tval, old_ap, old_abb, old_diffcam, new_ap, new_abb, new_diffcam, TRUE); + abb += new_abb.valore(); + } + + // Vediamo se vi sono abbuoni, in questo caso si completa il movimento + // contabile di anticipo, con la riga appropriata, di abbuoni attivi/passivi cambiamo pure la riga relativa + // all'importo cliente, ovvero lo settiamo al valore totale della fattura... ;) + // Dentro new_ap avremo se l'abbuono e' attivo o passivo, in new_abb avremo l'importo + TBill abb_bill; + if (abb != ZERO) + { + // Reperisce il conto di contropartita per gli abbuoni dalla causale: 9 passivi 10 attivi + const int nrigc = new_ap == 'A' ? 10 : 9; + _caus->bill(nrigc, abb_bill); + if (abb_bill.ok()) + { + TRectype& first_row = _anticipo->cg(0); // Riga cli/fo + first_row.put(RMV_IMPORTO, rpp.get_real(PART_IMPTOTDOC)); // Aggiusta l'importo totale + TRectype& abb_row = _anticipo->cg(2); // Riga abbuoni ... + abb_row = first_row; + abb_row.put(RMV_NUMRIG,3); + abb_row.put(RMV_TIPOC,""); + + char ab_sez = 'D'; + const char cf_sez = _caus->sezione_clifo(); + if (cf_sez == 'D' && new_ap == 'P' || + cf_sez == 'A' && new_ap == 'A') + ab_sez = 'A'; + abb_row.put(RMV_SEZIONE, ab_sez); + abb_row.put(RMV_GRUPPO,abb_bill.gruppo()); + abb_row.put(RMV_CONTO,abb_bill.conto()); + abb_row.put(RMV_SOTTOCONTO,abb_bill.sottoconto()); + abb_row.put(RMV_TIPOCC,_co_cliente.tipo()); + abb_row.put(RMV_GRUPPOC,_co_cliente.gruppo()); + abb_row.put(RMV_CONTOC,_co_cliente.conto()); + abb_row.put(RMV_SOTTOCONTOC,_co_cliente.sottoconto()); + abb_row.put(RMV_IMPORTO, abs(abb)); + abb_row.put(RMV_ROWTYPE, new_ap); + } + else + _error = cau_abb_error; + + } + + // Infine scrive sta partita... + if (good() && !partita->write()) + //error_box("Si e' verificato un errore scrivendo il pagamento del movimento di anticipo"); + _error = write_part_error; + delete partita; + return _error; +} + +error_type TContabilizzazione::write_anticipo(TDocumento& doc) +{ + // Questo movimento viene scritto solo se e' stato versato un anticipo di pagamento + // Crea 1 testata, 1 riga contabile e la relativa riga di pagamento sulla partita a cui fa riferimento + // La testata e' praticamente la stessa del movimento appena scritto, tranne che per il numero di + // protocollo, il numero di registrazione la descrizione, i totali in lire/valuta, + // la condizione pagamento... + _error = no_error; + + _error = compile_head_anticipo(doc); + if (_error == no_error) + { + // Una volta compilata la testa... compila le righe... + if (_anticipo) + { + _error = compile_rows_anticipo(doc); + if (_error == no_error) + { + // Scrive il movimento... gestendo la rinumerazione + if (sc_enabled()) + // ... il pagamento vero e proprio, scrivendo la partita e modificando + // il movimento se vi sono abbuoni + write_pagamento_anticipo(doc); + + TLocalisamfile& head = _anticipo->lfile(); + long numreg = head.get_long(MOV_NUMREG); + while (_anticipo->write() == _isreinsert) + head.put(MOV_NUMREG,++numreg); + + if (_anticipo->status() != NOERR) + { + error_box("Errore %d scrivendo il movimento di anticipo pagamento %ld.",_anticipo->status(),numreg); + return generic_error; + } + } + delete _anticipo; + _anticipo = NULL; + } + } + + return _error; +} + void TContabilizzazione::display_error(TDocumento& doc) { TString msg; @@ -1523,6 +1917,14 @@ void TContabilizzazione::display_error(TDocumento& doc) msg.format("Rilevato una data documento vuota relativamente al documento %s/%ld." "Verificare l'informazione inserita.",(const char*)numerazione,numero); break; + case caus_ant_error: + msg.format("Rilevato un errore caricando la causale per anticipo pagamento relativamente al documento %s/%ld." + "Verificare l'esistenza del codice causale inserito.",(const char*)numerazione,numero); + break; + case counter_p_ant_error: + msg.format("Rilevato un errore cercando il conto di contropartita per il movimetno di anticipo relativamente al documento %s/%ld." + "Verificare l'esistenza la correttezza della causale specificata.",(const char*)numerazione,numero); + break; case caus_error: msg.format("Rilevato un errore caricando la causale relativamente al documento %s/%ld." "Verificare l'esistenza del codice causale inserito.",(const char*)numerazione,numero); @@ -1563,6 +1965,14 @@ void TContabilizzazione::display_error(TDocumento& doc) msg.format("Rilevato un errore in scrittura movimento relativamente al documento %s/%ld." "Verificare la consistenza dei files.",(const char*)numerazione,numero); break; + case write_part_error: + msg.format("Rilevato un errore in scrittura partite relativamente al documento %s/%ld." + "Verificare la consistenza dei files.",(const char*)numerazione,numero); + break; + case cau_abb_error: + msg.format("Mancano i conti per gli abbuoni nella causale indicata per il pagamento anticipo relativamente al documento %s/%ld." + "Verificare la correttezza della causale.",(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); @@ -1600,6 +2010,7 @@ bool TContabilizzazione::elabora(TLista_documenti& doc_in, TLista_documenti& doc { p.setstatus(i+1); TDocumento& doc = doc_in[i]; + _movimento = new TMovimentoPN_VE(doc.in_valuta()); compile_head_mov(doc); @@ -1609,8 +2020,14 @@ bool TContabilizzazione::elabora(TLista_documenti& doc_in, TLista_documenti& doc if (good() && _can_write) if (write_all(doc) == no_error) // Se la scrittura e' andata ok... { - _total_docs++; - change_doc_status(doc); + if (doc.get_real(DOC_IMPPAGATO) != ZERO) + write_anticipo(doc); + + if (good()) + { + _total_docs++; + change_doc_status(doc); + } } if (_caus != NULL) { diff --git a/ve/velib04c.cpp b/ve/velib04c.cpp index 6749db1d9..5d3b7be5a 100755 --- a/ve/velib04c.cpp +++ b/ve/velib04c.cpp @@ -292,77 +292,80 @@ void TGenerazione_effetti::group_bills(TDocumento& doc) const real change = doc.cambio(); const TDate datafatt = doc.get_date(DOC_DATADOC); - calc_pagamento(doc,codpag,data); - CHECK(_pagamento,"Failed to create a TPagamento"); - const int numrate = _pagamento->n_rate( ); - if (numrate < 1) + if (totale_fatt - doc.get_real(DOC_IMPPAGATO) > ZERO && !doc.get_bool(DOC_ACCSALDO)) // procede se non e' a saldo { - _error = scadenze_error; - delete _pagamento; - _pagamento = NULL; - return; - } - - // Scorre le scadenze - for (n = 1; n <= numrate && good(); n++) - { - // Se non esiste effetto n-esimo (corrisponde al numero di rata corrente+offset) - // lo genera con la relativa riga. Se esiste vi somma gli importi ed accoda la riga - const bool is_new = n+offset > _effetti_array.items(); - if (is_new) // Nuovo effetto: crea effetto con i dati di questo documento (e' il primo che incontro nella scansione) + calc_pagamento(doc,codpag,data); + CHECK(_pagamento,"Failed to create a TPagamento"); + const int numrate = _pagamento->n_rate( ); + if (numrate < 1) { - TEffetto effetto; - // Setta i dati della testata; - effetto.put(EFF_DATASCAD, _pagamento->data_rata(n-1)); - effetto.put(EFF_TIPOPAG,_pagamento->tipo_rata(n-1)); - effetto.put(EFF_ULTCLASS,_pagamento->ulc_rata(n-1)); - effetto.put(EFF_CODCF, doc.get_long(DOC_CODCF)); - effetto.put(EFF_CODVAL, doc.get(DOC_CODVAL)); - effetto.put(EFF_CAMBIO, change); - effetto.put(EFF_DATACAMBIO,doc.get_date(DOC_DATACAMBIO)); - effetto.put(EFF_CODABI,doc.get(DOC_CODABIA)); - effetto.put(EFF_CODCAB,doc.get(DOC_CODCABA)); - effetto.put(EFF_EFFCOMP,TRUE); - _effetti_array.add(effetto); + _error = scadenze_error; + delete _pagamento; + _pagamento = NULL; + return; } - // aggiorna totale effetto (testata) - TEffetto& effetto=(TEffetto&)_effetti_array[n+offset-1]; - importo = effetto.get_real(EFF_IMPORTO); - imprata = _pagamento->importo_rata(n-1,FALSE); - importo += imprata; - effetto.put(EFF_IMPORTO,importo); - if (valuta) + + // Scorre le scadenze + for (n = 1; n <= numrate && good(); n++) { - importoval = effetto.get_real(EFF_IMPORTOVAL); - imprataval = _pagamento->importo_rata(n-1,TRUE); - importoval += imprataval; - effetto.put(EFF_IMPORTOVAL,importoval); - } - // Crea la nuova riga di questo effetto - const int rows = effetto.rows_r(); - TRectype& riga = effetto.row_r(rows+1,TRUE); -// reffetto.put(REFF_NPROGTR,nprog); - riga.put(REFF_NRIGATR,rows+1); - riga.put(REFF_NRATA,n); - riga.put(REFF_DATAFATT, datafatt); - riga.put(REFF_PROVV,provv); - riga.put(REFF_ANNODOC,anno); - riga.put(REFF_CODNUM,codnum); - riga.put(REFF_NFATT,numdoc); - riga.put(REFF_IMPFATT,totale_fatt); - riga.put(REFF_IMPORTO,imprata); - if (valuta) + // Se non esiste effetto n-esimo (corrisponde al numero di rata corrente+offset) + // lo genera con la relativa riga. Se esiste vi somma gli importi ed accoda la riga + const bool is_new = n+offset > _effetti_array.items(); + if (is_new) // Nuovo effetto: crea effetto con i dati di questo documento (e' il primo che incontro nella scansione) + { + TEffetto effetto; + // Setta i dati della testata; + effetto.put(EFF_DATASCAD, _pagamento->data_rata(n-1)); + effetto.put(EFF_TIPOPAG,_pagamento->tipo_rata(n-1)); + effetto.put(EFF_ULTCLASS,_pagamento->ulc_rata(n-1)); + effetto.put(EFF_CODCF, doc.get_long(DOC_CODCF)); + effetto.put(EFF_CODVAL, doc.get(DOC_CODVAL)); + effetto.put(EFF_CAMBIO, change); + effetto.put(EFF_DATACAMBIO,doc.get_date(DOC_DATACAMBIO)); + effetto.put(EFF_CODABI,doc.get(DOC_CODABIA)); + effetto.put(EFF_CODCAB,doc.get(DOC_CODCABA)); + effetto.put(EFF_EFFCOMP,TRUE); + _effetti_array.add(effetto); + } + // aggiorna totale effetto (testata) + TEffetto& effetto=(TEffetto&)_effetti_array[n+offset-1]; + importo = effetto.get_real(EFF_IMPORTO); + imprata = _pagamento->importo_rata(n-1,FALSE); + importo += imprata; + effetto.put(EFF_IMPORTO,importo); + if (valuta) + { + importoval = effetto.get_real(EFF_IMPORTOVAL); + imprataval = _pagamento->importo_rata(n-1,TRUE); + importoval += imprataval; + effetto.put(EFF_IMPORTOVAL,importoval); + } + // Crea la nuova riga di questo effetto + const int rows = effetto.rows_r(); + TRectype& riga = effetto.row_r(rows+1,TRUE); + // reffetto.put(REFF_NPROGTR,nprog); + riga.put(REFF_NRIGATR,rows+1); + riga.put(REFF_NRATA,n); + riga.put(REFF_DATAFATT, datafatt); + riga.put(REFF_PROVV,provv); + riga.put(REFF_ANNODOC,anno); + riga.put(REFF_CODNUM,codnum); + riga.put(REFF_NFATT,numdoc); + riga.put(REFF_IMPFATT,totale_fatt); + riga.put(REFF_IMPORTO,imprata); + if (valuta) + { + riga.put(REFF_IMPFATTVAL,totale_fatt); + real totfatlit = totale_fatt*change; + riga.put(REFF_IMPFATT,totfatlit); + riga.put(REFF_IMPORTOVAL,imprataval); + } + } // Ciclo sulle scadenze + if (_pagamento) { - riga.put(REFF_IMPFATTVAL,totale_fatt); - real totfatlit = totale_fatt*change; - riga.put(REFF_IMPFATT,totfatlit); - riga.put(REFF_IMPORTOVAL,imprataval); + delete _pagamento; + _pagamento = NULL; } - } // Ciclo sulle scadenze - if (_pagamento) - { - delete _pagamento; - _pagamento = NULL; } } // Ciclo sui documenti di questo gruppo offset=_effetti_array.items(); @@ -390,8 +393,10 @@ void TGenerazione_effetti::calc_pagamento(TDocumento& doc, TString16& codpag, TS const real change = doc.cambio(); real totspese = doc.spese(); real totimposte = doc.imposta(); + real pagato = doc.get(DOC_IMPPAGATO); real totimponibili = doc.totale_doc() - totimposte - totspese; - if (doc.in_valuta()) + const bool valuta = doc.in_valuta(); + if (valuta) { real val1 = totimponibili * change; real val2 = totimposte * change; @@ -401,6 +406,39 @@ void TGenerazione_effetti::calc_pagamento(TDocumento& doc, TString16& codpag, TS else _pagamento->set_total( totimponibili, totimposte, totspese ); _pagamento->set_rate_auto(); + + //Riaggiusta le rate a seconda del valore gia' pagato + real rata,v; + const int numrate = _pagamento->n_rate( ); + for (int i = 0; i< numrate; i++) + { + rata = _pagamento->importo_rata(i,valuta); + if (rata > pagato) + { + v = rata - pagato; + pagato = ZERO; + } + else + { + v = ZERO; + pagato -= rata; + } + _pagamento->set_imprata(i, v, valuta); + if (valuta) + { + v *= change; + v.round(); + _pagamento->set_imprata(i, v, FALSE); + } + } + // Scorre all'indietro per rimuovere le rate a 0, evitando fastidiose + // complicazioni dovute al pack delle rate effettuato dalla remove_rate() + for (i=numrate-1; i>=0; i--) + { + if (_pagamento->importo_rata(i,valuta) == ZERO) + _pagamento->remove_rata(i); + } + } void TGenerazione_effetti::generate_bill(TDocumento& doc) // bill in inglese significa anche effetto eheheh ;-) @@ -433,7 +471,7 @@ void TGenerazione_effetti::generate_bill(TDocumento& doc) // bill in inglese sig data = doc.get(DOC_DATADOC); const real totale_fatt = doc.totale_doc(); // Importo in valuta - if (totale_fatt > ZERO) + if (totale_fatt - doc.get_real(DOC_IMPPAGATO) > ZERO && !doc.get_bool(DOC_ACCSALDO)) // procede se non e' a saldo { const bool valuta = doc.in_valuta(); const real change = doc.cambio(); diff --git a/ve/velib04d.cpp b/ve/velib04d.cpp new file mode 100755 index 000000000..8eabb84de --- /dev/null +++ b/ve/velib04d.cpp @@ -0,0 +1,187 @@ +#include + +#include "velib.h" +#include "velib04d.h" + +#include +#include + +/////////////////////////////////////////////////////////// +// TConsegna ordini mask +/////////////////////////////////////////////////////////// + +class TConsegna_mask : public TAutomask +{ +protected: + virtual bool on_field_event(class TOperable_field& f, TField_event e, long jolly); + +public: + void doc2mask(const TDocumento& doc); + + TConsegna_mask() : TAutomask("velib04d") { } + virtual ~TConsegna_mask() { } +}; + +bool TConsegna_mask::on_field_event(class TOperable_field& f, TField_event e, long jolly) +{ + switch (f.dlg()) + { + case S_QTADAEVADERE: + if (e == fe_modify) + { + TMask& m = f.mask(); + const real qta_residua = m.get_real(S_QTARESIDUA); + const real qta_daevadere = m.get_real(S_QTADAEVADERE); + if (qta_daevadere > ZERO) + { + m.set(S_RIGACONSEGNATA, "X"); + if (qta_daevadere >= qta_residua) + { + m.set(S_RIGAEVASA, "X"); + m.disable(S_RIGAEVASA); + } + else + m.enable(S_RIGAEVASA); + } + else + { + m.set(S_RIGAEVASA, " "); + m.enable(S_RIGAEVASA); + } + } + break; + case F_CONSEGNA: + if (e == fe_button) + { + TSheet_field& s = sfield(F_ROWS); + FOR_EACH_SHEET_ROW(s, n, row) + { + const real residuo = row->get(S_QTARESIDUA-FIRST_FIELD); + const real evaso = row->get(S_QTADAEVADERE-FIRST_FIELD); + if (evaso == ZERO && residuo > ZERO) + { + row->add(residuo.string(), S_QTADAEVADERE-FIRST_FIELD); + row->add("X", S_RIGAEVASA-FIRST_FIELD); + s.disable_cell(n, S_RIGAEVASA-FIRST_FIELD); + } + row->add("X", S_RIGACONSEGNATA-FIRST_FIELD); + } + s.force_update(); + } + break; + case F_ROWS: + if (e == se_query_add || e == se_query_del) + return FALSE; + default:break; + } + return TRUE; +} + +void TConsegna_mask::doc2mask(const TDocumento& doc) +{ + for (int n = fields()-1; n >= 0; n--) + { + TMask_field& f = fld(n); + const TFieldref* fr = f.field(); + if (fr) + { + const TString& val = doc.get(fr->name()); + f.set(val); + } + } + TSheet_field& s = sfield(F_ROWS); + s.destroy(); + const int rows = doc.physical_rows(); + for (int i = 0; i < rows; i++) + { + const TRiga_documento& rec = doc[i+1]; + TToken_string& r = s.row(i); + r = " "; + + bool evasa = rec.get_bool(RDOC_RIGAEVASA); + const real residuo = rec.get_real(RDOC_QTA) - rec.get_real(RDOC_QTAEVASA); + if (residuo <= ZERO) + { + r.add(" "); + evasa = TRUE; + } + else + r.add(residuo.string()); + r.add(" "); // Da evadere + if (evasa) + { + s.disable_cell(i, -1); + r.add("X"); + } + else + r.add(" "); + r.add(rec.get(RDOC_CODMAG).left(3)); + r.add(rec.get(RDOC_CODMAG).mid(3)); + r.add(rec.get(RDOC_CODART)); + r.add(rec.get(RDOC_DESCR)); + r.add(rec.get(RDOC_TIPORIGA)); + } +} + +/////////////////////////////////////////////////////////// +// TConsegna ordini +/////////////////////////////////////////////////////////// + +TConsegna_ordini::TConsegna_ordini(const char* cod) + : TElaborazione(cod) +{ +} + +bool TConsegna_ordini::elabora(TLista_documenti& doc_in, TLista_documenti& doc_out, + const TDate& data_elab, bool interattivo) +{ + const int items_in = doc_in.items(); + const int items_out = doc_out.items(); + CHECK(items_in > 0, "Nessun documento da elaborare"); + CHECK(items_out> 0, "Nessun documento da generare"); + CHECK(items_in == 1 || items_out == 1 || items_out == items_in, + "Numero di documenti da elborare 'strano'"); + + bool ok = TRUE; + + TConsegna_mask m; + + const int items_max = items_in > items_out ? items_in : items_out; + for (int d = 0; d < items_max && ok; d++) + { + TDocumento& indoc = doc_in[d < items_in ? d : 0]; + TDocumento& outdoc = doc_out[d < items_out ? d : 0]; + + m.doc2mask(indoc); + ok = m.run() == K_ENTER; + if (ok) + { + TSheet_field& s = m.sfield(F_ROWS); + FOR_EACH_SHEET_ROW(s, n, row) if (*row->get(0) > ' ') + { + TRiga_documento& inrec = indoc[n+1]; + const real daeva = row->get(S_QTADAEVADERE - FIRST_FIELD); + if (daeva > ZERO) + { + const real qtaevasa = inrec.get_real(RDOC_QTAEVASA) + daeva; + inrec.put(RDOC_QTAEVASA, qtaevasa); + inrec.put(RDOC_RIGAEVASA, row->get(S_RIGAEVASA - FIRST_FIELD)); + } + + const TString16 tiporiga = inrec.get(RDOC_TIPORIGA); + TRiga_documento& outrec = outdoc.new_row(tiporiga); + outrec = inrec; + outrec.set_numero(outdoc.physical_rows()); + outrec.put(RDOC_QTA, daeva); + outrec.zero(RDOC_QTAEVASA); + outrec.zero(RDOC_RIGAEVASA); + } + } + + if (indoc.is_evaso()) + { + indoc.stato(stato_finale()[0]); + } + } + return ok; +} diff --git a/ve/velib04d.h b/ve/velib04d.h new file mode 100755 index 000000000..2b35ee92b --- /dev/null +++ b/ve/velib04d.h @@ -0,0 +1,20 @@ +#define S_RIGACONSEGNATA 101 +#define S_QTARESIDUA 102 +#define S_QTADAEVADERE 103 +#define S_RIGAEVASA 104 + +#define F_CODNUM 201 +#define F_DESNUM 202 +#define F_TIPODOC 203 +#define F_DESCTIPO 204 +#define F_ESERCIZIO 205 +#define F_NUMDOC 206 +#define F_DATADOC 207 +#define F_STATODOC 208 +#define F_CONSEGNA 209 +#define F_TIPOCF 210 +#define F_CODCLI 211 +#define F_RAGCLI 212 +#define F_CODFOR 213 +#define F_RAGFOR 214 +#define F_ROWS 250 diff --git a/ve/velib04d.uml b/ve/velib04d.uml new file mode 100755 index 000000000..a1af00622 --- /dev/null +++ b/ve/velib04d.uml @@ -0,0 +1,271 @@ +#include "velib04d.h" + +TOOLBAR "Toolbar" 0 20 0 0 + +BUTTON DLG_OK 10 2 +BEGIN + PROMPT -12 -11 "" +END + +BUTTON DLG_CANCEL 10 2 +BEGIN + PROMPT -22 -11 "" +END + +ENDPAGE + + +PAGE "Consegna Ordini" 11 60 14 + +GROUPBOX -1 78 6 +BEGIN + PROMPT 1 0 "" +END + +STRING F_CODNUM 4 +BEGIN + PROMPT 2 1 "Cod. num. " + FIELD CODNUM + USE %NUM KEY 1 + INPUT CODTAB F_CODNUM + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_DESNUM S0 + CHECKTYPE NORMAL + FLAGS "GDU" +END + +STRING F_DESNUM 50 +BEGIN + PROMPT 24 1 "" + FLAGS "D" +END + +STRING F_TIPODOC 4 +BEGIN + FIELD TIPODOC + PROMPT 2 2 "Tipo doc. " + USE %TIP KEY 1 + INPUT CODTAB F_TIPODOC + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_DESCTIPO S0 + CHECKTYPE NORMAL + FLAGS "GDU" +END + +STRING F_DESCTIPO 50 +BEGIN + PROMPT 24 2 "" + FLAGS "GD" +END + +STRING F_ESERCIZIO 4 +BEGIN + PROMPT 2 3 "Esercizio " + FIELD ANNO + FLAGS "D" +END + +NUMBER F_NUMDOC 6 +BEGIN + PROMPT 24 3 "Numero doc. " + FIELD NDOC + FLAGS "D" +END + +DATE F_DATADOC +BEGIN + PROMPT 46 3 "Data " + FIELD DATADOC + FLAGS "D" +END + +NUMBER F_STATODOC 1 +BEGIN + PROMPT 67 3 "Stato " + FIELD STATO + FLAGS "D" +END + +LIST F_TIPOCF 1 10 +BEGIN + PROMPT 1 4 "" + FLAGS "GH" + FIELD TIPOCF + ITEM "C|Clienti" + MESSAGE SHOW,1@|HIDE,2@ + ITEM "F|Fornitori" + MESSAGE SHOW,2@|HIDE,1@ +END + +NUMBER F_CODCLI 6 +BEGIN + PROMPT 2 4 "Cliente " + WARNING "Cliente assente" + HELP "Codice del cliente del documento" + FLAGS "D" + FIELD CODCF + GROUP 1 + USE 20 KEY 1 + INPUT TIPOCF "C" + INPUT CODCF F_CODCLI + DISPLAY "Codice" CODCF + DISPLAY "Ragione Sociale@50" RAGSOC + OUTPUT F_CODCLI CODCF + OUTPUT F_RAGCLI RAGSOC + CHECKTYPE REQUIRED + ADD RUN cg0 -1 C +END + +STRING F_RAGCLI 50 +BEGIN + PROMPT 24 4 "" + FLAGS "D" + GROUP 1 +END + +NUMBER F_CODFOR 6 +BEGIN + PROMPT 2 4 "Fornitore " + WARNING "Fornotore assente" + HELP "Codice del cliente del documento" + FLAGS "D" + FIELD CODCF + GROUP 2 + USE 20 KEY 1 + INPUT TIPOCF "F" + INPUT CODCF F_CODFOR + DISPLAY "Codice" CODCF + DISPLAY "Ragione Sociale@50" RAGSOC + OUTPUT F_CODFOR CODCF + OUTPUT F_RAGFOR RAGSOC + CHECKTYPE REQUIRED + ADD RUN cg0 -1 C +END + +STRING F_RAGFOR 50 +BEGIN + PROMPT 24 4 "" + FLAGS "DH" + GROUP 2 +END + +BUTTON F_CONSEGNA 30 2 +BEGIN + PROMPT 1 6 "~Consegna tutte le righe" +END + +SPREADSHEET F_ROWS +BEGIN + PROMPT 0 8 "" + ITEM "@1" + ITEM "Quantita'\nresidua@13" + ITEM "Quantita'\nda evadere@13" + ITEM "Evasa@5" + ITEM "Mag@3" + ITEM "Dep@3" + ITEM "Codice articolo@20" + ITEM "Descrizione@50" + ITEM "Tipo@4" +END + +ENDPAGE + +ENDMASK + +PAGE "Riga 1" -1 -1 66 10 + +GROUPBOX DLG_NULL 64 6 +BEGIN + PROMPT 1 0 "" +END + +STRING 105 3 +BEGIN + PROMPT 2 1 "Magazzino " + USE MAG + INPUT CODTAB 105 + OUTPUT 155 S0 + CHECKTYPE NORMAL + FLAGS "D" +END + +STRING 155 45 +BEGIN + PROMPT 17 1 "" + FLAGS "D" +END + +STRING 106 2 +BEGIN + PROMPT 2 2 "Deposito " + USE MAG + INPUT CODTAB[1,3] 105 + INPUT CODTAB[4,5] 106 + OUTPUT 156 S0 + CHECKTYPE NORMAL + FLAGS "D" +END + +STRING 156 45 +BEGIN + PROMPT 17 2 "" + FLAGS "D" +END + + +STRING 107 20 +BEGIN + PROMPT 2 3 "Articolo " + FLAGS "D" +END + +STRING 108 50 +BEGIN + PROMPT 2 4 "Descriz. " + FLAGS "D" +END + +STRING 109 3 +BEGIN + PROMPT 49 3 "Tipo riga " + FLAGS "D" +END + +NUMBER S_QTARESIDUA 13 5 +BEGIN + PROMPT 1 6 "Quantita' residua " + FLAGS "DU" +END + +NUMBER S_QTADAEVADERE 13 5 +BEGIN + PROMPT 1 7 "Quantita' da evadere " + FLAGS "U" +END + +BOOLEAN S_RIGACONSEGNATA +BEGIN + PROMPT 41 6 "Riga consegnata" +END + +BOOLEAN S_RIGAEVASA +BEGIN + PROMPT 41 7 "Riga evasa" +END + +BUTTON DLG_OK 10 2 +BEGIN + PROMPT -12 -1 "" +END + +BUTTON DLG_CANCEL 10 2 +BEGIN + PROMPT -22 -1 "" +END + +ENDPAGE + +ENDMASK + diff --git a/ve/velib05.cpp b/ve/velib05.cpp index 1edc0a069..106269bb0 100755 --- a/ve/velib05.cpp +++ b/ve/velib05.cpp @@ -158,13 +158,18 @@ void TDocumentoEsteso::scadenze_recalc() { _scadenze_array.destroy(); _scadenze_current = -1; - TString16 codpag(head().get("CODPAG")); - TString16 data(head().get("DATAINSC")); - if (data.empty()) data = head().get("DATADOC"); + TRectype& hh = head(); + TString16 codpag(hh.get("CODPAG")); + TString16 data(hh.get("DATAINSC")); + if (data.empty()) data = hh.get("DATADOC"); TPagamento pag( codpag, data); real totspese = spese();//tot_spese(); real totimposte = imposta();//tot_imposte(); + real pagato = hh.get(DOC_IMPPAGATO); + const bool saldo = hh.get_bool(DOC_ACCSALDO); real totimponibili = totale_doc() - totimposte - totspese;//tot_documento() - totimposte - totspese; + if (saldo || pagato > totimponibili) + totimponibili = ZERO; const bool valuta = in_valuta(); if (valuta) { @@ -178,14 +183,30 @@ void TDocumentoEsteso::scadenze_recalc() pag.set_total( totimponibili, totimposte, totspese ); pag.set_rate_auto( ); const int numrate = pag.n_rate( ); + real v,rata; for (int i = 0; i< numrate; i++) { - TToken_string t; - t.add(pag.data_rata(i)); - t.add(pag.importo_rata(i,valuta).string()); - _scadenze_array.add(t); + rata = pag.importo_rata(i,valuta); + if (rata > pagato) + { + v = rata - pagato; + pagato = ZERO; + } + else + { + v = ZERO; + pagato -= rata; + } + if (v > ZERO) + { + TToken_string t; + t.add(pag.data_rata(i)); + t.add(v.string()); + _scadenze_array.add(t); + } } - if (numrate > 0) _scadenze_current++; + if (_scadenze_array.items() > 0) + _scadenze_current++; } const char * TDocumentoEsteso::scadenze_get(const TString& w) @@ -231,8 +252,8 @@ real TDocumentoEsteso::tot_imponibili(byte selector) return number; } -TDocumentoEsteso::TDocumentoEsteso(const TRectype& rec, TCond_vendita * condv) - : TDocumento(rec, condv), _sum_filter(-1), _sum_selected(FALSE), _scadenze_current(-1) +TDocumentoEsteso::TDocumentoEsteso(const TRectype& rec) + : TDocumento(rec), _sum_filter(-1), _sum_selected(FALSE), _scadenze_current(-1) { _iva = new TTable("%IVA"); // Inizializza i parametri di default @@ -241,8 +262,8 @@ TDocumentoEsteso::TDocumentoEsteso(const TRectype& rec, TCond_vendita * condv) _parm.imp_lit = 0; _parm.imp_val = 3; } -TDocumentoEsteso::TDocumentoEsteso(const TRectype& rec, dec_parm & parm, TCond_vendita * condv) - : TDocumento(rec, condv), _sum_filter(-1), _sum_selected(FALSE), _scadenze_current(-1) +TDocumentoEsteso::TDocumentoEsteso(const TRectype& rec, dec_parm & parm) + : TDocumento(rec), _sum_filter(-1), _sum_selected(FALSE), _scadenze_current(-1) { _parm = parm; _iva = new TTable("%IVA"); @@ -256,7 +277,8 @@ TDocumentoEsteso::TDocumentoEsteso() TDocumentoEsteso::~TDocumentoEsteso() { - if (_iva != NULL) delete _iva; + if (_iva != NULL) + delete _iva; } diff --git a/ve/velib06.cpp b/ve/velib06.cpp index e5ed905f4..6b5b958ec 100755 --- a/ve/velib06.cpp +++ b/ve/velib06.cpp @@ -1,41 +1,43 @@ +#include +#include +#include +#include +#include +#include +#include + #include "velib.h" #include "vepriv.h" +#include "verig.h" +#include "../mg/mglib.h" -#ifndef __APPLICAT_H -#include -#endif - -#ifndef __VEUML_H +#include "ve0100b1.h" +#include "ve0100o.h" #include "veuml.h" -#endif - -#ifndef __VEUML1_H #include "veuml1.h" -#endif - -#ifndef __TABUTIL_H -#include -#endif - -#ifndef __UTILITY_H -#include -#endif - -#ifndef __VEINI_H #include "veini.h" -#endif -#ifndef __SCONTI_H #include "sconti.h" -#endif -TDocumento_mask::TDocumento_mask(const char* name, TDocumento * doc, TRelation * rel, - int num, int max) - : TVariable_mask(name, num, max), _progs_page(-1), _last_prog(-1), - _doc(doc), _rel(rel) -{ - const int pos = id2pos(BASE_PIEDE + 1); - +TDocumento_mask::TDocumento_mask(const char* td) + : TVariable_mask(), _progs_page(-1), _last_prog(-1), + _condv(NULL) +{ + CHECK(strlen(td) <= 4, "TDocumento_mask(TipoDocumento) not (MaskName)"); + + { + TMagazzini m; + + _ges_mag = m.gestmag(); + _ges_dep = m.gestdep(); + _std_mag = m.standardmag(); + _std_dep = m.standarddep(); + } + _doc.set_tipo(td); + const TString mname = _doc.tipo().mask_name(); + read_mask(mname, 0, MAX_PAGES); + + int pos = id2pos(BASE_PIEDE + 1); if (pos >= 0) { _progs_page = find_parent_page(fld(pos)); @@ -43,27 +45,271 @@ TDocumento_mask::TDocumento_mask(const char* name, TDocumento * doc, TRelation * while (id2pos(BASE_PIEDE + _last_prog + 1) >= 0) _last_prog++; } + + _sheet = &sfield(F_SHEET); + _sheet->set_notify( ss_notify ); + _sheet->set_append(FALSE); + + TList_field& listbox = ( TList_field& )field( F_LBTIPORIGA ); + + TConfig& prof = _doc.tipo().profile(); + const int numtr = prof.get_int( "NTIPIRIGA", "RIGHE" ); //prof + TToken_string keys, descrs; + TRiga_documento r(&_doc); + + for ( int i = 1; i <= numtr; i ++ ) + { + TString16 var; + + var.format("%d", i); + TString16 tiporiga(prof.get(var, "RIGHE")); // pro + r.set_tipo(tiporiga); + keys.add(r.tipo().codice()); + descrs.add(r.tipo().descrizione()); + } + listbox.replace_items( keys, descrs ); + configura_sheet( *_sheet, prof ); + ((TVariable_sheet_field*)_sheet)->set_getmask( ss_getmask ); + if (id2pos( F_OCCASEDIT ) > 0 ) + set_handler( F_OCCASEDIT, occas_handler ); + set_handler( F_CODCF, clifo_handler ); + set_handler( F_CODPAG, condpag_hndl ); + set_handler( F_DATAINSC, condpag_hndl ); + set_handler( F_CODNOTE, note_hndl ); + set_handler( F_DATADOC, data_hndl ); + set_handler( F_CODLIST, codlist_handler ); + set_handler( F_CODLIST1, codlist_handler ); + set_handler( F_CODCONT, codcont_handler ); + set_handler( F_CODCONT1, codcont_handler ); + set_handler( F_CODCAMP, codcamp_handler ); + set_handler( DLG_ELABORA, elabora_handler ); + set_handler( DLG_PRINT, print_handler ); + int numhandler = prof.get_int( "NHANDLER", "HANDLERS" ); // prof + + for ( i = 1; i <= numhandler; i ++ ) + { + TString16 chiave; + chiave.format( "%d", i ); + TToken_string riga = prof.get( chiave, "HANDLERS" ); + user_set_handler( riga.get_int( 0 ), riga.get_int( 1 ) ); + } + + TCodgiac_livelli l; + + for ( i = MAX_GIAC_LEVEL; i > 0; i--) + { + const short pos = _sheet->cid2index(FR_LIV1 + i -1); + if (l.enabled(i)) + { + const TString & header = l.name(i); + const int len = header.len() + 1; + const int f_len = l.code_length(i); + _doc.set_liv_giac_len(i, f_len); + + _sheet->set_column_header(pos, l.name(i)); + _sheet->set_column_width(pos, (len > f_len ? len : f_len) * 8); + } + else + { + _sheet->delete_column(pos); + _doc.set_liv_giac_len(i, 0); + } + } + +// configurazione campi + + TConfig cfg(CONFIG_DITTA, "ve"); + const bool gesval = cfg.get_bool("GESVAL"); + const bool gescambi = cfg.get_bool("GESVALAC"); + + if (gesval) + { + show(F_CODVAL, !gescambi); + show(F_DATACAMBIO, !gescambi); + show(F_NOMEVAL, !gescambi); + show(F_CODVAL1, gescambi); + show(F_DATACAMBIO1, gescambi); + show(F_NOMEVAL1, gescambi); + show(F_CAMBIO); + } + else + { + disable(F_CODVAL); + disable(F_DATACAMBIO); + disable(F_NOMEVAL); + hide(F_CODVAL1); + hide(F_DATACAMBIO1); + hide(F_NOMEVAL1); + disable(F_CAMBIO); + } + + const bool geslin = cfg.get_bool("GESLIN"); + + enable(F_CODLIN, geslin); + enable(F_DESLIN, geslin); + + const bool geslis = cfg.get_bool("GES", "ve", 1); + const bool gesliscatven = cfg.get_bool("GESLISCV"); + + if (geslis) + { + show(F_CODLIST, !gesliscatven); + show(F_CODLIST1, gesliscatven); + } + else + { + disable(F_CODLIST); + hide(F_CODLIST1); + } + + const bool gescontr = cfg.get_bool("GES", "ve", 2); + const bool gescontrcli = cfg.get_bool("GESCONCC"); + + if (gescontr) + { + show(F_CODCONT1, gescontrcli); + show(F_CODCONT, !gescontrcli); + } + else + { + disable(F_CODCONT); + hide(F_CODCONT1); + } + + const bool gesoff = cfg.get_bool("GES", "ve", 3); + enable(F_CODCAMP, gesoff); + + const bool gessco = cfg.get_char("GESSCO") != 'N'; + enable(F_SCONTOPERC, gessco); + + const bool gesage = cfg.get_bool("GESAGE"); + enable(F_CODAG, gesage); + enable(F_DESAG, gesage); + enable(F_CODAGVIS, gesage); + enable(F_DESAGVIS, gesage); + + const bool has_movmag = dongle().active(MGAUT) && _doc.tipo().mov_mag(); + pos = id2pos(F_CAUSMAG); + if (pos >= 0) + fld(pos).show(has_movmag); + pos = id2pos(F_DESCRMAG); + if (pos >= 0) + fld(pos).show(has_movmag); + pos = id2pos(F_CAUSMAGC); + if (pos >= 0) + fld(pos).show(has_movmag); + pos = id2pos(F_DESCRMAGC); + if (pos >= 0) + fld(pos).show(has_movmag); + +} + +TDocumento_mask::~TDocumento_mask() +{ + if (_condv) + delete _condv; +} + +void TDocumento_mask::configura_sheet( TSheet_field& sheet, TConfig& config ) +{ + TBit_array to_delete(MAX_COLUMNS); + to_delete.set(); + int ncols = config.get_int( "NCOLS", "SHEET" ); + for ( int i = 1; i <= ncols; i ++ ) + { + TString col; + col.format( "%d", i ); + TToken_string sheet_col( config.get( col, "SHEET" ) ); + const int field_id = sheet_col.get_int(0); + const int coltomove = sheet.cid2index(field_id); + to_delete.reset(coltomove); + + const TString descr(sheet_col.get( 1 )); + + if (descr.not_empty() ) + sheet.set_column_header( field_id, descr); + + const int size( sheet_col.get_int(2)); + + if (size != 0) + sheet.set_column_width( field_id, size); + + } + to_delete.reset(0); + to_delete.reset(1); + + if (!to_delete[sheet.cid2index(FR_CODDEP)]) + sheet.enable_column(FR_CODDEP, _ges_dep && _ges_mag); + if (!to_delete[sheet.cid2index(FR_CODMAG)]) + sheet.enable_column(FR_CODMAG, _ges_mag); + if (!to_delete[sheet.cid2index(FR_CODDEPC)]) + sheet.enable_column(FR_CODDEPC, _ges_dep && _ges_mag); + if (!to_delete[sheet.cid2index(FR_CODMAGC)]) + sheet.enable_column(FR_CODMAGC, _ges_mag); + to_delete.set(sheet.cid2index(FR_CODARTMAG)); + to_delete.set(sheet.cid2index(FR_CHECKED)); + + const int sconto_col = sheet.cid2index(FR_SCONTO); + if (to_delete[sconto_col] == FALSE) + { + const bool del = config.get("GESSCORIGA") == "N"; + to_delete.set(sconto_col, del); + } + + for ( i = MAX_COLUMNS - 1; i >= 0; i-- ) + if( to_delete[i] ) + { + sheet.enable_column( i + FIRST_FIELD, FALSE); + sheet.delete_column( i + FIRST_FIELD); + } + +/* for ( i = 1; i <= ncols; i ++ ) + { + TString col; + col.format( "%d", i ); + TToken_string sheet_col( config.get( col, "SHEET" ) ); + const int field_id = sheet_col.get_int(0); + + sheet.move_column(field_id, i); + } */ +} + + +TCond_vendita& TDocumento_mask::condv() const +{ + if (_condv == NULL) + { + TDocumento_mask* myself = (TDocumento_mask*)this; + myself->_condv = new TCond_vendita(myself, NULL); + } + return *_condv; } void TDocumento_mask::next_page(int p) { + const bool was_normal_page = curr_page() < _progs_page; TMask::next_page(p); - if (curr_page() == _progs_page) + const bool is_calculated_page = curr_page() >= _progs_page; + + if (was_normal_page && is_calculated_page) { - begin_wait(); - TDocumento & curr_doc = doc(); - TDocumento & rel_doc = (TDocumento &) _rel->curr(); - - rel_doc = curr_doc; - autosave(*_rel); + TWait_cursor hourglass; + + for (int f = id2pos(BASE_PIEDE)-1; f >= 0; f--) + { + const TMask_field& mf = fld(f); + const TFieldref* fr = mf.field(); + if (fr) + _doc.put(fr->name(), mf.get()); + } + for (int i = _last_prog; i > 0; i--) { const short id = BASE_PIEDE + i; - const TString16 name(field(id).field()->name()); - - set(id , rel_doc.get(name)); + const TString& name = field(id).field()->name(); + const TString& val = _doc.get(name); + set(id, val); } - end_wait(); } } @@ -71,14 +317,19 @@ bool TDocumento_mask::on_key(KEY key) { if (key == K_SHIFT + K_F12) { - field(F_STATO).enable(!field(F_STATO).enabled()); + TMask_field& stato = field(F_STATO); +// stato.enable(!stato.enabled()); + stato.enable(); + enable(DLG_SAVEREC); return TRUE; } return TVariable_mask::on_key(key); } -void TDocumento_mask::occ2mask(TOccasionale & o) +void TDocumento_mask::occ2mask() { + const TOccasionale& o = doc().occas(); + reset(F_COFI); reset(F_PAIVA); set(F_OCFPI, o.get(OCC_CFPI)); @@ -110,8 +361,11 @@ void TDocumento_mask::occ2mask(TOccasionale & o) check_field(F_STATOSP); } -void TDocumento_mask::cli2mask( TCli_for & c, TOccasionale & o, TConfig & ditta) +void TDocumento_mask::cli2mask() { + TCli_for & c = doc().clifor(); + TOccasionale & o = doc().occas(); + const bool onload = !is_running(); const TString16 codval(get(F_CODVAL)); const TString16 datacambio(get(F_DATACAMBIO1)); @@ -169,21 +423,33 @@ void TDocumento_mask::cli2mask( TCli_for & c, TOccasionale & o, TConfig & ditta) pos = id2pos(F_CODLIST); const TString & codlist = ven_rec.get(CFV_CODLIST); if (pos >= 0 && fld(pos).active()) - fld(pos).set(codlist); + { + TEdit_field & f = (TEdit_field&) fld(pos); + + f.set(codlist); + f.check(); + f.on_hit(); + } pos = id2pos(F_CODLIST1); if (pos >= 0 && fld(pos).active()) - fld(pos).set(codlist); + { + TEdit_field & f = (TEdit_field&) fld(pos); + + f.set(codlist); + f.check(); + f.on_hit(); + } pos = id2pos(F_CODAG); if (pos >= 0 && fld(pos).active()) fld(pos).set(ven_rec.get(CFV_CODAG)); set(F_CODZON, ven_rec.get(CFV_CODZONA)); set(F_RAGGR, ven_rec.get(CFV_RAGGDOC)); - sconto_testa2mask(c, ditta); - spese2mask(c); + sconto_testa2mask(); + spese2mask(); } enable( F_CODINDSP , !occas); if (occas) - occ2mask(o); + occ2mask(); else { set(F_COFI, c.get(CLI_COFI)); @@ -240,15 +506,23 @@ void TDocumento_mask::cli2mask( TCli_for & c, TOccasionale & o, TConfig & ditta) check_field( F_CODVETT3 ); check_field( F_CATVEN ); check_field( F_CODZON ); - const bool gescontr = ditta.get_bool("GES", "ve", 2); + const bool contr_enabled = ven_rec.get_bool(CFV_GESTCONTR); + bool gescontr = FALSE; + if (contr_enabled) + { + TConfig ditta(CONFIG_DITTA, "ve"); + gescontr = ditta.get_bool("GES", "ve", 2); + } enable(F_CODCONT1, contr_enabled && gescontr); enable(F_CODCONT, contr_enabled && gescontr); } -void TDocumento_mask::sconto_testa2mask( TCli_for & c, TConfig & ditta ) +void TDocumento_mask::sconto_testa2mask() { + TCli_for & c = doc().clifor(); + TConfig ditta(CONFIG_DITTA, "ve"); const char tipogestione = ditta.get("GESSCO", "ve")[ 0 ]; switch( tipogestione ) { @@ -304,9 +578,10 @@ void TDocumento_mask::sconto_testa2mask( TCli_for & c, TConfig & ditta ) return; } -void TDocumento_mask::spese2mask(TCli_for & c) +void TDocumento_mask::spese2mask() { TSheet_field & sh = (TSheet_field &) field(F_SHEET); + TCli_for & c = doc().clifor(); TString16 name("CODSP0"); TString_array spese; @@ -324,3 +599,606 @@ void TDocumento_mask::spese2mask(TCli_for & c) doc().update_spese_aut(spese, FALSE, &sh); sh.force_update(); } + +void TDocumento_mask::doc2mask() +{ + for (int p = fields()-1; p >= 0; p--) + { + TMask_field& f = fld(p); + const TFieldref* fr = f.field(); + if (fr) + f.set(fr->read(doc())); + } + + cli2mask(); + + TSheet_field& s = sfield(F_SHEET); + s.destroy( ); + for (int i = 0; i < doc().physical_rows(); i++) + { + s.insert(-1, FALSE); + TToken_string& r = s.row(i); + doc()[i+1].autoload(s); + s.check_row(i ); + } + s.force_update(); +} + +void TDocumento_mask::mask2doc() +{ + for (int p = fields()-1; p >= 0; p--) + { + TMask_field& f = fld(p); + const TFieldref* fr = f.field(); + if (fr) + fr->write(f.get(), doc()); + } +} + + +/////////////////////////////////////////////////////////// +// Handlers and notifiers +/////////////////////////////////////////////////////////// + +bool TDocumento_mask::ss_notify( TSheet_field& ss, int r, KEY key ) +{ + TDocumento_mask& m = (TDocumento_mask&)ss.mask(); + TDocumento& doc = m.doc(); + + if ( key == K_ENTER ) // modifica + { + TRiga_documento & riga = doc[r + 1]; + riga.autosave(ss); + } + else + if ( key == K_DEL ) // Cancellazione + { + doc.destroy_row(r + 1, TRUE); + if (r < doc.rows()) + { + TRiga_documento & riga = doc[r + 1]; + if (riga.is_omaggio() && riga.is_generata()) + { + ss.destroy(r + 1); + doc.destroy_row(r + 1, TRUE); + } + } + } + else + if (key == K_INS) // Inserimento + { + if (r < doc.rows()) + { + TRiga_documento & riga = doc[r + 1]; + if (riga.is_omaggio() && riga.is_generata()) + return FALSE; + } + doc.insert_row(r + 1, m.get( F_LBTIPORIGA )); + } + else + if (key == K_CTRL + K_INS) + { + TRiga_documento & riga = doc[r + 1]; + TRectype & ven_rec = doc.clifor().vendite(); + TString16 s(ven_rec.get(CFV_CODMAG)); + if (s.not_empty()) + { + s.left_just(3); + s << ven_rec.get(CFV_CODDEP); + } + else + { + s = m._std_mag; + s.left_just(3); + s << m._std_dep; + } + riga.put("CODMAG", s); + riga.autoload(ss); + ss.check_row(r); + ss.select(r); + } + else + if ( key == K_TAB ) // modifica + set_curr_um(ss.sheet_mask()); + + return TRUE; +} + +// Funzione che dato il profilo di riga ottiene la maschera +// Serve per ottenere una maschera diversa per ogni riga +TMask* TDocumento_mask::ss_getmask(int numriga, TMask& fullmask) +{ + TSheet_field* sf = fullmask.get_sheet(); + TDocumento_mask& m = (TDocumento_mask&)sf->mask(); + const TDocumento& doc = m.doc(); + + const int n = numriga + 1; + if (n <= doc.physical_rows()) + { + const TRiga_documento& riga = doc[numriga + 1]; + return riga.tipo().mask(); + } + else + return &fullmask; +} + +bool TDocumento_mask::occas_code_handler(TMask_field& f, KEY key) +{ + if (key == K_TAB && f.focusdirty()) + { + const char* code = f.get(); + if (*code) + { + TRelation occas(LF_OCCAS); + occas.lfile().put("CFPI", code); + if (occas.read(_isequal) == NOERR) + { + TMask& m = f.mask(); + m.autoload(occas); + m.send_key(K_TAB, O_COMUNE); // Forza decodifica comuni + m.send_key(K_TAB, O_COMUNENAS); + } + } + } + return TRUE; +} + +bool TDocumento_mask::occas_handler( TMask_field& f, KEY key ) +{ + TDocumento_mask & m = (TDocumento_mask &)f.mask(); + if ( key == K_SPACE && m.is_running( ) ) + { + TDocumento& doc = m.doc(); + TOccasionale& occ = doc.occas(); + + TMask occas_mask("ve0100o"); + occas_mask.set_handler( O_CODICE, occas_code_handler ); + + for (int i = occas_mask.fields() - 1; i >= 0; i--) + { + TMask_field & f = occas_mask.fld(i); + const TFieldref * c = f.field(); + if (c) + f.set(c->read(occ)); + } + if (occas_mask.run() != K_ESC) + { + const TString ocfpi(occas_mask.get(O_CODICE)); + doc.put("OCFPI", ocfpi); + m.set(F_OCFPI, ocfpi); + + for (int i = occas_mask.fields() - 1; i >= 0; i--) + { + TMask_field & f = occas_mask.fld(i); + TFieldref * c = (TFieldref *) f.field(); + if (c) + c->write(f.get(), occ); + } + m.occ2mask(); + } + f.set_focus( ); + } + return TRUE; +} + +bool TDocumento_mask::clifo_handler( TMask_field& f, KEY key ) +{ + if (key != K_ENTER && f.to_check(key, TRUE)) + { + TDocumento_mask & m = (TDocumento_mask &) f.mask(); + TDocumento & d = m.doc(); + const TString & val = f.get(); + + d.put("TIPOCF", d.tipo().tipocf()); + d.put("CODCF", atol(val)); + + TCli_for & cli_for = d.clifor(); + cli_for.put(CLI_CODCF, ""); // force reload + + if ( cli_for.get_bool("SOSPESO") ) + return f.error_box( "Il codice '%ld' e' sospeso e non puo' essere utilizzato", atol(val) ); + m.cli2mask(); + if (cli_for.occasionale()) + { + TOccasionale & occas = d.occas(); + if(m.id2pos(F_OCCASEDIT) > 0 && f.to_check(key) && *(occas.codice()) == '\0') + m.send_key( K_SPACE, F_OCCASEDIT ); // Lancia maschera occasionali + } + else + d.zero("OCFPI"); + } + return TRUE; +} + +/////////////////////////////////////////////////////////// +// TElabora_mask +/////////////////////////////////////////////////////////// + +class TElabora_mask : public TMask +{ + TMask * _main; + TLista_elaborazioni _elab; + // @access Public Member +public: + void update_list(); + void update_ndoc_filter(); + bool elabora(); + TElaborazione * curr_elab(); + 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 ); + // @cmember Costruttore (crea la maschera leggendo la descrizione dal file .msk) + TElabora_mask(const char* title, TMask * main_mask); + // @cmember Distruttore + virtual ~TElabora_mask() {} +}; + +void TElabora_mask::update_list() +{ + TString_array elabs; + const TString16 tipo(_main->get(F_TIPODOC)); + const TString16 stato(_main->get(F_STATO)); + const TString16 tipo_elab(get(F_TIPODOC_ELAB)); + const TString16 stato_elab(get(F_STATODOC_ELAB)); + const bool from_elab = !get_bool(F_TYPE); + int items = 0; + + if (from_elab) + items = _elab.select(elabs, tipo, stato, tipo_elab, stato_elab) ; + else + items = _elab.select(elabs, tipo_elab, stato_elab, tipo, stato) ; + + const bool ok = items > 0; + + enable(DLG_OK, ok); + enable(F_ELAB, ok); + + TList_field & f = (TList_field &) field(F_ELAB); + TToken_string codes; + TToken_string descrs; + + if (ok) + for (int i = 0; i < items; i++) + { + codes.add(format("%s", (const char *)_elab[elabs.row(i)].codice())); + descrs.add((const char *)_elab[elabs.row(i)].descrizione()); + } + f.replace_items(codes, descrs); +} + + +/* TLista_elaborazioni TElabora_mask::_elab; */ + +bool TElabora_mask::elabora() +{ + bool update_mask = FALSE; + + TLista_documenti in; + TLista_documenti out; + TDocumento & app_doc = ((TDocumento_mask *)_main)->doc(); + long numdoc = get_long(F_NDOC_ELAB); + + TDocumento d(*get(F_PROVV_ELAB), get_int(F_ANNO_ELAB), get(F_CODNUM_ELAB), numdoc); + + if (numdoc <= 0) + { + TDocumento::copy_data(d.head(), app_doc.head()); + d.put(DOC_TIPODOC, get(F_TIPODOC_ELAB)); + } + + const bool from_elab = !get_bool(F_TYPE); + TElaborazione * e = curr_elab(); + + if (e == NULL) + return FALSE; + + if (from_elab) + { + in.add(app_doc); + out.add(d); + if (e->elabora(in, out, TDate(TODAY), TRUE)) + { + if (out[0] != d) + out.rewrite(); + if (in[0] != app_doc) + { + in.rewrite(); + app_doc = in[0]; + update_mask = TRUE; + } + } + } + else + { + out.add(app_doc); + in.add(d); + if (e->elabora(in, out, TDate(TODAY), TRUE)) + { + if (out[0] != app_doc) + { + out.rewrite(); + app_doc = out[0]; + update_mask = TRUE; + } + if (in[0] != d) + in.rewrite(); + } + } + return update_mask; +} + +TElaborazione * TElabora_mask::curr_elab() +{ + const TString16 cod_elab(get(F_ELAB)); + return cod_elab.not_empty() ? &_elab[cod_elab] : NULL; +} + +void TElabora_mask::update_ndoc_filter() +{ + TString filter(80); + filter.format("(TIPOCF==\"%s\")&&(CODCF==\"%s\")", (const char *)get(F_TIPOCF_ELAB), (const char *)get(F_CODCF_ELAB)); + const TString16 tipo(get(F_TIPODOC_ELAB)); + TElaborazione * e = curr_elab(); + + if (e != NULL) + { + if (tipo.not_empty()) + { + filter << format("&&(TIPODOC==\"%s\")", (const char *)tipo); + const int stato = get_int(F_STATODOC_ELAB); + if (stato != 0) + filter << format("&&(STATO==\"%d\")", stato); + else + { + bool almost_one = FALSE; + + for (int i = 0; i < TElaborazione::_max_tipi_doc_elab; i++) + { + const TString16 tipo_in(e->tipo_iniziale(i)); + const char stato_in = e->stato_iniziale(i); + + if (tipo == tipo_in && stato_in > '0') + { + if (almost_one) + filter << "||"; + else + filter << "&&("; + almost_one = TRUE; + + filter << format("(STATO==\"%c\")", stato_in); + } + } + if (almost_one) + filter << ')'; + } + } + else + { + bool almost_one = FALSE; + + for (int i = 0; i < TElaborazione::_max_tipi_doc_elab; i++) + { + const TString16 tipo_in(e->tipo_iniziale(i)); + + if (tipo_in.not_empty()) + { + if (almost_one) + filter << "||"; + else + filter << "&&("; + almost_one = TRUE; + filter << format("((TIPODOC==\"%s\")", (const char *)tipo_in); + + const char stato_in = e->stato_iniziale(i); + + if (stato_in > '0') + filter << format("&&(STATO==\"%c\")", stato_in); + filter << ')'; + } + } + if (almost_one) + filter << ')'; + } + } + efield(F_NDOC_ELAB).browse()->set_filter(filter); +} + +bool TElabora_mask::tipo_elaborazione_handler( TMask_field& f, KEY key ) +{ + if (key == K_SPACE) + { + TElabora_mask & m = (TElabora_mask &) f.mask(); + m.update_list(); + m.update_ndoc_filter(); + } + return TRUE; +} + +bool TElabora_mask::tipo_documento_handler( TMask_field& f, KEY key ) +{ + if (f.to_check(key, TRUE)) + { + TElabora_mask & m = (TElabora_mask &) f.mask(); + m.update_list(); + m.update_ndoc_filter(); + } + return TRUE; +} + +bool TElabora_mask::codnum_handler( TMask_field& f, KEY key ) +{ + if (f.to_check(key, TRUE)) + { + TElabora_mask & m = (TElabora_mask &) f.mask(); + m.update_ndoc_filter(); + } + return TRUE; +} + +TElabora_mask::TElabora_mask(const char* title, TMask * main_mask) + : TMask(title), _main(main_mask) +{ + 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(F_ANNO_ELAB, _main->get(F_ANNO)); + set(F_TIPOCF_ELAB, _main->get(F_TIPOCF)); + set(F_CODCF_ELAB, _main->get(F_CODCF)); +} + +bool TDocumento_mask::elabora_handler( TMask_field& f, KEY key ) +{ + if (key == K_SPACE) + { + TDocumento_mask& m = (TDocumento_mask&)f.mask(); + if (m.check_fields()) // Check values + { + TElabora_mask selection("ve0100b", &m); + if (selection.run() == K_ENTER) + { + m.mask2doc(); + bool update_mask = selection.elabora(); + if (update_mask) + m.doc2mask(); + } + } + } + return TRUE; +} + +bool TDocumento_mask::print_handler( TMask_field& f, KEY key ) +{ + if (key == K_SPACE) + main_app().print(); + return TRUE; +} + +void TDocumento_mask::user_set_handler(int fieldid, int index) +{ + switch( index ) + { + case 1: + set_handler( fieldid, ora_hndl ); + break; + case 3: + set_handler( fieldid, dummy_hndl ); + break; + default: + CHECK( FALSE, "Tentativo di installare un handler non definito" ); + break; + } +} + +bool TDocumento_mask::num_handler( TMask_field& f, KEY key ) +{ + if (key == K_TAB && f.to_check(key, TRUE)) + { + // Ottengo la maschera + TDocumento_mask& m = (TDocumento_mask&)f.mask( ); + + TTable & tabnum = ((TTable &) ((TEdit_field &)f).browse()->cursor()->file()); + if ( tabnum.good()) + { + TCodice_numerazione cod_num(tabnum.curr()); + m.set( F_DESNUM, cod_num.descrizione()); + // 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 + if (cod_num.num_provv()) + { + // Setta di default la numerazione provvisoria + m.set( F_PROVV, "P" ); + // Abilita il campo per la selezione della numerazione + m.enable( F_PROVV ); + } + else // Altrimenti ... + { + // Setta la numerazione a definitiva + m.set( F_PROVV, "D" ); + // Disabilita il campo per la selezione della numerazione + m.disable( F_PROVV ); + } + } + else + { + m.set( F_DESNUM, "" ); + m.set( F_TIPODOC, "" ); + } + } + return TRUE; +} + +bool TDocumento_mask::tip_handler( TMask_field& f, KEY key ) +{ + TDocumento_mask& m = (TDocumento_mask&)f.mask( ); + if ( key == K_TAB && m.is_running() && m.get(F_TIPODOC).not_empty()) + { + TCodice_numerazione cod_num(m.get(F_CODNUM)); + const TString& tipo = f.get(); + int last = cod_num.ntipi_doc(); + for (int i = 0; i < last; i++ ) + { + const TString16 curtipo(cod_num.tipo_doc(i)); + if (curtipo == tipo) + return TRUE; + } + return f.error_box( "Tipo non valido per la numerazione selezionata!" ); + } + return TRUE; +} + +bool TDocumento_mask::codlist_handler( TMask_field& f, KEY key ) +{ + if (key == K_TAB && f.focusdirty()) + { + TLocalisamfile & list = ((TEdit_field &) f).browse()->cursor()->file(); + const TDate datadoc(f.mask().get(F_DATADOC)); + const TDate datascad(list.get_date("VALFIN")); + + if (datascad.ok() && datadoc > datascad) + { + const TString16 codsucc(list.get("CODLISSUCC")); + + if (codsucc.empty()) + return error_box("Listino scaduto il %s", datascad.string()); + else + { + f.set(codsucc); + f.set_focusdirty(); + ((TEdit_field &)f).check(); + } + } + } + return TRUE; +} + +bool TDocumento_mask::codcont_handler( TMask_field& f, KEY key ) +{ + if (key == K_TAB && f.focusdirty()) + { + TLocalisamfile & cont = ((TEdit_field &) f).browse()->cursor()->file(); + const TDate datadoc(f.mask().get(F_DATADOC)); + const TDate datascad(cont.get_date("VALFIN")); + + if (datascad.ok() && datadoc > datascad) + return error_box("Contratto scaduto il %s", datascad.string()); + } + return TRUE; +} + +bool TDocumento_mask::codcamp_handler( TMask_field& f, KEY key ) +{ + if (key == K_TAB && f.focusdirty()) + { + TLocalisamfile & camp = ((TEdit_field &) f).browse()->cursor()->file(); + const TDate datadoc(f.mask().get(F_DATADOC)); + const TDate datascad(camp.get_date("VALFIN")); + + if (datascad.ok() && datadoc > datascad) + return error_box("Offerta scaduta il %s", datascad.string()); + } + return TRUE; +} diff --git a/ve/veprassi.men b/ve/veprassi.men index 115c3f651..ca63a3d2c 100755 --- a/ve/veprassi.men +++ b/ve/veprassi.men @@ -23,9 +23,9 @@ Caption = "Servizi" Picture = Module = 0 Flags = "" -Item_02 = "Cambiamento stato documento", "disabled", "F" -Item_03 = "Stampa riepilogo documenti immessi", "ve1 -0 L", "F" -Item_04 = "Scarico e ripristino documenti", "ve5 -0", "F" +Item_01 = "Stampa riepilogo documenti immessi", "ve1 -0 L", "F" +Item_02 = "Scarico e ripristino documenti", "ve5 -0", "F" +Item_03 = "Cambiamento stato documenti", "ve5 -1", "F" [PRASSIVE_052] Caption = "Configurazione" diff --git a/ve/vepriv.h b/ve/vepriv.h index bf7fde923..5b9fcbb51 100755 --- a/ve/vepriv.h +++ b/ve/vepriv.h @@ -1,11 +1,7 @@ #ifndef __VEPRIV_H #define __VEPRIV_H -#ifndef __MASK_H -#include -#endif - -enum _formule {_somma, _bolli, _bolli_int, _spinc, _prezzo, _importo, _imponibile, _sconto, _iva, _provv, _tipo, _imponibili, _imposte, _totprovv}; +enum _formule {_somma, _bolli, _bolli_int, _spinc, _prezzo, _importo, _imponibile, _sconto, _iva, _provv, _qtares, _valdoc, _tipo, _imponibili, _imposte, _totprovv}; enum TTipo_calcolo { _nessun_calcolo, _qtaprezzo, _valore, _percentuale, _scontoimp, _scontoperc}; void row_set_handler( TMask& m, const int field, const int index ); diff --git a/ve/verig.h b/ve/verig.h index d9608d8a2..c3b7d0224 100755 --- a/ve/verig.h +++ b/ve/verig.h @@ -60,9 +60,16 @@ #define FR_CODMAGC 128 #define FR_CODDEPC 129 // CODARTMAG CHECKED da non definire -#define FR_CODARTMAG 130 -#define FR_CHECKED 131 -#define FR_END 132 +#define FR_DATACONS 130 +#define FR_CODARTMAG 131 +#define FR_CHECKED 132 +#define FR_CHECKED 132 +#define FR_QTAGG1 133 +#define FR_QTAGG2 134 +#define FR_QTAGG3 135 +#define FR_QTAGG4 136 +#define FR_QTAGG5 137 +#define FR_END 138 #define MAX_COLUMNS FR_END-FR_STATORIGA #define FR_DESMAG 150 diff --git a/ve/verig.uml b/ve/verig.uml index 6eb3cf0dc..f6ba07eb4 100755 --- a/ve/verig.uml +++ b/ve/verig.uml @@ -1135,6 +1135,66 @@ END ENDIF ENDIF +IF(defined(F_QTAGG1)) +NUMBER FR_QTAGG1 13 5 +BEGIN +IFDEF(X_QTAGG1) + PROMPT X_QTAGG1 Y_QTAGG1 PR_QTAGG1 +ELSEIF + PROMPT 15 23 "Qta' agg.1 " +ENDIF + FIELD QTAGG1 +END +ENDIF + +IF(defined(F_QTAGG2)) +NUMBER FR_QTAGG2 13 5 +BEGIN +IFDEF(X_QTAGG2) + PROMPT X_QTAGG2 Y_QTAGG2 PR_QTAGG2 +ELSEIF + PROMPT 38 23 "2 " +ENDIF + FIELD QTAGG2 +END +ENDIF + +IF(defined(F_QTAGG3)) +NUMBER FR_QTAGG3 13 5 +BEGIN +IFDEF(X_QTAGG3) + PROMPT X_QTAGG3 Y_QTAGG3 PR_QTAGG3 +ELSEIF + PROMPT 53 23 "3 " +ENDIF + FIELD QTAGG3 +END +ENDIF + +IF(defined(F_QTAGG4)) +NUMBER FR_QTAGG4 13 5 +BEGIN +IFDEF(X_QTAGG4) + PROMPT X_QTAGG4 Y_QTAGG4 PR_QTAGG4 +ELSEIF + PROMPT 68 23 "4 " +ENDIF + FIELD QTAGG4 +END +ENDIF + +IF(defined(F_QTAGG5)) +NUMBER FR_QTAGG5 13 5 +BEGIN +IFDEF(X_QTAGG5) + PROMPT X_QTAGG5 Y_QTAGG5 PR_QTAGG5 +ELSEIF + PROMPT 25 24 "5 " +ENDIF + FIELD QTAGG5 +END +ENDIF + #ifndef FULL_SCREEN BUTTON DLG_OK 9 2 BEGIN diff --git a/ve/verig00.uml b/ve/verig00.uml index 027e4520c..e05664082 100755 --- a/ve/verig00.uml +++ b/ve/verig00.uml @@ -30,6 +30,11 @@ DEFINE_FIELD(CODMAGC) DEFINE_FIELD(DESMAGC) DEFINE_FIELD(CODDEPC) DEFINE_FIELD(DESDEPC) - +DEFINE_FIELD(DATACONS) +DEFINE_FIELD(QTAGG1) +DEFINE_FIELD(QTAGG2) +DEFINE_FIELD(QTAGG3) +DEFINE_FIELD(QTAGG4) +DEFINE_FIELD(QTAGG5) #include "verig.uml" diff --git a/ve/veuml.h b/ve/veuml.h index fbe7c3a98..f35ff651d 100755 --- a/ve/veuml.h +++ b/ve/veuml.h @@ -71,7 +71,6 @@ #define F_LBTIPORIGA 175 // GESTITO DAL MOTORE #define F_DESTIPODOC 176 // GESTITO DAL MOTORE #define F_DESCF 177 // GESTITO DAL MOTORE -#define DLG_ELABORA 178 // GESTITO DAL MOTORE: bottone Elabora #define F_ATTIVAANNO 179 // GESTITO DAL MOTORE #define F_OCCASEDIT 180 // GESTITO DAL MOTORE #define F_CATVEN 181