mirror of
https://github.com/invoiceninja/invoiceninja.git
synced 2025-07-09 03:14:30 -04:00
Bug fixes
This commit is contained in:
parent
971e538d0e
commit
3d55dbc05b
@ -20,6 +20,6 @@ MAIL_FROM_ADDRESS
|
|||||||
MAIL_FROM_NAME
|
MAIL_FROM_NAME
|
||||||
MAIL_PASSWORD
|
MAIL_PASSWORD
|
||||||
|
|
||||||
#PHANTOMJS_CLOUD_KEY='a-demo-key-with-low-quota-per-ip-address'
|
PHANTOMJS_CLOUD_KEY='a-demo-key-with-low-quota-per-ip-address'
|
||||||
|
|
||||||
LOG=single
|
LOG=single
|
@ -94,7 +94,7 @@ class AppController extends BaseController
|
|||||||
"MAIL_USERNAME={$mail['username']}\n".
|
"MAIL_USERNAME={$mail['username']}\n".
|
||||||
"MAIL_FROM_NAME={$mail['from']['name']}\n".
|
"MAIL_FROM_NAME={$mail['from']['name']}\n".
|
||||||
"MAIL_PASSWORD={$mail['password']}\n\n".
|
"MAIL_PASSWORD={$mail['password']}\n\n".
|
||||||
"#PHANTOMJS_CLOUD_KEY='a-demo-key-with-low-quota-per-ip-address'";
|
"PHANTOMJS_CLOUD_KEY='a-demo-key-with-low-quota-per-ip-address'";
|
||||||
|
|
||||||
// Write Config Settings
|
// Write Config Settings
|
||||||
$fp = fopen(base_path()."/.env", 'w');
|
$fp = fopen(base_path()."/.env", 'w');
|
||||||
|
@ -165,9 +165,7 @@ class InvoiceController extends BaseController
|
|||||||
} else {
|
} else {
|
||||||
$invoice->invoice_design->javascript = $invoice->invoice_design->pdfmake;
|
$invoice->invoice_design->javascript = $invoice->invoice_design->pdfmake;
|
||||||
}
|
}
|
||||||
|
$contact = $invitation->contact; $contact->setVisible([
|
||||||
$contact = $invitation->contact;
|
|
||||||
$contact->setVisible([
|
|
||||||
'first_name',
|
'first_name',
|
||||||
'last_name',
|
'last_name',
|
||||||
'email',
|
'email',
|
||||||
@ -306,7 +304,6 @@ class InvoiceController extends BaseController
|
|||||||
'entityType' => $entityType,
|
'entityType' => $entityType,
|
||||||
'showBreadcrumbs' => $clone,
|
'showBreadcrumbs' => $clone,
|
||||||
'invoice' => $invoice,
|
'invoice' => $invoice,
|
||||||
'data' => false,
|
|
||||||
'method' => $method,
|
'method' => $method,
|
||||||
'invitationContactIds' => $contactIds,
|
'invitationContactIds' => $contactIds,
|
||||||
'url' => $url,
|
'url' => $url,
|
||||||
@ -349,20 +346,17 @@ class InvoiceController extends BaseController
|
|||||||
|
|
||||||
public function create($clientPublicId = 0, $isRecurring = false)
|
public function create($clientPublicId = 0, $isRecurring = false)
|
||||||
{
|
{
|
||||||
$client = null;
|
$account = Auth::user()->account;
|
||||||
|
$clientId = null;
|
||||||
if ($clientPublicId) {
|
if ($clientPublicId) {
|
||||||
$client = Client::scope($clientPublicId)->firstOrFail();
|
$clientId = Client::getPrivateId($clientPublicId);
|
||||||
}
|
}
|
||||||
|
$entityType = $isRecurring ? ENTITY_RECURRING_INVOICE : ENTITY_INVOICE;
|
||||||
|
$invoice = $account->createInvoice($entityType, $clientId);
|
||||||
|
|
||||||
$invoice = Invoice::createNew();
|
|
||||||
$invoice->client = $client;
|
|
||||||
$invoice->is_recurring = $isRecurring;
|
|
||||||
$invoice->initialize();
|
|
||||||
|
|
||||||
$data = [
|
$data = [
|
||||||
'entityType' => $invoice->getEntityType(),
|
'entityType' => $invoice->getEntityType(),
|
||||||
'invoice' => $invoice,
|
'invoice' => $invoice,
|
||||||
'data' => Input::old('data'),
|
|
||||||
'method' => 'POST',
|
'method' => 'POST',
|
||||||
'url' => 'invoices',
|
'url' => 'invoices',
|
||||||
'title' => trans('texts.new_invoice'),
|
'title' => trans('texts.new_invoice'),
|
||||||
@ -391,6 +385,7 @@ class InvoiceController extends BaseController
|
|||||||
}
|
}
|
||||||
|
|
||||||
return [
|
return [
|
||||||
|
'data' => Input::old('data'),
|
||||||
'account' => Auth::user()->account->load('country'),
|
'account' => Auth::user()->account->load('country'),
|
||||||
'products' => Product::scope()->with('default_tax_rate')->orderBy('id')->get(),
|
'products' => Product::scope()->with('default_tax_rate')->orderBy('id')->get(),
|
||||||
'countries' => Cache::get('countries'),
|
'countries' => Cache::get('countries'),
|
||||||
@ -440,9 +435,8 @@ class InvoiceController extends BaseController
|
|||||||
|
|
||||||
if ($errors = $this->invoiceRepo->getErrors($input->invoice)) {
|
if ($errors = $this->invoiceRepo->getErrors($input->invoice)) {
|
||||||
Session::flash('error', trans('texts.invoice_error'));
|
Session::flash('error', trans('texts.invoice_error'));
|
||||||
|
$url = "{$entityType}s/" . ($publicId ?: 'create');
|
||||||
return Redirect::to("{$entityType}s/create")
|
return Redirect::to($url)->withInput()->withErrors($errors);
|
||||||
->withInput()->withErrors($errors);
|
|
||||||
} else {
|
} else {
|
||||||
$invoice = $this->saveInvoice($publicId, $input, $entityType);
|
$invoice = $this->saveInvoice($publicId, $input, $entityType);
|
||||||
$url = "{$entityType}s/".$invoice->public_id.'/edit';
|
$url = "{$entityType}s/".$invoice->public_id.'/edit';
|
||||||
|
@ -81,15 +81,12 @@ class QuoteController extends BaseController
|
|||||||
return Redirect::to('/invoices/create');
|
return Redirect::to('/invoices/create');
|
||||||
}
|
}
|
||||||
|
|
||||||
$client = null;
|
$account = Auth::user()->account;
|
||||||
|
$clientId = null;
|
||||||
if ($clientPublicId) {
|
if ($clientPublicId) {
|
||||||
$client = Client::scope($clientPublicId)->firstOrFail();
|
$clientId = Client::getPrivateId($clientPublicId);
|
||||||
}
|
}
|
||||||
|
$invoice = $account->createInvoice(ENTITY_QUOTE, $clientId);
|
||||||
$invoice = Invoice::createNew();
|
|
||||||
$invoice->client = $client;
|
|
||||||
$invoice->is_quote = true;
|
|
||||||
$invoice->initialize();
|
|
||||||
|
|
||||||
$data = [
|
$data = [
|
||||||
'entityType' => $invoice->getEntityType(),
|
'entityType' => $invoice->getEntityType(),
|
||||||
|
@ -243,6 +243,38 @@ class Account extends Eloquent
|
|||||||
return $height;
|
return $height;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function createInvoice($entityType, $clientId = null)
|
||||||
|
{
|
||||||
|
$invoice = Invoice::createNew();
|
||||||
|
|
||||||
|
$invoice->invoice_date = Utils::today();
|
||||||
|
$invoice->start_date = Utils::today();
|
||||||
|
$invoice->invoice_design_id = $this->invoice_design_id;
|
||||||
|
$invoice->client_id = $clientId;
|
||||||
|
|
||||||
|
if ($entityType === ENTITY_RECURRING_INVOICE) {
|
||||||
|
$invoice->invoice_number = microtime(true);
|
||||||
|
$invoice->is_recurring = true;
|
||||||
|
} else {
|
||||||
|
if ($entityType == ENTITY_QUOTE) {
|
||||||
|
$invoice->is_quote = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($this->hasClientNumberPattern($invoice) && !$client) {
|
||||||
|
// do nothing, we don't yet know the value
|
||||||
|
} else {
|
||||||
|
$invoice->invoice_number = $this->getNextInvoiceNumber($invoice);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!$clientId) {
|
||||||
|
$invoice->client = Client::createNew();
|
||||||
|
$invoice->client->public_id = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $invoice;
|
||||||
|
}
|
||||||
|
|
||||||
public function hasNumberPattern($isQuote)
|
public function hasNumberPattern($isQuote)
|
||||||
{
|
{
|
||||||
return $isQuote ? ($this->quote_number_pattern ? true : false) : ($this->invoice_number_pattern ? true : false);
|
return $isQuote ? ($this->quote_number_pattern ? true : false) : ($this->invoice_number_pattern ? true : false);
|
||||||
@ -371,13 +403,6 @@ class Account extends Eloquent
|
|||||||
$this->save();
|
$this->save();
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getLocale()
|
|
||||||
{
|
|
||||||
$language = Language::where('id', '=', $this->account->language_id)->first();
|
|
||||||
|
|
||||||
return $language->locale;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function loadLocalizationSettings($client = false)
|
public function loadLocalizationSettings($client = false)
|
||||||
{
|
{
|
||||||
$this->load('timezone', 'date_format', 'datetime_format', 'language');
|
$this->load('timezone', 'date_format', 'datetime_format', 'language');
|
||||||
|
@ -9,14 +9,14 @@ class EntityModel extends Eloquent
|
|||||||
public $timestamps = true;
|
public $timestamps = true;
|
||||||
protected $hidden = ['id'];
|
protected $hidden = ['id'];
|
||||||
|
|
||||||
public static function createNew($parent = false)
|
public static function createNew($context = null)
|
||||||
{
|
{
|
||||||
$className = get_called_class();
|
$className = get_called_class();
|
||||||
$entity = new $className();
|
$entity = new $className();
|
||||||
|
|
||||||
if ($parent) {
|
if ($context) {
|
||||||
$entity->user_id = $parent instanceof User ? $parent->id : $parent->user_id;
|
$entity->user_id = $context instanceof User ? $context->id : $context->user_id;
|
||||||
$entity->account_id = $parent->account_id;
|
$entity->account_id = $context->account_id;
|
||||||
} elseif (Auth::check()) {
|
} elseif (Auth::check()) {
|
||||||
$entity->user_id = Auth::user()->id;
|
$entity->user_id = Auth::user()->id;
|
||||||
$entity->account_id = Auth::user()->account_id;
|
$entity->account_id = Auth::user()->account_id;
|
||||||
|
@ -6,7 +6,10 @@ use Illuminate\Database\Eloquent\SoftDeletes;
|
|||||||
|
|
||||||
class Invoice extends EntityModel
|
class Invoice extends EntityModel
|
||||||
{
|
{
|
||||||
use SoftDeletes;
|
use SoftDeletes {
|
||||||
|
SoftDeletes::trashed as parentTrashed;
|
||||||
|
}
|
||||||
|
|
||||||
protected $dates = ['deleted_at'];
|
protected $dates = ['deleted_at'];
|
||||||
|
|
||||||
protected $casts = [
|
protected $casts = [
|
||||||
@ -23,40 +26,14 @@ class Invoice extends EntityModel
|
|||||||
'year',
|
'year',
|
||||||
'date:',
|
'date:',
|
||||||
];
|
];
|
||||||
|
|
||||||
public function initialize()
|
public function trashed()
|
||||||
{
|
{
|
||||||
$account = $this->account;
|
if ($this->client && $this->client->trashed()) {
|
||||||
|
|
||||||
$this->invoice_date = Utils::today();
|
|
||||||
$this->start_date = Utils::today();
|
|
||||||
$this->invoice_design_id = $account->invoice_design_id;
|
|
||||||
|
|
||||||
if (!$this->invoice_number) {
|
|
||||||
if ($this->is_recurring) {
|
|
||||||
$this->invoice_number = microtime(true);
|
|
||||||
} else {
|
|
||||||
if ($account->hasClientNumberPattern($this) && !$this->client) {
|
|
||||||
// do nothing, we don't yet know the value
|
|
||||||
} else {
|
|
||||||
$this->invoice_number = $account->getNextInvoiceNumber($this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!$this->client) {
|
|
||||||
$this->client = Client::createNew($this);
|
|
||||||
$this->client->public_id = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public function isTrashed()
|
|
||||||
{
|
|
||||||
if ($this->client && $this->client->isTrashed()) {
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
return parent::isTrashed();
|
return self::parentTrashed();
|
||||||
}
|
}
|
||||||
|
|
||||||
public function account()
|
public function account()
|
||||||
|
@ -250,20 +250,17 @@ class InvoiceRepository
|
|||||||
|
|
||||||
public function save($publicId, $data, $entityType)
|
public function save($publicId, $data, $entityType)
|
||||||
{
|
{
|
||||||
|
$account = \Auth::user()->account;
|
||||||
|
|
||||||
if ($publicId) {
|
if ($publicId) {
|
||||||
$invoice = Invoice::scope($publicId)->firstOrFail();
|
$invoice = Invoice::scope($publicId)->firstOrFail();
|
||||||
} else {
|
} else {
|
||||||
$invoice = Invoice::createNew();
|
if ($data['is_recurring']) {
|
||||||
$invoice->client_id = $data['client_id'];
|
$entityType = ENTITY_RECURRING_INVOICE;
|
||||||
$invoice->is_recurring = $data['is_recurring'] ? true : false;
|
|
||||||
if ($entityType == ENTITY_QUOTE) {
|
|
||||||
$invoice->is_quote = true;
|
|
||||||
}
|
}
|
||||||
$invoice->initialize();
|
$invoice = $account->createInvoice($entityType, $data['client_id']);
|
||||||
}
|
}
|
||||||
|
|
||||||
$account = \Auth::user()->account;
|
|
||||||
|
|
||||||
if ((isset($data['set_default_terms']) && $data['set_default_terms'])
|
if ((isset($data['set_default_terms']) && $data['set_default_terms'])
|
||||||
|| (isset($data['set_default_footer']) && $data['set_default_footer'])) {
|
|| (isset($data['set_default_footer']) && $data['set_default_footer'])) {
|
||||||
if (isset($data['set_default_terms']) && $data['set_default_terms']) {
|
if (isset($data['set_default_terms']) && $data['set_default_terms']) {
|
||||||
|
@ -4,6 +4,14 @@
|
|||||||
@parent
|
@parent
|
||||||
|
|
||||||
<script src="{{ asset('js/pdf.built.js') }}" type="text/javascript"></script>
|
<script src="{{ asset('js/pdf.built.js') }}" type="text/javascript"></script>
|
||||||
|
|
||||||
|
<style type="text/css">
|
||||||
|
|
||||||
|
/* the value is auto set so we're removing the bold formatting */
|
||||||
|
label.control-label[for=invoice_number] {
|
||||||
|
font-weight: normal !important;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
@stop
|
@stop
|
||||||
|
|
||||||
@section('content')
|
@section('content')
|
||||||
@ -21,6 +29,7 @@
|
|||||||
|
|
||||||
{!! Former::open($url)->method($method)->addClass('warn-on-exit')->rules(array(
|
{!! Former::open($url)->method($method)->addClass('warn-on-exit')->rules(array(
|
||||||
'client' => 'required',
|
'client' => 'required',
|
||||||
|
'invoice_number' => 'required',
|
||||||
'product_key' => 'max:255'
|
'product_key' => 'max:255'
|
||||||
)) !!}
|
)) !!}
|
||||||
|
|
||||||
@ -34,7 +43,7 @@
|
|||||||
<div class="row" style="min-height:195px" onkeypress="formEnterClick(event)">
|
<div class="row" style="min-height:195px" onkeypress="formEnterClick(event)">
|
||||||
<div class="col-md-4" id="col_1">
|
<div class="col-md-4" id="col_1">
|
||||||
|
|
||||||
@if ($invoice->id)
|
@if ($invoice->id || $data)
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label for="client" class="control-label col-lg-4 col-sm-4">Client</label>
|
<label for="client" class="control-label col-lg-4 col-sm-4">Client</label>
|
||||||
<div class="col-lg-8 col-sm-8">
|
<div class="col-lg-8 col-sm-8">
|
||||||
@ -57,7 +66,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@if ($invoice && $invoice->id)
|
@if ($invoice->id || $data)
|
||||||
</div>
|
</div>
|
||||||
@endif
|
@endif
|
||||||
|
|
||||||
@ -107,9 +116,9 @@
|
|||||||
@if ($entityType == ENTITY_INVOICE)
|
@if ($entityType == ENTITY_INVOICE)
|
||||||
<div class="form-group" style="margin-bottom: 8px">
|
<div class="form-group" style="margin-bottom: 8px">
|
||||||
<div class="col-lg-8 col-sm-8 col-sm-offset-4" style="padding-top: 10px">
|
<div class="col-lg-8 col-sm-8 col-sm-offset-4" style="padding-top: 10px">
|
||||||
@if ($invoice && $invoice->recurring_invoice)
|
@if ($invoice->recurring_invoice)
|
||||||
{!! trans('texts.created_by_invoice', ['invoice' => link_to('/invoices/'.$invoice->recurring_invoice->public_id, trans('texts.recurring_invoice'))]) !!}
|
{!! trans('texts.created_by_invoice', ['invoice' => link_to('/invoices/'.$invoice->recurring_invoice->public_id, trans('texts.recurring_invoice'))]) !!}
|
||||||
@elseif ($invoice)
|
@elseif ($invoice->id)
|
||||||
@if (isset($lastSent) && $lastSent)
|
@if (isset($lastSent) && $lastSent)
|
||||||
{!! trans('texts.last_sent_on', ['date' => link_to('/invoices/'.$lastSent->public_id, $invoice->last_sent_date, ['id' => 'lastSent'])]) !!} <br/>
|
{!! trans('texts.last_sent_on', ['date' => link_to('/invoices/'.$lastSent->public_id, $invoice->last_sent_date, ['id' => 'lastSent'])]) !!} <br/>
|
||||||
@endif
|
@endif
|
||||||
@ -149,7 +158,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="table-responsive">
|
<div class="table-responsive" style="padding-top:4px">
|
||||||
<table class="table invoice-table">
|
<table class="table invoice-table">
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
@ -341,7 +350,7 @@
|
|||||||
{!! Former::text('data')->data_bind("value: ko.mapping.toJSON(model)") !!}
|
{!! Former::text('data')->data_bind("value: ko.mapping.toJSON(model)") !!}
|
||||||
{!! Former::text('pdfupload') !!}
|
{!! Former::text('pdfupload') !!}
|
||||||
|
|
||||||
@if ($invoice && $invoice->id)
|
@if ($invoice->id)
|
||||||
{!! Former::populateField('id', $invoice->public_id) !!}
|
{!! Former::populateField('id', $invoice->public_id) !!}
|
||||||
{!! Former::text('id') !!}
|
{!! Former::text('id') !!}
|
||||||
@endif
|
@endif
|
||||||
@ -361,7 +370,7 @@
|
|||||||
{!! Button::success(trans("texts.save_{$entityType}"))->withAttributes(array('id' => 'saveButton', 'onclick' => 'onSaveClick()'))->appendIcon(Icon::create('floppy-disk')) !!}
|
{!! Button::success(trans("texts.save_{$entityType}"))->withAttributes(array('id' => 'saveButton', 'onclick' => 'onSaveClick()'))->appendIcon(Icon::create('floppy-disk')) !!}
|
||||||
{!! Button::info(trans("texts.email_{$entityType}"))->withAttributes(array('id' => 'emailButton', 'onclick' => 'onEmailClick()'))->appendIcon(Icon::create('send')) !!}
|
{!! Button::info(trans("texts.email_{$entityType}"))->withAttributes(array('id' => 'emailButton', 'onclick' => 'onEmailClick()'))->appendIcon(Icon::create('send')) !!}
|
||||||
|
|
||||||
@if ($invoice && $invoice->id)
|
@if ($invoice->id)
|
||||||
{!! DropdownButton::normal(trans('texts.more_actions'))
|
{!! DropdownButton::normal(trans('texts.more_actions'))
|
||||||
->withContents($actions)
|
->withContents($actions)
|
||||||
->dropup() !!}
|
->dropup() !!}
|
||||||
@ -968,9 +977,12 @@
|
|||||||
if (event.target.type == 'textarea') {
|
if (event.target.type == 'textarea') {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
|
|
||||||
submitAction('');
|
@if($invoice->trashed())
|
||||||
|
return;
|
||||||
|
@endif
|
||||||
|
submitAction('');
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1024,7 +1036,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
function showLearnMore() {
|
function showLearnMore() {
|
||||||
$('#recurringModal').modal('show');
|
$('#recurringModal').modal('show');
|
||||||
}
|
}
|
||||||
|
|
||||||
function setInvoiceNumber(client) {
|
function setInvoiceNumber(client) {
|
||||||
@ -1037,16 +1049,6 @@
|
|||||||
model.invoice().invoice_number(number);
|
model.invoice().invoice_number(number);
|
||||||
}
|
}
|
||||||
|
|
||||||
function padToFour(number) {
|
|
||||||
if (number<=9999) { number = ("000"+number).slice(-4); }
|
|
||||||
return number;
|
|
||||||
}
|
|
||||||
|
|
||||||
function padToThree(number) {
|
|
||||||
if (number<=999) { number = ("00"+number).slice(-3); }
|
|
||||||
return number;
|
|
||||||
}
|
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
@stop
|
@stop
|
@ -203,11 +203,11 @@ function InvoiceModel(data) {
|
|||||||
self.frequency_id = ko.observable(4); // default to monthly
|
self.frequency_id = ko.observable(4); // default to monthly
|
||||||
self.terms = ko.observable('');
|
self.terms = ko.observable('');
|
||||||
self.default_terms = ko.observable(account.invoice_terms);
|
self.default_terms = ko.observable(account.invoice_terms);
|
||||||
self.terms_placeholder = ko.observable({{ !$invoice && $account->invoice_terms ? 'account.invoice_terms' : false}});
|
self.terms_placeholder = ko.observable({{ !$invoice->id && $account->invoice_terms ? 'account.invoice_terms' : false}});
|
||||||
self.set_default_terms = ko.observable(false);
|
self.set_default_terms = ko.observable(false);
|
||||||
self.invoice_footer = ko.observable('');
|
self.invoice_footer = ko.observable('');
|
||||||
self.default_footer = ko.observable(account.invoice_footer);
|
self.default_footer = ko.observable(account.invoice_footer);
|
||||||
self.footer_placeholder = ko.observable({{ !$invoice && $account->invoice_footer ? 'account.invoice_footer' : false}});
|
self.footer_placeholder = ko.observable({{ !$invoice->id && $account->invoice_footer ? 'account.invoice_footer' : false}});
|
||||||
self.set_default_footer = ko.observable(false);
|
self.set_default_footer = ko.observable(false);
|
||||||
self.public_notes = ko.observable('');
|
self.public_notes = ko.observable('');
|
||||||
self.po_number = ko.observable('');
|
self.po_number = ko.observable('');
|
||||||
|
Loading…
x
Reference in New Issue
Block a user