Patch level : 10.0 patch 414
Files correlati : lv2 Ricompilazione Demo : [ ] Commento : Aggiunta la gestione del ritiro automatico della dotazione temporanea git-svn-id: svn://10.65.10.50/trunk@19225 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
parent
19378ae935
commit
e5f88c409a
334
lv/lv2400.cpp
334
lv/lv2400.cpp
@ -4,6 +4,7 @@
|
|||||||
#include <reprint.h>
|
#include <reprint.h>
|
||||||
|
|
||||||
#include "lvlib.h"
|
#include "lvlib.h"
|
||||||
|
#include "../mg/clifogiac.h"
|
||||||
#include "../ve/velib.h"
|
#include "../ve/velib.h"
|
||||||
#include "../ve/rcondv.h"
|
#include "../ve/rcondv.h"
|
||||||
|
|
||||||
@ -201,20 +202,22 @@ bool TGenera_documenti_app::crea_documento(const TISAM_recordset& plan, TLog_rep
|
|||||||
doc.put("DATAPRCO", dtcons);
|
doc.put("DATAPRCO", dtcons);
|
||||||
|
|
||||||
const long ndoc = doc.get_long(DOC_NDOC);
|
const long ndoc = doc.get_long(DOC_NDOC);
|
||||||
|
|
||||||
//preparo la chiave per la tabella righe contratti
|
|
||||||
TToken_string keyrcont;
|
|
||||||
keycont.add(codcli);
|
|
||||||
keycont.add(codcont);
|
|
||||||
|
|
||||||
FOR_EACH_ASSOC_OBJECT(_quantita,h,codart,obj)
|
FOR_EACH_ASSOC_OBJECT(_quantita,h,codart,obj)
|
||||||
{
|
{
|
||||||
crea_riga(codart, modpas, tplis, false, prinbo, doc, rep);
|
//preparo la chiave per la tabella righe contratti
|
||||||
|
TToken_string keyrcont;
|
||||||
|
keyrcont.add(codcli);
|
||||||
|
keyrcont.add(codcont);
|
||||||
|
keyrcont.add(codart);
|
||||||
|
const TRectype& rcont = cache().get(LF_LVRCONDV, keyrcont);
|
||||||
|
const TDate dadata = (TDate)rcont.get(LVRCONDV_INDTTMP);
|
||||||
|
const TDate adata = (TDate)rcont.get(LVRCONDV_FIDTTMP);
|
||||||
|
|
||||||
/*const TDate dadata = rcont.get(LVRCONDV_INDTTMP).as_date();
|
if (dadata.ok() && dtcons == adata)
|
||||||
const TDate adata = rcont.get(LVRCONDV_FIDTTMP).as_date();
|
crea_riga(codart, modpas, tplis, true, prinbo, doc, rep);
|
||||||
if (dadata.ok() && dtcons >= dadata && dtcons <= adata)
|
else
|
||||||
crea_riga(rcont, modpas, true, doc);*/
|
crea_riga(codart, modpas, tplis, false, prinbo, doc, rep);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (doc.rows() > 0)
|
if (doc.rows() > 0)
|
||||||
@ -238,8 +241,7 @@ bool TGenera_documenti_app::crea_documento(const TISAM_recordset& plan, TLog_rep
|
|||||||
//CREA_RIGA: questa funzione crea una riga merce per una bolla di consegna
|
//CREA_RIGA: questa funzione crea una riga merce per una bolla di consegna
|
||||||
void TGenera_documenti_app::crea_riga(const TString& codart, const char modpas, const int tplis, const bool tmp, const bool prinbo, TDocumento& doc, TLog_report& rep)
|
void TGenera_documenti_app::crea_riga(const TString& codart, const char modpas, const int tplis, const bool tmp, const bool prinbo, TDocumento& doc, TLog_report& rep)
|
||||||
{
|
{
|
||||||
const int perarr = _configlv->get_int("Perarr");
|
const int perarr = ini_get_int(CONFIG_DITTA, "lv", "Perarr");
|
||||||
|
|
||||||
//creo la nuova riga
|
//creo la nuova riga
|
||||||
TString4 tiporiga;
|
TString4 tiporiga;
|
||||||
switch (_buono)
|
switch (_buono)
|
||||||
@ -249,8 +251,6 @@ void TGenera_documenti_app::crea_riga(const TString& codart, const char modpas,
|
|||||||
default: break;
|
default: break;
|
||||||
}
|
}
|
||||||
|
|
||||||
TRiga_documento& rdoc = doc.new_row(tiporiga);
|
|
||||||
|
|
||||||
const long codcli = doc.get_long(DOC_CODCF);
|
const long codcli = doc.get_long(DOC_CODCF);
|
||||||
const long codcont = doc.get_long(DOC_CODCONT);
|
const long codcont = doc.get_long(DOC_CODCONT);
|
||||||
|
|
||||||
@ -272,7 +272,7 @@ void TGenera_documenti_app::crea_riga(const TString& codart, const char modpas,
|
|||||||
arrot = false;
|
arrot = false;
|
||||||
|
|
||||||
const real conguaglio = rcont.get_real(LVRCONDV_QTACONG);
|
const real conguaglio = rcont.get_real(LVRCONDV_QTACONG);
|
||||||
const real& qta = *(real*)_quantita.objptr(codart);
|
real& qta = *(real*)_quantita.objptr(codart);
|
||||||
const real& qta1 = *(real*)_quantita_ritirata.objptr(codart);
|
const real& qta1 = *(real*)_quantita_ritirata.objptr(codart);
|
||||||
|
|
||||||
//instanzio una cache sulla tabella del magazzino
|
//instanzio una cache sulla tabella del magazzino
|
||||||
@ -280,138 +280,198 @@ void TGenera_documenti_app::crea_riga(const TString& codart, const char modpas,
|
|||||||
//recupero i dati di interesse dall'anagrafica di magazzino
|
//recupero i dati di interesse dall'anagrafica di magazzino
|
||||||
const real ppconf = anamag.get_real(ANAMAG_PPCONF);
|
const real ppconf = anamag.get_real(ANAMAG_PPCONF);
|
||||||
|
|
||||||
const real quantita_noarr = qta - conguaglio;
|
//GESTIONE DOTAZIONE TEMPOARANEA
|
||||||
real quantita_arr = quantita_noarr > ZERO ? quantita_noarr : ZERO;
|
if (tmp && rcont.get_bool(LVRCONDV_RITAUDTTMP))
|
||||||
//se devo arrotondare
|
|
||||||
if (quantita_arr > ZERO && arrot)
|
|
||||||
{
|
{
|
||||||
//calcolo di quanti pezzi sforo
|
TRiga_documento& rdoc = doc.new_row(tiporiga);
|
||||||
long arr = quantita_arr.integer() % ppconf.integer();
|
rdoc.put(RDOC_CODART,codart);
|
||||||
//se sforo (arr > 0) allora calcolo quanti pezzi in più gli devo dare e aggiorno la quantità
|
rdoc.put(RDOC_CODARTMAG,codart);
|
||||||
if (arr > 0)
|
rdoc.put(RDOC_CHECKED,'X');
|
||||||
if (arr > ppconf.integer() * perarr / 100) //arr <= ppconf*perarr/100 -> formula calcolo congualgio di Tassan
|
|
||||||
{
|
if (prinbo)
|
||||||
arr = ppconf.integer() - arr;
|
rdoc.put(RDOC_PREZZO,rcont.get_real(LVRCONDV_PRZDTTMP)); //prezzo
|
||||||
quantita_arr += arr;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
quantita_arr -= arr;
|
|
||||||
}
|
|
||||||
|
|
||||||
//scrivo le quantità
|
//recupero i valori delle dotazione temporanea dal magazzino del cliente
|
||||||
rdoc.put(RDOC_QTA, quantita_arr); //quantità consegnata eventualmente arrotondata
|
TLocalisamfile magcli(LF_CLIFOGIAC);
|
||||||
rdoc.put(RDOC_QTAGG1, qta1); //quantità ritirata
|
magcli.put(CLIFOGIAC_ANNOES, doc.get_date(DOC_DATADOC).year());
|
||||||
rdoc.put(RDOC_QTAGG2, conguaglio); //conguaglio
|
magcli.put(CLIFOGIAC_TIPOCF, 'C');
|
||||||
rdoc.put(RDOC_QTAGG3, quantita_arr); //copia della quantità consegnata
|
magcli.put(CLIFOGIAC_CODCF, codcli);
|
||||||
rdoc.put(RDOC_QTAGG4, quantita_noarr); //quantità che avrei consegnato se non arrotondavo (qta ritirata)
|
magcli.put(CLIFOGIAC_INDSPED, 0); //in realtà è da leggere dal contratto
|
||||||
rdoc.put(RDOC_GENERATA, true);
|
magcli.put(CLIFOGIAC_CODART, codart);
|
||||||
|
magcli.put(CLIFOGIAC_NRIGA, 1);
|
||||||
|
//leggo il record corrispondente
|
||||||
|
magcli.read();
|
||||||
|
long dottmp = magcli.get_long(CLIFOGIAC_DOTTM);
|
||||||
|
|
||||||
const TString4 causale = ini_get_string(CONFIG_DITTA, "lv", "CAUSLAV");
|
//se ho ritirato un quantitativo di roba maggiore o uguale alla dotazione temporanea
|
||||||
rdoc.put(RDOC_CODAGG1, causale); //causale presa dalla configurazione
|
//allora creo la nuova riga documento e azzero la dottmp; altrimenti preparo la riga
|
||||||
|
//per la quantità che ho ritirato e tengo traccia della cosa
|
||||||
//aggiorno il conguaglio sulla riga del contratto
|
if (qta >= dottmp)
|
||||||
if (!rcont.empty())
|
|
||||||
aggiorna_conguaglio((TRectype&)rcont, quantita_arr - quantita_noarr);
|
|
||||||
|
|
||||||
//elaborazione sul prezzo da utilizzare
|
|
||||||
real prezzo;
|
|
||||||
|
|
||||||
if (rcont.empty())
|
|
||||||
{
|
|
||||||
//PROPONI PREZZO
|
|
||||||
TToken_string key;
|
|
||||||
key.add('C');
|
|
||||||
key.add(codcli);
|
|
||||||
const TRectype& cfven = cache().get(LF_CFVEN, key);
|
|
||||||
|
|
||||||
bool trvlst = false;
|
|
||||||
|
|
||||||
if (!cfven.empty())
|
|
||||||
{
|
{
|
||||||
//se è settata la categoria merceologica, leggo sia il listino che la cat merc, altrimenti solo il listino
|
qta -= dottmp;
|
||||||
TString8 codlis = cfven.get(CFV_CODLIST);
|
rdoc.put(RDOC_QTAGG1, dottmp); //quantità ritirata
|
||||||
TString8 catven;
|
rdoc.put(RDOC_GENERATA, true);
|
||||||
TConfig* configve = new TConfig(CONFIG_DITTA,"ve");
|
rdoc.put(RDOC_CODAGG1, ini_get_string(CONFIG_DITTA, "lv", "CAULVRITDT"));
|
||||||
const char gesliscv = configve->get_char("GESLISCV");
|
dottmp = 0;
|
||||||
if (gesliscv != 'X')
|
|
||||||
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'è 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);
|
|
||||||
prezzo = umart.get_real(UMART_PREZZO);
|
|
||||||
if (umart.get(UMART_PREZZO).full())
|
|
||||||
trvlst = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
//elaborazione per il prezzo: o lo prendo dalle righe contratto, o dall'anagrafica magazzino
|
|
||||||
if (tplis == 0)
|
|
||||||
prezzo = rcont.get_real(LVRCONDV_PREZZO);
|
|
||||||
else
|
else
|
||||||
prezzo = anamag.get_real(ANAMAG_COSTSTD);
|
{
|
||||||
|
dottmp -= qta.integer();
|
||||||
|
rdoc.put(RDOC_QTAGG1, qta); //quantità ritirata
|
||||||
|
rdoc.put(RDOC_GENERATA, true);
|
||||||
|
rdoc.put(RDOC_CODAGG1, ini_get_string(CONFIG_DITTA, "lv", "CAULVRITDT"));
|
||||||
|
TString str;
|
||||||
|
str << "L'articolo " << codart << " inserito nel documento " << doc.get(DOC_CODNUM) << "-" << doc.get(DOC_TIPODOC)
|
||||||
|
<< " numero " << doc.get(DOC_NDOC) << " in dotazione temporanea non è stato ritirato completamente."
|
||||||
|
<< " Mancano " << dottmp << "unità";
|
||||||
|
rep.log(1, str);
|
||||||
|
qta = ZERO;
|
||||||
|
}
|
||||||
|
|
||||||
|
//riscrivo la dotazione temporanea aggiornata
|
||||||
|
magcli.put(CLIFOGIAC_ANNOES, doc.get_date(DOC_DATADOC).year());
|
||||||
|
magcli.put(CLIFOGIAC_TIPOCF, 'C');
|
||||||
|
magcli.put(CLIFOGIAC_CODCF, codcli);
|
||||||
|
magcli.put(CLIFOGIAC_INDSPED, 0); //in realtà è da leggere dal contratto
|
||||||
|
magcli.put(CLIFOGIAC_CODART, codart);
|
||||||
|
magcli.put(CLIFOGIAC_NRIGA, 1);
|
||||||
|
magcli.put(CLIFOGIAC_DOTTM, dottmp);
|
||||||
|
magcli.rewrite();
|
||||||
}
|
}
|
||||||
|
|
||||||
rdoc.put(RDOC_CODART,codart);
|
if (qta > ZERO)
|
||||||
rdoc.put(RDOC_CODARTMAG,codart);
|
|
||||||
rdoc.put(RDOC_CHECKED,'X');
|
|
||||||
if (prinbo)
|
|
||||||
{
|
{
|
||||||
if (!tmp)
|
TRiga_documento& rdoc = doc.new_row(tiporiga);
|
||||||
rdoc.put(RDOC_PREZZO, prezzo);
|
|
||||||
else //per adesso per questo ramo non ci passa mai, perchè non sappiamo come gestire le dotazioni temporanee
|
const real quantita_noarr = qta - conguaglio;
|
||||||
rdoc.put(RDOC_PREZZO,rcont.get_real(LVRCONDV_PRZDTTMP));
|
real quantita_arr = quantita_noarr > ZERO ? quantita_noarr : ZERO;
|
||||||
rdoc.put(RDOC_SCONTO,rcont.get(LVRCONDV_SCONTPERC)); //sconto
|
//se devo arrotondare
|
||||||
|
if (quantita_arr > ZERO && arrot)
|
||||||
|
{
|
||||||
|
//calcolo di quanti pezzi sforo
|
||||||
|
long arr = quantita_arr.integer() % ppconf.integer();
|
||||||
|
//se sforo (arr > 0) allora calcolo quanti pezzi in più gli devo dare e aggiorno la quantità
|
||||||
|
if (arr > 0)
|
||||||
|
if (arr > ppconf.integer() * perarr / 100) //arr <= ppconf*perarr/100 -> formula calcolo congualgio di Tassan
|
||||||
|
{
|
||||||
|
arr = ppconf.integer() - arr;
|
||||||
|
quantita_arr += arr;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
quantita_arr -= arr;
|
||||||
|
}
|
||||||
|
|
||||||
|
//scrivo le quantità
|
||||||
|
rdoc.put(RDOC_QTA, quantita_arr); //quantità consegnata eventualmente arrotondata
|
||||||
|
rdoc.put(RDOC_QTAGG1, qta1); //quantità ritirata
|
||||||
|
rdoc.put(RDOC_QTAGG2, conguaglio); //conguaglio
|
||||||
|
rdoc.put(RDOC_QTAGG3, quantita_arr); //copia della quantità consegnata
|
||||||
|
rdoc.put(RDOC_QTAGG4, quantita_noarr); //quantità che avrei consegnato se non arrotondavo (qta ritirata)
|
||||||
|
rdoc.put(RDOC_GENERATA, true);
|
||||||
|
|
||||||
|
rdoc.put(RDOC_CODAGG1, ini_get_string(CONFIG_DITTA, "lv", "CAUSLAV")); //causale presa dalla configurazione
|
||||||
|
|
||||||
|
//aggiorno il conguaglio sulla riga del contratto
|
||||||
|
if (!rcont.empty())
|
||||||
|
aggiorna_conguaglio((TRectype&)rcont, quantita_arr - quantita_noarr);
|
||||||
|
|
||||||
|
//elaborazione sul prezzo da utilizzare
|
||||||
|
real prezzo;
|
||||||
|
|
||||||
|
if (rcont.empty())
|
||||||
|
{
|
||||||
|
//PROPONI PREZZO
|
||||||
|
TToken_string key;
|
||||||
|
key.add('C');
|
||||||
|
key.add(codcli);
|
||||||
|
const TRectype& cfven = cache().get(LF_CFVEN, key);
|
||||||
|
|
||||||
|
bool trvlst = false;
|
||||||
|
|
||||||
|
if (!cfven.empty())
|
||||||
|
{
|
||||||
|
//se è settata la categoria merceologica, leggo sia il listino che la cat merc, altrimenti solo il listino
|
||||||
|
TString8 codlis = cfven.get(CFV_CODLIST);
|
||||||
|
TString8 catven;
|
||||||
|
TConfig* configve = new TConfig(CONFIG_DITTA,"ve");
|
||||||
|
const char gesliscv = configve->get_char("GESLISCV");
|
||||||
|
if (gesliscv != 'X')
|
||||||
|
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'è 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);
|
||||||
|
prezzo = umart.get_real(UMART_PREZZO);
|
||||||
|
if (umart.get(UMART_PREZZO).full())
|
||||||
|
trvlst = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//elaborazione per il prezzo: o lo prendo dalle righe contratto, o dall'anagrafica magazzino
|
||||||
|
if (tplis == 0)
|
||||||
|
prezzo = rcont.get_real(LVRCONDV_PREZZO);
|
||||||
|
else
|
||||||
|
prezzo = anamag.get_real(ANAMAG_COSTSTD);
|
||||||
|
}
|
||||||
|
|
||||||
|
rdoc.put(RDOC_CODART,codart);
|
||||||
|
rdoc.put(RDOC_CODARTMAG,codart);
|
||||||
|
rdoc.put(RDOC_CHECKED,'X');
|
||||||
|
if (prinbo)
|
||||||
|
{
|
||||||
|
if (!tmp)
|
||||||
|
rdoc.put(RDOC_PREZZO, prezzo);
|
||||||
|
else //per adesso per questo ramo non ci passa mai, perchè non sappiamo come gestire le dotazioni temporanee
|
||||||
|
rdoc.put(RDOC_PREZZO,rcont.get_real(LVRCONDV_PRZDTTMP));
|
||||||
|
rdoc.put(RDOC_SCONTO,rcont.get(LVRCONDV_SCONTPERC)); //sconto
|
||||||
|
}
|
||||||
|
|
||||||
|
//scrivo il magazzino
|
||||||
|
TString8 magazzino;
|
||||||
|
TString8 magazzinoc;
|
||||||
|
|
||||||
|
magazzino << ini_get_string(CONFIG_DITTA, "lv", "CODMAG") << ini_get_string(CONFIG_DITTA, "lv", "CODMAGN");
|
||||||
|
magazzinoc << ini_get_string(CONFIG_DITTA, "lv", "CODMAG") << ini_get_string(CONFIG_DITTA, "lv", "CODMAGC");
|
||||||
|
|
||||||
|
rdoc.put(RDOC_CODMAG, magazzino);
|
||||||
|
rdoc.put(RDOC_CODMAGC, magazzinoc);
|
||||||
|
|
||||||
|
//se il record di riga contratto è vuoto aggiorno il log
|
||||||
|
if (rcont.empty())
|
||||||
|
{
|
||||||
|
TString str;
|
||||||
|
str << "L'articolo " << codart << " inserito nel documento " << doc.get(DOC_CODNUM) << "-" << doc.get(DOC_TIPODOC)
|
||||||
|
<< " numero " << doc.get(DOC_NDOC) << " per la quantità di " << quantita_arr << " unità"
|
||||||
|
<< " non è prsente sul contratto del cliente " << codcli;
|
||||||
|
rep.log(1, str);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//scrivo il magazzino
|
|
||||||
TString8 magazzino;
|
|
||||||
TString8 magazzinoc;
|
|
||||||
|
|
||||||
magazzino << ini_get_string(CONFIG_DITTA, "lv", "CODMAG") << ini_get_string(CONFIG_DITTA, "lv", "CODMAGN");
|
|
||||||
magazzinoc << ini_get_string(CONFIG_DITTA, "lv", "CODMAG") << ini_get_string(CONFIG_DITTA, "lv", "CODMAGC");
|
|
||||||
|
|
||||||
rdoc.put(RDOC_CODMAG, magazzino);
|
|
||||||
rdoc.put(RDOC_CODMAGC, magazzinoc);
|
|
||||||
|
|
||||||
//se il record di riga contratto è vuoto aggiorno il log
|
|
||||||
if (rcont.empty())
|
|
||||||
{
|
|
||||||
TString str;
|
|
||||||
str << "L'articolo " << codart << " inserito nel documento " << doc.get(DOC_CODNUM) << "-" << doc.get(DOC_TIPODOC)
|
|
||||||
<< " numero " << doc.get(DOC_NDOC) << " per la quantità di " << quantita_arr << " unità"
|
|
||||||
<< " non è prsente sul contratto del cliente " << codcli;
|
|
||||||
rep.log(1, str);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////
|
||||||
|
Loading…
x
Reference in New Issue
Block a user