Module FreeShipping mis à jour.
This commit is contained in:
@@ -1,48 +1,162 @@
|
|||||||
|
{assign var="tab" value="export"}
|
||||||
|
{if isset($smarty.get.current_tab)}
|
||||||
|
{assign var="tab" value=$smarty.get.current_tab}
|
||||||
|
{/if}
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-md-12">
|
<div class="col-md-12">
|
||||||
|
|
||||||
<div class="general-block-decorator">
|
<div class="general-block-decorator">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-12">
|
||||||
|
<ul id="tabbed-menu" class="nav nav-tabs">
|
||||||
|
<li class="{if $tab eq "export"}active{/if}"><a data-toggle="tab" href="#export">{intl l="Export" d='freeshipping.ai'}</a> </li>
|
||||||
|
<li class="{if $tab eq "rule"}active{/if}"><a data-toggle="tab" href="#rule">{intl l="Configure FreeShipping rule" d='freeshipping.ai'}</a></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<div class="tab-content">
|
||||||
<div class="table-responsive">
|
<div id="export" class="tab-pane {if $tab eq "export"}active{/if} form-container">
|
||||||
<table class="table table-striped table-condensed table-left-aligned">
|
<div class="panel panel-default">
|
||||||
<caption class="clearfix">
|
<div class="panel-heading clearfix">
|
||||||
{intl l="Free carriage rules"}
|
{intl l="operations" d='freeshipping.ai'}
|
||||||
{loop type="auth" name="can_create" role="ADMIN" module="freeShipping" access="CREATE"}
|
|
||||||
<a class="btn btn-default btn-primary pull-right" title="{intl l='Create a new rule'}" href="#rule_create_dialog" data-toggle="modal">
|
|
||||||
<span class="glyphicon glyphicon-plus"></span>
|
|
||||||
</a>
|
|
||||||
{/loop}
|
|
||||||
</caption>
|
|
||||||
<thead>
|
|
||||||
<tr>
|
|
||||||
<th>{intl l="Area"}</th>
|
|
||||||
<th>{intl l="Amount up to ... (€)"}</th>
|
|
||||||
<th class="actions">{intl l="Actions"}</th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody>
|
|
||||||
{loop name="rules" type="free_shipping"}
|
|
||||||
<tr>
|
|
||||||
<td><a href="{url path="/admin/configuration/shipping_configuration/update/$AREA_ID"}">{$AREA_NAME}</a></td>
|
|
||||||
<td>{$AMOUNT}</td>
|
|
||||||
<td class="actions">
|
|
||||||
<div class="btn-group">
|
|
||||||
{loop type="auth" name="can_change" role="ADMIN" module="freeShipping" access="UPDATE"}
|
|
||||||
<a class="btn btn-default btn-xs" title="{intl l='Edit this rule'}" href="{url path="/admin/module/FreeShipping/update/$ID"}"><span class="glyphicon glyphicon-edit"></span></a>
|
|
||||||
<a class="btn btn-default btn-xs rule-delete" title="{intl l='Delete this rule'}" href="#rule_delete_dialog" data-toggle="modal" data-id="{$ID}"><span class="glyphicon glyphicon-trash"></span></a>
|
|
||||||
{/loop}
|
|
||||||
</div>
|
</div>
|
||||||
</td>
|
<div class="panel-body">
|
||||||
</tr>
|
<button id="check-all-but" title="{intl l="Check all" d='freeshipping.ai'}" class="form-submit-button btn btn-sm btn-default">{intl l="Check all" d='freeshipping.ai'}</button>
|
||||||
{/loop}
|
<button id="uncheck-all-but" title="{intl l="Uncheck all" d='freeshipping.ai'}" class="form-submit-button btn btn-sm btn-default">{intl l="Uncheck all" d='freeshipping.ai'}</button>
|
||||||
</tbody>
|
<button id="reverse-all-but" title="{intl l="Reverse selection" d='freeshipping.ai'}" class="form-submit-button btn btn-sm btn-default">{intl l="Reverse selection" d='freeshipping.ai'}</button>
|
||||||
</table>
|
</div>
|
||||||
|
</div>
|
||||||
|
{form name="freeShipping.export.inet"}
|
||||||
|
<form action="{url path='/admin/module/freeshipping/export'}" method="post">
|
||||||
|
{form_hidden_fields form=$form}
|
||||||
|
<div class="panel panel-default">
|
||||||
|
<div class="panel-heading clearfix">
|
||||||
|
{intl l="Change orders status after export" d='freeshipping.ai'}
|
||||||
|
</div>
|
||||||
|
<div class="panel-body">
|
||||||
|
{form_field form=$form field="new_status_id"}
|
||||||
|
<table>
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<label for="nochange">{intl l="Do not change" d='freeshipping.ai'}</label>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<input type="radio" id="nochange" name="{$name}" value="nochange" {if $data eq "nochange"}checked{/if} />
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<label for="processing">{intl l="Processing" d='freeshipping.ai'}</label>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<input type="radio" id="processing" name="{$name}" value="processing" {if $data eq "processing"}checked{/if} />
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<label for="sent">{intl l="Sent" d='freeshipping.ai'}*</label>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<input type="radio" id="sent" name="{$name}" value="sent" {if $data eq "sent"}checked{/if} />
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
{/form_field}
|
||||||
|
<span class="p">{intl l="*If you choose this option, the exported orders would not be available on this page anymore" d='freeshipping.ai'}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<table class="table table-striped table-condensed">
|
||||||
|
<thead>
|
||||||
|
<th class="object-title">
|
||||||
|
{intl l="REF" d='freeshipping.ai'}
|
||||||
|
</th>
|
||||||
|
<th class="object-title">
|
||||||
|
{intl l="Date" d='freeshipping.ai'}
|
||||||
|
</th>
|
||||||
|
<th class="object-title">
|
||||||
|
{intl l="Total taxed amount" d='freeshipping.ai'}
|
||||||
|
</th>
|
||||||
|
<th class="object-title">
|
||||||
|
{intl l="Export" d='freeshipping.ai'}
|
||||||
|
</th>
|
||||||
|
</thead>
|
||||||
|
|
||||||
|
<tbody>
|
||||||
|
{loop name="order.notsent.freeshipping" type="order.notsent.freeshipping"}
|
||||||
|
{form_field form=$form field="order_"|cat:$ID}
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<label for="{$label_attr.for}">
|
||||||
|
{$label}
|
||||||
|
</label>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
{$CREATE_DATE|date_format}
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
{$TOTAL_TAXED_AMOUNT} {loop name="list.freeshipping.getcurrency" type="currency" id=$CURRENCY}{$SYMBOL}{/loop}
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<input type="checkbox" name="{$name}" id="{$label_attr.for}" value="true" class="form-control"/>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
{/form_field}
|
||||||
|
{/loop}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
<button type="submit" name="export_freeshipping_form" value="stay" class="form-submit-button btn btn-sm btn-default" title="{intl l='Export' d='freeshipping.ai'}">{intl l='Export' d='freeshipping.ai'}</button>
|
||||||
|
</form>
|
||||||
|
{/form}
|
||||||
|
</div>
|
||||||
|
<div id="rule" class="tab-pane {if $tab eq "rule"}active{/if} form-container">
|
||||||
|
<div class="panel panel-default">
|
||||||
|
<div class="panel-heading">
|
||||||
|
{intl l="Configure FreeShipping rule" d='freeshipping.ai'}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="panel-body">
|
||||||
|
<div class="table-responsive">
|
||||||
|
<table class="table table-striped table-condensed table-left-aligned">
|
||||||
|
<caption class="clearfix">
|
||||||
|
{intl l="Free carriage rules"}
|
||||||
|
{loop type="auth" name="can_create" role="ADMIN" module="freeShipping" access="CREATE"}
|
||||||
|
<a class="btn btn-default btn-primary pull-right" title="{intl l='Create a new rule'}" href="#rule_create_dialog" data-toggle="modal">
|
||||||
|
<span class="glyphicon glyphicon-plus"></span>
|
||||||
|
</a>
|
||||||
|
{/loop}
|
||||||
|
</caption>
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>{intl l="Area"}</th>
|
||||||
|
<th>{intl l="Amount up to ... (€)"}</th>
|
||||||
|
<th class="actions">{intl l="Actions"}</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
{loop name="rules" type="free_shipping"}
|
||||||
|
<tr>
|
||||||
|
<td><a href="{url path="/admin/configuration/shipping_configuration/update/$AREA_ID"}">{$AREA_NAME}</a></td>
|
||||||
|
<td>{$AMOUNT}</td>
|
||||||
|
<td class="actions">
|
||||||
|
<div class="btn-group">
|
||||||
|
{loop type="auth" name="can_change" role="ADMIN" module="freeShipping" access="UPDATE"}
|
||||||
|
<a class="btn btn-default btn-xs" title="{intl l='Edit this rule'}" href="{url path="/admin/module/FreeShipping/update/$ID"}"><span class="glyphicon glyphicon-edit"></span></a>
|
||||||
|
<a class="btn btn-default btn-xs rule-delete" title="{intl l='Delete this rule'}" href="#rule_delete_dialog" data-toggle="modal" data-id="{$ID}"><span class="glyphicon glyphicon-trash"></span></a>
|
||||||
|
{/loop}
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
{/loop}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
@@ -6,11 +6,13 @@
|
|||||||
|
|
||||||
<loops>
|
<loops>
|
||||||
<loop name="free_shipping" class="FreeShipping\Loop\FreeShipping" />
|
<loop name="free_shipping" class="FreeShipping\Loop\FreeShipping" />
|
||||||
|
<loop name="order.notsent.freeshipping" class="FreeShipping\Loop\NotSendOrders" />
|
||||||
</loops>
|
</loops>
|
||||||
|
|
||||||
<forms>
|
<forms>
|
||||||
<form name="freeShipping.admin.rule.creation" class="FreeShipping\Form\FreeShippingRuleCreationForm"/>
|
<form name="freeShipping.admin.rule.creation" class="FreeShipping\Form\FreeShippingRuleCreationForm"/>
|
||||||
<form name="freeShipping.admin.rule.modification" class="FreeShipping\Form\FreeShippingRuleModificationForm"/>
|
<form name="freeShipping.admin.rule.modification" class="FreeShipping\Form\FreeShippingRuleModificationForm"/>
|
||||||
|
<form name="freeShipping.export.inet" class="FreeShipping\Form\ExportOrder" />
|
||||||
</forms>
|
</forms>
|
||||||
|
|
||||||
<commands>
|
<commands>
|
||||||
@@ -30,6 +32,11 @@
|
|||||||
<argument type="service" id="service_container"/>
|
<argument type="service" id="service_container"/>
|
||||||
<tag name="kernel.event_subscriber"/>
|
<tag name="kernel.event_subscriber"/>
|
||||||
</service>
|
</service>
|
||||||
|
<service id="freeShipping.mail" class="FreeShipping\EventListener\SendConfirmationEmail" scope="request">
|
||||||
|
<argument type="service" id="thelia.parser" />
|
||||||
|
<argument type="service" id="mailer"/>
|
||||||
|
<tag name="kernel.event_subscriber"/>
|
||||||
|
</service>
|
||||||
</services>
|
</services>
|
||||||
|
|
||||||
</config>
|
</config>
|
||||||
|
|||||||
@@ -7,12 +7,12 @@
|
|||||||
<descriptive locale="fr_FR">
|
<descriptive locale="fr_FR">
|
||||||
<title>Franco de port</title>
|
<title>Franco de port</title>
|
||||||
</descriptive>
|
</descriptive>
|
||||||
<version>1.0.1</version>
|
<version>1.1.3</version>
|
||||||
<author>
|
<author>
|
||||||
<name>Michaël Espeche</name>
|
<name>Michaël Espeche</name>
|
||||||
<email>mespeche@openstudio.fr</email>
|
<email>mespeche@openstudio.fr</email>
|
||||||
</author>
|
</author>
|
||||||
<type>delivery</type>
|
<type>delivery</type>
|
||||||
<thelia>2.1.0</thelia>
|
<thelia>2.1.0</thelia>
|
||||||
<stability>alpha</stability>
|
<stability>prod</stability>
|
||||||
</module>
|
</module>
|
||||||
|
|||||||
@@ -21,4 +21,8 @@
|
|||||||
<default key="_controller">FreeShipping\Controller\Admin\FreeShippingController::processUpdateAction</default>
|
<default key="_controller">FreeShipping\Controller\Admin\FreeShippingController::processUpdateAction</default>
|
||||||
</route>
|
</route>
|
||||||
|
|
||||||
|
<route id="admin.freeshipping.export" path="/admin/module/freeshipping/export" methods="post">
|
||||||
|
<default key="_controller">FreeShipping\Controller\Admin\Export::export</default>
|
||||||
|
</route>
|
||||||
|
|
||||||
</routes>
|
</routes>
|
||||||
@@ -33,6 +33,7 @@ use Propel\Runtime\Exception\PropelException;
|
|||||||
use Thelia\Controller\Admin\AbstractCrudController;
|
use Thelia\Controller\Admin\AbstractCrudController;
|
||||||
use Thelia\Controller\Admin\unknown;
|
use Thelia\Controller\Admin\unknown;
|
||||||
use Thelia\Core\Security\AccessManager;
|
use Thelia\Core\Security\AccessManager;
|
||||||
|
use Thelia\Core\Security\Resource\AdminResources;
|
||||||
use Thelia\Form\Exception\FormValidationException;
|
use Thelia\Form\Exception\FormValidationException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -51,18 +52,18 @@ class FreeShippingController extends AbstractCrudController
|
|||||||
'freeShipping',
|
'freeShipping',
|
||||||
'manual',
|
'manual',
|
||||||
'freeShipping_order',
|
'freeShipping_order',
|
||||||
|
AdminResources::MODULE,
|
||||||
'admin.freeShipping',
|
|
||||||
|
|
||||||
FreeShippingEvents::FREE_SHIPPING_RULE_CREATE,
|
FreeShippingEvents::FREE_SHIPPING_RULE_CREATE,
|
||||||
FreeShippingUpdateEvent::FREE_SHIPPING_RULE_UPDATE,
|
FreeShippingUpdateEvent::FREE_SHIPPING_RULE_UPDATE,
|
||||||
FreeShippingDeleteEvent::FREE_SHIPPING_RULE_DELETE,
|
FreeShippingDeleteEvent::FREE_SHIPPING_RULE_DELETE,
|
||||||
null,
|
null,
|
||||||
null
|
null,
|
||||||
|
'FreeShipping'
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function createRuleAction(){
|
public function createRuleAction()
|
||||||
|
{
|
||||||
|
|
||||||
if (null !== $response = $this->checkAuth(array(), array('FreeShipping'), AccessManager::CREATE)) {
|
if (null !== $response = $this->checkAuth(array(), array('FreeShipping'), AccessManager::CREATE)) {
|
||||||
return $response;
|
return $response;
|
||||||
@@ -301,4 +302,4 @@ class FreeShippingController extends AbstractCrudController
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,9 +25,15 @@ namespace FreeShipping;
|
|||||||
|
|
||||||
use FreeShipping\Model\Base\FreeShippingQuery;
|
use FreeShipping\Model\Base\FreeShippingQuery;
|
||||||
use Propel\Runtime\Connection\ConnectionInterface;
|
use Propel\Runtime\Connection\ConnectionInterface;
|
||||||
|
use Thelia\Core\Translation\Translator;
|
||||||
use Thelia\Install\Database;
|
use Thelia\Install\Database;
|
||||||
use Thelia\Model\AreaQuery;
|
use Thelia\Model\AreaQuery;
|
||||||
use Thelia\Model\Country;
|
use Thelia\Model\Country;
|
||||||
|
use Thelia\Model\Lang;
|
||||||
|
use Thelia\Model\LangQuery;
|
||||||
|
use Thelia\Model\Message;
|
||||||
|
use Thelia\Model\MessageQuery;
|
||||||
|
use Thelia\Model\ModuleQuery;
|
||||||
use Thelia\Module\AbstractDeliveryModule;
|
use Thelia\Module\AbstractDeliveryModule;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -36,13 +42,64 @@ use Thelia\Module\AbstractDeliveryModule;
|
|||||||
*/
|
*/
|
||||||
class FreeShipping extends AbstractDeliveryModule
|
class FreeShipping extends AbstractDeliveryModule
|
||||||
{
|
{
|
||||||
|
/** The module domain for internationalisation */
|
||||||
|
const MODULE_DOMAIN = "freeshipping";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The confirmation message identifier
|
||||||
|
*/
|
||||||
|
const MESSAGE_SEND_CONFIRMATION = "send_comfirmation_freeshipping";
|
||||||
|
|
||||||
|
/** @var Translator $translator */
|
||||||
|
protected $translator;
|
||||||
|
|
||||||
|
protected function trans($id, $locale, $parameters = [])
|
||||||
|
{
|
||||||
|
if ($this->translator === null) {
|
||||||
|
$this->translator = Translator::getInstance();
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->translator->trans($id, $parameters, self::MODULE_DOMAIN, $locale);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param ConnectionInterface $con
|
* @param ConnectionInterface $con
|
||||||
*/
|
*/
|
||||||
public function postActivation(ConnectionInterface $con = null)
|
public function postActivation(ConnectionInterface $con = null)
|
||||||
{
|
{
|
||||||
$database = new Database($con->getWrappedConnection());
|
$database = new Database($con->getWrappedConnection());
|
||||||
$database->insertSql(null, [ __DIR__.DS.'Config'.DS.'thelia.sql' ]);
|
$database->insertSql(null, [__DIR__ . DS . 'Config' . DS . 'thelia.sql']);
|
||||||
|
|
||||||
|
|
||||||
|
$languages = LangQuery::create()->find();
|
||||||
|
|
||||||
|
if (null === MessageQuery::create()->findOneByName(self::MESSAGE_SEND_CONFIRMATION)) {
|
||||||
|
$message = new Message();
|
||||||
|
$message
|
||||||
|
->setName(self::MESSAGE_SEND_CONFIRMATION)
|
||||||
|
->setHtmlLayoutFileName('')
|
||||||
|
->setHtmlTemplateFileName(self::MESSAGE_SEND_CONFIRMATION.'.html')
|
||||||
|
->setTextLayoutFileName('')
|
||||||
|
->setTextTemplateFileName(self::MESSAGE_SEND_CONFIRMATION.'.txt')
|
||||||
|
;
|
||||||
|
|
||||||
|
foreach ($languages as $language) {
|
||||||
|
/** @var Lang $language */
|
||||||
|
$locale = $language->getLocale();
|
||||||
|
|
||||||
|
$message->setLocale($locale);
|
||||||
|
|
||||||
|
$message->setTitle(
|
||||||
|
$this->trans('Order send confirmation', $locale)
|
||||||
|
);
|
||||||
|
|
||||||
|
$message->setSubject(
|
||||||
|
$this->trans('Order send confirmation', $locale)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
$message->save();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -85,12 +142,14 @@ class FreeShipping extends AbstractDeliveryModule
|
|||||||
$areaId = $country->getAreaId();
|
$areaId = $country->getAreaId();
|
||||||
|
|
||||||
$area = FreeShippingQuery::create()->findOneByAreaId($areaId);
|
$area = FreeShippingQuery::create()->findOneByAreaId($areaId);
|
||||||
$maxAmount = $area->getAmount();
|
if (isset($area)) {
|
||||||
|
$maxAmount = $area->getAmount();
|
||||||
|
|
||||||
if ($amount >= $maxAmount) {
|
if ($amount >= $maxAmount) {
|
||||||
return true;
|
return true;
|
||||||
} else {
|
}
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,15 +2,17 @@
|
|||||||
|
|
||||||
This module is used to offer shipping from a minimum amount on a specific shipping zone.
|
This module is used to offer shipping from a minimum amount on a specific shipping zone.
|
||||||
|
|
||||||
## How to install
|
### Manually
|
||||||
|
|
||||||
This module must be into your ```modules/``` directory (thelia/local/modules/).
|
* Copy the module into ```<thelia_root>/local/modules/``` directory and be sure that the name of the module is ```FreeShipping```.
|
||||||
|
* Activate it in your thelia administration panel
|
||||||
|
|
||||||
You can download the .zip file of this module or create a git submodule into your project like this :
|
### Composer
|
||||||
|
|
||||||
|
Add it in your main thelia composer.json file
|
||||||
|
|
||||||
```
|
```
|
||||||
cd /path-to-thelia
|
composer require thelia/free-shipping-module:~1.1.0
|
||||||
git submodule add https://github.com/thelia-modules/FreeShipping.git local/modules/FreeShipping
|
|
||||||
```
|
```
|
||||||
|
|
||||||
Next, go to your Thelia admin panel for module activation.
|
Next, go to your Thelia admin panel for module activation.
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
{extends file="admin-layout.tpl"}
|
{extends file="admin-layout.tpl"}
|
||||||
|
|
||||||
{block name="check-resource"}admin.freeShipping{/block}
|
|
||||||
{block name="check-access"}update{/block}
|
{block name="check-access"}update{/block}
|
||||||
|
|
||||||
{block name="page-title"}{intl l='Edit free shipping rule'}{/block}
|
{block name="page-title"}{intl l='Edit free shipping rule'}{/block}
|
||||||
@@ -67,4 +66,4 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{/block}
|
{/block}
|
||||||
|
|||||||
Reference in New Issue
Block a user