campo-sirio/lv/lv3200.cpp
guy 54534f8369 Patch level : 10.0 patch 521
Files correlati     : lv3
Ricompilazione Demo : [ ]
Commento            :
7) Nell'evasione dei pacchi da barcode, se seleziono un pacco la seconda volta mi deve avvisare se voglio toglierlo dalla bolla con una segnalazione; ora lo toglie e non dice niente

8) Se scrivo un pacco insestente mi dice "si desidera sommare un pacco a una riga gia' evasa?", ma non esiste il pacco e non ci sono righe evase

9) Ho evaso una riga di 30 con 6 confezioni da 5 e mi ha messo il flag di evaso - perfetto
Poi ho aggiunto una confezione da 5 e fa 35, il flag di evaso è rimasto - perfetto
Ma se tolgo l'ultima confezione mi ha tolto anche il flag di evaso, ma 30 su 30 e' comunque evaso. Da li non si accorge più che tutto il documento è evaso quando ho evaso anche le altre righe


git-svn-id: svn://10.65.10.50/trunk@19641 c028cbd2-c16b-5b4b-a496-9718f37d4682
2009-11-17 09:47:03 +00:00

1139 lines
32 KiB
C++
Executable File

#include <applicat.h>
#include <automask.h>
#include <defmask.h>
#include <execp.h>
#include <reputils.h>
#include <reprint.h>
#include <utility.h>
#include "lvlib.h"
#include "../mg/clifogiac.h"
#include "../ve/velib.h"
#include "clifo.h"
#include "lvcondv.h"
#include "lvrcondv.h"
#include "lvrconsplan.h"
#include "lv3200a.h"
/////////////////////////////
//// TEVASIONE_MSK ////
/////////////////////////////
//classe TEvasione_msk
class TEvasione_msk: public TAutomask
{
TDocumento _buonori;
int _ndoc;
int _autoselect;
TString4 _tpev;
TAssoc_array _pacchi;
protected:
void setta_campi_data();
void setta_campi_cliente();
void carica_righe();
void riordina_righe();
void genera_documento();
void evadi_tutto();
void spezza_riga();
void salva();
void annulla_operazioni();
bool controlla();
void sistema_quantita();
void sistema_pacchi();
void evadi_da_barcode();
virtual void on_idle();
virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
public:
TEvasione_msk();
};
//SORT_BY_QTA_EVASA: è la rows_comapre_function, cioè la funzione che viene utilizzata
//dal metodo sort degli sheet per riordinare le righe secondo le quantità evase
static int sort_by_qta_evasa(TSheet_field& sheet, int r1, int r2)
{
TToken_string& row1 = sheet.row(r1);
TToken_string& row2 = sheet.row(r2);
const int qta1 = row1.get_int(6);
const int qta2 = row2.get_int(6);
int dif = qta1 - qta2;
if (dif == 0)
{
const TString& codart1 = row1.get(1);
const TString& codart2 = row2.get(1);
dif = codart1.compare(codart2);
}
return dif;
}
//SORT_BY_CODART: è la rows_comapre_function, cioè la funzione che viene utilizzata
//dal metodo sort degli sheet per riordinare le righe secondo i codart e le qta evase
static int sort_by_codart(TSheet_field& sheet, int r1, int r2)
{
TToken_string& row1 = sheet.row(r1);
TToken_string& row2 = sheet.row(r2);
const TString& codart1 = row1.get(1);
const TString& codart2 = row2.get(1);
int dif = codart1.compare(codart2);
if (dif == 0)
{
const int qta1 = row1.get_int(6);
const int qta2 = row2.get_int(6);
dif = qta2 - qta1;
}
return dif;
}
//SETTA_CAMPI_DATA: metodo che compila tutti i campi legati alla data
void TEvasione_msk::setta_campi_data()
{
TDate data = get_date(F_DATADOC);
if (data.ok())
{
TDate primo = data;
primo.set_day(1);
TEsercizi_contabili es;
int annoes = es.date2esc(data);
set(F_ANNO, annoes);
//decodifica del giorno della settimana
set(F_GIORNO, itow(data.wday()));
//settimana del mese = settimana(oggi) - settimana(primo del mese) + 1
long tmp = data.week() - primo.week() + 1;
TString4 settimana;
settimana << tmp;
set(F_SETTIMANA, settimana);
}
else
{
TString8 str = data.string();
if (str.empty())
{
reset(F_GIORNO);
reset(F_SETTIMANA);
}
else
warning_box(TR("Data non valida!"));
}
}
//SETTA_CAMPI_CLIENTE: metodo che compila tutti i campi legati al cliente
void TEvasione_msk::setta_campi_cliente()
{
const long codcf = get_int(F_CODCF);
const TDate data = get_date(F_DATADOC);
if (codcf > 0)
{
TLaundry_contract cont(codcf, 0, data);
//se trovo un contratto, allora scrivo il codice contratto e cerco itinerario e data di prevista consegna
//se no avviso che non c'è neanche un contratto valido e svuoto i campi interassati
if(!cont.empty())
{
set(F_CODCONT, cont.get_int(LVCONDV_CODCONT));
TDate adata = data;
adata.addmonth(1);
TString query = "USE LVRCONSPLAN KEY 3\n";
query << "FROM CODCF=" << get(F_CODCF) << " CODCONT=" << get(F_CODCONT) << " DTCONS=" << data << "\n";
query << "TO CODCF=" << get(F_CODCF) << " CODCONT=" << get(F_CODCONT) << " DTCONS=" << adata << "\n";
TISAM_recordset consegne(query);
if (consegne.items() >= 2)
{
consegne.move_to(1);
set(F_DATAPRCO, consegne.get(LVRCONSPLAN_DTCONS).as_date());
set(F_CODITI, consegne.get(LVRCONSPLAN_CODITI).as_int());
}
else
{
reset(F_DATAPRCO);
reset(F_CODITI);
}
if (get(F_RAGSOC).empty())
{
TToken_string key;
key.add('C');
key.add(codcf);
const TRectype& clifo = cache().get(LF_CLIFO, key);
set(F_RAGSOC, clifo.get(CLI_RAGSOC));
set(F_RICALT, clifo.get(CLI_RICALT));
}
}
else
{
TString msg;
msg << "ATTENZIONE: nessun contratto in essere per il cliente " << codcf << " alla data " << data;
warning_box(msg);
reset(F_CODCONT);
reset(F_DATAPRCO);
reset(F_CODITI);
}
}
else
{
reset(F_RICALT);
reset(F_RAGSOC);
reset(F_CODCONT);
reset(F_DATAPRCO);
reset(F_CODITI);
}
}
//CARICA_RIGHE: metodo che carica sullo sheet le righe di un documento selezionato
void TEvasione_msk::carica_righe()
{
TDoc_key kdoc(get_int(F_ANNO), get(F_CODNUM), get_long(F_NDOC));
TBuono_prelievo doc(kdoc);
const TString4 stato = doc.get(DOC_STATO);
set(F_STATO, stato);
disable(F_STATO);
set(F_DATABOLLA, doc.get_date(DOC_DATADOC));
set(F_DATADOC, doc.get_date(DOC_DATADOC)); setta_campi_data();
set(F_CODCF, doc.get_long(DOC_CODCF)); setta_campi_cliente(); field(F_CODCF).set_dirty();
_buonori = doc;
_pacchi.destroy();
if(doc.rows() > 0)
{
enable(DLG_SELECT);
enable(DLG_PREVIEW);
if(stato == "2")
enable(DLG_ELABORA);
enable(DLG_SAVEREC);
enable(DLG_CANCEL);
show(F_RIGHE);
}
TSheet_field& sheet = sfield(F_RIGHE);
for(int i = 1; i <= doc.rows(); i++)
{
TRiga_documento& row = doc[i];
TBuono_prelievo_row rdoc(row);
if (rdoc.qta_dacons() > 0)
{
TToken_string& riga = sheet.row(-1);
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));
riga.add(rdoc.causale(), sheet.cid2index(S_CAUSALE));
riga.add(rdoc.qta_ritirata(), sheet.cid2index(S_RITIRATO));
riga.add(rdoc.qta_dacons(), sheet.cid2index(S_DACONS));
riga.add(rdoc.qta_consegnata(), sheet.cid2index(S_CONSEGNATO));
const TRectype& anamag = cache().get(LF_ANAMAG, rdoc.codart());
//recupero i dati di interesse dall'anagrafica di magazzino
const long ppconf = anamag.get_long(ANAMAG_PPCONF);
if (ppconf > 0)
riga.add(rdoc.num_pacchi(), sheet.cid2index(S_PACCHI));
else
{
riga.add(0, sheet.cid2index(S_PACCHI));
sheet.disable_cell(i, sheet.cid2index(S_PACCHI));
}
riga.add(rdoc.cong_pre(), sheet.cid2index(S_CONGPRE));
riga.add(rdoc.cong_att(), sheet.cid2index(S_CONGATT));
riga.add(rdoc.rifbcon(), sheet.cid2index(S_RIFBCON));
}
else
rdoc.set_evaso(true);
}
doc.rewrite();
sheet.sort(sort_by_codart);
sheet.force_update();
}
//RIORDINA_RIGHE: metodo che riordina le righe dello sheet in base alle quota di evasione
void TEvasione_msk::riordina_righe()
{
TSheet_field& sheet = sfield(F_RIGHE);
sheet.sort(sort_by_qta_evasa);
sheet.force_update();
}
//GENERA_DOCUMENTO: metodo che genera il buono di consegna partendo dal buono di ritiro
void TEvasione_msk::genera_documento()
{
//per prima cosa salva il buono di prelievo
salva();
TDoc_key kdoc(get_int(F_ANNO), get(F_CODNUM), get_long(F_NDOC));
TBuono_prelievo bpre(kdoc);
const long codcf = bpre.codcf();
const int codcont = bpre.codcont();
TLaundry_contract cont(codcf, codcont);
//leggo se devo scrivere il prezzo sulla bolla
//const bool prinbo = cont.get_bool(LVCONDV_STPRZBOL);
const bool prinbo = true; //sempre a true; verrà gestita a video in futuro (27/10/2009)
//dati documento da generare
TString4 codnum = ini_get_string(CONFIG_DITTA, "lv", "NUM_GEN");
TString4 tipodoc = ini_get_string(CONFIG_DITTA, "lv", "TIPODOC_GEN");
char stato = cache().get("%TIP", tipodoc, "S2").left(1)[0];
const TDate databpre = bpre.datadoc();
const TDate databolla = get_date(F_DATABOLLA);
const TDate datagen(TODAY);
TDate dadata = databpre;
TDate adata = datagen;
adata.addmonth();
if(_ndoc == 0)
{
TString query2;
query2 << "USE DOC\n"
<< "FROM PROVV=\"D\" ANNO=" << datagen.year() << " CODNUM=\"" << codnum << "\"\n"
<< "TO PROVV=\"D\" ANNO=" << datagen.year() << " CODNUM=\"" << codnum << "\"";
TISAM_recordset bolle(query2);
bolle.move_last();
_ndoc = bolle.get(DOC_NDOC).as_int();
}
TString query1 = "USE LVRCONSPLAN KEY 3\n";
query1 << "FROM CODCF=" << codcf << " CODCONT=" << codcont << " DTCONS=#DADATA\n";
query1 << "TO CODCF=" << codcf << " CODCONT=" << codcont << " DTCONS=#ADATA\n";
TISAM_recordset consegne(query1);
consegne.set_var("#DADATA", ++dadata);
consegne.set_var("#ADATA", adata);
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);
doc.put(DOC_TIPODOC, tipodoc);
doc.put(DOC_STATO, stato);
doc.put(DOC_DATADOC, databolla);
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
for (int i = 1; i <= bpre.rows(); i++)
{
TRiga_documento& row = bpre[i];
TBuono_prelievo_row rbpre(row);
//nella bolla ci vanno solo le righe evase e non associate
if (!rbpre.evaso())
continue;
TDoc_key kbuono = rbpre.rifbcon();
if (kbuono.full())
continue;
const TString80 codart = rbpre.codart();
TString descr = rbpre.desart();
const TRectype& rcont = cont.row(codart);
//recupero i valori delle dotazione temporanea dal magazzino del cliente
TLocalisamfile magcli(LF_CLIFOGIAC);
magcli.put(CLIFOGIAC_ANNOES, datagen.year());
magcli.put(CLIFOGIAC_TIPOCF, 'C');
magcli.put(CLIFOGIAC_CODCF, codcf);
magcli.put(CLIFOGIAC_INDSPED, 0); //in realtà è da leggere dal contratto
magcli.put(CLIFOGIAC_CODART, codart);
magcli.put(CLIFOGIAC_NRIGA, 1);
//leggo il record corrispondente
magcli.read();
long dottmp = magcli.get_long(CLIFOGIAC_DOTTM);
long dotod = magcli.get_long(CLIFOGIAC_DOTOD);
//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);
TRiga_documento& rdoc = doc.new_row("21");
rdoc.put(RDOC_CODART, codart);
rdoc.put(RDOC_CODARTMAG,codart);
rdoc.put(RDOC_CHECKED,'X');
rdoc.put(RDOC_GENERATA, true);
if(descr.len() <= 50)
rdoc.put(RDOC_DESCR, descr);
else
{
rdoc.put(RDOC_DESCR, descr.left(50));
rdoc.put(RDOC_DESCEST, descr.sub(50));
rdoc.put(RDOC_DESCLUNGA, true);
}
rdoc.put(RDOC_QTA, rbpre.qta_consegnata()); //consegnato
rdoc.put(RDOC_QTAGG1, rbpre.qta_ritirata()); //ritirato
dotod += (rbpre.qta_consegnata() - rbpre.qta_ritirata());
rdoc.put("DOTOD", dotod);
bool dtmp = false;
if (datagen >= rcont.get_date(LVRCONDV_INDTTMP) && datagen <= rcont.get_date(LVRCONDV_FIDTTMP))
dtmp = true;
if(dtmp)
{
rdoc.put("DOTMP", dottmp);
rdoc.add("DOTMP", rbpre.qta_consegnata() - rbpre.qta_ritirata());
}
rdoc.put(RDOC_CODAGG1, rbpre.causale());
const TRectype& anamag = cache().get(LF_ANAMAG, codart);
//gestione prezzo
if (prinbo)
{
real prezzo;
if (cont.get_int(LVCONDV_TIPOLIS) == 0)
prezzo = rcont.get_real(LVRCONDV_PREZZO);
else
prezzo = anamag.get_real(ANAMAG_COSTSTD);
rdoc.put(RDOC_PREZZO, prezzo);
rdoc.put(RDOC_SCONTO, rcont.get(LVRCONDV_SCONTPERC)); //sconto
}
rdoc.put(RDOC_UMQTA, um);
//scrivo il magazzino
TString8 magazzino;
TString8 magazzinoc;
magazzino << ini_get_string(CONFIG_DITTA, "lv", "CODMAG") << ini_get_string(CONFIG_DITTA, "lv", "CODMAGN");
magazzinoc << ini_get_string(CONFIG_DITTA, "lv", "CODMAG") << ini_get_string(CONFIG_DITTA, "lv", "CODMAGC");
rdoc.put(RDOC_CODMAG, magazzino);
rdoc.put(RDOC_CODMAGC, magazzinoc);
//salvo i riferimenti
TDoc_key rifbcon(datagen.year(), codnum, _ndoc);
rbpre.set_rifbcon(rifbcon);
}
//salva la bolla solo se ha almeno una riga
int err = 1;
if (doc.rows() > 0)
{
err = doc.write();
const TString4 stato = cache().get("%TIP", ini_get_string(CONFIG_DITTA, "lv", "TIPODOC_PRE", NULL, 0), "S2").mid(2,1);
bpre.put(DOC_STATO, stato);
bpre.rewrite();
set(F_STATO, stato);
}
if (err == NOERR)
{
if (yesno_box(TR("Il documento è stato generato; si desiderla stamparlo?")))
{
//stampa automatica
TString80 str;
str << "ve1 -2 " << codnum << ' ' << datagen.year() << " D " << _ndoc << " S D";
TExternal_app stampa(str);
stampa.run();
}
}
else
warning_box(TR("Non è stato possibile generare nessun documento"));
reset(F_NDOC);
send_key(K_SPACE, F_NDOC);
}
//EVADI_TUTTO: metodo che forza a "evaso" tutte le righe e lancia la generazione del buono di consegna associato
void TEvasione_msk::evadi_tutto()
{
TSheet_field& sheet = sfield(F_RIGHE);
const int posevaso = sheet.cid2index(S_EVASO);
FOR_EACH_SHEET_ROW(sheet, r, riga)
{
riga->add("X", posevaso);
}
genera_documento();
}
//SPEZZA_RIGA: metodo che spezza una riga del buono in due righe, una per la quota evasa e una per la quota da evadere
void TEvasione_msk::spezza_riga()
{
TSheet_field& sheet = sfield(F_RIGHE);
FOR_EACH_SHEET_ROW_BACK(sheet, r, riga1)
{
char flgev = riga1->get_char(sheet.cid2index(S_EVASO));
if (flgev != 'X')
{
TToken_string& riga2 = sheet.row(-1);
riga2 = *riga1;
const int dacons2 = riga2.get_int(sheet.cid2index(S_RITIRATO)) - riga2.get_int(sheet.cid2index(S_CONSEGNATO));
riga2.add(dacons2, sheet.cid2index(S_DACONS));
riga2.add(0L, sheet.cid2index(S_CONSEGNATO));
riga2.add(0L, sheet.cid2index(S_PACCHI));
const int dacons1 = riga1->get_int(sheet.cid2index(S_RITIRATO)) - riga1->get_int(sheet.cid2index(S_CONSEGNATO));
riga1->add(dacons1, sheet.cid2index(S_DACONS));
riga1->add("X", sheet.cid2index(S_EVASO));
}
}
sheet.sort(sort_by_codart);
sheet.force_update();
}
//SALVA: metodo che salva il buono di prelievo così com'è, senza compiere altre operazioni
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));
//nel caso avessi spezzato le righe, risrcivendole da capo mi vengono ordinate per codice
//ATTENZIONE: devo eliminare le sole righe che sono sullo sheet, cioè quelle che hanno
//quantità da consegnare maggiore di zero
for (int i = doc.rows(); i > 0; i--)
{
TRiga_documento& row = doc[i];
TBuono_prelievo_row rdoc(row);
if (rdoc.qta_dacons() > 0)
doc.destroy_row(i, true);
}
TSheet_field& sheet = sfield(F_RIGHE);
//riordino lo sheet
sheet.sort(sort_by_codart);
sheet.force_update();
//per ogni riga dello sheet genero una riga documento
FOR_EACH_SHEET_ROW(sheet, r, riga)
{
TRiga_documento& row = doc.new_row("24");
TBuono_prelievo_row rdoc(row);
const char flgev = riga->get(sheet.cid2index(S_EVASO))[0];
bool flag;
if (flgev == 'X')
flag = true;
else
flag = false;
const TString80 codart = riga->get(sheet.cid2index(S_CODART));
rdoc.set_evaso(flag);
rdoc.set_codart(codart);
rdoc.set_desart(riga->get(sheet.cid2index(S_ARTDESCR)));
rdoc.set_causale(riga->get(sheet.cid2index(S_CAUSALE)));
rdoc.set_qta_ritirata(riga->get_int(sheet.cid2index(S_RITIRATO)));
rdoc.set_qta_dacons(riga->get_int(sheet.cid2index(S_DACONS)));
rdoc.set_qta_consegnata(riga->get_int(sheet.cid2index(S_CONSEGNATO)));
rdoc.set_num_pacchi(riga->get_int(sheet.cid2index(S_PACCHI)));
rdoc.set_cong_att(riga->get_int(sheet.cid2index(S_CONGPRE)));
rdoc.set_cong_pre(riga->get_int(sheet.cid2index(S_CONGATT)));
rdoc.set_rifbcon(riga->get(sheet.cid2index(S_RIFBCON)));
//recupero l'unità di misura principale di quest'articolo
TToken_string key;
key.add(codart);
key.add(1);
const TRectype& umart = cache().get(LF_UMART, key);
rdoc.set_um(umart.get(UMART_UM));
//recupero il codiva di quest'articolo
const TRectype& anamag = cache().get(LF_ANAMAG, codart);
rdoc.set_codiva(anamag.get(ANAMAG_CODIVA));
const TRectype& rcont = cont.row(codart);
//controllo da dove devo prendere il prezzo
real prezzo;
if (cont.get_int(LVCONDV_TIPOLIS) == 0)
prezzo = rcont.get_real(LVRCONDV_PREZZO);
else
prezzo = anamag.get_real(ANAMAG_COSTSTD);
rdoc.set_prezzo(prezzo);
//scrivo il magazzino
TString8 magazzino;
TString8 magazzinoc;
magazzino << ini_get_string(CONFIG_DITTA, "lv", "CODMAG") << ini_get_string(CONFIG_DITTA, "lv", "CODMAGN");
magazzinoc << ini_get_string(CONFIG_DITTA, "lv", "CODMAG") << ini_get_string(CONFIG_DITTA, "lv", "CODMAGC");
rdoc.set_mag(magazzino);
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
//e libera i pacchi eventualmente allocati
void TEvasione_msk::annulla_operazioni()
{
//ANNULLA PACCHI
_pacchi.destroy();
//elimino lo sheet senza salvarlo
TSheet_field& sheet = sfield(F_RIGHE);
sheet.destroy();
for(int i = 1; i <= _buonori.rows(); i++)
{
TRiga_documento& row = _buonori[i];
TBuono_prelievo_row rdoc(row);
TToken_string& riga = sheet.row(-1);
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));
riga.add(rdoc.causale(), sheet.cid2index(S_CAUSALE));
riga.add(rdoc.qta_ritirata(), sheet.cid2index(S_RITIRATO));
riga.add(rdoc.qta_dacons(), sheet.cid2index(S_DACONS));
riga.add(rdoc.qta_consegnata(), sheet.cid2index(S_CONSEGNATO));
const TRectype& anamag = cache().get(LF_ANAMAG, rdoc.codart());
//recupero i dati di interesse dall'anagrafica di magazzino
const long ppconf = anamag.get_long(ANAMAG_PPCONF);
if (ppconf > 0)
riga.add(rdoc.num_pacchi(), sheet.cid2index(S_PACCHI));
else
{
riga.add(0, sheet.cid2index(S_PACCHI));
sheet.disable_cell(i, sheet.cid2index(S_PACCHI));
}
riga.add(rdoc.cong_pre(), sheet.cid2index(S_CONGPRE));
riga.add(rdoc.cong_att(), sheet.cid2index(S_CONGATT));
riga.add(rdoc.rifbcon(), sheet.cid2index(S_RIFBCON));
}
sheet.force_update();
}
//CONTROLLA: metodo che controlla se tutte le righe sono evase
bool TEvasione_msk::controlla()
{
TSheet_field& sheet = sfield(F_RIGHE);
bool evaso = true;
FOR_EACH_SHEET_ROW(sheet, r, row)
{
const char flgev = row->get(sheet.cid2index(S_EVASO))[0];
if (flgev != 'X')
evaso = false;
}
return evaso;
}
//SISTEMA_QUANTITA: metodo che mantiene allineate le quantita consegnate e il numero
//dei pacchi, moltiplicando il numero dei pacchi per i pezzi per pacco; se scrivo una quantità
//a mano ed è prevista una evasione a pacchi, allora aggiorno il numero dei pacchi
void TEvasione_msk::sistema_quantita()
{
TMask& msk = sfield(F_RIGHE).sheet_mask();
TString80 codart = msk.get(S_CODART);
const TRectype& anamag = cache().get(LF_ANAMAG,codart);
//recupero i dati di interesse dall'anagrafica di magazzino
const long ppconf = anamag.get_long(ANAMAG_PPCONF);
if (ppconf > 0)
{
int pacchi = msk.get_int(S_PACCHI);
int qta_consegnata = pacchi * ppconf;
msk.set(S_CONSEGNATO, qta_consegnata);
}
}
void TEvasione_msk::sistema_pacchi()
{
TMask& msk = sfield(F_RIGHE).sheet_mask();
TString80 codart = msk.get(S_CODART);
const TRectype& anamag = cache().get(LF_ANAMAG,codart);
//recupero i dati di interesse dall'anagrafica di magazzino
const long ppconf = anamag.get_long(ANAMAG_PPCONF);
if (ppconf > 0)
{
int qta_consegnata = msk.get_int(S_CONSEGNATO);
int pacchi = qta_consegnata / ppconf;
if (qta_consegnata % ppconf > 0)
pacchi += 1;
msk.set(S_PACCHI, pacchi);
}
}
//EVADI_DA_BARCODE: metodo che somma alla riga corretta un pacco (quello pistolato) e lo assegna a un cliente,
//sottraendolo dal magazzino del pulito
void TEvasione_msk::evadi_da_barcode()
{
TString80 codpacco = get(F_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);
const int pospa = sheet.cid2index(S_PACCHI);
const int posco = sheet.cid2index(S_CONSEGNATO);
//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))
{
_pacchi.remove(codpacco);
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)
{
if (yesno_box(TR("ATTENZIONE: il pacco risulta già conteggato; si desidera annularlo?")))
{
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 && sevaso == 'X')
riga->add("", sheet.cid2index(S_EVASO));
break;
}
else
break;
}
}
}
else
{
TDoc_key kdoc(get_int(F_ANNO), get(F_CODNUM), get_int(F_NDOC));
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));
if (scodart == codart)
trovato = true;
}
if(trovato)
{
trovato = false;
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;
}
}
//ON_FIELD_EVENT: metodo che gestisce gli eventi sui campi della maschera
bool TEvasione_msk::on_field_event(TOperable_field& f, TField_event e, long jolly)
{
//a seconda del bottone premuto esegui un metodo diverso
switch (f.dlg())
{
case DLG_SELECT:
{
if (e == fe_button)
evadi_tutto();
}
break;
case DLG_PREVIEW:
{
riordina_righe();
}
break;
case DLG_ELABORA:
{
if (e == fe_button)
if (controlla())
genera_documento();
else
{
if(yesno_box(TR("ATTENZIONE: non tutte le righe sono evase. Si desidera continuare ugualmente?")))
{
if(yesno_box(TR("Si desidera considerare evase tutte le righe?"
"(in caso contrario le righe evase parzialmente verranno spezzate su due righe)")))
evadi_tutto();
else
{
spezza_riga();
genera_documento();
}
}
else
riordina_righe();
}
}
break;
case DLG_SAVEREC:
{
if (e == fe_button)
salva();
}
break;
case DLG_CANCEL:
{
if (e == fe_button && jolly == 0)
{
annulla_operazioni();
return false;
}
}
break;
case F_NDOC:
{
if (e == fe_modify)
if (f.get_long() > 0)
carica_righe();
else
{
sfield(F_RIGHE).destroy();
disable(DLG_SELECT);
disable(DLG_PREVIEW);
disable(DLG_ELABORA);
disable(DLG_SAVEREC);
disable(DLG_CANCEL);
reset(F_STATO);
reset(F_DATADOC); setta_campi_data();
reset(F_CODCF); setta_campi_cliente();
hide(F_RIGHE);
}
}
break;
case F_DATADOC:
{
if (e == fe_modify)
setta_campi_data();
}
break;
case F_CODCF:
{
if (e == fe_modify)
setta_campi_cliente();
}
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)
{
TSheet_field& sheet = sfield(F_RIGHE);
TMask& msk = sheet.sheet_mask();
//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: 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));
}
else if (msk.get_long(S_CONSEGNATO) == msk.get_long(S_DACONS))
{
msk.set(S_EVASO, "X");
TToken_string& riga = sheet.row(sheet.selected());
riga.add("X", sheet.cid2index(S_EVASO));
}
sistema_pacchi();
if (controlla())
send_key(K_SPACE, DLG_ELABORA, &f);
}
}
break;
case S_PACCHI:
{
if (e == fe_modify)
sistema_quantita();
}
break;
default:break;
}
return true;
}
//metodo costruttore che precarica i campi di interesse sulla maschera
TEvasione_msk::TEvasione_msk():TAutomask("lv3200a")
{
//precarico i campi fissi
set(F_CODNUM, ini_get_string(CONFIG_DITTA, "lv", "NUM_PRE", NULL, 0));
set(F_TPDOC, ini_get_string(CONFIG_DITTA, "lv", "TIPODOC_PRE", NULL, 0));
const TRectype& tpdoc = cache().get("%NUM", ini_get_string(CONFIG_DITTA, "lv", "TIPODOC_PRE", NULL, 0));
set(F_DESCR, tpdoc.get("S0"));
TDate data(TODAY);
TEsercizi_contabili es;
int annoes = es.date2esc(data);
set(F_ANNO, annoes);
_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);
disable(DLG_PREVIEW);
disable(DLG_ELABORA);
disable(DLG_SAVEREC);
disable(DLG_CANCEL);
_ndoc = 0;
}
/////////////////////////////
//// TEVASIONE_APP ////
/////////////////////////////
//classe TEvasione_app
class TEvasione_app : public TSkeleton_application
{
TEvasione_msk* _msk;
protected:
virtual bool create();
virtual bool destroy();
public:
bool transfer();
virtual void main_loop();
};
//CREATE: metodo costruttore
bool TEvasione_app::create()
{
_msk = new TEvasione_msk;
open_files(LF_DOC, LF_RIGHEDOC);
return TSkeleton_application::create();
}
//DESTROY: metodo distruttore
bool TEvasione_app::destroy()
{
delete _msk;
return TApplication::destroy();
}
//TRANSFER: metodo che scorre i campi nome e, se sono pieni, richiama il metodo
//ELABORA_FILE(), che effettivamente fa l'elaborazione
bool TEvasione_app::transfer()
{
return true;
}
void TEvasione_app::main_loop()
{
while (_msk->run() == K_ENTER)
transfer();
}
int lv3200(int argc, char *argv[])
{
TEvasione_app a;
a.run (argc, argv, "Evasione Buoni di Prelievo");
return TRUE;
}