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
This commit is contained in:
luca83 2009-11-05 15:18:53 +00:00
parent 854e5f28de
commit c675dcd8f6
2 changed files with 190 additions and 55 deletions

View File

@ -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);

View File

@ -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();