2008-09-10 09:22:52 +00:00
|
|
|
|
#include <automask.h>
|
2011-01-20 09:40:18 +00:00
|
|
|
|
#include <colmask.h>
|
2015-02-04 10:54:10 +00:00
|
|
|
|
#include <defmask.h>
|
2008-09-10 09:22:52 +00:00
|
|
|
|
#include <execp.h>
|
2008-12-10 11:57:25 +00:00
|
|
|
|
#include <progind.h>
|
2009-09-25 13:53:33 +00:00
|
|
|
|
#include <relapp.h>
|
2011-01-20 09:40:18 +00:00
|
|
|
|
#include <urldefid.h>
|
2008-08-21 15:41:07 +00:00
|
|
|
|
|
2010-12-02 10:30:14 +00:00
|
|
|
|
#include "../cg/cglib01.h"
|
|
|
|
|
|
2009-06-23 15:04:23 +00:00
|
|
|
|
#include "lvcondv.h"
|
|
|
|
|
#include "lvrcondv.h"
|
|
|
|
|
|
2008-10-28 20:07:09 +00:00
|
|
|
|
#include "lvlib.h"
|
2011-05-26 16:07:35 +00:00
|
|
|
|
#include "lvlib2.h"
|
2009-01-27 16:54:54 +00:00
|
|
|
|
#include "../mg/clifogiac.h"
|
2009-06-11 11:27:01 +00:00
|
|
|
|
#include "../ve/rcondv.h"
|
2008-08-21 15:41:07 +00:00
|
|
|
|
|
2009-03-12 12:15:09 +00:00
|
|
|
|
#include "lv0400.h"
|
|
|
|
|
|
2009-03-09 16:45:57 +00:00
|
|
|
|
//LV_NEW_CONTRACT: metodo generale utilizzato sia nella maschera che nell'applicazione
|
|
|
|
|
//che restituisce il primo codcont libero
|
2009-01-23 17:03:44 +00:00
|
|
|
|
long lv_new_contract(long cliente, int indsped)
|
|
|
|
|
{
|
2009-03-09 16:45:57 +00:00
|
|
|
|
//leggo dalla configurazione se la numerazione dei contratti
|
2009-08-25 14:57:29 +00:00
|
|
|
|
//<2F> sequenziale per ditta o per cliente
|
2009-09-08 14:46:50 +00:00
|
|
|
|
long codcont = 0;
|
2009-03-09 16:45:57 +00:00
|
|
|
|
|
2009-08-25 14:57:29 +00:00
|
|
|
|
if (ini_get_bool(CONFIG_DITTA, "lv", "UniCont")) //se la numerazione <20> per ditta, cerco in tutto LVCONDV il codcont pi<70> grande
|
2009-01-23 17:03:44 +00:00
|
|
|
|
{
|
|
|
|
|
TISAM_recordset recset ("USE LVCONDV");
|
2009-05-25 09:55:47 +00:00
|
|
|
|
for (bool ok=recset.move_first(); ok; ok = recset.move_next())
|
2009-01-23 17:03:44 +00:00
|
|
|
|
{
|
|
|
|
|
const long codice=recset.get("CODCONT").as_int();
|
|
|
|
|
if (codice>codcont)
|
|
|
|
|
codcont=codice;
|
|
|
|
|
}
|
|
|
|
|
}
|
2009-03-09 16:45:57 +00:00
|
|
|
|
else //altrimenti cerco il codcont pi<70> grande di un determinato cliente
|
2009-01-23 17:03:44 +00:00
|
|
|
|
{
|
|
|
|
|
TString query;
|
2009-03-09 16:45:57 +00:00
|
|
|
|
query<<"USE LVCONDV\n"
|
2009-01-23 17:03:44 +00:00
|
|
|
|
<<"FROM CODCF=#CLIENTE\n"
|
|
|
|
|
<<"TO CODCF=#CLIENTE\n";
|
|
|
|
|
TISAM_recordset recset (query);
|
|
|
|
|
recset.set_var("#CLIENTE",cliente);
|
|
|
|
|
if (recset.move_last())
|
2009-03-09 16:45:57 +00:00
|
|
|
|
codcont=recset.get("CODCONT").as_int();
|
2009-01-23 17:03:44 +00:00
|
|
|
|
}
|
|
|
|
|
codcont++;
|
|
|
|
|
return codcont;
|
|
|
|
|
}
|
|
|
|
|
|
2011-01-20 09:40:18 +00:00
|
|
|
|
class TColor_rule_contract : public TExpression
|
|
|
|
|
{
|
|
|
|
|
COLOR _back, _fore, _def_back, _def_fore;
|
|
|
|
|
TString _desc, _key;
|
|
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
const TString& description() const { return _desc; }
|
|
|
|
|
const TString& key() const { return _key; }
|
|
|
|
|
void default_colors(COLOR& back, COLOR& fore) const { back = _def_back; fore = _def_fore; }
|
|
|
|
|
void colors(COLOR& back, COLOR& fore) const { back = _back; fore = _fore; }
|
|
|
|
|
void set_colors(COLOR back, COLOR fore) { _back = back; _fore = fore; }
|
|
|
|
|
|
|
|
|
|
TColor_rule_contract(const char* desc, const char* expr, TTypeexp type, COLOR back, COLOR fore);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
TColor_rule_contract::TColor_rule_contract(const char* desc, const char* expr, TTypeexp type, COLOR back, COLOR fore)
|
|
|
|
|
: TExpression(expr, type), _back(back), _fore(fore), _def_back(back), _def_fore(fore)
|
|
|
|
|
{
|
|
|
|
|
_desc = dictionary_translate(desc);
|
|
|
|
|
_key = desc; _key.trim(); _key.strip_double_spaces();
|
|
|
|
|
_key.replace(' ', '_');
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2009-03-09 16:45:57 +00:00
|
|
|
|
//////////////////////////////
|
|
|
|
|
//// TCONTRATTI_MSK ////
|
|
|
|
|
//////////////////////////////
|
2008-09-10 09:22:52 +00:00
|
|
|
|
|
2009-03-09 16:45:57 +00:00
|
|
|
|
//classe TContratti_msk
|
2008-09-10 09:22:52 +00:00
|
|
|
|
class TContratti_msk: public TAutomask
|
|
|
|
|
{
|
2009-01-23 17:03:44 +00:00
|
|
|
|
long _post_contr;
|
2009-02-03 16:34:50 +00:00
|
|
|
|
TString80 _artrig;
|
2009-09-11 16:35:28 +00:00
|
|
|
|
int _riga;
|
2011-01-20 09:40:18 +00:00
|
|
|
|
TArray _color_rules;
|
2009-01-23 17:03:44 +00:00
|
|
|
|
|
2008-09-10 09:22:52 +00:00
|
|
|
|
protected:
|
2010-01-21 11:36:43 +00:00
|
|
|
|
void azzera_conguaglio();
|
|
|
|
|
bool on_art_select(TField_event e);
|
2009-01-23 17:03:44 +00:00
|
|
|
|
virtual void on_idle();
|
2009-03-09 16:45:57 +00:00
|
|
|
|
virtual bool on_field_event(TOperable_field& o,TField_event e,long jolly);
|
2009-01-23 17:03:44 +00:00
|
|
|
|
|
2011-01-20 09:40:18 +00:00
|
|
|
|
TArray& color_rules() { return _color_rules; }
|
|
|
|
|
|
2008-09-10 09:22:52 +00:00
|
|
|
|
public:
|
2009-09-11 16:35:28 +00:00
|
|
|
|
int get_riga();
|
|
|
|
|
bool set_riga(const int val);
|
2011-01-20 09:40:18 +00:00
|
|
|
|
|
|
|
|
|
void sel_color();
|
|
|
|
|
void highlight();
|
|
|
|
|
void highlight_row(int row = -1, COLOR back = COLOR_INVALID, COLOR fore = COLOR_INVALID, bool dirty = true, bool update = true);
|
2008-09-10 09:22:52 +00:00
|
|
|
|
TContratti_msk();
|
|
|
|
|
};
|
|
|
|
|
|
2010-01-21 11:36:43 +00:00
|
|
|
|
//AZZERA_CONGUAGLIO: metodo che azzera tutti conguagli di un contratto dopo aver dato la conferma
|
|
|
|
|
void TContratti_msk::azzera_conguaglio()
|
|
|
|
|
{
|
|
|
|
|
TLaundry_contract cont(get_long(F_CODCF), get_long(F_CODCONT));
|
|
|
|
|
|
|
|
|
|
TSheet_field& sheet = sfield(F_RIGHE);
|
|
|
|
|
|
|
|
|
|
FOR_EACH_SHEET_ROW(sheet, r, row)
|
|
|
|
|
row->add(0L, sheet.cid2index(S_CONG));
|
|
|
|
|
|
|
|
|
|
sheet.force_update();
|
|
|
|
|
}
|
|
|
|
|
|
2011-01-20 09:40:18 +00:00
|
|
|
|
void TContratti_msk::highlight_row(int row, COLOR back, COLOR fore, bool dirty, bool update)
|
|
|
|
|
{
|
|
|
|
|
TSheet_field& sf = sfield(F_RIGHE);
|
|
|
|
|
|
|
|
|
|
if (row < 0)
|
|
|
|
|
row = sf.selected();
|
|
|
|
|
|
|
|
|
|
FOR_EACH_ARRAY_ITEM_BACK(color_rules(), rule, o)
|
|
|
|
|
{
|
|
|
|
|
TColor_rule& expr = *(TColor_rule*)o;
|
|
|
|
|
bool on = false;
|
|
|
|
|
|
|
|
|
|
// SET VARS
|
|
|
|
|
|
|
|
|
|
const int vars = expr.numvar();
|
|
|
|
|
TString name;
|
|
|
|
|
for (int i = 0; i < vars; i++)
|
|
|
|
|
{
|
|
|
|
|
name = expr.varname(i);
|
|
|
|
|
if (name.starts_with("DIRTY"))
|
|
|
|
|
expr.setvar(i, dirty ? UNO : ZERO);
|
|
|
|
|
else
|
|
|
|
|
if (name.starts_with("TODAY"))
|
|
|
|
|
expr.setvar(i, TDate(TODAY).string());
|
|
|
|
|
else
|
|
|
|
|
if (name.starts_with("#"))
|
|
|
|
|
{
|
|
|
|
|
const short id = atoi(name.mid(1));
|
|
|
|
|
if (id > 0)
|
|
|
|
|
{
|
|
|
|
|
TToken_string& sheet_row = sf.row(row);
|
|
|
|
|
expr.setvar(i, sheet_row.get(sf.cid2index(id)));
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
expr.setvar(i, get(-id));
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
if (name.starts_with("48.") || name.starts_with("ANAMAG."))
|
|
|
|
|
{
|
|
|
|
|
TToken_string & row = sf.row(sf.selected());
|
|
|
|
|
const TRectype & art = cache().get(LF_ANAMAG, row.get(sf.cid2index(S_CODART)));
|
|
|
|
|
const TString& fldname = name.after('.');
|
|
|
|
|
|
|
|
|
|
expr.setvar(i, art.get(fldname));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (expr.as_bool())
|
|
|
|
|
{
|
|
|
|
|
expr.colors(back, fore);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
sf.set_back_and_fore_color(back, fore, row);
|
|
|
|
|
if (update)
|
|
|
|
|
sf.force_update(row);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void TContratti_msk::highlight()
|
|
|
|
|
{
|
|
|
|
|
TSheet_field& sf = sfield(F_RIGHE);
|
|
|
|
|
FOR_EACH_SHEET_ROW(sf, i, r)
|
|
|
|
|
highlight_row(i, COLOR_INVALID, COLOR_INVALID, false, false);
|
|
|
|
|
sf.force_update();
|
|
|
|
|
}
|
|
|
|
|
void TContratti_msk::sel_color()
|
|
|
|
|
{
|
|
|
|
|
TFilename mask(source_file());
|
|
|
|
|
|
|
|
|
|
TSelect_color_mask sel(mask.name_only(), "0");
|
|
|
|
|
|
|
|
|
|
FOR_EACH_ARRAY_ITEM(color_rules(), i, o)
|
|
|
|
|
{
|
|
|
|
|
const TColor_rule& col = *(const TColor_rule*)o;
|
|
|
|
|
COLOR a, b; col.colors(a, b);
|
|
|
|
|
COLOR c, d; col.default_colors(c, d);
|
|
|
|
|
sel.add_color(col.key(), col.description(), a, b, c, d);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (sel.run() != K_ESC)
|
|
|
|
|
{
|
|
|
|
|
FOR_EACH_ARRAY_ITEM(color_rules(), i, o)
|
|
|
|
|
{
|
|
|
|
|
TColor_rule& col = *(TColor_rule*)o;
|
|
|
|
|
COLOR back, fore; sel.get_color(col.key(), back, fore);
|
|
|
|
|
col.set_colors(back, fore);
|
|
|
|
|
}
|
|
|
|
|
highlight();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2009-03-09 16:45:57 +00:00
|
|
|
|
//ON_ART_SELECT: metodo che riempie i campi delle dotazioni e del consegnato sullo sheet e sulla maschera
|
|
|
|
|
//e riporta i dati dello sheet nel dettaglio sulla maschera (sotto lo sheet)
|
2010-01-12 16:11:02 +00:00
|
|
|
|
bool TContratti_msk::on_art_select(TField_event e)
|
2008-09-10 09:22:52 +00:00
|
|
|
|
{
|
2009-03-09 16:45:57 +00:00
|
|
|
|
//dallo sheet identifico la riga selezionata e estraggo i dati di interesse
|
|
|
|
|
TSheet_field& ss = sfield(F_RIGHE);
|
|
|
|
|
TToken_string& row = ss.row(ss.selected());
|
2008-09-10 09:22:52 +00:00
|
|
|
|
const TString80 codart(row.get(ss.cid2index(S_CODART)));
|
2008-10-28 20:07:09 +00:00
|
|
|
|
const long codcf = get_long(F_CODCF);
|
|
|
|
|
const int indsped = get_int(F_INDSPED);
|
2009-03-09 16:45:57 +00:00
|
|
|
|
|
|
|
|
|
//instanzio un TArticolo_lavanderie per poter recuperare i dati di interesse
|
|
|
|
|
TArticolo_lavanderie& artrec = cached_article_laundry(codart, 'C', codcf, indsped);
|
|
|
|
|
|
|
|
|
|
//setto datasc a oggi e fisso l'anno esercizio
|
2010-12-13 16:00:36 +00:00
|
|
|
|
TEsercizi_contabili& esc = esercizi();
|
|
|
|
|
const int last_esc = esc.last();
|
2009-01-16 23:18:15 +00:00
|
|
|
|
|
2009-05-25 09:55:47 +00:00
|
|
|
|
//estraggo il record corrispondente su LF_CLIFOGIAC
|
2010-12-13 16:00:36 +00:00
|
|
|
|
const TRecmag_lavanderie& reclav = artrec.find_rec(last_esc);
|
2009-03-09 16:45:57 +00:00
|
|
|
|
//recupero la maschera di riga
|
2009-05-28 15:52:36 +00:00
|
|
|
|
TMask& rowmask = ss.sheet_mask();
|
2009-03-23 15:23:57 +00:00
|
|
|
|
|
2009-08-25 14:57:29 +00:00
|
|
|
|
if (!ini_get_bool(CONFIG_DITTA, "lv", "Qtamodi"))
|
2009-03-23 15:23:57 +00:00
|
|
|
|
{
|
|
|
|
|
field(F_DOTTMP).disable();
|
|
|
|
|
rowmask.field(S_DOTIN).disable();
|
|
|
|
|
rowmask.field(S_DOTOD).disable();
|
|
|
|
|
rowmask.field(S_DOTTMP).disable();
|
|
|
|
|
}
|
2009-03-09 16:45:57 +00:00
|
|
|
|
|
2009-05-27 14:55:51 +00:00
|
|
|
|
if (rowmask.get(S_UM).blank() && artrec.um().rows() > 0)
|
|
|
|
|
{
|
|
|
|
|
const TString& um = artrec.um()[1].get(UMART_UM);
|
|
|
|
|
rowmask.set(S_UM, um);
|
|
|
|
|
}
|
|
|
|
|
|
2009-03-09 16:45:57 +00:00
|
|
|
|
//se esiste il record su LF_CLIFOGIAC, recupero l'unit<69> di misura dalla riga dello sheet selezionata
|
|
|
|
|
//e setto i campi delle dotazioni e dei consegnati ai valori corretti riportati alla giusta unit<69> di misura
|
2010-01-14 15:19:02 +00:00
|
|
|
|
real dotin = ZERO;
|
|
|
|
|
real dotod = ZERO;
|
|
|
|
|
real dottmp = ZERO;
|
|
|
|
|
real consyear = ZERO;
|
|
|
|
|
real consmonth = ZERO;
|
|
|
|
|
|
2009-05-25 09:55:47 +00:00
|
|
|
|
if (!reclav.empty())
|
2008-10-28 20:07:09 +00:00
|
|
|
|
{
|
2010-01-14 16:47:28 +00:00
|
|
|
|
if (rowmask.get(S_DOTIN).blank())
|
|
|
|
|
{
|
|
|
|
|
//calcolo dotazione iniziale, scritta sia sulla maschera che sullo sheet
|
|
|
|
|
dotin = reclav.get_real(CLIFOGIAC_DOTIN);
|
|
|
|
|
//calcolo dotazione odierna, scritta sia sulla maschera che sullo sheet
|
|
|
|
|
dotod = reclav.get_real(CLIFOGIAC_DOTOD);
|
|
|
|
|
//calcolo dotazione temporanea, scritta sia sulla maschera che sullo sheet
|
|
|
|
|
dottmp = reclav.get_real(CLIFOGIAC_DOTTM);
|
|
|
|
|
}
|
2009-03-09 16:45:57 +00:00
|
|
|
|
//calcolo consegnato anno, scritto sia sulla maschera che sullo sheet
|
2010-01-14 15:19:02 +00:00
|
|
|
|
consyear = reclav.get_real("CONSANNO");
|
2009-03-09 16:45:57 +00:00
|
|
|
|
//calcolo consegnato mese, scritto sia sulla maschera che sullo sheet
|
2010-01-14 15:19:02 +00:00
|
|
|
|
consmonth = reclav.get_real("CONSMESE");
|
2010-01-14 16:47:28 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (rowmask.get(S_DOTIN).blank())
|
|
|
|
|
{
|
|
|
|
|
rowmask.set(S_DOTIN, dotin);
|
|
|
|
|
rowmask.set(S_DOTOD, dotod);
|
|
|
|
|
rowmask.set(S_DOTTMP, dottmp);
|
|
|
|
|
}
|
2010-01-14 15:19:02 +00:00
|
|
|
|
rowmask.set(S_CONSANNO, consyear);
|
|
|
|
|
rowmask.set(S_CONSMESE, consmonth);
|
2008-09-11 10:34:37 +00:00
|
|
|
|
|
2009-03-11 10:35:30 +00:00
|
|
|
|
//instanzio una cache sull'anagrafica di magazzino
|
|
|
|
|
//per leggere il valore di PPCONF corretto e sempre aggiornato
|
|
|
|
|
const TRectype& anamag = cache().get(LF_ANAMAG, codart);
|
2009-09-11 16:35:28 +00:00
|
|
|
|
int ppconf = anamag.get_int(ANAMAG_PPCONF);
|
2011-05-12 09:48:18 +00:00
|
|
|
|
real cosrotti = anamag.get_real(ANAMAG_ULTCOS1);
|
2009-09-11 16:35:28 +00:00
|
|
|
|
rowmask.set(S_PPCONF, ppconf);
|
|
|
|
|
row.add(ppconf, ss.cid2index(S_PPCONF));
|
2011-06-28 12:05:27 +00:00
|
|
|
|
if (rowmask.get(S_PREZDAN).empty())
|
|
|
|
|
{
|
|
|
|
|
rowmask.set(S_PREZDAN, cosrotti);
|
|
|
|
|
row.add(cosrotti.string(), ss.cid2index(S_PREZDAN));
|
|
|
|
|
}
|
2009-01-20 09:42:36 +00:00
|
|
|
|
|
2009-03-09 16:45:57 +00:00
|
|
|
|
//ciclo i dati di interesse della riga selezionata nel dettaglio
|
|
|
|
|
//sulla maschera principale
|
2010-01-12 16:11:02 +00:00
|
|
|
|
if (e != fe_init)
|
|
|
|
|
for (short id = F_CODART; id <= F_CODART + 36; id++)
|
|
|
|
|
{
|
|
|
|
|
const int pos = id2pos(id);
|
|
|
|
|
if (pos > 0)
|
|
|
|
|
{
|
|
|
|
|
TMask_field& f = fld(pos);
|
|
|
|
|
const TString& oldval = f.get();
|
|
|
|
|
const char* newval = row.get(ss.cid2index(id - 400));
|
|
|
|
|
if (oldval != newval)
|
|
|
|
|
{
|
|
|
|
|
f.set(newval);
|
|
|
|
|
if (f.is_kind_of(CLASS_LIST_FIELD))
|
|
|
|
|
f.on_hit();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2009-03-11 10:35:30 +00:00
|
|
|
|
|
2009-09-11 16:35:28 +00:00
|
|
|
|
if (ppconf <= 0)
|
2009-03-11 10:35:30 +00:00
|
|
|
|
{
|
2009-06-11 16:20:51 +00:00
|
|
|
|
set(F_CALCCONS, "0");
|
|
|
|
|
disable(F_CALCCONS);
|
2009-10-14 10:49:40 +00:00
|
|
|
|
rowmask.set(S_CALCCONS, "0");
|
2009-09-11 16:35:28 +00:00
|
|
|
|
rowmask.field(S_CALCCONS).disable();
|
|
|
|
|
rowmask.field(S_CONG).disable();
|
2009-03-11 10:35:30 +00:00
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
2009-06-11 16:20:51 +00:00
|
|
|
|
enable(F_CALCCONS);
|
2009-09-08 14:46:50 +00:00
|
|
|
|
rowmask.field(S_CALCCONS).enable();
|
2009-09-10 14:37:08 +00:00
|
|
|
|
rowmask.field(S_CONG).enable();
|
2009-09-11 16:35:28 +00:00
|
|
|
|
TToken_string row = ss.row(ss.selected());
|
2009-03-11 10:35:30 +00:00
|
|
|
|
}
|
2008-09-10 09:22:52 +00:00
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
2009-03-09 16:45:57 +00:00
|
|
|
|
|
|
|
|
|
//ON_IDLE: ridefinizione del metodo on_idle() delle TAutomask per settare il focus
|
|
|
|
|
//nel posto desiderato
|
2009-01-23 17:03:44 +00:00
|
|
|
|
void TContratti_msk::on_idle()
|
|
|
|
|
{
|
2009-09-11 16:35:28 +00:00
|
|
|
|
TAutomask::on_idle();
|
|
|
|
|
|
|
|
|
|
TSheet_field& s = sfield(F_RIGHE);
|
2009-09-29 15:50:37 +00:00
|
|
|
|
//se riconosco in quale riga devo andare, setto il focus su quella riga
|
2009-09-11 16:35:28 +00:00
|
|
|
|
if (_riga >= 0)
|
2009-01-23 17:03:44 +00:00
|
|
|
|
{
|
2009-09-11 16:35:28 +00:00
|
|
|
|
field(F_RIGHE).set_focus();
|
|
|
|
|
s.set_focus_cell_id(_riga, S_CODART);
|
|
|
|
|
_riga = -1;
|
2009-01-23 17:03:44 +00:00
|
|
|
|
}
|
2009-09-11 16:35:28 +00:00
|
|
|
|
else
|
|
|
|
|
if (_post_contr > 0)
|
|
|
|
|
{
|
|
|
|
|
set(F_CODCONT, _post_contr);
|
|
|
|
|
_post_contr = 0;
|
2011-02-23 14:28:38 +00:00
|
|
|
|
efield(F_CODCONT).set_focus();
|
2009-09-11 16:35:28 +00:00
|
|
|
|
}
|
2009-01-23 17:03:44 +00:00
|
|
|
|
}
|
2008-09-10 09:22:52 +00:00
|
|
|
|
|
2012-03-02 10:53:11 +00:00
|
|
|
|
static const TString& doc_rif(const TRecordset& rdoc)
|
|
|
|
|
{
|
|
|
|
|
TString& tmp = get_tmp_string();
|
|
|
|
|
tmp << rdoc.get(RDOC_CODNUM) << ' ' << rdoc.get(RDOC_ANNO) << '/' << rdoc.get(RDOC_NDOC);
|
|
|
|
|
return tmp;
|
|
|
|
|
}
|
|
|
|
|
|
2009-03-09 16:45:57 +00:00
|
|
|
|
//ON_FIELD_EVENT: definizione del metodo che setta i comportamenti dei vari campi della mashera
|
2009-01-23 17:03:44 +00:00
|
|
|
|
bool TContratti_msk::on_field_event(TOperable_field& o,TField_event e,long jolly)
|
2008-09-10 09:22:52 +00:00
|
|
|
|
{
|
|
|
|
|
switch(o.dlg())
|
|
|
|
|
{
|
2008-12-12 08:29:38 +00:00
|
|
|
|
case F_CODCF:
|
2009-05-13 16:27:31 +00:00
|
|
|
|
case F_RICALT:
|
2009-03-09 16:45:57 +00:00
|
|
|
|
//se sono in query_mode e se il campo risulta pieno e modificato,
|
|
|
|
|
//e il codcont vuoto, allora riempio in automatico l'indirizzo di spedizione
|
|
|
|
|
//e propongo il contratto valido nella giornata di oggi
|
|
|
|
|
if (query_mode())
|
2009-01-23 17:03:44 +00:00
|
|
|
|
{
|
|
|
|
|
if (e == fe_modify && !o.empty() && efield(F_CODCONT).empty())
|
|
|
|
|
{
|
|
|
|
|
const long codcf = atol(o.get());
|
|
|
|
|
const int indsped = get_int(F_INDSPED);
|
|
|
|
|
const TDate oggi(TODAY);
|
|
|
|
|
_post_contr = lv_find_contract(codcf, indsped, oggi);
|
2009-12-18 09:33:14 +00:00
|
|
|
|
field(F_RAGSOC).set_focus();
|
2009-01-23 17:03:44 +00:00
|
|
|
|
}
|
2008-12-12 08:29:38 +00:00
|
|
|
|
}
|
2009-05-28 15:52:36 +00:00
|
|
|
|
break;
|
2009-01-20 09:42:36 +00:00
|
|
|
|
case F_RIGHE:
|
2009-03-09 16:45:57 +00:00
|
|
|
|
//se lo sheet ha ricevuto un se_enter, allora aggiorno i campi del dettaglio sulla mashera principale
|
|
|
|
|
if (e == se_enter)
|
2009-01-20 09:42:36 +00:00
|
|
|
|
{
|
2009-03-09 16:45:57 +00:00
|
|
|
|
TSheet_field& ss = (TSheet_field&)o;
|
|
|
|
|
TToken_string& row = ss.row(ss.selected());
|
|
|
|
|
|
|
|
|
|
for (short id = F_CODART; id <= F_CODART+35; id++)
|
2009-01-20 09:42:36 +00:00
|
|
|
|
{
|
|
|
|
|
const int pos=id2pos(id);
|
|
|
|
|
if (pos>0)
|
2009-03-04 12:13:14 +00:00
|
|
|
|
{
|
2009-04-30 12:40:50 +00:00
|
|
|
|
TMask_field& f = fld(pos);
|
|
|
|
|
const TString& oldval = f.get();
|
|
|
|
|
const char* newval = row.get(ss.cid2index(id - 400));
|
|
|
|
|
if (oldval != newval)
|
|
|
|
|
{
|
|
|
|
|
f.set(newval);
|
|
|
|
|
if (f.is_kind_of(CLASS_LIST_FIELD))
|
|
|
|
|
f.on_hit();
|
|
|
|
|
}
|
|
|
|
|
f.set_dirty(false);
|
2009-03-04 12:13:14 +00:00
|
|
|
|
}
|
2009-01-20 09:42:36 +00:00
|
|
|
|
}
|
2009-03-11 10:35:30 +00:00
|
|
|
|
//questo pezzo serve per gestire enable e disable dei campi in modo corretto
|
|
|
|
|
//senza massage in maschera, sia sullo sheet che sul dettaglio
|
2009-09-11 16:35:28 +00:00
|
|
|
|
TMask& rowmask = ss.sheet_mask();
|
2009-03-11 10:35:30 +00:00
|
|
|
|
if (field(F_PPCONF).empty())
|
|
|
|
|
{
|
|
|
|
|
set(F_CALCCONS, "0");
|
2009-09-11 16:35:28 +00:00
|
|
|
|
disable(F_CALCCONS);
|
2009-10-14 10:49:40 +00:00
|
|
|
|
rowmask.set(S_CALCCONS, "0");
|
2009-09-11 16:35:28 +00:00
|
|
|
|
rowmask.field(S_CALCCONS).disable();
|
|
|
|
|
rowmask.field(S_CONG).disable();
|
2009-03-11 10:35:30 +00:00
|
|
|
|
}
|
|
|
|
|
else
|
2009-09-11 16:35:28 +00:00
|
|
|
|
{
|
2009-03-11 10:35:30 +00:00
|
|
|
|
enable(F_CALCCONS);
|
2009-09-11 16:35:28 +00:00
|
|
|
|
rowmask.field(S_CALCCONS).enable();
|
|
|
|
|
rowmask.field(S_CONG).enable();
|
|
|
|
|
}
|
2009-06-11 16:20:51 +00:00
|
|
|
|
|
2009-09-29 15:50:37 +00:00
|
|
|
|
_artrig = row.get(0); //salvo nella variabile globale il codart della riga selezionata
|
2015-02-04 10:54:10 +00:00
|
|
|
|
}
|
|
|
|
|
if (e == se_enter || e == se_notify_modify || e == se_query_add || e == se_notify_add)
|
|
|
|
|
highlight_row();
|
|
|
|
|
if (e == se_notify_add)
|
|
|
|
|
{
|
|
|
|
|
TSheet_field& ss = (TSheet_field&)o;
|
|
|
|
|
TMask& rowmask = ss.sheet_mask();
|
|
|
|
|
TToken_string& row = ss.row(jolly);
|
|
|
|
|
const TString & val = get(F_RITAUDTTMP);
|
|
|
|
|
rowmask.set(S_CALCCONS, val);
|
|
|
|
|
row.add(val, ss.cid2index(S_RITAUDTTMP));
|
|
|
|
|
set(F_RITAUDTTMPRIG, val);
|
2009-01-20 09:42:36 +00:00
|
|
|
|
}
|
2009-03-09 16:45:57 +00:00
|
|
|
|
//se ho cancellato una riga dello sheet, chiedo conferma che sia effettivamente quello che si vuole fare
|
|
|
|
|
if (e == se_query_del)
|
2009-01-27 16:54:54 +00:00
|
|
|
|
{
|
2009-03-09 16:45:57 +00:00
|
|
|
|
TSheet_field& ss = (TSheet_field&)o;
|
|
|
|
|
TToken_string& row = ss.row(ss.selected());
|
2011-11-23 09:52:00 +00:00
|
|
|
|
const TString80 codart = row.get(ss.cid2index(S_CODART));
|
|
|
|
|
if (codart.full())
|
2009-05-25 15:42:10 +00:00
|
|
|
|
{
|
2011-11-23 09:52:00 +00:00
|
|
|
|
const long dotin = row.get_long(ss.cid2index(S_DOTIN));
|
|
|
|
|
if (dotin > 0)
|
2012-03-02 10:53:11 +00:00
|
|
|
|
return error_box("Impossibile cancellare l'articolo %s perch<63> ha una dotazione iniziale non nulla", (const char*) codart);
|
2009-12-15 17:36:40 +00:00
|
|
|
|
|
2011-11-23 09:52:00 +00:00
|
|
|
|
const TDate oggi(TODAY);
|
|
|
|
|
const int danno = oggi.year() - 1;
|
|
|
|
|
const int aanno = oggi.year() + 1;
|
2009-12-15 17:36:40 +00:00
|
|
|
|
|
2011-11-23 09:52:00 +00:00
|
|
|
|
//controllo articolo in buoni di consegna
|
|
|
|
|
const TString8 tipoela = ini_get_string(CONFIG_DITTA, "lv", "FatDif");
|
2009-12-15 17:36:40 +00:00
|
|
|
|
|
2011-11-23 09:52:00 +00:00
|
|
|
|
const TString4 codnumbc = ini_get_string(CONFIG_DITTA, "lv", "NUM_GEN");
|
|
|
|
|
const TString4 tipodocbc = ini_get_string(CONFIG_DITTA, "lv", "TIPODOC_GEN");
|
|
|
|
|
const char statofbc = cache().get("%ELD", tipoela, "S4").left(0)[0];
|
2012-03-02 16:01:50 +00:00
|
|
|
|
const long codcf = get_long(F_CODCF);
|
2011-11-23 09:52:00 +00:00
|
|
|
|
|
|
|
|
|
TString query;
|
|
|
|
|
query << "USE RDOC KEY 5\n"
|
2012-03-02 16:01:50 +00:00
|
|
|
|
<< "SELECT (DOC.TIPODOC=\"" << tipodocbc << "\")&&(DOC.STATO<\"" << statofbc << "\")&&(DOC.CODCF=\"" << codcf << "\")\n"
|
2011-11-23 09:52:00 +00:00
|
|
|
|
<< "JOIN DOC INTO PROVV=PROVV ANNO=ANNO CODNUM=CODNUM NDOC=NDOC\n"
|
|
|
|
|
<< "FROM CODART=\"" << codart << "\" ANNO=" << danno << "CODNUM=\"" << codnumbc << "\"\n"
|
|
|
|
|
<< "TO CODART=\"" << codart << "\" ANNO=" << danno << "CODNUM=\"" << codnumbc << "\"\n";
|
|
|
|
|
|
|
|
|
|
TISAM_recordset bcon(query);
|
|
|
|
|
|
2012-03-02 10:53:11 +00:00
|
|
|
|
if(bcon.move_first())
|
2011-11-23 09:52:00 +00:00
|
|
|
|
{
|
|
|
|
|
TString str;
|
|
|
|
|
str << "Non <20> possibile cancellare dal contratto l'articolo " << codart
|
2012-03-02 10:53:11 +00:00
|
|
|
|
<< "in quanto <20> presente su " << bcon.items() << " buoni di consegna ancora da fatturare\n"
|
|
|
|
|
<< doc_rif(bcon);
|
|
|
|
|
return error_box(str);
|
2011-11-23 09:52:00 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//controllo articolo in buoni di ritiro
|
|
|
|
|
const TString4 codnumbr = ini_get_string(CONFIG_DITTA, "lv", "NUM_RIT", NULL, 0);
|
|
|
|
|
const TString4 tipodocbr = ini_get_string(CONFIG_DITTA, "lv", "TIPODOC_RIT", NULL, 0);
|
|
|
|
|
const char statofbr = cache().get("%TIP", tipodocbr, "S2").mid(1,1)[0];
|
|
|
|
|
|
|
|
|
|
query.cut(0);
|
|
|
|
|
query << "USE RDOC KEY 5\n"
|
2012-03-02 16:01:50 +00:00
|
|
|
|
<< "SELECT (DOC.TIPODOC=\"" << tipodocbr << "\")&&(DOC.STATO<\"" << statofbr << "\")&&(DOC.CODCF=\"" << codcf << "\")\n"
|
2011-11-23 09:52:00 +00:00
|
|
|
|
<< "JOIN DOC INTO PROVV=PROVV ANNO=ANNO CODNUM=CODNUM NDOC=NDOC\n"
|
|
|
|
|
<< "FROM CODART=\"" << codart << "\" ANNO=" << danno << "CODNUM=\"" << codnumbr << "\"\n"
|
|
|
|
|
<< "TO CODART=\"" << codart << "\" ANNO=" << danno << "CODNUM=\"" << codnumbr << "\"\n";
|
|
|
|
|
|
|
|
|
|
TISAM_recordset brit(query);
|
|
|
|
|
|
2012-03-02 10:53:11 +00:00
|
|
|
|
if(brit.move_first())
|
2011-11-23 09:52:00 +00:00
|
|
|
|
{
|
|
|
|
|
TString str;
|
|
|
|
|
str << "Non <20> possibile cancellare dal contratto l'articolo " << codart
|
2012-03-02 10:53:11 +00:00
|
|
|
|
<< "in quanto <20> presente su " << brit.items() << " buoni di ritiro ancora da evadere\n"
|
|
|
|
|
<< doc_rif(brit);
|
|
|
|
|
return error_box(str);
|
2011-11-23 09:52:00 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//controllo articolo in buoni di prelievo
|
|
|
|
|
const TString4 codnumbp = ini_get_string(CONFIG_DITTA, "lv", "NUM_PRE", NULL, 0);
|
|
|
|
|
const TString4 tipodocbp = ini_get_string(CONFIG_DITTA, "lv", "TIPODOC_PRE", NULL, 0);
|
|
|
|
|
const char statofbp = cache().get("%TIP", tipodocbp, "S2").mid(2,1)[0];
|
|
|
|
|
|
|
|
|
|
query.cut(0);
|
|
|
|
|
query << "USE RDOC KEY 5\n"
|
2012-03-02 16:01:50 +00:00
|
|
|
|
<< "SELECT (DOC.TIPODOC=\"" << tipodocbp << "\")&&(DOC.STATO<\"" << statofbp << "\")&&(DOC.CODCF=\"" << codcf << "\")\n"
|
2011-11-23 09:52:00 +00:00
|
|
|
|
<< "JOIN DOC INTO PROVV=PROVV ANNO=ANNO CODNUM=CODNUM NDOC=NDOC\n"
|
|
|
|
|
<< "FROM CODART=\"" << codart << "\" ANNO=" << danno << "CODNUM=\"" << codnumbp << "\"\n"
|
|
|
|
|
<< "TO CODART=\"" << codart << "\" ANNO=" << danno << "CODNUM=\"" << codnumbp << "\"\n";
|
|
|
|
|
|
|
|
|
|
TISAM_recordset bpre(query);
|
2012-03-02 10:53:11 +00:00
|
|
|
|
if(bpre.move_first())
|
2011-11-23 09:52:00 +00:00
|
|
|
|
{
|
|
|
|
|
TString str;
|
|
|
|
|
str << "Non <20> possibile cancellare dal contratto l'articolo " << codart
|
2012-03-02 10:53:11 +00:00
|
|
|
|
<< "in quanto <20> presente su " << bpre.items() << " buoni di prelievo ancora da evadere\n"
|
|
|
|
|
<< doc_rif(bpre);
|
|
|
|
|
return error_box(str);
|
2011-11-23 09:52:00 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!noyes_box("Si desidera veramente cancellare l'articolo %s",(const char*) codart))
|
|
|
|
|
return false;
|
2009-12-15 17:36:40 +00:00
|
|
|
|
}
|
2009-01-27 16:54:54 +00:00
|
|
|
|
}
|
2009-09-29 15:50:37 +00:00
|
|
|
|
|
|
|
|
|
if (e == se_leave || e == se_notify_modify)
|
|
|
|
|
_artrig.cut(0);
|
|
|
|
|
|
2009-01-20 09:42:36 +00:00
|
|
|
|
break;
|
2009-06-11 11:27:01 +00:00
|
|
|
|
case F_TIPOCAN:
|
2009-06-11 14:39:43 +00:00
|
|
|
|
case F_NOLCICTE:
|
2009-05-28 15:52:36 +00:00
|
|
|
|
{
|
2009-06-11 11:27:01 +00:00
|
|
|
|
//copio il valore del campo in questione della testata su tutte le righe se F_TIPOCAN vale
|
|
|
|
|
//% su valore convenzionale per cliente, altrimente lascio quello che c'<27>
|
|
|
|
|
const int tipocan = atoi(get(F_TIPOCAN));
|
2009-05-28 15:52:36 +00:00
|
|
|
|
if (e == fe_modify || e == fe_init)
|
|
|
|
|
{
|
|
|
|
|
TSheet_field& ss = sfield(F_RIGHE);
|
|
|
|
|
|
|
|
|
|
//recupero le posizioni dei campi che devo modificare
|
2009-06-11 14:39:43 +00:00
|
|
|
|
const int pos_tipoforf = ss.cid2index(S_TIPOFORF);
|
|
|
|
|
const int pos_nolcic = ss.cid2index(S_NOLCIC);
|
2009-05-28 15:52:36 +00:00
|
|
|
|
const int pos_vcartcli = ss.cid2index(S_VCARTCLI);
|
2009-06-11 14:39:43 +00:00
|
|
|
|
|
|
|
|
|
const char nolcicte = field(F_NOLCICTE).get()[0];
|
2009-05-28 15:52:36 +00:00
|
|
|
|
|
2009-06-11 11:27:01 +00:00
|
|
|
|
if (tipocan == 2)
|
2009-05-28 15:52:36 +00:00
|
|
|
|
{
|
|
|
|
|
FOR_EACH_SHEET_ROW(ss, r, row)
|
|
|
|
|
{
|
|
|
|
|
TToken_string& riga = ss.row(r);
|
|
|
|
|
//scrivo i valori alle posizioni corrette
|
2009-06-11 14:39:43 +00:00
|
|
|
|
riga.add(4, pos_tipoforf);
|
|
|
|
|
riga.add(nolcicte, pos_nolcic);
|
2009-06-11 11:27:01 +00:00
|
|
|
|
riga.add('C', pos_vcartcli);
|
2009-05-28 15:52:36 +00:00
|
|
|
|
//disabilito le celle interessate
|
|
|
|
|
ss.disable_cell(r, pos_tipoforf);
|
2009-06-11 14:39:43 +00:00
|
|
|
|
ss.disable_cell(r, pos_nolcic);
|
2009-05-28 15:52:36 +00:00
|
|
|
|
ss.disable_cell(r, pos_vcartcli);
|
|
|
|
|
}
|
|
|
|
|
field(F_TIPOFORF).disable();
|
2009-06-11 14:39:43 +00:00
|
|
|
|
field(F_NOLCIC).disable();
|
2009-05-28 15:52:36 +00:00
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
FOR_EACH_SHEET_ROW(ss, r, row)
|
|
|
|
|
{
|
2009-06-11 11:27:01 +00:00
|
|
|
|
TToken_string& riga = ss.row(r);
|
2009-06-16 09:00:11 +00:00
|
|
|
|
//abilito le celle alle posizioni corrette
|
2009-06-11 14:39:43 +00:00
|
|
|
|
ss.enable_cell(r, pos_tipoforf);
|
|
|
|
|
ss.enable_cell(r, pos_nolcic);
|
2009-05-28 15:52:36 +00:00
|
|
|
|
ss.enable_cell(r, pos_vcartcli);
|
2009-06-16 15:34:36 +00:00
|
|
|
|
if (riga.get_int(pos_tipoforf) == 4)
|
|
|
|
|
riga.add('A', pos_vcartcli);
|
2009-05-28 15:52:36 +00:00
|
|
|
|
}
|
2009-06-11 14:39:43 +00:00
|
|
|
|
field(F_TIPOFORF).enable();
|
|
|
|
|
field(F_NOLCIC).enable();
|
2009-05-28 15:52:36 +00:00
|
|
|
|
}
|
|
|
|
|
ss.force_update();
|
2009-06-16 15:34:36 +00:00
|
|
|
|
if (ss.items() > 0)
|
|
|
|
|
ss.select(0); // Forza aggiornamento del dettaglio di riga (saponetta)
|
2009-05-28 15:52:36 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
break;
|
2009-06-11 11:27:01 +00:00
|
|
|
|
case F_TIPOFORF:
|
|
|
|
|
{
|
|
|
|
|
//se questo campo risulta modificato, lo copio in alto e forzo l'update
|
2009-06-16 15:34:36 +00:00
|
|
|
|
if (e == fe_modify/* || e == fe_init*/)
|
2009-06-11 11:27:01 +00:00
|
|
|
|
{
|
|
|
|
|
TSheet_field& ss = sfield(F_RIGHE);
|
2009-06-16 15:34:36 +00:00
|
|
|
|
const int sel = ss.selected();
|
|
|
|
|
if (sel >= 0)
|
2009-06-11 11:27:01 +00:00
|
|
|
|
{
|
2009-06-16 15:34:36 +00:00
|
|
|
|
TToken_string& riga = ss.row(sel);
|
|
|
|
|
riga.add(o.get(), ss.cid2index(S_TIPOFORF));
|
|
|
|
|
if (ss.mask().get_int(F_TIPOCAN) != 2)
|
|
|
|
|
{
|
|
|
|
|
riga.add('A', ss.cid2index(S_VCARTCLI));
|
|
|
|
|
ss.disable_cell(sel, ss.cid2index(S_VCARTCLI));
|
|
|
|
|
}
|
|
|
|
|
ss.force_update(sel);
|
2009-06-11 11:27:01 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case F_RITAUDTTMPRIG:
|
|
|
|
|
{
|
|
|
|
|
//obbligo a settare il flag prima in testata, altrimenti non lo lascio settare per le righe
|
|
|
|
|
if (e == fe_modify || e == fe_init)
|
|
|
|
|
{
|
|
|
|
|
if (o.get()[0] == 'X')
|
|
|
|
|
{
|
|
|
|
|
if (field(F_RITAUDTTMP).get()[0] != 'X')
|
|
|
|
|
{
|
|
|
|
|
warning_box("E' necessario prima attivare il ritiro automatico della dotazione temporanea in testata");
|
2009-11-13 16:01:46 +00:00
|
|
|
|
o.set("");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (e == fe_modify)
|
|
|
|
|
{
|
|
|
|
|
TSheet_field& ss = sfield(F_RIGHE);
|
|
|
|
|
const int sel = ss.selected();
|
|
|
|
|
|
|
|
|
|
if (sel >= 0)
|
|
|
|
|
{
|
|
|
|
|
const int index = ss.cid2index(S_RITAUDTTMP);
|
|
|
|
|
|
|
|
|
|
const char* oldval = ss.row(sel).get(index);
|
|
|
|
|
const TString& newval = o.get();
|
|
|
|
|
if (newval != oldval)
|
|
|
|
|
{
|
|
|
|
|
ss.sheet_mask().set(S_RITAUDTTMP,newval);
|
|
|
|
|
ss.row(sel).add(newval,index);
|
|
|
|
|
ss.force_update(sel);
|
|
|
|
|
}
|
2009-06-11 11:27:01 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
break;
|
2009-09-11 16:35:28 +00:00
|
|
|
|
case F_CALCCONS:
|
|
|
|
|
//questo pezzo gestisce in maniera corretta gli enable e disable del campo conguaglio sullo sheet
|
|
|
|
|
if (e == fe_modify)
|
|
|
|
|
{
|
|
|
|
|
TSheet_field& ss = sfield(F_RIGHE);
|
|
|
|
|
const int sel = ss.selected();
|
|
|
|
|
if (sel >= 0)
|
|
|
|
|
{
|
|
|
|
|
TToken_string& riga = ss.row(sel);
|
|
|
|
|
riga.add(o.get(), ss.cid2index(F_CALCCONS));
|
2009-10-14 10:43:11 +00:00
|
|
|
|
if (riga.get_long(ss.cid2index(S_PPCONF)) <= 0)
|
2009-09-11 16:35:28 +00:00
|
|
|
|
ss.disable_cell(sel, ss.cid2index(S_CONG));
|
|
|
|
|
else
|
2009-09-22 13:56:28 +00:00
|
|
|
|
{
|
2009-09-11 16:35:28 +00:00
|
|
|
|
if (atoi(o.get()) == 1)
|
|
|
|
|
ss.enable_cell(sel, ss.cid2index(S_CONG));
|
2009-09-22 13:56:28 +00:00
|
|
|
|
else
|
|
|
|
|
ss.disable_cell(sel, ss.cid2index(S_CONG));
|
|
|
|
|
}
|
2009-09-11 16:35:28 +00:00
|
|
|
|
}
|
|
|
|
|
ss.force_update(sel);
|
|
|
|
|
}
|
|
|
|
|
break;
|
2009-05-28 15:52:36 +00:00
|
|
|
|
case S_CODART:
|
|
|
|
|
if (!o.empty()) //se il campo risulta pieno
|
|
|
|
|
{
|
|
|
|
|
if (e == fe_modify) //e se risulta modificato
|
|
|
|
|
{
|
|
|
|
|
const TString& codart = o.get();
|
|
|
|
|
TSheet_field& ss = sfield(F_RIGHE);
|
|
|
|
|
TMask& m = o.mask(); // maschera di riga!
|
|
|
|
|
|
2009-12-15 15:37:06 +00:00
|
|
|
|
const int rigasel = ss.selected();
|
|
|
|
|
const TString80 art = o.get();
|
|
|
|
|
|
|
|
|
|
FOR_EACH_SHEET_ROW(ss, r, riga)
|
|
|
|
|
{
|
|
|
|
|
if(r == rigasel)
|
|
|
|
|
continue;
|
|
|
|
|
|
2010-01-14 15:19:02 +00:00
|
|
|
|
const TString80 tmp = riga->get(0);
|
|
|
|
|
if(tmp == art)
|
2009-12-15 15:37:06 +00:00
|
|
|
|
{
|
|
|
|
|
TString msg;
|
|
|
|
|
msg << "L'articolo " << codart << " <20> gi<67> presente a contratto e non <20> possibile reinserirlo.";
|
|
|
|
|
warning_box(msg);
|
2010-01-14 15:19:02 +00:00
|
|
|
|
|
2009-12-15 15:37:06 +00:00
|
|
|
|
m.set(S_CODART, _artrig);
|
|
|
|
|
TToken_string& row = ss.row(rigasel);
|
|
|
|
|
row.add(_artrig, 0);
|
|
|
|
|
ss.force_update(rigasel);
|
2010-01-14 15:19:02 +00:00
|
|
|
|
|
|
|
|
|
return false;
|
2009-12-15 15:37:06 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2015-02-04 10:54:10 +00:00
|
|
|
|
|
|
|
|
|
|
2009-05-28 15:52:36 +00:00
|
|
|
|
//se ho scritto un articolo diverso da quello che esisteva prima
|
|
|
|
|
//e se si desidera veramente modificarlo, allora permetto la modifica
|
|
|
|
|
//e forzo l'updatre della riga, altrimenti riscrivo l'articolo che c'era prima
|
|
|
|
|
//e lascio tutto invariato
|
2010-01-14 15:19:02 +00:00
|
|
|
|
if (codart != _artrig)
|
2009-05-28 15:52:36 +00:00
|
|
|
|
{
|
2011-11-22 16:17:42 +00:00
|
|
|
|
TToken_string& row = ss.row(ss.selected());
|
|
|
|
|
real prezzo(row.get(ss.cid2index(S_PREZZOST)));
|
|
|
|
|
|
2010-01-14 15:19:02 +00:00
|
|
|
|
if (_artrig.empty() || noyes_box("Si desidera veramente modificare l'articolo %s",(const char*) _artrig))
|
2011-11-22 16:17:42 +00:00
|
|
|
|
{
|
2010-01-14 15:19:02 +00:00
|
|
|
|
_artrig = codart;
|
2011-11-22 16:17:42 +00:00
|
|
|
|
//PROPONI PREZZO
|
|
|
|
|
TToken_string key;
|
|
|
|
|
key.add('C');
|
|
|
|
|
key.add(field(F_CODCF).get());
|
|
|
|
|
const TRectype& cfven = cache().get(LF_CFVEN, key);
|
|
|
|
|
bool trvlst = 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);
|
|
|
|
|
|
|
|
|
|
if (!rcondv.empty())
|
|
|
|
|
{
|
|
|
|
|
prezzo = rcondv.get_real(RCONDV_PREZZO);
|
|
|
|
|
trvlst = true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//se non ho trovato un listino, o se non c'<27> un listino impostato
|
|
|
|
|
//propongo come prezzo il valore convenzionale
|
|
|
|
|
if (!trvlst)
|
|
|
|
|
{
|
|
|
|
|
key.cut(0);
|
|
|
|
|
key.add(codart);
|
|
|
|
|
key.add(1);
|
|
|
|
|
const TRectype& umart = cache().get(LF_UMART, key);
|
|
|
|
|
m.set(S_PREZZOST, umart.get_real(UMART_PREZZO));
|
|
|
|
|
if (umart.get(UMART_PREZZO).full())
|
|
|
|
|
{
|
|
|
|
|
prezzo = umart.get_real(UMART_PREZZO);
|
|
|
|
|
trvlst = true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!trvlst && insert_mode())
|
|
|
|
|
warning_box(TR("Non <20> stato trovato nessun prezzo da proporre"));
|
|
|
|
|
}
|
2009-11-13 16:01:46 +00:00
|
|
|
|
else
|
|
|
|
|
m.set(S_CODART, _artrig);
|
2010-01-14 15:19:02 +00:00
|
|
|
|
|
2010-05-31 08:44:00 +00:00
|
|
|
|
row.add(prezzo.string(), ss.cid2index(S_PREZZOST));
|
2011-11-22 16:17:42 +00:00
|
|
|
|
row.add(_artrig, ss.cid2index(S_CODART));
|
2015-02-04 10:54:10 +00:00
|
|
|
|
|
|
|
|
|
const real valconv(cache().get("&LV047", codart, "R0"));
|
|
|
|
|
|
|
|
|
|
row.add(valconv.string(), ss.cid2index(S_VALCONV));
|
|
|
|
|
|
|
|
|
|
TDate oggi(TODAY);
|
|
|
|
|
|
|
|
|
|
row.add(oggi.string(), ss.cid2index(S_DATAINS));
|
|
|
|
|
|
2010-01-14 15:19:02 +00:00
|
|
|
|
ss.force_update(ss.selected());
|
2009-05-28 15:52:36 +00:00
|
|
|
|
}
|
|
|
|
|
//se all'articolo <20> associata un'unit<69> di misura, la propongo
|
2010-01-14 15:19:02 +00:00
|
|
|
|
//in automatico e richiamo il metodo (); altrimenti lo richiamo
|
2009-05-28 15:52:36 +00:00
|
|
|
|
//solo se <20> arrivato un fe_init al campo
|
2010-01-12 16:11:02 +00:00
|
|
|
|
on_art_select(e);
|
2009-05-28 15:52:36 +00:00
|
|
|
|
}
|
|
|
|
|
else
|
2010-10-12 16:16:53 +00:00
|
|
|
|
if (e == fe_init && (o.get() != _artrig))
|
2010-01-12 16:11:02 +00:00
|
|
|
|
on_art_select(e);
|
2009-05-28 15:52:36 +00:00
|
|
|
|
}
|
|
|
|
|
break;
|
2009-06-11 11:27:01 +00:00
|
|
|
|
case S_CONG:
|
|
|
|
|
case S_DOTIN:
|
|
|
|
|
case S_DOTOD:
|
|
|
|
|
case S_DOTTMP:
|
2015-02-04 10:54:10 +00:00
|
|
|
|
{
|
2013-03-03 21:46:20 +00:00
|
|
|
|
if (e == fe_modify)
|
2009-06-11 11:27:01 +00:00
|
|
|
|
{
|
2013-03-03 21:46:20 +00:00
|
|
|
|
TString str;
|
2015-02-04 10:54:10 +00:00
|
|
|
|
str << "ATTENZIONE: Una quantit<69> risulta modificata a mano; dopo questa operazione i totali dei movimenti"
|
|
|
|
|
<< "di magazzino potrebbero non corrispondere ai numeri qui salvati";
|
2013-03-03 21:46:20 +00:00
|
|
|
|
warning_box(str);
|
2010-01-14 16:47:28 +00:00
|
|
|
|
|
2013-03-03 21:46:20 +00:00
|
|
|
|
TSheet_field& ss = sfield(F_RIGHE);
|
|
|
|
|
TMask& m = o.mask(); // maschera di riga!
|
2010-01-14 16:47:28 +00:00
|
|
|
|
|
2013-03-03 21:46:20 +00:00
|
|
|
|
const int rigasel = ss.selected();
|
|
|
|
|
const long qta = o.get_long();
|
2010-01-14 16:47:28 +00:00
|
|
|
|
|
2013-03-03 21:46:20 +00:00
|
|
|
|
m.set(o.dlg(), qta);
|
2010-01-14 16:47:28 +00:00
|
|
|
|
|
2013-03-03 21:46:20 +00:00
|
|
|
|
TToken_string& row = ss.row(rigasel);
|
|
|
|
|
row.add(qta, ss.cid2index(o.dlg()));
|
|
|
|
|
//ss.force_update(rigasel);
|
2009-06-11 11:27:01 +00:00
|
|
|
|
}
|
2015-02-04 10:54:10 +00:00
|
|
|
|
}
|
2009-06-11 11:27:01 +00:00
|
|
|
|
break;
|
2009-05-28 15:52:36 +00:00
|
|
|
|
case DLG_PLANNING:
|
|
|
|
|
//se viene premuto il bottone "Giri", lancia lv0500 (generatore automatico dei giri)
|
|
|
|
|
if (e == fe_button && edit_mode())
|
|
|
|
|
{
|
|
|
|
|
TRelation_application& app = (TRelation_application&) main_app();
|
|
|
|
|
app.get_relation()->read(_isequal,_unlock);
|
|
|
|
|
TString str;
|
|
|
|
|
str << "lv0 -4 " << get(F_CODCF) << " " << get(F_CODCONT);
|
|
|
|
|
TExternal_app planning(str);
|
|
|
|
|
planning.run();
|
|
|
|
|
app.get_relation()->read(_isequal,_lock);
|
|
|
|
|
}
|
|
|
|
|
break;
|
2009-01-23 17:03:44 +00:00
|
|
|
|
case DLG_NEWREC:
|
|
|
|
|
if (e == fe_button)
|
|
|
|
|
{
|
2009-03-09 16:45:57 +00:00
|
|
|
|
//se sono in edit_mode, forzo l'uscita dal contratto attuale
|
2009-01-23 17:03:44 +00:00
|
|
|
|
if (edit_mode())
|
|
|
|
|
{
|
|
|
|
|
send_key(K_ESC, 0);
|
|
|
|
|
return false;
|
|
|
|
|
}
|
2009-03-09 16:45:57 +00:00
|
|
|
|
|
|
|
|
|
//se sono in query_mode e esiste gi<67> un cliente selzionato, allora richiamo il metodo LV_NEW_CONTRACT()
|
|
|
|
|
//e calcolo il primo codcont libero proponendolo in automatico
|
2009-01-23 17:03:44 +00:00
|
|
|
|
if (query_mode())
|
|
|
|
|
{
|
|
|
|
|
const long codcf = get_long(F_CODCF);
|
|
|
|
|
if (codcf > 0)
|
|
|
|
|
{
|
|
|
|
|
const int indsped = get_int(F_INDSPED);
|
|
|
|
|
const long codcont = lv_new_contract(codcf, indsped);
|
|
|
|
|
if (codcont > 0)
|
|
|
|
|
set(F_CODCONT, codcont);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2009-09-29 15:50:37 +00:00
|
|
|
|
break;
|
2010-01-22 11:54:14 +00:00
|
|
|
|
case DLG_RESET:
|
2011-05-27 15:35:58 +00:00
|
|
|
|
if (e == fe_button && noyes_box(TR("Si <20> sicuri di voler azzerare i conguagli di questo contratto?")))
|
2010-01-21 11:36:43 +00:00
|
|
|
|
azzera_conguaglio();
|
2009-09-29 15:50:37 +00:00
|
|
|
|
default:
|
2009-03-09 16:45:57 +00:00
|
|
|
|
//se sto modificando un campo con indice > 500 e diverso da F_CAUSLAVDESCRIG
|
|
|
|
|
//allora forzo l'update dello sheet sulla riga selezionata
|
|
|
|
|
if (e == fe_modify && is_running() && o.dlg() > 500/*&& o.dlg() != F_CAUSLAVDESCRIG*/)
|
2009-01-20 09:42:36 +00:00
|
|
|
|
{
|
|
|
|
|
TSheet_field& ss = sfield(F_RIGHE);
|
2009-03-09 16:45:57 +00:00
|
|
|
|
const int sel = ss.selected();
|
2009-11-13 16:01:46 +00:00
|
|
|
|
|
2009-02-16 16:28:21 +00:00
|
|
|
|
if (sel >= 0)
|
|
|
|
|
{
|
2009-03-09 16:45:57 +00:00
|
|
|
|
const short rowid = o.dlg() - 400;
|
2009-06-04 08:30:28 +00:00
|
|
|
|
const int index = ss.cid2index(rowid);
|
|
|
|
|
|
|
|
|
|
const char* oldval = ss.row(sel).get(index);
|
2009-04-30 12:40:50 +00:00
|
|
|
|
const TString& newval = o.get();
|
|
|
|
|
if (newval != oldval)
|
|
|
|
|
{
|
|
|
|
|
ss.sheet_mask().set(rowid,newval);
|
|
|
|
|
ss.row(sel).add(newval,index);
|
|
|
|
|
ss.force_update(sel);
|
|
|
|
|
}
|
2009-02-16 16:28:21 +00:00
|
|
|
|
}
|
2009-01-20 09:42:36 +00:00
|
|
|
|
}
|
|
|
|
|
break;
|
2008-09-10 09:22:52 +00:00
|
|
|
|
}
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
2009-09-11 16:35:28 +00:00
|
|
|
|
int TContratti_msk::get_riga()
|
|
|
|
|
{
|
|
|
|
|
return _riga;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool TContratti_msk::set_riga(const int val)
|
|
|
|
|
{
|
|
|
|
|
_riga = val;
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
2009-03-09 16:45:57 +00:00
|
|
|
|
//Costruttore; nasconde o mostra il campo F_INDSPED a seconda di cosa <20> scritto in configurazione
|
2009-01-23 17:03:44 +00:00
|
|
|
|
TContratti_msk::TContratti_msk():TAutomask("lv0400a"), _post_contr(0)
|
2008-09-10 09:22:52 +00:00
|
|
|
|
{
|
2009-09-11 16:35:28 +00:00
|
|
|
|
if (!ini_get_bool(CONFIG_DITTA, "lv", "Useindsp"))
|
2009-01-27 16:54:54 +00:00
|
|
|
|
field(F_INDSPED).hide();
|
2011-01-20 09:40:18 +00:00
|
|
|
|
TFilename ininame(source_file());
|
|
|
|
|
|
|
|
|
|
ininame.ext("ini");
|
|
|
|
|
|
|
|
|
|
TConfig prof(ininame.name(), "Colors");
|
|
|
|
|
COLOR back;
|
|
|
|
|
COLOR fore;
|
|
|
|
|
|
|
|
|
|
prof.write_protect(true);
|
|
|
|
|
for (int i = 0; ; i++)
|
|
|
|
|
{
|
|
|
|
|
const TString& name = prof.get("RuleName", NULL, i);
|
|
|
|
|
if (name.full())
|
|
|
|
|
{
|
|
|
|
|
const TString& expr = prof.get("Rule", NULL, i);
|
|
|
|
|
const TTypeexp type = prof.get_char("RuleType", NULL, i, 'N') == 'S' ? _strexpr : _numexpr ;
|
|
|
|
|
back = prof.get_color("BgCol", NULL, i, NORMAL_BACK_COLOR);
|
|
|
|
|
fore = prof.get_color("FgCol", NULL, i, NORMAL_COLOR);
|
|
|
|
|
color_rules().add(new TColor_rule(name, expr, type, back, fore));
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
break;
|
|
|
|
|
}
|
2008-09-10 09:22:52 +00:00
|
|
|
|
}
|
|
|
|
|
|
2009-03-09 16:45:57 +00:00
|
|
|
|
//////////////////////////////
|
|
|
|
|
//// TCONTRATTI_APP ////
|
|
|
|
|
//////////////////////////////
|
|
|
|
|
|
|
|
|
|
//classe TContratti_app
|
2008-08-21 15:41:07 +00:00
|
|
|
|
class TContratti_app: public TRelation_application
|
|
|
|
|
{
|
2009-03-09 16:45:57 +00:00
|
|
|
|
TContratti_msk* _msk;
|
|
|
|
|
TRelation* _rel;
|
2009-09-11 16:35:28 +00:00
|
|
|
|
TString80 _codart;
|
2008-08-21 15:41:07 +00:00
|
|
|
|
|
2008-08-27 15:21:44 +00:00
|
|
|
|
private:
|
|
|
|
|
void save_rows(const TMask& m);
|
2009-03-09 16:45:57 +00:00
|
|
|
|
TString build_query(const TMask& m) const;
|
2008-08-27 15:21:44 +00:00
|
|
|
|
int find_art(TSheet_field& s,const TString& art) const;
|
|
|
|
|
|
2008-08-21 15:41:07 +00:00
|
|
|
|
protected:
|
2008-09-02 10:38:36 +00:00
|
|
|
|
virtual TMask* get_mask (int mode) {return _msk; }
|
2008-08-21 15:41:07 +00:00
|
|
|
|
virtual TRelation* get_relation() const {return _rel;}
|
|
|
|
|
|
|
|
|
|
virtual bool user_create();
|
|
|
|
|
virtual bool user_destroy();
|
2009-03-09 16:45:57 +00:00
|
|
|
|
virtual void on_config_change(); //METODO VUOTO
|
|
|
|
|
virtual bool get_next_key(TToken_string& key); //METODO MAI UTILIZZATO?
|
2008-08-27 15:21:44 +00:00
|
|
|
|
virtual int read(TMask& m);
|
|
|
|
|
virtual int write(const TMask& m);
|
|
|
|
|
virtual int rewrite(const TMask& m);
|
2009-03-09 16:45:57 +00:00
|
|
|
|
virtual bool protected_record(TRectype & rec); //METODO MAI UTILIZZATO?
|
2008-08-27 15:21:44 +00:00
|
|
|
|
virtual bool remove();
|
2008-12-09 12:43:15 +00:00
|
|
|
|
virtual void init_query_mode(TMask& m);
|
2008-10-21 15:51:13 +00:00
|
|
|
|
virtual void init_insert_mode(TMask& m);
|
2009-01-27 16:54:54 +00:00
|
|
|
|
virtual void init_modify_mode(TMask& m);
|
2008-12-10 12:03:36 +00:00
|
|
|
|
bool elimina_planning(const long& codcont, const long& codcf) const;
|
2008-12-10 11:57:25 +00:00
|
|
|
|
bool kill_planning (TISAM_recordset& selrighe) const;
|
2011-01-20 09:40:18 +00:00
|
|
|
|
bool menu(MENU_TAG mt);
|
2008-08-21 15:41:07 +00:00
|
|
|
|
};
|
|
|
|
|
|
2009-03-09 16:45:57 +00:00
|
|
|
|
//SAVE_ROWS: questo metodo salva effettivamente le righe vislualizzate sullo sheet sul file
|
|
|
|
|
//LF_LVRCONDV e aggiorna e/o aggiunge record su LF_CLIFOGIAC
|
|
|
|
|
void TContratti_app::save_rows(const TMask& m)
|
|
|
|
|
{
|
|
|
|
|
//instanzio un TISAM_recordset sulle righe contratto
|
|
|
|
|
TISAM_recordset righeset(build_query(m));
|
|
|
|
|
//instazio un TLocalisamfile partendo dal recordset che ho appena creato
|
|
|
|
|
//(cio<69> su LF_LVRCONDV)
|
|
|
|
|
TLocalisamfile& file = righeset.cursor()->file();
|
|
|
|
|
|
|
|
|
|
//recupero lo sheet
|
|
|
|
|
TSheet_field& righe = m.sfield(F_RIGHE);
|
|
|
|
|
|
|
|
|
|
//scorro tutte le righe contratto e elimino tutte quelle che non ci sono pi<70> sullo sheet
|
|
|
|
|
for (bool ok = righeset.move_first(); ok; ok = righeset.move_next())
|
|
|
|
|
{
|
|
|
|
|
const TString& art = righeset.get("CODART").as_string();
|
|
|
|
|
if (find_art(righe, art) < 0)
|
|
|
|
|
file.remove();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//instanzio un TLocalisamfile su LF_CLIFOGIAC
|
|
|
|
|
TLocalisamfile magcli(LF_CLIFOGIAC);
|
|
|
|
|
|
|
|
|
|
//setto alcune variabili di interesse
|
|
|
|
|
const TDate oggi(TODAY);
|
|
|
|
|
const int year = oggi.year();
|
|
|
|
|
const long clifo = m.get_long(F_CODCF);
|
|
|
|
|
const int indsp = m.get_int(F_INDSPED);
|
|
|
|
|
|
2010-12-13 16:00:36 +00:00
|
|
|
|
TEsercizi_contabili& esc = esercizi();
|
2010-12-02 10:30:14 +00:00
|
|
|
|
const int last_esc = esc.last();
|
|
|
|
|
const int pred_esc = esc.pred(last_esc);
|
|
|
|
|
|
2013-12-13 09:40:33 +00:00
|
|
|
|
const bool pred_esc_chiuso = pred_esc <= 0 || esc[pred_esc].chiusura_mag().ok();
|
2010-12-13 16:00:36 +00:00
|
|
|
|
const int esercizio = last_esc;
|
2010-12-02 10:30:14 +00:00
|
|
|
|
|
2009-03-09 16:45:57 +00:00
|
|
|
|
//recupero la maschera di riga
|
|
|
|
|
TMask& msk = righe.sheet_mask();
|
|
|
|
|
|
|
|
|
|
//per ogni riga dello sheet
|
|
|
|
|
FOR_EACH_SHEET_ROW(righe, r, row)
|
|
|
|
|
{
|
|
|
|
|
file.zero();
|
|
|
|
|
file.put("CODCF",clifo);
|
|
|
|
|
file.put("CODCONT",m.get(F_CODCONT));
|
|
|
|
|
|
|
|
|
|
//per ogni campo della maschera scrivi setta all'interno del record corrente di file
|
|
|
|
|
//il valore di quei campi che hanno un field
|
|
|
|
|
FOR_EACH_MASK_FIELD(msk,i,f)
|
|
|
|
|
{
|
|
|
|
|
const TFieldref* fr = f->field();
|
|
|
|
|
if (fr != NULL)
|
|
|
|
|
{
|
|
|
|
|
const int pos = righe.cid2index(f->dlg());
|
|
|
|
|
fr->write(row->get(pos), file.curr());
|
|
|
|
|
}
|
|
|
|
|
}
|
2009-05-25 09:55:47 +00:00
|
|
|
|
|
2009-03-09 16:45:57 +00:00
|
|
|
|
//leggo il codart
|
2009-05-25 09:55:47 +00:00
|
|
|
|
const TString80 codart = row->get(righe.cid2index(S_CODART));
|
2009-06-04 08:30:28 +00:00
|
|
|
|
if (codart.full())
|
2009-03-09 16:45:57 +00:00
|
|
|
|
{
|
2009-06-04 08:30:28 +00:00
|
|
|
|
file.rewrite_write();
|
|
|
|
|
//se il codart <20> pieno e le quantit<69> sono modificabili (da configurazione)
|
2009-08-25 14:57:29 +00:00
|
|
|
|
if (ini_get_bool(CONFIG_DITTA, "lv", "Qtamodi"))
|
2009-03-09 16:45:57 +00:00
|
|
|
|
{
|
2009-06-04 08:30:28 +00:00
|
|
|
|
TArticolo_lavanderie& artrec = cached_article_laundry(codart, 'C', clifo, indsp);
|
2010-12-31 08:10:41 +00:00
|
|
|
|
TRecmag_lavanderie reclav(artrec.find_rec(esercizio));
|
|
|
|
|
TRecmag_lavanderie reclav_prec(artrec.find_rec(pred_esc));
|
2010-12-02 10:30:14 +00:00
|
|
|
|
|
2009-06-04 08:30:28 +00:00
|
|
|
|
//gestione LF_CLIFOGIAC
|
2013-12-13 09:40:33 +00:00
|
|
|
|
if (reclav.empty())
|
2009-06-04 08:30:28 +00:00
|
|
|
|
{
|
2009-06-18 09:46:26 +00:00
|
|
|
|
reclav.put(CLIFOGIAC_TIPOCF, 'C');
|
|
|
|
|
reclav.put(CLIFOGIAC_CODCF, clifo);
|
2010-12-02 10:30:14 +00:00
|
|
|
|
reclav.put(CLIFOGIAC_ANNOES, esercizio);
|
2009-06-18 09:46:26 +00:00
|
|
|
|
reclav.put(CLIFOGIAC_INDSPED, indsp);
|
|
|
|
|
reclav.put(CLIFOGIAC_CODART, codart);
|
|
|
|
|
reclav.put(CLIFOGIAC_NRIGA, 1);
|
2009-06-04 08:30:28 +00:00
|
|
|
|
}
|
2009-06-18 09:46:26 +00:00
|
|
|
|
|
|
|
|
|
//riscrivo la dotazione iniziale convertita nell'unit<69> di misura principale
|
2010-12-02 10:30:14 +00:00
|
|
|
|
real dotin = row->get(righe.cid2index(S_DOTIN));
|
|
|
|
|
if(!pred_esc_chiuso)
|
|
|
|
|
dotin -= reclav_prec.get_real(CLIFOGIAC_DOTIN);
|
2009-06-18 09:46:26 +00:00
|
|
|
|
reclav.put(CLIFOGIAC_DOTIN, dotin);
|
|
|
|
|
|
|
|
|
|
//riscrivo la dotazione odierna convertita nell'unit<69> di misura principale
|
2010-12-02 10:30:14 +00:00
|
|
|
|
real dotod = row->get(righe.cid2index(S_DOTOD));
|
|
|
|
|
if(!pred_esc_chiuso)
|
|
|
|
|
dotod -= reclav_prec.get_real(CLIFOGIAC_DOTOD);
|
2009-06-18 09:46:26 +00:00
|
|
|
|
reclav.put(CLIFOGIAC_DOTOD, dotod);
|
|
|
|
|
|
|
|
|
|
//riscrivo la dotazione temporanea convertita nell'unit<69> di misura principale
|
2010-12-02 10:30:14 +00:00
|
|
|
|
real dottm = row->get(righe.cid2index(S_DOTTMP));
|
|
|
|
|
if(!pred_esc_chiuso)
|
|
|
|
|
dottm -= reclav_prec.get_real(CLIFOGIAC_DOTTM);
|
2009-06-18 09:46:26 +00:00
|
|
|
|
reclav.put(CLIFOGIAC_DOTTM, dottm);
|
|
|
|
|
|
|
|
|
|
//riscrivo il consegnato anno convertito nell'unit<69> di misura principale
|
|
|
|
|
const real conan = row->get(righe.cid2index(S_CONSANNO));
|
2010-12-02 10:30:14 +00:00
|
|
|
|
reclav.put(CLIFOGIAC_CONSANNO, conan);
|
2009-06-22 15:40:15 +00:00
|
|
|
|
reclav.rewrite_write(magcli);
|
2009-03-09 16:45:57 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
2009-05-25 09:55:47 +00:00
|
|
|
|
} //fine FOR_EACH_ROW
|
2009-03-09 16:45:57 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//BUILD_QUERY: metodo che crea la query sulle righe contratti
|
|
|
|
|
//recuperando i dati di interesse dalla maschera
|
|
|
|
|
TString TContratti_app:: build_query(const TMask& m) const
|
|
|
|
|
{
|
2009-10-14 10:49:40 +00:00
|
|
|
|
TString query = "";
|
2009-03-09 16:45:57 +00:00
|
|
|
|
query << "USE LVRCONDV\n"
|
|
|
|
|
<< "FROM CODCF=" << m.get(F_CODCF) << " CODCONT=" << m.get(F_CODCONT) << "\n"
|
|
|
|
|
<< "TO CODCF=" << m.get(F_CODCF) << " CODCONT=" << m.get(F_CODCONT);
|
|
|
|
|
return query;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//FIND_ART: metodo che restituisce l'indice della riga dello sheet che contiene
|
|
|
|
|
//l'articolo desiderato (-1 se non lo trova)
|
|
|
|
|
int TContratti_app::find_art(TSheet_field& s, const TString& art) const
|
|
|
|
|
{
|
|
|
|
|
int r = -1;
|
|
|
|
|
//scorro le righe dello sheet partendo dall'ultima
|
|
|
|
|
for (r = s.items()-1 ; r>=0 ; r--)
|
|
|
|
|
{
|
|
|
|
|
const char* codart = s.row(r).get(0);
|
|
|
|
|
if (art == codart)
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
return r;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//USER_CREATE: metodo che crea TRelation e TContratti_msk solo se si <20> in un esercizio valido
|
|
|
|
|
//e che setta i comportamenti sulle righe aggiunte agli sheet
|
2008-08-21 15:41:07 +00:00
|
|
|
|
bool TContratti_app:: user_create()
|
|
|
|
|
{
|
2009-09-11 16:35:28 +00:00
|
|
|
|
//se gli sono stati passati pi<70> parametri, allora setto la variabile globale _codart...
|
|
|
|
|
//...con il parametro desiderato, se no lo setto a stringa vuota
|
|
|
|
|
if (argc() > 2)
|
|
|
|
|
{
|
|
|
|
|
_codart = argv(3);
|
|
|
|
|
_codart.ltrim(2);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
_codart = "";
|
|
|
|
|
|
2010-01-14 14:05:02 +00:00
|
|
|
|
const TDate oggi(TODAY);
|
2013-02-14 10:19:59 +00:00
|
|
|
|
if (esercizi().date2esc(oggi) <= 0)
|
|
|
|
|
error_box("Non esiste l'esercizio corrispondente al %s", oggi.string());
|
2009-01-16 23:18:15 +00:00
|
|
|
|
|
2009-02-27 12:26:24 +00:00
|
|
|
|
_rel=new TRelation (LF_LVCONDV);
|
|
|
|
|
_msk= new TContratti_msk;
|
2008-12-09 12:43:15 +00:00
|
|
|
|
|
2009-09-11 16:35:28 +00:00
|
|
|
|
_msk->set_riga(-1);
|
|
|
|
|
|
2009-03-23 15:23:57 +00:00
|
|
|
|
TSheet_field& ss = _msk->sfield(F_RIGHE);
|
|
|
|
|
|
2010-01-14 14:05:02 +00:00
|
|
|
|
ss.set_auto_append(false);
|
2008-12-12 15:54:15 +00:00
|
|
|
|
ss.set_append(false);
|
2008-12-09 12:43:15 +00:00
|
|
|
|
|
|
|
|
|
return true;
|
2008-08-21 15:41:07 +00:00
|
|
|
|
}
|
|
|
|
|
|
2009-03-09 16:45:57 +00:00
|
|
|
|
//USER_DESTROY: metodo che distrugge le variabili globali alla fine dell'esecuzione
|
2008-08-21 15:41:07 +00:00
|
|
|
|
bool TContratti_app:: user_destroy()
|
|
|
|
|
{
|
2008-09-02 10:38:36 +00:00
|
|
|
|
delete _msk;
|
2008-08-21 15:41:07 +00:00
|
|
|
|
delete _rel;
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
2009-03-09 16:45:57 +00:00
|
|
|
|
|
|
|
|
|
//ON_CONFIG_CHANGE: per adesso un semplice segnaposto
|
2008-08-21 15:41:07 +00:00
|
|
|
|
void TContratti_app:: on_config_change()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
2009-03-09 16:45:57 +00:00
|
|
|
|
//GET_NEXT_KEY: metodo che restituisce la chiave di ricerca sui contratti prendendo il prossimo codcont libero
|
2008-08-21 15:41:07 +00:00
|
|
|
|
bool TContratti_app:: get_next_key(TToken_string& key)
|
|
|
|
|
{
|
2008-09-02 10:38:36 +00:00
|
|
|
|
const long cliente=_msk->get_long(F_CODCF);
|
2009-03-09 16:45:57 +00:00
|
|
|
|
if (cliente <= 0)
|
|
|
|
|
return false;
|
|
|
|
|
|
2008-08-21 15:41:07 +00:00
|
|
|
|
key.add(F_CODCF);
|
|
|
|
|
key.add(cliente);
|
|
|
|
|
key.add(F_CODCONT);
|
|
|
|
|
|
2009-01-23 17:03:44 +00:00
|
|
|
|
long codcont= lv_new_contract(cliente, _msk->get_int(F_INDSPED));
|
2008-08-21 15:41:07 +00:00
|
|
|
|
key.add(codcont);
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
2009-03-09 16:45:57 +00:00
|
|
|
|
//READ: ridefinizione del metodo read() delle TRealtion_application
|
2009-05-25 09:55:47 +00:00
|
|
|
|
int TContratti_app::read(TMask& m)
|
2008-08-27 15:21:44 +00:00
|
|
|
|
{
|
2009-03-09 16:45:57 +00:00
|
|
|
|
//eseguo la read() standard
|
|
|
|
|
int err = TRelation_application::read(m);
|
|
|
|
|
//se la read va a buon fine
|
|
|
|
|
if(err == NOERR)
|
2008-08-27 15:21:44 +00:00
|
|
|
|
{
|
2009-03-09 16:45:57 +00:00
|
|
|
|
//instanzio un TISAM_recordset sulle righe contratto
|
|
|
|
|
TISAM_recordset righeset(build_query(m));
|
|
|
|
|
const TRectype& rec = righeset.cursor()->curr();
|
2008-08-27 15:21:44 +00:00
|
|
|
|
|
2009-05-25 09:55:47 +00:00
|
|
|
|
//instanzio un TLcalisamfile su LF_CLIFOGIAC
|
2009-02-16 16:28:21 +00:00
|
|
|
|
TLocalisamfile magcli(LF_CLIFOGIAC);
|
2009-03-09 16:45:57 +00:00
|
|
|
|
//setto alcune variabili di interesse
|
2010-12-02 10:30:14 +00:00
|
|
|
|
|
|
|
|
|
//la data deve essere un esercizio; <20> da prendere sempre l'ultimo esercizio esistente
|
|
|
|
|
TEsercizi_contabili esc;
|
|
|
|
|
const int last_esc = esc.last();
|
|
|
|
|
|
|
|
|
|
/*const TDate oggi(TODAY);
|
|
|
|
|
const int year = oggi.year();*/
|
2009-03-09 16:45:57 +00:00
|
|
|
|
const long clifo = m.get_long(F_CODCF);
|
|
|
|
|
const int indsp = m.get_int(F_INDSPED);
|
|
|
|
|
//recupero sheet e realtiva mashera di riga
|
|
|
|
|
TSheet_field& righe = m.sfield(F_RIGHE);
|
|
|
|
|
TMask& msk = righe.sheet_mask();
|
2008-08-27 15:21:44 +00:00
|
|
|
|
righe.destroy();
|
|
|
|
|
|
2009-03-09 16:45:57 +00:00
|
|
|
|
//per ogni riga dello sheet
|
2009-09-11 16:35:28 +00:00
|
|
|
|
int pos = -1;
|
2009-03-09 16:45:57 +00:00
|
|
|
|
for (bool ok = righeset.move_first(); ok; ok = righeset.move_next())
|
2008-08-27 15:21:44 +00:00
|
|
|
|
{
|
2009-09-11 16:35:28 +00:00
|
|
|
|
++pos;
|
2009-03-09 16:45:57 +00:00
|
|
|
|
TToken_string& row = righe.row(-1);
|
|
|
|
|
//per ogni campo della maschera scrivi setta all'interno del record corrente di file
|
|
|
|
|
//il valore di quei campi che hanno un field
|
2008-08-27 15:21:44 +00:00
|
|
|
|
FOR_EACH_MASK_FIELD(msk,i,f)
|
|
|
|
|
{
|
|
|
|
|
const TFieldref*fr=f->field();
|
|
|
|
|
if (fr!= NULL)
|
|
|
|
|
row.add(fr->read(rec),righe.cid2index(f->dlg()));
|
|
|
|
|
}
|
2009-03-09 16:45:57 +00:00
|
|
|
|
|
2009-05-25 09:55:47 +00:00
|
|
|
|
const TString80 codart(row.get(righe.cid2index(S_CODART)));
|
2009-09-11 16:35:28 +00:00
|
|
|
|
|
2009-09-29 16:27:24 +00:00
|
|
|
|
//se non gli ho passato nessun codart, allora dico che voglio dare il focus alla prima riga dello sheet
|
|
|
|
|
//aktrimenti dico che volgio dare il focus alla riga dello sheet che contiene l'articolo che gli ho passato
|
2011-01-20 09:40:18 +00:00
|
|
|
|
if (_codart.blank())
|
2009-09-29 15:50:37 +00:00
|
|
|
|
_msk->set_riga(0);
|
2009-09-29 16:27:24 +00:00
|
|
|
|
else
|
|
|
|
|
if (codart == _codart)
|
|
|
|
|
{
|
|
|
|
|
_msk->set_riga(pos);
|
|
|
|
|
_codart.cut(0);
|
|
|
|
|
}
|
|
|
|
|
|
2009-05-25 09:55:47 +00:00
|
|
|
|
//estraggo il record corrispondente su LF_CLIFOGIAC
|
|
|
|
|
TArticolo_lavanderie& artrec = cached_article_laundry(codart, 'C', clifo, indsp);
|
2009-11-13 16:01:46 +00:00
|
|
|
|
artrec.find_rec(0); //svuoto la cache a forza
|
2010-12-02 10:30:14 +00:00
|
|
|
|
const TRecmag_lavanderie& reclav = artrec.find_rec(last_esc);
|
2009-03-09 16:45:57 +00:00
|
|
|
|
//lettura dei dati da LF_CLIFOGIAC
|
2009-05-25 09:55:47 +00:00
|
|
|
|
//se esiste il record su LF_CLIFOGIAC, recupero l'unit<69> di misura dalla riga dello sheet selezionata
|
|
|
|
|
//e setto i campi delle dotazioni e dei consegnati ai valori corretti riportati alla giusta unit<69> di misura
|
|
|
|
|
if (!reclav.empty())
|
|
|
|
|
{
|
2009-06-22 15:40:15 +00:00
|
|
|
|
//calcolo dotazione iniziale, scritta sia sulla maschera che sullo sheet
|
|
|
|
|
const real dotin = reclav.get_real(CLIFOGIAC_DOTIN);
|
|
|
|
|
row.add(dotin.stringa(), righe.cid2index(S_DOTIN));
|
|
|
|
|
|
2009-05-25 09:55:47 +00:00
|
|
|
|
//calcolo dotazione odierna, scritta sia sulla maschera che sullo sheet
|
2009-05-27 14:55:51 +00:00
|
|
|
|
const real dotod = reclav.get_real(CLIFOGIAC_DOTOD);
|
|
|
|
|
row.add(dotod.stringa(), righe.cid2index(S_DOTOD));
|
2009-05-25 09:55:47 +00:00
|
|
|
|
//calcolo dotazione temporanea, scritta sia sulla maschera che sullo sheet
|
2009-05-27 14:55:51 +00:00
|
|
|
|
const real dottmp = reclav.get_real(CLIFOGIAC_DOTTM);
|
|
|
|
|
row.add(dottmp.stringa(), righe.cid2index(S_DOTTMP));
|
2009-02-16 16:28:21 +00:00
|
|
|
|
}
|
2009-03-09 16:45:57 +00:00
|
|
|
|
//forzo una check_row
|
|
|
|
|
righe.check_row(righe.items()-1, 3);
|
2008-08-27 15:21:44 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return err;
|
|
|
|
|
}
|
|
|
|
|
|
2009-03-09 16:45:57 +00:00
|
|
|
|
//WRITE: ridefinizione del metodo write() delle TRelation_application
|
|
|
|
|
int TContratti_app::write(const TMask& m)
|
2008-08-27 15:21:44 +00:00
|
|
|
|
{
|
2009-03-09 16:45:57 +00:00
|
|
|
|
//esegui la write standard
|
|
|
|
|
int err = TRelation_application::write(m);
|
|
|
|
|
//se va a buon fine esegui la save_rows() e ricorda all'utente i passaggi per planning
|
|
|
|
|
if(err == NOERR)
|
2008-08-27 15:21:44 +00:00
|
|
|
|
{
|
2009-03-09 16:45:57 +00:00
|
|
|
|
save_rows(m);
|
|
|
|
|
warning_box(TR("Ricordarsi di inserire i passaggi per planning"));
|
2008-08-27 15:21:44 +00:00
|
|
|
|
}
|
2009-03-09 16:45:57 +00:00
|
|
|
|
return err;
|
2008-08-27 15:21:44 +00:00
|
|
|
|
}
|
2009-01-27 16:54:54 +00:00
|
|
|
|
|
2009-03-09 16:45:57 +00:00
|
|
|
|
//REWRITE: ridefinizione del metodo rewrite() delle TRelation_application
|
|
|
|
|
int TContratti_app::rewrite(const TMask& m)
|
|
|
|
|
{
|
2009-04-15 14:42:32 +00:00
|
|
|
|
//esegui la rewrite standard
|
|
|
|
|
int err = TRelation_application::rewrite(m);
|
2009-03-09 16:45:57 +00:00
|
|
|
|
//se va a buon fine esegui la save_rows()
|
|
|
|
|
if(err == NOERR)
|
|
|
|
|
save_rows(m);
|
|
|
|
|
return err;
|
|
|
|
|
}
|
2009-01-27 16:54:54 +00:00
|
|
|
|
|
2009-03-09 16:45:57 +00:00
|
|
|
|
//PROTECTED_RECORD: metodo che rendo un record non cancellabile
|
|
|
|
|
bool TContratti_app::protected_record(TRectype & rec)
|
|
|
|
|
{
|
|
|
|
|
TLaundry_contract cont(rec);
|
|
|
|
|
return !cont.can_be_deleted();
|
|
|
|
|
}
|
2009-01-27 16:54:54 +00:00
|
|
|
|
|
2009-06-23 15:04:23 +00:00
|
|
|
|
//REMOVE: ridefinizione del metodo remove() delle TRelation_application
|
2009-03-09 16:45:57 +00:00
|
|
|
|
bool TContratti_app::remove()
|
|
|
|
|
{
|
2009-06-23 15:04:23 +00:00
|
|
|
|
//recupero i dati dalla testata del contratto prima di cancellarla
|
|
|
|
|
const TRectype& tcont = get_relation()->curr();
|
|
|
|
|
const int daanno = tcont.get_date(LVCONDV_DATAIN).year();
|
|
|
|
|
const int aanno = TDate(TODAY).year();
|
|
|
|
|
const long clifo = tcont.get_long(LVCONDV_CODCF);
|
|
|
|
|
const long indsp = tcont.get_long(LVCONDV_CODINDSP);
|
|
|
|
|
|
2009-03-09 16:45:57 +00:00
|
|
|
|
//eseguo la remove standard
|
|
|
|
|
bool ok = TRelation_application::remove();
|
2009-01-27 16:54:54 +00:00
|
|
|
|
|
2009-03-09 16:45:57 +00:00
|
|
|
|
//se va a buon fine, elimino anche le righe contratto dal file specifico
|
|
|
|
|
if(ok)
|
2008-08-27 15:21:44 +00:00
|
|
|
|
{
|
2009-03-09 16:45:57 +00:00
|
|
|
|
TISAM_recordset righeset(build_query(*_msk));
|
2009-06-23 15:04:23 +00:00
|
|
|
|
TLocalisamfile& rcont = righeset.cursor()->file();
|
|
|
|
|
|
|
|
|
|
//elimino le giacenze per cliente SOLO se le quantit<69> sono modificabili
|
|
|
|
|
if (ini_get_bool(CONFIG_DITTA, "lv", "Qtamodi"))
|
2009-03-09 16:45:57 +00:00
|
|
|
|
{
|
2009-06-23 15:04:23 +00:00
|
|
|
|
TLocalisamfile magcli(LF_CLIFOGIAC);
|
|
|
|
|
|
|
|
|
|
for (bool ok = righeset.move_first(); ok; ok = righeset.move_next())
|
|
|
|
|
{
|
|
|
|
|
//con questo ciclo elimino tutte le giacenze per cliente dall'anno di inizio validit<69>
|
|
|
|
|
//del contratto all'anno attuale (essendo nel ciclo che scorre le righe contratto
|
|
|
|
|
//elimino tutti gli articoli presenti per quel contratto)
|
|
|
|
|
for (int y = daanno; y <= aanno; y++)
|
|
|
|
|
{
|
|
|
|
|
magcli.put(CLIFOGIAC_ANNOES, y);
|
|
|
|
|
magcli.put(CLIFOGIAC_TIPOCF, 'C');
|
|
|
|
|
magcli.put(CLIFOGIAC_CODCF, clifo);
|
|
|
|
|
magcli.put(CLIFOGIAC_INDSPED, indsp);
|
|
|
|
|
magcli.put(CLIFOGIAC_CODART, righeset.get(LVRCONDV_CODART).as_string());
|
|
|
|
|
magcli.put(CLIFOGIAC_NRIGA, 1);
|
|
|
|
|
magcli.remove();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
rcont.remove();
|
2009-01-27 16:54:54 +00:00
|
|
|
|
}
|
2009-03-09 16:45:57 +00:00
|
|
|
|
//elimino i planning esistenti per quel cliente - contratto
|
|
|
|
|
elimina_planning(_msk->get_long(F_CODCONT),_msk->get_long(F_CODCF));
|
|
|
|
|
}
|
|
|
|
|
return ok;
|
2008-08-27 15:21:44 +00:00
|
|
|
|
}
|
|
|
|
|
|
2009-03-09 16:45:57 +00:00
|
|
|
|
//INIT_QUERY_MODE: ridefinizione del metodo init_query_mode() standard
|
2008-12-09 12:43:15 +00:00
|
|
|
|
void TContratti_app::init_query_mode(TMask& m)
|
|
|
|
|
{
|
2009-03-09 16:45:57 +00:00
|
|
|
|
//abilita il campo F_RAGSOC se il campo F_CODCF <20> abilitato
|
2014-05-14 08:26:49 +00:00
|
|
|
|
const bool yes = m.efield(F_CODCF).enabled();
|
|
|
|
|
m.field(F_RAGSOC).enable(yes);
|
|
|
|
|
m.field(F_RICALT).enable(yes);
|
2009-02-26 17:05:13 +00:00
|
|
|
|
m.reset();
|
2009-01-27 16:54:54 +00:00
|
|
|
|
}
|
|
|
|
|
|
2009-03-09 16:45:57 +00:00
|
|
|
|
//INIT_MODIFY_MODE: ridefinizione del metodo init_modify_mode() standard
|
2009-01-27 16:54:54 +00:00
|
|
|
|
void TContratti_app::init_modify_mode(TMask& m)
|
|
|
|
|
{
|
2014-05-14 08:26:49 +00:00
|
|
|
|
//disabilita il campo F_RAGSOC se il campo F_CODCF <20> disabilitato
|
|
|
|
|
const bool yes = m.efield(F_CODCF).enabled();
|
|
|
|
|
m.field(F_RAGSOC).enable(yes);
|
|
|
|
|
m.field(F_RICALT).enable(yes);
|
|
|
|
|
|
2009-03-09 16:45:57 +00:00
|
|
|
|
//setto alcune variabili di interesse
|
2009-01-27 16:54:54 +00:00
|
|
|
|
const TDate oggi(TODAY);
|
2009-09-11 16:35:28 +00:00
|
|
|
|
const int year = oggi.year();
|
|
|
|
|
const long clifo = m.get_long(F_CODCF);
|
|
|
|
|
const int indsp = m.get_int(F_INDSPED);
|
2010-12-02 10:30:14 +00:00
|
|
|
|
const TEsercizi_contabili escon;
|
2009-03-09 16:45:57 +00:00
|
|
|
|
|
|
|
|
|
//instanzio un TLocaisamfile su LF_CLIFOGIAC
|
|
|
|
|
TLocalisamfile magcli(LF_CLIFOGIAC);
|
|
|
|
|
//recupero lo sheet
|
|
|
|
|
TSheet_field& righe = m.sfield(F_RIGHE);
|
2009-01-27 16:54:54 +00:00
|
|
|
|
|
2009-03-09 16:45:57 +00:00
|
|
|
|
//per ogni riga dello sheet aggiorno le dotazioni su LF_CLIFOGIAC
|
|
|
|
|
//per tutti ????, se il record esiste gi<67>
|
2009-01-27 16:54:54 +00:00
|
|
|
|
FOR_EACH_SHEET_ROW(righe,r,row)
|
|
|
|
|
{
|
2009-03-09 16:45:57 +00:00
|
|
|
|
const TString80 codart=row->get(righe.cid2index(S_CODART));
|
|
|
|
|
// righe.disable_cell(r, righe.cid2index(S_CODART));
|
|
|
|
|
// righe.disable_cell(r, righe.cid2index(S_DESCR));
|
|
|
|
|
// righe.disable_cell(r, righe.cid2index(S_UM));
|
2009-01-23 17:03:44 +00:00
|
|
|
|
|
2010-12-02 10:30:14 +00:00
|
|
|
|
for (int y = escon.last() + oggi.month() == 12; y >= year; y--)
|
2009-01-27 16:54:54 +00:00
|
|
|
|
{
|
|
|
|
|
magcli.put(CLIFOGIAC_ANNOES, y);
|
|
|
|
|
magcli.put(CLIFOGIAC_TIPOCF, 'C');
|
|
|
|
|
magcli.put(CLIFOGIAC_CODCF, clifo);
|
|
|
|
|
magcli.put(CLIFOGIAC_INDSPED, indsp);
|
|
|
|
|
magcli.put(CLIFOGIAC_CODART, codart);
|
2009-03-09 16:45:57 +00:00
|
|
|
|
|
|
|
|
|
if (magcli.read() == NOERR)
|
2009-01-27 16:54:54 +00:00
|
|
|
|
{
|
2009-03-09 16:45:57 +00:00
|
|
|
|
row->add(magcli.get(CLIFOGIAC_DOTIN), righe.cid2index(S_DOTIN));
|
|
|
|
|
row->add(magcli.get(CLIFOGIAC_DOTOD), righe.cid2index(S_DOTOD));
|
|
|
|
|
row->add(magcli.get(CLIFOGIAC_DOTTM), righe.cid2index(S_DOTTMP));
|
2009-01-27 16:54:54 +00:00
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2011-01-20 09:40:18 +00:00
|
|
|
|
((TContratti_msk &)m).highlight();
|
2008-12-09 12:43:15 +00:00
|
|
|
|
}
|
|
|
|
|
|
2009-03-09 16:45:57 +00:00
|
|
|
|
//INIT_INSERT_MODE: ridefinizione del metodo init_insert_mode() standard
|
2008-10-21 15:51:13 +00:00
|
|
|
|
void TContratti_app::init_insert_mode(TMask& m)
|
|
|
|
|
{
|
2009-03-09 16:45:57 +00:00
|
|
|
|
//se esiste gi<67> un contratto in essere alla data odierna per questo cliente,
|
|
|
|
|
//contrassegna quello attuale come "PROPOSTA"
|
2009-01-23 17:03:44 +00:00
|
|
|
|
const long codcf = m.get_long(F_CODCF);
|
|
|
|
|
const long indsp = m.get_int(F_INDSPED);
|
|
|
|
|
const TDate oggi(TODAY);
|
|
|
|
|
const long old_contr = lv_find_contract(codcf, indsp, oggi);
|
|
|
|
|
const long cur_contr = m.get_long(F_CODCONT);
|
|
|
|
|
if (old_contr > 0 && old_contr < cur_contr)
|
|
|
|
|
m.set(F_PROPOSTA, "X");
|
2008-10-21 15:51:13 +00:00
|
|
|
|
}
|
|
|
|
|
|
2009-03-09 16:45:57 +00:00
|
|
|
|
//ELIMINA PLANNING: metodo che prepara il recordset sui planning con le righe da eliminare
|
2008-12-10 12:03:36 +00:00
|
|
|
|
bool TContratti_app::elimina_planning(const long& codcont, const long& codcf) const
|
2008-12-10 11:57:25 +00:00
|
|
|
|
{
|
|
|
|
|
//creo il recordset
|
2008-12-10 12:03:36 +00:00
|
|
|
|
TISAM_recordset selrighe("USE LVRCONSPLAN KEY 3\nFROM CODCF=#CODCF CODCONT=#CODCONT \nTO CODCF=#CODCF CODCONT=#CODCONT");
|
2008-12-10 11:57:25 +00:00
|
|
|
|
//setto le variabili
|
|
|
|
|
selrighe.set_var("#CODCF",codcf);
|
|
|
|
|
selrighe.set_var("#CODCONT",codcont);
|
|
|
|
|
|
|
|
|
|
//richiamo la funzione che effettivamente fa la cancellazione delle righe interessate
|
|
|
|
|
kill_planning(selrighe);
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
2009-03-09 16:45:57 +00:00
|
|
|
|
//KILL_PLANNING: metodo che effettivamente fa la cancellazione dei planning interessati
|
2008-12-10 11:57:25 +00:00
|
|
|
|
bool TContratti_app::kill_planning (TISAM_recordset& selrighe) const
|
|
|
|
|
{
|
2009-03-09 16:45:57 +00:00
|
|
|
|
//se effettivamente ci sono delle righe da cancellare, allora le cancello
|
|
|
|
|
const int righe = selrighe.items();
|
2008-12-10 11:57:25 +00:00
|
|
|
|
if (righe > 0)
|
|
|
|
|
{
|
|
|
|
|
TProgind pi(righe, TR("Eliminazione planning in corso..."), true, true);
|
|
|
|
|
TLocalisamfile& rplan = selrighe.cursor()->file();
|
|
|
|
|
for (bool ok = selrighe.move_last(); ok; ok = selrighe.move_prev())
|
|
|
|
|
{
|
|
|
|
|
if (!pi.addstatus(1))
|
|
|
|
|
break;
|
|
|
|
|
rplan.remove();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
2011-01-20 09:40:18 +00:00
|
|
|
|
bool TContratti_app::menu(MENU_TAG mt)
|
|
|
|
|
{
|
|
|
|
|
bool ok = true;
|
|
|
|
|
if (mt == MENU_ITEM_ID(1))
|
|
|
|
|
{
|
|
|
|
|
if (_msk != NULL)
|
|
|
|
|
_msk->sel_color();
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
ok = TRelation_application::menu(mt);
|
|
|
|
|
return ok;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2008-08-21 15:41:07 +00:00
|
|
|
|
int lv0400(int argc, char* argv[])
|
|
|
|
|
{
|
|
|
|
|
TContratti_app app;
|
|
|
|
|
app.run (argc,argv,TR("Gestione contratti"));
|
|
|
|
|
return 0;
|
2011-01-20 09:40:18 +00:00
|
|
|
|
}
|