From c675dcd8f613b212d84c3a1bd43950991cfe9ea1 Mon Sep 17 00:00:00 2001 From: luca83 Date: Thu, 5 Nov 2009 15:18:53 +0000 Subject: [PATCH] Patch level : 10.0 patch 501 Files correlati : lv3 lvlib(->lv2) Ricompilazione Demo : [ ] Commento : Aggiunta la gestione dei codici pagamento e magazzino in testata documenti e IVA sulle righe Aggiunta gestione evasione dei buoni da barcode Corretto metodo read della classe TRiga_pacco git-svn-id: svn://10.65.10.50/trunk@19577 c028cbd2-c16b-5b4b-a496-9718f37d4682 --- lv/lv3200.cpp | 238 +++++++++++++++++++++++++++++++++++++++----------- lv/lvlib.cpp | 7 +- 2 files changed, 190 insertions(+), 55 deletions(-) diff --git a/lv/lv3200.cpp b/lv/lv3200.cpp index 12ab59146..0415a1a98 100755 --- a/lv/lv3200.cpp +++ b/lv/lv3200.cpp @@ -24,11 +24,15 @@ //classe TEvasione_msk class TEvasione_msk: public TAutomask { - TDocumento _buonori; + TDocumento _buonori; + int _ndoc; + int _autoselect; + TString4 _tpev; - int _righevase; + TAssoc_array _pacchi; + protected: void setta_campi_data(); @@ -48,6 +52,7 @@ protected: void evadi_da_barcode(); + virtual void on_idle(); virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); public: @@ -205,8 +210,6 @@ void TEvasione_msk::setta_campi_cliente() //CARICA_RIGHE: metodo che carica sullo sheet le righe di un documento selezionato void TEvasione_msk::carica_righe() { - _righevase = 0; - TDoc_key kdoc(get_int(F_ANNO), get(F_CODNUM), get_long(F_NDOC)); TBuono_prelievo doc(kdoc); @@ -245,9 +248,7 @@ void TEvasione_msk::carica_righe() if (rdoc.qta_dacons() > 0) { TToken_string& riga = sheet.row(-1); - riga.add(rdoc.evaso() ? "X" : "", sheet.cid2index(S_EVASO)); - if(rdoc.evaso()) - _righevase++; + riga.add(rdoc.evaso() ? "X" : "", sheet.cid2index(S_EVASO)); riga.add(rdoc.codart(), sheet.cid2index(S_CODART)); riga.add(rdoc.desart(), sheet.cid2index(S_ARTDESCR)); @@ -336,6 +337,15 @@ void TEvasione_msk::genera_documento() consegne.move_first(); const TDate dataprco = consegne.get(LVRCONSPLAN_DTCONS).as_date(); const int coditi = consegne.get(LVRCONSPLAN_CODITI).as_int(); + + //recupero il codpag + TToken_string key; + key.add('C'); + key.add(codcf); + const TString4 codpag = cache().get(LF_CLIFO, key, CLI_CODPAG); + + //reupero la cuasale di magazzino di testata + const TString16 causmag = cache().get("%TIP", tipodoc, "S9"); //preparo la testata del documento TDocumento doc('D', kdoc.anno(), codnum, ++_ndoc); @@ -345,6 +355,8 @@ void TEvasione_msk::genera_documento() doc.put(DOC_TIPOCF, 'C'); doc.put(DOC_CODCF, codcf); doc.put(DOC_CODCONT, codcont); + doc.put(DOC_CODPAG, codpag); + doc.put(DOC_CAUSMAG, causmag); doc.put("DATAGEN", datagen); //data generazione del documento doc.put("DATAPRCO", dataprco); //data prevista consegna doc.put("CODITI", coditi); //codice itinerario @@ -525,6 +537,7 @@ void TEvasione_msk::salva() { TDoc_key kdoc(get_int(F_ANNO), get(F_CODNUM), get_long(F_NDOC)); TBuono_prelievo doc(kdoc); + TDate datadoc = doc.get_date(DOC_DATADOC); TLaundry_contract cont(get_long(F_CODCF), get_long(F_CODCONT)); @@ -605,6 +618,60 @@ void TEvasione_msk::salva() rdoc.set_magc(magazzinoc); } doc.rewrite(); + + //se sto evadendo tramite barcode quando salvo salvo anche tutti i pacchi associati + //generando i movimenti di magazzino di scarico + if (_tpev == "B") + { + TLocalisamfile pacchi(LF_PACCHI); + TLocalisamfile movi(LF_MOVMAG); + + //cerco l'ultimo numero di chiave in movmag + TISAM_recordset mov("USE MOVMAG"); + long nummov = 0; + + if(mov.move_last()) + nummov += mov.get(MOVMAG_NUMREG).as_int(); + + const TCausale_magazzino causale((ini_get_string(CONFIG_DITTA, "lv", "CAUSCARMAG"))); + TString8 magazzino; + magazzino << ini_get_string(CONFIG_DITTA, "lv", "CODMAG") << ini_get_string(CONFIG_DITTA, "lv", "CODMAGP"); + + TEsercizi_contabili es; + int annoes = es.date2esc(datadoc); + + TMov_mag movmag(++nummov); + movmag.put(MOVMAG_ANNOES, annoes); + movmag.put(MOVMAG_DATAREG, datadoc); + movmag.put(MOVMAG_CODCAUS, causale.codice()); + + FOR_EACH_ASSOC_OBJECT(_pacchi, o, codpacco, rifdoc) + { + TDoc_key kdoc = *(TToken_string*)rifdoc; + + TRiga_pacco rp(codpacco); + const TString80 codart = rp.articolo(); + const long qta = rp.quantita().integer(); + + //recupero l'unità di misura principale di quest'articolo + TToken_string key; + key.add(codart); + key.add(1); + const TString4 um = cache().get(LF_UMART, key, UMART_UM); + + rp.set_rigabolla(kdoc.anno(), kdoc.codnum(), kdoc.ndoc(), 0); //SOLUZIONE MOMENTANEA PER VEDERE SE FUNZIONA TUTTO + rp.rewrite(pacchi); + + //faccio la nuova riga del movimento di magazzino + TRectype& rmovmag = movmag.new_row(); + rmovmag.put(RMOVMAG_CODMAG, magazzino); + rmovmag.put(RMOVMAG_CODART, codart); + + rmovmag.put(RMOVMAG_UM, um); + rmovmag.put(RMOVMAG_QUANT, qta); + } + movmag.write(movi); + } } //ANNULLA_OPERAZIONI: metodo elimina tutte le quantità scritte durante l'ultima evasione @@ -612,6 +679,7 @@ void TEvasione_msk::salva() void TEvasione_msk::annulla_operazioni() { //ANNULLA PACCHI + _pacchi.destroy(); //elimino lo sheet senza salvarlo TSheet_field& sheet = sfield(F_RIGHE); @@ -716,63 +784,108 @@ void TEvasione_msk::evadi_da_barcode() if (codpacco.full()) { + const TRiga_pacco rp(codpacco); + const TString80 codart = rp.articolo(); + const long qtapacco = rp.quantita().integer(); + TSheet_field& sheet = sfield(F_RIGHE); - TDoc_key kdoc(get_int(F_ANNO), get(F_CODNUM), get_int(F_NDOC)); + const int pospa = sheet.cid2index(S_PACCHI); + const int posco = sheet.cid2index(S_CONSEGNATO); - TRiga_pacco rp(codpacco); - TString80 codart = rp.articolo(); - int qtapacco = rp.quantita().integer(); - - bool trovato = false; - - //cerco la prima riga non evasa di quell'articolo - FOR_EACH_SHEET_ROW(sheet, r, riga) + //se il pacco è già stato pistolettato lo tolgo dai pacchi da evadere, altrimenti cerco di sommarlo + //a una riga documento esistente + if (_pacchi.is_key(codpacco)) { - if (riga->get(sheet.cid2index(S_CODART)) == codart && riga->get(sheet.cid2index(S_EVASO)) != "X") + _pacchi.remove(codpacco); + FOR_EACH_SHEET_ROW(sheet, r, riga) { - int pacchi = riga->get_int(sheet.cid2index(S_PACCHI)); pacchi += 1; - int qtacon = riga->get_int(sheet.cid2index(S_CONSEGNATO)); qtacon += qtapacco; + const TString80 scodart = riga->get(sheet.cid2index(S_CODART)); + const char sevaso = riga->get_char(sheet.cid2index(S_EVASO)); - riga->add(pacchi, sheet.cid2index(S_PACCHI)); - riga->add(qtacon, sheet.cid2index(S_CONSEGNATO)); - - trovato = true; - - if (_pacchi.is_key(codpacco)) - _pacchi.remove(codpacco); - else - _pacchi.add(codpacco, kdoc); - } - } - - if (!trovato) - { - if(yesno_box(TR("Si desidera provare a sommare il pacco a una riga già evasa?"))) - { - FOR_EACH_SHEET_ROW(sheet, r, riga) + if (scodart == codart) { - if (riga->get(sheet.cid2index(S_CODART)) == codart) - { - int pacchi = riga->get_int(sheet.cid2index(S_PACCHI)); pacchi += 1; - int qtacon = riga->get_int(sheet.cid2index(S_CONSEGNATO)); qtacon += qtapacco; + int qtadacon = riga->get_int(sheet.cid2index(S_DACONS)); + int pacchi = riga->get_int(pospa); pacchi -= 1; + int qtacon = riga->get_int(posco); qtacon -= qtapacco; - riga->add(pacchi, sheet.cid2index(S_PACCHI)); - riga->add(qtacon, sheet.cid2index(S_CONSEGNATO)); + riga->add(pacchi, pospa); + riga->add(qtacon, posco); - trovato = true; - if (_pacchi.is_key(codpacco)) - _pacchi.remove(codpacco); - else - _pacchi.add(codpacco, kdoc); - - } + if(qtacon <= qtadacon && sevaso == 'X') + riga->add("", sheet.cid2index(S_EVASO)); } } } + else + { + TDoc_key kdoc(get_int(F_ANNO), get(F_CODNUM), get_int(F_NDOC)); - if (!trovato) - warning_box(TR("Non è stato possibile sommare il pacco a nessuna riga del buono")); + bool trovato = false; + //cerco la prima riga non evasa di quell'articolo + FOR_EACH_SHEET_ROW(sheet, r, riga) + { + const TString80 scodart = riga->get(sheet.cid2index(S_CODART)); + const char sevaso = riga->get_char(sheet.cid2index(S_EVASO)); + if (scodart == codart && sevaso != 'X') + { + int qtadacon = riga->get_int(sheet.cid2index(S_DACONS)); + int pacchi = riga->get_int(pospa); pacchi += 1; + int qtacon = riga->get_int(posco); qtacon += qtapacco; + + riga->add(pacchi, pospa); + riga->add(qtacon, posco); + + if (qtacon > qtadacon) + { + warning_box(TR("ATTENZIONE: si sta consegnando un quantitativo maggiore al dovuto")); + riga->add('X', sheet.cid2index(S_EVASO)); + } + + if (qtacon == qtadacon) + riga->add('X', sheet.cid2index(S_EVASO)); + + trovato = true; + _pacchi.add(codpacco, kdoc); + } + } + + if (!trovato) + { + if(yesno_box(TR("Si desidera provare a sommare il pacco a una riga già evasa?"))) + { + FOR_EACH_SHEET_ROW(sheet, r, riga) + { + const TString80 scodart = riga->get(sheet.cid2index(S_CODART)); + if (scodart == codart) + { + int pacchi = riga->get_int(pospa); pacchi += 1; + int qtacon = riga->get_int(posco); qtacon += qtapacco; + + riga->add(pacchi, pospa); + riga->add(qtacon, posco); + + trovato = true; + _pacchi.add(codpacco, kdoc); + } + } + } + } + + if (!trovato) + warning_box(TR("Non è stato possibile sommare il pacco a nessuna riga del buono")); + } + } +} + +void TEvasione_msk:: on_idle() +{ + TMask::on_idle(); + if (_autoselect >= 0 && get(F_BARCODE).full()) + { + reset(F_BARCODE); + field(F_BARCODE).set_focus(); + _autoselect = -1; } } @@ -862,7 +975,20 @@ bool TEvasione_msk::on_field_event(TOperable_field& f, TField_event e, long joll if (e == fe_modify) setta_campi_cliente(); } - break; + break; + case F_BARCODE: + { + if (e == fe_modify && f.get().full()) + { + _autoselect = 1; + evadi_da_barcode(); + sfield(F_RIGHE).force_update(); + + if (controlla()) + send_key(K_SPACE, DLG_ELABORA); + } + } + break; case S_CONSEGNATO: { if (e == fe_modify) @@ -872,7 +998,7 @@ bool TEvasione_msk::on_field_event(TOperable_field& f, TField_event e, long joll //la riga risulta evasa se la quantità consegnata è maggiore o uguale alla quantità da consegnare if(msk.get_long(S_CONSEGNATO) > msk.get_long(S_DACONS)) { - warning_box(TR("ATTENZIONE: stai consegnando un quantitativo maggiore al dovuto")); + warning_box(TR("ATTENZIONE: si sta consegnando un quantitativo maggiore al dovuto")); msk.set(S_EVASO, "X"); TToken_string& riga = sheet.row(sheet.selected()); riga.add("X", sheet.cid2index(S_EVASO)); @@ -921,9 +1047,15 @@ TEvasione_msk::TEvasione_msk():TAutomask("lv3200a") _tpev = main_app().argv(2); if (_tpev == "B") + { + _autoselect = 1; show(F_BARCODE); + } else + { + _autoselect = -1; hide(F_BARCODE); + } hide(F_RIGHE); disable(DLG_SELECT); diff --git a/lv/lvlib.cpp b/lv/lvlib.cpp index 53468be82..db19c9db4 100755 --- a/lv/lvlib.cpp +++ b/lv/lvlib.cpp @@ -1066,8 +1066,11 @@ bool TRiga_pacco::read(const TString& codpacco, const long codriga) { if (codpacco.full()) // Campo obbligatorio! { - TString80 key; key.format("%s|%ld", codpacco, codriga); - *((TRectype*)this) = cache().get(LF_PACCHI, key); + TLocalisamfile pacchi(LF_PACCHI); + put(PACCHI_CODPACCO, codpacco); + put(PACCHI_CODRIGA, codriga); + + TRectype::read(pacchi); } else zero();