Corretta gestione valuta in prima nota e gestione dare/avere nelle causali
git-svn-id: svn://10.65.10.50/trunk@546 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
parent
d87826888b
commit
ab9480626f
698
cg/cg0500.cpp
698
cg/cg0500.cpp
File diff suppressed because it is too large
Load Diff
@ -45,6 +45,7 @@ BEGIN
|
||||
DISPLAY "Registro" REG
|
||||
DISPLAY "Movimento" TIPOMOV
|
||||
COPY OUTPUT F_COD_CAUS
|
||||
CHECKTYPE REQUIRED
|
||||
KEY 2
|
||||
HELP "Descrizione della causale"
|
||||
MESSAGE COPY, F_DESCR2
|
||||
@ -127,12 +128,12 @@ BEGIN
|
||||
FIELD LF_CAUSALI->M770
|
||||
HELP "Inserire il tipo di collegamento Mod.770"
|
||||
ITEM " |Nessuno"
|
||||
ITEM "1|Ricevuta e/o pagamento fattura percipipiente"
|
||||
ITEM "1|Ricevuta e/o pagamento fattura percipiente"
|
||||
ITEM "2|Versamento ritenute percipiente"
|
||||
ITEM "3|Versamento ritenute dipendente"
|
||||
ITEM "4|Versamento contributi dipendente"
|
||||
ITEM "5|Compensi non soggetti"
|
||||
ITEM "6|Ritenute per operazioni occasionali"
|
||||
ITEM "6|Ritenute per prestazioni occasionali"
|
||||
END
|
||||
|
||||
NUMBER F_ANNOES 4
|
||||
|
@ -138,6 +138,7 @@ BEGIN
|
||||
ITEM "A|Avere"
|
||||
FIELD LF_RCAUSALI->SEZIONE
|
||||
FLAGS "U"
|
||||
GROUP 1
|
||||
END
|
||||
|
||||
// Descrizione normale
|
||||
@ -214,6 +215,7 @@ STRING 109 50
|
||||
BEGIN
|
||||
PROMPT 1 8 ""
|
||||
FLAGS "D"
|
||||
GROUP 1
|
||||
END
|
||||
|
||||
BUTTON DLG_OK 9 2
|
||||
|
@ -78,6 +78,7 @@ TMask* TPrimanota_application::load_mask(int n)
|
||||
ism.set_handler(209, sheet_clifo_handler);
|
||||
ism.set_handler(309, sheet_clifo_handler);
|
||||
}
|
||||
_iva_showed = FALSE;
|
||||
case 1:
|
||||
{
|
||||
m->set_handler(F_DATAREG, datareg_handler);
|
||||
@ -85,6 +86,7 @@ TMask* TPrimanota_application::load_mask(int n)
|
||||
m->set_handler(F_DESCR, descr_handler);
|
||||
m->set_handler(F_CODCAUS, caus_modify_handler);
|
||||
m->set_handler(F_SHEETCG, cg_handler);
|
||||
m->set_handler(F_CAMBIO, cambio_handler);
|
||||
m->set_handler(F_VISVAL, visval_handler);
|
||||
|
||||
TSheet_field& cg = (TSheet_field&)m->field(F_SHEETCG);
|
||||
@ -225,13 +227,14 @@ bool TPrimanota_application::changing_mask(int mode)
|
||||
{
|
||||
const bool flag = _mode != MODE_QUERY;
|
||||
|
||||
if (flag && _iva != nessuna_iva)
|
||||
if (flag && _iva != nessuna_iva && !_iva_showed)
|
||||
{
|
||||
WINDOW w = ivas().parent();
|
||||
show_window(w, TRUE);
|
||||
set_front_window(w);
|
||||
process_events();
|
||||
show_window(w, FALSE);
|
||||
_iva_showed = TRUE;
|
||||
}
|
||||
|
||||
return flag;
|
||||
@ -290,6 +293,7 @@ void TPrimanota_application::init_mask(TMask& m)
|
||||
|
||||
const bool intra = _causale.intra();
|
||||
const bool valintra = _causale.valintra();
|
||||
const bool corrisp = _causale.corrispettivi();
|
||||
|
||||
if (_iva != nessuna_iva)
|
||||
{
|
||||
@ -302,24 +306,28 @@ void TPrimanota_application::init_mask(TMask& m)
|
||||
else
|
||||
{
|
||||
forg = 'h';
|
||||
clig = causale().corrispettivi() ? 'h' : 's';
|
||||
clig = corrisp ? 'h' : 's';
|
||||
}
|
||||
m.send_key(K_SHIFT+K_CTRL+clig, -1); // group 1 (clienti)
|
||||
m.send_key(K_SHIFT+K_CTRL+forg, -2); // group 2 (fornitori)
|
||||
m.send_key(K_SHIFT+K_CTRL+clig, -1); // GROUP 1 (clienti)
|
||||
m.send_key(K_SHIFT+K_CTRL+forg, -2); // GROUP 2 (fornitori)
|
||||
if (corrisp) m.hide(F_STATOPAIV);
|
||||
|
||||
m.show(F_CORRLIRE, intra);
|
||||
|
||||
const bool corrval = intra && _causale.valintra();
|
||||
const bool corrval = intra && valintra;
|
||||
m.show(F_CORRVALUTA, corrval);
|
||||
|
||||
m.show(F_CODIVA, m.mode() == MODE_INS);
|
||||
}
|
||||
|
||||
// Show/Hide campi valuta: F_VALUTA, F_CAMBIO, F_VISVAL (GROUP 3)
|
||||
const bool valuta = _causale.valuta() || _causale.valintra();
|
||||
const bool valuta = valintra || (_ges_val && _causale.valuta());
|
||||
m.send_key(K_SHIFT+K_CTRL+(valuta ? 's' : 'h'), -3);
|
||||
if (valuta)
|
||||
m.set(F_VISVAL, "X");
|
||||
if (valuta)
|
||||
{
|
||||
const bool ok = m.get(F_VALUTA).not_empty();
|
||||
m.field(F_VISVAL).set(ok ? "X" : " ");
|
||||
}
|
||||
}
|
||||
|
||||
void TPrimanota_application::init_query_mode(TMask& m)
|
||||
@ -384,14 +392,6 @@ void TPrimanota_application::init_insert_mode(TMask& m)
|
||||
{
|
||||
const long protiva = causale().reg().protocol();
|
||||
m.set(F_PROTIVA, protiva+1);
|
||||
|
||||
TMask_field& vv = m.field(F_VISVAL);
|
||||
if (vv.active() && m.get(F_VALUTA).empty()) // Se e' un movimento in valuta
|
||||
{
|
||||
const bool ok = m.field(F_VALUTA).on_key(K_F9); // Richiedi valuta
|
||||
vv.set(ok ? "X" : " ");
|
||||
if (ok) vv.on_hit(); // Cambia decimali
|
||||
}
|
||||
}
|
||||
|
||||
if (m.get(F_CODCAUS).empty()) return;
|
||||
@ -475,20 +475,26 @@ int TPrimanota_application::read(TMask& m)
|
||||
{
|
||||
m.autoload(_rel);
|
||||
|
||||
cgs().reset();
|
||||
|
||||
if (_iva != nessuna_iva)
|
||||
{
|
||||
ivas().reset();
|
||||
|
||||
const TString16 occode(_rel->lfile().get("OCFPI"));
|
||||
occas_mask().set(O_CODICE, occode);
|
||||
|
||||
const char clifo = toupper(m.get(F_CLIFO)[0]);
|
||||
|
||||
real cambio(_rel->lfile().get("CAMBIO"));
|
||||
if (cambio < 1.0) cambio = 1.0;
|
||||
m.set_exchange(FALSE, cambio);
|
||||
|
||||
const char clifo = toupper(m.get(F_CLIFO)[0]);
|
||||
if (_iva == iva_acquisti && clifo == 'C')
|
||||
error_box("Registrazione di acquisto attribuita ad un cliente"); else
|
||||
if (_iva == iva_vendite && clifo == 'F')
|
||||
error_box("Registrazione di vendita attribuita ad un fornitore");
|
||||
}
|
||||
|
||||
cgs().reset();
|
||||
|
||||
_saldi.reset(); // Azzera saldi
|
||||
_saldi.set_movprovv(_rel->lfile().get_bool("PROVVIS"));
|
||||
@ -543,8 +549,6 @@ int TPrimanota_application::read(TMask& m)
|
||||
m.set(F_SOLAIVA, solaiva ? "X" : " ");
|
||||
m.field(F_SOLAIVA).on_hit();
|
||||
|
||||
ivas().reset();
|
||||
|
||||
const bool to_swap = test_swap(FALSE);
|
||||
if (to_swap)
|
||||
{
|
||||
@ -583,9 +587,6 @@ int TPrimanota_application::read(TMask& m)
|
||||
ivas().row(i) = riga;
|
||||
}
|
||||
|
||||
TMask_field& vv = m.field(F_VISVAL);
|
||||
if (vv.active()) vv.on_hit();
|
||||
|
||||
return _rel->status();
|
||||
}
|
||||
|
||||
@ -852,11 +853,13 @@ void TPrimanota_application::genera_incasso(const char* causimm)
|
||||
inc.lfile().put("REG", caus.reg().name()); // Registro
|
||||
|
||||
const int annoes = m.get_int(F_ANNOES);
|
||||
const TString16 datareg = m.get(F_DATAREG);
|
||||
|
||||
TRectype& r = inc.cg(0);
|
||||
r.zero();
|
||||
r.put("NUMREG", _lastreg);
|
||||
r.put("NUMRIG", 1);
|
||||
r.put("DATAREG", datareg);
|
||||
r.put("ANNOES", annoes);
|
||||
r.put("SEZIONE", m.get(I_SEZIONE1));
|
||||
r.put("IMPORTO", m.get(F_TOTALE));
|
||||
@ -891,6 +894,7 @@ void TPrimanota_application::genera_incasso(const char* causimm)
|
||||
r.put("IMPORTO", imp);
|
||||
r.put("NUMREG", _lastreg);
|
||||
r.put("NUMRIG", i);
|
||||
r.put("DATAREG", datareg);
|
||||
r.put("ANNOES", annoes);
|
||||
r.put("SEZIONE", m.get(sid));
|
||||
r.put("TIPOC", ' ');
|
||||
|
166
cg/cg2100c.uml
166
cg/cg2100c.uml
@ -124,6 +124,7 @@ BEGIN
|
||||
OUTPUT F_DESCAGG CODTAB
|
||||
OUTPUT F_DESCR S0
|
||||
CHECKTYPE NORMAL
|
||||
WARNING "Descrizione assente"
|
||||
END
|
||||
|
||||
STRING F_DESCR 50
|
||||
@ -234,7 +235,6 @@ BEGIN
|
||||
OUTPUT F_CONTORIC CONTORIC
|
||||
OUTPUT F_SOTTOCONTORIC SOTTOCRIC
|
||||
OUTPUT F_CODPAG CODPAG
|
||||
OUTPUT F_VALUTA CODVAL
|
||||
OUTPUT F_STATOPAIV STATOPAIV
|
||||
OUTPUT F_PIVACLIENTE PAIV
|
||||
OUTPUT F_OCCASIONALE OCCAS
|
||||
@ -265,7 +265,6 @@ BEGIN
|
||||
OUTPUT F_SOTTOCONTORIC SOTTOCRIC
|
||||
OUTPUT F_OCCASIONALE OCCAS
|
||||
OUTPUT F_CODPAG CODPAG
|
||||
OUTPUT F_VALUTA CODVAL
|
||||
OUTPUT F_STATOPAIV STATOPAIV
|
||||
OUTPUT F_PIVAFORNITORE PAIV
|
||||
MESSAGE COPY,F_CLIENTE
|
||||
@ -381,86 +380,9 @@ BEGIN
|
||||
WARNING "Codice pagamento assente"
|
||||
END
|
||||
|
||||
NUMBER F_TOTALE 15
|
||||
BEGIN
|
||||
PROMPT 1 12 "Totale documento "
|
||||
FIELD TOTDOC
|
||||
FLAGS "RV"
|
||||
PICTURE "."
|
||||
END
|
||||
|
||||
NUMBER F_RITFIS 15
|
||||
BEGIN
|
||||
PROMPT 1 13 "Ritenute fiscali "
|
||||
FIELD RITFIS
|
||||
FLAGS "RV"
|
||||
PICTURE "."
|
||||
END
|
||||
|
||||
NUMBER F_RITSOC 15
|
||||
BEGIN
|
||||
PROMPT 1 14 "Ritenute sociali "
|
||||
FIELD LF_MOV->RITSOC
|
||||
FLAGS "RV"
|
||||
PICTURE "."
|
||||
END
|
||||
|
||||
STRING F_CODIVA 4
|
||||
BEGIN
|
||||
PROMPT 60 12 "Codice IVA "
|
||||
FLAGS "U"
|
||||
USE %IVA
|
||||
INPUT CODTAB F_CODIVA
|
||||
DISPLAY "Codice" CODTAB
|
||||
DISPLAY "Descrizione@50" S0
|
||||
DISPLAY "%@6" R0
|
||||
DISPLAY "Tipo" S1
|
||||
OUTPUT F_CODIVA CODTAB
|
||||
CHECKTYPE NORMAL
|
||||
END
|
||||
|
||||
DATE F_DATA74TER
|
||||
BEGIN
|
||||
PROMPT 54 13 "Data 74/ter "
|
||||
CHECKTYPE REQUIRED
|
||||
FIELD DATA74TER
|
||||
END
|
||||
|
||||
NUMBER F_ANNORIF 4
|
||||
BEGIN
|
||||
PROMPT 45 14 "Rif.partita "
|
||||
FLAGS "A"
|
||||
HELP "Anno di riferimento partita"
|
||||
CHECKTYPE REQUIRED
|
||||
END
|
||||
|
||||
STRING F_NUMRIF 7
|
||||
BEGIN
|
||||
PROMPT 68 14 "/ "
|
||||
HELP "Numero documento (o protocollo IVA) di riferimento"
|
||||
CHECKTYPE REQUIRED
|
||||
END
|
||||
|
||||
NUMBER F_CORRLIRE 15
|
||||
BEGIN
|
||||
PROMPT 1 15 "Corrispettivo Lire "
|
||||
FIELD LF_MOV->CORRLIRE
|
||||
FLAGS "R"
|
||||
PICTURE "."
|
||||
END
|
||||
|
||||
NUMBER F_CORRVALUTA 15
|
||||
BEGIN
|
||||
PROMPT 45 15 "Corrisp. valuta "
|
||||
FIELD LF_MOV->CORRVALUTA
|
||||
FLAGS "R"
|
||||
PICTURE "."
|
||||
END
|
||||
|
||||
|
||||
STRING F_VALUTA 3
|
||||
BEGIN
|
||||
PROMPT 1 16 "Valuta "
|
||||
PROMPT 1 12 "Valuta "
|
||||
FIELD LF_MOV->CODVAL
|
||||
FLAGS "U"
|
||||
GROUP 3
|
||||
@ -473,11 +395,12 @@ BEGIN
|
||||
OUTPUT F_VALUTA CODTAB
|
||||
OUTPUT F_CAMBIO R10
|
||||
CHECKTYPE NORMAL
|
||||
WARNING "Codice valuta assente"
|
||||
END
|
||||
|
||||
NUMBER F_CAMBIO 15 5
|
||||
NUMBER F_CAMBIO 12 5
|
||||
BEGIN
|
||||
PROMPT 20 16 "Cambio "
|
||||
PROMPT 20 12 "Cambio "
|
||||
FIELD LF_MOV->CAMBIO
|
||||
FLAGS "RU"
|
||||
GROUP 3
|
||||
@ -486,10 +409,87 @@ END
|
||||
|
||||
BOOLEAN F_VISVAL
|
||||
BEGIN
|
||||
PROMPT 47 16 "Visualizza importi in valuta"
|
||||
PROMPT 47 12 "Visualizza importi in valuta"
|
||||
GROUP 3
|
||||
END
|
||||
|
||||
NUMBER F_TOTALE 15
|
||||
BEGIN
|
||||
PROMPT 1 13 "Totale documento "
|
||||
FIELD TOTDOC
|
||||
FLAGS "RV"
|
||||
PICTURE "."
|
||||
END
|
||||
|
||||
NUMBER F_RITFIS 15
|
||||
BEGIN
|
||||
PROMPT 1 14 "Ritenute fiscali "
|
||||
FIELD RITFIS
|
||||
FLAGS "RV"
|
||||
PICTURE "."
|
||||
END
|
||||
|
||||
NUMBER F_RITSOC 15
|
||||
BEGIN
|
||||
PROMPT 1 15 "Ritenute sociali "
|
||||
FIELD LF_MOV->RITSOC
|
||||
FLAGS "RV"
|
||||
PICTURE "."
|
||||
END
|
||||
|
||||
STRING F_CODIVA 4
|
||||
BEGIN
|
||||
PROMPT 60 13 "Codice IVA "
|
||||
FLAGS "U"
|
||||
USE %IVA
|
||||
INPUT CODTAB F_CODIVA
|
||||
DISPLAY "Codice" CODTAB
|
||||
DISPLAY "Descrizione@50" S0
|
||||
DISPLAY "%@6" R0
|
||||
DISPLAY "Tipo" S1
|
||||
OUTPUT F_CODIVA CODTAB
|
||||
CHECKTYPE NORMAL
|
||||
WARNING "Codice IVA assente"
|
||||
END
|
||||
|
||||
DATE F_DATA74TER
|
||||
BEGIN
|
||||
PROMPT 54 14 "Data 74/ter "
|
||||
CHECKTYPE REQUIRED
|
||||
FIELD DATA74TER
|
||||
END
|
||||
|
||||
NUMBER F_ANNORIF 4
|
||||
BEGIN
|
||||
PROMPT 45 15 "Rif.partita "
|
||||
FLAGS "A"
|
||||
HELP "Anno di riferimento partita"
|
||||
CHECKTYPE REQUIRED
|
||||
END
|
||||
|
||||
STRING F_NUMRIF 7
|
||||
BEGIN
|
||||
PROMPT 68 15 "/ "
|
||||
HELP "Numero documento (o protocollo IVA) di riferimento"
|
||||
CHECKTYPE REQUIRED
|
||||
END
|
||||
|
||||
NUMBER F_CORRLIRE 15
|
||||
BEGIN
|
||||
PROMPT 1 16 "Corrispettivo Lire "
|
||||
FIELD LF_MOV->CORRLIRE
|
||||
FLAGS "R"
|
||||
PICTURE "."
|
||||
END
|
||||
|
||||
NUMBER F_CORRVALUTA 15
|
||||
BEGIN
|
||||
PROMPT 45 16 "Corrisp. valuta "
|
||||
FIELD LF_MOV->CORRVALUTA
|
||||
FLAGS "R"
|
||||
PICTURE "."
|
||||
END
|
||||
|
||||
ENDPAGE
|
||||
|
||||
PAGE "IVA" -1 -1 77 20
|
||||
|
@ -653,7 +653,7 @@ bool TPrimanota_application::codiva_handler(TMask_field& f, KEY key)
|
||||
|
||||
bool TPrimanota_application::detrazione_handler(TMask_field& f, KEY key)
|
||||
{
|
||||
if (key == K_SPACE && app().iva() == iva_acquisti)
|
||||
if (key == K_TAB && f.dirty() && app().iva() == iva_acquisti)
|
||||
{
|
||||
TMask_field& ci = f.mask().field(101);
|
||||
ci.set_dirty();
|
||||
@ -1299,12 +1299,29 @@ bool TPrimanota_application::clifo_handler(TMask_field& f, KEY key)
|
||||
{
|
||||
TMask& m = f.mask();
|
||||
app().add_cgs_tot(m);
|
||||
|
||||
TLocalisamfile& clifo = ((TEdit_field&)f).browse()->cursor()->file();
|
||||
const int alleg = clifo.get_int(CLI_ALLEG);
|
||||
TEdit_field& upi = m.efield(F_RIEPILOGO);
|
||||
upi.check_type(alleg == 3 ? CHECK_REQUIRED : CHECK_NORMAL);
|
||||
|
||||
if (clifo.get_bool(CLI_OCCAS))
|
||||
m.send_key(K_SPACE, F_OCCASEDIT); // Lancia maschera occasionali
|
||||
|
||||
if (m.field(F_VISVAL).active())
|
||||
{
|
||||
const TString16 valuta(clifo.get("CODVAL"));
|
||||
if (valuta.not_empty() && valuta != m.get(F_VALUTA))
|
||||
{
|
||||
TTable val("%val");
|
||||
val.put("CODTAB", valuta);
|
||||
if (val.read() == NOERR)
|
||||
{
|
||||
m.set(F_VALUTA, valuta);
|
||||
m.set(F_CAMBIO, val.get("R0"), TRUE);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
@ -1342,19 +1359,22 @@ bool TPrimanota_application::main_codiva_handler(TMask_field& f, KEY key)
|
||||
if (key == K_TAB && f.get().not_empty())
|
||||
{
|
||||
const real imp(app().ivas().row(1).get(0)); // Se il totale non e' stato spezzato
|
||||
if (imp == ZERO)
|
||||
if (imp.is_zero())
|
||||
{
|
||||
TToken_string& row = app().ivas().row(0);
|
||||
|
||||
TMask& m = f.mask();
|
||||
iva_notify(0, K_SPACE);
|
||||
|
||||
const TCodiceIVA iva(f.get());
|
||||
const bool corr = app().causale().corrispettivi();
|
||||
real tot = app().totale_documento();
|
||||
real imposta;
|
||||
if (!corr)
|
||||
const bool acq3 = (app().iva() == iva_acquisti) && (row.get_int(2) == 3);
|
||||
|
||||
real tot = app().totale_documento(); // Calcola totale documento
|
||||
real imposta; // Calcola imposta
|
||||
if (!corr && !acq3)
|
||||
imposta = app().scorpora(tot, iva.percentuale());
|
||||
|
||||
TToken_string& row = app().ivas().row(0);
|
||||
row.add(tot.string(), 0); // imponibile
|
||||
row.add(imposta.string(), 3); // imposta
|
||||
|
||||
@ -1440,22 +1460,29 @@ bool TPrimanota_application::ritsoc_handler(TMask_field& f, KEY key)
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool TPrimanota_application::cambio_handler(TMask_field& f, KEY key)
|
||||
{
|
||||
if (key == K_TAB && f.focusdirty())
|
||||
{
|
||||
if (f.get().empty())
|
||||
f.set(f.mask().exchange().string());
|
||||
else
|
||||
f.mask().field(F_VISVAL).on_hit();
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
// Handler of F_VISVAL
|
||||
// Certified 90%
|
||||
// Certified 99%
|
||||
bool TPrimanota_application::visval_handler(TMask_field& f, KEY key)
|
||||
{
|
||||
if (key == K_SPACE)
|
||||
{
|
||||
{
|
||||
TMask& m = f.mask();
|
||||
const real e(f.get() == "X" ? m.get(F_CAMBIO) : "1");
|
||||
if (e > ZERO)
|
||||
m.set_exchange(e);
|
||||
else
|
||||
{
|
||||
error_box("Impostare un valore maggiore di zero per il cambio");
|
||||
f.reset();
|
||||
}
|
||||
const bool on = f.get().not_empty();
|
||||
const real e(f.mask().get(F_CAMBIO));
|
||||
m.set_exchange(on, e);
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
@ -42,6 +42,7 @@ class TPrimanota_application : public TRelation_application
|
||||
bool _ges_val, _ges_sal; // Gestione valuta e saldaconto
|
||||
bool _rif_par; // Riferimento parita (NUM_DOC | PROTIVA)
|
||||
bool _savenew; // Registra e nuovo
|
||||
bool _iva_showed; // Lo sheet IVA e' gia' stato visualizzato una volta?
|
||||
|
||||
TSaldo_agg _saldi; // Saldi da aggiornare
|
||||
|
||||
@ -65,6 +66,7 @@ class TPrimanota_application : public TRelation_application
|
||||
static bool ritfis_handler(TMask_field& f, KEY key);
|
||||
static bool ritsoc_handler(TMask_field& f, KEY key);
|
||||
static bool main_codiva_handler(TMask_field& f, KEY key);
|
||||
static bool cambio_handler(TMask_field& f, KEY key);
|
||||
static bool visval_handler(TMask_field& f, KEY key);
|
||||
static bool occas_code_handler(TMask_field& f, KEY key);
|
||||
static bool occas_handler(TMask_field& f, KEY key);
|
||||
|
Loading…
x
Reference in New Issue
Block a user