Patch level : aga 2.0 387
Files correlati : Ricompilazione Demo : [ ] Commento : Riportata la versione AGA 1.7 patch 2386 git-svn-id: svn://10.65.10.50/trunk@10768 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
parent
30ecba4392
commit
0ae61deb48
@ -46,6 +46,7 @@
|
|||||||
#define F_RAGSOC 165
|
#define F_RAGSOC 165
|
||||||
#define F_REGSOSPEXT 166
|
#define F_REGSOSPEXT 166
|
||||||
#define F_STAMPA_PLAFONDS 167
|
#define F_STAMPA_PLAFONDS 167
|
||||||
|
#define F_STAMPA_NUMERI 168
|
||||||
|
|
||||||
#define F_PRINTER 201
|
#define F_PRINTER 201
|
||||||
#define F_CONFIG 202
|
#define F_CONFIG 202
|
||||||
|
@ -158,7 +158,7 @@ END
|
|||||||
|
|
||||||
STRING F_ATTIVITA 5
|
STRING F_ATTIVITA 5
|
||||||
BEGIN
|
BEGIN
|
||||||
PROMPT 1 9 "Codice attivita' "
|
PROMPT 1 8 "Codice attivita' "
|
||||||
FIELD S8
|
FIELD S8
|
||||||
FLAGS "URZ"
|
FLAGS "URZ"
|
||||||
GROUP GRP_VENDITE GRP_ACQUISTI GRP_RIEPIVA
|
GROUP GRP_VENDITE GRP_ACQUISTI GRP_RIEPIVA
|
||||||
@ -176,7 +176,7 @@ END
|
|||||||
|
|
||||||
NUMBER F_CODULC 3
|
NUMBER F_CODULC 3
|
||||||
BEGIN
|
BEGIN
|
||||||
PROMPT 35 9 "Unita' locale "
|
PROMPT 35 8 "Unita' locale "
|
||||||
FLAGS "R"
|
FLAGS "R"
|
||||||
GROUP GRP_VENDITE GRP_ACQUISTI GRP_RIEPIVA GRP_INCASSI GRP_GIORNALE GRP_LSOCIALI GRP_GIORNMAG
|
GROUP GRP_VENDITE GRP_ACQUISTI GRP_RIEPIVA GRP_INCASSI GRP_GIORNALE GRP_LSOCIALI GRP_GIORNMAG
|
||||||
FIELD I7
|
FIELD I7
|
||||||
@ -198,22 +198,26 @@ END
|
|||||||
|
|
||||||
NUMBER F_PAGSTAMP 5
|
NUMBER F_PAGSTAMP 5
|
||||||
BEGIN
|
BEGIN
|
||||||
PROMPT 1 11 "Pagine stampate "
|
PROMPT 1 10 "Pagine stampate "
|
||||||
HELP "Numero di pagine gia' stampate"
|
HELP "Numero di pagine gia' stampate"
|
||||||
FIELD I1
|
FIELD I1
|
||||||
FLAGS "R"
|
|
||||||
GROUP 1
|
GROUP 1
|
||||||
END
|
END
|
||||||
|
|
||||||
NUMBER F_PAGNUM 5
|
NUMBER F_PAGNUM 5
|
||||||
BEGIN
|
BEGIN
|
||||||
PROMPT 35 11 "Pagine numerate "
|
PROMPT 35 10 "Pagine numerate "
|
||||||
HELP "numero di pagine di cui e' stata stampata la numerazione"
|
HELP "numero di pagine di cui e' stata stampata la numerazione"
|
||||||
FIELD I2
|
FIELD I2
|
||||||
FLAGS "R"
|
|
||||||
GROUP 1
|
GROUP 1
|
||||||
END
|
END
|
||||||
|
|
||||||
|
BOOLEAN F_STAMPA_NUMERI
|
||||||
|
BEGIN
|
||||||
|
PROMPT 1 11 "Stampa numeri di pagina durante la stampa del registro"
|
||||||
|
FIELD S11
|
||||||
|
END
|
||||||
|
|
||||||
DATE F_DATAVID
|
DATE F_DATAVID
|
||||||
BEGIN
|
BEGIN
|
||||||
PROMPT 1 13 "Data vidimazione "
|
PROMPT 1 13 "Data vidimazione "
|
||||||
|
@ -110,10 +110,11 @@ TMask* TPrimanota_application::load_mask(int n)
|
|||||||
ism.set_handler(112, fase_handler);
|
ism.set_handler(112, fase_handler);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ism.hide(111); ism.hide(112);
|
for (short id = 111; id <= 114; id++)
|
||||||
is.delete_column(112); is.delete_column(111);
|
{
|
||||||
for (short id = 155; id <= 157; id++)
|
is.delete_column(id);
|
||||||
ism.hide(id); // Descrizioni commessa e fase
|
ism.hide(id); // Descrizioni commessa e fase
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Se esiste lo sheet delle rate
|
// Se esiste lo sheet delle rate
|
||||||
|
@ -940,6 +940,23 @@ HIDDEN void replace_number(TViswin* vsw, long rig, real num, int tab)
|
|||||||
vsw->replace(rig, str, tab);
|
vsw->replace(rig, str, tab);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
real Visliq_app::min_vers(int anno, int month)
|
||||||
|
{
|
||||||
|
TInteressi_IVA_table ver;
|
||||||
|
real min;
|
||||||
|
if (month > 12)
|
||||||
|
{
|
||||||
|
if (ver.read(_year, 12) == NOERR)
|
||||||
|
min = ver.get(I_ANNUALE);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (ver.read(_year, month) == NOERR)
|
||||||
|
min = ver.get(I_PERIODICO);
|
||||||
|
}
|
||||||
|
return min;
|
||||||
|
}
|
||||||
|
|
||||||
void Visliq_app::recalc_liq_data(TViswin* vsw, real& rimb, real& rett, real& vers,
|
void Visliq_app::recalc_liq_data(TViswin* vsw, real& rimb, real& rett, real& vers,
|
||||||
real& acc, real& varimp, real& impnonver, real & credspec,
|
real& acc, real& varimp, real& impnonver, real & credspec,
|
||||||
TString& d1, TString& d2, TString& d3, TDate& date,
|
TString& d1, TString& d2, TString& d3, TDate& date,
|
||||||
@ -1198,7 +1215,7 @@ void Visliq_app::recalc_liq_data(TViswin* vsw, real& rimb, real& rett, real& ver
|
|||||||
if (risul > ZERO)
|
if (risul > ZERO)
|
||||||
{
|
{
|
||||||
ln = "IMPORTO DA ";
|
ln = "IMPORTO DA ";
|
||||||
if (risul < IVA_DA_RIPORTARE && month < 13)
|
if (risul < min_vers(_year, month) && month < 13)
|
||||||
ln << "NON ";
|
ln << "NON ";
|
||||||
ln << "VERSARE ";
|
ln << "VERSARE ";
|
||||||
replace_number(vsw, idv, risul, 75);
|
replace_number(vsw, idv, risul, 75);
|
||||||
@ -1343,7 +1360,8 @@ void Visliq_app::recalc_next_liq(int start_month, TSheet_field* sl, TSheet_field
|
|||||||
risd -= debt;
|
risd -= debt;
|
||||||
|
|
||||||
// aggiunge nuovo credito o debito
|
// aggiunge nuovo credito o debito
|
||||||
if (rstart.sign() < 0 || (rstart.sign() > 0 && rstart < IVA_DA_RIPORTARE))
|
real min = min_vers(_year, i);
|
||||||
|
if (rstart.sign() < 0 || (rstart.sign() > 0 && rstart < min))
|
||||||
risl += rstart;
|
risl += rstart;
|
||||||
|
|
||||||
real newcred(0.0);
|
real newcred(0.0);
|
||||||
@ -1353,7 +1371,7 @@ void Visliq_app::recalc_next_liq(int start_month, TSheet_field* sl, TSheet_field
|
|||||||
newcred = -rstart;
|
newcred = -rstart;
|
||||||
risc -= rstart;
|
risc -= rstart;
|
||||||
}
|
}
|
||||||
if (rstart.sign() > 0 && rstart < IVA_DA_RIPORTARE)
|
if (rstart.sign() > 0 && rstart < min)
|
||||||
{
|
{
|
||||||
newdebt = rstart;
|
newdebt = rstart;
|
||||||
risd += rstart;
|
risd += rstart;
|
||||||
@ -1828,7 +1846,8 @@ void Visliq_app::write_general(TMask& m)
|
|||||||
risd -= debt;
|
risd -= debt;
|
||||||
|
|
||||||
// aggiunge nuovo credito o debito
|
// aggiunge nuovo credito o debito
|
||||||
if (rstart.sign() < 0 || (rstart.sign() > 0 && rstart < IVA_DA_RIPORTARE))
|
real min = min_vers(_year, i);
|
||||||
|
if (rstart.sign() < 0 || (rstart.sign() > 0 && rstart < min))
|
||||||
risl += rstart;
|
risl += rstart;
|
||||||
|
|
||||||
real newcred(0.0);
|
real newcred(0.0);
|
||||||
@ -1838,7 +1857,7 @@ void Visliq_app::write_general(TMask& m)
|
|||||||
newcred = -rstart;
|
newcred = -rstart;
|
||||||
risc -= rstart;
|
risc -= rstart;
|
||||||
}
|
}
|
||||||
if (rstart.sign() > 0 && rstart < IVA_DA_RIPORTARE)
|
if (rstart.sign() > 0 && rstart < min)
|
||||||
{
|
{
|
||||||
newdebt = rstart;
|
newdebt = rstart;
|
||||||
risd += rstart;
|
risd += rstart;
|
||||||
|
@ -4,7 +4,6 @@
|
|||||||
#include <tabutil.h>
|
#include <tabutil.h>
|
||||||
|
|
||||||
// IVA a debito da riportare al mese successivo
|
// IVA a debito da riportare al mese successivo
|
||||||
#define IVA_DA_RIPORTARE real(50000)
|
|
||||||
|
|
||||||
class TSheet_field;
|
class TSheet_field;
|
||||||
class TViswin;
|
class TViswin;
|
||||||
@ -99,6 +98,7 @@ public:
|
|||||||
bool select_butt(TMask& m);
|
bool select_butt(TMask& m);
|
||||||
TTable* del() { return _del; }
|
TTable* del() { return _del; }
|
||||||
|
|
||||||
|
real Visliq_app::min_vers(int anno, int month);
|
||||||
// riaggiusta la liquidazione del mese dato
|
// riaggiusta la liquidazione del mese dato
|
||||||
void recalc_liq_data(TViswin* v, real& rimb, real& rett, real& vers, real& acc,
|
void recalc_liq_data(TViswin* v, real& rimb, real& rett, real& vers, real& acc,
|
||||||
real& varimp, real& impnonver, real& credspec,
|
real& varimp, real& impnonver, real& credspec,
|
||||||
|
@ -798,6 +798,8 @@ bool TDistinta_mask::on_distsheet_event(TOperable_field& o, TField_event e, long
|
|||||||
m.set(F_UMEXPR, qta.um());
|
m.set(F_UMEXPR, qta.um());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (e == fe_modify && rec.get_bool("SOSPESO"))
|
||||||
|
warning_box("Attenzione l'articolo %s e' sospeso.", (const char *) rec.get(ANAMAG_CODART));
|
||||||
break;
|
break;
|
||||||
case LF_DIST :
|
case LF_DIST :
|
||||||
m.set(F_DESCOMP, rec.get("DESCR"));
|
m.set(F_DESCOMP, rec.get("DESCR"));
|
||||||
|
@ -178,6 +178,8 @@ protected:
|
|||||||
//@cmember Gestisce gli eventi delle celle (chiamata dal <mf TSpreadsheet::xiev_handler>)
|
//@cmember Gestisce gli eventi delle celle (chiamata dal <mf TSpreadsheet::xiev_handler>)
|
||||||
virtual bool event_handler(XI_OBJ* itf, XI_EVENT* xiev);
|
virtual bool event_handler(XI_OBJ* itf, XI_EVENT* xiev);
|
||||||
|
|
||||||
|
KEY barcode_newline() const;
|
||||||
|
|
||||||
//@cmember Copia una cella nel corrispondente campo della maschera e ne ritorna il contenuto
|
//@cmember Copia una cella nel corrispondente campo della maschera e ne ritorna il contenuto
|
||||||
const char* copy_cell2field(XI_OBJ* cell = NULL);
|
const char* copy_cell2field(XI_OBJ* cell = NULL);
|
||||||
|
|
||||||
@ -365,6 +367,17 @@ public:
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
KEY TSpreadsheet::barcode_newline() const
|
||||||
|
{
|
||||||
|
static KEY _barcode_newline = 0xFFFF;
|
||||||
|
if (_barcode_newline == 0xFFFF)
|
||||||
|
{
|
||||||
|
TConfig ini(CONFIG_INSTALL, "Main");
|
||||||
|
_barcode_newline = ini.get_int("BarcodeNewline");
|
||||||
|
}
|
||||||
|
return _barcode_newline;
|
||||||
|
}
|
||||||
|
|
||||||
// @doc INTERNAL
|
// @doc INTERNAL
|
||||||
|
|
||||||
// @mfunc Costruttore
|
// @mfunc Costruttore
|
||||||
@ -990,6 +1003,11 @@ bool TSpreadsheet::test_focus_change()
|
|||||||
// Certified 75%
|
// Certified 75%
|
||||||
bool TSpreadsheet::event_handler(XI_OBJ* itf, XI_EVENT *xiev)
|
bool TSpreadsheet::event_handler(XI_OBJ* itf, XI_EVENT *xiev)
|
||||||
{
|
{
|
||||||
|
static KEY _lastab = K_TAB;
|
||||||
|
static char tmp[16];
|
||||||
|
static clock_t digit_timer = 0;
|
||||||
|
|
||||||
|
|
||||||
BOOLEAN& refused = xiev->refused;
|
BOOLEAN& refused = xiev->refused;
|
||||||
|
|
||||||
switch (xiev->type)
|
switch (xiev->type)
|
||||||
@ -1435,7 +1453,20 @@ bool TSpreadsheet::event_handler(XI_OBJ* itf, XI_EVENT *xiev)
|
|||||||
case XIE_CHAR_CELL:
|
case XIE_CHAR_CELL:
|
||||||
if (_edit_field)
|
if (_edit_field)
|
||||||
{
|
{
|
||||||
const KEY k = xiev_to_key(xiev);
|
KEY k = xiev_to_key(xiev);
|
||||||
|
|
||||||
|
if (isalnum(k))
|
||||||
|
digit_timer = clock();
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (k == barcode_newline())
|
||||||
|
{
|
||||||
|
const clock_t delay = clock() - digit_timer;
|
||||||
|
if (delay <= 60)
|
||||||
|
k = K_CTRL+'+';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
switch(k)
|
switch(k)
|
||||||
{
|
{
|
||||||
case K_F2:
|
case K_F2:
|
||||||
|
@ -1314,7 +1314,7 @@ void TCursor::filter(
|
|||||||
_filter = fil;
|
_filter = fil;
|
||||||
if (_fexpr) delete _fexpr;
|
if (_fexpr) delete _fexpr;
|
||||||
_frefs.destroy();
|
_frefs.destroy();
|
||||||
TTypeexp type = (_filter.find('"') != -1) ? _strexpr : _numexpr;
|
TTypeexp type = (_filter.find('"') >= 0) ? _strexpr : _numexpr;
|
||||||
if (_filter.not_empty())
|
if (_filter.not_empty())
|
||||||
{
|
{
|
||||||
_fexpr = new TExpression(_filter, type);
|
_fexpr = new TExpression(_filter, type);
|
||||||
|
@ -39,6 +39,7 @@
|
|||||||
#define F_DESCDEFDEP 146
|
#define F_DESCDEFDEP 146
|
||||||
#define H_DEFAULTMAG 147
|
#define H_DEFAULTMAG 147
|
||||||
#define F_STOP_PROD 148
|
#define F_STOP_PROD 148
|
||||||
|
#define F_MOV_SOSP 149
|
||||||
|
|
||||||
#define G_SGNVAL 20
|
#define G_SGNVAL 20
|
||||||
#define G_SGNQTA 21
|
#define G_SGNQTA 21
|
||||||
|
@ -163,8 +163,8 @@ END
|
|||||||
|
|
||||||
BOOLEAN F_STOP_PROD
|
BOOLEAN F_STOP_PROD
|
||||||
BEGIN
|
BEGIN
|
||||||
PROMPT 50 15 "Scarica gli art.di produzione"
|
PROMPT 50 15 "Scarica gli art.di produzione"
|
||||||
FIELD B4
|
FIELD B4
|
||||||
END
|
END
|
||||||
|
|
||||||
LISTBOX F_COSTO_ESPL 14
|
LISTBOX F_COSTO_ESPL 14
|
||||||
@ -228,6 +228,13 @@ BEGIN
|
|||||||
FLAGS "D"
|
FLAGS "D"
|
||||||
PROMPT 32 19 ""
|
PROMPT 32 19 ""
|
||||||
END
|
END
|
||||||
|
|
||||||
|
BOOLEAN F_MOV_SOSP
|
||||||
|
BEGIN
|
||||||
|
PROMPT 2 20 "Movimenta gli articoli sospesi"
|
||||||
|
FIELD B5
|
||||||
|
END
|
||||||
|
|
||||||
ENDPAGE
|
ENDPAGE
|
||||||
|
|
||||||
PAGE "Movimentazione campi" 11 60 14
|
PAGE "Movimentazione campi" 11 60 14
|
||||||
|
@ -38,7 +38,9 @@ class TMask_movmag : public TMask
|
|||||||
static bool handle_righeprezzo2(TMask_field &f, KEY k); // handler del prezzo delle righe
|
static bool handle_righeprezzo2(TMask_field &f, KEY k); // handler del prezzo delle righe
|
||||||
static bool handle_codcaus(TMask_field &fld, KEY k); // handler della causale
|
static bool handle_codcaus(TMask_field &fld, KEY k); // handler della causale
|
||||||
static bool handle_datacomp(TMask_field &, KEY k); // handler del numero di registrazione
|
static bool handle_datacomp(TMask_field &, KEY k); // handler del numero di registrazione
|
||||||
|
static bool handle_checksosp(TMask_field &fld, KEY k); // handler
|
||||||
static bool handle_codarticolo(TMask_field &fld, KEY k); // handler
|
static bool handle_codarticolo(TMask_field &fld, KEY k); // handler
|
||||||
|
static bool handle_causrig(TMask_field &fld, KEY k); // handler
|
||||||
static bool handle_giacattuale(TMask_field &fld, KEY k); // handler della giacenza attuale
|
static bool handle_giacattuale(TMask_field &fld, KEY k); // handler della giacenza attuale
|
||||||
static bool codgrp_handler(TMask_field &fld, KEY k); // handler del codice gruppo
|
static bool codgrp_handler(TMask_field &fld, KEY k); // handler del codice gruppo
|
||||||
static void sheetrighe_put(TSheet_field &fld_righe, int item);
|
static void sheetrighe_put(TSheet_field &fld_righe, int item);
|
||||||
@ -81,7 +83,7 @@ TMask_movmag::TMask_movmag(TMov_mag * m_m)
|
|||||||
set_handler(F_DATACOMP, handle_datacomp);
|
set_handler(F_DATACOMP, handle_datacomp);
|
||||||
set_handler(F_CODCAUS, handle_codcaus);
|
set_handler(F_CODCAUS, handle_codcaus);
|
||||||
ss.sheet_mask().field(F_QUANT).set_handler(handle_righeprezzo1);
|
ss.sheet_mask().field(F_QUANT).set_handler(handle_righeprezzo1);
|
||||||
ss.sheet_mask().field(F_CAUSRIG).set_handler(handle_righeprezzo1);
|
ss.sheet_mask().field(F_CAUSRIG).set_handler(handle_causrig);
|
||||||
ss.sheet_mask().field(F_CODART).set_handler(handle_codarticolo);
|
ss.sheet_mask().field(F_CODART).set_handler(handle_codarticolo);
|
||||||
ss.sheet_mask().field(F_GIAC).set_handler(handle_giacattuale);
|
ss.sheet_mask().field(F_GIAC).set_handler(handle_giacattuale);
|
||||||
ss.set_notify(notify_righe);
|
ss.set_notify(notify_righe);
|
||||||
@ -311,18 +313,56 @@ TArticolo_giacenza& TMask_movmag::curr_art()
|
|||||||
return *_curr_art;
|
return *_curr_art;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool TMask_movmag::handle_checksosp(TMask_field &f, KEY k)
|
||||||
|
{
|
||||||
|
if (k==K_TAB && f.focusdirty())
|
||||||
|
{
|
||||||
|
TMask_movmag& mov_mask = (TMask_movmag &)f.mask().get_sheet()->mask();
|
||||||
|
TMask & row_mask = f.mask();
|
||||||
|
TString16 caus(row_mask.get(F_CAUSRIG));
|
||||||
|
|
||||||
|
mov_mask.curr_art().read(row_mask.get(F_CODART));
|
||||||
|
|
||||||
|
if (caus.empty())
|
||||||
|
caus = mov_mask.get(F_CODCAUS);
|
||||||
|
|
||||||
|
const TCausale_magazzino c(caus);
|
||||||
|
|
||||||
|
if (!c.movimenta_sospesi() && mov_mask.curr_art().get_bool("SOSPESO"))
|
||||||
|
return error_box("Articolo %s sospeso, quindi non movmentabile", (const char *)f.get());
|
||||||
|
}
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
bool TMask_movmag::handle_codarticolo(TMask_field &f, KEY k)
|
bool TMask_movmag::handle_codarticolo(TMask_field &f, KEY k)
|
||||||
{
|
{
|
||||||
if (k==K_TAB)
|
if (k==K_TAB)
|
||||||
{
|
{
|
||||||
// TMask_movmag& maskmov = (TMask_movmag&)f.mask();
|
|
||||||
TMask_movmag& maskmov = (TMask_movmag &)f.mask().get_sheet()->mask();
|
TMask_movmag& maskmov = (TMask_movmag &)f.mask().get_sheet()->mask();
|
||||||
maskmov.curr_art().read(f.get());
|
maskmov.curr_art().read(f.get());
|
||||||
if (f.focusdirty())
|
if (f.focusdirty())
|
||||||
|
{
|
||||||
|
if (!handle_checksosp(f, k))
|
||||||
|
return FALSE;
|
||||||
handle_righeprezzo2(f, k);
|
handle_righeprezzo2(f, k);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool TMask_movmag::handle_causrig(TMask_field &f, KEY k)
|
||||||
|
{
|
||||||
|
if (k==K_TAB && f.focusdirty())
|
||||||
|
{
|
||||||
|
if (!handle_checksosp(f, k))
|
||||||
|
return FALSE;
|
||||||
|
handle_righeprezzo1(f, k);
|
||||||
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
// proposta hard: propone il prezzo in ogni caso
|
// proposta hard: propone il prezzo in ogni caso
|
||||||
bool TMask_movmag::handle_giacattuale(TMask_field &f, KEY k)
|
bool TMask_movmag::handle_giacattuale(TMask_field &f, KEY k)
|
||||||
{
|
{
|
||||||
|
@ -447,6 +447,8 @@ public:
|
|||||||
bool update_val() const {return !get_bool("B0");}
|
bool update_val() const {return !get_bool("B0");}
|
||||||
bool update_ultcos() const {return get_bool("B2");}
|
bool update_ultcos() const {return get_bool("B2");}
|
||||||
bool esplodente() const {return get_bool("B3");}
|
bool esplodente() const {return get_bool("B3");}
|
||||||
|
bool scarica_artprod() const {return get_bool("B4");}
|
||||||
|
bool movimenta_sospesi() const {return get_bool("B5");}
|
||||||
const TString & default_magdep() const {return get("S10");}
|
const TString & default_magdep() const {return get("S10");}
|
||||||
const char *default_mag() const {return get("S10").mid(0,3);}
|
const char *default_mag() const {return get("S10").mid(0,3);}
|
||||||
const char *default_dep() const {return get("S10").mid(3,2);}
|
const char *default_dep() const {return get("S10").mid(3,2);}
|
||||||
|
@ -1,3 +1,3 @@
|
|||||||
47
|
47
|
||||||
0
|
0
|
||||||
$anamag|0|0|801|0|Anagrafica di magazzino|NART||
|
$anamag|0|0|802|0|Anagrafica di magazzino|NART||
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
47
|
47
|
||||||
69
|
70
|
||||||
CODART|1|20|0|Codice Articolo
|
CODART|1|20|0|Codice Articolo
|
||||||
DESCR|1|50|0|Descrizione
|
DESCR|1|50|0|Descrizione
|
||||||
DESCRAGG|11|10|0|Descrizione aggiuntiva
|
DESCRAGG|11|10|0|Descrizione aggiuntiva
|
||||||
@ -59,6 +59,7 @@ CONTOINDA|1|12|0|Codice piano dei conti industriale (GrCoSo) Acquisti
|
|||||||
CONTOINDV|1|12|0|Codice piano dei conti industriale (GrCoSo) Vendite
|
CONTOINDV|1|12|0|Codice piano dei conti industriale (GrCoSo) Vendite
|
||||||
COLLTYPE|1|1|0|Tipo collegamento DB
|
COLLTYPE|1|1|0|Tipo collegamento DB
|
||||||
CODMAG|1|5|0|Codice magazzino
|
CODMAG|1|5|0|Codice magazzino
|
||||||
|
SOSPESO|8|1|0|Codice sospeso (obsoleto)
|
||||||
USER1|1|40|0|Campo libero 1
|
USER1|1|40|0|Campo libero 1
|
||||||
USER2|1|20|0|Campo libero 2
|
USER2|1|20|0|Campo libero 2
|
||||||
USER3|1|20|0|Campo libero 3
|
USER3|1|20|0|Campo libero 3
|
||||||
|
@ -469,9 +469,14 @@ void TMotore_application::ini2mask(TConfig& ini, TMask& msk, bool query)
|
|||||||
// l'autoload ??
|
// l'autoload ??
|
||||||
f.insert(-1, FALSE);
|
f.insert(-1, FALSE);
|
||||||
// Aggiunge la riga allo sheet
|
// Aggiunge la riga allo sheet
|
||||||
// ((TDocumento_mask &) msk).autoload(f.items()); // Cagata tremenda: non capisco
|
const bool checked = rec.get_bool(RDOC_CHECKED);
|
||||||
|
|
||||||
|
|
||||||
rec.autoload(f);
|
rec.autoload(f);
|
||||||
f.check_row(f.items()-1, 0x2);
|
f.check_row(f.items()-1, 0x2);
|
||||||
|
|
||||||
|
if (!checked) //se non e' checked, il record viene autosalvato (in modo che sia salvato completamente)
|
||||||
|
rec.autosave(f);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
msk.set_mode(oldmode);
|
msk.set_mode(oldmode);
|
||||||
|
@ -162,6 +162,7 @@
|
|||||||
#define F_NUMRIGULC1 301
|
#define F_NUMRIGULC1 301
|
||||||
#define F_NUMREGULC2 302
|
#define F_NUMREGULC2 302
|
||||||
#define F_NUMRIGULC2 303
|
#define F_NUMRIGULC2 303
|
||||||
|
#define F_SOSPESO 304
|
||||||
|
|
||||||
#define G_CODART 1
|
#define G_CODART 1
|
||||||
#define G_DESART 2
|
#define G_DESART 2
|
||||||
|
@ -175,6 +175,12 @@ BEGIN
|
|||||||
FLAG "U"
|
FLAG "U"
|
||||||
END
|
END
|
||||||
|
|
||||||
|
BOOLEAN F_SOSPESO
|
||||||
|
BEGIN
|
||||||
|
PROMPT 45 7 "Sospeso"
|
||||||
|
FIELD SOSPESO
|
||||||
|
END
|
||||||
|
|
||||||
TEXT DLG_NULL
|
TEXT DLG_NULL
|
||||||
BEGIN
|
BEGIN
|
||||||
PROMPT 2 8 "@bCodici corrispondenti"
|
PROMPT 2 8 "@bCodici corrispondenti"
|
||||||
|
@ -15,13 +15,15 @@ class TDeletedoc_app : public TSkeleton_application
|
|||||||
{
|
{
|
||||||
TArchive _arc;
|
TArchive _arc;
|
||||||
TString _desc, _last_std;
|
TString _desc, _last_std;
|
||||||
|
TString16 _num;
|
||||||
|
int _anno;
|
||||||
char _unit;
|
char _unit;
|
||||||
TFilename _tmp_dir;
|
TFilename _tmp_dir;
|
||||||
TIsamtempfile *_tdoc,*_trdoc;
|
TIsamtempfile *_tdoc,*_trdoc;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
void backup_delete_doc(int op, int who); // Backup e cancellazione dei documenti da eliminare
|
void backup_delete_doc(int op, int who, bool pack_rows); // Backup e cancellazione dei documenti da eliminare
|
||||||
void restore_doc(); // Ripristino documenti da disco
|
void restore_doc(); // Ripristino documenti da disco
|
||||||
void create_tmp_files(bool create=TRUE);
|
void create_tmp_files(bool create=TRUE);
|
||||||
void delete_tmp_files(bool remove=TRUE);
|
void delete_tmp_files(bool remove=TRUE);
|
||||||
@ -45,13 +47,14 @@ bool TDeletedoc_app::state_handler(TMask& m, KEY k)
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
void TDeletedoc_app::backup_delete_doc(int op, int who)
|
void TDeletedoc_app::backup_delete_doc(int op, int who, bool pack_rows)
|
||||||
{
|
{
|
||||||
|
|
||||||
TIsamfile doc(LF_DOC);
|
TIsamfile doc(LF_DOC);
|
||||||
TIsamfile rdoc(LF_RIGHEDOC);
|
TIsamfile rdoc(LF_RIGHEDOC);
|
||||||
TIsamfile clifo(LF_CLIFO);
|
TIsamfile clifo(LF_CLIFO);
|
||||||
TIsamfile cfven(LF_CFVEN);
|
TIsamfile cfven(LF_CFVEN);
|
||||||
|
TIsamfile indsp(LF_INDSP);
|
||||||
TIsamfile tab(LF_TAB);
|
TIsamfile tab(LF_TAB);
|
||||||
TIsamfile occas(LF_OCCAS);
|
TIsamfile occas(LF_OCCAS);
|
||||||
TIsamfile movmag(LF_MOVMAG);
|
TIsamfile movmag(LF_MOVMAG);
|
||||||
@ -62,12 +65,14 @@ void TDeletedoc_app::backup_delete_doc(int op, int who)
|
|||||||
rdoc.open();
|
rdoc.open();
|
||||||
clifo.open();
|
clifo.open();
|
||||||
cfven.open();
|
cfven.open();
|
||||||
|
indsp.open();
|
||||||
tab.open();
|
tab.open();
|
||||||
occas.open();
|
occas.open();
|
||||||
movmag.open();
|
movmag.open();
|
||||||
rmovmag.open();
|
rmovmag.open();
|
||||||
|
|
||||||
int err = doc.lock();
|
int err= NOERR;
|
||||||
|
// int err = doc.lock();
|
||||||
if (err != NOERR)
|
if (err != NOERR)
|
||||||
{
|
{
|
||||||
error_box("Il file documenti non puo' essere bloccato in modo esclusivo."
|
error_box("Il file documenti non puo' essere bloccato in modo esclusivo."
|
||||||
@ -80,6 +85,7 @@ void TDeletedoc_app::backup_delete_doc(int op, int who)
|
|||||||
create_tmp_files();
|
create_tmp_files();
|
||||||
|
|
||||||
TString_array to_zap; // Array contenente le chiavi dei documenti da eliminare
|
TString_array to_zap; // Array contenente le chiavi dei documenti da eliminare
|
||||||
|
TString_array to_pack; // Array contenente le chiavi dei documenti da compattare
|
||||||
TRecnotype total = 0;
|
TRecnotype total = 0;
|
||||||
|
|
||||||
doc.zero();
|
doc.zero();
|
||||||
@ -91,6 +97,10 @@ void TDeletedoc_app::backup_delete_doc(int op, int who)
|
|||||||
scanerr = doc.next())
|
scanerr = doc.next())
|
||||||
{
|
{
|
||||||
p.addstatus(1);
|
p.addstatus(1);
|
||||||
|
if (_anno != 0 && _anno != doc.get_int(DOC_ANNO))
|
||||||
|
continue;
|
||||||
|
if (_num.not_empty() && _num != doc.get(DOC_CODNUM))
|
||||||
|
continue;
|
||||||
documento.read(doc.curr());
|
documento.read(doc.curr());
|
||||||
|
|
||||||
bool to_delete = FALSE;
|
bool to_delete = FALSE;
|
||||||
@ -106,6 +116,24 @@ void TDeletedoc_app::backup_delete_doc(int op, int who)
|
|||||||
to_delete = TRUE;
|
to_delete = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (pack_rows && !to_delete && documento.tipo().is_ordine())
|
||||||
|
{
|
||||||
|
const int rows = documento.physical_rows();
|
||||||
|
for (int x = 1; x <= rows; x++)
|
||||||
|
{
|
||||||
|
if (documento[x].is_evasa());
|
||||||
|
{
|
||||||
|
TToken_string id(30);
|
||||||
|
id = doc.get(DOC_PROVV);
|
||||||
|
id.add(doc.get(DOC_ANNO));
|
||||||
|
id.add(doc.get(DOC_CODNUM));
|
||||||
|
id.add(doc.get(DOC_NDOC));
|
||||||
|
to_pack.add(id);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (to_delete) // Se TRUE il puo' essere eliminato!
|
if (to_delete) // Se TRUE il puo' essere eliminato!
|
||||||
{ // Memorizza la chiave 1 del documento in un array
|
{ // Memorizza la chiave 1 del documento in un array
|
||||||
if (op & 0x1)
|
if (op & 0x1)
|
||||||
@ -159,18 +187,40 @@ void TDeletedoc_app::backup_delete_doc(int op, int who)
|
|||||||
caption.add_plural(total, "documento");
|
caption.add_plural(total, "documento");
|
||||||
if (yesno_box(caption))
|
if (yesno_box(caption))
|
||||||
{
|
{
|
||||||
TProgind pi(total, caption, FALSE, TRUE, 10);
|
|
||||||
for (int i = 0; i < to_zap.items(); i++)
|
|
||||||
{
|
{
|
||||||
TToken_string& id = to_zap.row(i);
|
TProgind pi(total, caption, FALSE, TRUE, 10);
|
||||||
id.restart();
|
for (int i = 0; i < to_zap.items(); i++)
|
||||||
const char provv = id.get_char();
|
{
|
||||||
const int anno = id.get_int();
|
TToken_string& id = to_zap.row(i);
|
||||||
const TString16 codnum = id.get();
|
id.restart();
|
||||||
const long numdoc = id.get_int();
|
const char provv = id.get_char();
|
||||||
documento.read(provv,anno,codnum,numdoc);
|
const int anno = id.get_int();
|
||||||
documento.TMultiple_rectype::remove(doc);
|
const TString16 codnum = id.get();
|
||||||
pi.addstatus(1);
|
const long numdoc = id.get_int();
|
||||||
|
documento.read(provv,anno,codnum,numdoc);
|
||||||
|
documento.TMultiple_rectype::remove(doc);
|
||||||
|
pi.addstatus(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
{
|
||||||
|
TProgind pi1(to_pack.items(), "Compattamento documenti", FALSE, TRUE, 10);
|
||||||
|
for (int i = 0; i < to_pack.items(); i++)
|
||||||
|
{
|
||||||
|
TToken_string& id = to_pack.row(i);
|
||||||
|
id.restart();
|
||||||
|
const char provv = id.get_char();
|
||||||
|
const int anno = id.get_int();
|
||||||
|
const TString16 codnum = id.get();
|
||||||
|
const long numdoc = id.get_int();
|
||||||
|
documento.read(provv,anno,codnum,numdoc);
|
||||||
|
const int rows = documento.physical_rows();
|
||||||
|
// Memorizza le righe del documento sui file temporanei
|
||||||
|
for (int x = rows; x >= 1; x--)
|
||||||
|
if (documento[x].is_evasa())
|
||||||
|
documento.destroy_row(x, TRUE);
|
||||||
|
documento.rewrite(doc);
|
||||||
|
pi1.addstatus(1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -289,11 +339,14 @@ void TDeletedoc_app::main_loop()
|
|||||||
_desc = m.get(F_DESC);
|
_desc = m.get(F_DESC);
|
||||||
const int scelta = m.get_int(F_OPERAZIONE);
|
const int scelta = m.get_int(F_OPERAZIONE);
|
||||||
const int cosa = m.get_int(F_DOCUMENTI);
|
const int cosa = m.get_int(F_DOCUMENTI);
|
||||||
|
const bool pack_rows = m.get_bool(F_COMPATTA);
|
||||||
|
_anno = m.get_int(F_ANNO);
|
||||||
|
_num = m.get(F_CODNUM);
|
||||||
switch (scelta)
|
switch (scelta)
|
||||||
{
|
{
|
||||||
case 1 : backup_delete_doc(0x1, cosa); break;
|
case 1 : backup_delete_doc(0x1, cosa, pack_rows); break;
|
||||||
case 2 : backup_delete_doc(0x2, cosa); break;
|
case 2 : backup_delete_doc(0x2, cosa, pack_rows); break;
|
||||||
case 3 : backup_delete_doc(0x3, cosa); break;
|
case 3 : backup_delete_doc(0x3, cosa, pack_rows); break;
|
||||||
default: restore_doc(); break;
|
default: restore_doc(); break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4,4 +4,8 @@
|
|||||||
#define F_STADESC 104
|
#define F_STADESC 104
|
||||||
#define F_OPERAZIONE 105
|
#define F_OPERAZIONE 105
|
||||||
#define F_DOCUMENTI 106
|
#define F_DOCUMENTI 106
|
||||||
|
#define F_COMPATTA 107
|
||||||
|
#define F_ANNO 108
|
||||||
|
#define F_CODNUM 109
|
||||||
|
#define F_DESNUM 110
|
||||||
|
|
||||||
|
@ -1,26 +1,29 @@
|
|||||||
#include "ve5100a.h"
|
#include "ve5100a.h"
|
||||||
|
|
||||||
PAGE "Eliminazione/Archiviazione documenti" -1 -1 61 11
|
PAGE "Eliminazione/Archiviazione documenti" -1 -1 61 15
|
||||||
|
|
||||||
RADIOBUTTON F_OPERAZIONE 1 34
|
RADIOBUTTON F_OPERAZIONE 1 34
|
||||||
BEGIN
|
BEGIN
|
||||||
PROMPT 1 1 "Operazione"
|
PROMPT 1 1 "Operazione"
|
||||||
ITEM "1|Eliminazione"
|
ITEM "1|Eliminazione"
|
||||||
MESSAGE DISABLE,F_DESC|DISABLE,F_UNIT
|
MESSAGE DISABLE,F_DESC|DISABLE,F_UNIT|ENABLE,F_ANNO|ENABLE,F_CODNUM
|
||||||
ITEM "2|Archiviazione"
|
ITEM "2|Archiviazione"
|
||||||
MESSAGE ENABLE,F_DESC|ENABLE,F_UNIT
|
MESSAGE ENABLE,F_DESC|ENABLE,F_UNIT|ENABLE,F_ANNO|ENABLE,F_CODNUM
|
||||||
ITEM "3|Eliminazione e archiviazione"
|
ITEM "3|Eliminazione e archiviazione"
|
||||||
MESSAGE ENABLE,F_DESC|ENABLE,F_UNIT
|
MESSAGE ENABLE,F_DESC|ENABLE,F_UNIT|ENABLE,F_ANNO|ENABLE,F_CODNUM
|
||||||
ITEM "4|Ripristino"
|
ITEM "4|Ripristino"
|
||||||
MESSAGE DISABLE,F_DESC|ENABLE,F_UNIT
|
MESSAGE DISABLE,F_DESC|ENABLE,F_UNIT|CLEAR,F_ANNO|CLEAR,F_CODNUM
|
||||||
END
|
END
|
||||||
|
|
||||||
RADIOBUTTON F_DOCUMENTI 1 24
|
RADIOBUTTON F_DOCUMENTI 1 24
|
||||||
BEGIN
|
BEGIN
|
||||||
PROMPT 36 1 "Documenti"
|
PROMPT 36 1 "Documenti"
|
||||||
ITEM "1|Eliminabili"
|
ITEM "1|Eliminabili"
|
||||||
|
MESSAGE CLEAR,F_COMPATTA
|
||||||
ITEM "2|Evasi"
|
ITEM "2|Evasi"
|
||||||
|
MESSAGE ENABLE,F_COMPATTA
|
||||||
ITEM "3|Entrambi"
|
ITEM "3|Entrambi"
|
||||||
|
MESSAGE ENABLE,F_COMPATTA
|
||||||
END
|
END
|
||||||
|
|
||||||
LIST F_UNIT 2
|
LIST F_UNIT 2
|
||||||
@ -55,6 +58,46 @@ BEGIN
|
|||||||
FLAGS "D"
|
FLAGS "D"
|
||||||
END
|
END
|
||||||
|
|
||||||
|
BOOELAN F_COMPATTA
|
||||||
|
BEGIN
|
||||||
|
PROMPT 2 9 "Elimina la righe evase"
|
||||||
|
END
|
||||||
|
|
||||||
|
NUMBER F_ANNO 4
|
||||||
|
BEGIN
|
||||||
|
PROMPT 2 10 "Esercizio "
|
||||||
|
FIELD ANNO
|
||||||
|
WARNING "Inserire un anno valido"
|
||||||
|
END
|
||||||
|
|
||||||
|
STRING F_CODNUM 4
|
||||||
|
BEGIN
|
||||||
|
PROMPT 2 11 "Numerazione "
|
||||||
|
FIELD CODNUM
|
||||||
|
HELP "Codice numerazione"
|
||||||
|
USE %NUM
|
||||||
|
INPUT CODTAB F_CODNUM
|
||||||
|
DISPLAY "Codice" CODTAB
|
||||||
|
DISPLAY "Descrizione@50" S0
|
||||||
|
OUTPUT F_CODNUM CODTAB
|
||||||
|
OUTPUT F_DESNUM S0
|
||||||
|
CHECKTYPE NORMAL
|
||||||
|
FLAG "U"
|
||||||
|
WARNING "Numerazione assente"
|
||||||
|
END
|
||||||
|
|
||||||
|
STRING F_DESNUM 50 42
|
||||||
|
BEGIN
|
||||||
|
PROMPT 15 12 ""
|
||||||
|
HELP "Descrizione numerazione"
|
||||||
|
USE %NUM KEY 2
|
||||||
|
INPUT S0 F_DESNUM
|
||||||
|
DISPLAY "Descrizione@50" S0
|
||||||
|
DISPLAY "Codice" CODTAB
|
||||||
|
COPY OUTPUT F_CODNUM
|
||||||
|
END
|
||||||
|
|
||||||
|
|
||||||
BUTTON DLG_OK 10 2
|
BUTTON DLG_OK 10 2
|
||||||
BEGIN
|
BEGIN
|
||||||
PROMPT -12 -1 ""
|
PROMPT -12 -1 ""
|
||||||
|
@ -246,7 +246,7 @@ bool TContabilizzazione_app::create()
|
|||||||
{
|
{
|
||||||
TApplication::create();
|
TApplication::create();
|
||||||
open_files(LF_TABCOM, LF_TAB, LF_CLIFO, LF_OCCAS, LF_INDSP, LF_CFVEN,
|
open_files(LF_TABCOM, LF_TAB, LF_CLIFO, LF_OCCAS, LF_INDSP, LF_CFVEN,
|
||||||
LF_DOC, LF_RIGHEDOC, LF_ANAMAG, LF_MOVMAG, LF_RMOVMAG, LF_PROVV,
|
LF_DOC, LF_RIGHEDOC, LF_ANAMAG, LF_MOVMAG, LF_RMOVMAG, LF_PROVV, LF_MOV,
|
||||||
LF_PCON, LF_CONDV, LF_SVRIEP, LF_AGENTI, LF_PERCPROV, LF_ATTIV, LF_CAUSALI, 0);
|
LF_PCON, LF_CONDV, LF_SVRIEP, LF_AGENTI, LF_PERCPROV, LF_ATTIV, LF_CAUSALI, 0);
|
||||||
_msk = new TMask("ve6100a");
|
_msk = new TMask("ve6100a");
|
||||||
_msk->set_handler(F_CODICE_ELAB,handle_cod_eld);
|
_msk->set_handler(F_CODICE_ELAB,handle_cod_eld);
|
||||||
|
@ -75,12 +75,13 @@ public:
|
|||||||
TImporto TMovimentoPN_VE::real2imp(const real& r, char row_type)
|
TImporto TMovimentoPN_VE::real2imp(const real& r, char row_type)
|
||||||
{
|
{
|
||||||
CHECK(_caus,"Orgggssbb..._caus pointer is NULL!");
|
CHECK(_caus,"Orgggssbb..._caus pointer is NULL!");
|
||||||
bool dare;
|
bool dare = FALSE;
|
||||||
if (row_type == 'S')
|
if (row_type == 'S')
|
||||||
{
|
{
|
||||||
dare = _caus->sezione_ritsoc() == 'D';
|
dare = _caus->sezione_ritsoc() == 'D';
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
if (row_type == 'F')
|
if (row_type == 'F')
|
||||||
{
|
{
|
||||||
dare = _caus->sezione_ritsoc() == 'D';
|
dare = _caus->sezione_ritsoc() == 'D';
|
||||||
@ -91,7 +92,7 @@ TImporto TMovimentoPN_VE::real2imp(const real& r, char row_type)
|
|||||||
if (row_type != 'T' && row_type != 'F')
|
if (row_type != 'T' && row_type != 'F')
|
||||||
dare = !dare;
|
dare = !dare;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
TImporto importo(dare ? 'D' : 'A', r);
|
TImporto importo(dare ? 'D' : 'A', r);
|
||||||
return importo;
|
return importo;
|
||||||
}
|
}
|
||||||
@ -558,11 +559,12 @@ error_type TIVA_array::add_omaggi(const TRiga_documento & r, const TBill& conto,
|
|||||||
add(r, conto, ndec, p);
|
add(r, conto, ndec, p);
|
||||||
TRiga_documento r_storno(r);
|
TRiga_documento r_storno(r);
|
||||||
|
|
||||||
|
r_storno.set_tipo("01");
|
||||||
r_storno.put(RDOC_CODIVA, _ivasto);
|
r_storno.put(RDOC_CODIVA, _ivasto);
|
||||||
real prezzo = r_storno.get(RDOC_PREZZO);
|
real prezzo = r_storno.get(RDOC_PREZZO);
|
||||||
prezzo = -prezzo;
|
prezzo = -prezzo;
|
||||||
r_storno.put(RDOC_PREZZO, prezzo);
|
r_storno.put(RDOC_PREZZO, prezzo);
|
||||||
add(r, conto, ndec, p);
|
add(r_storno, conto, ndec, p);
|
||||||
return no_error;
|
return no_error;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1890,13 +1892,20 @@ error_type TContabilizzazione::compile_rows_mov(TDocumento& doc)
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
r.put(RDOC_CODIVA, codiva1);
|
r.put(RDOC_CODIVA, codiva1);
|
||||||
_righe_iva->add(r, conto, ALL_DECIMALS, perc);
|
if (riga_omaggio)
|
||||||
|
_righe_iva->add_omaggi(r, conto, ALL_DECIMALS, perc);
|
||||||
|
else
|
||||||
|
_righe_iva->add(r, conto, ALL_DECIMALS, perc);
|
||||||
|
|
||||||
}
|
}
|
||||||
r.put(RDOC_CODIVA, codiva2); //Restore
|
r.put(RDOC_CODIVA, codiva2); //Restore
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
_righe_iva->add(r, conto);
|
if (riga_omaggio)
|
||||||
|
_righe_iva->add_omaggi(r, conto);
|
||||||
|
else
|
||||||
|
_righe_iva->add(r, conto);
|
||||||
const TString16 cod(r.get(RDOC_CODIVA));
|
const TString16 cod(r.get(RDOC_CODIVA));
|
||||||
|
|
||||||
if (r.doc().tipo().calcolo_lordo()) // Si ricorda che calcolo_lordo() e fattura_commerciale() sono esclusivi.
|
if (r.doc().tipo().calcolo_lordo()) // Si ricorda che calcolo_lordo() e fattura_commerciale() sono esclusivi.
|
||||||
@ -2869,12 +2878,20 @@ error_type TContabilizzazione::write_intra(TDocumento& doc)
|
|||||||
paeseorig = !is_cessione ? rec_anamag.get(ANAMAG_PAESE) : EMPTY_STRING; // Campo solo per Acquisti
|
paeseorig = !is_cessione ? rec_anamag.get(ANAMAG_PAESE) : EMPTY_STRING; // Campo solo per Acquisti
|
||||||
provincia = is_cessione ? rec_anamag.get(ANAMAG_PROV) : cchh.get(LF_COMUNI, commag, COM_PROVCOM);
|
provincia = is_cessione ? rec_anamag.get(ANAMAG_PROV) : cchh.get(LF_COMUNI, commag, COM_PROVCOM);
|
||||||
|
|
||||||
if (nomenclatura.blank() || unsuppun.is_zero() || massanun.is_zero())
|
if (nomenclatura.blank() || unsuppun.is_zero() || massanun.is_zero() || provincia.blank())
|
||||||
{
|
{
|
||||||
TString msg;
|
TString msg;
|
||||||
msg << "--- L'articolo " << rec_anamag.get(ANAMAG_CODART) << " non riporta tutti i dati necessari per il movimento intracomunitario:";
|
msg << "--- L'articolo " << rec_anamag.get(ANAMAG_CODART) << " non riporta tutti i dati necessari per il movimento intracomunitario.";
|
||||||
|
_viswin->add_line(msg);
|
||||||
|
msg = " Si consiglia di verificare i seguenti valori sull'anagrafica:";
|
||||||
|
_viswin->add_line(msg);
|
||||||
|
msg = " ";
|
||||||
|
if (nomenclatura.blank()) msg << "nomenclatura combinata; ";
|
||||||
|
if (unsuppun.is_zero()) msg << "unità di misura supplementare; ";
|
||||||
|
if (massanun.is_zero()) msg << "massa netta unitaria; ";
|
||||||
|
if (provincia.blank()) msg << "provincia d'origine; ";
|
||||||
|
msg.rtrim(2); msg << '.'; // Sostituisce l'ultimo punto e virgola con un punto
|
||||||
_viswin->add_line(msg);
|
_viswin->add_line(msg);
|
||||||
_viswin->add_line(" Verificare i seguenti valori: nomenclatura combinata, unità di misura supplementare, massa netta unitaria.");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
key.cut(0);
|
key.cut(0);
|
||||||
@ -3118,7 +3135,7 @@ void TContabilizzazione::display_error(TDocumento& doc)
|
|||||||
"Verificare la consistenza dei files relativi ai movimenti intracomunitari.",(const char*)numerazione,numero);
|
"Verificare la consistenza dei files relativi ai movimenti intracomunitari.",(const char*)numerazione,numero);
|
||||||
break;
|
break;
|
||||||
case cont_seq_error:
|
case cont_seq_error:
|
||||||
msg.format("Il documento precedente al %s/%ld non e' stato contabilizzato.\n"
|
msg.format("Il documento precedente al %s/%ld non e' stato contabilizzato."
|
||||||
"E' necessario contabilizzare tutti i documenti in sequenza.",
|
"E' necessario contabilizzare tutti i documenti in sequenza.",
|
||||||
(const char*)numerazione, numero);
|
(const char*)numerazione, numero);
|
||||||
break;
|
break;
|
||||||
@ -3347,7 +3364,9 @@ bool TContabilizzazione::elabora(TLista_documenti& doc_in, TLista_documenti& /*
|
|||||||
else
|
else
|
||||||
message_box("Contabilizzazione terminata");
|
message_box("Contabilizzazione terminata");
|
||||||
}
|
}
|
||||||
_viswin->run();
|
KEY k = _viswin->run();
|
||||||
|
if (k == K_CTRL+'S') // Ho premuto Stampa
|
||||||
|
printer().print_txt(_viswin->text());
|
||||||
delete _viswin; _viswin = NULL;
|
delete _viswin; _viswin = NULL;
|
||||||
|
|
||||||
return _can_write; // Se non ha riscontrato errori per nessun documento, _can_write = TRUE
|
return _can_write; // Se non ha riscontrato errori per nessun documento, _can_write = TRUE
|
||||||
|
@ -1621,6 +1621,7 @@ bool TElabora_mask::on_field_event(TOperable_field& o, TField_event e, long joll
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case F_ELAB:
|
case F_ELAB:
|
||||||
|
case F_ANNO_ELAB:
|
||||||
if (e == fe_modify)
|
if (e == fe_modify)
|
||||||
update_ndoc_filter(TRUE);
|
update_ndoc_filter(TRUE);
|
||||||
break;
|
break;
|
||||||
@ -1660,6 +1661,7 @@ bool TElabora_mask::on_field_event(TOperable_field& o, TField_event e, long joll
|
|||||||
{
|
{
|
||||||
const TRectype& head = _tree.testata();
|
const TRectype& head = _tree.testata();
|
||||||
set(F_DATADOC_ELAB, head.get(DOC_DATADOC)); // Anch'essa nella chiave 2!
|
set(F_DATADOC_ELAB, head.get(DOC_DATADOC)); // Anch'essa nella chiave 2!
|
||||||
|
set(F_ANNO_ELAB, head.get(DOC_ANNO));
|
||||||
set(F_CODNUM_ELAB, head.get(DOC_CODNUM));
|
set(F_CODNUM_ELAB, head.get(DOC_CODNUM));
|
||||||
field(F_CODNUM_ELAB).check();
|
field(F_CODNUM_ELAB).check();
|
||||||
set(F_NDOC_ELAB, head.get(DOC_NDOC));
|
set(F_NDOC_ELAB, head.get(DOC_NDOC));
|
||||||
@ -1840,6 +1842,13 @@ bool TElabora_mask::elabora()
|
|||||||
|
|
||||||
delete newdoc;
|
delete newdoc;
|
||||||
|
|
||||||
|
// Azzera l'anno in caso di ordini
|
||||||
|
if (in.items() > 0 && in[0].is_ordine())
|
||||||
|
{
|
||||||
|
reset(F_ANNO_ELAB);
|
||||||
|
update_mask = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
if (update_mask)
|
if (update_mask)
|
||||||
update_ndoc_filter();
|
update_ndoc_filter();
|
||||||
|
|
||||||
@ -1958,6 +1967,11 @@ void TElabora_mask::update_ndoc_filter(bool is_tipo_elaborazione)
|
|||||||
TString8 si; si << stato_in;
|
TString8 si; si << stato_in;
|
||||||
set(F_STATODOC_ELAB, si);
|
set(F_STATODOC_ELAB, si);
|
||||||
field(F_STATODOC_ELAB).check();
|
field(F_STATODOC_ELAB).check();
|
||||||
|
|
||||||
|
// Azzero anno di elaaborazione quando ho a che fare con degli ordini
|
||||||
|
const TTipo_documento& tipodocin = _main->doc().tipo(tipo_in);
|
||||||
|
if (tipodocin.is_ordine())
|
||||||
|
reset(F_ANNO_ELAB);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (almost_one)
|
if (almost_one)
|
||||||
@ -1993,12 +2007,18 @@ void TElabora_mask::update_ndoc_filter(bool is_tipo_elaborazione)
|
|||||||
field(F_TIPODOC_ELAB).check();
|
field(F_TIPODOC_ELAB).check();
|
||||||
set(F_STATODOC_ELAB, stato_in);
|
set(F_STATODOC_ELAB, stato_in);
|
||||||
field(F_STATODOC_ELAB).check();
|
field(F_STATODOC_ELAB).check();
|
||||||
|
|
||||||
|
// Azzero anno di elaaborazione quando ho a che fare con degli ordini
|
||||||
|
const TTipo_documento& tipodocin = _main->doc().tipo(tipo_in);
|
||||||
|
if (tipodocin.is_ordine())
|
||||||
|
reset(F_ANNO_ELAB);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (almost_one)
|
if (almost_one)
|
||||||
filter << ')';
|
filter << ')';
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -2322,14 +2342,50 @@ bool TDocumento_mask::codcamp_handler( TMask_field& f, KEY key )
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
bool TDocumento_mask::controeuro_handler( TMask_field& f, KEY key )
|
||||||
|
{
|
||||||
|
TMask & m = f.mask();
|
||||||
|
|
||||||
|
if (m.is_running() && key == K_SPACE)
|
||||||
|
{
|
||||||
|
const real cambio_euro = TCurrency::get_euro_change();
|
||||||
|
const real val = cambio_euro / m.get_real(F_CAMBIO);
|
||||||
|
|
||||||
|
m.set(F_CAMBIO, val);
|
||||||
|
}
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
bool TDocumento_mask::codval_handler( TMask_field& f, KEY key )
|
bool TDocumento_mask::codval_handler( TMask_field& f, KEY key )
|
||||||
|
|
||||||
{
|
{
|
||||||
if (key == K_TAB && f.focusdirty())
|
if (key == K_TAB && f.focusdirty())
|
||||||
{
|
{
|
||||||
TSheet_field& righe = f.mask().sfield(F_SHEET);
|
TMask& m = f.mask();
|
||||||
|
|
||||||
|
// Cerco un cambio per la data specificata, se non lo trovo lo invento
|
||||||
|
TDate datacam = m.get(F_DATACAMBIO);
|
||||||
|
if (!datacam.ok())
|
||||||
|
{
|
||||||
|
datacam = m.get_date(F_DATADOC);
|
||||||
|
m.set(F_DATACAMBIO, datacam);
|
||||||
|
}
|
||||||
|
TExchange exc(f.get());
|
||||||
|
exchange_type et;
|
||||||
|
real cambio = exc.get_change(et); // Determino il cambio standard ed il "Contro-Euro"
|
||||||
|
TString16 key;
|
||||||
|
key.format("%-3s", (const char*)f.get()); key << datacam.string(ANSI);
|
||||||
|
const real giornaliero = cache().get("CAM", key, "S4");
|
||||||
|
if (!giornaliero.is_zero())
|
||||||
|
cambio = giornaliero; // Ho trovato un cambio per il giorno!
|
||||||
|
m.set(F_CAMBIO, cambio);
|
||||||
|
m.set(F_CONTROEURO, et == _exchange_contro ? "X" : "");
|
||||||
|
|
||||||
|
TSheet_field& righe = m.sfield(F_SHEET);
|
||||||
righe.force_update();
|
righe.force_update();
|
||||||
}
|
}
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -372,7 +372,6 @@ bool codmag_handler( TMask_field& f, KEY key )
|
|||||||
|
|
||||||
bool codmag_coll_handler( TMask_field& f, KEY key )
|
bool codmag_coll_handler( TMask_field& f, KEY key )
|
||||||
{
|
{
|
||||||
// if (f.to_check(key, TRUE))
|
|
||||||
if (key == K_TAB && f.focusdirty())
|
if (key == K_TAB && f.focusdirty())
|
||||||
{
|
{
|
||||||
TMask& row_mask = f.mask();
|
TMask& row_mask = f.mask();
|
||||||
@ -428,7 +427,6 @@ void upd_colli_peso_tara(TMask & m, TRectype & a)
|
|||||||
|
|
||||||
bool pricerange_handler(TMask_field& f, KEY key )
|
bool pricerange_handler(TMask_field& f, KEY key )
|
||||||
{
|
{
|
||||||
|
|
||||||
if (key == K_TAB && f.focusdirty())
|
if (key == K_TAB && f.focusdirty())
|
||||||
{
|
{
|
||||||
TMask& row_mask = f.mask();
|
TMask& row_mask = f.mask();
|
||||||
@ -496,14 +494,9 @@ bool codart_handler(TMask_field& f, KEY key )
|
|||||||
condv.set_testa(&mask);
|
condv.set_testa(&mask);
|
||||||
condv.set_riga(&row_mask);
|
condv.set_riga(&row_mask);
|
||||||
|
|
||||||
// TLocalisamfile & anamag = ((TEdit_field &) f).browse()->cursor()->file();
|
|
||||||
// TLocalisamfile & umart = ((TEdit_field &) row_mask.field(FR_UMQTA)).browse()->cursor()->file();
|
|
||||||
TLocalisamfile anamag(LF_ANAMAG);
|
TLocalisamfile anamag(LF_ANAMAG);
|
||||||
TLocalisamfile umart(LF_UMART);
|
TLocalisamfile umart(LF_UMART);
|
||||||
|
|
||||||
// condv.set_anamag(anamag);
|
|
||||||
// condv.set_umart(umart);
|
|
||||||
|
|
||||||
TString80 codart(f.get());
|
TString80 codart(f.get());
|
||||||
anamag.setkey(1);
|
anamag.setkey(1);
|
||||||
anamag.put(ANAMAG_CODART, codart);
|
anamag.put(ANAMAG_CODART, codart);
|
||||||
@ -603,6 +596,28 @@ bool codart_handler(TMask_field& f, KEY key )
|
|||||||
|
|
||||||
if (pos >= 0)
|
if (pos >= 0)
|
||||||
iva_handler(row_mask.fld(pos), 0);
|
iva_handler(row_mask.fld(pos), 0);
|
||||||
|
|
||||||
|
if (found)
|
||||||
|
{
|
||||||
|
TString16 caus(row_mask.get(FR_CAUS));
|
||||||
|
|
||||||
|
if (caus.empty())
|
||||||
|
caus = mask.get(F_CAUSMAG);
|
||||||
|
|
||||||
|
if (caus.not_empty())
|
||||||
|
{
|
||||||
|
const TCausale_magazzino c(caus);
|
||||||
|
|
||||||
|
if (!c.movimenta_sospesi())
|
||||||
|
{
|
||||||
|
const TRectype & rec = cache().get(LF_ANAMAG, row_mask.get(FR_CODARTMAG));
|
||||||
|
|
||||||
|
if (rec.get_bool("SOSPESO"))
|
||||||
|
return error_box("Articolo %s sospeso, quindi non movmentabile", (const char *)codart);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
if (key == K_F8 && !sh.sheet_mask().is_running())
|
if (key == K_F8 && !sh.sheet_mask().is_running())
|
||||||
@ -629,12 +644,6 @@ bool codart_handler(TMask_field& f, KEY key )
|
|||||||
}
|
}
|
||||||
if (explode_db && !sh.sheet_mask().is_running())
|
if (explode_db && !sh.sheet_mask().is_running())
|
||||||
{
|
{
|
||||||
// TCodice_articolo a(f.get());
|
|
||||||
// const TCodice_um um = row_mask.get(FR_UMQTA);
|
|
||||||
// real qta_fin = row_mask.get_real(FR_QTA);
|
|
||||||
// TQuantita qta(a, um, qta_fin);
|
|
||||||
// qta.convert2umbase();
|
|
||||||
// qta_fin = qta.val();
|
|
||||||
TDocumento & doc = mask.doc();
|
TDocumento & doc = mask.doc();
|
||||||
TRiga_documento & curr_row = doc[current_doc_row];
|
TRiga_documento & curr_row = doc[current_doc_row];
|
||||||
|
|
||||||
@ -699,6 +708,8 @@ bool codart_handler(TMask_field& f, KEY key )
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -706,6 +717,9 @@ bool codartmag_handler( TMask_field& f, KEY key )
|
|||||||
{
|
{
|
||||||
bool to_check = key == K_TAB && f.focusdirty();
|
bool to_check = key == K_TAB && f.focusdirty();
|
||||||
TMask & m = f.mask();
|
TMask & m = f.mask();
|
||||||
|
const TString codart = f.get();
|
||||||
|
const bool artmag = codart.not_empty();
|
||||||
|
TDocumento_mask& mask= (TDocumento_mask&) m.get_sheet()->mask();
|
||||||
|
|
||||||
if (!to_check)
|
if (!to_check)
|
||||||
{
|
{
|
||||||
@ -715,12 +729,10 @@ bool codartmag_handler( TMask_field& f, KEY key )
|
|||||||
}
|
}
|
||||||
if (to_check)
|
if (to_check)
|
||||||
{
|
{
|
||||||
const bool artmag = f.get().not_empty();
|
|
||||||
|
|
||||||
m.show(FR_UMQTA, artmag);
|
m.show(FR_UMQTA, artmag);
|
||||||
m.show(FR_UMQTA2, !artmag);
|
m.show(FR_UMQTA2, !artmag);
|
||||||
|
|
||||||
TDocumento_mask& mask=(TDocumento_mask&)m.get_sheet()->mask();
|
|
||||||
mask.update_giacenza();
|
mask.update_giacenza();
|
||||||
}
|
}
|
||||||
return TRUE;
|
return TRUE;
|
||||||
@ -1147,6 +1159,13 @@ bool causmag_handler( TMask_field& f, KEY key )
|
|||||||
row_mask.set(FR_CODDEPC, mask.stddep(), TRUE);
|
row_mask.set(FR_CODDEPC, mask.stddep(), TRUE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (!c.movimenta_sospesi())
|
||||||
|
{
|
||||||
|
const TRectype & rec = cache().get(LF_ANAMAG, row_mask.get(FR_CODARTMAG));
|
||||||
|
|
||||||
|
if (rec.get_bool("SOSPESO"))
|
||||||
|
return error_box("Articolo %s sospeso, quindi non movmentabile", (const char *)rec.get(ANAMAG_CODART));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return TRUE;
|
return TRUE;
|
||||||
@ -1165,7 +1184,7 @@ bool sppr_handler( TMask_field& f, KEY key )
|
|||||||
TMask & mask = row_mask.get_sheet()->mask();
|
TMask & mask = row_mask.get_sheet()->mask();
|
||||||
TEdit_field & e = (TEdit_field &) f;
|
TEdit_field & e = (TEdit_field &) f;
|
||||||
TRelation * r = e.browse()->cursor()->relation();
|
TRelation * r = e.browse()->cursor()->relation();
|
||||||
TString16 cod = r->curr().get("COD");
|
const TString16 cod = r->curr().get("COD");
|
||||||
TSpesa_prest sp(NULL, cod == "SPP" ? 'S' : 'P');
|
TSpesa_prest sp(NULL, cod == "SPP" ? 'S' : 'P');
|
||||||
if (sp.read(row_mask.get(FR_CODART)) == NOERR)
|
if (sp.read(row_mask.get(FR_CODART)) == NOERR)
|
||||||
{
|
{
|
||||||
@ -1199,7 +1218,7 @@ bool sppr_handler( TMask_field& f, KEY key )
|
|||||||
{
|
{
|
||||||
const real cambio = mask.get(F_CAMBIO);
|
const real cambio = mask.get(F_CAMBIO);
|
||||||
real prezzo = sp.prezzo();
|
real prezzo = sp.prezzo();
|
||||||
const TString16 doc_valuta(mask.get(F_CODVAL));
|
const TString& doc_valuta = mask.get(F_CODVAL);
|
||||||
const bool controeuro = mask.get_bool(F_CONTROEURO);
|
const bool controeuro = mask.get_bool(F_CONTROEURO);
|
||||||
|
|
||||||
sppr_calc(sp, doc_valuta, cambio, prezzo, controeuro ? _exchange_contro : _exchange_base);
|
sppr_calc(sp, doc_valuta, cambio, prezzo, controeuro ? _exchange_contro : _exchange_base);
|
||||||
|
65
xi/xiextend.h
Executable file
65
xi/xiextend.h
Executable file
@ -0,0 +1,65 @@
|
|||||||
|
/*******************************************************************************
|
||||||
|
* Copyright 1991-1995 by ORCA Software, Inc. *
|
||||||
|
* *
|
||||||
|
* All rights reserved. May not be reproduced or distributed, in printed or *
|
||||||
|
* electronic form, without permission of ORCA Software, Inc. *
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
#ifdef WSWIN
|
||||||
|
#define NOCOMM
|
||||||
|
#define NOMINMAX
|
||||||
|
#define NOGDICAPMASKS
|
||||||
|
#define NOVIRTUALKEYCODES
|
||||||
|
#define NOWINMESSAGES
|
||||||
|
#define NOWINSTYLES
|
||||||
|
#define NOSYSMETRICS
|
||||||
|
#define NOMENUS
|
||||||
|
#define NOICONS
|
||||||
|
#define NOKEYSTATES
|
||||||
|
#define NOSYSCOMMANDS
|
||||||
|
#define NORASTEROPS
|
||||||
|
#define NOSHOWWINDOW
|
||||||
|
#define OEMRESOURCE
|
||||||
|
#define NOATOM
|
||||||
|
#define NOCLIPBOARD
|
||||||
|
#define NOCOLOR
|
||||||
|
#define NOCTLMGR
|
||||||
|
#define NODRAWTEXT
|
||||||
|
#define NOGDI
|
||||||
|
#define NOKERNEL
|
||||||
|
/* #define NOUSER */
|
||||||
|
#define NOMB
|
||||||
|
#define NOMEMMGR
|
||||||
|
#define NOMETAFILE
|
||||||
|
#define NOMINMAX
|
||||||
|
#define NOMSG
|
||||||
|
#define NOOPENFILE
|
||||||
|
#define NOSCROLL
|
||||||
|
#define NOSOUND
|
||||||
|
#define NOTEXTMETRIC
|
||||||
|
#define NOWH
|
||||||
|
#define NOWINOFFSETS
|
||||||
|
#define NOCOMM
|
||||||
|
#define NOKANJI
|
||||||
|
#define NOHELP
|
||||||
|
#define NOPROFILER
|
||||||
|
#define NODEFERWINDOWPOS
|
||||||
|
#include <windows.h>
|
||||||
|
#define INTERNAL
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef OSOS2
|
||||||
|
#define INCL_DOS
|
||||||
|
#define INCL_WIN
|
||||||
|
#define INCL_GPI
|
||||||
|
#define COLOR pm_COLOR
|
||||||
|
#define UINT pm_UINT
|
||||||
|
#define ULONG pm_ULONG
|
||||||
|
#include <os2.h>
|
||||||
|
#undef COLOR
|
||||||
|
#undef UINT
|
||||||
|
#undef ULONG
|
||||||
|
#define INTERNAL
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
Loading…
x
Reference in New Issue
Block a user