campo-sirio/lv/lv3100.cpp

2037 lines
67 KiB
C++
Executable File
Raw Blame History

#include <execp.h>
#include "../ve/ve0100.h"
#include "../ve/veini.h"
#include "../ve/veuml.h"
#include "../ve/veuml3.h"
#include "../ve/verig.h"
#include "../ve/vepriv.h"
#include "lvlib.h"
#include "lvcondv.h"
#include "lvrcondv.h"
#include "lvrconsplan.h"
#include "../mg/clifogiac.h"
#include "../ve/rcondv.h"
#define FOR_EACH_DOC_ROW_BACK(d, r, row) const TRiga_documento* row = NULL; for (int r = d.rows(); r > 0 && (row = &d[r]) != NULL; r--)
//////////////////////////////////////////
//// CLASSE TGESTIONE_BOLLE_MSK ////
//////////////////////////////////////////
//Definizione della classe della maschera
class TGestione_bolle_msk : public TDocumento_mask
{
long _stcodcf;
long _stcodcont;
TAssoc_array _rit_prec;
TAssoc_array _cons_prec;
TAssoc_array _rit_prec_tmp;
TAssoc_array _cons_prec_tmp;
TAssoc_array _dot_tmp;
protected:
static void arrotonda(const TMask& msk, real& quantita);
static void dettaglio_causale(TSheet_field& ss);
//hanlder di documento:
static bool lv_data_handler(TMask_field& f, KEY k);
static bool lv_contratto_handler(TMask_field& f, KEY k);
static bool lv_dataprco_handler(TMask_field& f, KEY k);
static bool lv_bolla_handler(TMask_field& f, KEY k);
static bool lv_loadprice_handler(TMask_field& f, KEY k);
static bool lv_planning_handler(TMask_field& f, KEY k);
//handler di riga:
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);
static bool lv_causale_handler(TMask_field& f, KEY k);
static bool lv_codmag_handler(TMask_field& f, KEY k);
static bool lv_datatmp_handler(TMask_field& f, KEY k);
static bool ss_notify(TSheet_field& ss, int r, KEY key);
static bool ss_handler(TMask_field& f, KEY key);
virtual void on_idle();
public:
void update_conguaglio();
virtual void user_set_handler( short fieldid, int index);
virtual void user_set_row_handler(TMask& rm, short field, int index);
void reset_var_mask() {_stcodcf = 0; _stcodcont = 0;}
void calc_rit_cons_prec();
TAssoc_array & rit_prec() { return _rit_prec;}
TAssoc_array & cons_prec() { return _cons_prec;}
TAssoc_array & rit_prec_tmp() { return _rit_prec_tmp;}
TAssoc_array & cons_prec_tmp() { return _cons_prec_tmp;}
TAssoc_array & dot_tmp() { return _dot_tmp;}
TDate proponi_dataprco() const;
TString8 proponi_autista() const;
TGestione_bolle_msk(const char* tipodoc);
int _autoselect;
};
//////////////////////////////////////////
//// CLASSE TGESTIONE_BOLLE_APP ////
//////////////////////////////////////////
// Definizione della classe dell'applicazione motore
class TGestione_bolle_app : public TMotore_application
{
TGiac_per_cli _giac;
protected:
virtual TMask* get_mask( int mode );
virtual int write( const TMask& m );
virtual int rewrite( const TMask& m );
virtual int read ( TMask& m );
virtual bool remove();
virtual void init_insert_mode( TMask& m );
virtual void init_modify_mode( TMask& m );
void elimina_vuote( const TMask& m);
void salva_conguaglio( const TMask& m);
void storna_conguaglio();
void storna_date();
void date_dotmp( const TMask& m);
virtual const char * query_mask_name() { return "lv3100a"; }
public:
TGiac_per_cli& giacenza();
TGestione_bolle_app() {}
};
inline TGestione_bolle_app& gbapp() { return (TGestione_bolle_app &)main_app(); };
//////////////////////////////////////////
//// CLASSE TGESTIONE_BOLLE_MSK ////
//////////////////////////////////////////
//ARROTONDA: metodo che arrotonda la quantit<69> che gli passo se <20> previsto sul contratto
void TGestione_bolle_msk::arrotonda(const TMask& msk, real& quantita)
{
int perarr = ini_get_int(CONFIG_DITTA, "lv", "Perarr");
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_int(LVRCONDV_CALCCONS) == 1)
{
//calcolo di quanti pezzi sforo
real qta_cong = quantita - rcont.get_real(LVRCONDV_QTACONG);
if (qta_cong < 0)
qta_cong = ZERO;
long nconf = qta_cong.integer() / ppconf;
long arr = qta_cong.integer() % ppconf;
//calcolo quanti pezzi in pi<70> o in meno gli devo dare e aggiorno la quantit<69>
if (arr > ppconf * perarr / 100) //arr <= ppconf*perarr/100 -> formula calcolo congualgio di Tassan
nconf++;
quantita = nconf * ppconf;
}
}
}
void TGestione_bolle_msk::calc_rit_cons_prec()
{
TSheet_field& sheet = sfield(F_SHEET);
//fisso l'anno esercizio
TEsercizi_contabili& esc = esercizi();
const int last_esc = esc.last();
_rit_prec.destroy();
_cons_prec.destroy();
_rit_prec_tmp.destroy();
_cons_prec_tmp.destroy();
_dot_tmp.destroy();
FOR_EACH_SHEET_ROW_BACK(sheet, r, row)
{
const TCausale_lavanderie & cau = cached_causale_lavanderie(row->get(sheet.cid2index(FR_CODAGG1)));
const TString codart(row->get(sheet.cid2index(FR_CODART)));
real * tmp = (real *) _rit_prec.objptr(codart);
if (tmp == NULL)
_rit_prec.add(codart, tmp = new real);
*tmp = cau.causale_ritiro().sgn(s_dotod) * ((real) row->get(sheet.cid2index(FR_QTAGG1)));
if (cau.causale_ritiro().sgn(s_dottm) != 0)
{
tmp = (real *) _rit_prec_tmp.objptr(codart);
if (tmp == NULL)
_rit_prec_tmp.add(codart, tmp = new real);
*tmp = cau.causale_ritiro().sgn(s_dottm) * ((real) row->get(sheet.cid2index(FR_QTAGG1)));
}
tmp = (real *) _cons_prec.objptr(codart);
if (tmp == NULL)
_cons_prec.add(codart, tmp = new real);
*tmp = cau.causale_consegna().sgn(s_dotod) * ((real) row->get(sheet.cid2index(FR_QTA)));
if (cau.causale_consegna().sgn(s_dottm) != 0)
{
tmp = (real *) _cons_prec_tmp.objptr(codart);
if (tmp == NULL)
_cons_prec_tmp.add(codart, tmp = new real);
*tmp = cau.causale_consegna().sgn(s_dottm) * ((real) row->get(sheet.cid2index(FR_QTA)));
}
tmp = (real *) _dot_tmp.objptr(codart);
if (tmp == NULL)
_dot_tmp.add(codart, tmp = new real);
*tmp = (real) row->get(sheet.cid2index(FR_JOLLY2));
}
}
//DETTAGLIO_CAUSALE: metodo che setta esplode la causale negli appositi campi
void TGestione_bolle_msk::dettaglio_causale(TSheet_field& ss)
{
TGestione_bolle_msk& dmsk = (TGestione_bolle_msk&) ss.mask();
TString4 causale = ss.cell(ss.selected(),ss.cid2index(FR_CODAGG1));
//instanzio una cache sulle causali
const TCausale_lavanderie & cau = cached_causale_lavanderie(causale);
//esplodo la causale
dmsk.set(F_LVCODCAU, cau.codice());
dmsk.set(F_LVDESCAU, cau.descr());
}
//PROPONI_DATAPRCO: metodo che propone la prima data di prevista consegna
TDate TGestione_bolle_msk::proponi_dataprco() const
{
TDate dadata = get(F_DATADOC);
TDate dataprco = NULLDATE;
if (dadata.ok())
{
TDate adata = dadata;
++dadata;
adata.addmonth(1);
TString query = "USE LVRCONSPLAN KEY 3\n";
query << "FROM CODCF=" << get(F_CODCF) << " CODCONT=" << get(F_LVCODCONT) << " DTCONS=" << dadata << "\n";
query << "TO CODCF=" << get(F_CODCF) << " CODCONT=" << get(F_LVCODCONT) << " DTCONS=" << adata << "\n";
TISAM_recordset consegne(query);
if (consegne.move_first())
dataprco = consegne.get(LVRCONSPLAN_DTCONS).as_date();
}
return dataprco;
}
//PROPONI_AUTISTA: metodo che propone l'autista previsto per la data di prevista consegna
TString8 TGestione_bolle_msk::proponi_autista() const
{
const TDate datadoc = get(F_DATADOC);
const int indsped = get_int(F_CODINDSP);
const long codcf = get_long(F_CODCF);
const long codcont = lv_find_contract(codcf, indsped, datadoc);
TDate dataprco;
if (datadoc.ok())
{
TDate adata = datadoc;
adata.addmonth(1);
TString query = "USE LVRCONSPLAN KEY 3\n";
query << "FROM CODCF=" << codcf << " CODCONT=" << codcont << " DTCONS=" << datadoc << "\n";
query << "TO CODCF=" << codcf << " CODCONT=" << codcont << " DTCONS=" << adata << "\n";
TISAM_recordset consegne(query);
if (consegne.items() >= 2)
{
consegne.move_to(1);
dataprco = consegne.get(LVRCONSPLAN_DTCONS).as_date();
}
}
TString query = "USE LVRCONSPLAN KEY 3\n";
query << "FROM CODCF=" << codcf << " CODCONT=" << codcont << " DTCONS=#DADATA\n";
query << "TO CODCF=" << codcf << " CODCONT=" << codcont << " DTCONS=#ADATA\n";
TISAM_recordset consegne(query);
consegne.set_var("#DADATA", dataprco);
consegne.set_var("#ADATA", dataprco);
consegne.move_first();
TString8 codaut = consegne.get(LVRCONSPLAN_CODAUT).as_string().right(5); codaut.trim();
if (codaut.empty())
{
TToken_string key;
key.add('C');
key.add(codcf);
const TRectype& cfven = cache().get(LF_CFVEN, key);
codaut = cfven.get(CFV_CODAG);
}
return codaut;
}
////////////////////////////
// HANDLER DI DOCUMENTO //
////////////////////////////
void TGestione_bolle_msk:: on_idle()
{
TDocumento_mask::on_idle();
if (_autoselect >= 0)
{
TSheet_field& s = sfield(F_SHEET);
if (_autoselect < s.items())
{
//per ora 4 fisso perch<63> non sappiamo calcolare la colonna del ritirato
s.set_focus_cell_id(_autoselect, FR_QTAGG1);
dettaglio_causale(s);
}
_autoselect = -1;
}
}
//magico metodo per settare, al cambio riga dello sheet, il focus sul campo desiderato (il campo in questione <20>..
//..definito nella on_idle(); ricordarsi la set_notify() nel costruttore della maschera senno' viene eseguito l'ss_notify()..
//..standard e non questo qui ridefinito. Allah!
bool TGestione_bolle_msk::ss_notify(TSheet_field& ss, int r, KEY key)
{
TGestione_bolle_msk& dmsk = (TGestione_bolle_msk&) ss.mask();
if (key == K_TAB && dmsk._autoselect < 0 && dmsk.is_running())
dmsk._autoselect = r; //riga per settare il focus
return TDocumento_mask::ss_notify(ss, r, key);
}
//SS_HANDLER: handler che mi peremette di evitare la registrazione in caso di documento
//senza righe valide (cio<69> con quantit<69> diverese da zero)
bool TGestione_bolle_msk::ss_handler(TMask_field& f, KEY key)
{
if ((key == K_ENTER) && f.mask().insert_mode())
{
TSheet_field& ss = (TSheet_field&)f;
bool vuote = true;
if (ss.items() > 0)
vuote = false;
if(!vuote)
{
vuote = true;
FOR_EACH_SHEET_ROW(ss, r, row)
{
if (row->get_int(ss.cid2index(FR_QTA)) != 0 || row->get_int(ss.cid2index(FR_QTAGG1)) != 0)
vuote = false;
}
}
if (!app().is_transaction() && vuote)
return error_box(TR("Il documento e' privo di righe valide e pertanto verr<72> ignorato"));
}
return TDocumento_mask::ss_handler(f, key);
}
//LV_DATA_HANDLER: handler che si occupa di decodificare i campi data in testata
bool TGestione_bolle_msk::lv_data_handler(TMask_field& f, KEY k)
{
bool ok = true;
switch(f.dlg())
{
case F_DATADOC: ok = data_hndl( f, k ); break;
default: break;
}
TGestione_bolle_msk& dmsk = (TGestione_bolle_msk&)f.mask();
TDate oggi(TODAY);
TDate primo = oggi;
primo.set_day(1);
if (dmsk.get_date(F_DATADOC) != oggi)
{
oggi = dmsk.get_date(F_DATADOC);
primo = oggi;
primo.set_day(1);
}
//decodifica del giorno della settimana
dmsk.set(F_LVGIORNO, itow(oggi.wday()));
//settimana del mese = settimana(oggi) - settimana(primo del mese) + 1
long tmp = oggi.week() - primo.week() + 1;
TString4 settimana;
settimana << tmp;
dmsk.set(F_LVSETTIMANA, settimana);
return ok;
}
//LV_CONTRATTO_HANDLER: handler che si occupa di riempire il campo contratto in testata
bool TGestione_bolle_msk::lv_contratto_handler(TMask_field& f, KEY k)
{
TGestione_bolle_msk& dmsk = (TGestione_bolle_msk&)f.mask();
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;
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;
}
else
{
dmsk.TMask::set(F_LVCODCONT, codcont);
const TDate dataprco = dmsk.proponi_dataprco();
if (dataprco.ok() && dmsk.get(F_LVDATAPRCO).empty())
dmsk.set(F_LVDATAPRCO, dataprco);
}
TDocumento& doc = dmsk.doc();
doc.put(DOC_CODCONT, codcont);
return true;
}
//LV_DATAPRCO_HANDLER: handler che si occupa della gestione del campo "data di prevista consegna"
bool TGestione_bolle_msk::lv_dataprco_handler(TMask_field& f, KEY k)
{
//se sto leggendo o generando un buono di ritiro, abilito questo campo
if (k == K_TAB)
{
TGestione_bolle_msk& dmsk = (TGestione_bolle_msk&)f.mask();
TDocumento& doc = dmsk.doc();
//se la data viene modificata a mano, controlla se <20> una data di previsto passaggio;
//se non lo <20> chiedi conferma se si desidera mantenre la data indicata manualmente o se
//<2F> meglio riproporre la data di previsto passaggio
if (!f.empty() && f.focusdirty() && doc.get_date("DATAPRCO") != (TDate)f.get())
{
doc.put("DATAPRCO", f.get());
TString query1 = "USE LVRCONSPLAN KEY 3\n";
query1 << "FROM CODCF=" << dmsk.get(F_CODCF) << " CODCONT=\"" << dmsk.get(F_LVCODCONT) << "\" DTCONS=" << f.get() << "\n";
query1 << "TO CODCF=" << dmsk.get(F_CODCF) << " CODCONT=\"" << dmsk.get(F_LVCODCONT) << "\" DTCONS=" << f.get() << "\n";
TISAM_recordset consegne(query1);
if (!consegne.move_first())
{
f.set_focusdirty(false);
if (!yesno_box(TR("Non <20> previsto nessun passaggio per questa data, confermi lo stesso?")))
{
const TDate dataprco = dmsk.proponi_dataprco();
if (dataprco.ok())
{
f.set(dataprco);
doc.put("DATAPRCO", dataprco);
}
}
}
}
}
return true;
}
//LV_LOADPRICE_HANDLER: handler di bolla, aggiorna i prezzi sulle righe
bool TGestione_bolle_msk::lv_loadprice_handler(TMask_field& f, KEY k)
{
bool ok = true;
if (k == K_SPACE)
{
TGestione_bolle_msk& dmsk = (TGestione_bolle_msk&)f.mask();
const long codcf = dmsk.get_long(F_CODCF);
const TDate datadoc = dmsk.get_date(F_DATADOC);
const long codcont = lv_find_contract(codcf, 0, datadoc);
if (codcf > 0L && codcont > 0)
{
TSheet_field& sheet = dmsk.sfield(F_SHEET);
const TLaundry_contract tcont(codcf, codcont);
TDocumento& doc = dmsk.doc();
int nrighe = sheet.items();
for (int i = 0; i < nrighe; i++)
{
TToken_string& row = sheet.row(i);
const TString & codart = row.get(sheet.cid2index(FR_CODARTMAG));
const TRectype & rcont = tcont.row(codart);
const TString prezzo = rcont.get(LVRCONDV_PREZZO);
row.add(prezzo, sheet.cid2index(FR_PREZZO));
sheet.check_row(i, 0x3);
doc[i + 1].autosave(sheet);
}
sheet.force_update();
}
}
return ok;
}
bool TGestione_bolle_msk::lv_planning_handler(TMask_field& f, KEY k)
{
if (k == K_SPACE)
{
TRelation_application& app = (TRelation_application&) main_app();
TGestione_bolle_msk& dmsk = (TGestione_bolle_msk&)f.mask();
TString str;
str << "lv0 -4 " << dmsk.get(F_CODCF) << " 1";
TExternal_app planning(str);
planning.run();
}
return true;
}
//LV_BOLLA_HANDLER: handler di bolla, carica le righe contratto sulle bolle, preparando la struttura del documento
bool TGestione_bolle_msk::lv_bolla_handler(TMask_field& f, KEY k)
{
bool ok = true;
if (!f.to_check(k, true))
return ok;
switch(f.dlg())
{
case F_CODCF: ok = TDocumento_mask::clifo_handler(f, k); break;
default: break;
}
TGestione_bolle_msk& dmsk = (TGestione_bolle_msk&)f.mask();
if (dmsk.mode() == MODE_INS)
dmsk.set(F_CODAG, dmsk.proponi_autista());
if (ok && k == K_TAB && ((dmsk.insert_mode() && f.to_check(k, true)) || f.focusdirty()) && dmsk.mode() != MODE_MOD )
{
f.set_focusdirty(false);
TDocumento& doc = dmsk.doc();
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)
{
f.warning_box(TR("Non ci sono contratti in essere alla data indicata"));
return true;
}
else
{
doc.put(DOC_CODCF, codcf);
doc.put(DOC_DATADOC, datadoc);
doc.put(DOC_CODINDSP, indsped);
doc.put(DOC_CODCONT, codcont);
const TDate dataprco = dmsk.proponi_dataprco();
if (dataprco.ok() && dmsk.get(F_LVDATAPRCO).empty())
doc.put("DATAPRCO", dataprco);
}
if (dmsk._stcodcf == codcf && dmsk._stcodcont == codcont && nrighe > 0)
return true;
doc.clifor().cli2doc(doc);
dmsk.mask2doc();
dmsk._stcodcf = codcf;
dmsk._stcodcont = codcont;
TString8 cc; cc << codcont;
dmsk.set(F_LVCODCONT, cc); // Mostra subito il codice contratto!
//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);
//leggo dalla configurazione i codici magazzino e deposito standard
TString8 codmag;
codmag << ini_get_string(CONFIG_DITTA, "lv", "CODMAG") << ini_get_string(CONFIG_DITTA, "lv", "CODMAGC");
//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();
TString4 causale = rcont.get(LVRCONDV_CAUSLAV).as_string();
if (causale.blank() || atoi(causale) == 0)
causale = ini_get_string(CONFIG_DITTA, "lv", "CAUSLAV");
//instanzio una cache sulle anagrafice di magazzino
const TRectype& anamag = cache().get(LF_ANAMAG,codart);
TToken_string key;
key.add(codart);
key.add(1);
const TRectype& umart = cache().get(LF_UMART, key);
TString descrart;
descrart << anamag.get(ANAMAG_DESCR) << anamag.get(ANAMAG_DESCRAGG);
rdoc.put(RDOC_CODART,codart);
rdoc.put(RDOC_CODARTMAG,codart);
rdoc.put(RDOC_CHECKED,'X');
if (descrart.len() > 50)
{
rdoc.put(RDOC_DESCR, descrart.left(50));
rdoc.put(RDOC_DESCLUNGA, true);
rdoc.put(RDOC_DESCEST, descrart.sub(50));
}
else
rdoc.put(RDOC_DESCR, descrart);
rdoc.put(RDOC_UMQTA, umart.get(UMART_UM));
rdoc.put(RDOC_CODAGG1,causale);
rdoc.put(RDOC_CODIVA,anamag.get(ANAMAG_CODIVA));
TString8 codmagold = rdoc.get(RDOC_CODMAG);
if (codmagold.empty())
{
const TCausale_lavanderie & cau = cached_causale_lavanderie(causale);
const TCausale_magazzino rit = cau.causale_ritiro();
const TCausale_magazzino con = cau.causale_consegna();
TString8 magazzino;
TString8 magazzinoc;
if(rit.get("S10").full())
magazzino = rit.get("S10").mid(0,5);
else
magazzino << ini_get_string(CONFIG_DITTA, "lv", "CODMAG") << ini_get_string(CONFIG_DITTA, "lv", "CODMAGN");
if(con.get("S10").full())
magazzinoc = con.get("S10").mid(0,5);
else
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);
}
//fisso l'anno esercizio
TEsercizi_contabili& esc = esercizi();
const int last_esc = esc.last();
//gestione campi dotazione odierna e dotazione temporanea
const TRecmag_lavanderie & reclav = lv_art_giac(codart, 'C', codcf, indsped, last_esc);
real dotod = reclav.get_real(CLIFOGIAC_DOTOD);
real dotmp = reclav.get_real(CLIFOGIAC_DOTTM);
TDate dadata = rcont.get(LVRCONDV_INDTTMP).as_date();
TDate adata = rcont.get(LVRCONDV_FIDTTMP).as_date();
rdoc.put("DOTOD", dotod);
rdoc.put("DOTMP", dotmp);
real * dtmp = (real *) dmsk.dot_tmp().objptr(codart);
if (dtmp == NULL)
dmsk.dot_tmp().add(codart, dtmp = new real);
*dtmp = dotmp;
if (dadata.ok())
rdoc.put("DADATATMP", dadata);
if (adata.ok())
rdoc.put("ADATATMP", adata);
//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);
const int righe = doc.physical_rows();
sheet.destroy( );
for (int i = 1; i <= righe; i++)
{
TRiga_documento& r = doc[i];
TToken_string & row = sheet.row(i - 1);
r.autoload(sheet);
const TString codart = row.get(sheet.cid2index(FR_CODARTMAG));
const TCausale_lavanderie & cau = cached_causale_lavanderie(r.get(RDOC_CODAGG1));
const TRectype & rowcontr = tcont.row(codart);
const bool artbloc = rowcontr.get_int(LVRCONDV_ARTBLOC) == 0;
const bool dottemp = r.get_real("DOTMP") != ZERO;
sheet.enable_cell(i - 1, sheet.cid2index(FR_QTA), cau.is_consegna() && artbloc);
sheet.enable_cell(i - 1, sheet.cid2index(FR_QTAGG1), cau.is_ritiro());
sheet.enable_cell(i - 1, sheet.cid2index(FR_JOLLY3), dottemp);
sheet.enable_cell(i - 1, sheet.cid2index(FR_JOLLY4), dottemp);
if (row.get_int(sheet.cid2index(FR_TIPORIGA)) == 22)
{
sheet.disable_cell(i - 1, sheet.cid2index(FR_JOLLY1));
sheet.disable_cell(i - 1, sheet.cid2index(FR_JOLLY2));
sheet.disable_cell(i - 1, sheet.cid2index(FR_JOLLY3));
sheet.disable_cell(i - 1, sheet.cid2index(FR_JOLLY4));
}
if (sheet.exist_column(FR_JOLLY5) || sheet.exist_column(FR_JOLLY6))
{
//gestione campi consegnato anno e mese
//fisso l'anno esercizio
TEsercizi_contabili& esc = esercizi();
const int last_esc = esc.last();
//estraggo il record corrispondente su LF_CLIFOGIAC
const TRecmag_lavanderie & reclav = lv_art_giac(codart, 'C', codcf, indsped, last_esc);
TDate da(datadoc);
TDate a(da);
da.set_day(1);
a.set_end_month();
const real consanno = reclav.get_real(CLIFOGIAC_CONSANNO);
const real consmese = reclav.consmese(da, a);
if (sheet.exist_column(FR_JOLLY5))
{
row.add(consanno.stringa(), sheet.cid2index(FR_JOLLY5));
sheet.disable_cell(i - 1, sheet.cid2index(FR_JOLLY5));
}
if (sheet.exist_column(FR_JOLLY6))
{
row.add(consmese.stringa(), sheet.cid2index(FR_JOLLY6));
sheet.disable_cell(i - 1, sheet.cid2index(FR_JOLLY6));
}
}
sheet.check_row(i - 1, 0x3);
row.add(r.get(RDOC_SCONTO), sheet.cid2index(FR_SCONTO));
}
FOR_EACH_MASK_FIELD(dmsk, i, f)
{
if (f->is_edit() && (f->active() || f->ghost()) && !f->empty())
{
TEdit_field& ef = *(TEdit_field*)f;
if (ef.dlg() == F_CODCF)
continue;
if (ef.has_check())
{
if (ef.browse()->secondary())
continue;
else
ef.check(STARTING_CHECK);
}
ef.on_hit();
}
}
dmsk.highlight();
dmsk._autoselect = 0;
}
return ok;
}
void TGestione_bolle_msk::update_conguaglio()
{
real conguaglio;
TSheet_field & sheet = sfield(F_SHEET);
int row = sheet.selected();
TMask & row_mask = sheet.sheet_row_mask(row);
TRiga_documento& rdoc = doc()[row + 1];
if (ini_get_bool(CONFIG_DITTA, "lv", "Aggcong"))
{
const TString & causale = row_mask.get(FR_CODAGG1);
const TCausale_lavanderie & cau = cached_causale_lavanderie(causale);
if (cau.movcong())
{
const TString & codart = row_mask.get(FR_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)
{
const long codcf = get_long(F_CODCF);
const int indsped = get_int(F_CODINDSP);
TDate datadoc = get_date(F_DATADOC);
if (!datadoc.ok())
datadoc = TODAY;
const TLaundry_contract cont(codcf, indsped, datadoc);
const TRectype& rcont = cont.row(codart);
//recupero i dati di interesse dalla riga del contratto
if (rcont.get_int(LVRCONDV_CALCCONS) == 1)
{
real consegnato = row_mask.get_real(FR_QTA);
real ritirato = row_mask.get_real(FR_QTAGG1);
real qta_cong = ritirato - rcont.get_real(LVRCONDV_QTACONG);
conguaglio = consegnato - qta_cong;
}
}
}
}
row_mask.set(FR_QTAGG5, conguaglio);
rdoc.put(RDOC_QTAGG5, conguaglio);
}
///////////////////////
// HANDLER DI RIGA //
///////////////////////
//LV_RITIRATO_HANDLER: handler sul campo ritirato, che copia nel campo consegnato
//lo stesso valore eventualmente arrotondato e aggiorna il campo "dotazione odierna" (sempre)
//e il campo "dotazione temporanea" (se la causale <20> giusta)
bool TGestione_bolle_msk::lv_ritirato_handler(TMask_field& f, KEY k)
{
if (f.to_check(k))
{
//maschera di riga
TMask& msk = f.mask();
//maschera di documento
TSheet_field* sheet = msk.get_sheet();
TGestione_bolle_msk& dmask = (TGestione_bolle_msk&)sheet->mask();
const long codcf = dmask.get_long(F_CODCF);
const int indsped = dmask.get_int(F_CODINDSP);
TDate datadoc = dmask.get_date(F_DATADOC);
if (!datadoc.ok())
datadoc = TODAY;
//recupero i valori della dotazione iniziale dal magazzino del cliente
TEsercizi_contabili& esc = esercizi();
const int last_esc = esc.last();
const TString codart = msk.get(FR_CODART);
const TRecmag_lavanderie & magcli = lv_art_giac(codart, 'C', codcf, indsped, last_esc);
long dotin = magcli.get_long(CLIFOGIAC_DOTIN);
const real ritirato = f.get();
real dotod = magcli.get_long(CLIFOGIAC_DOTOD); //segnalazione Tassan mail 05/04/2011 ore 17:08
if (ritirato > dotod && f.dirty() && dotin > 0 && dotod > 0) //accordi da Tassan in data 06/04/2011
warning_box(TR("ATTENZIONE: si sta ritirando un quantitativo maggiore della dotazione!"));
TDocumento& doc = dmask.doc();
TRiga_documento& rdoc = dmask.doc()[sheet->selected()+1];
rdoc.put(RDOC_QTAGG1,ritirato);
TGiac_per_cli& giac = gbapp().giacenza();
const TCausale_lavanderie & cau = cached_causale_lavanderie(msk.get(FR_CODAGG1));
if (msk.get_int(FR_TIPORIGA) == 22)
return true;
if (k == K_TAB && f.focusdirty())
{
real dotod = msk.get_real(FR_JOLLY1);
if (msk.field(FR_QTA).enabled() && !msk.field(FR_QTA).dirty())
{
real consegnato = f.get();
arrotonda(msk, consegnato);
msk.field(FR_QTA).set_focusdirty(true);
msk.set(FR_QTA, consegnato, 0x3);
dotod = msk.get_real(FR_JOLLY1);
}
//gestione campi dotazione odierna e dotazione temporanea
real *rit_prec = (real *) dmask.rit_prec().objptr(codart);
if (rit_prec == NULL)
dmask.rit_prec().add(codart, rit_prec = new real);
dotod += (cau.causale_ritiro().sgn(s_dotod) * ritirato) - *rit_prec;
*rit_prec = cau.causale_ritiro().sgn(s_dotod) * ritirato;
msk.set(FR_JOLLY1, dotod);
rdoc.put("DOTOD", dotod);
//scrivo la dotazione temporanea solo se esistono le date di dotazione temporanea e questa non <20> scaduta
real * dotmp = (real *) dmask.dot_tmp().objptr(codart);
if (dotmp == NULL)
dmask.dot_tmp().add(codart, dotmp = new real);
real *rit_prec_tmp = (real *) dmask.rit_prec_tmp().objptr(codart);
if (rit_prec_tmp == NULL)
dmask.rit_prec_tmp().add(codart, rit_prec_tmp = new real);
*dotmp += (cau.causale_ritiro().sgn(s_dottm) * ritirato) - * rit_prec_tmp;
*rit_prec_tmp = cau.causale_ritiro().sgn(s_dottm) * ritirato;
msk.set(FR_JOLLY2, *dotmp);
rdoc.put("DOTMP", *dotmp);
if (*dotmp < ZERO)
warning_box(TR("ATTENZIONE: si sta ritirando un quantitativo maggiore della dotazione temporanea!"));
if (msk.field(FR_TIPORIGA).get_long() != 22)
{
//setto le date di inizio e fine della dotazione temporanea
//disabilito i campi di dotazione temporanea se la causale non prevede la loro movimentazione
if (*dotmp > ZERO)
{
const TLaundry_contract cont(codcf, indsped, datadoc);
const TRectype& rcont = cont.row(codart);
TDate dadata = rcont.get_date(LVRCONDV_INDTTMP);
TDate adata = rcont.get_date(LVRCONDV_FIDTTMP);
msk.field(FR_JOLLY3).enable();
msk.field(FR_JOLLY4).enable();
if (!dadata.ok())
dadata = datadoc;
if (msk.get(FR_JOLLY3).blank())
{
rdoc.put("DADATATMP", dadata);
msk.set(FR_JOLLY3, dadata);
if (adata.ok())
{
rdoc.put("ADATATMP", adata);
msk.set(FR_JOLLY4, adata);
}
else
{
TISAM_recordset giri("USE LVRCONSPLAN KEY 3\nSELECT DTCONS>#DATADOC\nFROM CODCF=#CODCF CODCONT=#CODCONT\nTO CODCF=#CODCF CODCONT=#CODCONT");
giri.set_var("#DATADOC", datadoc);
giri.set_var("#CODCF", codcf);
giri.set_var("#CODCONT", cont.get_long(LVCONDV_CODCONT));
if (giri.move_first())
{
rdoc.put("ADATATMP", giri.get(LVRCONSPLAN_DTCONS).as_date());
msk.set(FR_JOLLY4, giri.get(LVRCONSPLAN_DTCONS).as_date());
}
}
}
}
else
{
if (cau.causale_ritiro().sgn(s_dottm) != 0 || cau.causale_consegna().sgn(s_dottm) != 0)
{
msk.field(FR_JOLLY3).reset();
msk.field(FR_JOLLY4).reset();
}
msk.field(FR_JOLLY3).disable();
msk.field(FR_JOLLY4).disable();
}
}
}
}
return true;
}
//LV_CONSEGNATO_HANDLER: per adesso <20> solo un segna - posto
bool TGestione_bolle_msk::lv_consegnato_handler(TMask_field& f, KEY k)
{
if (qta_handler(f, k) && k == K_TAB && f.focusdirty())
{
TMask& msk = f.mask();
real consegnato = f.get();
//gestione campi dotazione odierna e dotazione temporanea
TSheet_field* sheet = msk.get_sheet();
TGestione_bolle_msk & dmask = (TGestione_bolle_msk &)sheet->mask();
TDocumento& doc = dmask.doc();
TRiga_documento& rdoc = dmask.doc()[sheet->selected()+1];
const long codcf = dmask.get_long(F_CODCF);
const int indsped = dmask.get_int(F_CODINDSP);
TDate datadoc = dmask.get_date(F_DATADOC);
if (!datadoc.ok())
datadoc = TODAY;
const TCausale_lavanderie & cau = cached_causale_lavanderie(msk.get(FR_CODAGG1));
const TString codart = msk.get(FR_CODART);
rdoc.put(RDOC_QTA, consegnato);
dmask.update_conguaglio();
TGiac_per_cli& giac = gbapp().giacenza();
// real dotod = giac.giac_att(rdoc, true);
real dotod = msk.get_real(FR_JOLLY1);
real *cons_prec = (real *) dmask.cons_prec().objptr(codart);
if (cons_prec == NULL)
dmask.cons_prec().add(codart, cons_prec = new real);
dotod += (cau.causale_consegna().sgn(s_dotod) * consegnato) - *cons_prec;
*cons_prec = cau.causale_consegna().sgn(s_dotod) * consegnato;
msk.set(FR_JOLLY1, dotod);
rdoc.put("DOTOD", dotod);
//scrivo la dotazione temporanea solo se esistono le date di dotazione temporanea e questa non <20> scaduta
real * dotmp = (real *)dmask.dot_tmp().objptr(codart);
if (dotmp == NULL)
dmask.dot_tmp().add(codart, dotmp = new real);
real *cons_prec_tmp = (real *) dmask.cons_prec_tmp().objptr(codart);
if (cons_prec_tmp == NULL)
dmask.cons_prec_tmp().add(codart, cons_prec_tmp = new real);
*dotmp += (cau.causale_consegna().sgn(s_dottm)* consegnato) - *cons_prec_tmp;
*cons_prec_tmp = cau.causale_consegna().sgn(s_dottm) * consegnato;
msk.set(FR_JOLLY2, *dotmp);
rdoc.put("DOTMP", *dotmp);
if (msk.field(FR_TIPORIGA).get_long() != 22)
{
//setto le date di inizio e fine della dotazione temporanea
//disabilito i campi di dotazione temporanea se la causale non prevede la loro movimentazione
if (*dotmp > ZERO)
{
const TLaundry_contract cont(codcf, indsped, datadoc);
const TRectype& rcont = cont.row(codart);
TDate dadata = rcont.get_date(LVRCONDV_INDTTMP);
TDate adata = rcont.get_date(LVRCONDV_FIDTTMP);
msk.field(FR_JOLLY3).enable();
msk.field(FR_JOLLY4).enable();
if (!dadata.ok())
dadata = datadoc;
if (msk.get(FR_JOLLY3).blank())
{
rdoc.put("DADATATMP", dadata);
msk.set(FR_JOLLY3, dadata);
if (adata.ok())
{
rdoc.put("ADATATMP", adata);
msk.set(FR_JOLLY4, adata);
}
else
{
const TLaundry_contract cont(codcf, indsped, datadoc);
TISAM_recordset giri("USE LVRCONSPLAN KEY 3\nSELECT DTCONS>#DATADOC\nFROM CODCF=#CODCF CODCONT=#CODCONT\nTO CODCF=#CODCF CODCONT=#CODCONT");
giri.set_var("#DATADOC", datadoc);
giri.set_var("#CODCF", codcf);
giri.set_var("#CODCONT", cont.get_long(LVCONDV_CODCONT));
if (giri.move_first())
{
rdoc.put("ADATATMP", giri.get(LVRCONSPLAN_DTCONS).as_date());
msk.set(FR_JOLLY4, giri.get(LVRCONSPLAN_DTCONS).as_date());
}
}
}
}
else
{
if (cau.causale_ritiro().sgn(s_dottm) != 0 || cau.causale_consegna().sgn(s_dottm) != 0)
{
msk.field(FR_JOLLY3).reset();
msk.field(FR_JOLLY4).reset();
}
msk.field(FR_JOLLY3).disable();
msk.field(FR_JOLLY4).disable();
}
}
}
return true;
}
//LV_CODART_HANDLER: handler sul campo codice articolo, che carica la causale relativa all'articolo
//e controlla se l'articolo che si sta inserendo fa parte della dotazione del cliente
bool TGestione_bolle_msk::lv_codart_handler(TMask_field& f, KEY k)
{
bool ok = true;
if (f.to_check(k))
{
TMask& msk = f.mask();
TGestione_bolle_msk& dmsk = (TGestione_bolle_msk&) msk.get_sheet()->mask();
TSheet_field* sheet = msk.get_sheet();
TRiga_documento& rdoc = dmsk.doc()[sheet->selected()+1];
//recupero dal documento i dati di interesse per recuperare...
//...i dati dalla riga contratto
TDate datadoc = dmsk.get_date(F_DATADOC);
const long codcf = dmsk.get_long(F_CODCF);
const int indsped = dmsk.get_int(F_CODINDSP);
if (!datadoc.ok())
datadoc = TODAY;
const TString& codart = msk.get(FR_CODART);
bool changed = codart != rdoc.get(RDOC_CODART);
TLaundry_contract cont(codcf, indsped, datadoc);
const TRectype& rcont = cont.row(codart);
if (codart.full() && changed && codart_handler(f, k))
{
rdoc.put(RDOC_CODART, codart);
//cerco la causale relativa all'articolo; se non la trovo prendo quella standard
TString4 causale = rcont.get(LVRCONDV_CAUSLAV);
if (causale.blank() || atoi(causale) == 0 )
causale = ini_get_string(CONFIG_DITTA, "lv", "CAUSLAV");
//gestione campi dotazione odierna e dotazione temporanea
//fisso l'anno esercizio
TEsercizi_contabili& esc = esercizi();
const int last_esc = esc.last();
if (rdoc.get(RDOC_CODAGG1).empty())
msk.set(FR_CODAGG1, causale);
// msk.efield(FR_CODAGG1).on_hit();
dmsk.update_conguaglio();
if (rcont.empty())
{
real prezzo;
TString sconto;
//PROPONI PREZZO
TToken_string key;
key.add('C');
key.add(codcf);
const TRectype& cfven = cache().get(LF_CFVEN, key);
bool listfound = false;
if (!cfven.empty())
{
//se <20> settata la categoria merceologica, leggo sia il listino che la cat merc, altrimenti solo il listino
TString8 codlis = cfven.get(CFV_CODLIST);
TString8 catven;
if (!ini_get_bool(CONFIG_DITTA, "ve", "GESLISCV"))
catven = "";
else
catven = cfven.get(CFV_CATVEN);
//cerco il prezzo sul listino
key.cut(0);
key.add('L'); //tipo
key.add(catven); //catven
key.add(""); //tipocf
key.add(""); //codcf
key.add(codlis); //codlis
key.add('A'); //tiporiga
key.add(codart); //codriga
key.add(""); //um
key.add(""); //nscagl
const TRectype& rcondv = cache().get(LF_RCONDV, key);
listfound = !rcondv.empty();
if (listfound)
{
prezzo = rcondv.get_real(RCONDV_PREZZO);
sconto = rcondv.get(RCONDV_SCONTO);
}
}
//se non ho trovato un listino, o se non c'<27> un listino impostato
//propongo come prezzo il valore convenzionale
if (!listfound)
{
key.cut(0);
key.add(codart);
key.add(1);
const TRectype& umart = cache().get(LF_UMART, key);
listfound = !umart.empty();
if (listfound)
prezzo = umart.get_real(UMART_PREZZO);
}
rdoc.put(RDOC_PREZZO, prezzo);
msk.set(FR_PREZZO, prezzo);
if (sconto.blank())
sconto = rcont.get(LVRCONDV_SCONTPERC);
rdoc.put(RDOC_SCONTO, sconto);
msk.set(FR_SCONTO, sconto);
}
else
{
real prezzo;
const int tplis = cont.get_int(LVCONDV_TIPOLIS); //tipo listino
if (tplis == 0)
prezzo = rcont.get_real(LVRCONDV_PREZZO);
else
{
const TRectype& anamag = cache().get(LF_ANAMAG,codart);
prezzo = anamag.get_real(ANAMAG_COSTSTD);
}
rdoc.put(RDOC_PREZZO, prezzo);
msk.set(FR_PREZZO, prezzo);
const TString& sconto = rcont.get(LVRCONDV_SCONTPERC);
rdoc.put(RDOC_SCONTO, sconto);
msk.set(FR_SCONTO, sconto);
}
if (sheet->exist_column(FR_JOLLY5) || sheet->exist_column(FR_JOLLY6))
{
//gestione campi dotazione consegnato mese e anno
//fisso l'anno esercizio
TEsercizi_contabili& esc = esercizi();
const int last_esc = esc.last();
//estraggo il record corrispondente su LF_CLIFOGIAC
const TRecmag_lavanderie & reclav = lv_art_giac(codart, 'C', codcf, indsped, last_esc);
TDate da(datadoc);
TDate a(da);
TToken_string row = sheet->row(sheet->selected());
da.set_day(1);
da.set_end_month();
const real consanno = reclav.get_real(CLIFOGIAC_CONSANNO);
const real consmese = reclav.consmese(da, a);
if (sheet->exist_column(FR_JOLLY5))
{
msk.set(FR_JOLLY5, consanno);
row.add(consanno.stringa(), sheet->cid2index(FR_JOLLY5));
}
if (sheet->exist_column(FR_JOLLY6))
{
msk.set(FR_JOLLY6, consmese);
row.add(consmese.stringa(), sheet->cid2index(FR_JOLLY6));
}
}
}
//controllo se si vuole aggiungere un eventuale nuovo articolo al contratto
if (cont.get_int(LVCONDV_CODCONT) <= 0)
warning_box(TR("ATTENZIONE: stai generando una bolla per un cliente che non ha nessun contratto in essere"));
else if (k == K_ENTER && codart.full() && 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?"))) // && f.dirty()
{
cont.add_row(codart);
//questo pezzo sostituisce il metodo edit
TFilename ininame; ininame.temp();
{
TConfig ini(ininame, "Transaction");
ini.set("Action", "LINK");
ini.set_paragraph("168");
ini.set(LVCONDV_CODCF, codcf);
ini.set(LVCONDV_CODCONT, cont.get_int(LVCONDV_CODCONT));
}
TString app = "lv0 -3";
app << " -i" << ininame;
app << " -c" << codart;
TExternal_app a(app);
ok = a.run() == 0;
}
}
return ok;
}
//LV_CAUSALE_HANDLER: handler che abilita e/o disabilita i campi di consegnato e ritirato in base alla causale
//e tenendo conto se l'articolo <20> bloccato o meno
bool TGestione_bolle_msk::lv_causale_handler(TMask_field& f, KEY k)
{
if (f.to_check(k, false))
{
//leggo la causale che ho scritto nella riga corrente dello sheet
TString4 causale = f.get();
if (causale.full())
{
TMask& msk = f.mask();
//leggo il codart che ho scritto nella riga corrente delle sheet
const TString& codart = msk.get(FR_CODART);
//srcrivo nel documento la causale
TGestione_bolle_msk& dmsk = (TGestione_bolle_msk&) msk.get_sheet()->mask();
TSheet_field& sheet = dmsk.sfield(F_SHEET);
const TCausale_lavanderie & cau = cached_causale_lavanderie(causale);
dmsk.set(F_LVCODCAU, cau.codice());
dmsk.set(F_LVDESCAU, cau.descr());
TDocumento& doc = dmsk.doc();
TRiga_documento& rdoc = doc[msk.get_sheet()->selected()+1];
TString4 codmag(doc.clifor().vendite().get(CFV_CODMAG));
TString4 coddep(doc.clifor().vendite().get(CFV_CODDEP));
TString4 codmagcoll(codmag);
TString4 coddepcoll(coddep);
rdoc.put(RDOC_CODAGG1, causale);
const TCausale_magazzino rit = cau.causale_ritiro();
const TCausale_magazzino con = cau.causale_consegna();
TString8 magazzino;
TString8 magazzinoc;
if(rit.get("S10").full())
magazzino = rit.get("S10").mid(0,5);
else
magazzino << ini_get_string(CONFIG_DITTA, "lv", "CODMAG") << ini_get_string(CONFIG_DITTA, "lv", "CODMAGN");
if(con.get("S10").full())
magazzinoc = con.get("S10").mid(0,5);
else
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);
msk.field(FR_CODAGG1).set(causale);
msk.field(FR_CODMAG).set(magazzino.left(3)); msk.field(FR_CODDEP).set(magazzino.mid(3,2));
msk.field(FR_CODMAGC).set(magazzinoc.left(3)); msk.field(FR_CODDEPC).set(magazzinoc.mid(3,2));
//recupero i dati di interesse dalla testata per poter trovare il 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;
//trovo il contratto utlizzato e la riga contratto specifica che mi serve
const TLaundry_contract cont(codcf, indsped, datadoc);
const TRectype& rcont = cont.row(codart);
//movimento o meno la dotazione temporanea/odierna a seconda di cosa prevede la causale
int sgn_rit = 0;
int sgn_con = 0;
if (cau.is_ritiro())
{
const TCausale_magazzino& rit = cau.causale_ritiro();
if (codmagcoll.blank() && rit.has_default_mag())
{
codmagcoll = rit.default_mag();
coddepcoll = rit.default_dep();
}
sgn_rit = rit.sgn(s_dottm);
}
if (cau.is_consegna())
{
const TCausale_magazzino& con = cau.causale_consegna();
if (codmag.blank() && con.has_default_mag())
{
codmag = con.default_mag();
coddep = con.default_dep();
}
sgn_con = con.sgn(s_dottm);
}
//setto il valore della dotazione temporanea
//fisso l'anno esercizio
TEsercizi_contabili& esc = esercizi();
const int last_esc = esc.last();
TDate dadata = rcont.get_date(LVRCONDV_INDTTMP);
TDate adata = rcont.get_date(LVRCONDV_FIDTTMP);
//estraggo il record corrispondente su LF_CLIFOGIAC
if (k == K_TAB && f.focusdirty())
{
real dotod = msk.get_real(FR_JOLLY1);
const real consegnato = msk.get(FR_QTA);
const real ritirato = msk.get(FR_QTAGG1);
{
real *rit_prec = (real *) dmsk.rit_prec().objptr(codart);
if (rit_prec == NULL)
dmsk.rit_prec().add(codart, rit_prec = new real);
dotod += (cau.causale_ritiro().sgn(s_dotod) * ritirato) - *rit_prec;
*rit_prec = cau.causale_ritiro().sgn(s_dotod) * ritirato;
real *cons_prec = (real *) dmsk.cons_prec().objptr(codart);
if (cons_prec == NULL)
dmsk.cons_prec().add(codart, cons_prec = new real);
dotod += (cau.causale_consegna().sgn(s_dotod) * consegnato) - *cons_prec;
*cons_prec = cau.causale_consegna().sgn(s_dotod) * consegnato;
msk.set(FR_JOLLY1, dotod);
rdoc.put("DOTOD", dotod);
}
real * dotmp = (real *)dmsk.dot_tmp().objptr(codart);
if (dotmp == NULL)
dmsk.dot_tmp().add(codart, dotmp = new real);
real *cons_prec_tmp = (real *) dmsk.cons_prec_tmp().objptr(codart);
if (cons_prec_tmp == NULL)
dmsk.cons_prec_tmp().add(codart, cons_prec_tmp = new real);
*dotmp += (cau.causale_consegna().sgn(s_dottm) * consegnato) - *cons_prec_tmp;
*cons_prec_tmp = cau.causale_consegna().sgn(s_dottm) * consegnato;
real *rit_prec_tmp = (real *) dmsk.rit_prec_tmp().objptr(codart);
if (rit_prec_tmp == NULL)
dmsk.rit_prec_tmp().add(codart, rit_prec_tmp = new real);
*dotmp += (cau.causale_ritiro().sgn(s_dottm) * ritirato) - *rit_prec_tmp;
*rit_prec_tmp = cau.causale_ritiro().sgn(s_dottm) * ritirato;
rdoc.put("DOTMP", *dotmp);
msk.set(FR_JOLLY2, *dotmp);
dmsk.update_conguaglio();
}
if(msk.field(FR_TIPORIGA).get_long() != 22)
{
//setto le date di inizio e fine della dotazione temporanea
bool fdotmp = sgn_rit != 0 || sgn_con != 0;
//disabilito i campi di dotazione temporanea se la causale non prevede la loro movimentazione
if (fdotmp)
{
if (msk.get(FR_JOLLY2).full())
{
msk.field(FR_JOLLY3).enable();
msk.field(FR_JOLLY4).enable();
if (!dadata.ok())
dadata = datadoc;
if (msk.get(FR_JOLLY3).blank())
{
rdoc.put("DADATATMP", dadata);
msk.set(FR_JOLLY3, dadata);
if (adata.ok())
{
rdoc.put("ADATATMP", adata);
msk.set(FR_JOLLY4, adata);
}
else
{
TISAM_recordset giri("USE LVRCONSPLAN KEY 3\nSELECT DTCONS>#DATADOC\nFROM CODCF=#CODCF CODCONT=#CODCONT\nTO CODCF=#CODCF CODCONT=#CODCONT");
giri.set_var("#DATADOC", datadoc);
giri.set_var("#CODCF", codcf);
giri.set_var("#CODCONT", cont.get_long(LVCONDV_CODCONT));
if (giri.move_first())
{
rdoc.put("ADATATMP", giri.get(LVRCONSPLAN_DTCONS).as_date());
msk.set(FR_JOLLY4, giri.get(LVRCONSPLAN_DTCONS).as_date());
}
}
}
}
else
{
if (cau.causale_ritiro().sgn(s_dottm) != 0 || cau.causale_consegna().sgn(s_dottm) != 0)
{
dadata = NULLDATE;
adata = NULLDATE;
msk.field(FR_JOLLY3).reset();
msk.field(FR_JOLLY4).reset();
}
msk.field(FR_JOLLY3).disable();
msk.field(FR_JOLLY4).disable();
}
}
}
else
{
msk.field(FR_JOLLY1).disable();
msk.field(FR_JOLLY2).disable();
msk.field(FR_JOLLY3).set(dadata);
msk.field(FR_JOLLY3).disable();
msk.field(FR_JOLLY4).set(adata);
msk.field(FR_JOLLY4).disable();
}
//abilito o disabilito azzerandolo il campo "Ritirato" a seconda di cosa prevede la causale
if (cau.is_ritiro())
msk.field(FR_QTAGG1).enable(true);
else
{
msk.field(FR_QTAGG1).set("");
msk.field(FR_QTAGG1).disable();
}
//abilito o disabilito azzerandolo il campo "Consegnato" a seconda di cosa prevede la causale
//ATTENZIONE: questo campo risulta sempre disabilitato se l'articolo <20> bloccato
if (cau.is_consegna() && rcont.get(LVRCONDV_ARTBLOC).empty())
msk.field(FR_QTA).enable(true);
else
{
msk.field(FR_QTA).set("");
msk.field(FR_QTA).disable();
}
real prezzo;
if(cau.is_rotto())
{
prezzo = rcont.get_real(LVRCONDV_PREZDAN);
if (prezzo > ZERO)
msk.set(FR_PREZZO, prezzo);
}
else
{
prezzo = rcont.get_real(LVRCONDV_PREZZO);
msk.set(FR_PREZZO, prezzo);
}
}
}
if (k == K_TAB && !f.mask().get_sheet()->mask().is_running())
{
TString4 causale = f.get();
if (causale.full())
{
const TCausale_lavanderie & cau = cached_causale_lavanderie(causale);
f.mask().field(FR_QTAGG1).enable(cau.is_ritiro());
f.mask().field(FR_QTA).enable(cau.is_consegna());
}
}
return true;
}
//LV_CODMAG_HANDLER: handler che limita l'esecuzione
bool TGestione_bolle_msk::lv_codmag_handler(TMask_field& f, KEY k)
{
bool ok = true;
if (f.to_check(k, true))
{
TMask& msk = f.mask();
const TString& causale = msk.get(FR_CAULAV);
if (causale.full())
{
switch(f.dlg())
{
case FR_CODMAG: ok = codmag_handler( f, k ); break;
default: break;
}
}
}
return ok;
}
bool TGestione_bolle_msk::lv_datatmp_handler(TMask_field& f, KEY k)
{
if (k == K_ENTER)
{
TMask& msk = f.mask();
//leggo il codart che ho scritto nella riga corrente dello sheet
const TString& codart = msk.get(FR_CODART);
const TDate& dadata = msk.get_date(FR_JOLLY3);
const TDate& adata = msk.get_date(FR_JOLLY4);
if(adata.ok() && dadata.ok() && adata < dadata)
return warning_box(TR("La data di fine dotazione temporanea deve maggiore di quella di inizio"));
const TCausale_lavanderie & cau = cached_causale_lavanderie(msk.get(FR_CODAGG1));
TGestione_bolle_msk& dmsk = (TGestione_bolle_msk&) msk.get_sheet()->mask();
//recupero il documento e modifico le date sulla riga documento
TDocumento& doc = dmsk.doc();
TRiga_documento& rdoc = doc[msk.get_sheet()->selected()+1];
rdoc.put("DADATATMP", dadata);
rdoc.put("ADATATMP", adata);
}
return true;
}
//metodo che setta gli handler sui campi di riga
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;
case 4104: rm.set_handler(field, lv_causale_handler); break;
case 4105: rm.set_handler(field, lv_codmag_handler); break;
case 4106: rm.set_handler(field, lv_datatmp_handler); break;
default : TDocumento_mask::user_set_row_handler(rm, field, index); break;
}
}
//metodo che setta l'handler di bolla
void TGestione_bolle_msk::user_set_handler( short fieldid, int index)
{
switch(index)
{
case 4101: set_field_handler(fieldid, lv_data_handler); break;
case 4102: set_field_handler(fieldid, lv_contratto_handler); break;
case 4103: set_field_handler(fieldid, lv_bolla_handler); break;
case 4105: set_field_handler(fieldid, lv_dataprco_handler); break;
case 4106: set_field_handler(fieldid, lv_loadprice_handler); break;
default : TDocumento_mask::user_set_handler(fieldid, index); break;
}
}
TGestione_bolle_msk::TGestione_bolle_msk(const char* tipodoc) : TDocumento_mask(tipodoc), _autoselect(-1)
{
if (ini_get_bool(CONFIG_DITTA, "lv", "Datafissa"))
field(F_DATADOC).disable();
TSheet_field& sf = sfield(F_SHEET);
sf.set_nav_column(FR_QTA, FR_QTAGG1);
sf.set_auto_append(false);
sf.set_handler( ss_handler );
sf.set_notify( ss_notify );
if (find_by_id(DLG_LVPLANNING))
set_field_handler(DLG_LVPLANNING, lv_planning_handler);
}
//////////////////////////////////////////
//// CLASSE TGESTIONE_BOLLE_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);
TSheet_field& sheet = m->sfield(F_SHEET);
if (sheet.exist_column(FR_JOLLY1))
{
//setto l'allineamento a destra dei campi incriminati e pure criminali
sheet.set_column_justify(sheet.cid2index(FR_JOLLY1), true);
sheet.set_column_justify(sheet.cid2index(FR_JOLLY2), true);
}
if (sheet.exist_column(FR_JOLLY5))
sheet.set_column_justify(sheet.cid2index(FR_JOLLY5), true);
if (sheet.exist_column(FR_JOLLY6))
sheet.set_column_justify(sheet.cid2index(FR_JOLLY6), true);
_doc_masks.add(tipodoc, m);
const TTipo_documento& tdoc = m->doc().tipo();
const TPointer_array& handlers = tdoc.handlers();
FOR_EACH_ARRAY_ITEM(handlers, i, row)
{
CHECKD(i > DLG_CANCEL, "Invalid handled field ", i);
m->user_set_handler(i, handlers.get_long(i));
}
}
}
return TMotore_application::get_mask(mode);
}
void TGestione_bolle_app::elimina_vuote( const TMask& m)
{
TDocumento_mask& mask = (TDocumento_mask&) m;
TDocumento& d = mask.doc();
TSheet_field& sheet = mask.sfield(F_SHEET);
FOR_EACH_DOC_ROW_BACK(d, r, row)
{
if (row->is_articolo() && row->get_int(RDOC_QTA) == 0 && row->get_int(RDOC_QTAGG1) == 0)
d.destroy_row(r,true);
}
}
void TGestione_bolle_app::salva_conguaglio( const TMask& m)
{
if (ini_get_bool(CONFIG_DITTA, "lv", "Aggcong"))
{
TDocumento_mask& mask = (TDocumento_mask&) m;
TDocumento& d = mask.doc();
TSheet_field& sheet = mask.sfield(F_SHEET);
const long codcf = mask.get_long(F_CODCF);
const int indsped = mask.get_int(F_CODINDSP);
TDate datadoc = mask.get_date(F_DATADOC);
const TLaundry_contract cont(codcf, indsped, datadoc);
const int codcont = cont.get_int(LVCONDV_CODCONT);
TLocalisamfile rcondv(LF_LVRCONDV);
FOR_EACH_DOC_ROW_BACK(d, r, row)
{
TRiga_documento& rdoc = (TRiga_documento&)*row;
rcondv.put(LVRCONDV_CODCF, codcf);
rcondv.put(LVRCONDV_CODCONT, codcont);
rcondv.put(LVRCONDV_CODART, rdoc.get(RDOC_CODART));
if (rcondv.read() == NOERR)
{
rcondv.put(LVRCONDV_QTACONG, rdoc.get_real(RDOC_QTAGG5));
rcondv.rewrite();
}
}
}
}
void TGestione_bolle_app::storna_conguaglio()
{
if (ini_get_bool(CONFIG_DITTA, "lv", "Aggcong"))
{
TDocumento_mask& mask = (TDocumento_mask&) *get_mask(MODE_MOD);
TDocumento& d = mask.doc();
TSheet_field& sheet = mask.sfield(F_SHEET);
const long codcf = mask.get_long(F_CODCF);
const int indsped = mask.get_int(F_CODINDSP);
TDate datadoc = mask.get_date(F_DATADOC);
const TLaundry_contract cont(codcf, indsped, datadoc);
const int codcont = cont.get_int(LVCONDV_CODCONT);
TLocalisamfile rcondv(LF_LVRCONDV);
FOR_EACH_DOC_ROW_BACK(d, r, row)
{
TRiga_documento& rdoc = (TRiga_documento&)*row;
//instanzio una cache sulle causali
const TString & causale = rdoc.get(RDOC_CODAGG1);
const TCausale_lavanderie & cau = cached_causale_lavanderie(causale);
const TString & codart = rdoc.get(RDOC_CODART);
const TRectype& anamag = cache().get(LF_ANAMAG,codart);
const long ppconf = anamag.get_long(ANAMAG_PPCONF);
if (ini_get_bool(CONFIG_DITTA, "lv", "Aggcong") && cau.movcong() && ppconf > 0)
{
rcondv.put(LVRCONDV_CODCF,codcf);
rcondv.put(LVRCONDV_CODCONT, codcont);
rcondv.put(LVRCONDV_CODART, rdoc.get(RDOC_CODART));
if (rcondv.read() == NOERR && rcondv.get_int(LVRCONDV_CALCCONS) == 1)
{
const real rit = rdoc.get_real(RDOC_QTAGG1);
const real con = rdoc.get_real(RDOC_QTA);
const real congor = rcondv.get_real(LVRCONDV_QTACONG);
const real congat = congor - con + rit;
rcondv.put(LVRCONDV_QTACONG, congat);
rcondv.rewrite();
}
}
}
}
}
void TGestione_bolle_app::storna_date()
{
TGestione_bolle_msk& mask = (TGestione_bolle_msk&) edit_mask();
TDocumento& d = mask.doc();
TSheet_field& sheet = mask.sfield(F_SHEET);
const long codcf = mask.get_long(F_CODCF);
const int indsped = mask.get_int(F_CODINDSP);
TDate datadoc = mask.get_date(F_DATADOC);
const TLaundry_contract cont(codcf, indsped, datadoc);
const int codcont = cont.get_int(LVCONDV_CODCONT);
TLocalisamfile rcondv(LF_LVRCONDV);
TEsercizi_contabili& esc = esercizi();
const int last_esc = esc.last();
FOR_EACH_DOC_ROW_BACK(d, r, row)
{
TRiga_documento& rdoc = (TRiga_documento&)*row;
if (rdoc.get_date("DADATATMP").ok() && atoi(rdoc.tipo().codice()) != 22)
{
const TCausale_lavanderie & cau = cached_causale_lavanderie(rdoc.get(RDOC_CODAGG1));
const TString codart = rdoc.get(RDOC_CODART);
rcondv.put(LVRCONDV_CODCF,codcf);
rcondv.put(LVRCONDV_CODCONT, codcont);
rcondv.put(LVRCONDV_CODART, codart);
if (rcondv.read() == NOERR)
{
const TDate da_data_contr = rcondv.get_date(LVRCONDV_INDTTMP);
const TDate da_data_bolla = rdoc.get_date("DADATATMP");
//gestione campi dotazione odierna e dotazione temporanea
const TRecmag_lavanderie & reclav = lv_art_giac(rdoc.get(RDOC_CODART), 'C', codcf, indsped, last_esc);
real dotmp = reclav.get_real(CLIFOGIAC_DOTTM) - *((real *) mask.dot_tmp().objptr(codart));
if (dotmp == ZERO)
{
rcondv.put(LVRCONDV_INDTTMP, NULLDATE);
rcondv.put(LVRCONDV_FIDTTMP, NULLDATE);
rcondv.rewrite();
}
}
}
}
}
void TGestione_bolle_app::date_dotmp( const TMask& m)
{
TGestione_bolle_msk& mask = (TGestione_bolle_msk&)m;
TDocumento& d = mask.doc();
const long codcf = mask.get_long(F_CODCF);
const int indsped = mask.get_int(F_CODINDSP);
const TDate datadoc = mask.get_date(F_DATADOC);
const TLaundry_contract cont(codcf, indsped, datadoc);
const int codcont = cont.get_int(LVCONDV_CODCONT);
TLocalisamfile rcondv(LF_LVRCONDV);
FOR_EACH_DOC_ROW_BACK(d, r, row)
{
TRiga_documento& rdoc = (TRiga_documento&)*row;
if (!rdoc.is_merce())
continue;
const TString80 codart = rdoc.get(RDOC_CODART);
if (!codart.full())
continue;
bool no_dotmp = true; // Nessuna dotazione temporanea
if (no_dotmp) // dummy test
{
const real* dotmp = (real*)mask.dot_tmp().objptr(codart);
no_dotmp = dotmp == NULL || dotmp->is_zero();
if (no_dotmp)
rdoc.zero("DOTMP");
else
rdoc.put("DOTMP", *dotmp);
}
if (rdoc.get_date("DADATATMP").ok() && atoi(rdoc.tipo().codice()) != 22)
{
rcondv.put(LVRCONDV_CODCF,codcf);
rcondv.put(LVRCONDV_CODCONT, codcont);
rcondv.put(LVRCONDV_CODART, codart);
if (rcondv.read() == NOERR)
{
const TDate da_data_bolla = rdoc.get_date("DADATATMP");
const TDate a_data_bolla = rdoc.get_date("ADATATMP");
rcondv.put(LVRCONDV_INDTTMP, da_data_bolla);
rcondv.put(LVRCONDV_FIDTTMP, a_data_bolla);
rcondv.rewrite();
}
}
else
{
rcondv.put(LVRCONDV_CODCF,codcf);
rcondv.put(LVRCONDV_CODCONT, codcont);
rcondv.put(LVRCONDV_CODART, codart);
if (rcondv.read() == NOERR && no_dotmp)
{
rcondv.put(LVRCONDV_INDTTMP, NULLDATE);
rcondv.put(LVRCONDV_FIDTTMP, NULLDATE);
rcondv.rewrite();
}
}
}
}
//ridefinisco il metodo write delle TMotore_application
int TGestione_bolle_app::write( const TMask& m )
{
elimina_vuote(m);
date_dotmp(m);
salva_conguaglio(m);
return TMotore_application::write(m);
}
//ridefinisco il metodo rewrite delle TMotore_application
int TGestione_bolle_app::rewrite( const TMask& m )
{
elimina_vuote(m);
date_dotmp(m);
salva_conguaglio(m);
return TMotore_application::rewrite(m);
}
bool TGestione_bolle_app::remove()
{
storna_conguaglio();
storna_date();
return TMotore_application::remove();
}
//ridefinisco il metodo read della TMotore_application
int TGestione_bolle_app::read(TMask& m)
{
m.sfield(F_SHEET).destroy();
const int err = TMotore_application::read(m);
if (err == NOERR)
{
TGestione_bolle_msk& mask = (TGestione_bolle_msk&) m;
TDocumento& d = mask.doc();
_giac.reset(d);
mask.doc2mask();
const long codcf = mask.get_long(F_CODCF);
const int indsped = mask.get_int(F_CODINDSP);
TDate datadoc = mask.get_date(F_DATADOC);
if (!datadoc.ok())
datadoc = TODAY;
const long codcont = lv_find_contract(codcf,indsped,datadoc);
//instanzio una cache sulla tabella dei contratti
const TLaundry_contract tcont(codcf, codcont);
TSheet_field & sheet = m.sfield(F_SHEET);
FOR_EACH_SHEET_ROW_BACK(sheet, r, row)
{
const TString codart = row->get(sheet.cid2index(FR_CODARTMAG));
const TCausale_lavanderie & cau = cached_causale_lavanderie(d[r + 1].get(RDOC_CODAGG1));
const TRectype & rowcontr = tcont.row(codart);
TEsercizi_contabili& esc = esercizi();
const int last_esc = esc.last();
//estraggo il record corrispondente su LF_CLIFOGIAC
const TRecmag_lavanderie & reclav = lv_art_giac(codart, 'C', codcf, indsped, last_esc, true);
const real consanno = reclav.get_real(CLIFOGIAC_CONSANNO);
TDate da(datadoc);
TDate a(da);
da.set_day(1);
a.set_end_month();
const real consmese = reclav.consmese(da, a);
const real dotmp = reclav.get_real(CLIFOGIAC_DOTTM);
const bool artbloc = rowcontr.get_int(LVRCONDV_ARTBLOC) == 0;
const bool hasdottemp = dotmp != ZERO;
real * dtmp = (real *) mask.dot_tmp().objptr(codart);
if (dtmp == NULL)
mask.dot_tmp().add(codart, dtmp = new real);
*dtmp = dotmp;
d[r + 1].put("DOTMP", dotmp);
sheet.enable_cell(r, sheet.cid2index(FR_QTA), cau.is_consegna() && artbloc);
sheet.enable_cell(r, sheet.cid2index(FR_QTAGG1), cau.is_ritiro());
sheet.enable_cell(r, sheet.cid2index(FR_JOLLY3), hasdottemp);
sheet.enable_cell(r, sheet.cid2index(FR_JOLLY4), hasdottemp);
sheet.disable_cell(r, sheet.cid2index(FR_JOLLY5));
sheet.disable_cell(r, sheet.cid2index(FR_JOLLY6));
if (row->get_int(sheet.cid2index(FR_TIPORIGA)) == 22)
{
sheet.disable_cell(r, sheet.cid2index(FR_JOLLY1));
sheet.disable_cell(r, sheet.cid2index(FR_JOLLY2));
sheet.disable_cell(r, sheet.cid2index(FR_JOLLY3));
sheet.disable_cell(r, sheet.cid2index(FR_JOLLY4));
}
if (sheet.exist_column(FR_JOLLY2))
row->add(dotmp.stringa(), sheet.cid2index(FR_JOLLY2));
if (sheet.exist_column(FR_JOLLY5))
row->add(consanno.stringa(), sheet.cid2index(FR_JOLLY5));
if (sheet.exist_column(FR_JOLLY6))
row->add(consmese.stringa(), sheet.cid2index(FR_JOLLY6));
if (!ini_get_bool(CONFIG_DITTA, "lv", "ShowDotSto"))
{
const real dotod = reclav.get_real(CLIFOGIAC_DOTOD);
d[r + 1].put("DOTOD", dotod);
if (sheet.exist_column(FR_JOLLY1))
row->add(dotod.stringa(), sheet.cid2index(FR_JOLLY1));
}
}
mask._autoselect = 0;
}
return err;
}
//ridefinisco il metodo init_insert_mode della TMotore_application
void TGestione_bolle_app::init_insert_mode(TMask &m)
{
TGestione_bolle_msk& mask = (TGestione_bolle_msk&) m;
TDocumento& d = mask.doc();
_giac.reset(d);
//se sto leggendo o generando un buono di ritiro, abilito questo campo
bool enable_dataprco = mask.get(F_CODNUM) == ini_get_string(CONFIG_DITTA, "lv", "NUM_RIT(0)") &&
mask.get(F_TIPODOC) == ini_get_string(CONFIG_DITTA, "lv", "TIPODOC_RIT(0)");
mask.enable(F_LVDATAPRCO, enable_dataprco);
mask.reset_var_mask();
mask.first_focus(F_CODCF, false);
mask.calc_rit_cons_prec();
return TMotore_application::init_insert_mode(m);
}
//ridefinisco il metodo init_query_mode della TMotore_application
void TGestione_bolle_app::init_modify_mode(TMask &m)
{
TGestione_bolle_msk& mask = (TGestione_bolle_msk&) m;
//se sto leggendo o generando un buono di ritiro, abilito questo campo
bool enable_dataprco = mask.get(F_CODNUM) == ini_get_string(CONFIG_DITTA, "lv", "NUM_RIT(0)") &&
mask.get(F_TIPODOC) == ini_get_string(CONFIG_DITTA, "lv", "TIPODOC_RIT(0)");
mask.enable(F_LVDATAPRCO, enable_dataprco);
mask.first_focus(F_CODCF, false);
mask.calc_rit_cons_prec();
return TMotore_application::init_modify_mode(m);
}
//metodo che mi restituisce la giac
TGiac_per_cli& TGestione_bolle_app::giacenza()
{
return _giac;
}
int lv3100( int argc, char* argv[])
{
TGestione_bolle_app a;
a.run( argc, argv, TR("Documenti di Trasporto"));
return 0;
}