Minima gestione split payment
git-svn-id: svn://10.65.10.50/branches/R_10_00@23041 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
parent
ed57567c20
commit
83bb071f66
107
lv/lv2500.cpp
107
lv/lv2500.cpp
@ -48,11 +48,14 @@ class TFatturazione_lav_app: public TSkeleton_application
|
|||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual void main_loop();
|
virtual void main_loop();
|
||||||
|
virtual bool create();
|
||||||
|
|
||||||
|
public:
|
||||||
void genera_bolle_nolo(TAssoc_array& cliela, TFatturazione_lavanderie& elab, int& numdocgen, real& totimp, real& imposta, real& totdoc, real& spese);
|
void genera_bolle_nolo(TAssoc_array& cliela, TFatturazione_lavanderie& elab, int& numdocgen, real& totimp, real& imposta, real& totdoc, real& spese);
|
||||||
bool controlli_preliminari();
|
bool controlli_preliminari();
|
||||||
bool copy_file(const TFilename& src, const TFilename& dst) const;
|
bool copy_file(const TFilename& src, const TFilename& dst) const;
|
||||||
bool copy_tree(const char* src_study, const char* dst_study) const;
|
bool copy_tree(const char* src_study, const char* dst_study) const;
|
||||||
|
void log(const char* msg, int sev = 0);
|
||||||
};
|
};
|
||||||
|
|
||||||
TFatturazione_lav_app & app() { return (TFatturazione_lav_app &) main_app();}
|
TFatturazione_lav_app & app() { return (TFatturazione_lav_app &) main_app();}
|
||||||
@ -528,25 +531,30 @@ void TFatturazione_lavanderie::post_process(TLista_documenti& doc_out, TLista_do
|
|||||||
bool rifbol = contr.get_bool(LVCONDV_RIFBOL);
|
bool rifbol = contr.get_bool(LVCONDV_RIFBOL);
|
||||||
|
|
||||||
const int alleg = doc.clifor().get_int(CLI_ALLEG);
|
const int alleg = doc.clifor().get_int(CLI_ALLEG);
|
||||||
const bool liqdiff = alleg == 7 && doc.clifor().vendite().get_bool(CFV_FATTSOSP);
|
const bool splitpay = alleg == 7 && doc.clifor().get_bool(CLI_SPLITPAY);
|
||||||
real consvconv;
|
real consvconv;
|
||||||
real impvconv;
|
real impvconv;
|
||||||
TAssoc_array nolo_computed;
|
TAssoc_array nolo_computed;
|
||||||
|
|
||||||
doc.zero(DOC_LIQDIFF);
|
doc.zero(DOC_LIQDIFF);
|
||||||
doc.zero(DOC_IVAXCASSA);
|
doc.zero(DOC_IVAXCASSA);
|
||||||
if (liqdiff)
|
if (!splitpay)
|
||||||
{
|
{
|
||||||
doc.put(DOC_LIQDIFF, "X");
|
const bool liqdiff = alleg == 7 && doc.clifor().vendite().get_bool(CFV_FATTSOSP);
|
||||||
}
|
if (liqdiff)
|
||||||
else
|
|
||||||
{
|
|
||||||
if ((alleg < 5 || alleg == 7) && doc.clifor().get(CLI_PAIV).full() &&
|
|
||||||
gestione_IVAxCassa(doc.get_date(DOC_DATADOC)))
|
|
||||||
{
|
{
|
||||||
doc.put(DOC_IVAXCASSA, "X");
|
doc.put(DOC_LIQDIFF, "X");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if ((alleg < 5 || alleg == 7) && doc.clifor().get(CLI_PAIV).full() &&
|
||||||
|
gestione_IVAxCassa(doc.get_date(DOC_DATADOC)))
|
||||||
|
{
|
||||||
|
doc.put(DOC_IVAXCASSA, "X");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (doc.physical_rows() > 0 && doc[1].is_descrizione())
|
if (doc.physical_rows() > 0 && doc[1].is_descrizione())
|
||||||
{
|
{
|
||||||
if (elcons)
|
if (elcons)
|
||||||
@ -1531,6 +1539,10 @@ TRiga_documento& TFatturazione_lavanderie::find_or_create_row(TDocumento& doc_ou
|
|||||||
row.zero(RDOC_CODMAGC);
|
row.zero(RDOC_CODMAGC);
|
||||||
row.put("LVTYPE", lavtype);
|
row.put("LVTYPE", lavtype);
|
||||||
r = row.get_int(RDOC_NRIGA);
|
r = row.get_int(RDOC_NRIGA);
|
||||||
|
|
||||||
|
TString msg; msg.format(FR("Creazione riga %d in fattura %d/%s/%ld"),
|
||||||
|
r, doc_out.anno(), (const char*)doc_out.numerazione(), doc_out.numero());
|
||||||
|
app().log(msg, -1);
|
||||||
}
|
}
|
||||||
if (fatt_02())
|
if (fatt_02())
|
||||||
{
|
{
|
||||||
@ -1609,7 +1621,7 @@ void TFatturazione_lavanderie::create_row(TDocumento& doc_out, const TRiga_docum
|
|||||||
}
|
}
|
||||||
|
|
||||||
//se è una causale di ritirato e se sto ritirando una quantità di merce diversa da zero, allora:
|
//se è una causale di ritirato e se sto ritirando una quantità di merce diversa da zero, allora:
|
||||||
if (cau.is_ritiro() && !qta1.is_zero())
|
if (!qta1.is_zero() && cau.is_ritiro())
|
||||||
{
|
{
|
||||||
//leggo la casuale di magazzino associata al ritiro e il suo segno sul consegnato mese
|
//leggo la casuale di magazzino associata al ritiro e il suo segno sul consegnato mese
|
||||||
const TCausale_magazzino& rit = cau.causale_ritiro();
|
const TCausale_magazzino& rit = cau.causale_ritiro();
|
||||||
@ -1628,7 +1640,7 @@ void TFatturazione_lavanderie::create_row(TDocumento& doc_out, const TRiga_docum
|
|||||||
}
|
}
|
||||||
|
|
||||||
//se è una causale di consegnato e se sto consegnando una quantità di merce diversa da zero, allora:
|
//se è una causale di consegnato e se sto consegnando una quantità di merce diversa da zero, allora:
|
||||||
if (cau.is_consegna() && !qta.is_zero())
|
if (!qta.is_zero() && cau.is_consegna())
|
||||||
{
|
{
|
||||||
//leggo la casuale di magazzino associata al ritiro e i suoi segni sul consegnato mese,
|
//leggo la casuale di magazzino associata al ritiro e i suoi segni sul consegnato mese,
|
||||||
//sulla dotazione temporanea e sulla dotazione iniziale
|
//sulla dotazione temporanea e sulla dotazione iniziale
|
||||||
@ -1725,6 +1737,15 @@ TFatturazione_msk::TFatturazione_msk():TAutomask("lv2500a")
|
|||||||
//// TFatturazione_lav_app ////
|
//// TFatturazione_lav_app ////
|
||||||
/////////////////////////////////////
|
/////////////////////////////////////
|
||||||
|
|
||||||
|
void TFatturazione_lav_app::log(const char* msg, int sev)
|
||||||
|
{
|
||||||
|
#ifdef NDEBUG
|
||||||
|
if (sev >= 0) // No debug messages in release build
|
||||||
|
#endif
|
||||||
|
if (_log) _log->log(sev, msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//GENERA_BOLLE_NOLO: metodo che genera le fatture di solo nolo per quei clienti a cui non è stato consegnato niente
|
//GENERA_BOLLE_NOLO: metodo che genera le fatture di solo nolo per quei clienti a cui non è stato consegnato niente
|
||||||
void TFatturazione_lav_app::genera_bolle_nolo(TAssoc_array& cliela, TFatturazione_lavanderie& elab, int& numdocgen, real& totimp, real& imposta, real& totdoc, real& spese)
|
void TFatturazione_lav_app::genera_bolle_nolo(TAssoc_array& cliela, TFatturazione_lavanderie& elab, int& numdocgen, real& totimp, real& imposta, real& totdoc, real& spese)
|
||||||
{
|
{
|
||||||
@ -1747,7 +1768,7 @@ void TFatturazione_lav_app::genera_bolle_nolo(TAssoc_array& cliela, TFatturazion
|
|||||||
TLista_documenti doc_in;
|
TLista_documenti doc_in;
|
||||||
TLista_documenti doc_out;
|
TLista_documenti doc_out;
|
||||||
|
|
||||||
TProgress_indicator pi(contr.items(), TR("Elaborazione Nolo", true);
|
TProgress_monitor pi(contr.items(), TR("Elaborazione Nolo"), true);
|
||||||
for(bool ok = contr.move_first(); ok; ok = contr.move_next())
|
for(bool ok = contr.move_first(); ok; ok = contr.move_next())
|
||||||
{
|
{
|
||||||
if (!pi.add_status())
|
if (!pi.add_status())
|
||||||
@ -2025,14 +2046,14 @@ bool TFatturazione_lav_app::copy_tree(const char* src_study, const char* dst_stu
|
|||||||
TFilename mask(src_study); mask.add("*.");
|
TFilename mask(src_study); mask.add("*.");
|
||||||
SLIST dlist = xvt_fsys_list_files(DIR_TYPE, mask, TRUE);
|
SLIST dlist = xvt_fsys_list_files(DIR_TYPE, mask, TRUE);
|
||||||
xvt_fsys_restore_dir();
|
xvt_fsys_restore_dir();
|
||||||
TProgind pd(xvt_slist_count(dlist), TR("Copia cartelle"), true, true);
|
TProgress_monitor pd(xvt_slist_count(dlist), TR("Copia cartelle"), true);
|
||||||
|
|
||||||
TString msg; // Messaggio di progresso
|
TString msg; // Messaggio di progresso
|
||||||
|
|
||||||
bool go_on = true;
|
bool go_on = true;
|
||||||
for (SLIST_ELT d = xvt_slist_get_first(dlist); d && go_on; d = xvt_slist_get_next(dlist, d))
|
for (SLIST_ELT d = xvt_slist_get_first(dlist); d && go_on; d = xvt_slist_get_next(dlist, d))
|
||||||
{
|
{
|
||||||
if (!pd.addstatus(1))
|
if (!pd.add_status())
|
||||||
{
|
{
|
||||||
go_on = false;
|
go_on = false;
|
||||||
break;
|
break;
|
||||||
@ -2041,7 +2062,7 @@ bool TFatturazione_lav_app::copy_tree(const char* src_study, const char* dst_stu
|
|||||||
const TFilename dir = xvt_slist_get(dlist, d, NULL);
|
const TFilename dir = xvt_slist_get(dlist, d, NULL);
|
||||||
|
|
||||||
TString name = dir.name(); name.lower();
|
TString name = dir.name(); name.lower();
|
||||||
if (name == "cesp") // Ignora la vetusta cartella Cespiti in FoxPro
|
if (name.compare("cesp", -1, true) == 0) // Ignora la vetusta cartella Cespiti in FoxPro
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
msg.cut(0) << TR("Copia di ") << name;
|
msg.cut(0) << TR("Copia di ") << name;
|
||||||
@ -2050,12 +2071,12 @@ bool TFatturazione_lav_app::copy_tree(const char* src_study, const char* dst_stu
|
|||||||
mask = dir; mask.add("*.*");
|
mask = dir; mask.add("*.*");
|
||||||
TString_array files; list_files(mask, files);
|
TString_array files; list_files(mask, files);
|
||||||
|
|
||||||
TProgind pi(files.items(), "Copia file", true, true);
|
TProgress_monitor pi(files.items(), "Copia file", true);
|
||||||
|
|
||||||
TFilename dst;
|
TFilename dst;
|
||||||
FOR_EACH_ARRAY_ROW(files, i, f)
|
FOR_EACH_ARRAY_ROW(files, i, f)
|
||||||
{
|
{
|
||||||
if (!pi.addstatus(1))
|
if (!pi.add_status())
|
||||||
{
|
{
|
||||||
go_on = false;
|
go_on = false;
|
||||||
break;
|
break;
|
||||||
@ -2079,6 +2100,13 @@ bool TFatturazione_lav_app::copy_tree(const char* src_study, const char* dst_stu
|
|||||||
return go_on;
|
return go_on;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool TFatturazione_lav_app::create()
|
||||||
|
{
|
||||||
|
//instanzio i localisamfile che mi servono
|
||||||
|
open_files(LF_TABCOM, LF_TAB, LF_CLIFO, LF_DOC, LF_RIGHEDOC, LF_LVCONDV, LF_LVRCONDV, 0);
|
||||||
|
return TSkeleton_application::create();
|
||||||
|
}
|
||||||
|
|
||||||
void TFatturazione_lav_app::main_loop()
|
void TFatturazione_lav_app::main_loop()
|
||||||
{
|
{
|
||||||
bool prova = false;
|
bool prova = false;
|
||||||
@ -2099,17 +2127,11 @@ void TFatturazione_lav_app::main_loop()
|
|||||||
_msk = new TFatturazione_msk();
|
_msk = new TFatturazione_msk();
|
||||||
_msk->show(F_SAVEDATA, lv_is_02_active());
|
_msk->show(F_SAVEDATA, lv_is_02_active());
|
||||||
|
|
||||||
|
|
||||||
//instanzio i localisamfile che mi servono
|
|
||||||
TLocalisamfile doc(LF_DOC);
|
|
||||||
TLocalisamfile rdoc(LF_RIGHEDOC);
|
|
||||||
|
|
||||||
while (_msk->run()!= K_QUIT)
|
while (_msk->run()!= K_QUIT)
|
||||||
{
|
{
|
||||||
_solototali = _msk->get_bool(F_SOLOTOTALI);
|
_solototali = _msk->get_bool(F_SOLOTOTALI);
|
||||||
const int annoes = _msk->get_date(F_DATAFAT).year();
|
const int annoes = _msk->get_date(F_DATAFAT).year();
|
||||||
|
|
||||||
|
|
||||||
if (!controlli_preliminari())
|
if (!controlli_preliminari())
|
||||||
{
|
{
|
||||||
TString str;
|
TString str;
|
||||||
@ -2118,13 +2140,12 @@ void TFatturazione_lav_app::main_loop()
|
|||||||
warning_box(str);
|
warning_box(str);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
_log = new TLog_report("Fatturazione");
|
_log = new TLog_report(TR("Fatturazione"));
|
||||||
|
|
||||||
if (_msk->get_bool(F_SAVEDATA))
|
if (_msk->get_bool(F_SAVEDATA))
|
||||||
{
|
{
|
||||||
TFilename src = firm2dir(-1);
|
TFilename src = firm2dir(-1);
|
||||||
TFilename dst = ini_get_string(CONFIG_DITTA, "lv", "Backup");
|
TFilename dst = ini_get_string(CONFIG_DITTA, "lv", "Backup");
|
||||||
|
|
||||||
copy_tree(src, dst);
|
copy_tree(src, dst);
|
||||||
}
|
}
|
||||||
//leggo i dati di primo interesse
|
//leggo i dati di primo interesse
|
||||||
@ -2143,7 +2164,6 @@ void TFatturazione_lav_app::main_loop()
|
|||||||
if (!dal.ok())
|
if (!dal.ok())
|
||||||
{
|
{
|
||||||
dal.set_day(1);
|
dal.set_day(1);
|
||||||
|
|
||||||
dal.set_month(1);
|
dal.set_month(1);
|
||||||
dal.set_year(year);
|
dal.set_year(year);
|
||||||
}
|
}
|
||||||
@ -2194,7 +2214,7 @@ void TFatturazione_lav_app::main_loop()
|
|||||||
long last_clifo = 0;
|
long last_clifo = 0;
|
||||||
int numdocgen = 0;
|
int numdocgen = 0;
|
||||||
int numdocscart = 0;
|
int numdocscart = 0;
|
||||||
bool space = true;
|
|
||||||
real totimp;
|
real totimp;
|
||||||
real imposta;
|
real imposta;
|
||||||
real totdoc;
|
real totdoc;
|
||||||
@ -2244,7 +2264,7 @@ void TFatturazione_lav_app::main_loop()
|
|||||||
key.format("C|%ld", lastcli);
|
key.format("C|%ld", lastcli);
|
||||||
TString str;
|
TString str;
|
||||||
str << "Cli. " << lastcli << ' ' << cache().get(LF_CLIFO, key, CLI_RICALT) << TR(" non ha generato la fattura pur avendo bolle");
|
str << "Cli. " << lastcli << ' ' << cache().get(LF_CLIFO, key, CLI_RICALT) << TR(" non ha generato la fattura pur avendo bolle");
|
||||||
_log->log(0, str);
|
log(str);
|
||||||
numdocscart++;
|
numdocscart++;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2268,7 +2288,6 @@ void TFatturazione_lav_app::main_loop()
|
|||||||
docsin.destroy(-1);
|
docsin.destroy(-1);
|
||||||
}
|
}
|
||||||
lastcli = clifo;
|
lastcli = clifo;
|
||||||
space = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//preparo la chiave e recupero da CFVEN i dati di quel cliente
|
//preparo la chiave e recupero da CFVEN i dati di quel cliente
|
||||||
@ -2300,12 +2319,9 @@ void TFatturazione_lav_app::main_loop()
|
|||||||
else
|
else
|
||||||
if (!_solototali && elab.is_document_compatible(docrec) && docrec.get(DOC_STATO) < stato_min)
|
if (!_solototali && elab.is_document_compatible(docrec) && docrec.get(DOC_STATO) < stato_min)
|
||||||
{
|
{
|
||||||
if (space)
|
|
||||||
//_log->log(0, "");
|
|
||||||
space = false;
|
|
||||||
TString msg;
|
TString msg;
|
||||||
msg << "Cli. " << clifo << ' ' << clirec.get(CLI_RICALT) << " Bolla n. " << docrec.get(DOC_NDOC) << " del " << docrec.get(DOC_DATADOC) << " in stato " << docrec.get(DOC_STATO);
|
msg << "Cli. " << clifo << ' ' << clirec.get(CLI_RICALT) << " Bolla n. " << docrec.get(DOC_NDOC) << " del " << docrec.get(DOC_DATADOC) << " in stato " << docrec.get(DOC_STATO);
|
||||||
_log->log(0, msg);
|
log(msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
//se ho passato tutti e due i test, allora:
|
//se ho passato tutti e due i test, allora:
|
||||||
@ -2318,7 +2334,7 @@ void TFatturazione_lav_app::main_loop()
|
|||||||
{
|
{
|
||||||
TString msg;
|
TString msg;
|
||||||
msg << TR("Non ci sono contratti in essere per il cliente ") << clifo << " " << clirec.get(CLI_RICALT) << TR(" in data ") << datafat.string();
|
msg << TR("Non ci sono contratti in essere per il cliente ") << clifo << " " << clirec.get(CLI_RICALT) << TR(" in data ") << datafat.string();
|
||||||
_log->log(0, msg);
|
log(msg);
|
||||||
}
|
}
|
||||||
const int contrper = contr.get_int(LVCONDV_PERFAT);
|
const int contrper = contr.get_int(LVCONDV_PERFAT);
|
||||||
|
|
||||||
@ -2415,14 +2431,10 @@ void TFatturazione_lav_app::main_loop()
|
|||||||
}
|
}
|
||||||
if (doc_updated)
|
if (doc_updated)
|
||||||
{
|
{
|
||||||
if (space)
|
|
||||||
//_log->log(0, "");
|
|
||||||
space = false;
|
|
||||||
|
|
||||||
TString msg(" Cli.");
|
TString msg(" Cli.");
|
||||||
msg << clifo << " " << clirec.get(CLI_RICALT) << "Bolla " << docrec.get(DOC_CODNUM) << ' ' << docrec.get(DOC_TIPODOC)
|
msg << clifo << " " << clirec.get(CLI_RICALT) << "Bolla " << docrec.get(DOC_CODNUM) << ' ' << docrec.get(DOC_TIPODOC)
|
||||||
<< ' ' << docrec.get(DOC_NDOC) << " del " << docrec.get(DOC_DATADOC) << " aggiornata la testata ";
|
<< ' ' << docrec.get(DOC_NDOC) << " del " << docrec.get(DOC_DATADOC) << " aggiornata la testata ";
|
||||||
_log->log(0, msg);
|
log(msg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (int r = 1; !_solototali && r <= doc->physical_rows(); r++)
|
for (int r = 1; !_solototali && r <= doc->physical_rows(); r++)
|
||||||
@ -2437,10 +2449,6 @@ void TFatturazione_lav_app::main_loop()
|
|||||||
//estraggo il record corrispondente su LF_CLIFOGIAC
|
//estraggo il record corrispondente su LF_CLIFOGIAC
|
||||||
const TRecmag_lavanderie& rec = art.find_rec(annoes);
|
const TRecmag_lavanderie& rec = art.find_rec(annoes);
|
||||||
|
|
||||||
if (space)
|
|
||||||
//_log->log(0, "");
|
|
||||||
space = false;
|
|
||||||
|
|
||||||
TString str;
|
TString str;
|
||||||
str << "Cli." << clifo << ' ' << clirec.get(CLI_RICALT) << " Bolla " << docrec.get(DOC_CODNUM) << ' ' << docrec.get(DOC_TIPODOC)
|
str << "Cli." << clifo << ' ' << clirec.get(CLI_RICALT) << " Bolla " << docrec.get(DOC_CODNUM) << ' ' << docrec.get(DOC_TIPODOC)
|
||||||
<< ' ' << docrec.get(DOC_NDOC) << " del " << docrec.get(DOC_DATADOC) << " art." << codart << " - ";
|
<< ' ' << docrec.get(DOC_NDOC) << " del " << docrec.get(DOC_DATADOC) << " art." << codart << " - ";
|
||||||
@ -2449,13 +2457,13 @@ void TFatturazione_lav_app::main_loop()
|
|||||||
{
|
{
|
||||||
TString msg;
|
TString msg;
|
||||||
msg << str << " Dot.odier.negativa";
|
msg << str << " Dot.odier.negativa";
|
||||||
_log->log(0, msg);
|
log(msg);
|
||||||
}
|
}
|
||||||
if (rec.get_real("DOTIN") < ZERO)
|
if (rec.get_real("DOTIN") < ZERO)
|
||||||
{
|
{
|
||||||
TString msg;
|
TString msg;
|
||||||
msg << str << " Dot.iniz.negativa";
|
msg << str << " Dot.iniz.negativa";
|
||||||
_log->log(0, msg);
|
log(msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool prezzo_nullo = false;
|
bool prezzo_nullo = false;
|
||||||
@ -2480,7 +2488,7 @@ void TFatturazione_lav_app::main_loop()
|
|||||||
msg << "sul contratto";
|
msg << "sul contratto";
|
||||||
else
|
else
|
||||||
msg << "sulla bolla";
|
msg << "sulla bolla";
|
||||||
_log->log(0, msg);
|
log(msg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2521,10 +2529,6 @@ void TFatturazione_lav_app::main_loop()
|
|||||||
else
|
else
|
||||||
if (!_solototali)
|
if (!_solototali)
|
||||||
{
|
{
|
||||||
if (space)
|
|
||||||
//_log->log(0, "");
|
|
||||||
space = false;
|
|
||||||
|
|
||||||
TString str;
|
TString str;
|
||||||
TToken_string key;
|
TToken_string key;
|
||||||
|
|
||||||
@ -2573,7 +2577,8 @@ void TFatturazione_lav_app::main_loop()
|
|||||||
str.format(" %5d", numdocscart);
|
str.format(" %5d", numdocscart);
|
||||||
_log->log(0, str);
|
_log->log(0, str);
|
||||||
_log->print_or_preview();
|
_log->print_or_preview();
|
||||||
delete _log;
|
|
||||||
|
delete _log; _log = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user