mirror of
https://github.com/invoiceninja/invoiceninja.git
synced 2025-06-23 20:00:33 -04:00
Merge pull request #8931 from turbo124/v5-develop
Updates for user filters
This commit is contained in:
commit
31556cd9f1
@ -130,4 +130,50 @@ class UserFilters extends QueryFilters
|
|||||||
$query->whereNotIn('id', $user_array);
|
$query->whereNotIn('id', $user_array);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Filters the list based on the status
|
||||||
|
* archived, active, deleted.
|
||||||
|
*
|
||||||
|
* @param string $filter
|
||||||
|
* @return Builder
|
||||||
|
*/
|
||||||
|
public function status(string $filter = ''): Builder
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
if (strlen($filter) == 0) {
|
||||||
|
return $this->builder;
|
||||||
|
}
|
||||||
|
|
||||||
|
$filters = explode(',', $filter);
|
||||||
|
|
||||||
|
return $this->builder->where(function ($query) use ($filters) {
|
||||||
|
|
||||||
|
/** @var \App\Models\User $user */
|
||||||
|
$user = auth()->user();
|
||||||
|
|
||||||
|
if (in_array(self::STATUS_ACTIVE, $filters)) {
|
||||||
|
$query = $query->orWhereHas('company_users', function ($q) use($user){
|
||||||
|
$q->where('company_id', $user->company()->id)->whereNull('deleted_at');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (in_array(self::STATUS_ARCHIVED, $filters)) {
|
||||||
|
$query = $query->orWhereHas('company_users', function ($q) use($user){
|
||||||
|
$q->where('company_id', $user->company()->id)->whereNotNull('deleted_at')->where('is_deleted', 0);
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if (in_array(self::STATUS_DELETED, $filters)) {
|
||||||
|
$query = $query->orWhereHas('company_users', function ($q) use($user){
|
||||||
|
$q->where('company_id', $user->company()->id)->where('is_deleted', 1);
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -166,7 +166,7 @@ class SwissQrGenerator
|
|||||||
|
|
||||||
// Now get the QR code image and save it as a file.
|
// Now get the QR code image and save it as a file.
|
||||||
try {
|
try {
|
||||||
$output = new QrBill\PaymentPart\Output\HtmlOutput\HtmlOutput($qrBill, $this->client->locale() ?: 'en');
|
$output = new QrBill\PaymentPart\Output\HtmlOutput\HtmlOutput($qrBill, $this->resolveLanguage());
|
||||||
|
|
||||||
$html = $output
|
$html = $output
|
||||||
->setPrintable(false)
|
->setPrintable(false)
|
||||||
@ -190,4 +190,28 @@ class SwissQrGenerator
|
|||||||
// return $e->getMessage();
|
// return $e->getMessage();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private function resolveLanguage(): string
|
||||||
|
{
|
||||||
|
$language = $this->client->locale() ?: 'en';
|
||||||
|
|
||||||
|
switch ($language) {
|
||||||
|
case 'de':
|
||||||
|
return 'de';
|
||||||
|
case 'en':
|
||||||
|
case 'en_GB':
|
||||||
|
return 'en';
|
||||||
|
case 'it':
|
||||||
|
return 'it';
|
||||||
|
case 'fr':
|
||||||
|
case 'fr_CA':
|
||||||
|
case 'fr_CH':
|
||||||
|
return 'fr';
|
||||||
|
|
||||||
|
default:
|
||||||
|
return 'en';
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -493,8 +493,9 @@ class InvoiceController extends BaseController
|
|||||||
return response(['message' => 'Please verify your account to send emails.'], 400);
|
return response(['message' => 'Please verify your account to send emails.'], 400);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**@var \App\Models\User $user */
|
if (Ninja::isHosted() && (stripos($action, 'email') !== false) && $user->account->emailQuotaExceeded()) {
|
||||||
$user = auth()->user();
|
return response(['message' => ctrans('texts.email_quota_exceeded_subject')], 400);
|
||||||
|
}
|
||||||
|
|
||||||
if(in_array($request->action, ['auto_bill','mark_paid']) && $user->cannot('create', \App\Models\Payment::class)) {
|
if(in_array($request->action, ['auto_bill','mark_paid']) && $user->cannot('create', \App\Models\Payment::class)) {
|
||||||
return response(['message' => ctrans('texts.not_authorized'), 'errors' => ['ids' => [ctrans('texts.not_authorized')]]], 422);
|
return response(['message' => ctrans('texts.not_authorized'), 'errors' => ['ids' => [ctrans('texts.not_authorized')]]], 422);
|
||||||
|
@ -85,17 +85,23 @@ class SendEmailRequest extends Request
|
|||||||
private function checkUserAbleToSend()
|
private function checkUserAbleToSend()
|
||||||
{
|
{
|
||||||
$input = $this->all();
|
$input = $this->all();
|
||||||
|
|
||||||
|
/** @var \App\Models\User $user */
|
||||||
|
$user = auth()->user();
|
||||||
|
|
||||||
if (Ninja::isHosted() && !auth()->user()->account->account_sms_verified) {
|
if (Ninja::isHosted() && !$user->account->account_sms_verified) {
|
||||||
$this->error_message = ctrans('texts.authorization_sms_failure');
|
$this->error_message = ctrans('texts.authorization_sms_failure');
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (Ninja::isHosted() && $user->account->emailQuotaExceeded()) {
|
||||||
|
$this->error_message = ctrans('texts.email_quota_exceeded_subject');
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
/*Make sure we have all the require ingredients to send a template*/
|
/*Make sure we have all the require ingredients to send a template*/
|
||||||
if (isset($input['entity']) && array_key_exists('entity_id', $input) && is_string($input['entity']) && $input['entity_id']) {
|
if (isset($input['entity']) && array_key_exists('entity_id', $input) && is_string($input['entity']) && $input['entity_id']) {
|
||||||
|
|
||||||
/** @var \App\Models\User $user */
|
|
||||||
$user = auth()->user();
|
|
||||||
|
|
||||||
$company = $user->company();
|
$company = $user->company();
|
||||||
|
|
||||||
|
@ -85,14 +85,14 @@ class NinjaMailerJob implements ShouldQueue
|
|||||||
/* Serializing models from other jobs wipes the primary key */
|
/* Serializing models from other jobs wipes the primary key */
|
||||||
$this->company = Company::query()->where('company_key', $this->nmo->company->company_key)->first();
|
$this->company = Company::query()->where('company_key', $this->nmo->company->company_key)->first();
|
||||||
|
|
||||||
|
/* Set the email driver */
|
||||||
|
$this->setMailDriver();
|
||||||
|
|
||||||
/* If any pre conditions fail, we return early here */
|
/* If any pre conditions fail, we return early here */
|
||||||
if (!$this->company || $this->preFlightChecksFail()) {
|
if (!$this->company || $this->preFlightChecksFail()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set the email driver */
|
|
||||||
$this->setMailDriver();
|
|
||||||
|
|
||||||
/* Run time we set Reply To Email*/
|
/* Run time we set Reply To Email*/
|
||||||
if (strlen($this->nmo->settings->reply_to_email) > 1) {
|
if (strlen($this->nmo->settings->reply_to_email) > 1) {
|
||||||
if (property_exists($this->nmo->settings, 'reply_to_name')) {
|
if (property_exists($this->nmo->settings, 'reply_to_name')) {
|
||||||
@ -513,7 +513,7 @@ class NinjaMailerJob implements ShouldQueue
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* GMail users are uncapped */
|
/* GMail users are uncapped */
|
||||||
if (Ninja::isHosted() && ($this->nmo->settings->email_sending_method == 'gmail' || $this->nmo->settings->email_sending_method == 'office365')) {
|
if (Ninja::isHosted() && (in_array($this->nmo->settings->email_sending_method, ['gmail', 'office365', 'client_postmark', 'client_mailgun']))) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -44,6 +44,8 @@ class PreviewReport implements ShouldQueue
|
|||||||
else
|
else
|
||||||
$report = $export->run();
|
$report = $export->run();
|
||||||
|
|
||||||
|
// nlog($report);
|
||||||
|
|
||||||
Cache::put($this->hash, $report, 60 * 60);
|
Cache::put($this->hash, $report, 60 * 60);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -87,6 +87,9 @@ class Email implements ShouldQueue
|
|||||||
->setDefaults()
|
->setDefaults()
|
||||||
->buildMailable();
|
->buildMailable();
|
||||||
|
|
||||||
|
/** Ensure quota's on hosted platform are respected. :) */
|
||||||
|
$this->setMailDriver();
|
||||||
|
|
||||||
if ($this->preFlightChecksFail()) {
|
if ($this->preFlightChecksFail()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -228,7 +231,7 @@ class Email implements ShouldQueue
|
|||||||
*/
|
*/
|
||||||
public function email()
|
public function email()
|
||||||
{
|
{
|
||||||
$this->setMailDriver();
|
// $this->setMailDriver();
|
||||||
|
|
||||||
/* Init the mailer*/
|
/* Init the mailer*/
|
||||||
$mailer = Mail::mailer($this->mailer);
|
$mailer = Mail::mailer($this->mailer);
|
||||||
|
@ -73,7 +73,7 @@ class ZugferdEInvoice extends AbstractService
|
|||||||
} else {
|
} else {
|
||||||
$this->xrechnung->setDocumentBuyerReference($client->routing_id);
|
$this->xrechnung->setDocumentBuyerReference($client->routing_id);
|
||||||
}
|
}
|
||||||
if (!empty($client->shipping_address1) && $client->shipping_country->exists()) {
|
if (!empty($client->shipping_address1) && $client->shipping_country) {
|
||||||
$this->xrechnung->setDocumentShipToAddress($client->shipping_address1, $client->shipping_address2, "", $client->shipping_postal_code, $client->shipping_city, $client->shipping_country->iso_3166_2, $client->shipping_state);
|
$this->xrechnung->setDocumentShipToAddress($client->shipping_address1, $client->shipping_address2, "", $client->shipping_postal_code, $client->shipping_city, $client->shipping_country->iso_3166_2, $client->shipping_state);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -87,7 +87,7 @@
|
|||||||
"socialiteproviders/apple": "^5.2",
|
"socialiteproviders/apple": "^5.2",
|
||||||
"socialiteproviders/microsoft": "^4.1",
|
"socialiteproviders/microsoft": "^4.1",
|
||||||
"spatie/laravel-data": "^3.5",
|
"spatie/laravel-data": "^3.5",
|
||||||
"sprain/swiss-qr-bill": "^3.2",
|
"sprain/swiss-qr-bill": "^4.3",
|
||||||
"square/square": "30.0.0.*",
|
"square/square": "30.0.0.*",
|
||||||
"stripe/stripe-php": "^12",
|
"stripe/stripe-php": "^12",
|
||||||
"symfony/http-client": "^6.0",
|
"symfony/http-client": "^6.0",
|
||||||
|
722
composer.lock
generated
722
composer.lock
generated
File diff suppressed because it is too large
Load Diff
@ -31,7 +31,7 @@ return [
|
|||||||
'company_id' => 0,
|
'company_id' => 0,
|
||||||
'hash_salt' => env('HASH_SALT', ''),
|
'hash_salt' => env('HASH_SALT', ''),
|
||||||
'currency_converter_api_key' => env('OPENEXCHANGE_APP_ID', ''),
|
'currency_converter_api_key' => env('OPENEXCHANGE_APP_ID', ''),
|
||||||
'enabled_modules' => 32767,
|
'enabled_modules' => 65535,
|
||||||
'phantomjs_key' => env('PHANTOMJS_KEY', 'a-demo-key-with-low-quota-per-ip-address'),
|
'phantomjs_key' => env('PHANTOMJS_KEY', 'a-demo-key-with-low-quota-per-ip-address'),
|
||||||
'phantomjs_secret' => env('PHANTOMJS_SECRET', false),
|
'phantomjs_secret' => env('PHANTOMJS_SECRET', false),
|
||||||
'phantomjs_pdf_generation' => env('PHANTOMJS_PDF_GENERATION', false),
|
'phantomjs_pdf_generation' => env('PHANTOMJS_PDF_GENERATION', false),
|
||||||
|
2
package-lock.json
generated
2
package-lock.json
generated
@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"name": "@invoiceninja/invoiceninja",
|
"name": "invoiceninja",
|
||||||
"lockfileVersion": 2,
|
"lockfileVersion": 2,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user