Files correlati : lv3 Ricompilazione Demo : [ ] Commento : 0001081: Anomalie/Errori documenti lavanderia "Griglia" Descrizione Il prezzo non viene riportato da contratto. Da accordi telefonici, da adesso in poi il prezzo sarà sempre presente sulla bolla; si legherà la sua visualizzazione all'utente di campo (segnalazione 1088) git-svn-id: svn://10.65.10.50/trunk@17954 c028cbd2-c16b-5b4b-a496-9718f37d4682
361 lines
10 KiB
C++
Executable File
361 lines
10 KiB
C++
Executable File
#include "../ve/ve0100.h"
|
|
#include "../ve/veini.h"
|
|
#include "../ve/veuml.h"
|
|
#include "../ve/verig.h"
|
|
#include "../ve/vepriv.h"
|
|
|
|
#include "lv0.h"
|
|
#include "lvlib.h"
|
|
#include "lvcondv.h"
|
|
#include "lvrcondv.h"
|
|
|
|
//definizione della maschera di inserimento
|
|
class TGestione_bolle_msk : public TDocumento_mask
|
|
{
|
|
protected:
|
|
static void arrotonda(const TMask& msk, real& quantita);
|
|
static bool lv_bolla_handler(TMask_field& f, KEY k);
|
|
static bool lv_ritirato_handler(TMask_field& f, KEY k);
|
|
static bool lv_consegnato_handler(TMask_field& f, KEY k);
|
|
static bool lv_codart_handler(TMask_field& f, KEY k);
|
|
public:
|
|
virtual void user_set_handler( short fieldid, int index);
|
|
virtual void user_set_row_handler(TMask& rm, short field, int index);
|
|
TGestione_bolle_msk(const char* tipodoc);
|
|
|
|
};
|
|
|
|
void TGestione_bolle_msk::arrotonda(const TMask& msk, real& quantita)
|
|
{
|
|
const TString& codart = msk.get(FR_CODART);
|
|
//instanzio una cache sulla tabella del magazzino
|
|
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)
|
|
{
|
|
TDocumento_mask& dmsk = (TDocumento_mask&) msk.get_sheet()->mask();
|
|
|
|
//recupero dal documento i dati di interesse per recuperare...
|
|
//...i dati dalla riga contratto
|
|
const long codcf = dmsk.get_long(F_CODCF);
|
|
const int indsped = dmsk.get_int(F_CODINDSP);
|
|
TDate datadoc = dmsk.get_date(F_DATADOC);
|
|
if (!datadoc.ok())
|
|
datadoc = TODAY;
|
|
|
|
const TLaundry_contract cont(codcf, indsped, datadoc);
|
|
//leggo la riga del contratto per l'articolo corrente
|
|
const TRectype& rcont = cont.row(codart);
|
|
//recupero i dati di interesse dalla riga del contratto
|
|
if (rcont.get_bool(LVRCONDV_ARROT))
|
|
{
|
|
//calcolo di quanti pezzi sforo
|
|
const long arr = quantita.integer() % ppconf;
|
|
//se sforo (arr > 0) allora calcolo quanti pezzi in più gli devo dare e aggiorno la quantità
|
|
if (arr > 0)
|
|
quantita += ppconf - arr;
|
|
}
|
|
}
|
|
}
|
|
|
|
bool TGestione_bolle_msk::lv_ritirato_handler(TMask_field& f, KEY k)
|
|
{
|
|
if (f.to_check(k) && !f.empty())
|
|
{
|
|
TMask& msk = f.mask();
|
|
if (msk.field(FR_QTA).enabled() && msk.field(FR_QTA).empty())
|
|
{
|
|
real ritirato = f.get();
|
|
arrotonda(msk,ritirato);
|
|
msk.set(FR_QTA,ritirato);
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
bool TGestione_bolle_msk::lv_consegnato_handler(TMask_field& f, KEY k)
|
|
{
|
|
bool ok = true;
|
|
TMask& msk = f.mask();
|
|
|
|
switch(f.dlg())
|
|
{
|
|
case FR_QTA: ok = qta_handler( f, k ); break;
|
|
default: break;
|
|
}
|
|
|
|
/*if (ok && k == K_ENTER && f.dirty() && msk.field(FR_QTAGG1).enabled() && !f.empty())
|
|
{
|
|
real ritirato = msk.get_real(FR_QTAGG1);
|
|
real consegnato = f.get();
|
|
arrotonda(msk, consegnato);
|
|
arrotonda(msk, ritirato);
|
|
if (consegnato.integer() != ritirato.integer() &&
|
|
!yesno_box(TR("Si desidera consegnare una quantita' di merce diversa da quella ritirata?")))
|
|
f.set(ritirato.string());
|
|
else
|
|
f.set(consegnato.string());
|
|
}*/
|
|
return ok;
|
|
}
|
|
|
|
bool TGestione_bolle_msk::lv_codart_handler(TMask_field& f, KEY k)
|
|
{
|
|
bool ok = true;
|
|
switch(f.dlg())
|
|
{
|
|
case FR_CODART: ok = codart_handler( f, k ); break;
|
|
default: break;
|
|
}
|
|
|
|
if (ok && k == K_ENTER && f.dirty())
|
|
{
|
|
TMask& msk = f.mask();
|
|
const TString& codart = msk.get(FR_CODART);
|
|
|
|
if (codart.full())
|
|
{
|
|
TDocumento_mask& dmsk = (TDocumento_mask&) msk.get_sheet()->mask();
|
|
|
|
//recupero dal documento i dati di interesse per recuperare...
|
|
//...i dati dalla riga contratto
|
|
const long codcf = dmsk.get_long(F_CODCF);
|
|
const int indsped = dmsk.get_int(F_CODINDSP);
|
|
TDate datadoc = dmsk.get_date(F_DATADOC);
|
|
if (!datadoc.ok())
|
|
datadoc = TODAY;
|
|
|
|
const TLaundry_contract cont(codcf, indsped, datadoc);
|
|
|
|
if (cont.row(codart).empty() &&
|
|
yesno_box(TR("L'articolo in esame non fa parte della dotazione standard di questo cliente."
|
|
"Si desidera aggiungerla ai contratti?")))
|
|
cont.edit();
|
|
}
|
|
}
|
|
return ok;
|
|
}
|
|
|
|
bool TGestione_bolle_msk::lv_bolla_handler(TMask_field& f, KEY k)
|
|
{
|
|
bool ok = true;
|
|
switch(f.dlg())
|
|
{
|
|
case F_CODCF: ok = TDocumento_mask::clifo_handler( f, k ); break;
|
|
case F_DATADOC: ok = data_hndl( f, k ); break;
|
|
default: break;
|
|
}
|
|
|
|
if (ok && k == K_TAB && f.focusdirty())
|
|
{
|
|
f.set_focusdirty(false);
|
|
|
|
TDocumento_mask& dmsk = (TDocumento_mask&)f.mask();
|
|
TDocumento& doc = dmsk.doc();
|
|
|
|
static long stcodcf = 0, stcodcont = 0;
|
|
|
|
TSheet_field& sheet = dmsk.sfield(F_SHEET);
|
|
int nrighe = sheet.items();
|
|
|
|
const long codcf = dmsk.get_long(F_CODCF);
|
|
const int indsped = dmsk.get_int(F_CODINDSP);
|
|
TDate datadoc = dmsk.get_date(F_DATADOC);
|
|
if (!datadoc.ok())
|
|
datadoc = TODAY;
|
|
const int anno = datadoc.year();
|
|
|
|
if (codcf <= 0)
|
|
return true;
|
|
|
|
const long codcont = lv_find_contract(codcf,indsped,datadoc);
|
|
if (codcont <= 0)
|
|
{
|
|
warning_box(TR("Non ci sono contratti in essere alla data indicata"));
|
|
return true;
|
|
}
|
|
|
|
if (stcodcf == codcf && stcodcont == codcont && nrighe > 0)
|
|
return true;
|
|
|
|
dmsk.mask2doc();
|
|
|
|
stcodcf = codcf;
|
|
stcodcont = codcont;
|
|
|
|
//elimino tutte le righe del documento
|
|
doc.destroy_rows();
|
|
|
|
//tipo riga
|
|
const TString& tprig = dmsk.get(F_LBTIPORIGA);
|
|
|
|
//instanzio una cache sulla tabella dei contratti
|
|
const TLaundry_contract tcont(codcf, codcont);
|
|
//estraggo i dati di interesse dalla cache
|
|
const int tplis = tcont.get_int(LVCONDV_TIPOLIS); //tipo listino
|
|
|
|
//instanzio un recordset sulle righe del contratto considerato
|
|
TISAM_recordset rcont("USE LVRCONDV\nFROM CODCF=#CODCF CODCONT=#CODCONT\nTO CODCF=#CODCF CODCONT=#CODCONT");
|
|
rcont.set_var("#CODCF",codcf);
|
|
rcont.set_var("#CODCONT",codcont);
|
|
|
|
//per ogni riga estraggo l'articolo, il relativo prezzo e l'eventaule sconto da applicare,
|
|
//...riportati in bolla solo se necessario
|
|
for (bool ok = rcont.move_first(); ok; ok = rcont.move_next())
|
|
{
|
|
//creo una nuova riga documento
|
|
TRiga_documento& rdoc = doc.new_row(tprig);
|
|
|
|
//recupero i dati di interesse dalla riga del contratto e li inserisco sullo sheet
|
|
const TString80 codart = rcont.get(LVRCONDV_CODART).as_string();
|
|
//instanzio una cache sulla tabella del magazzino
|
|
const TRectype& anamag = cache().get(LF_ANAMAG,codart);
|
|
|
|
TString4 causale = rcont.get(LVRCONDV_CAUSLAV).as_string();
|
|
|
|
if (causale.blank())
|
|
{
|
|
TConfig* configlv = new TConfig(CONFIG_DITTA,"lv");
|
|
causale = configlv->get("CAUSLAV");
|
|
}
|
|
|
|
rdoc.put(RDOC_CODART,codart);
|
|
rdoc.put(RDOC_CODARTMAG,codart);
|
|
rdoc.put(RDOC_CHECKED,'X');
|
|
rdoc.put(RDOC_DESCR,anamag.get(ANAMAG_DESCR));
|
|
rdoc.put(RDOC_UMQTA,rcont.get(LVRCONDV_UM).as_string());
|
|
rdoc.put(RDOC_CODAGG1,causale);
|
|
|
|
//elaborazione per il prezzo: o lo prendo dalle righe contratto, o dall'anagrafica magazzino
|
|
const TString& sconto = rcont.get(LVRCONDV_SCONTPERC).as_string();
|
|
rdoc.put(RDOC_SCONTO, sconto);
|
|
//controllo da dove devo prendere il prezzo
|
|
real prezzo;
|
|
if (tplis == 0)
|
|
prezzo = rcont.get(LVRCONDV_PREZZO).as_real();
|
|
else
|
|
prezzo = anamag.get_real(ANAMAG_COSTSTD);
|
|
rdoc.put(RDOC_PREZZO, prezzo);
|
|
}
|
|
dmsk.doc2mask(false);
|
|
|
|
FOR_EACH_MASK_FIELD(dmsk, i, f)
|
|
{
|
|
if (f->has_check())
|
|
f->check(STARTING_CHECK);
|
|
if (f->is_edit())
|
|
f->on_hit();
|
|
}
|
|
sheet.set_focus();
|
|
sheet.select(0);
|
|
}
|
|
return ok;
|
|
}
|
|
|
|
void TGestione_bolle_msk::user_set_row_handler(TMask& rm, short field, int index)
|
|
{
|
|
switch(index)
|
|
{
|
|
case 4101: rm.set_handler(field, lv_ritirato_handler); break;
|
|
case 4102: rm.set_handler(field, lv_consegnato_handler); break;
|
|
case 4103: rm.set_handler(field, lv_codart_handler); break;
|
|
default : TDocumento_mask::user_set_row_handler(rm, field, index); break;
|
|
}
|
|
}
|
|
|
|
void TGestione_bolle_msk::user_set_handler( short fieldid, int index)
|
|
{
|
|
switch(index)
|
|
{
|
|
case 4101: set_field_handler(fieldid, lv_bolla_handler); break;
|
|
default : TDocumento_mask::user_set_handler(fieldid, index); break;
|
|
}
|
|
}
|
|
|
|
TGestione_bolle_msk::TGestione_bolle_msk(const char* tipodoc) : TDocumento_mask(tipodoc)
|
|
{
|
|
sfield(F_SHEET).set_nav_column(FR_QTA, FR_QTAGG1);
|
|
sfield(F_SHEET).set_auto_append();
|
|
}
|
|
// Definizione della classe dell'applicazione motore
|
|
class TGestione_bolle_app : public TMotore_application
|
|
{
|
|
|
|
protected:
|
|
virtual TMask* get_mask( int mode );
|
|
virtual int write( const TMask& m );
|
|
virtual int rewrite( const TMask& m );
|
|
|
|
public:
|
|
TGestione_bolle_app() {}
|
|
};
|
|
|
|
inline TGestione_bolle_app& gbapp() { return (TGestione_bolle_app &) main_app(); };
|
|
|
|
//ridefinisco il metodo get_mask delle TMotore_application
|
|
TMask* TGestione_bolle_app::get_mask( int mode )
|
|
{
|
|
if (mode == MODE_INS || mode == MODE_MOD)
|
|
{
|
|
TString4 tipodoc;
|
|
if (mode == MODE_MOD)
|
|
tipodoc = get_relation()->curr().get(DOC_TIPODOC); // Lo prendo dalla relazione (Gelai)
|
|
else
|
|
tipodoc = TMotore_application::get_mask(MODE_QUERY)->get(F_TIPODOC);
|
|
if (_doc_masks.objptr(tipodoc) == NULL)
|
|
{
|
|
TGestione_bolle_msk* m = new TGestione_bolle_msk(tipodoc);
|
|
_doc_masks.add(tipodoc, m);
|
|
const TTipo_documento& tdoc = m->doc().tipo();
|
|
const TString_array& handlers = tdoc.handlers();
|
|
FOR_EACH_ARRAY_ROW(handlers, i, row)
|
|
{
|
|
m->user_set_handler( row->get_int( 0 ), row->get_int( 1 ) );
|
|
}
|
|
}
|
|
}
|
|
return TMotore_application::get_mask(mode);
|
|
}
|
|
|
|
//ridefinisco il metodo write delle TMotore_application
|
|
int TGestione_bolle_app::write( const TMask& m )
|
|
{
|
|
TDocumento_mask& mask = (TDocumento_mask&) m;
|
|
TDocumento& d = mask.doc();
|
|
|
|
for (int r = d.rows() ; r > 0 ; r--)
|
|
{
|
|
const TRiga_documento& dr = d[r];
|
|
|
|
if (dr.get_int(RDOC_QTA) == 0 && dr.get_int(RDOC_QTAGG1) == 0)
|
|
d.destroy_row(r,true);
|
|
}
|
|
|
|
return TMotore_application::write(m);
|
|
}
|
|
|
|
//ridefinisco il metodo rewrite delle TMotore_application
|
|
int TGestione_bolle_app::rewrite( const TMask& m )
|
|
{
|
|
TDocumento_mask& mask = (TDocumento_mask&) m;
|
|
TDocumento& d = mask.doc();
|
|
|
|
for (int r = d.rows() ; r > 0 ; r--)
|
|
{
|
|
const TRiga_documento& dr = d[r];
|
|
|
|
if (dr.get_int(RDOC_QTA) == 0 && dr.get_int(RDOC_QTAGG1) == 0)
|
|
d.destroy_row(r,true);
|
|
}
|
|
|
|
return TMotore_application::rewrite(m);
|
|
}
|
|
|
|
int lv3100( int argc, char* argv[])
|
|
{
|
|
TGestione_bolle_app a;
|
|
|
|
a.run( argc, argv, TR("Documenti di Trasporto"));
|
|
return 0;
|
|
} |