From 6b39ab9e24eeb4d6895e624f544a48fba5eb225c Mon Sep 17 00:00:00 2001 From: guy <guy@c028cbd2-c16b-5b4b-a496-9718f37d4682> Date: Thu, 9 Aug 2012 14:31:57 +0000 Subject: [PATCH] Corretta gestione occasionali. Corretta gestione valori di default in sede di cambio tipo riga git-svn-id: svn://10.65.10.50/branches/R_10_00@22718 c028cbd2-c16b-5b4b-a496-9718f37d4682 --- ve/clifor.cpp | 7 ++- ve/clifor.h | 2 - ve/ve0100.cpp | 73 +++++++++++++++++++++--------- ve/ve0100o.uml | 2 - ve/ve2800.cpp | 118 ++++++++++++++++++++++++++++++++++++++++++------- ve/ve2800.h | 5 ++- ve/ve2800a.uml | 34 +++++++++++--- ve/ve2800b.uml | 76 +++++++++++++++++++++++++++++++ ve/velib03.cpp | 23 ++++------ ve/velib06.cpp | 7 ++- 10 files changed, 280 insertions(+), 67 deletions(-) create mode 100644 ve/ve2800b.uml diff --git a/ve/clifor.cpp b/ve/clifor.cpp index aa0dd74c4..c11fc2c40 100755 --- a/ve/clifor.cpp +++ b/ve/clifor.cpp @@ -1,10 +1,9 @@ #include <applicat.h> #include <modaut.h> -#include <relation.h> -#include "clifor.h" -#include "condv.h" #include "velib.h" + +#include "condv.h" #include "../li/letint.h" #include "../cg/cfban.h" @@ -51,7 +50,7 @@ TRectype& TCli_for::vendite() const const char t = tipo(); const long c = codice(); - if (_ven_rec.empty() || t != *(const char *) (*_ven_tipo) || c != (long) *_ven_codice) + 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 diff --git a/ve/clifor.h b/ve/clifor.h index 8255709fd..45851b8bf 100755 --- a/ve/clifor.h +++ b/ve/clifor.h @@ -50,8 +50,6 @@ class TCli_for : public TMultiple_rectype bool _extended; bool _lettera_found; - - protected: virtual int write_rewrite(TBaseisamfile& f, bool re = FALSE) const; void init(); diff --git a/ve/ve0100.cpp b/ve/ve0100.cpp index 201a92807..0f03be270 100755 --- a/ve/ve0100.cpp +++ b/ve/ve0100.cpp @@ -14,10 +14,10 @@ #include "veuml1.h" #include "verig.h" #include "velib04.h" +#include "../mg/mglib.h" #include "sconti.h" -#include "../mg/anamag.h" -#include "../mg/mglib.h" +#include <occas.h> TCursor& TMotore_application::get_filtered_cursor() const { @@ -752,8 +752,8 @@ void TMotore_application::sheet2ini(TSheet_field &sheet,TConfig& ini) for (r = 1; r <= sheet.items(); r++) { defpar.format("%d,%d",LF_RIGHEDOC,r); - const TMask * sm = m.riga_mask(r-1); - const TToken_string rigar = sheet.row(r-1); + const TMask* sm = m.riga_mask(r-1); + const TToken_string& rigar = sheet.row(r-1); for (int sf = 0; sf < sm->fields(); sf++) { TMask_field& campo = sm->fld(sf); @@ -765,8 +765,7 @@ void TMotore_application::sheet2ini(TSheet_field &sheet,TConfig& ini) if (str.empty()) str = " "; const word field_class = campo.class_id(); - if (field_class == CLASS_MEMO_FIELD || - field_class == CLASS_ZOOM_FIELD) + if (field_class == CLASS_MEMO_FIELD || field_class == CLASS_ZOOM_FIELD) { int p; while ((p = str.find('\n', 0)) >= 0) @@ -777,7 +776,7 @@ void TMotore_application::sheet2ini(TSheet_field &sheet,TConfig& ini) } if (campo.field()->name() == RDOC_PREZZO) { - TCodiceIVA c(sm->get(FR_CODIVA)); + const TCodiceIVA c(sm->get(FR_CODIVA)); TFieldref l; real prezzo(str); real prezzol; @@ -838,21 +837,41 @@ void TMotore_application::ini2mask(TConfig& ini, TMask& msk, bool query) key.add(msk.get(F_NDOC)); str = cache().get(LF_DOC, key, DOC_TIPODOC); } - campo.set(str); - + campo.set(str); } else { - TDocumento & d = doc(); - + TDocumento& d = doc(); d.put(DOC_TIPOCF, msk.get(F_TIPOCF)); d.put(DOC_CODCF, msk.get(F_CODCF)); + const TCli_for& c = d.clifor(); - const TCli_for & c = d.clifor(); - const TRectype & ven_rec = c.vendite(); - - ini.set_paragraph("33"); - + // Compilo dati occasionale se presenti + if (c.occasionale() && ini.set_paragraph("18")) // LF_OCCAS + { + const TString& ocfpi = ini.get(OCC_CFPI); + if (ocfpi.full()) + { + TLocalisamfile occas(LF_OCCAS); + TRectype& rec = occas.curr(); + rec.put(OCC_CFPI, ocfpi); + if (occas.read(_isequal, _lock) != NOERR) + rec.zero(); + TAssoc_array& vars = ini.list_variables(); + FOR_EACH_ASSOC_STRING(vars, obj, key, str) + { + if (rec.exist(key)) + rec.put(key, str); + } + if (occas.write_rewrite() == NOERR) + { + doc().put(DOC_OCFPI, ocfpi); + doc().occas() = rec; + } + } + } + + ini.set_paragraph("33"); if (!ini.exist(DOC_CODVAL)) { const TString4 codval = c.get(CLI_CODVAL); // Attenzione: Non usare TString& qui! @@ -885,7 +904,10 @@ void TMotore_application::ini2mask(TConfig& ini, TMask& msk, bool query) msk.set(F_BBAN_CONTO, iban.mid(15,12)); } } + // Setta i campi che appartengono al file LF_CFVEN + const TRectype& ven_rec = c.vendite(); + if (!ini.exist(DOC_CODABIP)) msk.set(F_CODABIP, ven_rec.get(CFV_CODABIPR), true); if (!ini.exist(DOC_CODCABP)) @@ -925,8 +947,8 @@ void TMotore_application::ini2mask(TConfig& ini, TMask& msk, bool query) if (!ini.exist(DOC_ZONA)) msk.set(F_CODZON, ven_rec.get(CFV_CODZONA), true); if (!ini.exist(DOC_CODLIST)) - msk.set(F_CODLIST, ven_rec.get(CFV_CODLIST), true); - + msk.set(F_CODLIST, ven_rec.get(CFV_CODLIST), true); + TSheet_field& f = msk.sfield(F_SHEET); TTipo_riga_documento tr; @@ -1038,7 +1060,7 @@ void TMotore_application::ini2mask(TConfig& ini, TMask& msk, bool query) if (!checked) //se non e' checked, il record viene autosalvato (in modo che sia salvato completamente) { - const TString & prezzo = ini.get(RDOC_PREZZO); + const TString& prezzo = ini.get(RDOC_PREZZO); if (prezzo.full()) f.row(f.items() - 1).add(prezzo, f.cid2index(FR_PREZZO)); rec.autosave(f); @@ -1051,15 +1073,20 @@ void TMotore_application::ini2mask(TConfig& ini, TMask& msk, bool query) bool TMotore_application::save_and_print(bool savedoc, TPrtype mode) { + static bool already_printing = false; + if (already_printing) + return false; + already_printing = true; + if (savedoc) { if (save(false)) edit_mask().update_father_rows(false); else - return false; + return already_printing = false; } - TDocumento& doc = (TDocumento&)get_relation()->curr(); + const TDocumento& doc = (const TDocumento&)get_relation()->curr(); const TTipo_documento& tipo = doc.tipo(); TFilename rep; @@ -1117,9 +1144,11 @@ bool TMotore_application::save_and_print(bool savedoc, TPrtype mode) else { rep.ext(""); - return error_box("Il profilo %s non esiste", (const char*)rep); + error_box("Il profilo %s non esiste", (const char*)rep); + return already_printing = false; } + already_printing = false; return true; } diff --git a/ve/ve0100o.uml b/ve/ve0100o.uml index 23cc354a8..4369e3fee 100755 --- a/ve/ve0100o.uml +++ b/ve/ve0100o.uml @@ -54,7 +54,6 @@ END STRING O_STATOPAIV 2 BEGIN PROMPT 37 2 "Partita IVA " - FIELD STATOPAIV HELP "Codice ISO dello stato" FLAGS "U" USE %SCE @@ -148,7 +147,6 @@ BEGIN PROMPT 2 9 "Sesso " ITEM "M|Maschio" ITEM "F|Femmina" - FIELD SESSO END DATE O_DATANAS diff --git a/ve/ve2800.cpp b/ve/ve2800.cpp index 54f85340c..276b283c5 100644 --- a/ve/ve2800.cpp +++ b/ve/ve2800.cpp @@ -22,6 +22,7 @@ class TRicarico_listini_mask : public TAutomask TBit_array _dirty; bool _loading; TString4 _curlis; + TString _codart; // Nuovo articolo protected: virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); @@ -220,10 +221,16 @@ void TRicarico_listini_mask::load() } } } - s.force_update(); + + if (get(F_SORT) != "A") + send_key(K_SPACE, F_SORT); + else + s.force_update(); + _dirty.reset(); disable(DLG_SAVEREC); enable(DLG_RECALC); + set(F_RECORDS, s.items()); _loading = false; } @@ -268,14 +275,13 @@ bool TRicarico_listini_mask::import() rcondv.put(RCONDV_COD, _curlis); rcondv.put(RCONDV_TIPORIGA, "A"); rcondv.put(RCONDV_CODRIGA, codart); - if (rcondv.write() != NOERR) + if (rcondv.write() == NOERR) { msg = codart; - msg << TR(" articolo gi� a listino"); + msg << TR(" articolo inserito a listino"); log.log(1, msg); - } - else n++; + } } else { @@ -294,6 +300,41 @@ bool TRicarico_listini_mask::import() return n > 0; } +static int sort_by_artic(const TSortable& r1, const TSortable& r2, void* jolly) +{ + const TToken_string& row1 = (const TToken_string&)r1; + const TToken_string& row2 = (const TToken_string&)r2; + return xvt_str_compare_ignoring_case(row1, row2); +} + +static int sort_by_delta(const TSortable& r1, const TSortable& r2, void* jolly) +{ + const TSheet_field& s = *(TSheet_field*)jolly; + const int i = s.cid2index(F_DELTAPRICE); + const TToken_string& row1 = (const TToken_string&)r1; + const TToken_string& row2 = (const TToken_string&)r2; + real d1, d2; + row1.get(i, d1); + row2.get(i, d2); + if (d1 == d2) + return sort_by_artic(r1, r2, jolly); + return d1 > d2 ? +1 : -1; +} + +static int sort_by_price(const TSortable& r1, const TSortable& r2, void* jolly) +{ + const TSheet_field& s = *(TSheet_field*)jolly; + const int i = s.cid2index(F_OLDPRICE); + const TToken_string& row1 = (const TToken_string&)r1; + const TToken_string& row2 = (const TToken_string&)r2; + real p1, p2; + row1.get(i, p1); + row2.get(i, p2); + if (p1 == p2) + return sort_by_artic(r1, r2, jolly); + return p1 > p2 ? +1 : -1; +} + bool TRicarico_listini_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) { switch (o.dlg()) @@ -349,13 +390,15 @@ bool TRicarico_listini_mask::on_field_event(TOperable_field& o, TField_event e, real scontato = prezzo * (CENTO - sconto) / CENTO; scontato.round(2); real margine = (scontato > ZERO) ? CENTO * (scontato - costo) / scontato : ZERO; + margine.round(0); sm.set(o.dlg() + (F_NEWMARGIN-F_NEWPRICE), margine, 0x3); const real oldprice = sm.get(F_OLDPRICE); if (oldprice> ZERO) { const real newprice = sm.get(F_NEWPRICE); - const real delta = (newprice - oldprice) * CENTO / oldprice; + real delta = (newprice - oldprice) * CENTO / oldprice; + delta.round(0); sm.set(F_DELTAPRICE, delta); } const real deltam = sm.get_real(F_NEWMARGIN) - sm.get_real(F_OLDMARGIN); @@ -369,23 +412,66 @@ bool TRicarico_listini_mask::on_field_event(TOperable_field& o, TField_event e, set_dirty(); break; case se_query_add: - send_key(K_SPACE, DLG_NEWREC, &o); + if (_curlis.full()) + { + TMask m("ve2800b"); + m.set(F_CODLIS, _curlis, 0x3); + if (m.run() == K_ENTER) + { + _codart = m.get(F_FROMCOD); + return _codart.full(); + } + } + return false; + case se_notify_add: + if (_codart.full()) + { + TSheet_field& s = sfield(F_LISTINO); + TToken_string& r = s.row(jolly); + r = _codart; + TMask& m = s.sheet_mask(); + const TRectype& anamag = cache().get(LF_ANAMAG, _codart); + FOR_EACH_MASK_FIELD(m, i, f) + { + const TFieldref* fld = f->field(); + if (fld != NULL && fld->file() == LF_ANAMAG) + r.add(anamag.get(fld->name()), s.cid2index(f->dlg())); + } + _codart.cut(0); + return true; + } + return false; case se_query_del: return false; default: break; } break; + case F_SORT: + if (e == fe_modify) + { + TWait_cursor hourglass; + TSheet_field& s = sfield(F_LISTINO); + TArray& r = s.rows_array(); + switch (o.get()[0]) + { + case 'D': r.sort(sort_by_delta, &s); break; + case 'P': r.sort(sort_by_price, &s); break; + default : r.sort(sort_by_artic, &s); break; + } + s.force_update(); + } + break; case DLG_EDIT: if (e == fe_button && jolly == 1) - { - TMask& msk = o.mask(); - msk.reset(F_SCONTO); - msk.reset(F_COSTO); - msk.reset(F_RICARICO); - msk.reset(F_OLDPRICE); - } - break; + { + TMask& msk = o.mask(); + msk.reset(F_SCONTO); + msk.reset(F_COSTO); + msk.reset(F_RICARICO); + msk.reset(F_OLDPRICE); + } + break; case DLG_EXPORT: if (e == fe_button && jolly == 0) { @@ -471,7 +557,7 @@ bool TRicarico_listini::create() { Tdninst dninst; if (!dninst.can_I_run(true)) - return error_box(TR("Programma non autorizzato!")); + return error_box(TR("Programma personalizzato non autorizzato!")); TSheet_field::set_line_number_width(4); return TSkeleton_application::create(); } diff --git a/ve/ve2800.h b/ve/ve2800.h index fe3b8aa8c..99428049d 100644 --- a/ve/ve2800.h +++ b/ve/ve2800.h @@ -6,6 +6,8 @@ #define F_FROMDES 206 #define F_TOCOD 207 #define F_TODES 208 +#define F_SORT 209 +#define F_RECORDS 210 #define F_LISTINO 300 @@ -22,4 +24,5 @@ #define F_DELTAMARGIN 111 #define F_DESCFRA 112 #define F_DESCENG 113 -#define F_DESCDEU 114 \ No newline at end of file +#define F_DESCDEU 114 +#define F_CODARTALT 115 diff --git a/ve/ve2800a.uml b/ve/ve2800a.uml index 540140a95..dc399e106 100644 --- a/ve/ve2800a.uml +++ b/ve/ve2800a.uml @@ -101,6 +101,7 @@ BEGIN DISPLAY "Descrizione@20" DESCR DISPLAY "Costo" ULTCOS1 DISPLAY "Ricarico" USER3 + DISPLAY "Replaced by@20" CODARTALT OUTPUT F_FROMCOD CODART OUTPUT F_FROMDES DESCR CHECKTYPE SEARCH @@ -116,6 +117,7 @@ BEGIN DISPLAY "Codice@20" CODART DISPLAY "Costo" ULTCOS1 DISPLAY "Ricarico" USER3 + DISPLAY "Replaced by@20" CODARTALT COPY OUTPUT F_FROMCOD CHECKTYPE SEARCH END @@ -142,10 +144,23 @@ BEGIN CHECKTYPE SEARCH END +LIST F_SORT 1 10 +BEGIN + PROMPT 1 6 "Ordinamento " + ITEM "A|Articolo" + ITEM "D|Delta" + ITEM "P|Prezzo" +END + +NUMBER F_RECORDS 6 +BEGIN + PROMPT 47 6 "Righe di listino " + FLAGS "D" +END SPREADSHEET F_LISTINO BEGIN - PROMPT 0 6 "Listino" + PROMPT 0 7 "Listino" ITEM "Articolo@20" ITEM "Descrizione@30" ITEM "Sconto" @@ -160,6 +175,7 @@ BEGIN ITEM "Descrizione\nFrancese@30" ITEM "Descrizione\nInglese@30" ITEM "Descrizione\nTedesco@30" + ITEM "Replaced by@20" END ENDPAGE @@ -176,6 +192,13 @@ BEGIN FIELD CODRIGA END +STRING F_CODARTALT 20 +BEGIN + PROMPT 35 1 "Rep. by " + FLAGS "D" + FIELD LF_ANAMAG->CODARTALT +END + STRING F_DESCART 50 BEGIN PROMPT 1 2 "Descrizione " @@ -212,6 +235,7 @@ BEGIN OUTPUT F_RICARICO CODTAB CHEKTYPE NORMAL FIELD LF_ANAMAG->USER3 + FLAGS "U" END TEXT DLG_NULL @@ -242,25 +266,25 @@ BEGIN FLAGS "DUG" END -NUMBER F_DELTAPRICE 6 2 +NUMBER F_DELTAPRICE 4 BEGIN PROMPT 50 6 "" FLAGS "D" END -NUMBER F_OLDMARGIN 6 2 +NUMBER F_OLDMARGIN 4 BEGIN PROMPT 2 7 "@bMargine " FLAGS "D" END -NUMBER F_NEWMARGIN 6 2 +NUMBER F_NEWMARGIN 4 BEGIN PROMPT 32 7 "" FLAGS "D" END -NUMBER F_DELTAMARGIN 6 2 +NUMBER F_DELTAMARGIN 4 BEGIN PROMPT 50 7 "" FLAGS "D" diff --git a/ve/ve2800b.uml b/ve/ve2800b.uml new file mode 100644 index 000000000..1222a8ba5 --- /dev/null +++ b/ve/ve2800b.uml @@ -0,0 +1,76 @@ +#include "ve2800.h" + +PAGE "Nuovo articolo" -1 -1 54 6 + +STRING F_CODLIS 3 +BEGIN + PROMPT 1 1 "Listino " + USE LF_CONDV + INPUT TIPO "L" + INPUT COD F_CODLIS + DISPLAY "Codice" COD + DISPLAY "Descrizione@50" DESCR + DISPLAY "Valuta" CODVAL + OUTPUT F_CODLIS COD + OUTPUT F_DESLIS COD + CHECKTYPE REQUIRED + FLAGS "DUG" +END + +STRING F_DESLIS 50 +BEGIN + PROMPT 1 2 "" + FLAGS "D" +END + +STRING F_FROMCOD 20 +BEGIN + PROMPT 1 3 "Articolo " + USE ANAMAG SELECT LF_RCONDV->CODRIGA="" + JOIN LF_RCONDV INTO TIPO="L" COD=#F_CODLIS TIPORIGA="A" CODRIGA=CODART + INPUT CODART F_FROMCOD + DISPLAY "Codice@20" CODART + DISPLAY "Descrizione@20" DESCR + DISPLAY "Costo" ULTCOS1 + DISPLAY "Ricarico" USER3 + DISPLAY "Replaced by@20" CODARTALT + OUTPUT F_FROMCOD CODART + OUTPUT F_FROMDES DESCR + CHECKTYPE SEARCH + FLAGS "U" +END + +STRING F_FROMDES 50 +BEGIN + PROMPT 1 4 "" + USE ANAMAG KEY 2 SELECT LF_RCONDV->CODRIGA="" + JOIN LF_RCONDV INTO TIPO="L" COD=#F_CODLIS TIPORIGA="A" CODRIGA=CODART + INPUT DESCR F_FROMDES + DISPLAY "Descrizione@20" DESCR + DISPLAY "Codice@20" CODART + DISPLAY "Costo" ULTCOS1 + DISPLAY "Ricarico" USER3 + DISPLAY "Replaced by@20" CODARTALT + COPY OUTPUT F_FROMCOD + CHECKTYPE SEARCH +END + +ENDPAGE + +TOOLBAR "Toolbar" 0 0 0 2 + +BUTTON DLG_OK 2 2 +BEGIN + PROMPT 1 1 "" +END + +BUTTON DLG_CANCEL 2 2 +BEGIN + PROMPT 2 1 "" +END + +#include <helpbar.h> + +ENDPAGE + +ENDMASK diff --git a/ve/velib03.cpp b/ve/velib03.cpp index 0de1b3549..ba64bcfc7 100755 --- a/ve/velib03.cpp +++ b/ve/velib03.cpp @@ -2576,23 +2576,18 @@ TOccasionale& TDocumento::occas() const { const TString16 occ_code = cod_occas(); // Codice occasionale in testata - if (occ_code != _occas.codice()) + TOccasionale& rec = (TOccasionale&)_occas; + if (occ_code != rec.codice()) { -/* Antidiluvian mode TLocalisamfile o(LF_OCCAS); - ((TDocumento *) this)->_occas.zero(); - ((TDocumento *) this)->_occas.put(OCC_CFPI, occ_code); - TRectype oc(_occas); - if (((TDocumento *) this)->_occas.read(o) != NOERR) - ((TDocumento *) this)->_occas = oc; -*/ - // Postdiluvian mode - TRectype& o = (TRectype&)_occas; // Inganna const (una volta sola, non 4) - o = cache().get(LF_OCCAS, occ_code); // Ricerca tramite cache - if (o.empty()) // Occasionale cancellato per errore - o.put(OCC_CFPI, occ_code); // Ripristina almeno il codice + rec.put(OCC_CFPI, occ_code); + if (rec.read(o) != NOERR) + { + rec.zero(); + rec.put(OCC_CFPI, occ_code); + } } - return (TOccasionale&)_occas; + return rec; } const TAgente & TDocumento::agente(bool first) const diff --git a/ve/velib06.cpp b/ve/velib06.cpp index 6095fc95c..ae3fd0073 100755 --- a/ve/velib06.cpp +++ b/ve/velib06.cpp @@ -2032,10 +2032,15 @@ bool TDocumento_mask::occas_handler( TMask_field& f, KEY key ) if (c) f.set(c->read(occ)); } + + const TString& cf = occas_mask.get(O_COFI); + if (cf.full() && atoi(cf.mid(9, 2)) > 40) + occas_mask.set(O_SESSO, "F"); + if (occas_mask.run() != K_ESC) { const TString ocfpi(occas_mask.get(O_CODICE)); - doc.put("OCFPI", ocfpi); + doc.put(DOC_OCFPI, ocfpi); m.set(F_OCFPI, ocfpi); for (int i = occas_mask.fields() - 1; i >= 0; i--)