From d22c9a3bd9acd004768a07e3ad61c43ced075e7d Mon Sep 17 00:00:00 2001 From: David Bomba Date: Thu, 11 Jul 2024 15:53:18 +1000 Subject: [PATCH 01/45] Static analysis --- app/Export/CSV/ActivityExport.php | 4 ++++ app/Export/CSV/ClientExport.php | 4 ++++ app/Export/CSV/TaskExport.php | 4 ++-- app/Export/Decorators/TaskDecorator.php | 4 ++-- app/Factory/RecurringExpenseToExpenseFactory.php | 2 +- app/Helpers/Generic.php | 4 ++-- app/Http/Controllers/MigrationController.php | 4 ++-- app/Http/Controllers/PreviewController.php | 2 +- app/Http/Requests/Task/StoreTaskRequest.php | 2 +- app/Http/Requests/Task/UpdateTaskRequest.php | 2 +- app/Import/Transformer/Csv/ExpenseTransformer.php | 2 +- app/Jobs/Product/UpdateOrCreateProduct.php | 2 +- app/Jobs/RecurringInvoice/SendRecurring.php | 2 +- app/Jobs/Util/Import.php | 9 ++++----- app/Jobs/Util/StartMigration.php | 2 +- app/Jobs/Vendor/CreatePurchaseOrderPdf.php | 2 +- .../Migration/PaymentMigrationRepository.php | 2 +- app/Repositories/SubscriptionRepository.php | 2 +- app/Services/Pdf/PdfConfiguration.php | 2 +- app/Services/Pdf/PdfService.php | 2 +- app/Utils/Helpers.php | 2 +- app/Utils/Number.php | 2 +- app/Utils/Traits/Pdf/PdfMaker.php | 4 ++-- phpstan.neon | 2 +- 24 files changed, 38 insertions(+), 31 deletions(-) diff --git a/app/Export/CSV/ActivityExport.php b/app/Export/CSV/ActivityExport.php index fea9ba8722cd..b148c9806daf 100644 --- a/app/Export/CSV/ActivityExport.php +++ b/app/Export/CSV/ActivityExport.php @@ -57,6 +57,7 @@ class ActivityExport extends BaseExport $report = $query->cursor() ->map(function ($resource) { + /** @var \App\Models\Activity $resource */ $row = $this->buildActivityRow($resource); return $this->processMetaData($row, $resource); })->toArray(); @@ -128,6 +129,9 @@ class ActivityExport extends BaseExport $query->cursor() ->each(function ($entity) { + + /** @var \App\Models\Activity $entity */ + $this->buildRow($entity); }); diff --git a/app/Export/CSV/ClientExport.php b/app/Export/CSV/ClientExport.php index f0a5314f76e6..ec4374948cd8 100644 --- a/app/Export/CSV/ClientExport.php +++ b/app/Export/CSV/ClientExport.php @@ -102,6 +102,8 @@ class ClientExport extends BaseExport $report = $query->cursor() ->map(function ($client) { + + /** @var \App\Models\Client $client */ $row = $this->buildRow($client); return $this->processMetaData($row, $client); })->toArray(); @@ -154,6 +156,8 @@ class ClientExport extends BaseExport $query->cursor() ->each(function ($client) { + + /** @var \App\Models\Client $client */ $this->csv->insertOne($this->buildRow($client)); }); diff --git a/app/Export/CSV/TaskExport.php b/app/Export/CSV/TaskExport.php index f630517a2c81..98da6fda1750 100644 --- a/app/Export/CSV/TaskExport.php +++ b/app/Export/CSV/TaskExport.php @@ -161,7 +161,7 @@ class TaskExport extends BaseExport } - if (is_null($task->time_log) || (is_array(json_decode($task->time_log, 1)) && count(json_decode($task->time_log, 1)) == 0)) { + if (is_null($task->time_log) || (is_array(json_decode($task->time_log, true)) && count(json_decode($task->time_log, true)) == 0)) { $this->storage_array[] = $entity; } else { $this->iterateLogs($task, $entity); @@ -178,7 +178,7 @@ class TaskExport extends BaseExport $timezone_name = $timezone->name; } - $logs = json_decode($task->time_log, 1); + $logs = json_decode($task->time_log, true); $date_format_default = $this->date_format; diff --git a/app/Export/Decorators/TaskDecorator.php b/app/Export/Decorators/TaskDecorator.php index 0b48e1cdc613..05f7c2e69690 100644 --- a/app/Export/Decorators/TaskDecorator.php +++ b/app/Export/Decorators/TaskDecorator.php @@ -48,7 +48,7 @@ class TaskDecorator extends Decorator implements DecoratorInterface $timezone_name = $timezone->name; } - $logs = json_decode($task->time_log, 1); + $logs = json_decode($task->time_log, true); $date_format_default = 'Y-m-d'; @@ -77,7 +77,7 @@ class TaskDecorator extends Decorator implements DecoratorInterface $timezone_name = $timezone->name; } - $logs = json_decode($task->time_log, 1); + $logs = json_decode($task->time_log, true); $date_format_default = 'Y-m-d'; diff --git a/app/Factory/RecurringExpenseToExpenseFactory.php b/app/Factory/RecurringExpenseToExpenseFactory.php index d1903408409b..e6699e1fb77c 100644 --- a/app/Factory/RecurringExpenseToExpenseFactory.php +++ b/app/Factory/RecurringExpenseToExpenseFactory.php @@ -175,7 +175,7 @@ class RecurringExpenseToExpenseFactory $_value = explode($_operation, $right); // [MONTHYEAR, 4] - $_right = Carbon::createFromDate(now()->year, now()->month)->addMonths($_value[1])->translatedFormat('F Y'); + $_right = Carbon::createFromDate(now()->year, now()->month)->addMonths($_value[1])->translatedFormat('F Y'); //@phpstan-ignore-line } $replacement = sprintf('%s to %s', $_left, $_right); diff --git a/app/Helpers/Generic.php b/app/Helpers/Generic.php index 33c5b4ba801f..65846b786792 100644 --- a/app/Helpers/Generic.php +++ b/app/Helpers/Generic.php @@ -27,7 +27,7 @@ function nlog($output, $context = []): void } if (gettype($output) == 'object') { - $output = print_r($output, 1); + $output = print_r($output, true); } // $trace = debug_backtrace(); @@ -53,7 +53,7 @@ function nrlog($output, $context = []): void } if (gettype($output) == 'object') { - $output = print_r($output, 1); + $output = print_r($output, true); } // $trace = debug_backtrace(); diff --git a/app/Http/Controllers/MigrationController.php b/app/Http/Controllers/MigrationController.php index 11123bf830d7..d51eb417fb6a 100644 --- a/app/Http/Controllers/MigrationController.php +++ b/app/Http/Controllers/MigrationController.php @@ -267,7 +267,7 @@ class MigrationController extends BaseController if ($request->companies) { //handle Laravel 5.5 UniHTTP - $companies = json_decode($request->companies, 1); + $companies = json_decode($request->companies, true); } else { //handle Laravel 6 Guzzle $companies = []; @@ -275,7 +275,7 @@ class MigrationController extends BaseController foreach ($request->all() as $input) { if ($input instanceof UploadedFile) { } else { - $companies[] = json_decode($input, 1); + $companies[] = json_decode($input, true); } } } diff --git a/app/Http/Controllers/PreviewController.php b/app/Http/Controllers/PreviewController.php index bbfa9b150368..e1db201eab31 100644 --- a/app/Http/Controllers/PreviewController.php +++ b/app/Http/Controllers/PreviewController.php @@ -288,7 +288,7 @@ class PreviewController extends BaseController /** @var \App\Models\Company $company */ $company = $user->company(); - $design_object = json_decode(json_encode(request()->input('design')), 1); + $design_object = json_decode(json_encode(request()->input('design')), true); $ts = (new TemplateService()); diff --git a/app/Http/Requests/Task/StoreTaskRequest.php b/app/Http/Requests/Task/StoreTaskRequest.php index f61bc4267a23..9c5462add8c9 100644 --- a/app/Http/Requests/Task/StoreTaskRequest.php +++ b/app/Http/Requests/Task/StoreTaskRequest.php @@ -69,7 +69,7 @@ class StoreTaskRequest extends Request foreach ($values as $k) { if (!is_int($k[0]) || !is_int($k[1])) { - return $fail('The '.$attribute.' - '.print_r($k, 1).' is invalid. Unix timestamps only.'); + return $fail('The '.$attribute.' - '.print_r($k, true).' is invalid. Unix timestamps only.'); } } diff --git a/app/Http/Requests/Task/UpdateTaskRequest.php b/app/Http/Requests/Task/UpdateTaskRequest.php index 85b2c4de955b..0944fb4eee1e 100644 --- a/app/Http/Requests/Task/UpdateTaskRequest.php +++ b/app/Http/Requests/Task/UpdateTaskRequest.php @@ -75,7 +75,7 @@ class UpdateTaskRequest extends Request foreach ($values as $k) { if (!is_int($k[0]) || !is_int($k[1])) { - return $fail('The '.$attribute.' - '.print_r($k, 1).' is invalid. Unix timestamps only.'); + return $fail('The '.$attribute.' - '.print_r($k, true).' is invalid. Unix timestamps only.'); } } diff --git a/app/Import/Transformer/Csv/ExpenseTransformer.php b/app/Import/Transformer/Csv/ExpenseTransformer.php index c641662b41f8..d69fa4ca68d1 100644 --- a/app/Import/Transformer/Csv/ExpenseTransformer.php +++ b/app/Import/Transformer/Csv/ExpenseTransformer.php @@ -42,7 +42,7 @@ class ExpenseTransformer extends BaseTransformer 'client_id' => isset($data['expense.client']) ? $this->getClientId($data['expense.client']) : null, - 'date' => strlen($this->getString($data, 'expense.date') > 1) ? $this->parseDate($data['expense.date']) : now()->format('Y-m-d'), + 'date' => strlen($this->getString($data, 'expense.date')) > 1 ? $this->parseDate($data['expense.date']) : now()->format('Y-m-d'), 'public_notes' => $this->getString($data, 'expense.public_notes'), 'private_notes' => $this->getString($data, 'expense.private_notes'), 'category_id' => isset($data['expense.category']) diff --git a/app/Jobs/Product/UpdateOrCreateProduct.php b/app/Jobs/Product/UpdateOrCreateProduct.php index fbfc1e8853cb..82fc0c06dda4 100644 --- a/app/Jobs/Product/UpdateOrCreateProduct.php +++ b/app/Jobs/Product/UpdateOrCreateProduct.php @@ -140,6 +140,6 @@ class UpdateOrCreateProduct implements ShouldQueue public function failed($exception = null) { info('update create failed with = '); - info(print_r($exception->getMessage(), 1)); + nlog($exception->getMessage()); } } diff --git a/app/Jobs/RecurringInvoice/SendRecurring.php b/app/Jobs/RecurringInvoice/SendRecurring.php index 6a57330f1eca..a856539a642a 100644 --- a/app/Jobs/RecurringInvoice/SendRecurring.php +++ b/app/Jobs/RecurringInvoice/SendRecurring.php @@ -202,6 +202,6 @@ class SendRecurring implements ShouldQueue LightLogs::create($job_failure) ->send(); - nlog(print_r($exception->getMessage(), 1)); + nlog($exception->getMessage()); } } diff --git a/app/Jobs/Util/Import.php b/app/Jobs/Util/Import.php index 696b37bee891..01775fee78f4 100644 --- a/app/Jobs/Util/Import.php +++ b/app/Jobs/Util/Import.php @@ -212,7 +212,7 @@ class Import implements ShouldQueue $user->setCompany($this->company); - $array = json_decode(file_get_contents($this->file_path), 1); + $array = json_decode(file_get_contents($this->file_path), true); $data = $array['data']; foreach ($this->available_imports as $import) { @@ -2010,7 +2010,7 @@ class Import implements ShouldQueue public function transformId($resource, string $old): int { if (! array_key_exists($resource, $this->ids)) { - info(print_r($resource, 1)); + nlog($resource); throw new Exception("Resource {$resource} not available."); } @@ -2067,11 +2067,10 @@ class Import implements ShouldQueue LightLogs::create($job_failure) ->queue(); - nlog(print_r($exception->getMessage(), 1)); + nlog($exception->getMessage()); - // if (Ninja::isHosted()) { app('sentry')->captureException($exception); - // } + } diff --git a/app/Jobs/Util/StartMigration.php b/app/Jobs/Util/StartMigration.php index 3d28465d2c30..77b9ed9f7abd 100644 --- a/app/Jobs/Util/StartMigration.php +++ b/app/Jobs/Util/StartMigration.php @@ -168,6 +168,6 @@ class StartMigration implements ShouldQueue public function failed($exception = null) { - info(print_r($exception->getMessage(), 1)); + nlog($exception->getMessage()); } } diff --git a/app/Jobs/Vendor/CreatePurchaseOrderPdf.php b/app/Jobs/Vendor/CreatePurchaseOrderPdf.php index 824ac6424f5b..d40765b560d9 100644 --- a/app/Jobs/Vendor/CreatePurchaseOrderPdf.php +++ b/app/Jobs/Vendor/CreatePurchaseOrderPdf.php @@ -199,7 +199,7 @@ class CreatePurchaseOrderPdf implements ShouldQueue } } } catch (\Exception $e) { - nlog(print_r($e->getMessage(), 1)); + nlog($e->getMessage()); } if (config('ninja.log_pdf_html')) { diff --git a/app/Repositories/Migration/PaymentMigrationRepository.php b/app/Repositories/Migration/PaymentMigrationRepository.php index 51bcdb51b826..0ece566f2e08 100644 --- a/app/Repositories/Migration/PaymentMigrationRepository.php +++ b/app/Repositories/Migration/PaymentMigrationRepository.php @@ -87,7 +87,7 @@ class PaymentMigrationRepository extends BaseRepository if (! array_key_exists('status_id', $data)) { info('payment with no status id?'); - info(print_r($data, 1)); + info(print_r($data, true)); } $payment->status_id = $data['status_id']; diff --git a/app/Repositories/SubscriptionRepository.php b/app/Repositories/SubscriptionRepository.php index e340b0e78d51..e7d971f0d379 100644 --- a/app/Repositories/SubscriptionRepository.php +++ b/app/Repositories/SubscriptionRepository.php @@ -130,7 +130,7 @@ class SubscriptionRepository extends BaseRepository private function convertV3Bundle($bundle): array { if(is_object($bundle)) { - $bundle = json_decode(json_encode($bundle), 1); + $bundle = json_decode(json_encode($bundle), true); } $items = []; diff --git a/app/Services/Pdf/PdfConfiguration.php b/app/Services/Pdf/PdfConfiguration.php index fddbc0766ae2..4c9548bdb92e 100644 --- a/app/Services/Pdf/PdfConfiguration.php +++ b/app/Services/Pdf/PdfConfiguration.php @@ -386,7 +386,7 @@ class PdfConfiguration $decimal = $this->country->decimal_separator; } - if (isset($this->country->swap_currency_symbol) && strlen($this->country->swap_currency_symbol) >= 1) { + if (isset($this->country->swap_currency_symbol) && $this->country->swap_currency_symbol == 1) { $swapSymbol = $this->country->swap_currency_symbol; } diff --git a/app/Services/Pdf/PdfService.php b/app/Services/Pdf/PdfService.php index 4a579db80c52..85d115e8a476 100644 --- a/app/Services/Pdf/PdfService.php +++ b/app/Services/Pdf/PdfService.php @@ -102,7 +102,7 @@ class PdfService } } catch (\Exception $e) { - nlog(print_r($e->getMessage(), 1)); + nlog($e->getMessage()); throw new \Exception($e->getMessage(), $e->getCode()); } diff --git a/app/Utils/Helpers.php b/app/Utils/Helpers.php index 4d5fd38d486d..e0e7d9e64e21 100644 --- a/app/Utils/Helpers.php +++ b/app/Utils/Helpers.php @@ -279,7 +279,7 @@ class Helpers $_value = explode($_operation, $right); // [MONTHYEAR, 4] - $_right = Carbon::createFromDate($currentDateTime->year, $currentDateTime->month)->addMonths($_value[1])->translatedFormat('F Y'); + $_right = Carbon::createFromDate($currentDateTime->year, $currentDateTime->month)->addMonths($_value[1])->translatedFormat('F Y'); //@phpstan-ignore-line } $replacement = sprintf('%s to %s', $_left, $_right); diff --git a/app/Utils/Number.php b/app/Utils/Number.php index 2a8b592a6a99..c1d601a80e61 100644 --- a/app/Utils/Number.php +++ b/app/Utils/Number.php @@ -255,7 +255,7 @@ class Number $decimal = $country->decimal_separator; } - if (isset($country->swap_currency_symbol) && strlen($country->swap_currency_symbol) >= 1) { + if (isset($country->swap_currency_symbol) && $country->swap_currency_symbol == 1) { $swapSymbol = $country->swap_currency_symbol; } diff --git a/app/Utils/Traits/Pdf/PdfMaker.php b/app/Utils/Traits/Pdf/PdfMaker.php index 112570272f4a..fa3c70f6b872 100644 --- a/app/Utils/Traits/Pdf/PdfMaker.php +++ b/app/Utils/Traits/Pdf/PdfMaker.php @@ -20,8 +20,8 @@ trait PdfMaker /** * Returns a PDF stream. * - * @param string $header Header to be included in PDF - * @param string $footer Footer to be included in PDF + * @param string|null $header Header to be included in PDF + * @param string|null $footer Footer to be included in PDF * @param string $html The HTML object to be converted into PDF * * @return string The PDF string diff --git a/phpstan.neon b/phpstan.neon index df2082796c5b..1811c3080b13 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -3,7 +3,7 @@ includes: - ./vendor/spaze/phpstan-stripe/extension.neon - phpstan-baseline.neon parameters: - level: 4 + level: 5 paths: - app excludePaths: From d53f3062cf79d853852ea6a2649c5d44c5b72740 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Sun, 14 Jul 2024 08:16:29 +1000 Subject: [PATCH 02/45] add stock quantity to imports --- app/Exceptions/Handler.php | 5 - app/Filters/CreditFilters.php | 3 +- app/Filters/InvoiceFilters.php | 3 +- app/Filters/QuoteFilters.php | 3 +- app/Filters/RecurringInvoiceFilters.php | 3 +- app/Http/Controllers/SetupController.php | 2 - app/Import/Definitions/ProductMap.php | 4 +- app/Models/Client.php | 14 + app/Services/Client/ClientService.php | 6 +- .../Validation/Peppol/CompanyLevel.php | 6 +- app/Transformers/AccountTransformer.php | 2 +- app/Transformers/CompanyTransformer.php | 2 +- app/Utils/HtmlEngine.php | 2 + composer.lock | 573 +++++++++--------- 14 files changed, 323 insertions(+), 305 deletions(-) diff --git a/app/Exceptions/Handler.php b/app/Exceptions/Handler.php index a6f286c78d3b..243383eeb34d 100644 --- a/app/Exceptions/Handler.php +++ b/app/Exceptions/Handler.php @@ -97,11 +97,6 @@ class Handler extends ExceptionHandler { if (Ninja::isHosted()) { - // if($exception instanceof ThrottleRequestsException && class_exists(\Modules\Admin\Events\ThrottledExceptionRaised::class)) { - // $uri = urldecode(request()->getRequestUri()); - // event(new \Modules\Admin\Events\ThrottledExceptionRaised(auth()->user()?->account?->key, $uri, request()->ip())); - // } - Integration::configureScope(function (Scope $scope): void { $name = 'hosted@invoiceninja.com'; diff --git a/app/Filters/CreditFilters.php b/app/Filters/CreditFilters.php index 2306139c13d5..54ba0fb05c21 100644 --- a/app/Filters/CreditFilters.php +++ b/app/Filters/CreditFilters.php @@ -97,7 +97,8 @@ class CreditFilters extends QueryFilters $q->where('first_name', 'like', '%'.$filter.'%') ->orWhere('last_name', 'like', '%'.$filter.'%') ->orWhere('email', 'like', '%'.$filter.'%'); - }); + }) + ->orWhereRaw("JSON_UNQUOTE(JSON_EXTRACT(line_items, '$[*].notes')) LIKE ?", ['%'.$filter.'%']); }); } diff --git a/app/Filters/InvoiceFilters.php b/app/Filters/InvoiceFilters.php index 6d76a1352de4..2d2ef7cd06b8 100644 --- a/app/Filters/InvoiceFilters.php +++ b/app/Filters/InvoiceFilters.php @@ -124,7 +124,8 @@ class InvoiceFilters extends QueryFilters $q->where('first_name', 'like', '%'.$filter.'%') ->orWhere('last_name', 'like', '%'.$filter.'%') ->orWhere('email', 'like', '%'.$filter.'%'); - }); + }) + ->orWhereRaw("JSON_UNQUOTE(JSON_EXTRACT(line_items, '$[*].notes')) LIKE ?", ['%'.$filter.'%']); }); } diff --git a/app/Filters/QuoteFilters.php b/app/Filters/QuoteFilters.php index 60cc597bb365..048669db927a 100644 --- a/app/Filters/QuoteFilters.php +++ b/app/Filters/QuoteFilters.php @@ -45,7 +45,8 @@ class QuoteFilters extends QueryFilters $q->where('first_name', 'like', '%'.$filter.'%') ->orWhere('last_name', 'like', '%'.$filter.'%') ->orWhere('email', 'like', '%'.$filter.'%'); - }); + }) + ->orWhereRaw("JSON_UNQUOTE(JSON_EXTRACT(line_items, '$[*].notes')) LIKE ?", ['%'.$filter.'%']); }); } diff --git a/app/Filters/RecurringInvoiceFilters.php b/app/Filters/RecurringInvoiceFilters.php index ef7f78c5c029..983582cb9a4e 100644 --- a/app/Filters/RecurringInvoiceFilters.php +++ b/app/Filters/RecurringInvoiceFilters.php @@ -48,7 +48,8 @@ class RecurringInvoiceFilters extends QueryFilters $q->where('first_name', 'like', '%'.$filter.'%') ->orWhere('last_name', 'like', '%'.$filter.'%') ->orWhere('email', 'like', '%'.$filter.'%'); - }); + }) + ->orWhereRaw("JSON_UNQUOTE(JSON_EXTRACT(line_items, '$[*].notes')) LIKE ?", ['%'.$filter.'%']); }); } diff --git a/app/Http/Controllers/SetupController.php b/app/Http/Controllers/SetupController.php index fe0fad23a324..942b9607c727 100644 --- a/app/Http/Controllers/SetupController.php +++ b/app/Http/Controllers/SetupController.php @@ -144,8 +144,6 @@ class SetupController extends Controller define('STDIN', fopen('php://stdin', 'r')); Artisan::call('config:clear'); - - Artisan::call('migrate', ['--force' => true]); Artisan::call('db:seed', ['--force' => true]); Artisan::call('config:clear'); diff --git a/app/Import/Definitions/ProductMap.php b/app/Import/Definitions/ProductMap.php index 5f4e636ad12c..b6f38a550418 100644 --- a/app/Import/Definitions/ProductMap.php +++ b/app/Import/Definitions/ProductMap.php @@ -31,7 +31,8 @@ class ProductMap 12 => 'product.custom_value2', 13 => 'product.custom_value3', 14 => 'product.custom_value4', - 15 => 'product.image_url' + 15 => 'product.image_url', + 16 => 'product.in_stock_quantity', ]; } @@ -54,6 +55,7 @@ class ProductMap 13 => 'texts.custom_value', 14 => 'texts.custom_value', 15 => 'texts.image_url', + 16 => 'texts.in_stock_quantity', ]; } } diff --git a/app/Models/Client.php b/app/Models/Client.php index f9a68fbe8ffc..171fbd97ec15 100644 --- a/app/Models/Client.php +++ b/app/Models/Client.php @@ -822,6 +822,20 @@ class Client extends BaseModel implements HasLocalePreference } + public function utc_offset(): int + { + + $offset = 0; + $timezone = $this->timezone(); + + date_default_timezone_set('GMT'); + $date = new \DateTime("now", new \DateTimeZone($timezone->name)); + $offset = $date->getOffset(); + + return $offset; + + } + public function timezone_offset(): int { $offset = 0; diff --git a/app/Services/Client/ClientService.php b/app/Services/Client/ClientService.php index e2a4eddfa44a..b7ba322a2b3c 100644 --- a/app/Services/Client/ClientService.php +++ b/app/Services/Client/ClientService.php @@ -180,10 +180,12 @@ class ClientService public function updatePaymentBalance() { - $amount = Payment::query()->where('client_id', $this->client->id) + $amount = Payment::query() + ->withTrashed() + ->where('client_id', $this->client->id) ->where('is_deleted', 0) ->whereIn('status_id', [Payment::STATUS_COMPLETED, Payment::STATUS_PENDING, Payment::STATUS_PARTIALLY_REFUNDED, Payment::STATUS_REFUNDED]) - ->selectRaw('SUM(payments.amount - payments.applied) as amount')->first()->amount ?? 0; + ->selectRaw('SUM(payments.amount - payments.applied - payments.refunded) as amount')->first()->amount ?? 0; DB::connection(config('database.default'))->transaction(function () use ($amount) { $this->client = Client::withTrashed()->where('id', $this->client->id)->lockForUpdate()->first(); diff --git a/app/Services/EDocument/Standards/Validation/Peppol/CompanyLevel.php b/app/Services/EDocument/Standards/Validation/Peppol/CompanyLevel.php index 9de7f548e714..04624c51b8f0 100644 --- a/app/Services/EDocument/Standards/Validation/Peppol/CompanyLevel.php +++ b/app/Services/EDocument/Standards/Validation/Peppol/CompanyLevel.php @@ -153,9 +153,9 @@ class CompanyLevel // #[SerializedName('cbc:AccountingCostCode')] // public $AccountingCostCode; - // /** @var string */ - // #[SerializedName('cbc:AccountingCost')] - // public string $AccountingCost; + /** @var string */ + #[SerializedName('cbc:AccountingCost')] + public string $AccountingCost; // /** @var LineCountNumeric */ // #[SerializedName('cbc:LineCountNumeric')] diff --git a/app/Transformers/AccountTransformer.php b/app/Transformers/AccountTransformer.php index bd813cf71d21..4ad93a2598bc 100644 --- a/app/Transformers/AccountTransformer.php +++ b/app/Transformers/AccountTransformer.php @@ -93,7 +93,7 @@ class AccountTransformer extends EntityTransformer 'has_iap_plan' => (bool)$account->inapp_transaction_id, 'tax_api_enabled' => (bool) config('services.tax.zip_tax.key') ? true : false, 'nordigen_enabled' => (bool) (config('ninja.nordigen.secret_id') && config('ninja.nordigen.secret_key')) ? true : false, - 'upload_extensions' => (string) config('ninja.upload_extensions'), + 'upload_extensions' => (string) "png,ai,jpeg,tiff,pdf,gif,psd,txt,doc,xls,ppt,xlsx,docx,pptx,webp,xml,zip,csv,ods,odt,odp,".config('ninja.upload_extensions'), ]; } diff --git a/app/Transformers/CompanyTransformer.php b/app/Transformers/CompanyTransformer.php index 97710a2b92a5..f13090bb63de 100644 --- a/app/Transformers/CompanyTransformer.php +++ b/app/Transformers/CompanyTransformer.php @@ -211,7 +211,7 @@ class CompanyTransformer extends EntityTransformer 'smtp_password' => $company->smtp_password ? '********' : '', 'smtp_local_domain' => (string)$company->smtp_local_domain ?? '', 'smtp_verify_peer' => (bool)$company->smtp_verify_peer, - // 'e_invoice' => $company->e_invoice ?: new \stdClass(), + 'e_invoice' => $company->e_invoice ?: new \stdClass(), ]; } diff --git a/app/Utils/HtmlEngine.php b/app/Utils/HtmlEngine.php index c0aa8f563fbb..69a782ea02a3 100644 --- a/app/Utils/HtmlEngine.php +++ b/app/Utils/HtmlEngine.php @@ -130,6 +130,8 @@ class HtmlEngine $data = []; + $data['$date_client_now'] = ['value' => now()->setTimezone($this->client->timezone()->name)->addSeconds($this->client->utc_offset())->format($this->client->date_format()), 'label' => '']; + $data['$date_company_now'] = ['value' => now()->setTimezone($this->company->timezone()->name)->addSeconds($this->company->utc_offset())->format($this->company->date_format()), 'label' => '']; $data['$global_margin'] = ['value' => '6.35mm', 'label' => '']; $data['$company_logo_size'] = ['value' => $this->resolveCompanyLogoSize(), 'label' => '']; $data['$show_shipping_address'] = ['value' => $this->settings->show_shipping_address ? 'flex' : 'none', 'label' => '']; diff --git a/composer.lock b/composer.lock index 3a62ab2f9a94..86e7b62c01a9 100644 --- a/composer.lock +++ b/composer.lock @@ -100,16 +100,16 @@ }, { "name": "apimatic/core", - "version": "0.3.10", + "version": "0.3.11", "source": { "type": "git", "url": "https://github.com/apimatic/core-lib-php.git", - "reference": "8c111790b8d6f67812ba651ebb9513b5233863d0" + "reference": "2274f103f9f210664f546f504e4559d772a81fee" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/apimatic/core-lib-php/zipball/8c111790b8d6f67812ba651ebb9513b5233863d0", - "reference": "8c111790b8d6f67812ba651ebb9513b5233863d0", + "url": "https://api.github.com/repos/apimatic/core-lib-php/zipball/2274f103f9f210664f546f504e4559d772a81fee", + "reference": "2274f103f9f210664f546f504e4559d772a81fee", "shasum": "" }, "require": { @@ -148,9 +148,9 @@ ], "support": { "issues": "https://github.com/apimatic/core-lib-php/issues", - "source": "https://github.com/apimatic/core-lib-php/tree/0.3.10" + "source": "https://github.com/apimatic/core-lib-php/tree/0.3.11" }, - "time": "2024-05-30T06:32:24+00:00" + "time": "2024-07-08T11:50:08+00:00" }, { "name": "apimatic/core-interfaces", @@ -535,16 +535,16 @@ }, { "name": "aws/aws-sdk-php", - "version": "3.315.1", + "version": "3.316.2", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "13871330833e167d098240dab74b8b069b9b07e3" + "reference": "4d8caae512c3be4d59ee6d583b3f82872dde5071" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/13871330833e167d098240dab74b8b069b9b07e3", - "reference": "13871330833e167d098240dab74b8b069b9b07e3", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/4d8caae512c3be4d59ee6d583b3f82872dde5071", + "reference": "4d8caae512c3be4d59ee6d583b3f82872dde5071", "shasum": "" }, "require": { @@ -624,9 +624,9 @@ "support": { "forum": "https://forums.aws.amazon.com/forum.jspa?forumID=80", "issues": "https://github.com/aws/aws-sdk-php/issues", - "source": "https://github.com/aws/aws-sdk-php/tree/3.315.1" + "source": "https://github.com/aws/aws-sdk-php/tree/3.316.2" }, - "time": "2024-06-27T18:03:53+00:00" + "time": "2024-07-10T19:16:28+00:00" }, { "name": "bacon/bacon-qr-code", @@ -968,16 +968,16 @@ }, { "name": "checkout/checkout-sdk-php", - "version": "3.2.0", + "version": "3.2.1", "source": { "type": "git", "url": "https://github.com/checkout/checkout-sdk-php.git", - "reference": "99a01786fa44c3e0b1d6d2b207ab0c1ba4f742d3" + "reference": "91797beb18fd9b1581b1cfe5b96a551c0009417c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/checkout/checkout-sdk-php/zipball/99a01786fa44c3e0b1d6d2b207ab0c1ba4f742d3", - "reference": "99a01786fa44c3e0b1d6d2b207ab0c1ba4f742d3", + "url": "https://api.github.com/repos/checkout/checkout-sdk-php/zipball/91797beb18fd9b1581b1cfe5b96a551c0009417c", + "reference": "91797beb18fd9b1581b1cfe5b96a551c0009417c", "shasum": "" }, "require": { @@ -1030,9 +1030,9 @@ ], "support": { "issues": "https://github.com/checkout/checkout-sdk-php/issues", - "source": "https://github.com/checkout/checkout-sdk-php/tree/3.2.0" + "source": "https://github.com/checkout/checkout-sdk-php/tree/3.2.1" }, - "time": "2024-05-09T10:39:29+00:00" + "time": "2024-07-09T16:07:18+00:00" }, { "name": "clue/stream-filter", @@ -1102,16 +1102,16 @@ }, { "name": "composer/ca-bundle", - "version": "1.5.0", + "version": "1.5.1", "source": { "type": "git", "url": "https://github.com/composer/ca-bundle.git", - "reference": "0c5ccfcfea312b5c5a190a21ac5cef93f74baf99" + "reference": "063d9aa8696582f5a41dffbbaf3c81024f0a604a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/ca-bundle/zipball/0c5ccfcfea312b5c5a190a21ac5cef93f74baf99", - "reference": "0c5ccfcfea312b5c5a190a21ac5cef93f74baf99", + "url": "https://api.github.com/repos/composer/ca-bundle/zipball/063d9aa8696582f5a41dffbbaf3c81024f0a604a", + "reference": "063d9aa8696582f5a41dffbbaf3c81024f0a604a", "shasum": "" }, "require": { @@ -1121,7 +1121,7 @@ }, "require-dev": { "phpstan/phpstan": "^1.10", - "psr/log": "^1.0", + "psr/log": "^1.0 || ^2.0 || ^3.0", "symfony/phpunit-bridge": "^4.2 || ^5", "symfony/process": "^4.0 || ^5.0 || ^6.0 || ^7.0" }, @@ -1158,7 +1158,7 @@ "support": { "irc": "irc://irc.freenode.org/composer", "issues": "https://github.com/composer/ca-bundle/issues", - "source": "https://github.com/composer/ca-bundle/tree/1.5.0" + "source": "https://github.com/composer/ca-bundle/tree/1.5.1" }, "funding": [ { @@ -1174,7 +1174,7 @@ "type": "tidelift" } ], - "time": "2024-03-15T14:00:32+00:00" + "time": "2024-07-08T15:28:20+00:00" }, { "name": "dasprid/enum", @@ -1287,16 +1287,16 @@ }, { "name": "dflydev/dot-access-data", - "version": "v3.0.2", + "version": "v3.0.3", "source": { "type": "git", "url": "https://github.com/dflydev/dflydev-dot-access-data.git", - "reference": "f41715465d65213d644d3141a6a93081be5d3549" + "reference": "a23a2bf4f31d3518f3ecb38660c95715dfead60f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/dflydev/dflydev-dot-access-data/zipball/f41715465d65213d644d3141a6a93081be5d3549", - "reference": "f41715465d65213d644d3141a6a93081be5d3549", + "url": "https://api.github.com/repos/dflydev/dflydev-dot-access-data/zipball/a23a2bf4f31d3518f3ecb38660c95715dfead60f", + "reference": "a23a2bf4f31d3518f3ecb38660c95715dfead60f", "shasum": "" }, "require": { @@ -1356,9 +1356,9 @@ ], "support": { "issues": "https://github.com/dflydev/dflydev-dot-access-data/issues", - "source": "https://github.com/dflydev/dflydev-dot-access-data/tree/v3.0.2" + "source": "https://github.com/dflydev/dflydev-dot-access-data/tree/v3.0.3" }, - "time": "2022-10-27T11:44:00+00:00" + "time": "2024-07-08T12:26:09+00:00" }, { "name": "doctrine/dbal", @@ -2512,34 +2512,34 @@ }, { "name": "google/apiclient", - "version": "v2.16.0", + "version": "v2.17.0", "source": { "type": "git", "url": "https://github.com/googleapis/google-api-php-client.git", - "reference": "017400f609c1fb71ab5ad824c50eabd4c3eaf779" + "reference": "b1f63d72c44307ec8ef7bf18f1012de35d8944ed" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/googleapis/google-api-php-client/zipball/017400f609c1fb71ab5ad824c50eabd4c3eaf779", - "reference": "017400f609c1fb71ab5ad824c50eabd4c3eaf779", + "url": "https://api.github.com/repos/googleapis/google-api-php-client/zipball/b1f63d72c44307ec8ef7bf18f1012de35d8944ed", + "reference": "b1f63d72c44307ec8ef7bf18f1012de35d8944ed", "shasum": "" }, "require": { - "firebase/php-jwt": "~6.0", + "firebase/php-jwt": "^6.0", "google/apiclient-services": "~0.350", "google/auth": "^1.37", - "guzzlehttp/guzzle": "^6.5.8||^7.4.5", - "guzzlehttp/psr7": "^1.9.1||^2.2.1", + "guzzlehttp/guzzle": "^7.4.5", + "guzzlehttp/psr7": "^2.6", "monolog/monolog": "^2.9||^3.0", - "php": "^7.4|^8.0", + "php": "^8.0", "phpseclib/phpseclib": "^3.0.36" }, "require-dev": { "cache/filesystem-adapter": "^1.1", "composer/composer": "^1.10.23", "phpcompatibility/php-compatibility": "^9.2", - "phpspec/prophecy-phpunit": "^2.0", - "phpunit/phpunit": "^9.5", + "phpspec/prophecy-phpunit": "^2.1", + "phpunit/phpunit": "^9.6", "squizlabs/php_codesniffer": "^3.8", "symfony/css-selector": "~2.1", "symfony/dom-crawler": "~2.1" @@ -2575,22 +2575,22 @@ ], "support": { "issues": "https://github.com/googleapis/google-api-php-client/issues", - "source": "https://github.com/googleapis/google-api-php-client/tree/v2.16.0" + "source": "https://github.com/googleapis/google-api-php-client/tree/v2.17.0" }, - "time": "2024-04-24T00:59:47+00:00" + "time": "2024-07-10T14:57:54+00:00" }, { "name": "google/apiclient-services", - "version": "v0.361.0", + "version": "v0.363.0", "source": { "type": "git", "url": "https://github.com/googleapis/google-api-php-client-services.git", - "reference": "f90e9a059ce5a6076b4fc8571a4fac6564012782" + "reference": "5a0943e498e98e23dccdd98c5a3f74bc1b442053" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/googleapis/google-api-php-client-services/zipball/f90e9a059ce5a6076b4fc8571a4fac6564012782", - "reference": "f90e9a059ce5a6076b4fc8571a4fac6564012782", + "url": "https://api.github.com/repos/googleapis/google-api-php-client-services/zipball/5a0943e498e98e23dccdd98c5a3f74bc1b442053", + "reference": "5a0943e498e98e23dccdd98c5a3f74bc1b442053", "shasum": "" }, "require": { @@ -2619,22 +2619,22 @@ ], "support": { "issues": "https://github.com/googleapis/google-api-php-client-services/issues", - "source": "https://github.com/googleapis/google-api-php-client-services/tree/v0.361.0" + "source": "https://github.com/googleapis/google-api-php-client-services/tree/v0.363.0" }, - "time": "2024-06-23T01:02:19+00:00" + "time": "2024-07-02T01:04:18+00:00" }, { "name": "google/auth", - "version": "v1.40.0", + "version": "v1.41.0", "source": { "type": "git", "url": "https://github.com/googleapis/google-auth-library-php.git", - "reference": "bff9f2d01677e71a98394b5ac981b99523df5178" + "reference": "1043ea18fe7f5dfbf5b208ce3ee6d6b6ab8cb038" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/googleapis/google-auth-library-php/zipball/bff9f2d01677e71a98394b5ac981b99523df5178", - "reference": "bff9f2d01677e71a98394b5ac981b99523df5178", + "url": "https://api.github.com/repos/googleapis/google-auth-library-php/zipball/1043ea18fe7f5dfbf5b208ce3ee6d6b6ab8cb038", + "reference": "1043ea18fe7f5dfbf5b208ce3ee6d6b6ab8cb038", "shasum": "" }, "require": { @@ -2679,9 +2679,9 @@ "support": { "docs": "https://googleapis.github.io/google-auth-library-php/main/", "issues": "https://github.com/googleapis/google-auth-library-php/issues", - "source": "https://github.com/googleapis/google-auth-library-php/tree/v1.40.0" + "source": "https://github.com/googleapis/google-auth-library-php/tree/v1.41.0" }, - "time": "2024-05-31T19:16:15+00:00" + "time": "2024-07-10T15:21:07+00:00" }, { "name": "graham-campbell/result-type", @@ -3609,16 +3609,16 @@ }, { "name": "horstoeko/zugferd", - "version": "v1.0.56", + "version": "v1.0.57", "source": { "type": "git", "url": "https://github.com/horstoeko/zugferd.git", - "reference": "ae34e6450d125850c5c001100b459d46e9b37150" + "reference": "272e9baf94156496e0d7119616a9449b71f329d6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/horstoeko/zugferd/zipball/ae34e6450d125850c5c001100b459d46e9b37150", - "reference": "ae34e6450d125850c5c001100b459d46e9b37150", + "url": "https://api.github.com/repos/horstoeko/zugferd/zipball/272e9baf94156496e0d7119616a9449b71f329d6", + "reference": "272e9baf94156496e0d7119616a9449b71f329d6", "shasum": "" }, "require": { @@ -3678,9 +3678,9 @@ ], "support": { "issues": "https://github.com/horstoeko/zugferd/issues", - "source": "https://github.com/horstoeko/zugferd/tree/v1.0.56" + "source": "https://github.com/horstoeko/zugferd/tree/v1.0.57" }, - "time": "2024-06-15T05:49:47+00:00" + "time": "2024-07-10T03:39:20+00:00" }, { "name": "horstoeko/zugferdvisualizer", @@ -3788,16 +3788,16 @@ }, { "name": "imdhemy/appstore-iap", - "version": "1.6.1", + "version": "1.7.0", "source": { "type": "git", "url": "https://github.com/imdhemy/appstore-iap.git", - "reference": "025d176a097b864f306dad7dc3506598aa6e5990" + "reference": "c82aa2ad083c8029121ca4062c0bd494c09746c1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/imdhemy/appstore-iap/zipball/025d176a097b864f306dad7dc3506598aa6e5990", - "reference": "025d176a097b864f306dad7dc3506598aa6e5990", + "url": "https://api.github.com/repos/imdhemy/appstore-iap/zipball/c82aa2ad083c8029121ca4062c0bd494c09746c1", + "reference": "c82aa2ad083c8029121ca4062c0bd494c09746c1", "shasum": "" }, "require": { @@ -3805,9 +3805,10 @@ "ext-openssl": "*", "ext-sodium": "*", "guzzlehttp/guzzle": "^7.6.0", - "lcobucci/jwt": "^4.3", + "lcobucci/clock": "^3.0", + "lcobucci/jwt": "^5.3", "nesbot/carbon": "^2.66|^3.1", - "php": ">=8.0" + "php": ">=8.1" }, "require-dev": { "fakerphp/faker": "^1.22", @@ -3835,9 +3836,9 @@ "description": "PHP Appstore In-App Purchase implementation", "support": { "issues": "https://github.com/imdhemy/appstore-iap/issues", - "source": "https://github.com/imdhemy/appstore-iap/tree/1.6.1" + "source": "https://github.com/imdhemy/appstore-iap/tree/1.7.0" }, - "time": "2024-03-27T09:17:17+00:00" + "time": "2024-06-30T18:08:57+00:00" }, { "name": "imdhemy/google-play-billing", @@ -3892,16 +3893,16 @@ }, { "name": "imdhemy/laravel-purchases", - "version": "1.12.1", + "version": "1.13.0", "source": { "type": "git", "url": "https://github.com/imdhemy/laravel-in-app-purchases.git", - "reference": "487cc34363a598f18a6db89b3b3eebb97974e337" + "reference": "ec62ab94727b22b262f79e05ece0bd92a919e9d4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/imdhemy/laravel-in-app-purchases/zipball/487cc34363a598f18a6db89b3b3eebb97974e337", - "reference": "487cc34363a598f18a6db89b3b3eebb97974e337", + "url": "https://api.github.com/repos/imdhemy/laravel-in-app-purchases/zipball/ec62ab94727b22b262f79e05ece0bd92a919e9d4", + "reference": "ec62ab94727b22b262f79e05ece0bd92a919e9d4", "shasum": "" }, "require": { @@ -3910,7 +3911,7 @@ "imdhemy/appstore-iap": "^1.6", "imdhemy/google-play-billing": "^1.5", "laravel/framework": ">=8.0", - "php": ">=8.0" + "php": ">=8.1" }, "require-dev": { "friendsofphp/php-cs-fixer": "^3.14", @@ -3957,7 +3958,7 @@ ], "support": { "issues": "https://github.com/imdhemy/laravel-in-app-purchases/issues", - "source": "https://github.com/imdhemy/laravel-in-app-purchases/tree/1.12.1" + "source": "https://github.com/imdhemy/laravel-in-app-purchases/tree/1.13.0" }, "funding": [ { @@ -3965,7 +3966,7 @@ "type": "github" } ], - "time": "2024-06-11T12:40:12+00:00" + "time": "2024-06-30T11:32:33+00:00" }, { "name": "intervention/image", @@ -4057,12 +4058,12 @@ "source": { "type": "git", "url": "https://github.com/invoiceninja/einvoice.git", - "reference": "468a2a3696e76b1216a129e79177eb7c16ea9bdb" + "reference": "29736fb1a007f5fa52aee811397e1ef6611b1b8d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/invoiceninja/einvoice/zipball/468a2a3696e76b1216a129e79177eb7c16ea9bdb", - "reference": "468a2a3696e76b1216a129e79177eb7c16ea9bdb", + "url": "https://api.github.com/repos/invoiceninja/einvoice/zipball/29736fb1a007f5fa52aee811397e1ef6611b1b8d", + "reference": "29736fb1a007f5fa52aee811397e1ef6611b1b8d", "shasum": "" }, "require": { @@ -4104,7 +4105,7 @@ "source": "https://github.com/invoiceninja/einvoice/tree/main", "issues": "https://github.com/invoiceninja/einvoice/issues" }, - "time": "2024-06-19T00:29:39+00:00" + "time": "2024-07-11T06:34:33+00:00" }, { "name": "invoiceninja/inspector", @@ -4609,16 +4610,16 @@ }, { "name": "laravel/framework", - "version": "v11.13.0", + "version": "v11.15.0", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "92deaa4f037ff100e36809443811301819a8cf84" + "reference": "ba85f1c019bed59b3c736c9c4502805efd0ba84b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/92deaa4f037ff100e36809443811301819a8cf84", - "reference": "92deaa4f037ff100e36809443811301819a8cf84", + "url": "https://api.github.com/repos/laravel/framework/zipball/ba85f1c019bed59b3c736c9c4502805efd0ba84b", + "reference": "ba85f1c019bed59b3c736c9c4502805efd0ba84b", "shasum": "" }, "require": { @@ -4671,6 +4672,7 @@ }, "provide": { "psr/container-implementation": "1.1|2.0", + "psr/log-implementation": "1.0|2.0|3.0", "psr/simple-cache-implementation": "1.0|2.0|3.0" }, "replace": { @@ -4723,7 +4725,7 @@ "nyholm/psr7": "^1.2", "orchestra/testbench-core": "^9.1.5", "pda/pheanstalk": "^5.0", - "phpstan/phpstan": "^1.4.7", + "phpstan/phpstan": "^1.11.5", "phpunit/phpunit": "^10.5|^11.0", "predis/predis": "^2.0.2", "resend/resend-php": "^0.10.0", @@ -4810,20 +4812,20 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2024-06-27T09:04:50+00:00" + "time": "2024-07-09T15:38:12+00:00" }, { "name": "laravel/pint", - "version": "v1.16.1", + "version": "v1.16.2", "source": { "type": "git", "url": "https://github.com/laravel/pint.git", - "reference": "9266a47f1b9231b83e0cfd849009547329d871b1" + "reference": "51f1ba679a6afe0315621ad143d788bd7ded0eca" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/pint/zipball/9266a47f1b9231b83e0cfd849009547329d871b1", - "reference": "9266a47f1b9231b83e0cfd849009547329d871b1", + "url": "https://api.github.com/repos/laravel/pint/zipball/51f1ba679a6afe0315621ad143d788bd7ded0eca", + "reference": "51f1ba679a6afe0315621ad143d788bd7ded0eca", "shasum": "" }, "require": { @@ -4876,7 +4878,7 @@ "issues": "https://github.com/laravel/pint/issues", "source": "https://github.com/laravel/pint" }, - "time": "2024-06-18T16:50:05+00:00" + "time": "2024-07-09T15:58:08+00:00" }, { "name": "laravel/prompts", @@ -5063,16 +5065,16 @@ }, { "name": "laravel/socialite", - "version": "v5.15.0", + "version": "v5.15.1", "source": { "type": "git", "url": "https://github.com/laravel/socialite.git", - "reference": "c8234bfb286a8210df8d62f94562c71bfda4a446" + "reference": "cc02625f0bd1f95dc3688eb041cce0f1e709d029" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/socialite/zipball/c8234bfb286a8210df8d62f94562c71bfda4a446", - "reference": "c8234bfb286a8210df8d62f94562c71bfda4a446", + "url": "https://api.github.com/repos/laravel/socialite/zipball/cc02625f0bd1f95dc3688eb041cce0f1e709d029", + "reference": "cc02625f0bd1f95dc3688eb041cce0f1e709d029", "shasum": "" }, "require": { @@ -5131,7 +5133,7 @@ "issues": "https://github.com/laravel/socialite/issues", "source": "https://github.com/laravel/socialite" }, - "time": "2024-06-11T13:33:20+00:00" + "time": "2024-06-28T20:09:34+00:00" }, { "name": "laravel/tinker", @@ -5328,39 +5330,38 @@ }, { "name": "lcobucci/jwt", - "version": "4.3.0", + "version": "5.3.0", "source": { "type": "git", "url": "https://github.com/lcobucci/jwt.git", - "reference": "4d7de2fe0d51a96418c0d04004986e410e87f6b4" + "reference": "08071d8d2c7f4b00222cc4b1fb6aa46990a80f83" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/lcobucci/jwt/zipball/4d7de2fe0d51a96418c0d04004986e410e87f6b4", - "reference": "4d7de2fe0d51a96418c0d04004986e410e87f6b4", + "url": "https://api.github.com/repos/lcobucci/jwt/zipball/08071d8d2c7f4b00222cc4b1fb6aa46990a80f83", + "reference": "08071d8d2c7f4b00222cc4b1fb6aa46990a80f83", "shasum": "" }, "require": { - "ext-hash": "*", - "ext-json": "*", - "ext-mbstring": "*", "ext-openssl": "*", "ext-sodium": "*", - "lcobucci/clock": "^2.0 || ^3.0", - "php": "^7.4 || ^8.0" + "php": "~8.1.0 || ~8.2.0 || ~8.3.0", + "psr/clock": "^1.0" }, "require-dev": { - "infection/infection": "^0.21", - "lcobucci/coding-standard": "^6.0", - "mikey179/vfsstream": "^1.6.7", - "phpbench/phpbench": "^1.2", - "phpstan/extension-installer": "^1.0", - "phpstan/phpstan": "^1.4", - "phpstan/phpstan-deprecation-rules": "^1.0", - "phpstan/phpstan-phpunit": "^1.0", - "phpstan/phpstan-strict-rules": "^1.0", - "phpunit/php-invoker": "^3.1", - "phpunit/phpunit": "^9.5" + "infection/infection": "^0.27.0", + "lcobucci/clock": "^3.0", + "lcobucci/coding-standard": "^11.0", + "phpbench/phpbench": "^1.2.9", + "phpstan/extension-installer": "^1.2", + "phpstan/phpstan": "^1.10.7", + "phpstan/phpstan-deprecation-rules": "^1.1.3", + "phpstan/phpstan-phpunit": "^1.3.10", + "phpstan/phpstan-strict-rules": "^1.5.0", + "phpunit/phpunit": "^10.2.6" + }, + "suggest": { + "lcobucci/clock": ">= 3.0" }, "type": "library", "autoload": { @@ -5386,7 +5387,7 @@ ], "support": { "issues": "https://github.com/lcobucci/jwt/issues", - "source": "https://github.com/lcobucci/jwt/tree/4.3.0" + "source": "https://github.com/lcobucci/jwt/tree/5.3.0" }, "funding": [ { @@ -5398,7 +5399,7 @@ "type": "patreon" } ], - "time": "2023-01-02T13:28:00+00:00" + "time": "2024-04-11T23:07:54+00:00" }, { "name": "league/commonmark", @@ -6130,16 +6131,16 @@ }, { "name": "livewire/livewire", - "version": "v3.5.1", + "version": "v3.5.2", "source": { "type": "git", "url": "https://github.com/livewire/livewire.git", - "reference": "da044261bb5c5449397f18fda3409f14acf47c0a" + "reference": "636725c1f87bc7844dd80277488268db27eec1aa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/livewire/livewire/zipball/da044261bb5c5449397f18fda3409f14acf47c0a", - "reference": "da044261bb5c5449397f18fda3409f14acf47c0a", + "url": "https://api.github.com/repos/livewire/livewire/zipball/636725c1f87bc7844dd80277488268db27eec1aa", + "reference": "636725c1f87bc7844dd80277488268db27eec1aa", "shasum": "" }, "require": { @@ -6194,7 +6195,7 @@ "description": "A front-end framework for Laravel.", "support": { "issues": "https://github.com/livewire/livewire/issues", - "source": "https://github.com/livewire/livewire/tree/v3.5.1" + "source": "https://github.com/livewire/livewire/tree/v3.5.2" }, "funding": [ { @@ -6202,7 +6203,7 @@ "type": "github" } ], - "time": "2024-06-18T11:10:42+00:00" + "time": "2024-07-03T17:22:45+00:00" }, { "name": "maennchen/zipstream-php", @@ -6513,16 +6514,16 @@ }, { "name": "mollie/mollie-api-php", - "version": "v2.69.0", + "version": "v2.70.0", "source": { "type": "git", "url": "https://github.com/mollie/mollie-api-php.git", - "reference": "9a53f8bd6c89ae3e62982921a2f9d8ed68f9900d" + "reference": "a825578aba98605db3f6b6bc5b86c196276dc3f9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/mollie/mollie-api-php/zipball/9a53f8bd6c89ae3e62982921a2f9d8ed68f9900d", - "reference": "9a53f8bd6c89ae3e62982921a2f9d8ed68f9900d", + "url": "https://api.github.com/repos/mollie/mollie-api-php/zipball/a825578aba98605db3f6b6bc5b86c196276dc3f9", + "reference": "a825578aba98605db3f6b6bc5b86c196276dc3f9", "shasum": "" }, "require": { @@ -6599,9 +6600,9 @@ ], "support": { "issues": "https://github.com/mollie/mollie-api-php/issues", - "source": "https://github.com/mollie/mollie-api-php/tree/v2.69.0" + "source": "https://github.com/mollie/mollie-api-php/tree/v2.70.0" }, - "time": "2024-06-24T11:52:46+00:00" + "time": "2024-07-03T19:11:11+00:00" }, { "name": "moneyphp/money", @@ -6693,16 +6694,16 @@ }, { "name": "monolog/monolog", - "version": "3.6.0", + "version": "3.7.0", "source": { "type": "git", "url": "https://github.com/Seldaek/monolog.git", - "reference": "4b18b21a5527a3d5ffdac2fd35d3ab25a9597654" + "reference": "f4393b648b78a5408747de94fca38beb5f7e9ef8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/monolog/zipball/4b18b21a5527a3d5ffdac2fd35d3ab25a9597654", - "reference": "4b18b21a5527a3d5ffdac2fd35d3ab25a9597654", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/f4393b648b78a5408747de94fca38beb5f7e9ef8", + "reference": "f4393b648b78a5408747de94fca38beb5f7e9ef8", "shasum": "" }, "require": { @@ -6778,7 +6779,7 @@ ], "support": { "issues": "https://github.com/Seldaek/monolog/issues", - "source": "https://github.com/Seldaek/monolog/tree/3.6.0" + "source": "https://github.com/Seldaek/monolog/tree/3.7.0" }, "funding": [ { @@ -6790,7 +6791,7 @@ "type": "tidelift" } ], - "time": "2024-04-12T21:02:21+00:00" + "time": "2024-06-28T09:40:51+00:00" }, { "name": "mpdf/mpdf", @@ -7420,16 +7421,16 @@ }, { "name": "nikic/php-parser", - "version": "v5.0.2", + "version": "v5.1.0", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "139676794dc1e9231bf7bcd123cfc0c99182cb13" + "reference": "683130c2ff8c2739f4822ff7ac5c873ec529abd1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/139676794dc1e9231bf7bcd123cfc0c99182cb13", - "reference": "139676794dc1e9231bf7bcd123cfc0c99182cb13", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/683130c2ff8c2739f4822ff7ac5c873ec529abd1", + "reference": "683130c2ff8c2739f4822ff7ac5c873ec529abd1", "shasum": "" }, "require": { @@ -7440,7 +7441,7 @@ }, "require-dev": { "ircmaxell/php-yacc": "^0.0.7", - "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0" + "phpunit/phpunit": "^9.0" }, "bin": [ "bin/php-parse" @@ -7472,9 +7473,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v5.0.2" + "source": "https://github.com/nikic/PHP-Parser/tree/v5.1.0" }, - "time": "2024-03-05T20:51:40+00:00" + "time": "2024-07-01T20:03:41+00:00" }, { "name": "nordigen/nordigen-php", @@ -10183,16 +10184,16 @@ }, { "name": "rmccue/requests", - "version": "v2.0.11", + "version": "v2.0.12", "source": { "type": "git", "url": "https://github.com/WordPress/Requests.git", - "reference": "31435a468e2357e68df743f2527bda32556a0818" + "reference": "fb67e3d392ff6b89a90e96f19745662f4ecd62b1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/WordPress/Requests/zipball/31435a468e2357e68df743f2527bda32556a0818", - "reference": "31435a468e2357e68df743f2527bda32556a0818", + "url": "https://api.github.com/repos/WordPress/Requests/zipball/fb67e3d392ff6b89a90e96f19745662f4ecd62b1", + "reference": "fb67e3d392ff6b89a90e96f19745662f4ecd62b1", "shasum": "" }, "require": { @@ -10266,20 +10267,20 @@ "issues": "https://github.com/WordPress/Requests/issues", "source": "https://github.com/WordPress/Requests" }, - "time": "2024-03-25T10:48:46+00:00" + "time": "2024-07-08T08:10:42+00:00" }, { "name": "sabberworm/php-css-parser", - "version": "v8.5.1", + "version": "v8.6.0", "source": { "type": "git", "url": "https://github.com/MyIntervals/PHP-CSS-Parser.git", - "reference": "4a3d572b0f8b28bb6fd016ae8bbfc445facef152" + "reference": "d2fb94a9641be84d79c7548c6d39bbebba6e9a70" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/MyIntervals/PHP-CSS-Parser/zipball/4a3d572b0f8b28bb6fd016ae8bbfc445facef152", - "reference": "4a3d572b0f8b28bb6fd016ae8bbfc445facef152", + "url": "https://api.github.com/repos/MyIntervals/PHP-CSS-Parser/zipball/d2fb94a9641be84d79c7548c6d39bbebba6e9a70", + "reference": "d2fb94a9641be84d79c7548c6d39bbebba6e9a70", "shasum": "" }, "require": { @@ -10329,9 +10330,9 @@ ], "support": { "issues": "https://github.com/MyIntervals/PHP-CSS-Parser/issues", - "source": "https://github.com/MyIntervals/PHP-CSS-Parser/tree/v8.5.1" + "source": "https://github.com/MyIntervals/PHP-CSS-Parser/tree/v8.6.0" }, - "time": "2024-02-15T16:41:13+00:00" + "time": "2024-07-01T07:33:21+00:00" }, { "name": "sabre/uri", @@ -10960,16 +10961,16 @@ }, { "name": "socialiteproviders/microsoft", - "version": "4.3.0", + "version": "4.5.0", "source": { "type": "git", "url": "https://github.com/SocialiteProviders/Microsoft.git", - "reference": "9cda621d75b8681b9c0a015a766f05aa5d29d1d0" + "reference": "1a9928cb3091698c5c5ad108f5ff3b8a594e84fc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/SocialiteProviders/Microsoft/zipball/9cda621d75b8681b9c0a015a766f05aa5d29d1d0", - "reference": "9cda621d75b8681b9c0a015a766f05aa5d29d1d0", + "url": "https://api.github.com/repos/SocialiteProviders/Microsoft/zipball/1a9928cb3091698c5c5ad108f5ff3b8a594e84fc", + "reference": "1a9928cb3091698c5c5ad108f5ff3b8a594e84fc", "shasum": "" }, "require": { @@ -11006,7 +11007,7 @@ "issues": "https://github.com/socialiteproviders/providers/issues", "source": "https://github.com/socialiteproviders/providers" }, - "time": "2024-05-13T22:57:35+00:00" + "time": "2024-07-09T22:42:09+00:00" }, { "name": "sprain/swiss-qr-bill", @@ -11337,16 +11338,16 @@ }, { "name": "symfony/console", - "version": "v7.1.1", + "version": "v7.1.2", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "9b008f2d7b21c74ef4d0c3de6077a642bc55ece3" + "reference": "0aa29ca177f432ab68533432db0de059f39c92ae" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/9b008f2d7b21c74ef4d0c3de6077a642bc55ece3", - "reference": "9b008f2d7b21c74ef4d0c3de6077a642bc55ece3", + "url": "https://api.github.com/repos/symfony/console/zipball/0aa29ca177f432ab68533432db0de059f39c92ae", + "reference": "0aa29ca177f432ab68533432db0de059f39c92ae", "shasum": "" }, "require": { @@ -11410,7 +11411,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v7.1.1" + "source": "https://github.com/symfony/console/tree/v7.1.2" }, "funding": [ { @@ -11426,7 +11427,7 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:57:53+00:00" + "time": "2024-06-28T10:03:55+00:00" }, { "name": "symfony/css-selector", @@ -11562,16 +11563,16 @@ }, { "name": "symfony/error-handler", - "version": "v7.1.1", + "version": "v7.1.2", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "e9b8bbce0b4f322939332ab7b6b81d8c11da27dd" + "reference": "2412d3dddb5c9ea51a39cfbff1c565fc9844ca32" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/e9b8bbce0b4f322939332ab7b6b81d8c11da27dd", - "reference": "e9b8bbce0b4f322939332ab7b6b81d8c11da27dd", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/2412d3dddb5c9ea51a39cfbff1c565fc9844ca32", + "reference": "2412d3dddb5c9ea51a39cfbff1c565fc9844ca32", "shasum": "" }, "require": { @@ -11617,7 +11618,7 @@ "description": "Provides tools to manage errors and ease debugging PHP code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/error-handler/tree/v7.1.1" + "source": "https://github.com/symfony/error-handler/tree/v7.1.2" }, "funding": [ { @@ -11633,7 +11634,7 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:57:53+00:00" + "time": "2024-06-25T19:55:06+00:00" }, { "name": "symfony/event-dispatcher", @@ -11793,16 +11794,16 @@ }, { "name": "symfony/filesystem", - "version": "v7.1.1", + "version": "v7.1.2", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "802e87002f919296c9f606457d9fa327a0b3d6b2" + "reference": "92a91985250c251de9b947a14bb2c9390b1a562c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/802e87002f919296c9f606457d9fa327a0b3d6b2", - "reference": "802e87002f919296c9f606457d9fa327a0b3d6b2", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/92a91985250c251de9b947a14bb2c9390b1a562c", + "reference": "92a91985250c251de9b947a14bb2c9390b1a562c", "shasum": "" }, "require": { @@ -11839,7 +11840,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v7.1.1" + "source": "https://github.com/symfony/filesystem/tree/v7.1.2" }, "funding": [ { @@ -11855,7 +11856,7 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:57:53+00:00" + "time": "2024-06-28T10:03:55+00:00" }, { "name": "symfony/finder", @@ -11923,16 +11924,16 @@ }, { "name": "symfony/http-client", - "version": "v6.4.8", + "version": "v6.4.9", "source": { "type": "git", "url": "https://github.com/symfony/http-client.git", - "reference": "61faba993e620fc22d4f0ab3b6bcf8fbb0d44b05" + "reference": "6e9db0025db565bcf8f1d46ed734b549e51e6045" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client/zipball/61faba993e620fc22d4f0ab3b6bcf8fbb0d44b05", - "reference": "61faba993e620fc22d4f0ab3b6bcf8fbb0d44b05", + "url": "https://api.github.com/repos/symfony/http-client/zipball/6e9db0025db565bcf8f1d46ed734b549e51e6045", + "reference": "6e9db0025db565bcf8f1d46ed734b549e51e6045", "shasum": "" }, "require": { @@ -11996,7 +11997,7 @@ "http" ], "support": { - "source": "https://github.com/symfony/http-client/tree/v6.4.8" + "source": "https://github.com/symfony/http-client/tree/v6.4.9" }, "funding": [ { @@ -12012,7 +12013,7 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:49:08+00:00" + "time": "2024-06-28T07:59:05+00:00" }, { "name": "symfony/http-client-contracts", @@ -12171,16 +12172,16 @@ }, { "name": "symfony/http-kernel", - "version": "v7.1.1", + "version": "v7.1.2", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "fa8d1c75b5f33b1302afccf81811f93976c6e26f" + "reference": "ae3fa717db4d41a55d14c2bd92399e37cf5bc0f6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/fa8d1c75b5f33b1302afccf81811f93976c6e26f", - "reference": "fa8d1c75b5f33b1302afccf81811f93976c6e26f", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/ae3fa717db4d41a55d14c2bd92399e37cf5bc0f6", + "reference": "ae3fa717db4d41a55d14c2bd92399e37cf5bc0f6", "shasum": "" }, "require": { @@ -12265,7 +12266,7 @@ "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v7.1.1" + "source": "https://github.com/symfony/http-kernel/tree/v7.1.2" }, "funding": [ { @@ -12281,7 +12282,7 @@ "type": "tidelift" } ], - "time": "2024-06-04T06:52:15+00:00" + "time": "2024-06-28T13:13:31+00:00" }, { "name": "symfony/intl", @@ -12371,16 +12372,16 @@ }, { "name": "symfony/mailer", - "version": "v7.1.1", + "version": "v7.1.2", "source": { "type": "git", "url": "https://github.com/symfony/mailer.git", - "reference": "2eaad2e167cae930f25a3d731fec8b2ded5e751e" + "reference": "8fcff0af9043c8f8a8e229437cea363e282f9aee" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mailer/zipball/2eaad2e167cae930f25a3d731fec8b2ded5e751e", - "reference": "2eaad2e167cae930f25a3d731fec8b2ded5e751e", + "url": "https://api.github.com/repos/symfony/mailer/zipball/8fcff0af9043c8f8a8e229437cea363e282f9aee", + "reference": "8fcff0af9043c8f8a8e229437cea363e282f9aee", "shasum": "" }, "require": { @@ -12431,7 +12432,7 @@ "description": "Helps sending emails", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/mailer/tree/v7.1.1" + "source": "https://github.com/symfony/mailer/tree/v7.1.2" }, "funding": [ { @@ -12447,20 +12448,20 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:57:53+00:00" + "time": "2024-06-28T08:00:31+00:00" }, { "name": "symfony/mailgun-mailer", - "version": "v6.4.8", + "version": "v6.4.9", "source": { "type": "git", "url": "https://github.com/symfony/mailgun-mailer.git", - "reference": "748e534d760f9a9318319cbd2adec7c05055ee3c" + "reference": "c4917eb14f31fb5c21442375c6baf7f51bd924e8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mailgun-mailer/zipball/748e534d760f9a9318319cbd2adec7c05055ee3c", - "reference": "748e534d760f9a9318319cbd2adec7c05055ee3c", + "url": "https://api.github.com/repos/symfony/mailgun-mailer/zipball/c4917eb14f31fb5c21442375c6baf7f51bd924e8", + "reference": "c4917eb14f31fb5c21442375c6baf7f51bd924e8", "shasum": "" }, "require": { @@ -12500,7 +12501,7 @@ "description": "Symfony Mailgun Mailer Bridge", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/mailgun-mailer/tree/v6.4.8" + "source": "https://github.com/symfony/mailgun-mailer/tree/v6.4.9" }, "funding": [ { @@ -12516,20 +12517,20 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:49:08+00:00" + "time": "2024-06-28T07:59:05+00:00" }, { "name": "symfony/mime", - "version": "v7.1.1", + "version": "v7.1.2", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "21027eaacc1a8a20f5e616c25c3580f5dd3a15df" + "reference": "26a00b85477e69a4bab63b66c5dce64f18b0cbfc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/21027eaacc1a8a20f5e616c25c3580f5dd3a15df", - "reference": "21027eaacc1a8a20f5e616c25c3580f5dd3a15df", + "url": "https://api.github.com/repos/symfony/mime/zipball/26a00b85477e69a4bab63b66c5dce64f18b0cbfc", + "reference": "26a00b85477e69a4bab63b66c5dce64f18b0cbfc", "shasum": "" }, "require": { @@ -12584,7 +12585,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v7.1.1" + "source": "https://github.com/symfony/mime/tree/v7.1.2" }, "funding": [ { @@ -12600,7 +12601,7 @@ "type": "tidelift" } ], - "time": "2024-06-04T06:40:14+00:00" + "time": "2024-06-28T10:03:55+00:00" }, { "name": "symfony/options-resolver", @@ -13672,16 +13673,16 @@ }, { "name": "symfony/property-info", - "version": "v7.1.1", + "version": "v7.1.2", "source": { "type": "git", "url": "https://github.com/symfony/property-info.git", - "reference": "0f80f818c6728f15de30a4f89866d68e4912ae84" + "reference": "d7b91e4aa07e822a9b935fc29a7254c12d502f16" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/property-info/zipball/0f80f818c6728f15de30a4f89866d68e4912ae84", - "reference": "0f80f818c6728f15de30a4f89866d68e4912ae84", + "url": "https://api.github.com/repos/symfony/property-info/zipball/d7b91e4aa07e822a9b935fc29a7254c12d502f16", + "reference": "d7b91e4aa07e822a9b935fc29a7254c12d502f16", "shasum": "" }, "require": { @@ -13736,7 +13737,7 @@ "validator" ], "support": { - "source": "https://github.com/symfony/property-info/tree/v7.1.1" + "source": "https://github.com/symfony/property-info/tree/v7.1.2" }, "funding": [ { @@ -13752,7 +13753,7 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:57:53+00:00" + "time": "2024-06-26T07:21:35+00:00" }, { "name": "symfony/psr-http-message-bridge", @@ -13920,16 +13921,16 @@ }, { "name": "symfony/serializer", - "version": "v7.1.1", + "version": "v7.1.2", "source": { "type": "git", "url": "https://github.com/symfony/serializer.git", - "reference": "74817ee48e37cce1a1b33c66ffdb750e7e048c3c" + "reference": "d2077674aaaff02a95f290de512aa358947e6bbe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/serializer/zipball/74817ee48e37cce1a1b33c66ffdb750e7e048c3c", - "reference": "74817ee48e37cce1a1b33c66ffdb750e7e048c3c", + "url": "https://api.github.com/repos/symfony/serializer/zipball/d2077674aaaff02a95f290de512aa358947e6bbe", + "reference": "d2077674aaaff02a95f290de512aa358947e6bbe", "shasum": "" }, "require": { @@ -13997,7 +13998,7 @@ "description": "Handles serializing and deserializing data structures, including object graphs, into array structures or other formats like XML and JSON.", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/serializer/tree/v7.1.1" + "source": "https://github.com/symfony/serializer/tree/v7.1.2" }, "funding": [ { @@ -14013,7 +14014,7 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:57:53+00:00" + "time": "2024-06-28T07:42:43+00:00" }, { "name": "symfony/service-contracts", @@ -14100,16 +14101,16 @@ }, { "name": "symfony/string", - "version": "v7.1.1", + "version": "v7.1.2", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "60bc311c74e0af215101235aa6f471bcbc032df2" + "reference": "14221089ac66cf82e3cf3d1c1da65de305587ff8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/60bc311c74e0af215101235aa6f471bcbc032df2", - "reference": "60bc311c74e0af215101235aa6f471bcbc032df2", + "url": "https://api.github.com/repos/symfony/string/zipball/14221089ac66cf82e3cf3d1c1da65de305587ff8", + "reference": "14221089ac66cf82e3cf3d1c1da65de305587ff8", "shasum": "" }, "require": { @@ -14167,7 +14168,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v7.1.1" + "source": "https://github.com/symfony/string/tree/v7.1.2" }, "funding": [ { @@ -14183,7 +14184,7 @@ "type": "tidelift" } ], - "time": "2024-06-04T06:40:14+00:00" + "time": "2024-06-28T09:27:18+00:00" }, { "name": "symfony/translation", @@ -14515,16 +14516,16 @@ }, { "name": "symfony/validator", - "version": "v7.1.1", + "version": "v7.1.2", "source": { "type": "git", "url": "https://github.com/symfony/validator.git", - "reference": "fcab7598968b21c361becc930fcae8846638c4c0" + "reference": "bed12b7d5bd4dac452db5fa6203331c876b489e7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/validator/zipball/fcab7598968b21c361becc930fcae8846638c4c0", - "reference": "fcab7598968b21c361becc930fcae8846638c4c0", + "url": "https://api.github.com/repos/symfony/validator/zipball/bed12b7d5bd4dac452db5fa6203331c876b489e7", + "reference": "bed12b7d5bd4dac452db5fa6203331c876b489e7", "shasum": "" }, "require": { @@ -14592,7 +14593,7 @@ "description": "Provides tools to validate values", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/validator/tree/v7.1.1" + "source": "https://github.com/symfony/validator/tree/v7.1.2" }, "funding": [ { @@ -14608,20 +14609,20 @@ "type": "tidelift" } ], - "time": "2024-06-04T05:58:56+00:00" + "time": "2024-06-25T19:55:06+00:00" }, { "name": "symfony/var-dumper", - "version": "v7.1.1", + "version": "v7.1.2", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "deb2c2b506ff6fdbb340e00b34e9901e1605f293" + "reference": "5857c57c6b4b86524c08cf4f4bc95327270a816d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/deb2c2b506ff6fdbb340e00b34e9901e1605f293", - "reference": "deb2c2b506ff6fdbb340e00b34e9901e1605f293", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/5857c57c6b4b86524c08cf4f4bc95327270a816d", + "reference": "5857c57c6b4b86524c08cf4f4bc95327270a816d", "shasum": "" }, "require": { @@ -14675,7 +14676,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v7.1.1" + "source": "https://github.com/symfony/var-dumper/tree/v7.1.2" }, "funding": [ { @@ -14691,7 +14692,7 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:57:53+00:00" + "time": "2024-06-28T08:00:31+00:00" }, { "name": "symfony/yaml", @@ -16461,16 +16462,16 @@ }, { "name": "larastan/larastan", - "version": "v2.9.7", + "version": "v2.9.8", "source": { "type": "git", "url": "https://github.com/larastan/larastan.git", - "reference": "5c805f636095cc2e0b659e3954775cf8f1dad1bb" + "reference": "340badd89b0eb5bddbc503a4829c08cf9a2819d7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/larastan/larastan/zipball/5c805f636095cc2e0b659e3954775cf8f1dad1bb", - "reference": "5c805f636095cc2e0b659e3954775cf8f1dad1bb", + "url": "https://api.github.com/repos/larastan/larastan/zipball/340badd89b0eb5bddbc503a4829c08cf9a2819d7", + "reference": "340badd89b0eb5bddbc503a4829c08cf9a2819d7", "shasum": "" }, "require": { @@ -16484,7 +16485,7 @@ "illuminate/support": "^9.52.16 || ^10.28.0 || ^11.0", "php": "^8.0.2", "phpmyadmin/sql-parser": "^5.9.0", - "phpstan/phpstan": "^1.11.1" + "phpstan/phpstan": "^1.11.2" }, "require-dev": { "doctrine/coding-standard": "^12.0", @@ -16539,7 +16540,7 @@ ], "support": { "issues": "https://github.com/larastan/larastan/issues", - "source": "https://github.com/larastan/larastan/tree/v2.9.7" + "source": "https://github.com/larastan/larastan/tree/v2.9.8" }, "funding": [ { @@ -16559,7 +16560,7 @@ "type": "patreon" } ], - "time": "2024-05-27T18:33:26+00:00" + "time": "2024-07-06T17:46:02+00:00" }, { "name": "maximebf/debugbar", @@ -17017,16 +17018,16 @@ }, { "name": "phpstan/phpstan", - "version": "1.11.5", + "version": "1.11.7", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "490f0ae1c92b082f154681d7849aee776a7c1443" + "reference": "52d2bbfdcae7f895915629e4694e9497d0f8e28d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/490f0ae1c92b082f154681d7849aee776a7c1443", - "reference": "490f0ae1c92b082f154681d7849aee776a7c1443", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/52d2bbfdcae7f895915629e4694e9497d0f8e28d", + "reference": "52d2bbfdcae7f895915629e4694e9497d0f8e28d", "shasum": "" }, "require": { @@ -17071,20 +17072,20 @@ "type": "github" } ], - "time": "2024-06-17T15:10:54+00:00" + "time": "2024-07-06T11:17:41+00:00" }, { "name": "phpunit/php-code-coverage", - "version": "10.1.14", + "version": "10.1.15", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "e3f51450ebffe8e0efdf7346ae966a656f7d5e5b" + "reference": "5da8b1728acd1e6ffdf2ff32ffbdfd04307f26ae" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/e3f51450ebffe8e0efdf7346ae966a656f7d5e5b", - "reference": "e3f51450ebffe8e0efdf7346ae966a656f7d5e5b", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/5da8b1728acd1e6ffdf2ff32ffbdfd04307f26ae", + "reference": "5da8b1728acd1e6ffdf2ff32ffbdfd04307f26ae", "shasum": "" }, "require": { @@ -17141,7 +17142,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.14" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.15" }, "funding": [ { @@ -17149,7 +17150,7 @@ "type": "github" } ], - "time": "2024-03-12T15:33:41+00:00" + "time": "2024-06-29T08:25:15+00:00" }, { "name": "phpunit/php-file-iterator", @@ -17396,16 +17397,16 @@ }, { "name": "phpunit/phpunit", - "version": "10.5.24", + "version": "10.5.27", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "5f124e3e3e561006047b532fd0431bf5bb6b9015" + "reference": "2425f713b2a5350568ccb1a2d3984841a23e83c5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/5f124e3e3e561006047b532fd0431bf5bb6b9015", - "reference": "5f124e3e3e561006047b532fd0431bf5bb6b9015", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/2425f713b2a5350568ccb1a2d3984841a23e83c5", + "reference": "2425f713b2a5350568ccb1a2d3984841a23e83c5", "shasum": "" }, "require": { @@ -17415,26 +17416,26 @@ "ext-mbstring": "*", "ext-xml": "*", "ext-xmlwriter": "*", - "myclabs/deep-copy": "^1.10.1", - "phar-io/manifest": "^2.0.3", - "phar-io/version": "^3.0.2", + "myclabs/deep-copy": "^1.12.0", + "phar-io/manifest": "^2.0.4", + "phar-io/version": "^3.2.1", "php": ">=8.1", - "phpunit/php-code-coverage": "^10.1.5", - "phpunit/php-file-iterator": "^4.0", - "phpunit/php-invoker": "^4.0", - "phpunit/php-text-template": "^3.0", - "phpunit/php-timer": "^6.0", - "sebastian/cli-parser": "^2.0", - "sebastian/code-unit": "^2.0", - "sebastian/comparator": "^5.0", - "sebastian/diff": "^5.0", - "sebastian/environment": "^6.0", - "sebastian/exporter": "^5.1", - "sebastian/global-state": "^6.0.1", - "sebastian/object-enumerator": "^5.0", - "sebastian/recursion-context": "^5.0", - "sebastian/type": "^4.0", - "sebastian/version": "^4.0" + "phpunit/php-code-coverage": "^10.1.15", + "phpunit/php-file-iterator": "^4.1.0", + "phpunit/php-invoker": "^4.0.0", + "phpunit/php-text-template": "^3.0.1", + "phpunit/php-timer": "^6.0.0", + "sebastian/cli-parser": "^2.0.1", + "sebastian/code-unit": "^2.0.0", + "sebastian/comparator": "^5.0.1", + "sebastian/diff": "^5.1.1", + "sebastian/environment": "^6.1.0", + "sebastian/exporter": "^5.1.2", + "sebastian/global-state": "^6.0.2", + "sebastian/object-enumerator": "^5.0.0", + "sebastian/recursion-context": "^5.0.0", + "sebastian/type": "^4.0.0", + "sebastian/version": "^4.0.1" }, "suggest": { "ext-soap": "To be able to generate mocks based on WSDL files" @@ -17477,7 +17478,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.24" + "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.27" }, "funding": [ { @@ -17493,7 +17494,7 @@ "type": "tidelift" } ], - "time": "2024-06-20T13:09:54+00:00" + "time": "2024-07-10T11:48:06+00:00" }, { "name": "react/cache", @@ -19006,16 +19007,16 @@ }, { "name": "spatie/error-solutions", - "version": "1.0.3", + "version": "1.0.5", "source": { "type": "git", "url": "https://github.com/spatie/error-solutions.git", - "reference": "55ea4117e0fde89d520883734ab9b71064c48876" + "reference": "4bb6c734dc992b2db3e26df1ef021c75d2218b13" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/error-solutions/zipball/55ea4117e0fde89d520883734ab9b71064c48876", - "reference": "55ea4117e0fde89d520883734ab9b71064c48876", + "url": "https://api.github.com/repos/spatie/error-solutions/zipball/4bb6c734dc992b2db3e26df1ef021c75d2218b13", + "reference": "4bb6c734dc992b2db3e26df1ef021c75d2218b13", "shasum": "" }, "require": { @@ -19068,7 +19069,7 @@ ], "support": { "issues": "https://github.com/spatie/error-solutions/issues", - "source": "https://github.com/spatie/error-solutions/tree/1.0.3" + "source": "https://github.com/spatie/error-solutions/tree/1.0.5" }, "funding": [ { @@ -19076,7 +19077,7 @@ "type": "github" } ], - "time": "2024-06-27T12:22:48+00:00" + "time": "2024-07-09T12:13:32+00:00" }, { "name": "spatie/flare-client-php", From 273fe4d6ebab4fce84754756642fe50e1f40152d Mon Sep 17 00:00:00 2001 From: David Bomba Date: Sun, 14 Jul 2024 08:50:29 +1000 Subject: [PATCH 03/45] Add product fields to import map --- app/Import/Definitions/ProductMap.php | 4 ++++ app/Import/Transformer/Csv/ProductTransformer.php | 1 + 2 files changed, 5 insertions(+) diff --git a/app/Import/Definitions/ProductMap.php b/app/Import/Definitions/ProductMap.php index b6f38a550418..199434642be5 100644 --- a/app/Import/Definitions/ProductMap.php +++ b/app/Import/Definitions/ProductMap.php @@ -33,6 +33,8 @@ class ProductMap 14 => 'product.custom_value4', 15 => 'product.image_url', 16 => 'product.in_stock_quantity', + 17 => 'product.tax_category', + 18 => 'product.max_quantity', ]; } @@ -56,6 +58,8 @@ class ProductMap 14 => 'texts.custom_value', 15 => 'texts.image_url', 16 => 'texts.in_stock_quantity', + 17 => 'texts.tax_category', + 18 => 'texts.max_quantity', ]; } } diff --git a/app/Import/Transformer/Csv/ProductTransformer.php b/app/Import/Transformer/Csv/ProductTransformer.php index a1829df41912..da871c0d9ae6 100644 --- a/app/Import/Transformer/Csv/ProductTransformer.php +++ b/app/Import/Transformer/Csv/ProductTransformer.php @@ -43,6 +43,7 @@ class ProductTransformer extends BaseTransformer 'custom_value3' => $this->getString($data, 'product.custom_value3'), 'custom_value4' => $this->getString($data, 'product.custom_value4'), 'product_image' => $this->getString($data, 'product.image_url'), + 'in_stock_quantity' => $this->getFloat($data, 'product.in_stock_quantity'), ]; } } From 510953630e4bc1ae38f9c58af2b8a8c35caac90a Mon Sep 17 00:00:00 2001 From: Lars Kusch Date: Sun, 14 Jul 2024 07:05:08 +0200 Subject: [PATCH 04/45] Added option to enable/disable xml-attachments in the e-mail --- app/Services/Email/EmailDefaults.php | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/app/Services/Email/EmailDefaults.php b/app/Services/Email/EmailDefaults.php index 25a7d0204b32..01ad0c0ae54c 100644 --- a/app/Services/Email/EmailDefaults.php +++ b/app/Services/Email/EmailDefaults.php @@ -327,10 +327,12 @@ class EmailDefaults } /** E-Invoice xml file */ if ($this->email->email_object->settings->enable_e_invoice) { - $xml_string = $this->email->email_object->entity->service()->getEDocument(); + if ($this->email_object->settings->e_invoice_attachment ?? true){ + $xml_string = $this->email->email_object->entity->service()->getEDocument(); - if($xml_string) { - $this->email->email_object->attachments = array_merge($this->email->email_object->attachments, [['file' => base64_encode($xml_string), 'name' => explode(".", $this->email->email_object->entity->getFileName('xml'))[0]."-e_invoice.xml"]]); + if($xml_string) { + $this->email->email_object->attachments = array_merge($this->email->email_object->attachments, [['file' => base64_encode($xml_string), 'name' => explode(".", $this->email->email_object->entity->getFileName('xml'))[0]."-e_invoice.xml"]]); + } } } From 5dd412b1e4cb02ab18fc07018a72bff500d69ac7 Mon Sep 17 00:00:00 2001 From: Hillel Coren Date: Sun, 14 Jul 2024 09:00:05 +0300 Subject: [PATCH 05/45] fix for setup error introduced with migration check --- app/Utils/SystemHealth.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Utils/SystemHealth.php b/app/Utils/SystemHealth.php index f9505c22796a..c5ddc8eda895 100644 --- a/app/Utils/SystemHealth.php +++ b/app/Utils/SystemHealth.php @@ -89,7 +89,7 @@ class SystemHealth 'exchange_rate_api_not_configured' => (bool)self::checkCurrencySanity(), 'api_version' => (string) config('ninja.app_version'), 'is_docker' => (bool) config('ninja.is_docker'), - 'pending_migrations' => self::checkPendingMigrations(), + 'pending_migrations' => (bool) ($check_file_system ? self::checkPendingMigrations() : ''), ]; } From 24b3a4df35f511d7c17b4abb3820b20e9c9e95c2 Mon Sep 17 00:00:00 2001 From: Hillel Coren Date: Sun, 14 Jul 2024 09:14:58 +0300 Subject: [PATCH 06/45] fix for setup error introduced with migration check --- app/Utils/SystemHealth.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Utils/SystemHealth.php b/app/Utils/SystemHealth.php index c5ddc8eda895..6dfbaf0562e9 100644 --- a/app/Utils/SystemHealth.php +++ b/app/Utils/SystemHealth.php @@ -89,7 +89,7 @@ class SystemHealth 'exchange_rate_api_not_configured' => (bool)self::checkCurrencySanity(), 'api_version' => (string) config('ninja.app_version'), 'is_docker' => (bool) config('ninja.is_docker'), - 'pending_migrations' => (bool) ($check_file_system ? self::checkPendingMigrations() : ''), + 'pending_migrations' => (bool) ($check_file_system ? self::checkPendingMigrations() : false), ]; } From d818520c7344d9a887cfe08188030be74dcf0d8c Mon Sep 17 00:00:00 2001 From: David Bomba Date: Sun, 14 Jul 2024 21:28:54 +1000 Subject: [PATCH 07/45] Static analysis --- app/Export/CSV/ContactExport.php | 2 ++ app/Export/CSV/CreditExport.php | 3 +++ app/Export/CSV/DocumentExport.php | 3 +++ app/Export/CSV/ExpenseExport.php | 4 ++++ app/Export/CSV/InvoiceExport.php | 4 ++++ app/Export/CSV/InvoiceItemExport.php | 4 ++++ app/Export/CSV/PaymentExport.php | 4 ++++ app/Export/CSV/ProductExport.php | 6 +++++- app/Export/CSV/PurchaseOrderExport.php | 6 +++++- app/Export/CSV/PurchaseOrderItemExport.php | 16 ++++++++++------ app/Export/CSV/QuoteExport.php | 4 ++++ app/Export/CSV/QuoteItemExport.php | 4 ++++ app/Export/CSV/RecurringInvoiceExport.php | 4 ++++ app/Export/CSV/TaskExport.php | 5 ++++- app/Export/CSV/VendorExport.php | 6 +++++- app/Helpers/Mail/GmailTransport.php | 2 +- app/Helpers/Mail/Office365MailTransport.php | 3 ++- app/Http/Controllers/Auth/LoginController.php | 12 +++++------- app/Http/Controllers/Bank/YodleeController.php | 2 +- .../Controllers/BankIntegrationController.php | 9 ++++++--- app/Http/Controllers/BaseController.php | 8 ++------ .../ClientPortal/PaymentController.php | 2 +- app/Http/Controllers/DocumentController.php | 2 +- .../PaymentNotificationWebhookController.php | 3 ++- app/Http/Controllers/PreviewController.php | 2 +- app/Http/Requests/Client/UpdateClientRequest.php | 11 +++++++---- .../PaymentMethod/CreatePaymentMethodRequest.php | 2 +- .../StoreCompanyGatewayRequest.php | 2 +- .../UpdateCompanyGatewayRequest.php | 2 +- .../BulkRecurringExpenseRequest.php | 5 ++++- app/Http/Requests/Vendor/BulkVendorRequest.php | 6 +++++- app/Jobs/Bank/MatchBankTransactions.php | 2 +- app/Jobs/Bank/ProcessBankTransactionsYodlee.php | 8 +------- app/Jobs/Brevo/ProcessBrevoWebhook.php | 3 +-- app/Jobs/Client/CheckVat.php | 2 +- app/Jobs/Company/CompanyExport.php | 3 ++- app/Jobs/Company/CompanyTaxRate.php | 2 +- app/Jobs/Cron/AutoBillCron.php | 4 ++-- app/Jobs/Document/CopyDocs.php | 4 +++- app/Jobs/Invoice/CreateUbl.php | 2 +- app/Jobs/Ledger/ClientLedgerBalanceUpdate.php | 2 +- app/Jobs/Mailgun/ProcessMailgunWebhook.php | 2 +- app/Jobs/PostMark/ProcessPostmarkWebhook.php | 2 +- app/Jobs/Util/Import.php | 2 +- app/Jobs/Util/UploadAvatar.php | 2 +- app/Jobs/Util/VersionCheck.php | 4 ++-- app/Libraries/InApp/StoreKit/Apple.php | 2 +- app/Models/Backup.php | 2 +- app/Models/BankTransaction.php | 2 +- app/Models/Client.php | 6 +++--- app/Models/DateFormat.php | 2 +- app/Models/DatetimeFormat.php | 2 +- app/Models/Gateway.php | 2 +- app/PaymentDrivers/BaseDriver.php | 1 + app/PaymentDrivers/Braintree/CreditCard.php | 4 ++-- app/PaymentDrivers/BraintreePaymentDriver.php | 2 +- app/PaymentDrivers/CheckoutComPaymentDriver.php | 2 +- app/PaymentDrivers/PayPal/PayPalWebhook.php | 1 - app/PaymentDrivers/SquarePaymentDriver.php | 2 +- app/PaymentDrivers/Stripe/ACSS.php | 1 + app/PaymentDrivers/Stripe/ImportCustomers.php | 2 +- app/Repositories/ActivityRepository.php | 2 +- app/Repositories/SubscriptionRepository.php | 2 +- app/Services/Client/PaymentMethod.php | 2 +- app/Services/Client/Statement.php | 3 +-- .../Standards/Validation/Peppol/CompanyLevel.php | 6 +++--- app/Services/Invoice/AutoBillInvoice.php | 2 +- app/Services/Pdf/PdfConfiguration.php | 2 +- app/Utils/SystemHealth.php | 2 +- app/Utils/Traits/CompanySettingsSaver.php | 2 +- app/Utils/Traits/GeneratesCounter.php | 2 +- 71 files changed, 155 insertions(+), 95 deletions(-) diff --git a/app/Export/CSV/ContactExport.php b/app/Export/CSV/ContactExport.php index 21c673b49d96..74d0b00bdce8 100644 --- a/app/Export/CSV/ContactExport.php +++ b/app/Export/CSV/ContactExport.php @@ -82,6 +82,7 @@ class ContactExport extends BaseExport $this->csv->insertOne($this->buildHeader()); $query->cursor()->each(function ($contact) { + /** @var \App\Models\ClientContact $contact */ $this->csv->insertOne($this->buildRow($contact)); }); @@ -101,6 +102,7 @@ class ContactExport extends BaseExport $report = $query->cursor() ->map(function ($contact) { + /** @var \App\Models\ClientContact $contact */ $row = $this->buildRow($contact); return $this->processMetaData($row, $contact); })->toArray(); diff --git a/app/Export/CSV/CreditExport.php b/app/Export/CSV/CreditExport.php index 5f1e8b56d19d..7450b4114611 100644 --- a/app/Export/CSV/CreditExport.php +++ b/app/Export/CSV/CreditExport.php @@ -52,6 +52,8 @@ class CreditExport extends BaseExport $report = $query->cursor() ->map(function ($credit) { + + /** @var \App\Models\Credit $credit */ $row = $this->buildRow($credit); return $this->processMetaData($row, $credit); })->toArray(); @@ -139,6 +141,7 @@ class CreditExport extends BaseExport $query->cursor() ->each(function ($credit) { + /** @var \App\Models\Credit $credit */ $this->csv->insertOne($this->buildRow($credit)); }); diff --git a/app/Export/CSV/DocumentExport.php b/app/Export/CSV/DocumentExport.php index 8adfe57a0525..cfcebbc062a6 100644 --- a/app/Export/CSV/DocumentExport.php +++ b/app/Export/CSV/DocumentExport.php @@ -54,6 +54,8 @@ class DocumentExport extends BaseExport $report = $query->cursor() ->map(function ($document) { + + /** @var \App\Models\Document $document */ $row = $this->buildRow($document); return $this->processMetaData($row, $document); })->toArray(); @@ -99,6 +101,7 @@ class DocumentExport extends BaseExport $query->cursor() ->each(function ($entity) { + /** @var mixed $entity */ $this->csv->insertOne($this->buildRow($entity)); }); diff --git a/app/Export/CSV/ExpenseExport.php b/app/Export/CSV/ExpenseExport.php index 0af4d3faf74d..67894954638b 100644 --- a/app/Export/CSV/ExpenseExport.php +++ b/app/Export/CSV/ExpenseExport.php @@ -52,6 +52,8 @@ class ExpenseExport extends BaseExport $report = $query->cursor() ->map(function ($resource) { + + /** @var \App\Models\Expense $resource */ $row = $this->buildRow($resource); return $this->processMetaData($row, $resource); })->toArray(); @@ -132,6 +134,8 @@ class ExpenseExport extends BaseExport $query->cursor() ->each(function ($expense) { + + /** @var \App\Models\Expense $expense */ $this->csv->insertOne($this->buildRow($expense)); }); diff --git a/app/Export/CSV/InvoiceExport.php b/app/Export/CSV/InvoiceExport.php index d0839d03d6fb..d87c49ff943c 100644 --- a/app/Export/CSV/InvoiceExport.php +++ b/app/Export/CSV/InvoiceExport.php @@ -99,6 +99,8 @@ class InvoiceExport extends BaseExport $report = $query->cursor() ->map(function ($resource) { + + /** @var \App\Models\Invoice $resource */ $row = $this->buildRow($resource); return $this->processMetaData($row, $resource); })->toArray(); @@ -119,6 +121,8 @@ class InvoiceExport extends BaseExport $query->cursor() ->each(function ($invoice) { + + /** @var \App\Models\Invoice $invoice */ $this->csv->insertOne($this->buildRow($invoice)); }); diff --git a/app/Export/CSV/InvoiceItemExport.php b/app/Export/CSV/InvoiceItemExport.php index 0e5efcac0b6d..14a38aebee27 100644 --- a/app/Export/CSV/InvoiceItemExport.php +++ b/app/Export/CSV/InvoiceItemExport.php @@ -113,6 +113,8 @@ class InvoiceItemExport extends BaseExport $query->cursor() ->each(function ($resource) { + + /** @var \App\Models\Invoice $resource */ $this->iterateItems($resource); foreach($this->storage_array as $row) { @@ -141,6 +143,8 @@ class InvoiceItemExport extends BaseExport $query->cursor() ->each(function ($invoice) { + + /** @var \App\Models\Invoice $invoice */ $this->iterateItems($invoice); }); diff --git a/app/Export/CSV/PaymentExport.php b/app/Export/CSV/PaymentExport.php index d427b3ebe1d6..167514781277 100644 --- a/app/Export/CSV/PaymentExport.php +++ b/app/Export/CSV/PaymentExport.php @@ -92,6 +92,8 @@ class PaymentExport extends BaseExport $report = $query->cursor() ->map(function ($resource) { + + /** @var \App\Models\Payment $resource */ $row = $this->buildRow($resource); return $this->processMetaData($row, $resource); })->toArray(); @@ -112,6 +114,8 @@ class PaymentExport extends BaseExport $query->cursor() ->each(function ($entity) { + + /** @var \App\Models\Payment $entity */ $this->csv->insertOne($this->buildRow($entity)); }); diff --git a/app/Export/CSV/ProductExport.php b/app/Export/CSV/ProductExport.php index 69bdca55cffb..dba1b8622833 100644 --- a/app/Export/CSV/ProductExport.php +++ b/app/Export/CSV/ProductExport.php @@ -51,6 +51,8 @@ class ProductExport extends BaseExport $report = $query->cursor() ->map(function ($resource) { + + /** @var \App\Models\Product $resource */ $row = $this->buildRow($resource); return $this->processMetaData($row, $resource); })->toArray(); @@ -103,7 +105,9 @@ class ProductExport extends BaseExport $query->cursor() ->each(function ($entity) { - $this->csv->insertOne($this->buildRow($entity)); + + /** @var \App\Models\Product $entity */ + $this->csv->insertOne($this->buildRow($entity)); }); return $this->csv->toString(); diff --git a/app/Export/CSV/PurchaseOrderExport.php b/app/Export/CSV/PurchaseOrderExport.php index e1091dd6672f..1e60e26424c6 100644 --- a/app/Export/CSV/PurchaseOrderExport.php +++ b/app/Export/CSV/PurchaseOrderExport.php @@ -98,6 +98,8 @@ class PurchaseOrderExport extends BaseExport $report = $query->cursor() ->map(function ($resource) { + + /** @var \App\Models\PurchaseOrder $resource */ $row = $this->buildRow($resource); return $this->processMetaData($row, $resource); })->toArray(); @@ -119,7 +121,9 @@ class PurchaseOrderExport extends BaseExport $query->cursor() ->each(function ($purchase_order) { - $this->csv->insertOne($this->buildRow($purchase_order)); + + /** @var \App\Models\PurchaseOrder $purchase_order */ + $this->csv->insertOne($this->buildRow($purchase_order)); }); return $this->csv->toString(); diff --git a/app/Export/CSV/PurchaseOrderItemExport.php b/app/Export/CSV/PurchaseOrderItemExport.php index bf39cc26efe7..4892436a6015 100644 --- a/app/Export/CSV/PurchaseOrderItemExport.php +++ b/app/Export/CSV/PurchaseOrderItemExport.php @@ -101,13 +101,15 @@ class PurchaseOrderItemExport extends BaseExport $query->cursor() ->each(function ($resource) { - $this->iterateItems($resource); + + /** @var \App\Models\PurchaseOrder $resource */ + $this->iterateItems($resource); - foreach($this->storage_array as $row) { - $this->storage_item_array[] = $this->processItemMetaData($row, $resource); - } + foreach($this->storage_array as $row) { + $this->storage_item_array[] = $this->processItemMetaData($row, $resource); + } - $this->storage_array = []; + $this->storage_array = []; }); @@ -127,7 +129,9 @@ class PurchaseOrderItemExport extends BaseExport $query->cursor() ->each(function ($purchase_order) { - $this->iterateItems($purchase_order); + + /** @var \App\Models\PurchaseOrder $purchase_order */ + $this->iterateItems($purchase_order); }); $this->csv->insertAll($this->storage_array); diff --git a/app/Export/CSV/QuoteExport.php b/app/Export/CSV/QuoteExport.php index 7c77fd990595..4d404d4ca3e8 100644 --- a/app/Export/CSV/QuoteExport.php +++ b/app/Export/CSV/QuoteExport.php @@ -103,6 +103,8 @@ class QuoteExport extends BaseExport $report = $query->cursor() ->map(function ($resource) { + + /** @var \App\Models\Quote $resource */ $row = $this->buildRow($resource); return $this->processMetaData($row, $resource); })->toArray(); @@ -125,6 +127,8 @@ class QuoteExport extends BaseExport $query->cursor() ->each(function ($quote) { + + /** @var \App\Models\Quote $quote */ $this->csv->insertOne($this->buildRow($quote)); }); diff --git a/app/Export/CSV/QuoteItemExport.php b/app/Export/CSV/QuoteItemExport.php index ddc7279605f9..2e8e5a008939 100644 --- a/app/Export/CSV/QuoteItemExport.php +++ b/app/Export/CSV/QuoteItemExport.php @@ -104,6 +104,8 @@ class QuoteItemExport extends BaseExport $query->cursor() ->each(function ($resource) { + + /** @var \App\Models\Quote $resource */ $this->iterateItems($resource); foreach($this->storage_array as $row) { @@ -134,6 +136,8 @@ class QuoteItemExport extends BaseExport $query->cursor() ->each(function ($quote) { + + /** @var \App\Models\Quote $quote */ $this->iterateItems($quote); }); diff --git a/app/Export/CSV/RecurringInvoiceExport.php b/app/Export/CSV/RecurringInvoiceExport.php index d6d26e283422..62a2c78364ca 100644 --- a/app/Export/CSV/RecurringInvoiceExport.php +++ b/app/Export/CSV/RecurringInvoiceExport.php @@ -93,6 +93,8 @@ class RecurringInvoiceExport extends BaseExport $query->cursor() ->each(function ($invoice) { + + /** @var \App\Models\RecurringInvoice $invoice */ $this->csv->insertOne($this->buildRow($invoice)); }); @@ -112,6 +114,8 @@ class RecurringInvoiceExport extends BaseExport $report = $query->cursor() ->map(function ($resource) { + + /** @var \App\Models\RecurringInvoice $resource */ $row = $this->buildRow($resource); return $this->processMetaData($row, $resource); })->toArray(); diff --git a/app/Export/CSV/TaskExport.php b/app/Export/CSV/TaskExport.php index 98da6fda1750..2acd8faa64cc 100644 --- a/app/Export/CSV/TaskExport.php +++ b/app/Export/CSV/TaskExport.php @@ -106,7 +106,9 @@ class TaskExport extends BaseExport $query->cursor() ->each(function ($entity) { - $this->buildRow($entity); + + /** @var \App\Models\Task $entity*/ + $this->buildRow($entity); }); $this->csv->insertAll($this->storage_array); @@ -128,6 +130,7 @@ class TaskExport extends BaseExport $query->cursor() ->each(function ($resource) { + /** @var \App\Models\Task $resource*/ $this->buildRow($resource); foreach($this->storage_array as $row) { diff --git a/app/Export/CSV/VendorExport.php b/app/Export/CSV/VendorExport.php index abb682f655eb..799fca7a075f 100644 --- a/app/Export/CSV/VendorExport.php +++ b/app/Export/CSV/VendorExport.php @@ -90,6 +90,8 @@ class VendorExport extends BaseExport $report = $query->cursor() ->map(function ($resource) { + + /** @var \App\Models\Vendor $resource */ $row = $this->buildRow($resource); return $this->processMetaData($row, $resource); })->toArray(); @@ -107,7 +109,9 @@ class VendorExport extends BaseExport $query->cursor() ->each(function ($vendor) { - $this->csv->insertOne($this->buildRow($vendor)); + + /** @var \App\Models\Vendor $vendor */ + $this->csv->insertOne($this->buildRow($vendor)); }); return $this->csv->toString(); diff --git a/app/Helpers/Mail/GmailTransport.php b/app/Helpers/Mail/GmailTransport.php index 1be44af73641..5dd8492191b2 100644 --- a/app/Helpers/Mail/GmailTransport.php +++ b/app/Helpers/Mail/GmailTransport.php @@ -31,7 +31,7 @@ class GmailTransport extends AbstractTransport protected function doSend(SentMessage $message): void { nlog("In Do Send"); - $message = MessageConverter::toEmail($message->getOriginalMessage()); + $message = MessageConverter::toEmail($message->getOriginalMessage()); //@phpstan-ignore-line /** @phpstan-ignore-next-line **/ $token = $message->getHeaders()->get('gmailtoken')->getValue(); // @phpstan-ignore-line diff --git a/app/Helpers/Mail/Office365MailTransport.php b/app/Helpers/Mail/Office365MailTransport.php index c5cf6fa91235..4a6f49a70b65 100644 --- a/app/Helpers/Mail/Office365MailTransport.php +++ b/app/Helpers/Mail/Office365MailTransport.php @@ -25,7 +25,8 @@ class Office365MailTransport extends AbstractTransport protected function doSend(SentMessage $message): void { - $symfony_message = MessageConverter::toEmail($message->getOriginalMessage()); + $symfony_message = MessageConverter::toEmail($message->getOriginalMessage()); //@phpstan-ignore-line + $graph = new Graph(); diff --git a/app/Http/Controllers/Auth/LoginController.php b/app/Http/Controllers/Auth/LoginController.php index fdad07677017..3f8201c75a6c 100644 --- a/app/Http/Controllers/Auth/LoginController.php +++ b/app/Http/Controllers/Auth/LoginController.php @@ -376,6 +376,7 @@ class LoginController extends BaseController /** @var \App\Models\User $user */ $user = auth()->user(); + /** @var Builder $cu */ $cu = CompanyUser::query()->where('user_id', $user->id); if ($cu->count() == 0) { @@ -398,18 +399,15 @@ class LoginController extends BaseController $truth->setCompany($set_company); //21-03-2024 + + $cu->each(function ($cu) { - if(CompanyToken::where('company_id', $cu->company_id)->where('user_id', $cu->user_id)->where('is_system', true)->doesntExist()) { + /** @var \App\Models\CompanyUser $cu */ + if(CompanyToken::query()->where('company_id', $cu->company_id)->where('user_id', $cu->user_id)->where('is_system', true)->doesntExist()) { (new CreateCompanyToken($cu->company, $cu->user, request()->server('HTTP_USER_AGENT')))->handle(); } }); - // $user->account->companies->each(function ($company) use ($user) { - // if ($company->tokens()->where('user_id',$user->id)->where('is_system', true)->count() == 0) { - // (new CreateCompanyToken($company, $user, request()->server('HTTP_USER_AGENT')))->handle(); - // } - // }); - $truth->setCompanyToken(CompanyToken::where('user_id', $user->id)->where('company_id', $set_company->id)->where('is_system', true)->first()); return CompanyUser::query()->where('user_id', $user->id); diff --git a/app/Http/Controllers/Bank/YodleeController.php b/app/Http/Controllers/Bank/YodleeController.php index 84dae2618aff..d7057848eb1f 100644 --- a/app/Http/Controllers/Bank/YodleeController.php +++ b/app/Http/Controllers/Bank/YodleeController.php @@ -97,7 +97,7 @@ class YodleeController extends BaseController } $company->account->bank_integrations->where("integration_type", BankIntegration::INTEGRATION_TYPE_YODLEE)->where('auto_sync', true)->each(function ($bank_integration) use ($company) { // TODO: filter to yodlee only - ProcessBankTransactionsYodlee::dispatch($company->account->id, $bank_integration); + ProcessBankTransactionsYodlee::dispatch($company->account->bank_integration_account_id, $bank_integration); }); } diff --git a/app/Http/Controllers/BankIntegrationController.php b/app/Http/Controllers/BankIntegrationController.php index 1cc7e3a21916..6701f1e65fd9 100644 --- a/app/Http/Controllers/BankIntegrationController.php +++ b/app/Http/Controllers/BankIntegrationController.php @@ -197,6 +197,7 @@ class BankIntegrationController extends BaseController /** @var \App\Models\User $user */ $user = auth()->user(); + /** @var \App\Models\Account $user_account */ $user_account = $user->account; $this->refreshAccountsYodlee($user); @@ -210,12 +211,14 @@ class BankIntegrationController extends BaseController // Processing transactions for each bank account if (Ninja::isHosted() && $user->account->bank_integration_account_id) { $user_account->bank_integrations->where("integration_type", BankIntegration::INTEGRATION_TYPE_YODLEE)->each(function ($bank_integration) use ($user_account) { - ProcessBankTransactionsYodlee::dispatch($user_account->id, $bank_integration); + /** @var \App\Models\BankIntegration $bank_integration */ + ProcessBankTransactionsYodlee::dispatch($user_account->bank_integration_account_id, $bank_integration); }); } if (config('ninja.nordigen.secret_id') && config('ninja.nordigen.secret_key') && (Ninja::isSelfHost() || (Ninja::isHosted() && $user_account->isEnterprisePaidClient()))) { - $user_account->bank_integrations->where("integration_type", BankIntegration::INTEGRATION_TYPE_NORDIGEN)->each(function ($bank_integration) { + $user_account->bank_integrations->where("integration_type", BankIntegration::INTEGRATION_TYPE_NORDIGEN)->each(function ($bank_integration) { + /** @var \App\Models\BankIntegration $bank_integration */ ProcessBankTransactionsNordigen::dispatch($bank_integration); }); } @@ -345,7 +348,7 @@ class BankIntegrationController extends BaseController if (Ninja::isHosted() && $account->isPaid() && $account->plan == 'enterprise') { $account->bank_integrations()->where('integration_type', BankIntegration::INTEGRATION_TYPE_YODLEE)->where('auto_sync', true)->cursor()->each(function ($bank_integration) use ($account) { - (new ProcessBankTransactionsYodlee($account->id, $bank_integration))->handle(); + (new ProcessBankTransactionsYodlee($account->bank_integration_account_id, $bank_integration))->handle(); }); } diff --git a/app/Http/Controllers/BaseController.php b/app/Http/Controllers/BaseController.php index 74934925da28..55c82d0aebe4 100644 --- a/app/Http/Controllers/BaseController.php +++ b/app/Http/Controllers/BaseController.php @@ -653,7 +653,7 @@ class BaseController extends Controller /** * Passes back the miniloaded data response * - * @param Builder $query + * @param mixed $query * */ protected function timeConstrainedResponse($query) @@ -894,11 +894,7 @@ class BaseController extends Controller $resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); } - // else { - // $resource = new Collection($query, $transformer, $this->entity_type); - // } - - return $this->response($this->manager->createData($resource)->toArray()); + return $this->response($this->manager->createData($resource)->toArray()); //@phpstan-ignore-line } /** diff --git a/app/Http/Controllers/ClientPortal/PaymentController.php b/app/Http/Controllers/ClientPortal/PaymentController.php index 7efd13510a56..728df5eb1de1 100644 --- a/app/Http/Controllers/ClientPortal/PaymentController.php +++ b/app/Http/Controllers/ClientPortal/PaymentController.php @@ -209,7 +209,7 @@ class PaymentController extends Controller if (property_exists($payment_hash->data, 'billing_context')) { $billing_subscription = \App\Models\Subscription::find($this->decodePrimaryKey($payment_hash->data->billing_context->subscription_id)); - + /** @var \App\Models\Subscription $billing_subscription */ return (new SubscriptionService($billing_subscription))->completePurchase($payment_hash); } diff --git a/app/Http/Controllers/DocumentController.php b/app/Http/Controllers/DocumentController.php index 2a66c150f3d7..776390a4016a 100644 --- a/app/Http/Controllers/DocumentController.php +++ b/app/Http/Controllers/DocumentController.php @@ -183,7 +183,7 @@ class DocumentController extends BaseController } if ($action == 'download') { - ZipDocuments::dispatch($documents->pluck('id'), $user->company(), auth()->user()); + ZipDocuments::dispatch($documents->pluck('id'), $user->company(), auth()->user()); //@phpstan-ignore-line return response()->json(['message' => ctrans('texts.sent_message')], 200); } diff --git a/app/Http/Controllers/PaymentNotificationWebhookController.php b/app/Http/Controllers/PaymentNotificationWebhookController.php index 2eb637d5e1ee..a7ab8b0c3cba 100644 --- a/app/Http/Controllers/PaymentNotificationWebhookController.php +++ b/app/Http/Controllers/PaymentNotificationWebhookController.php @@ -24,8 +24,9 @@ class PaymentNotificationWebhookController extends Controller public function __invoke(PaymentNotificationWebhookRequest $request, string $company_key, string $company_gateway_id, string $client_hash) { /** @var \App\Models\CompanyGateway $company_gateway */ - $company_gateway = CompanyGateway::find($this->decodePrimaryKey($company_gateway_id)); + + /** @var \App\Models\Client $client */ $client = Client::find($this->decodePrimaryKey($client_hash)); return $company_gateway diff --git a/app/Http/Controllers/PreviewController.php b/app/Http/Controllers/PreviewController.php index e1db201eab31..db7b705898f3 100644 --- a/app/Http/Controllers/PreviewController.php +++ b/app/Http/Controllers/PreviewController.php @@ -125,7 +125,7 @@ class PreviewController extends BaseController $response = Response::make($pdf, 200); $response->header('Content-Type', 'application/pdf'); - $response->header('Server-Timing', microtime(true) - $start); + $response->header('Server-Timing', (string) (microtime(true) - $start)); return $response; } diff --git a/app/Http/Requests/Client/UpdateClientRequest.php b/app/Http/Requests/Client/UpdateClientRequest.php index 81da5af205f0..ad8944c2dfbd 100644 --- a/app/Http/Requests/Client/UpdateClientRequest.php +++ b/app/Http/Requests/Client/UpdateClientRequest.php @@ -11,13 +11,14 @@ namespace App\Http\Requests\Client; -use App\DataMapper\CompanySettings; use App\Http\Requests\Request; -use App\Http\ValidationRules\ValidClientGroupSettingsRule; -use App\Utils\Traits\ChecksEntityStatus; use App\Utils\Traits\MakesHash; -use Illuminate\Support\Facades\Cache; use Illuminate\Validation\Rule; +use App\DataMapper\CompanySettings; +use Illuminate\Support\Facades\Cache; +use App\Utils\Traits\ChecksEntityStatus; +use App\Http\ValidationRules\EInvoice\ValidClientScheme; +use App\Http\ValidationRules\ValidClientGroupSettingsRule; class UpdateClientRequest extends Request { @@ -66,6 +67,8 @@ class UpdateClientRequest extends Request $rules['id_number'] = ['sometimes', 'bail', 'nullable', Rule::unique('clients')->where('company_id', $user->company()->id)->ignore($this->client->id)]; $rules['number'] = ['sometimes', 'bail', Rule::unique('clients')->where('company_id', $user->company()->id)->ignore($this->client->id)]; + $rules['e_invoice'] = ['sometimes','nullable', new ValidClientScheme()]; + $rules['settings'] = new ValidClientGroupSettingsRule(); $rules['contacts'] = 'array'; $rules['contacts.*.email'] = 'bail|nullable|distinct|sometimes|email'; diff --git a/app/Http/Requests/ClientPortal/PaymentMethod/CreatePaymentMethodRequest.php b/app/Http/Requests/ClientPortal/PaymentMethod/CreatePaymentMethodRequest.php index 272e8e1bf2e2..a50352b9b05d 100644 --- a/app/Http/Requests/ClientPortal/PaymentMethod/CreatePaymentMethodRequest.php +++ b/app/Http/Requests/ClientPortal/PaymentMethod/CreatePaymentMethodRequest.php @@ -29,7 +29,7 @@ class CreatePaymentMethodRequest extends FormRequest $available_methods = []; collect($client->service()->getPaymentMethods(-1)) - ->filter(function ($method) use (&$available_methods) { + ->filter(function ($method) use (&$available_methods) { //@phpstan-ignore-line $available_methods[] = $method['gateway_type_id']; }); diff --git a/app/Http/Requests/CompanyGateway/StoreCompanyGatewayRequest.php b/app/Http/Requests/CompanyGateway/StoreCompanyGatewayRequest.php index d182cb52b3fd..c010614953c9 100644 --- a/app/Http/Requests/CompanyGateway/StoreCompanyGatewayRequest.php +++ b/app/Http/Requests/CompanyGateway/StoreCompanyGatewayRequest.php @@ -48,7 +48,7 @@ class StoreCompanyGatewayRequest extends Request { $input = $this->all(); - if ($gateway = Gateway::where('key', $input['gateway_key'])->first()) { + if ($gateway = Gateway::query()->where('key', $input['gateway_key'])->first()) { $default_gateway_fields = json_decode($gateway->fields); /*Force gateway properties */ diff --git a/app/Http/Requests/CompanyGateway/UpdateCompanyGatewayRequest.php b/app/Http/Requests/CompanyGateway/UpdateCompanyGatewayRequest.php index 61feb38b7dbb..1aafecd7099c 100644 --- a/app/Http/Requests/CompanyGateway/UpdateCompanyGatewayRequest.php +++ b/app/Http/Requests/CompanyGateway/UpdateCompanyGatewayRequest.php @@ -48,7 +48,7 @@ class UpdateCompanyGatewayRequest extends Request /*Force gateway properties */ if (isset($input['config']) && is_object(json_decode($input['config'])) && array_key_exists('gateway_key', $input)) { - $gateway = Gateway::where('key', $input['gateway_key'])->first(); + $gateway = Gateway::query()->where('key', $input['gateway_key'])->first(); $default_gateway_fields = json_decode($gateway->fields); foreach (json_decode($input['config']) as $key => $value) { diff --git a/app/Http/Requests/RecurringExpense/BulkRecurringExpenseRequest.php b/app/Http/Requests/RecurringExpense/BulkRecurringExpenseRequest.php index 9dffb4f4373e..2c2cdc9e7d0e 100644 --- a/app/Http/Requests/RecurringExpense/BulkRecurringExpenseRequest.php +++ b/app/Http/Requests/RecurringExpense/BulkRecurringExpenseRequest.php @@ -34,7 +34,10 @@ class BulkRecurringExpenseRequest extends Request return false; } - return auth()->user()->can(auth()->user()->isAdmin(), RecurringExpense::class); + /** @var \App\Models\User $user */ + $user = auth()->user(); + + return $user->can('edit', RecurringExpense::class); } /** diff --git a/app/Http/Requests/Vendor/BulkVendorRequest.php b/app/Http/Requests/Vendor/BulkVendorRequest.php index fb0dd93ef9b9..5f9d01e56a3e 100644 --- a/app/Http/Requests/Vendor/BulkVendorRequest.php +++ b/app/Http/Requests/Vendor/BulkVendorRequest.php @@ -34,7 +34,11 @@ class BulkVendorRequest extends Request return false; } - return auth()->user()->can(auth()->user()->isAdmin(), Vendor::class); + /** @var \App\Models\User $user */ + $user = auth()->user(); + + return $user->can('edit', Vendor::class); + } /** diff --git a/app/Jobs/Bank/MatchBankTransactions.php b/app/Jobs/Bank/MatchBankTransactions.php index c377a9c05dce..326d9952583d 100644 --- a/app/Jobs/Bank/MatchBankTransactions.php +++ b/app/Jobs/Bank/MatchBankTransactions.php @@ -448,6 +448,6 @@ class MatchBankTransactions implements ShouldQueue public function middleware() { - return [new WithoutOverlapping($this->company_id)]; + return [new WithoutOverlapping($this->company->account->bank_integration_account_id)]; } } diff --git a/app/Jobs/Bank/ProcessBankTransactionsYodlee.php b/app/Jobs/Bank/ProcessBankTransactionsYodlee.php index 3b651fc9a0d4..7ffb7791fa9c 100644 --- a/app/Jobs/Bank/ProcessBankTransactionsYodlee.php +++ b/app/Jobs/Bank/ProcessBankTransactionsYodlee.php @@ -35,10 +35,6 @@ class ProcessBankTransactionsYodlee implements ShouldQueue use Queueable; use SerializesModels; - private string $bank_integration_account_id; - - private BankIntegration $bank_integration; - private ?string $from_date; private bool $stop_loop = true; @@ -50,10 +46,8 @@ class ProcessBankTransactionsYodlee implements ShouldQueue /** * Create a new job instance. */ - public function __construct(string $bank_integration_account_id, BankIntegration $bank_integration) + public function __construct(private string $bank_integration_account_id, private BankIntegration $bank_integration) { - $this->bank_integration_account_id = $bank_integration_account_id; - $this->bank_integration = $bank_integration; $this->from_date = $bank_integration->from_date; $this->company = $this->bank_integration->company; } diff --git a/app/Jobs/Brevo/ProcessBrevoWebhook.php b/app/Jobs/Brevo/ProcessBrevoWebhook.php index e6ef60a7522d..b81772fd2c0a 100644 --- a/app/Jobs/Brevo/ProcessBrevoWebhook.php +++ b/app/Jobs/Brevo/ProcessBrevoWebhook.php @@ -93,8 +93,7 @@ class ProcessBrevoWebhook implements ShouldQueue { MultiDB::findAndSetDbByCompanyKey($this->request['tags'][0]); - /** @phpstan-ignore-next-line */ - $this->company = Company::where('company_key', $this->request['tags'][0])->first(); + $this->company = Company::query()->where('company_key', $this->request['tags'][0])->first(); $this->invitation = $this->discoverInvitation($this->request['message-id']); diff --git a/app/Jobs/Client/CheckVat.php b/app/Jobs/Client/CheckVat.php index d8637b9f6ab9..ed35f1eaf25c 100644 --- a/app/Jobs/Client/CheckVat.php +++ b/app/Jobs/Client/CheckVat.php @@ -58,7 +58,7 @@ class CheckVat implements ShouldQueue public function middleware() { - return [new WithoutOverlapping($this->client->id)]; + return [new WithoutOverlapping($this->client->client_hash)]; } } diff --git a/app/Jobs/Company/CompanyExport.php b/app/Jobs/Company/CompanyExport.php index 4f7c571ec4ed..3885c05e7df3 100644 --- a/app/Jobs/Company/CompanyExport.php +++ b/app/Jobs/Company/CompanyExport.php @@ -108,7 +108,8 @@ class CompanyExport implements ShouldQueue $this->export_data['users'] = $this->company->users()->withTrashed()->cursor()->map(function ($user) { - $user->account_id = $this->encodePrimaryKey($user->account_id); + /** @var \App\Models\User $user */ + $user->account_id = $this->encodePrimaryKey($user->account_id); //@phpstan-ignore-line return $user; })->all(); diff --git a/app/Jobs/Company/CompanyTaxRate.php b/app/Jobs/Company/CompanyTaxRate.php index ec659ed05288..684065952a5e 100644 --- a/app/Jobs/Company/CompanyTaxRate.php +++ b/app/Jobs/Company/CompanyTaxRate.php @@ -94,7 +94,7 @@ class CompanyTaxRate implements ShouldQueue public function middleware() { - return [new WithoutOverlapping($this->company->id)]; + return [new WithoutOverlapping($this->company->company_key)]; } public function failed($e) diff --git a/app/Jobs/Cron/AutoBillCron.php b/app/Jobs/Cron/AutoBillCron.php index ddd8e6ca2bb8..9f708d95c7cd 100644 --- a/app/Jobs/Cron/AutoBillCron.php +++ b/app/Jobs/Cron/AutoBillCron.php @@ -65,7 +65,7 @@ class AutoBillCron $auto_bill_partial_invoices->chunk(400, function ($invoices) { foreach ($invoices as $invoice) { - AutoBill::dispatch($invoice->id, false); + AutoBill::dispatch($invoice->id, null); } sleep(2); @@ -87,7 +87,7 @@ class AutoBillCron $auto_bill_invoices->chunk(400, function ($invoices) { foreach ($invoices as $invoice) { - AutoBill::dispatch($invoice->id, false); + AutoBill::dispatch($invoice->id, null); } sleep(2); diff --git a/app/Jobs/Document/CopyDocs.php b/app/Jobs/Document/CopyDocs.php index e0f091b3012c..5cbe9e6d6179 100644 --- a/app/Jobs/Document/CopyDocs.php +++ b/app/Jobs/Document/CopyDocs.php @@ -47,10 +47,12 @@ class CopyDocs implements ShouldQueue { MultiDB::setDb($this->db); - Document::whereIn('id', $this->document_ids) + Document::query() + ->whereIn('id', $this->document_ids) ->where('company_id', $this->entity->company_id) ->each(function ($document) { + /** @var \App\Models\Document $document */ $file = $document->getFile(); $extension = pathinfo($document->name, PATHINFO_EXTENSION); diff --git a/app/Jobs/Invoice/CreateUbl.php b/app/Jobs/Invoice/CreateUbl.php index cd018b4ed965..b98c3e91ab7a 100644 --- a/app/Jobs/Invoice/CreateUbl.php +++ b/app/Jobs/Invoice/CreateUbl.php @@ -63,7 +63,7 @@ class CreateUbl implements ShouldQueue // invoice $ubl_invoice->setId($invoice->number); $ubl_invoice->setIssueDate(date_create($invoice->date)); - $ubl_invoice->setInvoiceTypeCode($invoice->amount < 0 ? self::INVOICE_TYPE_CREDIT : self::INVOICE_TYPE_STANDARD); + $ubl_invoice->setInvoiceTypeCode($invoice->amount < 0 ? (string)self::INVOICE_TYPE_CREDIT : (string)self::INVOICE_TYPE_STANDARD); $supplier_party = $this->createParty($company, $invoice->user); $ubl_invoice->setAccountingSupplierParty($supplier_party); diff --git a/app/Jobs/Ledger/ClientLedgerBalanceUpdate.php b/app/Jobs/Ledger/ClientLedgerBalanceUpdate.php index a8171e517e5f..628344fe16a7 100644 --- a/app/Jobs/Ledger/ClientLedgerBalanceUpdate.php +++ b/app/Jobs/Ledger/ClientLedgerBalanceUpdate.php @@ -75,6 +75,6 @@ class ClientLedgerBalanceUpdate implements ShouldQueue public function middleware() { - return [(new WithoutOverlapping($this->client->id))->dontRelease()]; + return [(new WithoutOverlapping($this->client->client_hash))->dontRelease()]; } } diff --git a/app/Jobs/Mailgun/ProcessMailgunWebhook.php b/app/Jobs/Mailgun/ProcessMailgunWebhook.php index 62f400a2bf04..73d32f39e9f7 100644 --- a/app/Jobs/Mailgun/ProcessMailgunWebhook.php +++ b/app/Jobs/Mailgun/ProcessMailgunWebhook.php @@ -94,7 +94,7 @@ class ProcessMailgunWebhook implements ShouldQueue } MultiDB::findAndSetDbByCompanyKey($this->request['event-data']['tags'][0]); - $company = Company::where('company_key', $this->request['event-data']['tags'][0])->first(); + $company = Company::query()->where('company_key', $this->request['event-data']['tags'][0])->first(); if ($company && $this->request['event-data']['event'] == 'complained' && config('ninja.notification.slack')) { $company->notification(new EmailSpamNotification($company))->ninja(); diff --git a/app/Jobs/PostMark/ProcessPostmarkWebhook.php b/app/Jobs/PostMark/ProcessPostmarkWebhook.php index 5f56945a2dbd..9e489bb6b6d2 100644 --- a/app/Jobs/PostMark/ProcessPostmarkWebhook.php +++ b/app/Jobs/PostMark/ProcessPostmarkWebhook.php @@ -87,7 +87,7 @@ class ProcessPostmarkWebhook implements ShouldQueue public function handle() { MultiDB::findAndSetDbByCompanyKey($this->request['Tag']); - $this->company = Company::where('company_key', $this->request['Tag'])->first(); /** @phpstan-ignore-line */ + $this->company = Company::query()->where('company_key', $this->request['Tag'])->first(); /** @phpstan-ignore-line */ $this->invitation = $this->discoverInvitation($this->request['MessageID']); diff --git a/app/Jobs/Util/Import.php b/app/Jobs/Util/Import.php index 01775fee78f4..f422c4014c02 100644 --- a/app/Jobs/Util/Import.php +++ b/app/Jobs/Util/Import.php @@ -253,7 +253,7 @@ class Import implements ShouldQueue $this->setInitialCompanyLedgerBalances(); // $this->fixClientBalances(); - $check_data = (new CheckCompanyData($this->company, md5(time())))->handle(); + $check_data = (new CheckCompanyData($this->company, md5(time())))->handle(); //@phpstan-ignore-line // if(Ninja::isHosted() && array_key_exists('ninja_tokens', $data)) $this->processNinjaTokens($data['ninja_tokens']); diff --git a/app/Jobs/Util/UploadAvatar.php b/app/Jobs/Util/UploadAvatar.php index d010eebef926..e4bd904373f6 100644 --- a/app/Jobs/Util/UploadAvatar.php +++ b/app/Jobs/Util/UploadAvatar.php @@ -38,7 +38,7 @@ class UploadAvatar implements ShouldQueue public function handle(): ?string { - $tmp_file = sha1(time()).'.png'; + $tmp_file = sha1(time()).'.png'; //@phpstan-ignore-line $im = imagecreatefromstring(file_get_contents($this->file)); imagealphablending($im, false); diff --git a/app/Jobs/Util/VersionCheck.php b/app/Jobs/Util/VersionCheck.php index 9e604ab030de..e829c41f5518 100644 --- a/app/Jobs/Util/VersionCheck.php +++ b/app/Jobs/Util/VersionCheck.php @@ -94,7 +94,7 @@ class VersionCheck implements ShouldQueue Client::doesntHave('contacts') ->cursor() - ->each(function (Client $client) { + ->each(function (Client $client) { //@phpstan-ignore-line $new_contact = ClientContactFactory::create($client->company_id, $client->user_id); $new_contact->client_id = $client->id; @@ -107,7 +107,7 @@ class VersionCheck implements ShouldQueue Vendor::doesntHave('contacts') ->cursor() - ->each(function (Vendor $vendor) { + ->each(function (Vendor $vendor) { //@phpstan-ignore-line $new_contact = VendorContactFactory::create($vendor->company_id, $vendor->user_id); $new_contact->vendor_id = $vendor->id; diff --git a/app/Libraries/InApp/StoreKit/Apple.php b/app/Libraries/InApp/StoreKit/Apple.php index 7416c8aa171e..72a280b44d88 100644 --- a/app/Libraries/InApp/StoreKit/Apple.php +++ b/app/Libraries/InApp/StoreKit/Apple.php @@ -58,7 +58,7 @@ class Apple 'bid' => $this->bundle_id, ]; - $jwt = JWT::encode($payload, $this->private_key, $this->alg, $header); + $jwt = JWT::encode($payload, $this->private_key, $this->alg, null, $header); $decoded = JWT::decode($jwt, new Key($this->private_key, $this->alg)); diff --git a/app/Models/Backup.php b/app/Models/Backup.php index 409399ce916d..62a393d7cfe8 100644 --- a/app/Models/Backup.php +++ b/app/Models/Backup.php @@ -61,7 +61,7 @@ class Backup extends BaseModel } $path = $client_or_vendor->backup_path().'/'; - $filename = now()->format('Y_m_d').'_'.md5(time()).'.html'; + $filename = now()->format('Y_m_d').'_'.md5(time()).'.html'; //@phpstan-ignore-line $file_path = $path.$filename; Storage::disk(config('filesystems.default'))->put($file_path, $html); diff --git a/app/Models/BankTransaction.php b/app/Models/BankTransaction.php index 77f2219f9067..8dd87d8834fd 100644 --- a/app/Models/BankTransaction.php +++ b/app/Models/BankTransaction.php @@ -38,7 +38,7 @@ use Illuminate\Database\Eloquent\SoftDeletes; * @property string|null $participant * @property string|null $participant_name * @property string $invoice_ids - * @property int|null $expense_id + * @property string|null $expense_id * @property int|null $vendor_id * @property int $status_id * @property bool $is_deleted diff --git a/app/Models/Client.php b/app/Models/Client.php index 171fbd97ec15..3aa29455c3ac 100644 --- a/app/Models/Client.php +++ b/app/Models/Client.php @@ -573,7 +573,7 @@ class Client extends BaseModel implements HasLocalePreference if ($pm['gateway_type_id'] == GatewayType::BACS) { $cg = CompanyGateway::query()->find($pm['company_gateway_id']); - if ($cg && ! property_exists($cg->fees_and_limits, GatewayType::BACS)) { + if ($cg && ! property_exists($cg->fees_and_limits, GatewayType::BACS)) { //@phpstan-ignore-line $fees_and_limits = $cg->fees_and_limits; $fees_and_limits->{GatewayType::BACS} = new FeesAndLimits(); $cg->fees_and_limits = $fees_and_limits; @@ -597,7 +597,7 @@ class Client extends BaseModel implements HasLocalePreference if ($pm['gateway_type_id'] == GatewayType::ACSS) { $cg = CompanyGateway::query()->find($pm['company_gateway_id']); - if ($cg && ! property_exists($cg->fees_and_limits, GatewayType::ACSS)) { + if ($cg && ! property_exists($cg->fees_and_limits, GatewayType::ACSS)) { //@phpstan-ignore-line $fees_and_limits = $cg->fees_and_limits; $fees_and_limits->{GatewayType::ACSS} = new FeesAndLimits(); $cg->fees_and_limits = $fees_and_limits; @@ -624,7 +624,7 @@ class Client extends BaseModel implements HasLocalePreference if ($pm['gateway_type_id'] == GatewayType::BANK_TRANSFER) { $cg = CompanyGateway::query()->find($pm['company_gateway_id']); - if ($cg && ! property_exists($cg->fees_and_limits, GatewayType::BANK_TRANSFER)) { + if ($cg && ! property_exists($cg->fees_and_limits, GatewayType::BANK_TRANSFER)) { //@phpstan-ignore-line $fees_and_limits = $cg->fees_and_limits; $fees_and_limits->{GatewayType::BANK_TRANSFER} = new FeesAndLimits(); $cg->fees_and_limits = $fees_and_limits; diff --git a/app/Models/DateFormat.php b/app/Models/DateFormat.php index 3801e1146a97..3df85c65010d 100644 --- a/app/Models/DateFormat.php +++ b/app/Models/DateFormat.php @@ -59,7 +59,7 @@ class DateFormat extends StaticModel */ public function __toString() { - $date = mktime(0, 0, 0, 12, 31, date('Y')); + $date = mktime(0, 0, 0, 12, 31, date('Y')); //@phpstan-ignore-line return date($this->format, $date); } diff --git a/app/Models/DatetimeFormat.php b/app/Models/DatetimeFormat.php index 0c9e88c2238a..7c031b00d4d3 100644 --- a/app/Models/DatetimeFormat.php +++ b/app/Models/DatetimeFormat.php @@ -32,7 +32,7 @@ class DatetimeFormat extends StaticModel */ public function __toString() { - $date = mktime(0, 0, 0, 12, 31, date('Y')); + $date = mktime(0, 0, 0, 12, 31, date('Y')); //@phpstan-ignore-line return date($this->format, $date); } diff --git a/app/Models/Gateway.php b/app/Models/Gateway.php index 5d8c20d7c439..46ae2abc56f6 100644 --- a/app/Models/Gateway.php +++ b/app/Models/Gateway.php @@ -24,7 +24,7 @@ namespace App\Models; * @property string|null $site_url * @property bool $is_offsite * @property bool $is_secure - * @property object|null $fields + * @property object|null|string $fields * @property string $default_gateway_type_id * @property int|null $created_at * @property int|null $updated_at diff --git a/app/PaymentDrivers/BaseDriver.php b/app/PaymentDrivers/BaseDriver.php index e3720e0a3db7..3b134ba355d3 100644 --- a/app/PaymentDrivers/BaseDriver.php +++ b/app/PaymentDrivers/BaseDriver.php @@ -375,6 +375,7 @@ class BaseDriver extends AbstractPaymentDriver // To access campaign data => Cache::get(CAMPAIGN_HASH) // To access utm data => session()->get('utm-' . CAMPAIGN_HASH); + /** @var \App\Models\Subscription $billing_subscription */ (new SubscriptionService($billing_subscription))->completePurchase($this->payment_hash); } diff --git a/app/PaymentDrivers/Braintree/CreditCard.php b/app/PaymentDrivers/Braintree/CreditCard.php index 8ba6e0154f58..3ab0fdbe3de7 100644 --- a/app/PaymentDrivers/Braintree/CreditCard.php +++ b/app/PaymentDrivers/Braintree/CreditCard.php @@ -83,7 +83,7 @@ class CreditCard if ($this->braintree->company_gateway->getConfigField('merchantAccountId')) { /** https://developer.paypal.com/braintree/docs/reference/request/client-token/generate#merchant_account_id */ - $data['client_token'] = $this->braintree->gateway->clientToken()->generate([ + $data['client_token'] = $this->braintree->gateway->clientToken()->generate([ //@phpstan-ignore-line 'merchantAccountId' => $this->braintree->company_gateway->getConfigField('merchantAccountId'), ]); } @@ -118,7 +118,7 @@ class CreditCard $token = $this->getPaymentToken($request->all(), $customer->id); $data = [ - 'amount' => $this->braintree->payment_hash->data->amount_with_fee, + 'amount' => $this->braintree->payment_hash->data->amount_with_fee, //@phpstan-ignore-line 'paymentMethodToken' => $token, 'deviceData' => $state['client-data'], 'options' => [ diff --git a/app/PaymentDrivers/BraintreePaymentDriver.php b/app/PaymentDrivers/BraintreePaymentDriver.php index 74a7e7813e64..2e95394fe56e 100644 --- a/app/PaymentDrivers/BraintreePaymentDriver.php +++ b/app/PaymentDrivers/BraintreePaymentDriver.php @@ -387,7 +387,7 @@ class BraintreePaymentDriver extends BaseDriver foreach($cards as $card) { - if($this->getToken($card->token, $card->customerId) || Carbon::createFromDate($card->expirationYear, $card->expirationMonth, '1')->lt(now())) { + if($this->getToken($card->token, $card->customerId) || Carbon::createFromDate($card->expirationYear, $card->expirationMonth, '1')->lt(now())) { //@phpstan-ignore-line continue; } diff --git a/app/PaymentDrivers/CheckoutComPaymentDriver.php b/app/PaymentDrivers/CheckoutComPaymentDriver.php index 03b161d076af..b90ce372264d 100644 --- a/app/PaymentDrivers/CheckoutComPaymentDriver.php +++ b/app/PaymentDrivers/CheckoutComPaymentDriver.php @@ -592,7 +592,7 @@ class CheckoutComPaymentDriver extends BaseDriver foreach($customer['instruments'] as $card) { if( $card['type'] != 'card' || - Carbon::createFromDate($card['expiry_year'], $card['expiry_month'], '1')->lt(now()) || + Carbon::createFromDate($card['expiry_year'], $card['expiry_month'], '1')->lt(now()) || //@phpstan-ignore-line $this->getToken($card['id'], $customer['id']) ) { continue; diff --git a/app/PaymentDrivers/PayPal/PayPalWebhook.php b/app/PaymentDrivers/PayPal/PayPalWebhook.php index 701f2817c315..744230dee6c5 100644 --- a/app/PaymentDrivers/PayPal/PayPalWebhook.php +++ b/app/PaymentDrivers/PayPal/PayPalWebhook.php @@ -297,7 +297,6 @@ class PayPalWebhook implements ShouldQueue $gateway = CompanyGateway::query() ->where('company_id', $company->id) ->where('gateway_key', $this->gateway_key) - ->cursor() ->first(function ($cg) use ($merchant_id) { $config = $cg->getConfig(); diff --git a/app/PaymentDrivers/SquarePaymentDriver.php b/app/PaymentDrivers/SquarePaymentDriver.php index 8e590059e515..456d69586e72 100644 --- a/app/PaymentDrivers/SquarePaymentDriver.php +++ b/app/PaymentDrivers/SquarePaymentDriver.php @@ -188,7 +188,7 @@ class SquarePaymentDriver extends BaseDriver } else { /** @var \Square\Models\Error $error */ - $error = end($apiResponse->getErrors()); + $error = end($apiResponse->getErrors()); //@phpstan-ignore-line $data = [ 'transaction_reference' => $payment->transaction_reference, diff --git a/app/PaymentDrivers/Stripe/ACSS.php b/app/PaymentDrivers/Stripe/ACSS.php index 38e3a8162c9e..7ef4fa2dde2b 100644 --- a/app/PaymentDrivers/Stripe/ACSS.php +++ b/app/PaymentDrivers/Stripe/ACSS.php @@ -267,6 +267,7 @@ class ACSS $gateway_response = json_decode($request->gateway_response); + /** @var \App\Models\ClientGatewayToken $cgt */ $cgt = ClientGatewayToken::find($this->decodePrimaryKey($request->token)); /** @var \Stripe\PaymentIntent $intent */ diff --git a/app/PaymentDrivers/Stripe/ImportCustomers.php b/app/PaymentDrivers/Stripe/ImportCustomers.php index 3f96dd97d9aa..7eef0391e652 100644 --- a/app/PaymentDrivers/Stripe/ImportCustomers.php +++ b/app/PaymentDrivers/Stripe/ImportCustomers.php @@ -208,7 +208,7 @@ class ImportCustomers if (! $cgt) { nlog('customer '.$searchResults->data[0]->id.' does not exist.'); - $this->update_payment_methods->updateMethods($searchResults->data[0], $client); + $this->update_payment_methods->updateMethods($searchResults->data[0], $client); //@phpstan-ignore-line } } } diff --git a/app/Repositories/ActivityRepository.php b/app/Repositories/ActivityRepository.php index 035faa5efa6a..81874524b1d2 100644 --- a/app/Repositories/ActivityRepository.php +++ b/app/Repositories/ActivityRepository.php @@ -41,7 +41,7 @@ class ActivityRepository extends BaseRepository * Save the Activity. * * @param \stdClass $fields The fields - * @param \App\Models\Invoice | \App\Models\Quote | \App\Models\Credit | \App\Models\PurchaseOrder | \App\Models\Expense $entity + * @param \App\Models\Invoice | \App\Models\Quote | \App\Models\Credit | \App\Models\PurchaseOrder | \App\Models\Expense | \App\Models\Payment $entity * @param array $event_vars */ public function save($fields, $entity, $event_vars) diff --git a/app/Repositories/SubscriptionRepository.php b/app/Repositories/SubscriptionRepository.php index e7d971f0d379..eb53fc6e03be 100644 --- a/app/Repositories/SubscriptionRepository.php +++ b/app/Repositories/SubscriptionRepository.php @@ -124,7 +124,7 @@ class SubscriptionRepository extends BaseRepository * * Removing the nested keys of the items array * - * @param array $bundle + * @param mixed $bundle * @return array */ private function convertV3Bundle($bundle): array diff --git a/app/Services/Client/PaymentMethod.php b/app/Services/Client/PaymentMethod.php index 492f907e13b9..8a27f3183144 100644 --- a/app/Services/Client/PaymentMethod.php +++ b/app/Services/Client/PaymentMethod.php @@ -166,7 +166,7 @@ class PaymentMethod //note we have to use GatewayType::CREDIT_CARD as alias for CUSTOM foreach ($this->gateways as $gateway) { foreach ($gateway->driver($this->client)->gatewayTypes() as $type) { - if (isset($gateway->fees_and_limits) && is_object($gateway->fees_and_limits) && property_exists($gateway->fees_and_limits, GatewayType::CREDIT_CARD)) { + if (isset($gateway->fees_and_limits) && is_object($gateway->fees_and_limits) && property_exists($gateway->fees_and_limits, GatewayType::CREDIT_CARD)) { //@phpstan-ignore-line if ($this->validGatewayForAmount($gateway->fees_and_limits->{GatewayType::CREDIT_CARD}, $this->amount)) { // $this->payment_methods[] = [$gateway->id => $type]; //@15-06-2024 diff --git a/app/Services/Client/Statement.php b/app/Services/Client/Statement.php index 9b574e0674dd..d001103885e7 100644 --- a/app/Services/Client/Statement.php +++ b/app/Services/Client/Statement.php @@ -187,7 +187,7 @@ class Statement $pdf = $this->makePdf(null, null, $html); } } catch (\Exception $e) { - nlog(print_r($e->getMessage(), 1)); + nlog(print_r($e->getMessage(), true)); } @@ -385,7 +385,6 @@ class Statement /** * Get correct invitation ID. * - * @return int|bool */ protected function getInvitation() { diff --git a/app/Services/EDocument/Standards/Validation/Peppol/CompanyLevel.php b/app/Services/EDocument/Standards/Validation/Peppol/CompanyLevel.php index 04624c51b8f0..d78d526b1ab1 100644 --- a/app/Services/EDocument/Standards/Validation/Peppol/CompanyLevel.php +++ b/app/Services/EDocument/Standards/Validation/Peppol/CompanyLevel.php @@ -231,9 +231,9 @@ class CompanyLevel // #[SerializedName('cac:BuyerCustomerParty')] // public $BuyerCustomerParty; - // /** @var SellerSupplierParty */ - // #[SerializedName('cac:SellerSupplierParty')] - // public $SellerSupplierParty; + /** @var SellerSupplierParty */ + #[SerializedName('cac:SellerSupplierParty')] + public $SellerSupplierParty; /** @var TaxRepresentativeParty */ #[SerializedName('cac:TaxRepresentativeParty')] diff --git a/app/Services/Invoice/AutoBillInvoice.php b/app/Services/Invoice/AutoBillInvoice.php index 782b0fac9a76..5e6844fffaad 100644 --- a/app/Services/Invoice/AutoBillInvoice.php +++ b/app/Services/Invoice/AutoBillInvoice.php @@ -433,7 +433,7 @@ class AutoBillInvoice extends AbstractService $company_gateway = $gateway_token->gateway; //check if fees and limits are set - if (isset($company_gateway->fees_and_limits) && ! is_array($company_gateway->fees_and_limits) && property_exists($company_gateway->fees_and_limits, $gateway_token->gateway_type_id)) { + if (isset($company_gateway->fees_and_limits) && ! is_array($company_gateway->fees_and_limits) && property_exists($company_gateway->fees_and_limits, $gateway_token->gateway_type_id)) { //@phpstan-ignore-line //if valid we keep this gateway_token if ($this->invoice->client->validGatewayForAmount($company_gateway->fees_and_limits->{$gateway_token->gateway_type_id}, $amount)) { return true; diff --git a/app/Services/Pdf/PdfConfiguration.php b/app/Services/Pdf/PdfConfiguration.php index 4c9548bdb92e..f639a018922c 100644 --- a/app/Services/Pdf/PdfConfiguration.php +++ b/app/Services/Pdf/PdfConfiguration.php @@ -306,7 +306,7 @@ class PdfConfiguration $decimal = $this->country->decimal_separator; } - if (isset($this->country->swap_currency_symbol) && strlen($this->country->swap_currency_symbol) >= 1) { + if (isset($this->country->swap_currency_symbol) && $this->country->swap_currency_symbol) { $swapSymbol = $this->country->swap_currency_symbol; } diff --git a/app/Utils/SystemHealth.php b/app/Utils/SystemHealth.php index 96522a0427c5..34f06d597b6c 100644 --- a/app/Utils/SystemHealth.php +++ b/app/Utils/SystemHealth.php @@ -175,7 +175,7 @@ class SystemHealth public static function checkOpenBaseDir() { - if (strlen(ini_get('open_basedir') == 0)) { + if (strlen(ini_get('open_basedir')) == 0) { return true; } diff --git a/app/Utils/Traits/CompanySettingsSaver.php b/app/Utils/Traits/CompanySettingsSaver.php index e9fd86e49289..1b3c304071d4 100644 --- a/app/Utils/Traits/CompanySettingsSaver.php +++ b/app/Utils/Traits/CompanySettingsSaver.php @@ -39,7 +39,7 @@ trait CompanySettingsSaver * Saves a setting object. * * Works for groups|clients|companies - * @param array $settings The request input settings array + * @param mixed $settings The request input settings array * @param object $entity The entity which the settings belongs to * @return void */ diff --git a/app/Utils/Traits/GeneratesCounter.php b/app/Utils/Traits/GeneratesCounter.php index f67288de6734..82e93c6afd08 100644 --- a/app/Utils/Traits/GeneratesCounter.php +++ b/app/Utils/Traits/GeneratesCounter.php @@ -441,7 +441,7 @@ trait GeneratesCounter /** * Formats the entity number according to pattern, prefix and padding. * - * @param Collection $entity The entity ie App\Models\Client, Invoice, Quote etc + * @param mixed $entity The entity ie App\Models\Client, Invoice, Quote etc * @param int $counter The counter * @param int $padding The padding * @param string $pattern From 7b0b5216a8887fbf533b673a6a9120ef82d77370 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Sun, 14 Jul 2024 21:32:46 +1000 Subject: [PATCH 08/45] Add client level validation settings --- .../EInvoice/ValidClientScheme.php | 61 ++++ .../Validation/Peppol/ClientLevel.php | 303 ++++++++++++++++++ 2 files changed, 364 insertions(+) create mode 100644 app/Http/ValidationRules/EInvoice/ValidClientScheme.php create mode 100644 app/Services/EDocument/Standards/Validation/Peppol/ClientLevel.php diff --git a/app/Http/ValidationRules/EInvoice/ValidClientScheme.php b/app/Http/ValidationRules/EInvoice/ValidClientScheme.php new file mode 100644 index 000000000000..ff38a0aad27c --- /dev/null +++ b/app/Http/ValidationRules/EInvoice/ValidClientScheme.php @@ -0,0 +1,61 @@ +validateRequest($value['Invoice'], ClientLevel::class); + + foreach ($errors as $key => $msg) { + + $this->validator->errors()->add( + "e_invoice.{$key}", + "{$key} - {$msg}" + ); + + } + + } + + /** + * Set the current validator. + */ + public function setValidator(Validator $validator): static + { + $this->validator = $validator; + return $this; + } + + +} diff --git a/app/Services/EDocument/Standards/Validation/Peppol/ClientLevel.php b/app/Services/EDocument/Standards/Validation/Peppol/ClientLevel.php new file mode 100644 index 000000000000..e83383388afc --- /dev/null +++ b/app/Services/EDocument/Standards/Validation/Peppol/ClientLevel.php @@ -0,0 +1,303 @@ + 'Y-m-d'])] + // #[SerializedName('cbc:IssueDate')] + // public ?DateTime $IssueDate; + + // /** @var ?\DateTime */ + // #[Context([DateTimeNormalizer::FORMAT_KEY => 'Y-m-d\TH:i:s.uP'])] + // #[SerializedName('cbc:IssueTime')] + // public ?DateTime $IssueTime; + + // /** @var ?\DateTime */ + // #[Context([DateTimeNormalizer::FORMAT_KEY => 'Y-m-d'])] + // #[SerializedName('cbc:DueDate')] + // public ?DateTime $DueDate; + + /** @var InvoiceTypeCode */ + #[SerializedName('cbc:InvoiceTypeCode')] + public $InvoiceTypeCode; + + /** @var string */ + #[SerializedName('cbc:Note')] + public string $Note; + + /** @var ?\DateTime */ + #[Context([DateTimeNormalizer::FORMAT_KEY => 'Y-m-d'])] + #[SerializedName('cbc:TaxPointDate')] + public ?DateTime $TaxPointDate; + + /** @var DocumentCurrencyCode */ + #[SerializedName('cbc:DocumentCurrencyCode')] + public $DocumentCurrencyCode; + + /** @var TaxCurrencyCode */ + #[SerializedName('cbc:TaxCurrencyCode')] + public $TaxCurrencyCode; + + /** @var PricingCurrencyCode */ + #[SerializedName('cbc:PricingCurrencyCode')] + public $PricingCurrencyCode; + + /** @var PaymentCurrencyCode */ + #[SerializedName('cbc:PaymentCurrencyCode')] + public $PaymentCurrencyCode; + + /** @var PaymentAlternativeCurrencyCode */ + #[SerializedName('cbc:PaymentAlternativeCurrencyCode')] + public $PaymentAlternativeCurrencyCode; + + // /** @var AccountingCostCode */ + // #[SerializedName('cbc:AccountingCostCode')] + // public $AccountingCostCode; + + /** @var string */ + #[SerializedName('cbc:AccountingCost')] + public string $AccountingCost; + + // /** @var LineCountNumeric */ + // #[SerializedName('cbc:LineCountNumeric')] + // public $LineCountNumeric; + + // /** @var string */ + // #[SerializedName('cbc:BuyerReference')] + // public string $BuyerReference; + + // /** @var InvoicePeriod[] */ + // #[SerializedName('cac:InvoicePeriod')] + // public array $InvoicePeriod; + + // /** @var OrderReference */ + // #[SerializedName('cac:OrderReference')] + // public $OrderReference; + + // /** @var BillingReference[] */ + // #[SerializedName('cac:BillingReference')] + // public array $BillingReference; + + /** @var DespatchDocumentReference[] */ + #[SerializedName('cac:DespatchDocumentReference')] + public array $DespatchDocumentReference; + + /** @var ReceiptDocumentReference[] */ + #[SerializedName('cac:ReceiptDocumentReference')] + public array $ReceiptDocumentReference; + + /** @var StatementDocumentReference[] */ + #[SerializedName('cac:StatementDocumentReference')] + public array $StatementDocumentReference; + + /** @var OriginatorDocumentReference[] */ + #[SerializedName('cac:OriginatorDocumentReference')] + public array $OriginatorDocumentReference; + + /** @var ContractDocumentReference[] */ + #[SerializedName('cac:ContractDocumentReference')] + public array $ContractDocumentReference; + + /** @var AdditionalDocumentReference[] */ + #[SerializedName('cac:AdditionalDocumentReference')] + public array $AdditionalDocumentReference; + + /** @var ProjectReference[] */ + #[SerializedName('cac:ProjectReference')] + public array $ProjectReference; + + // /** @var Signature[] */ + // #[SerializedName('cac:Signature')] + // public array $Signature; + + // /** @var AccountingSupplierParty */ + // #[NotNull] + // #[NotBlank] + // #[Valid] + // #[SerializedName('cac:AccountingSupplierParty')] + // public $AccountingSupplierParty; + + // /** @var AccountingCustomerParty */ + // #[NotNull] + // #[NotBlank] + // #[Valid] + // #[SerializedName('cac:AccountingCustomerParty')] + // public $AccountingCustomerParty; + + /** @var PayeeParty */ + #[SerializedName('cac:PayeeParty')] + public $PayeeParty; + + /** @var BuyerCustomerParty */ + #[SerializedName('cac:BuyerCustomerParty')] + public $BuyerCustomerParty; + + // /** @var SellerSupplierParty */ + // #[SerializedName('cac:SellerSupplierParty')] + // public $SellerSupplierParty; + + /** @var TaxRepresentativeParty */ + #[SerializedName('cac:TaxRepresentativeParty')] + public $TaxRepresentativeParty; + + /** @var Delivery[] */ + #[SerializedName('cac:Delivery')] + public array $Delivery; + + /** @var DeliveryTerms */ + #[SerializedName('cac:DeliveryTerms')] + public $DeliveryTerms; + + /** @var PaymentMeans[] */ + #[SerializedName('cac:PaymentMeans')] + public array $PaymentMeans; + + /** @var PaymentTerms[] */ + #[SerializedName('cac:PaymentTerms')] + public array $PaymentTerms; + + // /** @var PrepaidPayment[] */ + // #[SerializedName('cac:PrepaidPayment')] + // public array $PrepaidPayment; + + // /** @var AllowanceCharge[] */ + // #[SerializedName('cac:AllowanceCharge')] + // public array $AllowanceCharge; + + // /** @var TaxExchangeRate */ + // #[SerializedName('cac:TaxExchangeRate')] + // public $TaxExchangeRate; + + // /** @var PricingExchangeRate */ + // #[SerializedName('cac:PricingExchangeRate')] + // public $PricingExchangeRate; + + // /** @var PaymentExchangeRate */ + // #[SerializedName('cac:PaymentExchangeRate')] + // public $PaymentExchangeRate; + + // /** @var PaymentAlternativeExchangeRate */ + // #[SerializedName('cac:PaymentAlternativeExchangeRate')] + // public $PaymentAlternativeExchangeRate; + + // /** @var TaxTotal[] */ + // #[SerializedName('cac:TaxTotal')] + // public array $TaxTotal; + + // /** @var WithholdingTaxTotal[] */ + // #[SerializedName('cac:WithholdingTaxTotal')] + // public array $WithholdingTaxTotal; + + // /** @var LegalMonetaryTotal */ + // #[NotNull] + // #[NotBlank] + // #[Valid] + // #[SerializedName('cac:LegalMonetaryTotal')] + // public $LegalMonetaryTotal; + + // /** @var InvoiceLine[] */ + // #[NotNull] + // #[NotBlank] + // #[Valid] + // #[SerializedName('cac:InvoiceLine')] + // public array $InvoiceLine; +} From 745c594f3b908e50baab27ec981e77d737df5022 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Mon, 15 Jul 2024 13:35:21 +1000 Subject: [PATCH 09/45] Static analysis --- app/Jobs/Util/Import.php | 1 - app/Listeners/Mail/MailSentListener.php | 2 +- app/Mail/Ninja/StripeConnectFailed.php | 2 +- app/Models/Document.php | 4 ++-- app/PaymentDrivers/PayPal/PayPalWebhook.php | 2 +- app/Services/EDocument/Standards/RoEInvoice.php | 2 +- app/Services/Pdf/PdfConfiguration.php | 4 ++-- app/Services/PdfMaker/Designs/Utilities/DesignHelpers.php | 2 +- app/Services/Subscription/SubscriptionService.php | 2 +- app/Services/Template/TemplateService.php | 2 +- app/Utils/Number.php | 6 +++--- app/Utils/TempFile.php | 2 +- 12 files changed, 15 insertions(+), 16 deletions(-) diff --git a/app/Jobs/Util/Import.php b/app/Jobs/Util/Import.php index f422c4014c02..f4961b19fc43 100644 --- a/app/Jobs/Util/Import.php +++ b/app/Jobs/Util/Import.php @@ -1545,7 +1545,6 @@ class Import implements ShouldQueue $file_path, $file_name, $file_info, - filesize($file_path), 0, false ); diff --git a/app/Listeners/Mail/MailSentListener.php b/app/Listeners/Mail/MailSentListener.php index 3db2aba09b5c..18a01585b834 100644 --- a/app/Listeners/Mail/MailSentListener.php +++ b/app/Listeners/Mail/MailSentListener.php @@ -46,7 +46,7 @@ class MailSentListener implements ShouldQueue try { $message_id = $event->sent->getMessageId(); - $message = MessageConverter::toEmail($event->sent->getOriginalMessage()); + $message = MessageConverter::toEmail($event->sent->getOriginalMessage()); //@phpstan-ignore-line if (!$message->getHeaders()->get('x-invitation')) { return; diff --git a/app/Mail/Ninja/StripeConnectFailed.php b/app/Mail/Ninja/StripeConnectFailed.php index 3508fbc9edbd..bee93bd114fb 100644 --- a/app/Mail/Ninja/StripeConnectFailed.php +++ b/app/Mail/Ninja/StripeConnectFailed.php @@ -39,7 +39,7 @@ class StripeConnectFailed extends Mailable return new Envelope( subject: "Stripe Connect not configured, please login and connect.", from: config('ninja.contact.email'), - to: $this->user->email, + to: $this->user->email, //@phpstan-ignore-line ); } diff --git a/app/Models/Document.php b/app/Models/Document.php index 73e5a22ca5d3..140c98cdf656 100644 --- a/app/Models/Document.php +++ b/app/Models/Document.php @@ -245,9 +245,9 @@ class Document extends BaseModel try { $file = base64_encode($image); - $img = new \Imagick(); + $img = new \Imagick(); //@phpstan-ignore-line $img->readImageBlob($file); - $img->setImageCompression(true); + $img->setImageCompression(true); //@phpstan-ignore-line $img->setImageCompressionQuality(40); return $img->getImageBlob(); diff --git a/app/PaymentDrivers/PayPal/PayPalWebhook.php b/app/PaymentDrivers/PayPal/PayPalWebhook.php index 744230dee6c5..3a42bdf97c09 100644 --- a/app/PaymentDrivers/PayPal/PayPalWebhook.php +++ b/app/PaymentDrivers/PayPal/PayPalWebhook.php @@ -297,7 +297,7 @@ class PayPalWebhook implements ShouldQueue $gateway = CompanyGateway::query() ->where('company_id', $company->id) ->where('gateway_key', $this->gateway_key) - ->first(function ($cg) use ($merchant_id) { + ->first(function ($cg) use ($merchant_id) { //@phpstan-ignore-line $config = $cg->getConfig(); if($config->merchantId == $merchant_id) { diff --git a/app/Services/EDocument/Standards/RoEInvoice.php b/app/Services/EDocument/Standards/RoEInvoice.php index 016f810d4e9c..a82f45224a0f 100644 --- a/app/Services/EDocument/Standards/RoEInvoice.php +++ b/app/Services/EDocument/Standards/RoEInvoice.php @@ -188,7 +188,7 @@ class RoEInvoice extends AbstractService $ubl_invoice->setCustomizationID("urn:cen.eu:en16931:2017#compliant#urn:efactura.mfinante.ro:CIUS-RO:1.0.1"); // invoice - $ubl_invoice->setId($invoice->number); + $ubl_invoice->setId($invoice->number); //@phpstan-ignore-line $ubl_invoice->setIssueDate(date_create($invoice->date)); $ubl_invoice->setDueDate(date_create($invoice->due_date)); $ubl_invoice->setInvoiceTypeCode("380"); diff --git a/app/Services/Pdf/PdfConfiguration.php b/app/Services/Pdf/PdfConfiguration.php index f639a018922c..2adc2d1105d4 100644 --- a/app/Services/Pdf/PdfConfiguration.php +++ b/app/Services/Pdf/PdfConfiguration.php @@ -410,7 +410,7 @@ class PdfConfiguration $precision = 0; } - $value = number_format($v, $precision, $decimal, $thousand); + $value = number_format($v, $precision, $decimal, $thousand); //@phpstan-ignore-line $symbol = $this->currency->symbol; if ($this->settings->show_currency_code === true && $this->currency->code == 'CHF') { @@ -427,7 +427,7 @@ class PdfConfiguration return "{$symbol}{$value}"; } else { - return $this->formatValue($value); + return $this->formatValue($value); // @phpstan-ignore-line } } diff --git a/app/Services/PdfMaker/Designs/Utilities/DesignHelpers.php b/app/Services/PdfMaker/Designs/Utilities/DesignHelpers.php index 7c00cfb1871e..9a8fece5de4a 100644 --- a/app/Services/PdfMaker/Designs/Utilities/DesignHelpers.php +++ b/app/Services/PdfMaker/Designs/Utilities/DesignHelpers.php @@ -174,7 +174,7 @@ trait DesignHelpers // evaluating the variable. if (in_array(sprintf('%s%s.tax', '$', $type), (array) $this->context['pdf_variables']["{$column_type}_columns"])) { - $line_items = collect($this->entity->line_items)->filter(function ($item) use ($type_id) { + $line_items = collect($this->entity->line_items)->filter(function ($item) use ($type_id) { //@phpstan-ignore-line return $item->type_id = $type_id; }); diff --git a/app/Services/Subscription/SubscriptionService.php b/app/Services/Subscription/SubscriptionService.php index 9e97aee3c990..da88156c8d70 100644 --- a/app/Services/Subscription/SubscriptionService.php +++ b/app/Services/Subscription/SubscriptionService.php @@ -428,7 +428,7 @@ class SubscriptionService /** * We refund unused days left. * - * @param Invoice $invoice + * @param \App\Models\Invoice | \App\Models\Credit $invoice * @return float */ private function calculateProRataRefund($invoice, $subscription = null): float diff --git a/app/Services/Template/TemplateService.php b/app/Services/Template/TemplateService.php index a286d05bbb9b..196e3c5f2cdc 100644 --- a/app/Services/Template/TemplateService.php +++ b/app/Services/Template/TemplateService.php @@ -654,7 +654,7 @@ class TemplateService 'updated_at' => $this->translateDate($invoice->pivot->updated_at, $payment->client->date_format(), $payment->client->locale()), 'timestamp' => $invoice->pivot->created_at->timestamp, ]; - })->merge($credits)->sortBy('timestamp')->toArray(); + })->concat($credits)->sortBy('timestamp')->toArray(); return [ 'status' => $payment->stringStatus($payment->status_id), diff --git a/app/Utils/Number.php b/app/Utils/Number.php index c1d601a80e61..84394be04ea4 100644 --- a/app/Utils/Number.php +++ b/app/Utils/Number.php @@ -277,7 +277,7 @@ class Number return "{$symbol}{$value}"; } else { - return self::formatValue($value, $currency); + return self::formatValue($value, $currency); //@phpstan-ignore-line } } @@ -339,7 +339,7 @@ class Number $precision = 0; } - $value = number_format($v, $precision, $decimal, $thousand); + $value = number_format($v, $precision, $decimal, $thousand);//@phpstan-ignore-line $symbol = $currency->symbol; if ($entity->getSetting('show_currency_code') === true && $currency->code == 'CHF') { @@ -356,7 +356,7 @@ class Number return "{$symbol}{$value}"; } else { - return self::formatValue($value, $currency); + return self::formatValue($value, $currency); //@phpstan-ignore-line } } } diff --git a/app/Utils/TempFile.php b/app/Utils/TempFile.php index 16b1dc1a932a..58cd8a942c17 100644 --- a/app/Utils/TempFile.php +++ b/app/Utils/TempFile.php @@ -17,7 +17,7 @@ class TempFile { public static function path($url): string { - $temp_path = @tempnam(sys_get_temp_dir().'/'.sha1(time()), basename($url)); + $temp_path = @tempnam(sys_get_temp_dir().'/'.sha1((string)time()), basename($url)); copy($url, $temp_path); return $temp_path; From 19465985c60451c58313ee1c03f35d23b2583f46 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Mon, 15 Jul 2024 14:27:12 +1000 Subject: [PATCH 10/45] Storecove API --- .../EDocument/Gateway/Storecove/Storecove.php | 99 +++++++++++++++++++ config/ninja.php | 2 +- 2 files changed, 100 insertions(+), 1 deletion(-) create mode 100644 app/Services/EDocument/Gateway/Storecove/Storecove.php diff --git a/app/Services/EDocument/Gateway/Storecove/Storecove.php b/app/Services/EDocument/Gateway/Storecove/Storecove.php new file mode 100644 index 000000000000..e5d4a479f495 --- /dev/null +++ b/app/Services/EDocument/Gateway/Storecove/Storecove.php @@ -0,0 +1,99 @@ + ["invoice"], + "network" => "peppol", + "metaScheme" => "iso6523-actorid-upis", + "scheme" => "de:lwid", + "identifier" => "10101010-STO-10" + ]; + + private array $dbn_discovery = [ + "documentTypes" => ["invoice"], + "network" => "dbnalliance", + "metaScheme" => "iso6523-actorid-upis", + "scheme" => "gln", + "identifier" => "1200109963131" + ]; + + + public function __construct(){} + + //config('ninja.storecove_api_key'); + + + //https://app.storecove.com/en/docs#_test_identifiers + //check if identifier is able to send on the network. + + + + public function discovery($identifier, $scheme, $network = 'peppol') + { + $network_data = []; + + match ($network) { + 'peppol' => $network_data = array_merge($this->peppol_discovery, ['scheme' => $scheme, 'identifier' => $identifier]), + 'dbn' => $network_data = array_merge($this->dbn_discovery, ['scheme' => $scheme, 'identifier' => $identifier]), + default => $network_data = array_merge($this->peppol_discovery, ['scheme' => $scheme, 'identifier' => $identifier]), + }; + + $uri = "https://api.storecove.com/api/v2/discovery/receives"; + + $r = $this->httpClient($uri, (HttpVerb::POST)->value, $network_data, $this->getHeaders()); + + return ($r->successful() && $r->json()['code'] == 'OK') ? true : false; + + } + + private function getHeaders(array $headers = []) + { + + return array_merge([ + 'Accept' => 'application/json', + 'Content-type' => 'application/json', + ], $headers); + + } + + public function httpClient(string $uri, string $verb, array $data, ?array $headers = []) + { + + $r = Http::withToken($this->access_token) + ->withHeaders($this->getHeaders($headers)) + ->{$verb}("{$this->api_endpoint_url}{$uri}", $data); + + return $r; + } + +// curl \ +// -X POST \ +// -H "Accept: application/json" \ +// -H "Authorization: Bearer API_KEY_HERE" \ +// -H "Content-Type: application/json" \ +// --data @discovery.json +} \ No newline at end of file diff --git a/config/ninja.php b/config/ninja.php index e6bd9d75ae72..13c37af3e35c 100644 --- a/config/ninja.php +++ b/config/ninja.php @@ -240,5 +240,5 @@ return [ 'private_key' => env('NINJA_PRIVATE_KEY', false), ], 'upload_extensions' => env('ADDITIONAL_UPLOAD_EXTENSIONS', ''), - + 'storecove_api_key' => env('STORECOVE_API_KEY', false), ]; From f9e631d37d568b05b7ba06775ae0f2c8d9de2a0a Mon Sep 17 00:00:00 2001 From: David Bomba Date: Mon, 15 Jul 2024 17:09:58 +1000 Subject: [PATCH 11/45] Storecove API --- .../EDocument/Gateway/Storecove/Storecove.php | 44 +++++++++++++++++-- 1 file changed, 41 insertions(+), 3 deletions(-) diff --git a/app/Services/EDocument/Gateway/Storecove/Storecove.php b/app/Services/EDocument/Gateway/Storecove/Storecove.php index e5d4a479f495..f913e466d107 100644 --- a/app/Services/EDocument/Gateway/Storecove/Storecove.php +++ b/app/Services/EDocument/Gateway/Storecove/Storecove.php @@ -51,7 +51,7 @@ class Storecove { //check if identifier is able to send on the network. - + //response = { "code": "OK", "email": false} public function discovery($identifier, $scheme, $network = 'peppol') { $network_data = []; @@ -70,6 +70,44 @@ class Storecove { } + //response = "guid" : "xx", + + /** + * If the receiver cannot be found, then an + * email is sent to that user if a appropriate + * email is included in the document payload + * + * { + "routing": { + "emails": [ + "test@example.com" + ], + "eIdentifiers": [] + } + } + * + */ + public function sendDocument($document) + { + $uri = "https://api.storecove.com/api/v2/document_submissions"; + + $r = $this->httpClient($uri, (HttpVerb::POST)->value, $document, $this->getHeaders()); + + if($r->successful()) + return $r->json()['guid']; + + return false; + + } + + //document submission sending evidence + public function sendingEvidence(string $guid) + { + $uri = "https://api.storecove.com/api/v2/document_submissions/{$guid}"; + $r = $this->httpClient($uri, (HttpVerb::GET)->value, [], $this->getHeaders()); + + } + private function getHeaders(array $headers = []) { @@ -83,9 +121,9 @@ class Storecove { public function httpClient(string $uri, string $verb, array $data, ?array $headers = []) { - $r = Http::withToken($this->access_token) + $r = Http::withToken(config('ninja.storecove_api_key')) ->withHeaders($this->getHeaders($headers)) - ->{$verb}("{$this->api_endpoint_url}{$uri}", $data); + ->{$verb}($uri, $data); return $r; } From dc8beec89d891099771fcbbb917b412afecf577d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benjamin=20Beganovi=C4=87?= Date: Mon, 15 Jul 2024 18:52:30 +0200 Subject: [PATCH 12/45] update translations --- lang/en/texts.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lang/en/texts.php b/lang/en/texts.php index f092f2cf9c96..ce61a4667396 100644 --- a/lang/en/texts.php +++ b/lang/en/texts.php @@ -5299,6 +5299,8 @@ $lang = array( 'assigned_group' => 'Successfully assigned group', 'merge_to_pdf' => 'Merge to PDF', 'latest_requires_php_version' => 'Note: the latest version requires PHP :version', + 'auto_expand_product_table_notes' => 'Automatically expand products table notes', + 'auto_expand_product_table_notes_help' => 'Automatically expands the notes section within the products table to display more lines.', ); return $lang; From 90c700a81aa1a9fc5bf28526d8de5971b70c87c7 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Tue, 16 Jul 2024 08:31:56 +1000 Subject: [PATCH 13/45] v5.10.9 --- VERSION.txt | 2 +- .../Requests/Company/UpdateCompanyRequest.php | 2 +- .../EDocument/Gateway/Storecove/Storecove.php | 29 +++++++++++++------ config/ninja.php | 4 +-- 4 files changed, 24 insertions(+), 13 deletions(-) diff --git a/VERSION.txt b/VERSION.txt index e5cce47b3049..44e4813bf4a8 100644 --- a/VERSION.txt +++ b/VERSION.txt @@ -1 +1 @@ -5.10.8 \ No newline at end of file +5.10.9 \ No newline at end of file diff --git a/app/Http/Requests/Company/UpdateCompanyRequest.php b/app/Http/Requests/Company/UpdateCompanyRequest.php index c48ee397ee0e..c51419393171 100644 --- a/app/Http/Requests/Company/UpdateCompanyRequest.php +++ b/app/Http/Requests/Company/UpdateCompanyRequest.php @@ -65,7 +65,7 @@ class UpdateCompanyRequest extends Request $rules['smtp_local_domain'] = 'sometimes|string|nullable'; // $rules['smtp_verify_peer'] = 'sometimes|string'; - $rules['e_invoice'] = ['sometimes','nullable', new ValidCompanyScheme()]; + // $rules['e_invoice'] = ['sometimes','nullable', new ValidCompanyScheme()]; if (isset($input['portal_mode']) && ($input['portal_mode'] == 'domain' || $input['portal_mode'] == 'iframe')) { $rules['portal_domain'] = 'bail|nullable|sometimes|url'; diff --git a/app/Services/EDocument/Gateway/Storecove/Storecove.php b/app/Services/EDocument/Gateway/Storecove/Storecove.php index f913e466d107..7c991aabc621 100644 --- a/app/Services/EDocument/Gateway/Storecove/Storecove.php +++ b/app/Services/EDocument/Gateway/Storecove/Storecove.php @@ -86,12 +86,28 @@ class Storecove { } } * + * + * + // documentType : invoice/invoice_response/order + // rawDocumentData : { + // document: base64_encode($ubl) + // parse: true + // parseStrategy: ubl + // } */ public function sendDocument($document) { + + $payload = [ + 'documentType' => 'invoice', + 'rawDocumentData' => base64_encode($document), + 'parse' => true, + 'parseStrategy', 'ubl' + ]; + $uri = "https://api.storecove.com/api/v2/document_submissions"; - $r = $this->httpClient($uri, (HttpVerb::POST)->value, $document, $this->getHeaders()); + $r = $this->httpClient($uri, (HttpVerb::POST)->value, $payload, $this->getHeaders()); if($r->successful()) return $r->json()['guid']; @@ -101,7 +117,7 @@ class Storecove { } //document submission sending evidence - public function sendingEvidence(string $guid) + public function getSendingEvidence(string $guid) { $uri = "https://api.storecove.com/api/v2/document_submissions/{$guid}"; $r = $this->httpClient($uri, (HttpVerb::GET)->value, [], $this->getHeaders()); @@ -118,7 +134,7 @@ class Storecove { } - public function httpClient(string $uri, string $verb, array $data, ?array $headers = []) + private function httpClient(string $uri, string $verb, array $data, ?array $headers = []) { $r = Http::withToken(config('ninja.storecove_api_key')) @@ -128,10 +144,5 @@ class Storecove { return $r; } -// curl \ -// -X POST \ -// -H "Accept: application/json" \ -// -H "Authorization: Bearer API_KEY_HERE" \ -// -H "Content-Type: application/json" \ -// --data @discovery.json + } \ No newline at end of file diff --git a/config/ninja.php b/config/ninja.php index 13c37af3e35c..7680a6d74eb2 100644 --- a/config/ninja.php +++ b/config/ninja.php @@ -17,8 +17,8 @@ return [ 'require_https' => env('REQUIRE_HTTPS', true), 'app_url' => rtrim(env('APP_URL', ''), '/'), 'app_domain' => env('APP_DOMAIN', 'invoicing.co'), - 'app_version' => env('APP_VERSION', '5.10.8'), - 'app_tag' => env('APP_TAG', '5.10.8'), + 'app_version' => env('APP_VERSION', '5.10.9'), + 'app_tag' => env('APP_TAG', '5.10.9'), 'minimum_client_version' => '5.0.16', 'terms_version' => '1.0.1', 'api_secret' => env('API_SECRET', false), From 64106ce7e15bad21189ca5a08926b77d02efab8e Mon Sep 17 00:00:00 2001 From: David Bomba Date: Tue, 16 Jul 2024 08:38:30 +1000 Subject: [PATCH 14/45] Fixes for e invoice validation --- .../Requests/Company/UpdateCompanyRequest.php | 2 +- .../EInvoice/ValidClientScheme.php | 18 +++++++++------- .../EInvoice/ValidCompanyScheme.php | 21 +++++++++++-------- 3 files changed, 23 insertions(+), 18 deletions(-) diff --git a/app/Http/Requests/Company/UpdateCompanyRequest.php b/app/Http/Requests/Company/UpdateCompanyRequest.php index c51419393171..c48ee397ee0e 100644 --- a/app/Http/Requests/Company/UpdateCompanyRequest.php +++ b/app/Http/Requests/Company/UpdateCompanyRequest.php @@ -65,7 +65,7 @@ class UpdateCompanyRequest extends Request $rules['smtp_local_domain'] = 'sometimes|string|nullable'; // $rules['smtp_verify_peer'] = 'sometimes|string'; - // $rules['e_invoice'] = ['sometimes','nullable', new ValidCompanyScheme()]; + $rules['e_invoice'] = ['sometimes','nullable', new ValidCompanyScheme()]; if (isset($input['portal_mode']) && ($input['portal_mode'] == 'domain' || $input['portal_mode'] == 'iframe')) { $rules['portal_domain'] = 'bail|nullable|sometimes|url'; diff --git a/app/Http/ValidationRules/EInvoice/ValidClientScheme.php b/app/Http/ValidationRules/EInvoice/ValidClientScheme.php index ff38a0aad27c..f21582559e4b 100644 --- a/app/Http/ValidationRules/EInvoice/ValidClientScheme.php +++ b/app/Http/ValidationRules/EInvoice/ValidClientScheme.php @@ -34,18 +34,20 @@ class ValidClientScheme implements ValidationRule, ValidatorAwareRule public function validate(string $attribute, mixed $value, Closure $fail): void { - $r = new EInvoice(); - $errors = $r->validateRequest($value['Invoice'], ClientLevel::class); + if(isset($value['Invoice'])) + { + $r = new EInvoice(); + $errors = $r->validateRequest($value['Invoice'], ClientLevel::class); - foreach ($errors as $key => $msg) { + foreach ($errors as $key => $msg) { - $this->validator->errors()->add( - "e_invoice.{$key}", - "{$key} - {$msg}" - ); + $this->validator->errors()->add( + "e_invoice.{$key}", + "{$key} - {$msg}" + ); + } } - } /** diff --git a/app/Http/ValidationRules/EInvoice/ValidCompanyScheme.php b/app/Http/ValidationRules/EInvoice/ValidCompanyScheme.php index bd5777bf30ea..6c3975d11c3e 100644 --- a/app/Http/ValidationRules/EInvoice/ValidCompanyScheme.php +++ b/app/Http/ValidationRules/EInvoice/ValidCompanyScheme.php @@ -35,18 +35,21 @@ class ValidCompanyScheme implements ValidationRule, ValidatorAwareRule public function validate(string $attribute, mixed $value, Closure $fail): void { - $r = new EInvoice(); - $errors = $r->validateRequest($value['Invoice'], CompanyLevel::class); - - foreach ($errors as $key => $msg) { + if(isset($value['Invoice'])) + { + $r = new EInvoice(); + $errors = $r->validateRequest($value['Invoice'], CompanyLevel::class); + + foreach ($errors as $key => $msg) { - $this->validator->errors()->add( - "e_invoice.{$key}", - "{$key} - {$msg}" - ); + $this->validator->errors()->add( + "e_invoice.{$key}", + "{$key} - {$msg}" + ); + } } - + } /** From ceee59f7df1c30e9fca76c4be77f79eb1352679c Mon Sep 17 00:00:00 2001 From: David Bomba Date: Tue, 16 Jul 2024 09:42:54 +1000 Subject: [PATCH 15/45] Minor fixes --- app/PaymentDrivers/Stripe/UpdatePaymentMethods.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/PaymentDrivers/Stripe/UpdatePaymentMethods.php b/app/PaymentDrivers/Stripe/UpdatePaymentMethods.php index 7777da7b7e17..244be05bfc1d 100644 --- a/app/PaymentDrivers/Stripe/UpdatePaymentMethods.php +++ b/app/PaymentDrivers/Stripe/UpdatePaymentMethods.php @@ -147,7 +147,7 @@ class UpdatePaymentMethods { $sources = $customer->sources ?? false; - if (!$customer || is_null($sources) || !property_exists($sources, 'data')) { + if (!$customer || is_null($sources) || !$sources || !property_exists($sources, 'data')) { return; } From 329044dcccf01ac56580973b2203a0512262e29c Mon Sep 17 00:00:00 2001 From: David Bomba Date: Tue, 16 Jul 2024 12:47:42 +1000 Subject: [PATCH 16/45] Create and update legal entities --- .../EDocument/Gateway/Storecove/Storecove.php | 114 +++++++++++++++++- 1 file changed, 110 insertions(+), 4 deletions(-) diff --git a/app/Services/EDocument/Gateway/Storecove/Storecove.php b/app/Services/EDocument/Gateway/Storecove/Storecove.php index 7c991aabc621..0dce32741c68 100644 --- a/app/Services/EDocument/Gateway/Storecove/Storecove.php +++ b/app/Services/EDocument/Gateway/Storecove/Storecove.php @@ -11,6 +11,7 @@ namespace App\Services\EDocument\Gateway; +use App\Models\Company; use Illuminate\Support\Facades\Http; @@ -25,6 +26,8 @@ enum HttpVerb: string class Storecove { + private string $base_url = 'https://api.storecove.com/'; + private array $peppol_discovery = [ "documentTypes" => ["invoice"], "network" => "peppol", @@ -62,7 +65,7 @@ class Storecove { default => $network_data = array_merge($this->peppol_discovery, ['scheme' => $scheme, 'identifier' => $identifier]), }; - $uri = "https://api.storecove.com/api/v2/discovery/receives"; + $uri = "api/v2/discovery/receives"; $r = $this->httpClient($uri, (HttpVerb::POST)->value, $network_data, $this->getHeaders()); @@ -105,7 +108,7 @@ class Storecove { 'parseStrategy', 'ubl' ]; - $uri = "https://api.storecove.com/api/v2/document_submissions"; + $uri = "api/v2/document_submissions"; $r = $this->httpClient($uri, (HttpVerb::POST)->value, $payload, $this->getHeaders()); @@ -119,11 +122,114 @@ class Storecove { //document submission sending evidence public function getSendingEvidence(string $guid) { - $uri = "https://api.storecove.com/api/v2/document_submissions/{$guid}"; + $uri = "api/v2/document_submissions/{$guid}"; $r = $this->httpClient($uri, (HttpVerb::GET)->value, [], $this->getHeaders()); } + // { + // "party_name": "", + // "line1": "", + // "city": "", + // "zip": "", + // "country": "EH", + // "line2": "", + // "county": "", + // "tenant_id": "", + // "public": true, + // "advertisements": [ + // "invoice" + // ], + // "third_party_username": "", + // "third_party_password": "", + // "rea": { + // "province": "AR", + // "identifier": "", + // "capital": "", + // "partners": "SM", + // "liquidation_status": "LN" + // }, + // "acts_as_sender": true, + // "acts_as_receiver": true, + // "tax_registered": true + // } + + // acts_as_receiver - optional - Default : true + // acts_as_sender - optional - Default : true + // advertisements - optional < enum (invoice, invoice_response, order, ordering, order_response, selfbilling) > array + // city - required - Length : 2 - 64 + // country - required - ISO 3166-1 alpha-2 + // county - optional - Maximal length : 64 + // line1 - required - The first address line - Length : 2 - 192 + // line2 - optional - The second address line, if applicable Maximal length : 192 + // party_name - required - The name of the company. Length : 2 - 64 + // public - optional - Whether or not this LegalEntity is public. Public means it will be entered into the PEPPOL directory at https://directory.peppol.eu/ Default : true + // rea - optional - The REA details for the LegalEntity. Only applies to IT (Italian) LegalEntities. - https://www.storecove.com/docs/#_openapi_rea (schema) + + // capital - optional - The captial for the company. - number + // identifier - optional - The identifier. Length : 2 - 20 + // liquidation_status - optional - The liquidation status of the company. enum (LN, LS) + // partners - optional - The number of partners. enum (SU, SM) + // province - optional - The provincia of the ufficio that issued the identifier.enum (AG, AL, AN, AO, AQ, AR, AP, AT, AV, BA, BT, BL, BN, BG, BI, BO, BZ, BS, BR, CA, CL, CB, CI, CE, CT, CZ, CH, CO, CS, CR, KR, CN, EN, FM, FE, FI, FG, FC, FR, GE, GO, GR, IM, IS, SP, LT, LE, LC, LI, LO, LU, MC, MN, MS, MT, VS, ME, MI, MO, MB, NA, NO, NU, OG, OT, OR, PD, PA, PR, PV, PG, PU, PE, PC, PI, PT, PN, PZ, PO, RG, RA, RC, RE, RI, RN, RO, SA, SS, SV, SI, SR, SO, TA, TE, TR, TO, TP, TN, TV, TS, UD, VA, VE, VB, VC, VR, VV, VI, VT) + + // tax_registered - optional - Whether or not this LegalEntity is tax registered. This influences the validation of the data presented when sending documents. Default : true + // tenant_id - optional - The id of the tenant, to be used in case of single-tenant solutions that share webhook URLs. This property will included in webhook events. Maximal length : 64 + // third_party_password - optional - The password to use to authenticate to a system through which to send the document, or to obtain tax authority approval to send it. This field is currently relevant only for India and mandatory when creating an IN LegalEntity. Length : 2 - 64 + // third_party_username - optional - The username to use to authenticate to a system through which to send the document, or to obtain tax authority approval to send it. This field is currently relevant only for India and mandatory when creating an IN LegalEntity. Length : 2 - 64 + // zip - required - The zipcode. Length : 2 - 32 + + /** + * CreateLegalEntity + * + * @url https://www.storecove.com/docs/#_openapi_legalentitycreate + * @return mixed + */ + public function createLegalEntity(array $data, Company $company) + { + $uri = 'legal_entities'; + + $company_defaults = [ + 'acts_as_receiver' => true, + 'acts_as_sender' => true, + 'advertisements' => ['invoice'], + 'city' => $company->settings->city, + 'country' => $company->country()->iso_3166_2, + 'county' => $company->settings->state, + 'line1' => $company->settings->address1, + 'line2' => $company->settings->address2, + 'party_name' => $company->settings->name, + 'tax_registered' => true, + 'tenant_id' => $company->company_key, + 'zip' => $company->settings->postal_code, + ]; + + $payload = array_merge($company_defaults, $data); + + $r = $this->httpClient($uri, (HttpVerb::POST)->value, $payload); + + if($r->successful()) + return $r->json(); + + return $r; + + } + + public function updateLegalEntity($id, array $data) + { + + $uri = "legal_entities/{$id}"; + + $r = $this->httpClient($uri, (HttpVerb::PATCH)->value, $data); + + if($r->successful()) { + return $r->json(); + } + + return $r; + + } + + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// private function getHeaders(array $headers = []) { @@ -139,7 +245,7 @@ class Storecove { $r = Http::withToken(config('ninja.storecove_api_key')) ->withHeaders($this->getHeaders($headers)) - ->{$verb}($uri, $data); + ->{$verb}("{$this->base_url}{$uri}", $data); return $r; } From c46936c9f31e69efe24b23b5b801c4d97694d2ba Mon Sep 17 00:00:00 2001 From: David Bomba Date: Tue, 16 Jul 2024 16:49:18 +1000 Subject: [PATCH 17/45] einvoice --- .../EDocument/Gateway/Storecove/Storecove.php | 53 ++++- app/Services/EDocument/Standards/Peppol.php | 7 + .../Einvoice/Storecove/StorecoveTest.php | 200 ++++++++++++++++++ 3 files changed, 250 insertions(+), 10 deletions(-) create mode 100644 tests/Integration/Einvoice/Storecove/StorecoveTest.php diff --git a/app/Services/EDocument/Gateway/Storecove/Storecove.php b/app/Services/EDocument/Gateway/Storecove/Storecove.php index 0dce32741c68..24d677543c58 100644 --- a/app/Services/EDocument/Gateway/Storecove/Storecove.php +++ b/app/Services/EDocument/Gateway/Storecove/Storecove.php @@ -9,12 +9,11 @@ * @license https://www.elastic.co/licensing/elastic-license */ -namespace App\Services\EDocument\Gateway; +namespace App\Services\EDocument\Gateway\Storecove; use App\Models\Company; use Illuminate\Support\Facades\Http; - enum HttpVerb: string { case POST = 'post'; @@ -26,7 +25,7 @@ enum HttpVerb: string class Storecove { - private string $base_url = 'https://api.storecove.com/'; + private string $base_url = 'https://api.storecove.com/api/v2/'; private array $peppol_discovery = [ "documentTypes" => ["invoice"], @@ -102,16 +101,35 @@ class Storecove { { $payload = [ - 'documentType' => 'invoice', - 'rawDocumentData' => base64_encode($document), - 'parse' => true, - 'parseStrategy', 'ubl' + "legalEntityId"=> 290868, + "idempotencyGuid"=> "61b37456-5f9e-4d56-b63b-3b1a23fa5c73", + "routing"=> [ + "eIdentifiers" => [ + [ + "scheme"=> "DE:LWID", + "id"=> "10101010-STO-10" + ], + ], + "emails"=> [ + "david@invoiceninja.com" + ], + "eIdentifiers"=> [] + ], + "document"=> [ + 'documentType' => 'invoice', + 'rawDocumentData' => ['document' => base64_encode($document)], + 'parse' => true, + 'parseStrategy', 'ubl' + ], ]; - $uri = "api/v2/document_submissions"; + $uri = "document_submissions"; $r = $this->httpClient($uri, (HttpVerb::POST)->value, $payload, $this->getHeaders()); + nlog($r->body()); + nlog($r->json()); + if($r->successful()) return $r->json()['guid']; @@ -122,7 +140,7 @@ class Storecove { //document submission sending evidence public function getSendingEvidence(string $guid) { - $uri = "api/v2/document_submissions/{$guid}"; + $uri = "document_submissions/{$guid}"; $r = $this->httpClient($uri, (HttpVerb::GET)->value, [], $this->getHeaders()); } @@ -214,6 +232,21 @@ class Storecove { } + public function getLegalEntity($id) + { + + $uri = "legal_entities/{$id}"; + + $r = $this->httpClient($uri, (HttpVerb::GET)->value, []); + + if($r->successful()) { + return $r->json(); + } + + return $r; + + } + public function updateLegalEntity($id, array $data) { @@ -242,7 +275,7 @@ class Storecove { private function httpClient(string $uri, string $verb, array $data, ?array $headers = []) { - +nlog("{$this->base_url}{$uri}"); $r = Http::withToken(config('ninja.storecove_api_key')) ->withHeaders($this->getHeaders($headers)) ->{$verb}("{$this->base_url}{$uri}", $data); diff --git a/app/Services/EDocument/Standards/Peppol.php b/app/Services/EDocument/Standards/Peppol.php index fca7ac0ecedb..572f69212838 100644 --- a/app/Services/EDocument/Standards/Peppol.php +++ b/app/Services/EDocument/Standards/Peppol.php @@ -15,6 +15,7 @@ use App\Models\Invoice; use App\Services\AbstractService; use App\Helpers\Invoice\InvoiceSum; use App\Helpers\Invoice\InvoiceSumInclusive; +use InvoiceNinja\EInvoice\EInvoice; use InvoiceNinja\EInvoice\Models\Peppol\ItemType\Item; use InvoiceNinja\EInvoice\Models\Peppol\PartyType\Party; use InvoiceNinja\EInvoice\Models\Peppol\PriceType\Price; @@ -78,6 +79,12 @@ class Peppol extends AbstractService } + public function toXml(): string + { + $e = new EInvoice(); + return $e->encode($this->p_invoice, 'xml'); + } + public function run() { $this->p_invoice->ID = $this->invoice->number; diff --git a/tests/Integration/Einvoice/Storecove/StorecoveTest.php b/tests/Integration/Einvoice/Storecove/StorecoveTest.php new file mode 100644 index 000000000000..9014662aba8e --- /dev/null +++ b/tests/Integration/Einvoice/Storecove/StorecoveTest.php @@ -0,0 +1,200 @@ +makeTestData(); + + if (config('ninja.testvars.travis') !== false || !config('ninja.storecove_api_key')) + $this->markTestSkipped("do not run in CI"); + } + + public function teseateLegalEntity() + { + + $data = [ + 'acts_as_receiver' => true, + 'acts_as_sender' => true, + 'advertisements' => ['invoice'], + 'city' => $this->company->settings->city, + 'country' => 'DE', + 'county' => $this->company->settings->state, + 'line1' => $this->company->settings->address1, + 'line2' => $this->company->settings->address2, + 'party_name' => $this->company->present()->name(), + 'tax_registered' => true, + 'tenant_id' => $this->company->company_key, + 'zip' => $this->company->settings->postal_code, + ]; + + $sc = new \App\Services\EDocument\Gateway\Storecove\Storecove(); + $r = $sc->createLegalEntity($data, $this->company); + + $this->assertIsArray($r); + + } + + + public function testGetLegalEntity() + { + + + $sc = new \App\Services\EDocument\Gateway\Storecove\Storecove(); + $r = $sc->getLegalEntity(290868); + + $this->assertIsArray($r); + + // nlog($r); + + } + + public function testSendDocument() + { + + $x = ' + 0061 + 2024-07-15 + 380 + + + + Eladio Ullrich I + + + Jasper Brook + Kodychester + 73445-5131 + South Dakota + + AT + + + + Jasper Brook + Kodychester + 73445-5131 + South Dakota + + AT + + + + small@example.com + + + + + + + Beispiel GmbH + + + 45 Hauptstraße + Berlin + 10115 + Berlin + + DE + + + + 45 Hauptstraße + Berlin + 10115 + Berlin + + DE + + + + TTKGjKW9Rv00LEr@example.com + + + + + + 215 + 215 + 215.00 + 215.00 + + + 1 + 1 + 10 + + 0.5 + + 10 + 0.5 + + C62 + 20 + + USt + + + + + + The Pro Plan NO MORE + ee + + + 10 + + + + 2 + 1 + 14 + + The Enterprise Plan + eee + + + 14 + + + + 3 + 1 + 191 + + Soluta provident. + k + + + 191 + + '; + + + $sc = new \App\Services\EDocument\Gateway\Storecove\Storecove(); + $sc->sendDocument($x); + + } + +} From 4b25d7198cad01cfaeb78764972695e28d492e5d Mon Sep 17 00:00:00 2001 From: Lars Kusch Date: Tue, 16 Jul 2024 16:39:52 +0200 Subject: [PATCH 18/45] Minor fixes --- app/Services/EDocument/Standards/ZugferdEDokument.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Services/EDocument/Standards/ZugferdEDokument.php b/app/Services/EDocument/Standards/ZugferdEDokument.php index e650372b98ba..537d39694400 100644 --- a/app/Services/EDocument/Standards/ZugferdEDokument.php +++ b/app/Services/EDocument/Standards/ZugferdEDokument.php @@ -144,7 +144,7 @@ class ZugferdEDokument extends AbstractService foreach ($this->document->line_items as $index => $item) { /** @var InvoiceItem $item **/ $this->xdocument->addNewPosition($index) - ->setDocumentPositionGrossPrice($item->gross_line_total + $item->discount) + ->setDocumentPositionGrossPrice($item->gross_line_total) ->setDocumentPositionNetPrice($item->line_total); if (!empty($item->product_key)) { if (!empty($item->notes)) { From 05019e7575d19a3b7c30e79f8165b5c8555a414a Mon Sep 17 00:00:00 2001 From: David Bomba Date: Wed, 17 Jul 2024 07:31:56 +1000 Subject: [PATCH 19/45] Adjustments for balance check in auto bill --- .../Invoice/InvoiceItemSumInclusive.php | 2 +- .../Stripe/Jobs/PaymentIntentWebhook.php | 9 +++++++ .../EDocument/Gateway/Storecove/Storecove.php | 14 ++++------- app/Services/Invoice/AutoBillInvoice.php | 2 +- .../Einvoice/Storecove/StorecoveTest.php | 24 +++++++++++++++++-- 5 files changed, 38 insertions(+), 13 deletions(-) diff --git a/app/Helpers/Invoice/InvoiceItemSumInclusive.php b/app/Helpers/Invoice/InvoiceItemSumInclusive.php index eacb13afb9e5..da4c3e1f3aa4 100644 --- a/app/Helpers/Invoice/InvoiceItemSumInclusive.php +++ b/app/Helpers/Invoice/InvoiceItemSumInclusive.php @@ -411,7 +411,7 @@ class InvoiceItemSumInclusive $this->rule = new $class(); - if($this->rule->regionWithNoTaxCoverage($this->client->country->iso_3166_2)) { + if($this->rule->regionWithNoTaxCoverage($this->client->country->iso_3166_2 ?? false)) { return $this; } diff --git a/app/PaymentDrivers/Stripe/Jobs/PaymentIntentWebhook.php b/app/PaymentDrivers/Stripe/Jobs/PaymentIntentWebhook.php index 367a99c24206..1cde9a8fffd2 100644 --- a/app/PaymentDrivers/Stripe/Jobs/PaymentIntentWebhook.php +++ b/app/PaymentDrivers/Stripe/Jobs/PaymentIntentWebhook.php @@ -313,4 +313,13 @@ class PaymentIntentWebhook implements ShouldQueue $client->company, ); } + + public function failed($exception = null) + { + if ($exception) { + nlog($exception->getMessage()); + } + + config(['queue.failed.driver' => null]); + } } diff --git a/app/Services/EDocument/Gateway/Storecove/Storecove.php b/app/Services/EDocument/Gateway/Storecove/Storecove.php index 24d677543c58..fa84fbd615bf 100644 --- a/app/Services/EDocument/Gateway/Storecove/Storecove.php +++ b/app/Services/EDocument/Gateway/Storecove/Storecove.php @@ -32,7 +32,7 @@ class Storecove { "network" => "peppol", "metaScheme" => "iso6523-actorid-upis", "scheme" => "de:lwid", - "identifier" => "10101010-STO-10" + "identifier" => "DE:VAT" ]; private array $dbn_discovery = [ @@ -102,18 +102,14 @@ class Storecove { $payload = [ "legalEntityId"=> 290868, - "idempotencyGuid"=> "61b37456-5f9e-4d56-b63b-3b1a23fa5c73", + "idempotencyGuid"=> \Illuminate\Support\Str::uuid(), "routing"=> [ "eIdentifiers" => [ [ - "scheme"=> "DE:LWID", - "id"=> "10101010-STO-10" + "scheme" => "DE:VAT", + "id"=> "DE:VAT" ], - ], - "emails"=> [ - "david@invoiceninja.com" - ], - "eIdentifiers"=> [] + ] ], "document"=> [ 'documentType' => 'invoice', diff --git a/app/Services/Invoice/AutoBillInvoice.php b/app/Services/Invoice/AutoBillInvoice.php index 5e6844fffaad..a9c9f415396d 100644 --- a/app/Services/Invoice/AutoBillInvoice.php +++ b/app/Services/Invoice/AutoBillInvoice.php @@ -62,7 +62,7 @@ class AutoBillInvoice extends AbstractService $this->invoice = $this->invoice->service()->markSent()->save(); /* Mark the invoice as paid if there is no balance */ - if ((int) $this->invoice->balance == 0) { + if (floatval($this->invoice->balance) == 0) { return $this->invoice->service()->markPaid()->save(); } diff --git a/tests/Integration/Einvoice/Storecove/StorecoveTest.php b/tests/Integration/Einvoice/Storecove/StorecoveTest.php index 9014662aba8e..d78c1ed5a4a6 100644 --- a/tests/Integration/Einvoice/Storecove/StorecoveTest.php +++ b/tests/Integration/Einvoice/Storecove/StorecoveTest.php @@ -31,7 +31,7 @@ class StorecoveTest extends TestCase $this->markTestSkipped("do not run in CI"); } - public function teseateLegalEntity() + public function testCreateLegalEntity() { $data = [ @@ -47,6 +47,10 @@ class StorecoveTest extends TestCase 'tax_registered' => true, 'tenant_id' => $this->company->company_key, 'zip' => $this->company->settings->postal_code, + 'peppol_identifiers' => [ + 'scheme' => 'DE:VAT', + 'id' => 'DE:VAT' + ], ]; $sc = new \App\Services\EDocument\Gateway\Storecove\Storecove(); @@ -56,6 +60,22 @@ class StorecoveTest extends TestCase } + // public function testUpdateLegalEntity() + // { + // $data = [ + // 'peppol_identifiers' => [ + // 'scheme' => 'DE:VAT', + // 'id' => 'DE:VAT' + // ], + // ]; + + // $sc = new \App\Services\EDocument\Gateway\Storecove\Storecove(); + // $r = $sc->updateLegalEntity(290868, $data); + + // $this->assertIsArray($r); + // nlog($r); + + // } public function testGetLegalEntity() { @@ -66,7 +86,7 @@ class StorecoveTest extends TestCase $this->assertIsArray($r); - // nlog($r); + nlog($r); } From 79ed0abf6bafa9a8ca11cb200d47b0d1bb50df2b Mon Sep 17 00:00:00 2001 From: David Bomba Date: Wed, 17 Jul 2024 09:18:08 +1000 Subject: [PATCH 20/45] Add dubai timezone --- app/Models/Activity.php | 31 ++++++++++++++++ ...6_231556_2024_07_17_add_dubai_timezone.php | 37 +++++++++++++++++++ database/seeders/ConstantsSeeder.php | 1 + 3 files changed, 69 insertions(+) create mode 100644 database/migrations/2024_07_16_231556_2024_07_17_add_dubai_timezone.php diff --git a/app/Models/Activity.php b/app/Models/Activity.php index 13e52f5619ac..23804b0812f4 100644 --- a/app/Models/Activity.php +++ b/app/Models/Activity.php @@ -449,10 +449,41 @@ class Activity extends StaticModel $replacements['created_at'] = $this->created_at ?? ''; $replacements['ip'] = $this->ip ?? ''; + if($this->activity_type_id == 141) + $replacements = $this->harvestNoteEntities($replacements); + return $replacements; } + private function harvestNoteEntities(array $replacements): array + { + $entities = [ + ':invoice', + ':quote', + ':credit', + ':payment', + ':task', + ':expense', + ':purchase_order', + ':recurring_invoice', + ':recurring_expense', + ':client', + + ]; + + foreach($entities as $entity) + { + $entity_key = substr($entity, 1); + + if($this?->{$entity_key}) + $replacements = array_merge($replacements, $this->matchVar($entity)); + + } + + return $replacements; + } + private function matchVar(string $variable) { $system = ctrans('texts.system'); diff --git a/database/migrations/2024_07_16_231556_2024_07_17_add_dubai_timezone.php b/database/migrations/2024_07_16_231556_2024_07_17_add_dubai_timezone.php new file mode 100644 index 000000000000..6ee5ff904ed0 --- /dev/null +++ b/database/migrations/2024_07_16_231556_2024_07_17_add_dubai_timezone.php @@ -0,0 +1,37 @@ +id = 115; + $t->name = 'Asia/Dubai'; + $t->location = '(GMT+04:00) Dubai'; + $t->utc_offset = 14400; + $t->save(); + + } + + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + // + } +}; diff --git a/database/seeders/ConstantsSeeder.php b/database/seeders/ConstantsSeeder.php index a1e4410367f0..eb5e99cc573b 100644 --- a/database/seeders/ConstantsSeeder.php +++ b/database/seeders/ConstantsSeeder.php @@ -151,6 +151,7 @@ class ConstantsSeeder extends Seeder $timezones[] = ['name'=>'Asia/Magadan', 'location' => '(GMT+12:00) Magadan', 'utc_offset' => 43200]; $timezones[] = ['name'=>'Pacific/Auckland', 'location' => '(GMT+12:00) Auckland', 'utc_offset' => 43200]; $timezones[] = ['name'=>'Pacific/Fiji', 'location' => '(GMT+12:00) Fiji', 'utc_offset' => 43200]; + $timezones[] = ['name' => 'Asia/Dubai', 'location' => '(GMT+04:00) Dubai', 'utc_offset' => 14400]; $x = 1; foreach ($timezones as $timezone) { From ec559ff16e814540f7b921be11de5e0739261559 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Wed, 17 Jul 2024 09:34:10 +1000 Subject: [PATCH 21/45] Minor fixes for tests --- tests/Feature/Export/ArDetailReportTest.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/Feature/Export/ArDetailReportTest.php b/tests/Feature/Export/ArDetailReportTest.php index c623936fb3db..75d6591ed562 100644 --- a/tests/Feature/Export/ArDetailReportTest.php +++ b/tests/Feature/Export/ArDetailReportTest.php @@ -94,7 +94,8 @@ class ArDetailReportTest extends TestCase $settings = CompanySettings::defaults(); $settings->client_online_payment_notification = false; $settings->client_manual_payment_notification = false; - + $settings->currency_id = '1'; + $this->company = Company::factory()->create([ 'account_id' => $this->account->id, 'settings' => $settings, From 19a991e4c3ed8996bfe7777f2d8deb46acd3c841 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Wed, 17 Jul 2024 09:49:28 +1000 Subject: [PATCH 22/45] Fixes for seeder --- ...6_231556_2024_07_17_add_dubai_timezone.php | 2 +- .../Feature/Account/AccountEmailQuotaTest.php | 24 +++++++++++++++---- tests/Feature/Export/ArDetailReportTest.php | 2 +- 3 files changed, 22 insertions(+), 6 deletions(-) diff --git a/database/migrations/2024_07_16_231556_2024_07_17_add_dubai_timezone.php b/database/migrations/2024_07_16_231556_2024_07_17_add_dubai_timezone.php index 6ee5ff904ed0..8b2740484f54 100644 --- a/database/migrations/2024_07_16_231556_2024_07_17_add_dubai_timezone.php +++ b/database/migrations/2024_07_16_231556_2024_07_17_add_dubai_timezone.php @@ -14,7 +14,7 @@ return new class extends Migration { $t = \App\Models\Timezone::find(115); - if(!$t){ + if(!$t && \App\Models\Timezone::count() > 1){ $t = new Timezone(); $t->id = 115; diff --git a/tests/Feature/Account/AccountEmailQuotaTest.php b/tests/Feature/Account/AccountEmailQuotaTest.php index ba44053e19df..3d0c0cfc3968 100644 --- a/tests/Feature/Account/AccountEmailQuotaTest.php +++ b/tests/Feature/Account/AccountEmailQuotaTest.php @@ -12,13 +12,15 @@ namespace Tests\Feature\Account; -use App\DataMapper\ClientRegistrationFields; -use App\DataMapper\CompanySettings; +use Tests\TestCase; +use App\Models\User; +use App\Utils\Ninja; use App\Models\Account; use App\Models\Company; -use App\Utils\Ninja; +use App\DataMapper\CompanySettings; +use App\Factory\CompanyUserFactory; use Illuminate\Support\Facades\Cache; -use Tests\TestCase; +use App\DataMapper\ClientRegistrationFields; class AccountEmailQuotaTest extends TestCase { @@ -50,6 +52,20 @@ class AccountEmailQuotaTest extends TestCase 'account_id' => $account->id, ]); + $hash = \Illuminate\Support\Str::random(32); + + $user = User::factory()->create([ + 'account_id' => $account->id, + 'confirmation_code' => $hash, + 'email' => "{$hash}@example.com", + ]); + + $cu = CompanyUserFactory::create($user->id, $company->id, $account->id); + $cu->is_owner = true; + $cu->is_admin = true; + $cu->is_locked = false; + $cu->save(); + $company->client_registration_fields = ClientRegistrationFields::generate(); $settings = CompanySettings::defaults(); diff --git a/tests/Feature/Export/ArDetailReportTest.php b/tests/Feature/Export/ArDetailReportTest.php index 75d6591ed562..eadc71efd349 100644 --- a/tests/Feature/Export/ArDetailReportTest.php +++ b/tests/Feature/Export/ArDetailReportTest.php @@ -95,7 +95,7 @@ class ArDetailReportTest extends TestCase $settings->client_online_payment_notification = false; $settings->client_manual_payment_notification = false; $settings->currency_id = '1'; - + $this->company = Company::factory()->create([ 'account_id' => $this->account->id, 'settings' => $settings, From 6855be8b347223dc8dd7ce8f31c9631b8f24f1c2 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Wed, 17 Jul 2024 09:54:06 +1000 Subject: [PATCH 23/45] Fixes for tests --- tests/Feature/CompanyGatewayResolutionTest.php | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/tests/Feature/CompanyGatewayResolutionTest.php b/tests/Feature/CompanyGatewayResolutionTest.php index 066fa4d4a118..da682ef38274 100644 --- a/tests/Feature/CompanyGatewayResolutionTest.php +++ b/tests/Feature/CompanyGatewayResolutionTest.php @@ -13,6 +13,7 @@ namespace Tests\Feature; use App\Models\Client; use App\Models\CompanyGateway; +use App\Models\Credit; use App\Models\GatewayType; use App\Utils\Traits\MakesHash; use Illuminate\Database\Eloquent\Model; @@ -128,11 +129,17 @@ class CompanyGatewayResolutionTest extends TestCase $this->client->country_id = 840; $this->client->save(); + Credit::query()->withTrashed()->cursor()->each(function ($c) { + $c->forceDelete(); + }); + $this->assertInstanceOf('\\stdClass', $this->cg->fees_and_limits); // $this->assertObjectHasAttribute('min_limit', $this->cg->fees_and_limits->{1}); $this->assertNotNull($this->cg->fees_and_limits->{1}->min_limit); $payment_methods = $this->client->service()->getPaymentMethods($amount); + nlog($payment_methods); + $this->assertEquals(2, count($payment_methods)); } @@ -143,6 +150,10 @@ class CompanyGatewayResolutionTest extends TestCase CompanyGateway::query()->withTrashed()->cursor()->each(function ($cg) { $cg->forceDelete(); }); + + Credit::query()->withTrashed()->cursor()->each(function ($c) { + $c->forceDelete(); + }); $data = []; $data[1]['min_limit'] = -1; From 42a68979b65d0e69817b06e337542a658b60c60d Mon Sep 17 00:00:00 2001 From: David Bomba Date: Wed, 17 Jul 2024 11:07:29 +1000 Subject: [PATCH 24/45] Add option to attach ubl/einvoice to emails --- app/Mail/TemplateEmail.php | 10 +- app/Services/Email/EmailDefaults.php | 8 +- lang/ar/texts.php | 76 +++++++------- lang/ca/texts.php | 76 +++++++------- lang/de/texts.php | 76 +++++++------- lang/el/texts.php | 76 +++++++------- lang/en/texts.php | 4 +- lang/es/texts.php | 76 +++++++------- lang/es_ES/texts.php | 76 +++++++------- lang/et/texts.php | 76 +++++++------- lang/fr/texts.php | 76 +++++++------- lang/fr_CA/texts.php | 19 +++- lang/fr_CH/texts.php | 138 +++++++++++++------------- lang/he/texts.php | 76 +++++++------- lang/hu/texts.php | 76 +++++++------- lang/it/texts.php | 76 +++++++------- lang/km_KH/texts.php | 76 +++++++------- lang/lo_LA/texts.php | 76 +++++++------- lang/lt/texts.php | 76 +++++++------- lang/nl/texts.php | 76 +++++++------- lang/pl/texts.php | 142 ++++++++++++++------------- lang/pt_BR/texts.php | 76 +++++++------- lang/pt_PT/texts.php | 76 +++++++------- lang/ro/texts.php | 76 +++++++------- lang/sk/texts.php | 76 +++++++------- lang/sr/texts.php | 76 +++++++------- lang/sv/texts.php | 76 +++++++------- lang/zh_TW/texts.php | 76 +++++++------- 28 files changed, 983 insertions(+), 1010 deletions(-) diff --git a/app/Mail/TemplateEmail.php b/app/Mail/TemplateEmail.php index 2eaa14389dae..296142bcb773 100644 --- a/app/Mail/TemplateEmail.php +++ b/app/Mail/TemplateEmail.php @@ -158,7 +158,7 @@ class TemplateEmail extends Mailable return $this; } - if ($this->invitation->invoice && $settings->ubl_email_attachment && $this->company->account->hasFeature(Account::FEATURE_PDF_ATTACHMENT)) { + if ($this->invitation->invoice && $settings->ubl_email_attachment && !$this->invitation->invoice->client->getSetting('enable_e_invoice') && $this->company->account->hasFeature(Account::FEATURE_PDF_ATTACHMENT)) { $ubl_string = (new CreateUbl($this->invitation->invoice))->handle(); if ($ubl_string) { @@ -168,7 +168,7 @@ class TemplateEmail extends Mailable } if ($this->invitation->invoice) { - if ($this->invitation->invoice->client->getSetting('enable_e_invoice') && $this->company->account->hasFeature(Account::FEATURE_PDF_ATTACHMENT)) { + if ($this->invitation->invoice->client->getSetting('enable_e_invoice') && $this->invitation->invoice->client->getSetting('ubl_email_attachment') && $this->company->account->hasFeature(Account::FEATURE_PDF_ATTACHMENT)) { $xml_string = $this->invitation->invoice->service()->getEInvoice($this->invitation->contact); if ($xml_string) { @@ -177,7 +177,7 @@ class TemplateEmail extends Mailable } } elseif ($this->invitation->credit) { - if ($this->invitation->credit->client->getSetting('enable_e_invoice') && $this->company->account->hasFeature(Account::FEATURE_PDF_ATTACHMENT)) { + if ($this->invitation->credit->client->getSetting('enable_e_invoice') && $this->invitation->invoice->client->getSetting('ubl_email_attachment') && $this->company->account->hasFeature(Account::FEATURE_PDF_ATTACHMENT)) { $xml_string = $this->invitation->credit->service()->getECredit($this->invitation->contact); if ($xml_string) { @@ -186,7 +186,7 @@ class TemplateEmail extends Mailable } } elseif ($this->invitation->quote) { - if ($this->invitation->quote->client->getSetting('enable_e_invoice') && $this->company->account->hasFeature(Account::FEATURE_PDF_ATTACHMENT)) { + if ($this->invitation->quote->client->getSetting('enable_e_invoice') && $this->invitation->invoice->client->getSetting('ubl_email_attachment') && $this->company->account->hasFeature(Account::FEATURE_PDF_ATTACHMENT)) { $xml_string = $this->invitation->quote->service()->getEQuote($this->invitation->contact); if ($xml_string) { @@ -195,7 +195,7 @@ class TemplateEmail extends Mailable } } elseif ($this->invitation->purchase_order) { - if ($this->invitation->purchase_order->vendor->getSetting('enable_e_invoice') && $this->company->account->hasFeature(Account::FEATURE_PDF_ATTACHMENT)) { + if ($this->invitation->purchase_order->vendor->getSetting('enable_e_invoice') && $this->invitation->invoice->client->getSetting('ubl_email_attachment') && $this->company->account->hasFeature(Account::FEATURE_PDF_ATTACHMENT)) { $xml_string = $this->invitation->purchase_order->service()->getEPurchaseOrder($this->invitation->contact); if ($xml_string) { diff --git a/app/Services/Email/EmailDefaults.php b/app/Services/Email/EmailDefaults.php index 01ad0c0ae54c..1c27b83ee483 100644 --- a/app/Services/Email/EmailDefaults.php +++ b/app/Services/Email/EmailDefaults.php @@ -318,7 +318,7 @@ class EmailDefaults } /** UBL xml file */ - if ($this->email->email_object->settings->ubl_email_attachment && $this->email->email_object->entity instanceof Invoice) { + if ($this->email->email_object->settings->ubl_email_attachment && !$this->email->email_object->settings->enable_e_invoice && $this->email->email_object->entity instanceof Invoice) { $ubl_string = (new CreateUbl($this->email->email_object->entity))->handle(); if ($ubl_string) { @@ -326,14 +326,14 @@ class EmailDefaults } } /** E-Invoice xml file */ - if ($this->email->email_object->settings->enable_e_invoice) { - if ($this->email_object->settings->e_invoice_attachment ?? true){ + if ($this->email->email_object->settings->enable_e_invoice && $this->email->email_object->settings->enable_e_invoice) { + $xml_string = $this->email->email_object->entity->service()->getEDocument(); if($xml_string) { $this->email->email_object->attachments = array_merge($this->email->email_object->attachments, [['file' => base64_encode($xml_string), 'name' => explode(".", $this->email->email_object->entity->getFileName('xml'))[0]."-e_invoice.xml"]]); } - } + } if (!$this->email->email_object->settings->document_email_attachment || !$this->email->company->account->hasFeature(Account::FEATURE_DOCUMENTS)) { diff --git a/lang/ar/texts.php b/lang/ar/texts.php index b5f08b03cf2c..e408e7a3e73a 100644 --- a/lang/ar/texts.php +++ b/lang/ar/texts.php @@ -2345,7 +2345,7 @@ $lang = array( 'currency_gold_troy_ounce' => 'أونصة تروي ذهبية', 'currency_nicaraguan_córdoba' => 'قرطبة نيكاراغوا', 'currency_malagasy_ariary' => 'أرياري مدغشقر', - "currency_tongan_pa_anga" => "تونجا بانجا", + "currency_tongan_paanga" => "Tongan Pa'anga", 'review_app_help' => 'نأمل أن تستمتع باستخدام التطبيق.
إذا كنت تفكر في :link فإننا نقدر ذلك كثيرًا!', 'writing_a_review' => 'كتابة مراجعة', @@ -2861,19 +2861,6 @@ $lang = array( 'refunded' => 'معاد', 'marked_quote_as_sent' => 'نجح وضع علامة على الاقتباس على أنه تم الإرسال', 'custom_module_settings' => 'إعدادات الوحدة النمطية المخصصة', - 'ticket' => 'تذكرة', - 'tickets' => 'تذاكر', - 'ticket_number' => 'تذكرة #', - 'new_ticket' => 'تذكرة جديدة', - 'edit_ticket' => 'تحرير التذكرة', - 'view_ticket' => 'عرض التذكرة', - 'archive_ticket' => 'أرشفة التذكرة', - 'restore_ticket' => 'استعادة التذكرة', - 'delete_ticket' => 'حذف التذكرة', - 'archived_ticket' => 'تمت أرشفة التذكرة بنجاح', - 'archived_tickets' => 'تم أرشفة التذاكر بنجاح', - 'restored_ticket' => 'تمت استعادة التذكرة بنجاح', - 'deleted_ticket' => 'تم حذف التذكرة بنجاح', 'open' => 'يفتح', 'new' => 'جديد', 'closed' => 'مغلق', @@ -2890,14 +2877,6 @@ $lang = array( 'assigned_to' => 'مخصص ل', 'reply' => 'رد', 'awaiting_reply' => 'في انتظار الرد', - 'ticket_close' => 'إغلاق التذكرة', - 'ticket_reopen' => 'إعادة فتح التذكرة', - 'ticket_open' => 'تذكرة مفتوحة', - 'ticket_split' => 'تقسيم التذكرة', - 'ticket_merge' => 'دمج التذكرة', - 'ticket_update' => 'تحديث التذكرة', - 'ticket_settings' => 'إعدادات التذكرة', - 'updated_ticket' => 'تم تحديث التذكرة', 'mark_spam' => 'علامة كدعاية', 'local_part' => 'الجزء المحلي', 'local_part_unavailable' => 'الاسم مأخوذ', @@ -2915,31 +2894,23 @@ $lang = array( 'mime_types' => 'أنواع التمثيل الصامت', 'mime_types_placeholder' => '.pdf ، .docx ، .jpg', 'mime_types_help' => 'قائمة مفصولة بفواصل لأنواع التمثيل الصامت المسموح بها ، اتركها فارغة للجميع', + 'ticket_number_start_help' => 'Ticket number must be greater than the current ticket number', + 'new_ticket_template_id' => 'New ticket', + 'new_ticket_autoresponder_help' => 'Selecting a template will send an auto response to a client/contact when a new ticket is created', + 'update_ticket_template_id' => 'Updated ticket', + 'update_ticket_autoresponder_help' => 'Selecting a template will send an auto response to a client/contact when a ticket is updated', + 'close_ticket_template_id' => 'Closed ticket', + 'close_ticket_autoresponder_help' => 'Selecting a template will send an auto response to a client/contact when a ticket is closed', 'default_priority' => 'الأولوية الافتراضية', 'alert_new_comment_id' => 'تعليق جديد', - 'alert_comment_ticket_help' => 'سيؤدي تحديد قالب إلى إرسال إشعار (إلى الوكيل) عند إجراء تعليق.', - 'alert_comment_ticket_email_help' => 'رسائل بريد إلكتروني مفصولة بفواصل إلى نسخة مخفية الوجهة عند التعليق الجديد.', - 'new_ticket_notification_list' => 'إخطارات تذكرة جديدة إضافية', 'update_ticket_notification_list' => 'إخطارات تعليق إضافية جديدة', 'comma_separated_values' => 'admin@example.com ، supervisor@example.com', - 'alert_ticket_assign_agent_id' => 'احالة تذكرة', - 'alert_ticket_assign_agent_id_hel' => 'سيؤدي تحديد قالب إلى إرسال إشعار (إلى الوكيل) عند تعيين تذكرة.', - 'alert_ticket_assign_agent_id_notifications' => 'تذكرة إضافية مخصصة الإخطارات', - 'alert_ticket_assign_agent_id_help' => 'رسائل بريد إلكتروني مفصولة بفاصلة إلى نسخة مخفية الوجهة عند تخصيص التذكرة.', - 'alert_ticket_transfer_email_help' => 'رسائل بريد إلكتروني مفصولة بفواصل إلى نسخة مخفية الوجهة عند تحويل التذكرة.', - 'alert_ticket_overdue_agent_id' => 'تأخرت التذكرة', - 'alert_ticket_overdue_email' => 'إشعارات إضافية بشأن التذاكر المتأخرة', - 'alert_ticket_overdue_email_help' => 'رسائل بريد إلكتروني مفصولة بفاصلة لإرسالها إلى نسخة مخفية الوجهة عند التأخر في تقديم التذكرة.', - 'alert_ticket_overdue_agent_id_help' => 'سيؤدي تحديد قالب إلى إرسال إشعار (إلى الوكيل) عندما تصبح التذكرة متأخرة.', 'default_agent' => 'الوكيل الافتراضي', 'default_agent_help' => 'إذا تم تحديده فسيتم تخصيصه تلقائيًا لجميع التذاكر الواردة', 'show_agent_details' => 'إظهار تفاصيل الوكيل في الردود', 'avatar' => 'الصورة الرمزية', 'remove_avatar' => 'إزالة الصورة الرمزية', - 'ticket_not_found' => 'لم يتم العثور على التذكرة', 'add_template' => 'أضف قالبًا', - 'updated_ticket_template' => 'نموذج تذكرة محدث', - 'created_ticket_template' => 'تم إنشاء نموذج تذكرة', 'archive_ticket_template' => 'قالب الأرشيف', 'restore_ticket_template' => 'استعادة النموذج', 'archived_ticket_template' => 'تمت أرشفة النموذج بنجاح', @@ -3796,7 +3767,7 @@ $lang = array( 'entity_number_placeholder' => 'رقم :entity :entity_number', 'email_link_not_working' => 'إذا كان الزر أعلاه لا يعمل من أجلك ، فيرجى النقر فوق الارتباط', 'display_log' => 'عرض السجل', - 'send_fail_logs_to_our_server' => 'إرسال الأخطاء مباشرةً', + 'send_fail_logs_to_our_server' => 'Report errors to help improve the app', 'setup' => 'الإعداد', 'quick_overview_statistics' => 'نظرة عامة وإحصاءات سريعة', 'update_your_personal_info' => 'قم بتحديث معلوماتك الشخصية', @@ -5284,6 +5255,33 @@ $lang = array( 'currency_bhutan_ngultrum' => 'بوتان نغولتروم', 'end_of_month' => 'نهاية الشهر', 'merge_e_invoice_to_pdf' => 'Merge E-Invoice and PDF', + 'task_assigned_subject' => 'New task assignment [Task :task] [ :date ]', + 'task_assigned_body' => 'You have been assigned task :task

Description: :description

Client: :client', + 'activity_141' => 'User :user entered note: :notes', + 'quote_reminder_subject' => 'Reminder: Quote :quote from :company', + 'quote_reminder_message' => 'Reminder for quote :number for :amount', + 'quote_reminder1' => 'First Quote Reminder', + 'before_valid_until_date' => 'Before the valid until date', + 'after_valid_until_date' => 'After the valid until date', + 'after_quote_date' => 'After the quote date', + 'remind_quote' => 'Remind Quote', + 'end_of_month' => 'نهاية الشهر', + 'tax_currency_mismatch' => 'Tax currency is different from invoice currency', + 'edocument_import_already_exists' => 'The invoice has already been imported on :date', + 'before_valid_until' => 'Before the valid until', + 'after_valid_until' => 'After the valid until', + 'task_assigned_notification' => 'Task Assigned Notification', + 'task_assigned_notification_help' => 'Send an email when a task is assigned', + 'invoices_locked_end_of_month' => 'Invoices are locked at the end of the month', + 'referral_url' => 'Referral URL', + 'add_comment' => 'Add Comment', + 'added_comment' => 'Successfully saved comment', + 'tickets' => 'Tickets', + 'assigned_group' => 'Successfully assigned group', + 'merge_to_pdf' => 'Merge to PDF', + 'latest_requires_php_version' => 'Note: the latest version requires PHP :version', + 'auto_expand_product_table_notes' => 'Automatically expand products table notes', + 'auto_expand_product_table_notes_help' => 'Automatically expands the notes section within the products table to display more lines.', ); -return $lang; \ No newline at end of file +return $lang; diff --git a/lang/ca/texts.php b/lang/ca/texts.php index ef7b8ccbb261..2070ff00df5f 100644 --- a/lang/ca/texts.php +++ b/lang/ca/texts.php @@ -2364,7 +2364,7 @@ $lang = array( 'currency_gold_troy_ounce' => 'Unça Troia d'or', 'currency_nicaraguan_córdoba' => 'Còrdova nicaragüenca', 'currency_malagasy_ariary' => 'ariary malgaix', - "currency_tongan_pa_anga" => "Pa'anga de Tonga", + "currency_tongan_paanga" => "Tongan Pa'anga", 'review_app_help' => 'We hope you\'re enjoying using the app.
If you\'d consider :link we\'d greatly appreciate it!', 'writing_a_review' => 'escriu una ressenya', @@ -2880,19 +2880,6 @@ $lang = array( 'refunded' => 'Refunded', 'marked_quote_as_sent' => 'Successfully marked quote as sent', 'custom_module_settings' => 'Custom Module Settings', - 'ticket' => 'Ticket', - 'tickets' => 'Tickets', - 'ticket_number' => 'Ticket #', - 'new_ticket' => 'New Ticket', - 'edit_ticket' => 'Edit Ticket', - 'view_ticket' => 'View Ticket', - 'archive_ticket' => 'Archive Ticket', - 'restore_ticket' => 'Restore Ticket', - 'delete_ticket' => 'Delete Ticket', - 'archived_ticket' => 'Successfully archived ticket', - 'archived_tickets' => 'Successfully archived tickets', - 'restored_ticket' => 'Successfully restored ticket', - 'deleted_ticket' => 'Successfully deleted ticket', 'open' => 'Obre', 'new' => 'Nou', 'closed' => 'Tancat', @@ -2909,14 +2896,6 @@ $lang = array( 'assigned_to' => 'Assignat a', 'reply' => 'Respon', 'awaiting_reply' => 'Awaiting reply', - 'ticket_close' => 'Close Ticket', - 'ticket_reopen' => 'Reopen Ticket', - 'ticket_open' => 'Open Ticket', - 'ticket_split' => 'Split Ticket', - 'ticket_merge' => 'Fusiona tiquets', - 'ticket_update' => 'Actualitza tiquet', - 'ticket_settings' => 'Ticket Settings', - 'updated_ticket' => 'Tiquet actualitzat', 'mark_spam' => 'Marca com a SPAM', 'local_part' => 'Local Part', 'local_part_unavailable' => 'Name taken', @@ -2934,31 +2913,23 @@ $lang = array( 'mime_types' => 'Mime types', 'mime_types_placeholder' => '.pdf , .docx, .jpg', 'mime_types_help' => 'Comma separated list of allowed mime types, leave blank for all', + 'ticket_number_start_help' => 'Ticket number must be greater than the current ticket number', + 'new_ticket_template_id' => 'New ticket', + 'new_ticket_autoresponder_help' => 'Selecting a template will send an auto response to a client/contact when a new ticket is created', + 'update_ticket_template_id' => 'Updated ticket', + 'update_ticket_autoresponder_help' => 'Selecting a template will send an auto response to a client/contact when a ticket is updated', + 'close_ticket_template_id' => 'Closed ticket', + 'close_ticket_autoresponder_help' => 'Selecting a template will send an auto response to a client/contact when a ticket is closed', 'default_priority' => 'Default priority', 'alert_new_comment_id' => 'Nou comentari', - 'alert_comment_ticket_help' => 'Selecting a template will send a notification (to agent) when a comment is made.', - 'alert_comment_ticket_email_help' => 'Comma separated emails to bcc on new comment.', - 'new_ticket_notification_list' => 'Additional new ticket notifications', 'update_ticket_notification_list' => 'Additional new comment notifications', 'comma_separated_values' => 'admin@example.com, supervisor@example.com', - 'alert_ticket_assign_agent_id' => 'Ticket assignment', - 'alert_ticket_assign_agent_id_hel' => 'Selecting a template will send a notification (to agent) when a ticket is assigned.', - 'alert_ticket_assign_agent_id_notifications' => 'Additional ticket assigned notifications', - 'alert_ticket_assign_agent_id_help' => 'Comma separated emails to bcc on ticket assignment.', - 'alert_ticket_transfer_email_help' => 'Comma separated emails to bcc on ticket transfer.', - 'alert_ticket_overdue_agent_id' => 'Tiquet vençut', - 'alert_ticket_overdue_email' => 'Additional overdue ticket notifications', - 'alert_ticket_overdue_email_help' => 'Comma separated emails to bcc on ticket overdue.', - 'alert_ticket_overdue_agent_id_help' => 'Selecting a template will send a notification (to agent) when a ticket becomes overdue.', 'default_agent' => 'Default Agent', 'default_agent_help' => 'If selected will automatically be assigned to all inbound tickets', 'show_agent_details' => 'Show agent details on responses', 'avatar' => 'Avatar', 'remove_avatar' => 'Remove avatar', - 'ticket_not_found' => 'Ticket not found', 'add_template' => 'Add Template', - 'updated_ticket_template' => 'Plantilla de tiquet actualitzada', - 'created_ticket_template' => 'Plantilla de tiquet creada', 'archive_ticket_template' => 'Arxiva plantilla', 'restore_ticket_template' => 'Restaura plantilla', 'archived_ticket_template' => 'Successfully archived template', @@ -3815,7 +3786,7 @@ $lang = array( 'entity_number_placeholder' => ':entity # :entity_number', 'email_link_not_working' => 'If the button above isn\'t working for you, please click on the link', 'display_log' => 'Display Log', - 'send_fail_logs_to_our_server' => 'Report errors in realtime', + 'send_fail_logs_to_our_server' => 'Report errors to help improve the app', 'setup' => 'Setup', 'quick_overview_statistics' => 'Quick overview & statistics', 'update_your_personal_info' => 'Update your personal information', @@ -5303,6 +5274,33 @@ $lang = array( 'currency_bhutan_ngultrum' => 'Bhutan Ngultrum', 'end_of_month' => 'End Of Month', 'merge_e_invoice_to_pdf' => 'Merge E-Invoice and PDF', + 'task_assigned_subject' => 'New task assignment [Task :task] [ :date ]', + 'task_assigned_body' => 'You have been assigned task :task

Description: :description

Client: :client', + 'activity_141' => 'User :user entered note: :notes', + 'quote_reminder_subject' => 'Reminder: Quote :quote from :company', + 'quote_reminder_message' => 'Reminder for quote :number for :amount', + 'quote_reminder1' => 'First Quote Reminder', + 'before_valid_until_date' => 'Before the valid until date', + 'after_valid_until_date' => 'After the valid until date', + 'after_quote_date' => 'After the quote date', + 'remind_quote' => 'Remind Quote', + 'end_of_month' => 'End Of Month', + 'tax_currency_mismatch' => 'Tax currency is different from invoice currency', + 'edocument_import_already_exists' => 'The invoice has already been imported on :date', + 'before_valid_until' => 'Before the valid until', + 'after_valid_until' => 'After the valid until', + 'task_assigned_notification' => 'Task Assigned Notification', + 'task_assigned_notification_help' => 'Send an email when a task is assigned', + 'invoices_locked_end_of_month' => 'Invoices are locked at the end of the month', + 'referral_url' => 'Referral URL', + 'add_comment' => 'Add Comment', + 'added_comment' => 'Successfully saved comment', + 'tickets' => 'Tickets', + 'assigned_group' => 'Successfully assigned group', + 'merge_to_pdf' => 'Merge to PDF', + 'latest_requires_php_version' => 'Note: the latest version requires PHP :version', + 'auto_expand_product_table_notes' => 'Automatically expand products table notes', + 'auto_expand_product_table_notes_help' => 'Automatically expands the notes section within the products table to display more lines.', ); -return $lang; \ No newline at end of file +return $lang; diff --git a/lang/de/texts.php b/lang/de/texts.php index a282945440a5..24d7c12f6cce 100644 --- a/lang/de/texts.php +++ b/lang/de/texts.php @@ -2365,7 +2365,7 @@ Sobald Sie die Beträge erhalten haben, kommen Sie bitte wieder zurück zu diese 'currency_gold_troy_ounce' => 'Goldene Feinunze', 'currency_nicaraguan_córdoba' => 'Nicaraguanischer Córdoba', 'currency_malagasy_ariary' => 'Madagassischer Ariary', - "currency_tongan_pa_anga" => "Tongaischer Paʻanga", + "currency_tongan_paanga" => "Tongan Pa'anga", 'review_app_help' => 'Wir hoffen, dass Ihnen die App gefällt. Wenn Sie :link in Betracht ziehen würden, wären wir Ihnen sehr dankbar!', 'writing_a_review' => 'Schreiben einer Rezension', @@ -2881,19 +2881,6 @@ Sobald Sie die Beträge erhalten haben, kommen Sie bitte wieder zurück zu diese 'refunded' => 'Erstattet', 'marked_quote_as_sent' => 'Angebot erfolgreich als versendet markiert', 'custom_module_settings' => 'Benutzerdefinierte Moduleinstellungen', - 'ticket' => 'Ticket', - 'tickets' => 'Tickets', - 'ticket_number' => 'Ticket #', - 'new_ticket' => 'Neues Ticket', - 'edit_ticket' => 'Ticket bearbeiten', - 'view_ticket' => 'Ticket anzeigen', - 'archive_ticket' => 'Ticket archivieren', - 'restore_ticket' => 'Ticket wieder herstellen', - 'delete_ticket' => 'Ticket löschen', - 'archived_ticket' => 'Ticket erfolgreich archiviert', - 'archived_tickets' => 'Ticket erfolgreich archiviert', - 'restored_ticket' => 'Ticket erfolgreich wieder hergestellt', - 'deleted_ticket' => 'Ticket erfolgreich gelöscht', 'open' => 'Offen', 'new' => 'Neu', 'closed' => 'Geschlossen', @@ -2910,14 +2897,6 @@ Sobald Sie die Beträge erhalten haben, kommen Sie bitte wieder zurück zu diese 'assigned_to' => 'Zugewiesen an', 'reply' => 'Antwort', 'awaiting_reply' => 'Warten auf Antwort', - 'ticket_close' => 'Ticket schließen', - 'ticket_reopen' => 'Ticket wieder öffnen', - 'ticket_open' => 'Ticket öffnen', - 'ticket_split' => 'Ticket teilen', - 'ticket_merge' => 'Ticket zusammenführen', - 'ticket_update' => 'Ticket aktualisieren', - 'ticket_settings' => 'Ticket Einstelungen', - 'updated_ticket' => 'Ticket aktualisiert', 'mark_spam' => 'Als Spam markieren', 'local_part' => 'Lokaler Teil', 'local_part_unavailable' => 'Name übernommen', @@ -2935,31 +2914,23 @@ Sobald Sie die Beträge erhalten haben, kommen Sie bitte wieder zurück zu diese 'mime_types' => 'Mime-Typen', 'mime_types_placeholder' => '.pdf , .docx, .jpg', 'mime_types_help' => 'Kommagetrennte Liste der zulässigen Mime-Typen, leer lassen für alle', + 'ticket_number_start_help' => 'Ticket number must be greater than the current ticket number', + 'new_ticket_template_id' => 'New ticket', + 'new_ticket_autoresponder_help' => 'Selecting a template will send an auto response to a client/contact when a new ticket is created', + 'update_ticket_template_id' => 'Updated ticket', + 'update_ticket_autoresponder_help' => 'Selecting a template will send an auto response to a client/contact when a ticket is updated', + 'close_ticket_template_id' => 'Closed ticket', + 'close_ticket_autoresponder_help' => 'Selecting a template will send an auto response to a client/contact when a ticket is closed', 'default_priority' => 'Standardpriorität', 'alert_new_comment_id' => 'Neuer Kommentar', - 'alert_comment_ticket_help' => 'Die Auswahl einer Vorlage sendet eine Benachrichtigung (an den Agenten), wenn ein Kommentar abgegeben wird.', - 'alert_comment_ticket_email_help' => 'Komma getrennte E-Mails an bcc bei neuem Kommentar.', - 'new_ticket_notification_list' => 'Zusätzliche neue Ticket-Benachrichtigungen', 'update_ticket_notification_list' => 'Zusätzliche Benachrichtigungen über neue Kommentare', 'comma_separated_values' => 'admin@example.com, supervisor@example.com', - 'alert_ticket_assign_agent_id' => 'Ticketzuweisung', - 'alert_ticket_assign_agent_id_hel' => 'Die Auswahl einer Vorlage sendet eine Benachrichtigung (an den Agenten), wenn ein Ticket zugewiesen wird.', - 'alert_ticket_assign_agent_id_notifications' => 'Zusätzliche Ticketbenachrichtigungen', - 'alert_ticket_assign_agent_id_help' => 'Komma getrennte E-Mails an bcc bei der Ticketvergabe.', - 'alert_ticket_transfer_email_help' => 'Komma getrennte E-Mails an bcc bei der Ticketübertragung.', - 'alert_ticket_overdue_agent_id' => 'Ticket überfällig', - 'alert_ticket_overdue_email' => 'Zusätzliche überfällige Ticket-Benachrichtigungen', - 'alert_ticket_overdue_email_help' => 'Komma getrennte E-Mails an bcc bei überfälligem Ticket.', - 'alert_ticket_overdue_agent_id_help' => 'Die Auswahl einer Vorlage sendet eine Benachrichtigung (an den Agenten), wenn ein Ticket überfällig wird.', 'default_agent' => 'Standard-Agent', 'default_agent_help' => 'Wenn ausgewählt, wird er automatisch allen eingehenden Tickets zugeordnet.', 'show_agent_details' => 'Zeigen Sie Agentendetails in den Antworten an', 'avatar' => 'Profilbild', 'remove_avatar' => 'Profilbild entfernen', - 'ticket_not_found' => 'Ticket nicht gefunden', 'add_template' => 'Vorlage hinzufügen', - 'updated_ticket_template' => 'Ticket Vorlage aktualisiert', - 'created_ticket_template' => 'Ticket Vorlage erstellt', 'archive_ticket_template' => 'Vorlage archiviert', 'restore_ticket_template' => 'Vorlage wieder herstellen', 'archived_ticket_template' => 'Vorlage erfolgreich archiviert', @@ -3817,7 +3788,7 @@ https://invoiceninja.github.io/docs/migration/#troubleshooting', 'entity_number_placeholder' => ':entity # :entity_number', 'email_link_not_working' => 'Wenn die Schaltfläche oben nicht funktioniert, klicken Sie bitte auf den Link', 'display_log' => 'Log anzeigen', - 'send_fail_logs_to_our_server' => 'Fehler in Echtzeit melden', + 'send_fail_logs_to_our_server' => 'Report errors to help improve the app', 'setup' => 'Setup', 'quick_overview_statistics' => 'Schnellüberblick & Statistiken', 'update_your_personal_info' => 'Aktualisieren Sie Ihre Profil', @@ -5307,6 +5278,33 @@ Leistungsempfängers', 'currency_bhutan_ngultrum' => 'Bhutan Ngultrum', 'end_of_month' => 'End Of Month', 'merge_e_invoice_to_pdf' => 'Merge E-Invoice and PDF', + 'task_assigned_subject' => 'New task assignment [Task :task] [ :date ]', + 'task_assigned_body' => 'You have been assigned task :task

Description: :description

Client: :client', + 'activity_141' => 'User :user entered note: :notes', + 'quote_reminder_subject' => 'Reminder: Quote :quote from :company', + 'quote_reminder_message' => 'Reminder for quote :number for :amount', + 'quote_reminder1' => 'First Quote Reminder', + 'before_valid_until_date' => 'Before the valid until date', + 'after_valid_until_date' => 'After the valid until date', + 'after_quote_date' => 'After the quote date', + 'remind_quote' => 'Remind Quote', + 'end_of_month' => 'End Of Month', + 'tax_currency_mismatch' => 'Tax currency is different from invoice currency', + 'edocument_import_already_exists' => 'The invoice has already been imported on :date', + 'before_valid_until' => 'Before the valid until', + 'after_valid_until' => 'After the valid until', + 'task_assigned_notification' => 'Task Assigned Notification', + 'task_assigned_notification_help' => 'Send an email when a task is assigned', + 'invoices_locked_end_of_month' => 'Invoices are locked at the end of the month', + 'referral_url' => 'Referral URL', + 'add_comment' => 'Add Comment', + 'added_comment' => 'Successfully saved comment', + 'tickets' => 'Tickets', + 'assigned_group' => 'Successfully assigned group', + 'merge_to_pdf' => 'Merge to PDF', + 'latest_requires_php_version' => 'Note: the latest version requires PHP :version', + 'auto_expand_product_table_notes' => 'Automatically expand products table notes', + 'auto_expand_product_table_notes_help' => 'Automatically expands the notes section within the products table to display more lines.', ); -return $lang; \ No newline at end of file +return $lang; diff --git a/lang/el/texts.php b/lang/el/texts.php index 9dde6b9dafd8..1428401d8a29 100644 --- a/lang/el/texts.php +++ b/lang/el/texts.php @@ -2364,7 +2364,7 @@ $lang = array( 'currency_gold_troy_ounce' => 'Gold Troy Ounce', 'currency_nicaraguan_córdoba' => 'Nicaraguan Córdoba', 'currency_malagasy_ariary' => 'Malagasy ariary', - "currency_tongan_pa_anga" => "Tongan Pa'anga", + "currency_tongan_paanga" => "Tongan Pa'anga", 'review_app_help' => 'Ελπίζουμε να απολαμβάνετε τη χρήση της εφαρμογής.
Εάν θα θέλατε να γράψετε μια κριτική :link θα το εκτιμούσαμε ιδιαίτερα!', 'writing_a_review' => 'συγγραφή κριτικής', @@ -2880,19 +2880,6 @@ $lang = array( 'refunded' => 'Επιστροφή χρημάτων', 'marked_quote_as_sent' => 'Επιτυχής ορισμός προσφοράς ως απεσταλμένη', 'custom_module_settings' => 'Ρυθμίσεις Προσαρμοσμένης Μονάδας', - 'ticket' => 'Αίτημα υποστήριξης', - 'tickets' => 'Αιτήματα υποστήριξης', - 'ticket_number' => 'Αίτημα υποστήριξης #', - 'new_ticket' => 'Νέο Αίτημα υποστήριξης', - 'edit_ticket' => 'Επεξεργασία Αιτήματος υποστήριξης', - 'view_ticket' => 'Προβολή Αιτήματος υποστήριξης', - 'archive_ticket' => 'Αρχειοθέτηση Αιτήματος υποστήριξης', - 'restore_ticket' => 'Ανάκτηση Αιτήματος υποστήριξης', - 'delete_ticket' => 'Διαγραφή Αιτήματος υποστήριξης', - 'archived_ticket' => 'Επιτυχής αρχειοθέτηση αιτήματος υποστήριξης', - 'archived_tickets' => 'Επιτυχής αρχειοθέτηση αιτήματος υποστήριξης', - 'restored_ticket' => 'Επιτυχής ανάκτηση αιτήματος υποστήριξης', - 'deleted_ticket' => 'Επιτυχής διαγραφή αιτήματος υποστήριξης', 'open' => 'Ανοιχτό', 'new' => 'Νέο', 'closed' => 'Κλειστό', @@ -2909,14 +2896,6 @@ $lang = array( 'assigned_to' => 'Ανατέθηκε σε', 'reply' => 'Απάντηση', 'awaiting_reply' => 'Αναμονή απάντησης', - 'ticket_close' => 'Κλείσιμο Αιτήματος υποστήριξης', - 'ticket_reopen' => 'Επανάνοιγμα Αιτήματος υποστήριξης', - 'ticket_open' => 'Άνοιγμα Αιτήματος υποστήριξης', - 'ticket_split' => 'Διχοτόμηση Αιτήματος υποστήριξης', - 'ticket_merge' => 'Συνένωση Αιτήματος υποστήριξης', - 'ticket_update' => 'Ενημέρωση Αιτήματος υποστήριξης', - 'ticket_settings' => 'Ρυθμίσεις Αιτήματος υποστήριξης', - 'updated_ticket' => 'Ενημερώθηκε το Αίτημα υποστήριξης', 'mark_spam' => 'Σήμανση ως ανεπιθύμητο', 'local_part' => 'Τοπικό Τμήμα', 'local_part_unavailable' => 'Το όνομα είναι δεσμευμένο', @@ -2934,31 +2913,23 @@ $lang = array( 'mime_types' => 'Τύποι αρχείων', 'mime_types_placeholder' => '.pdf , .docx, .jpg', 'mime_types_help' => 'Λίστα χωριζόμενων με κόμμα τύπων αρχείων, αφήστε το κενό για όλους', + 'ticket_number_start_help' => 'Ticket number must be greater than the current ticket number', + 'new_ticket_template_id' => 'New ticket', + 'new_ticket_autoresponder_help' => 'Selecting a template will send an auto response to a client/contact when a new ticket is created', + 'update_ticket_template_id' => 'Updated ticket', + 'update_ticket_autoresponder_help' => 'Selecting a template will send an auto response to a client/contact when a ticket is updated', + 'close_ticket_template_id' => 'Closed ticket', + 'close_ticket_autoresponder_help' => 'Selecting a template will send an auto response to a client/contact when a ticket is closed', 'default_priority' => 'Προεπιλεγμένη προτεραιότητα', 'alert_new_comment_id' => 'Νέο σχόλιο', - 'alert_comment_ticket_help' => 'Η επιλογή ενός προτύπου θα στείλει μία ειδοποίηση (στον εκπρόσωπο) όταν προστεθεί ένα σχόλιο.', - 'alert_comment_ticket_email_help' => 'Διαχωρίστε με κόμμα τα emails για να σταλεί μια κρυφή κοινοποίηση σε κάθε νέο σχόλιο', - 'new_ticket_notification_list' => 'Επιπλέον ειδοποιήσεις νέου αιτήματος υποστήριξης', 'update_ticket_notification_list' => 'Επιπλέον ειδοποιήσεις νέου σχολίου', 'comma_separated_values' => 'admin@example.com, supervisor@example.com', - 'alert_ticket_assign_agent_id' => 'Ανάθεση αιτήματος υποστήριξης', - 'alert_ticket_assign_agent_id_hel' => 'Η επιλογή ενός προτύπου θα στείλει μία ειδοποίηση (στον εκπρόσωπο) όταν ανατεθεί ένα αίτημα υποστήριξης.', - 'alert_ticket_assign_agent_id_notifications' => 'Επιπλέον ειδοποιήσεις ανάθεσης αιτήματος υποστήριξης', - 'alert_ticket_assign_agent_id_help' => 'Διαχωρίστε με κόμμα τα emails για να σταλεί μια κρυφή κοινοποίηση όταν ανατεθεί το αίτημα υποστήριξης', - 'alert_ticket_transfer_email_help' => 'Διαχωρίστε με κόμμα τα emails για να σταλεί μια κρυφή κοινοποίηση όταν μεταφερθεί το αίτημα υποστήριξης', - 'alert_ticket_overdue_agent_id' => 'Αίτημα υποστήριξης σε καθυστέρηση', - 'alert_ticket_overdue_email' => 'Επιπλέον ειδοποιήσεις καθυστερούμενου αιτήματος υποστήριξης', - 'alert_ticket_overdue_email_help' => 'Διαχωρίστε με κόμμα τα emails για να σταλεί μια κρυφή κοινοποίηση όταν το αίτημα υποστήριξης τεθεί σε καθυστέρηση', - 'alert_ticket_overdue_agent_id_help' => 'Η επιλογή ενός προτύπου θα στείλει μία ειδοποίηση (στον εκπρόσωπο) όταν ένα αίτημα υποστήριξης γίνει εκπρόθεσμο.', 'default_agent' => 'Προεπιλεγμένος Εκπρόσωπος', 'default_agent_help' => 'Εάν επιλεγεί θα του ανατεθούν όλα τα εισερχόμενα αιτήματα υποστήριξης', 'show_agent_details' => 'Εμφάνιση λεπτομερειών εκπροσώπου στις απαντήσεις', 'avatar' => 'Avatar', 'remove_avatar' => 'Διαγραφή avatar', - 'ticket_not_found' => 'Δεν βρέθηκε το αίτημα υποστήριξης', 'add_template' => 'Προσθήκη Προτύπου', - 'updated_ticket_template' => 'Ενημερώθηκε το πρότυπο αιτήματος υποστήριξης', - 'created_ticket_template' => 'Δημιουργήθηκε το πρότυπο αιτήματος υποστήριξης', 'archive_ticket_template' => 'Αρχειοθέτηση Προτύπου', 'restore_ticket_template' => 'Ανάκτηση Προτύπου', 'archived_ticket_template' => 'Επιτυχής αρχειοθέτηση προτύπου', @@ -3815,7 +3786,7 @@ $lang = array( 'entity_number_placeholder' => ':entity # :entity_number', 'email_link_not_working' => 'If the button above isn\'t working for you, please click on the link', 'display_log' => 'Εμφάνιση αρχείου καταγραφής', - 'send_fail_logs_to_our_server' => 'Αναφορά σφαλμάτων σε πραγματικό χρόνο', + 'send_fail_logs_to_our_server' => 'Report errors to help improve the app', 'setup' => 'Καθορισμός', 'quick_overview_statistics' => 'Quick overview & statistics', 'update_your_personal_info' => 'Επικαιροποίησε τις προσωπικές σου πληροφορίες', @@ -5303,6 +5274,33 @@ $lang = array( 'currency_bhutan_ngultrum' => 'Bhutan Ngultrum', 'end_of_month' => 'End Of Month', 'merge_e_invoice_to_pdf' => 'Merge E-Invoice and PDF', + 'task_assigned_subject' => 'New task assignment [Task :task] [ :date ]', + 'task_assigned_body' => 'You have been assigned task :task

Description: :description

Client: :client', + 'activity_141' => 'User :user entered note: :notes', + 'quote_reminder_subject' => 'Reminder: Quote :quote from :company', + 'quote_reminder_message' => 'Reminder for quote :number for :amount', + 'quote_reminder1' => 'First Quote Reminder', + 'before_valid_until_date' => 'Before the valid until date', + 'after_valid_until_date' => 'After the valid until date', + 'after_quote_date' => 'After the quote date', + 'remind_quote' => 'Remind Quote', + 'end_of_month' => 'End Of Month', + 'tax_currency_mismatch' => 'Tax currency is different from invoice currency', + 'edocument_import_already_exists' => 'The invoice has already been imported on :date', + 'before_valid_until' => 'Before the valid until', + 'after_valid_until' => 'After the valid until', + 'task_assigned_notification' => 'Task Assigned Notification', + 'task_assigned_notification_help' => 'Send an email when a task is assigned', + 'invoices_locked_end_of_month' => 'Invoices are locked at the end of the month', + 'referral_url' => 'Referral URL', + 'add_comment' => 'Add Comment', + 'added_comment' => 'Successfully saved comment', + 'tickets' => 'Tickets', + 'assigned_group' => 'Successfully assigned group', + 'merge_to_pdf' => 'Merge to PDF', + 'latest_requires_php_version' => 'Note: the latest version requires PHP :version', + 'auto_expand_product_table_notes' => 'Automatically expand products table notes', + 'auto_expand_product_table_notes_help' => 'Automatically expands the notes section within the products table to display more lines.', ); -return $lang; \ No newline at end of file +return $lang; diff --git a/lang/en/texts.php b/lang/en/texts.php index ce61a4667396..fbfdef2e6177 100644 --- a/lang/en/texts.php +++ b/lang/en/texts.php @@ -1099,7 +1099,7 @@ $lang = array( 'invoice_embed_documents' => 'Embed Documents', 'invoice_embed_documents_help' => 'Include attached images in the invoice.', 'document_email_attachment' => 'Attach Documents', - 'ubl_email_attachment' => 'Attach UBL', + 'ubl_email_attachment' => 'Attach UBL/E-Invoice', 'download_documents' => 'Download Documents (:size)', 'documents_from_expenses' => 'From Expenses:', 'dropzone_default_message' => 'Drop files or click to upload', @@ -3045,7 +3045,7 @@ $lang = array( 'portal_mode' => 'Portal Mode', 'attach_pdf' => 'Attach PDF', 'attach_documents' => 'Attach Documents', - 'attach_ubl' => 'Attach UBL', + 'attach_ubl' => 'Attach UBL/E-Invoice', 'email_style' => 'Email Style', 'processed' => 'Processed', 'fee_amount' => 'Fee Amount', diff --git a/lang/es/texts.php b/lang/es/texts.php index ad5fccf156b8..dc184ceb4063 100644 --- a/lang/es/texts.php +++ b/lang/es/texts.php @@ -2363,7 +2363,7 @@ $lang = array( 'currency_gold_troy_ounce' => 'Onza troy de oro', 'currency_nicaraguan_córdoba' => 'Córdoba nicaragüense', 'currency_malagasy_ariary' => 'ariary malgache', - "currency_tongan_pa_anga" => "Pa'anga tongano", + "currency_tongan_paanga" => "Tongan Pa'anga", 'review_app_help' => 'Esperamos que estés disfrutando de usar la aplicación.
Si consideras :link lo apreciaremos mucho!', 'writing_a_review' => 'escribiendo una reseña', @@ -2879,19 +2879,6 @@ $lang = array( 'refunded' => 'Reintegrado', 'marked_quote_as_sent' => 'Presupuesto marcado correctamente como enviado', 'custom_module_settings' => 'Configuración del módulo personalizado', - 'ticket' => 'Boleto', - 'tickets' => 'Entradas', - 'ticket_number' => 'Boleto #', - 'new_ticket' => 'Nuevo boleto', - 'edit_ticket' => 'Editar boleto', - 'view_ticket' => 'Ver boleto', - 'archive_ticket' => 'Boleto de archivo', - 'restore_ticket' => 'Restaurar boleto', - 'delete_ticket' => 'Eliminar boleto', - 'archived_ticket' => 'Ticket archivado con éxito', - 'archived_tickets' => 'Tickets archivados con éxito', - 'restored_ticket' => 'Boleto restaurado con éxito', - 'deleted_ticket' => 'Boleto eliminado con éxito', 'open' => 'Abierto', 'new' => 'Nuevo', 'closed' => 'Cerrado', @@ -2908,14 +2895,6 @@ $lang = array( 'assigned_to' => 'Asignado a', 'reply' => 'Responder', 'awaiting_reply' => 'Esperando respuesta', - 'ticket_close' => 'Cerrar ticket', - 'ticket_reopen' => 'Boleto de reapertura', - 'ticket_open' => 'Boleto abierto', - 'ticket_split' => 'Boleto dividido', - 'ticket_merge' => 'Boleto de combinación', - 'ticket_update' => 'Actualizar ticket', - 'ticket_settings' => 'Configuración de boletos', - 'updated_ticket' => 'Boleto actualizado', 'mark_spam' => 'Marcar como correo no deseado', 'local_part' => 'Parte local', 'local_part_unavailable' => 'Nombre tomado', @@ -2933,31 +2912,23 @@ $lang = array( 'mime_types' => 'Tipos de mimo', 'mime_types_placeholder' => '.pdf, .docx, .jpg', 'mime_types_help' => 'Lista separada por comas de tipos MIME permitidos, déjela en blanco para todos', + 'ticket_number_start_help' => 'Ticket number must be greater than the current ticket number', + 'new_ticket_template_id' => 'New ticket', + 'new_ticket_autoresponder_help' => 'Selecting a template will send an auto response to a client/contact when a new ticket is created', + 'update_ticket_template_id' => 'Updated ticket', + 'update_ticket_autoresponder_help' => 'Selecting a template will send an auto response to a client/contact when a ticket is updated', + 'close_ticket_template_id' => 'Closed ticket', + 'close_ticket_autoresponder_help' => 'Selecting a template will send an auto response to a client/contact when a ticket is closed', 'default_priority' => 'Prioridad predeterminada', 'alert_new_comment_id' => 'Nuevo comentario', - 'alert_comment_ticket_help' => 'Al seleccionar una plantilla, se enviará una notificación (al agente) cuando se realice un comentario.', - 'alert_comment_ticket_email_help' => 'Correos electrónicos separados por comas a BCC en un nuevo comentario.', - 'new_ticket_notification_list' => 'Notificaciones adicionales de nuevos boletos', 'update_ticket_notification_list' => 'Notificaciones adicionales de nuevos comentarios', 'comma_separated_values' => 'admin@ejemplo.com, supervisor@ejemplo.com', - 'alert_ticket_assign_agent_id' => 'Asignación de entradas', - 'alert_ticket_assign_agent_id_hel' => 'Al seleccionar una plantilla, se enviará una notificación (al agente) cuando se asigne un ticket.', - 'alert_ticket_assign_agent_id_notifications' => 'Notificaciones adicionales de boletos asignados', - 'alert_ticket_assign_agent_id_help' => 'Correos electrónicos separados por comas a BCC en la asignación de tickets.', - 'alert_ticket_transfer_email_help' => 'Correos electrónicos separados por comas a BCC en la transferencia de boletos.', - 'alert_ticket_overdue_agent_id' => 'Boleto vencido', - 'alert_ticket_overdue_email' => 'Notificaciones adicionales de boletos vencidos', - 'alert_ticket_overdue_email_help' => 'Correos electrónicos separados por comas a BCC en ticket vencido.', - 'alert_ticket_overdue_agent_id_help' => 'Al seleccionar una plantilla, se enviará una notificación (al agente) cuando venza un ticket.', 'default_agent' => 'Agente predeterminado', 'default_agent_help' => 'Si se selecciona, se asignará automáticamente a todos los boletos entrantes', 'show_agent_details' => 'Mostrar detalles del agente en las respuestas', 'avatar' => 'Avatar', 'remove_avatar' => 'Quitar avatar', - 'ticket_not_found' => 'Boleto no encontrado', 'add_template' => 'Agregar plantilla', - 'updated_ticket_template' => 'Plantilla de ticket actualizada', - 'created_ticket_template' => 'Plantilla de ticket creada', 'archive_ticket_template' => 'Plantilla de archivo', 'restore_ticket_template' => 'Plantilla de restauración', 'archived_ticket_template' => 'Plantilla archivada correctamente', @@ -3814,7 +3785,7 @@ $lang = array( 'entity_number_placeholder' => ':entity # :entity_número', 'email_link_not_working' => 'Si el botón de arriba no funciona para usted, por favor haga clic en el enlace', 'display_log' => 'Mostrar registro', - 'send_fail_logs_to_our_server' => 'Reportar errores en tiempo real', + 'send_fail_logs_to_our_server' => 'Report errors to help improve the app', 'setup' => 'Configuración', 'quick_overview_statistics' => 'Resumen rápido y estadísticas', 'update_your_personal_info' => 'Actualice su información personal', @@ -5302,6 +5273,33 @@ $lang = array( 'currency_bhutan_ngultrum' => 'Bhutan Ngultrum', 'end_of_month' => 'End Of Month', 'merge_e_invoice_to_pdf' => 'Merge E-Invoice and PDF', + 'task_assigned_subject' => 'New task assignment [Task :task] [ :date ]', + 'task_assigned_body' => 'You have been assigned task :task

Description: :description

Client: :client', + 'activity_141' => 'User :user entered note: :notes', + 'quote_reminder_subject' => 'Reminder: Quote :quote from :company', + 'quote_reminder_message' => 'Reminder for quote :number for :amount', + 'quote_reminder1' => 'First Quote Reminder', + 'before_valid_until_date' => 'Before the valid until date', + 'after_valid_until_date' => 'After the valid until date', + 'after_quote_date' => 'After the quote date', + 'remind_quote' => 'Remind Quote', + 'end_of_month' => 'End Of Month', + 'tax_currency_mismatch' => 'Tax currency is different from invoice currency', + 'edocument_import_already_exists' => 'The invoice has already been imported on :date', + 'before_valid_until' => 'Before the valid until', + 'after_valid_until' => 'After the valid until', + 'task_assigned_notification' => 'Task Assigned Notification', + 'task_assigned_notification_help' => 'Send an email when a task is assigned', + 'invoices_locked_end_of_month' => 'Invoices are locked at the end of the month', + 'referral_url' => 'Referral URL', + 'add_comment' => 'Add Comment', + 'added_comment' => 'Successfully saved comment', + 'tickets' => 'Tickets', + 'assigned_group' => 'Successfully assigned group', + 'merge_to_pdf' => 'Merge to PDF', + 'latest_requires_php_version' => 'Note: the latest version requires PHP :version', + 'auto_expand_product_table_notes' => 'Automatically expand products table notes', + 'auto_expand_product_table_notes_help' => 'Automatically expands the notes section within the products table to display more lines.', ); -return $lang; \ No newline at end of file +return $lang; diff --git a/lang/es_ES/texts.php b/lang/es_ES/texts.php index ea9cba5585dd..ee6a8d5362e8 100644 --- a/lang/es_ES/texts.php +++ b/lang/es_ES/texts.php @@ -2360,7 +2360,7 @@ Una vez que tenga los montos, vuelva a esta página de métodos de pago y haga c 'currency_gold_troy_ounce' => 'Onza troy de oro', 'currency_nicaraguan_córdoba' => 'Córdoba nicaragüense', 'currency_malagasy_ariary' => 'Ariary malgache', - "currency_tongan_pa_anga" => "Pa'anga tongano", + "currency_tongan_paanga" => "Tongan Pa'anga", 'review_app_help' => 'Esperamos que estés disfrutando con la app.
Si consideras :link ¡te lo agraderemos enormemente!', 'writing_a_review' => 'escribir una reseña', @@ -2876,19 +2876,6 @@ Una vez que tenga los montos, vuelva a esta página de métodos de pago y haga c 'refunded' => 'Reembolsado', 'marked_quote_as_sent' => 'Presupuesto marcado como enviado correctamente', 'custom_module_settings' => 'Opciones del Módulo Personalizado', - 'ticket' => 'Ticket', - 'tickets' => 'Tickets', - 'ticket_number' => 'N. Ticket', - 'new_ticket' => 'Nuevo Ticket', - 'edit_ticket' => 'Editar Ticket', - 'view_ticket' => 'Ver Ticket', - 'archive_ticket' => 'Archivar Ticket', - 'restore_ticket' => 'Restaurar Ticket', - 'delete_ticket' => 'Eliminar Ticket', - 'archived_ticket' => 'Ticket archivado correctamente', - 'archived_tickets' => 'Tickets archivados correctamente', - 'restored_ticket' => 'Ticket restaurado correctamente', - 'deleted_ticket' => 'Ticket eliminado correctamente', 'open' => 'Abrir', 'new' => 'Nuevo', 'closed' => 'Cerrado', @@ -2905,14 +2892,6 @@ Una vez que tenga los montos, vuelva a esta página de métodos de pago y haga c 'assigned_to' => 'Asignado a', 'reply' => 'Responder', 'awaiting_reply' => 'Esperando respuesta', - 'ticket_close' => 'Cerrar Ticket', - 'ticket_reopen' => 'Reabrir Ticket', - 'ticket_open' => 'Abrir Ticket', - 'ticket_split' => 'Dividir Ticket', - 'ticket_merge' => 'Unir Ticket', - 'ticket_update' => 'Actualizar Ticket', - 'ticket_settings' => 'Opciones de Ticket', - 'updated_ticket' => 'Ticket Actualizado', 'mark_spam' => 'Marcar como Spam', 'local_part' => 'Parte Local', 'local_part_unavailable' => 'Nombre asignado', @@ -2930,31 +2909,23 @@ Una vez que tenga los montos, vuelva a esta página de métodos de pago y haga c 'mime_types' => 'Tipos de ficheros', 'mime_types_placeholder' => '.pdf , .docx, .jpg', 'mime_types_help' => 'Lista separada por comas de los tipos mime de fichero aceptados, déjalo en blanco para todos', + 'ticket_number_start_help' => 'Ticket number must be greater than the current ticket number', + 'new_ticket_template_id' => 'New ticket', + 'new_ticket_autoresponder_help' => 'Selecting a template will send an auto response to a client/contact when a new ticket is created', + 'update_ticket_template_id' => 'Updated ticket', + 'update_ticket_autoresponder_help' => 'Selecting a template will send an auto response to a client/contact when a ticket is updated', + 'close_ticket_template_id' => 'Closed ticket', + 'close_ticket_autoresponder_help' => 'Selecting a template will send an auto response to a client/contact when a ticket is closed', 'default_priority' => 'Prioridad por defecto', 'alert_new_comment_id' => 'Nuevo comentario', - 'alert_comment_ticket_help' => 'Seleccionando una plantilla enviará una notificación (a un agente) cuando se haga un comentario.', - 'alert_comment_ticket_email_help' => 'Lista de emails separados por coma en el campo BCC en un nuevo comentario.', - 'new_ticket_notification_list' => 'Notificaciones de nuevo ticket adicionales', 'update_ticket_notification_list' => 'Notificaciones de nuevo comentario adicionales', 'comma_separated_values' => 'admin@example.com, supervisor@example.com', - 'alert_ticket_assign_agent_id' => 'Asignación de ticket', - 'alert_ticket_assign_agent_id_hel' => 'Seleccionando una plantilla enviará una notificación (a un agente) cuando un ticket sea asignado.', - 'alert_ticket_assign_agent_id_notifications' => 'Notificaciones de ticket asignado adicionales', - 'alert_ticket_assign_agent_id_help' => 'Lista de emails separados por coma en el campo BCC en la asignación de ticket.', - 'alert_ticket_transfer_email_help' => 'Lista de emails separados por coma en el campo BCC en la transferencia de ticket.', - 'alert_ticket_overdue_agent_id' => 'Ticket vencido', - 'alert_ticket_overdue_email' => 'Notificaciones de ticket vencido adicionales', - 'alert_ticket_overdue_email_help' => 'Lista de emails separados por coma en el campo BCC en el vencimiento de ticket.', - 'alert_ticket_overdue_agent_id_help' => 'Seleccionando una plantilla enviará una notificación (a un agente) cuando un ticket llegue a la fecha de vencimiento.', 'default_agent' => 'Agente por Defecto', 'default_agent_help' => 'Si se selecciona, será asignado automáticamente en todos los tickets de entrada', 'show_agent_details' => 'Mostrar los detalles del agente en las respuestas', 'avatar' => 'Avatar', 'remove_avatar' => 'Eliminar avatar', - 'ticket_not_found' => 'Ticket no encontrado', 'add_template' => 'Añadir Plantila', - 'updated_ticket_template' => 'Plantilla de Ticket Actualizada', - 'created_ticket_template' => 'Plantilla de Ticket Creada', 'archive_ticket_template' => 'Archivar Plantilla', 'restore_ticket_template' => 'Restaurar Plantilla', 'archived_ticket_template' => 'Plantilla archivada correctamente', @@ -3811,7 +3782,7 @@ Una vez que tenga los montos, vuelva a esta página de métodos de pago y haga c 'entity_number_placeholder' => ':entity # :entity_number', 'email_link_not_working' => 'Si el botón de arriba no te está funcionando, por favor pulsa en el enlace', 'display_log' => 'Mostrar Registro', - 'send_fail_logs_to_our_server' => 'Reportar errores en tiempo real', + 'send_fail_logs_to_our_server' => 'Report errors to help improve the app', 'setup' => 'Instalación', 'quick_overview_statistics' => 'Vistazo rápido y estadísticas', 'update_your_personal_info' => 'Actualiza tu información personal', @@ -5300,6 +5271,33 @@ De lo contrario, este campo deberá dejarse en blanco.', 'currency_bhutan_ngultrum' => 'Bhutan Ngultrum', 'end_of_month' => 'End Of Month', 'merge_e_invoice_to_pdf' => 'Merge E-Invoice and PDF', + 'task_assigned_subject' => 'New task assignment [Task :task] [ :date ]', + 'task_assigned_body' => 'You have been assigned task :task

Description: :description

Client: :client', + 'activity_141' => 'User :user entered note: :notes', + 'quote_reminder_subject' => 'Reminder: Quote :quote from :company', + 'quote_reminder_message' => 'Reminder for quote :number for :amount', + 'quote_reminder1' => 'First Quote Reminder', + 'before_valid_until_date' => 'Before the valid until date', + 'after_valid_until_date' => 'After the valid until date', + 'after_quote_date' => 'After the quote date', + 'remind_quote' => 'Remind Quote', + 'end_of_month' => 'End Of Month', + 'tax_currency_mismatch' => 'Tax currency is different from invoice currency', + 'edocument_import_already_exists' => 'The invoice has already been imported on :date', + 'before_valid_until' => 'Before the valid until', + 'after_valid_until' => 'After the valid until', + 'task_assigned_notification' => 'Task Assigned Notification', + 'task_assigned_notification_help' => 'Send an email when a task is assigned', + 'invoices_locked_end_of_month' => 'Invoices are locked at the end of the month', + 'referral_url' => 'Referral URL', + 'add_comment' => 'Add Comment', + 'added_comment' => 'Successfully saved comment', + 'tickets' => 'Tickets', + 'assigned_group' => 'Successfully assigned group', + 'merge_to_pdf' => 'Merge to PDF', + 'latest_requires_php_version' => 'Note: the latest version requires PHP :version', + 'auto_expand_product_table_notes' => 'Automatically expand products table notes', + 'auto_expand_product_table_notes_help' => 'Automatically expands the notes section within the products table to display more lines.', ); -return $lang; \ No newline at end of file +return $lang; diff --git a/lang/et/texts.php b/lang/et/texts.php index 49c6a1a51309..64799000bd25 100644 --- a/lang/et/texts.php +++ b/lang/et/texts.php @@ -2364,7 +2364,7 @@ $lang = array( 'currency_gold_troy_ounce' => 'Gold Troy Ounce', 'currency_nicaraguan_córdoba' => 'Nicaraguan Córdoba', 'currency_malagasy_ariary' => 'Malagasy ariary', - "currency_tongan_pa_anga" => "Tongan Pa'anga", + "currency_tongan_paanga" => "Tongan Pa'anga", 'review_app_help' => 'Loodame, et teile meeldib rakenduse kasutamine.
Kui kaaluksite :link, oleksime selle eest väga tänulikud!', 'writing_a_review' => 'arvustuse kirjutamine', @@ -2880,19 +2880,6 @@ $lang = array( 'refunded' => 'Tagastatud', 'marked_quote_as_sent' => 'Hinnapakkumine märgiti saadetuks', 'custom_module_settings' => 'Kohandatud mooduli sätted', - 'ticket' => 'Pilet', - 'tickets' => 'Piletid', - 'ticket_number' => 'Pilet #', - 'new_ticket' => 'Uus pilet', - 'edit_ticket' => 'Muuda piletit', - 'view_ticket' => 'Vaata piletit', - 'archive_ticket' => 'Arhiveeri pilet', - 'restore_ticket' => 'Taasta pilet', - 'delete_ticket' => 'Kustuta pilet', - 'archived_ticket' => 'Pileti arhiveerimine õnnestus', - 'archived_tickets' => 'Piletite arhiveerimine õnnestus', - 'restored_ticket' => 'Pilet edukalt taastatud', - 'deleted_ticket' => 'Pilet edukalt kustutatud', 'open' => 'Avatud', 'new' => 'Uus', 'closed' => 'Suletud', @@ -2909,14 +2896,6 @@ $lang = array( 'assigned_to' => 'Määratud', 'reply' => 'Vasta', 'awaiting_reply' => 'Ootan vastust', - 'ticket_close' => 'Sule pilet', - 'ticket_reopen' => 'Ava pilet uuesti', - 'ticket_open' => 'Ava pilet', - 'ticket_split' => 'Jagage pilet', - 'ticket_merge' => 'Ühendage pilet', - 'ticket_update' => 'Uuenda piletit', - 'ticket_settings' => 'Pileti seaded', - 'updated_ticket' => 'Pilet uuendatud', 'mark_spam' => 'Märgi rämpspostiks', 'local_part' => 'Local Part', 'local_part_unavailable' => 'Nimi võetud', @@ -2934,31 +2913,23 @@ $lang = array( 'mime_types' => 'Mime types', 'mime_types_placeholder' => '.pdf , .docx, .jpg', 'mime_types_help' => 'Comma separated list of allowed mime types, leave blank for all', + 'ticket_number_start_help' => 'Ticket number must be greater than the current ticket number', + 'new_ticket_template_id' => 'New ticket', + 'new_ticket_autoresponder_help' => 'Selecting a template will send an auto response to a client/contact when a new ticket is created', + 'update_ticket_template_id' => 'Updated ticket', + 'update_ticket_autoresponder_help' => 'Selecting a template will send an auto response to a client/contact when a ticket is updated', + 'close_ticket_template_id' => 'Closed ticket', + 'close_ticket_autoresponder_help' => 'Selecting a template will send an auto response to a client/contact when a ticket is closed', 'default_priority' => 'Default priority', 'alert_new_comment_id' => 'Uus kommentaar', - 'alert_comment_ticket_help' => 'Malli valimine saadab kommentaari tegemisel teate (agendile).', - 'alert_comment_ticket_email_help' => 'Comma separated emails to bcc on new comment.', - 'new_ticket_notification_list' => 'Additional new ticket notifications', 'update_ticket_notification_list' => 'Additional new comment notifications', 'comma_separated_values' => 'admin@example.com, supervisor@example.com', - 'alert_ticket_assign_agent_id' => 'Ticket assignment', - 'alert_ticket_assign_agent_id_hel' => 'Malli valimine saadab (agendile) teate, kui pilet on määratud.', - 'alert_ticket_assign_agent_id_notifications' => 'Malli valimine saadab (agendile) teate, kui pilet on määratud.', - 'alert_ticket_assign_agent_id_help' => 'Comma separated emails to bcc on ticket assignment.', - 'alert_ticket_transfer_email_help' => 'Comma separated emails to bcc on ticket transfer.', - 'alert_ticket_overdue_agent_id' => 'Pilet üle tähtaja', - 'alert_ticket_overdue_email' => 'Additional overdue ticket notifications', - 'alert_ticket_overdue_email_help' => 'Comma separated emails to bcc on ticket overdue.', - 'alert_ticket_overdue_agent_id_help' => 'Malli valimine saadab (agendile) teate, kui pilet on üle tähtaja.', 'default_agent' => 'Vaikimisi agent', 'default_agent_help' => 'If selected will automatically be assigned to all inbound tickets', 'show_agent_details' => 'Näidake vastuste kohta agendi üksikasju', 'avatar' => 'Avatar', 'remove_avatar' => 'Eemalda avatar', - 'ticket_not_found' => 'Piletit ei leitud', 'add_template' => 'Lisa mall', - 'updated_ticket_template' => 'Uuendatud pileti mall', - 'created_ticket_template' => 'Loodud pileti mall', 'archive_ticket_template' => 'Arhiveeri mall', 'restore_ticket_template' => 'Taasta mall', 'archived_ticket_template' => 'Mall edukalt arhiveeritud', @@ -3815,7 +3786,7 @@ $lang = array( 'entity_number_placeholder' => ':entity # :entity_number', 'email_link_not_working' => 'Kui ülalolev nupp teie jaoks ei tööta, klõpsake lingil', 'display_log' => 'Display Log', - 'send_fail_logs_to_our_server' => 'Teatage vigadest reaalajas', + 'send_fail_logs_to_our_server' => 'Report errors to help improve the app', 'setup' => 'Setup', 'quick_overview_statistics' => 'Quick overview & statistics', 'update_your_personal_info' => 'Värskendage oma isikuandmeid', @@ -5303,6 +5274,33 @@ $lang = array( 'currency_bhutan_ngultrum' => 'Bhutan Ngultrum', 'end_of_month' => 'End Of Month', 'merge_e_invoice_to_pdf' => 'Merge E-Invoice and PDF', + 'task_assigned_subject' => 'New task assignment [Task :task] [ :date ]', + 'task_assigned_body' => 'You have been assigned task :task

Description: :description

Client: :client', + 'activity_141' => 'User :user entered note: :notes', + 'quote_reminder_subject' => 'Reminder: Quote :quote from :company', + 'quote_reminder_message' => 'Reminder for quote :number for :amount', + 'quote_reminder1' => 'First Quote Reminder', + 'before_valid_until_date' => 'Before the valid until date', + 'after_valid_until_date' => 'After the valid until date', + 'after_quote_date' => 'After the quote date', + 'remind_quote' => 'Remind Quote', + 'end_of_month' => 'End Of Month', + 'tax_currency_mismatch' => 'Tax currency is different from invoice currency', + 'edocument_import_already_exists' => 'The invoice has already been imported on :date', + 'before_valid_until' => 'Before the valid until', + 'after_valid_until' => 'After the valid until', + 'task_assigned_notification' => 'Task Assigned Notification', + 'task_assigned_notification_help' => 'Send an email when a task is assigned', + 'invoices_locked_end_of_month' => 'Invoices are locked at the end of the month', + 'referral_url' => 'Referral URL', + 'add_comment' => 'Add Comment', + 'added_comment' => 'Successfully saved comment', + 'tickets' => 'Tickets', + 'assigned_group' => 'Successfully assigned group', + 'merge_to_pdf' => 'Merge to PDF', + 'latest_requires_php_version' => 'Note: the latest version requires PHP :version', + 'auto_expand_product_table_notes' => 'Automatically expand products table notes', + 'auto_expand_product_table_notes_help' => 'Automatically expands the notes section within the products table to display more lines.', ); -return $lang; \ No newline at end of file +return $lang; diff --git a/lang/fr/texts.php b/lang/fr/texts.php index 864588991af3..4e3cd813348c 100644 --- a/lang/fr/texts.php +++ b/lang/fr/texts.php @@ -2364,7 +2364,7 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette 'currency_gold_troy_ounce' => 'Once troy d'or', 'currency_nicaraguan_córdoba' => 'Cordoue nicaraguayenne', 'currency_malagasy_ariary' => 'Ariary malgache', - "currency_tongan_pa_anga" => "Pa'anga tongien", + "currency_tongan_paanga" => "Tongan Pa'anga", 'review_app_help' => 'Nous espérons que votre utilisation de cette application vous est agréable.
Un commentaire de votre part serait grandement apprécié!', 'writing_a_review' => 'écrire un commentaire', @@ -2880,19 +2880,6 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette 'refunded' => 'Remboursé', 'marked_quote_as_sent' => 'Le devis sélectionné a été envoyé avec succès', 'custom_module_settings' => 'Paramètres personnalisés de modules', - 'ticket' => 'Ticket', - 'tickets' => 'Tickets', - 'ticket_number' => 'Numéro de ticket', - 'new_ticket' => 'Nouveau ticket', - 'edit_ticket' => 'Mettre à jour le ticket', - 'view_ticket' => 'Voir le ticket', - 'archive_ticket' => 'Archiver le ticket', - 'restore_ticket' => 'Restaurer le ticket', - 'delete_ticket' => 'Supprimer le ticket', - 'archived_ticket' => 'Ticket archivé avec succès', - 'archived_tickets' => 'Tickets archivés avec succès', - 'restored_ticket' => 'Ticket restauré avec succès', - 'deleted_ticket' => 'Ticket supprimé avec succès', 'open' => 'Ouvrir', 'new' => 'Nouveau', 'closed' => 'Fermé', @@ -2909,14 +2896,6 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette 'assigned_to' => 'Assigné à', 'reply' => 'Répondre', 'awaiting_reply' => 'Attente de réponse', - 'ticket_close' => 'Fermer le ticket', - 'ticket_reopen' => 'Ré-ouvrir le ticket', - 'ticket_open' => 'Ouvrir un ticket', - 'ticket_split' => 'Diviser le ticket', - 'ticket_merge' => 'Fusionner les tickets', - 'ticket_update' => 'Mettre à jour le ticket', - 'ticket_settings' => 'Paramètres du ticket', - 'updated_ticket' => 'Ticket mis à jour', 'mark_spam' => 'Indiqué comme spam', 'local_part' => 'Partie locale', 'local_part_unavailable' => 'Nom pris', @@ -2934,31 +2913,23 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette 'mime_types' => 'Type MIME', 'mime_types_placeholder' => '.pdf , .docx, .jpg', 'mime_types_help' => 'Liste séparée par une virgule pour les types MIME autorisés. Laisser vide pour tout autoriser', + 'ticket_number_start_help' => 'Ticket number must be greater than the current ticket number', + 'new_ticket_template_id' => 'New ticket', + 'new_ticket_autoresponder_help' => 'Selecting a template will send an auto response to a client/contact when a new ticket is created', + 'update_ticket_template_id' => 'Updated ticket', + 'update_ticket_autoresponder_help' => 'Selecting a template will send an auto response to a client/contact when a ticket is updated', + 'close_ticket_template_id' => 'Closed ticket', + 'close_ticket_autoresponder_help' => 'Selecting a template will send an auto response to a client/contact when a ticket is closed', 'default_priority' => 'Priorité par défaut', 'alert_new_comment_id' => 'Nouveau commentaire', - 'alert_comment_ticket_help' => 'En sélectionnant un modèle, une notification (à l\'agent) sera envoyée lorsqu\'un commentaire est posté', - 'alert_comment_ticket_email_help' => 'E-mails séparés par une virgule pour CCI lors d\'un nouveau commentaire.', - 'new_ticket_notification_list' => 'Notification de nouveaux tickets additionnel', 'update_ticket_notification_list' => 'Notification de nouveau comment additionnel', 'comma_separated_values' => 'admin@example.com, supervisor@example.com', - 'alert_ticket_assign_agent_id' => 'Assignation de ticket', - 'alert_ticket_assign_agent_id_hel' => 'En sélectionnant un modèle, une notification (à l\'agent) sera envoyée lorsqu\'un billet est assigné.', - 'alert_ticket_assign_agent_id_notifications' => 'Notification d\'assignation de ticket additionnel', - 'alert_ticket_assign_agent_id_help' => 'E-mails séparés par une virgule pour CCI lors d\'un ticket assigné.', - 'alert_ticket_transfer_email_help' => 'E-mails séparés par une virgule pour CCI lors d\'un ticket transféré.', - 'alert_ticket_overdue_agent_id' => 'Ticket en retard.', - 'alert_ticket_overdue_email' => 'Notifications de billets en retard additionnels', - 'alert_ticket_overdue_email_help' => 'E-mails séparés par une virgule pour CCI lors d\'un ticket en retard.', - 'alert_ticket_overdue_agent_id_help' => 'En sélectionnant un modèle, une notification (à l\'agent) sera envoyée lorsqu\'un ticket est en retard.', 'default_agent' => 'Agent par défaut', 'default_agent_help' => 'Cette sélection va automatiquement être assignée à tous les courriels entrants', 'show_agent_details' => 'Afficher les informations de l\'agent dans les réponses', 'avatar' => 'Avatar', 'remove_avatar' => 'Enlever l\'avatar', - 'ticket_not_found' => 'Ticket non trouvé', 'add_template' => 'Ajouter un modèle', - 'updated_ticket_template' => 'Modèle de ticket mis à jour', - 'created_ticket_template' => 'Modèle de ticket crée', 'archive_ticket_template' => 'Archiver modèle', 'restore_ticket_template' => 'Restaurer modèle', 'archived_ticket_template' => 'Modèle archivé avec succès', @@ -3815,7 +3786,7 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette 'entity_number_placeholder' => ':entity # :entity_number', 'email_link_not_working' => 'Si le bouton ci-dessus ne fonctionne pas pour vous, veuillez cliquer sur le lien', 'display_log' => 'Afficher les logs', - 'send_fail_logs_to_our_server' => 'Envoyer les erreurs à nos serveurs', + 'send_fail_logs_to_our_server' => 'Report errors to help improve the app', 'setup' => 'Installation', 'quick_overview_statistics' => 'Aperçu rapide et statistiques', 'update_your_personal_info' => 'Mettre à jour vos informations personnelles', @@ -5303,6 +5274,33 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette 'currency_bhutan_ngultrum' => 'Bhutan Ngultrum', 'end_of_month' => 'End Of Month', 'merge_e_invoice_to_pdf' => 'Merge E-Invoice and PDF', + 'task_assigned_subject' => 'New task assignment [Task :task] [ :date ]', + 'task_assigned_body' => 'You have been assigned task :task

Description: :description

Client: :client', + 'activity_141' => 'User :user entered note: :notes', + 'quote_reminder_subject' => 'Reminder: Quote :quote from :company', + 'quote_reminder_message' => 'Reminder for quote :number for :amount', + 'quote_reminder1' => 'First Quote Reminder', + 'before_valid_until_date' => 'Before the valid until date', + 'after_valid_until_date' => 'After the valid until date', + 'after_quote_date' => 'After the quote date', + 'remind_quote' => 'Remind Quote', + 'end_of_month' => 'End Of Month', + 'tax_currency_mismatch' => 'Tax currency is different from invoice currency', + 'edocument_import_already_exists' => 'The invoice has already been imported on :date', + 'before_valid_until' => 'Before the valid until', + 'after_valid_until' => 'After the valid until', + 'task_assigned_notification' => 'Task Assigned Notification', + 'task_assigned_notification_help' => 'Send an email when a task is assigned', + 'invoices_locked_end_of_month' => 'Invoices are locked at the end of the month', + 'referral_url' => 'Referral URL', + 'add_comment' => 'Add Comment', + 'added_comment' => 'Successfully saved comment', + 'tickets' => 'Tickets', + 'assigned_group' => 'Successfully assigned group', + 'merge_to_pdf' => 'Merge to PDF', + 'latest_requires_php_version' => 'Note: the latest version requires PHP :version', + 'auto_expand_product_table_notes' => 'Automatically expand products table notes', + 'auto_expand_product_table_notes_help' => 'Automatically expands the notes section within the products table to display more lines.', ); -return $lang; \ No newline at end of file +return $lang; diff --git a/lang/fr_CA/texts.php b/lang/fr_CA/texts.php index 331307d6912e..98c0f35f0220 100644 --- a/lang/fr_CA/texts.php +++ b/lang/fr_CA/texts.php @@ -3783,7 +3783,7 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette 'entity_number_placeholder' => ':entity N° :entity_number', 'email_link_not_working' => 'Si le bouton ci-dessus ne fonctionne pas correctement, cliquez sur le lien', 'display_log' => 'Afficher le registre', - 'send_fail_logs_to_our_server' => 'Rapporter les erreurs en temps réel', + 'send_fail_logs_to_our_server' => 'Signalez les erreurs pour aider à l\'amélioration de l\'application', 'setup' => 'Configuration', 'quick_overview_statistics' => 'Aperçu et statistiques', 'update_your_personal_info' => 'Mettre à jour vos infos personnelles', @@ -5283,7 +5283,22 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette 'remind_quote' => 'Rappel de soumission', 'end_of_month' => 'Fin de mois', 'tax_currency_mismatch' => 'La devise de la taxe est différente de la devise de la facture.', - 'edocument_import_already_exists' => '\nLa facture a déjà été importée le :date' + 'edocument_import_already_exists' => 'La facture a déjà été importée le :date', + 'before_valid_until' => 'Avant le Valide jusqu\'au', + 'after_valid_until' => 'Après le Valide jusqu\'au', + 'task_assigned_notification' => 'Notification d\'affectation de tâche', + 'task_assigned_notification_help' => 'Encoyer un courriel lors de l\'attribution d\'une tâche', + 'invoices_locked_end_of_month' => 'Factures verrouillées à la fin du mois', + 'referral_url' => 'Code de référencement', + 'add_comment' => 'Ajouter un commentaire', + 'added_comment' => 'Le commentaire a été ajouté', + 'tickets' => 'Billets', + 'assigned_group' => 'Le groupe a été attribué', + 'merge_to_pdf' => 'Fusionner avec le PDF', + 'latest_requires_php_version' => 'Note: La dernière version requiert PHP :version', + 'auto_expand_product_table_notes' => 'Développer automatiquement les notes du tableau de produits', + 'auto_expand_product_table_notes_help' => '  +Développe automatiquement la section des notes dans le tableau de produits pour afficher plus de lignes.', ); return $lang; diff --git a/lang/fr_CH/texts.php b/lang/fr_CH/texts.php index 18e98ff527fc..5173f18c359d 100644 --- a/lang/fr_CH/texts.php +++ b/lang/fr_CH/texts.php @@ -32,7 +32,7 @@ $lang = array( 'po_number' => 'N° de bon de commande', 'po_number_short' => 'Bon de commande n°', 'frequency_id' => 'Fréquence', - 'discount' => 'Escompte', + 'discount' => 'Réduction', 'taxes' => 'Taxes', 'tax' => 'TVA', 'item' => 'Article', @@ -2194,7 +2194,7 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette 'mailgun_private_key' => 'Clé privée Mailgun', 'brevo_domain' => 'Domaine de Brevo', 'brevo_private_key' => 'Clé privée Brevo', - 'send_test_email' => 'Send Test Email', + 'send_test_email' => 'Envoyer un courriel test', 'select_label' => 'Sélectionnez le libellé', 'label' => 'Libellé', 'service' => 'Service', @@ -2361,7 +2361,7 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette 'currency_gold_troy_ounce' => 'Once troy d'or', 'currency_nicaraguan_córdoba' => 'Cordoue nicaraguayenne', 'currency_malagasy_ariary' => 'Ariary malgache', - "currency_tongan_pa_anga" => "Pa'anga tongien", + "currency_tongan_paanga" => "Tongan Pa'anga", 'review_app_help' => 'Nous espérons que votre utilisation de cette application vous est agréable.
Un commentaire de votre part serait grandement apprécié!', 'writing_a_review' => 'rédiger un commentaire', @@ -2877,19 +2877,6 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette 'refunded' => 'Remboursée', 'marked_quote_as_sent' => 'L\'offre a été marqué comme envoyé avec succès', 'custom_module_settings' => 'Paramètres personnalisés de modules', - 'ticket' => 'Billet', - 'tickets' => 'Billets', - 'ticket_number' => 'Billet #', - 'new_ticket' => 'Nouveau billet', - 'edit_ticket' => 'Éditer le billet', - 'view_ticket' => 'Voir le billet', - 'archive_ticket' => 'Archiver le billet', - 'restore_ticket' => 'Restaurer le billet', - 'delete_ticket' => 'Supprimer le billet', - 'archived_ticket' => 'Le billet a été archivé avec succès', - 'archived_tickets' => 'Les billets ont été archivés avec succès', - 'restored_ticket' => 'Le billet a été restauré avec succès', - 'deleted_ticket' => 'Le billet a été supprimé avec succès', 'open' => 'Ouvert', 'new' => 'Nouveau', 'closed' => 'Fermé', @@ -2906,14 +2893,6 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette 'assigned_to' => 'Assigné à', 'reply' => 'Répondre', 'awaiting_reply' => 'En attente de réponse', - 'ticket_close' => 'Fermer le billet', - 'ticket_reopen' => 'Réouvrir le billet', - 'ticket_open' => 'Ouvrir le billet', - 'ticket_split' => 'Scinder le billet', - 'ticket_merge' => 'Fusionner le billet', - 'ticket_update' => 'Mettre à jour le billet', - 'ticket_settings' => 'Paramètres des billets', - 'updated_ticket' => 'Billet mis à jour', 'mark_spam' => 'Marquer comme spam', 'local_part' => 'Partie locale', 'local_part_unavailable' => 'Nom déjà pris', @@ -2931,31 +2910,23 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette 'mime_types' => 'Type MIME', 'mime_types_placeholder' => '.pdf , .docx, .jpg', 'mime_types_help' => 'Liste séparée par une virgule pour les types MIME autorisés. Laissant vide pour tout autoriser', + 'ticket_number_start_help' => 'Ticket number must be greater than the current ticket number', + 'new_ticket_template_id' => 'Nouveau ticket', + 'new_ticket_autoresponder_help' => 'Selecting a template will send an auto response to a client/contact when a new ticket is created', + 'update_ticket_template_id' => 'Ticket mis à jour', + 'update_ticket_autoresponder_help' => 'Selecting a template will send an auto response to a client/contact when a ticket is updated', + 'close_ticket_template_id' => 'Ticket fermé', + 'close_ticket_autoresponder_help' => 'Selecting a template will send an auto response to a client/contact when a ticket is closed', 'default_priority' => 'Priorité par défaut', 'alert_new_comment_id' => 'Nouveau commentaire', - 'alert_comment_ticket_help' => 'En sélectionnant un modèle, une notification (à l\'agent) sera envoyée lorsqu\'un commentaire est fait', - 'alert_comment_ticket_email_help' => 'Courriels séparés par une virgule pour CCI sur un nouveau commentaire.', - 'new_ticket_notification_list' => 'Notifications de nouveaux billets additionnels', 'update_ticket_notification_list' => 'Notifications de nouveaux commentaires additionnels', 'comma_separated_values' => 'admin@exemple.com, supervisor@exemple.com', - 'alert_ticket_assign_agent_id' => 'Assignation de billet', - 'alert_ticket_assign_agent_id_hel' => 'En sélectionnant un modèle, une notification (à l\'agent) sera envoyée lorsqu\'un billet est assigné.', - 'alert_ticket_assign_agent_id_notifications' => 'Notifications de billets assignés additionnels', - 'alert_ticket_assign_agent_id_help' => 'Courriels séparés par une virgule pour CCI pour un billet assigné.', - 'alert_ticket_transfer_email_help' => 'Courriels séparés par une virgule pour CCI sur un billet transféré.', - 'alert_ticket_overdue_agent_id' => 'Billet en retard', - 'alert_ticket_overdue_email' => 'Notifications de billets en retard additionnels', - 'alert_ticket_overdue_email_help' => 'Courriels séparés par une virgule pour CCI sur un billet en retard.', - 'alert_ticket_overdue_agent_id_help' => 'En sélectionnant un modèle, une notification (à l\'agent) sera envoyée lorsqu\'un billet est en retard.', 'default_agent' => 'Agent par défaut', 'default_agent_help' => 'Cette sélection va automatiquement être assignée à tous les courriels entrants', 'show_agent_details' => 'Afficher les informations de l\'agent dans les réponses', 'avatar' => 'Avatar', 'remove_avatar' => 'Retirer l\'avatar', - 'ticket_not_found' => 'Billet introuvable', 'add_template' => 'Ajouter un modèle', - 'updated_ticket_template' => 'Modèle de billets mise à jour', - 'created_ticket_template' => 'Modèle de billet créés', 'archive_ticket_template' => 'Archiver le modèle', 'restore_ticket_template' => 'Restaurer le modèle', 'archived_ticket_template' => 'Le modèle a été archivé avec succès', @@ -3812,7 +3783,7 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette 'entity_number_placeholder' => ':entity N° :entity_number', 'email_link_not_working' => 'Si le bouton ci-dessus ne fonctionne pas correctement, cliquez sur le lien', 'display_log' => 'Afficher le registre', - 'send_fail_logs_to_our_server' => 'Rapporter les erreurs en temps réel', + 'send_fail_logs_to_our_server' => 'Report errors to help improve the app', 'setup' => 'Configuration', 'quick_overview_statistics' => 'Aperçu et statistiques', 'update_your_personal_info' => 'Mettre à jour vos infos personnelles', @@ -4134,7 +4105,7 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette 'one_time_purchases' => 'Achat définitif', 'recurring_purchases' => 'Achat récurrent', 'you_might_be_interested_in_following' => 'Ceci pourrait vous intéresser', - 'quotes_with_status_sent_can_be_approved' => 'Only quotes with "Sent" status can be approved. Expired quotes cannot be approved.', + 'quotes_with_status_sent_can_be_approved' => 'Seules les offres avec l\'état "Envoyée" peuvent être approuvées. Les offres expirées ne peuvent pas être approuver.', 'no_quotes_available_for_download' => 'Aucune offre disponible pour le téléchargement.', 'copyright' => 'Droits d\'auteur', 'user_created_user' => ':user a créé :created_user à :time', @@ -5262,44 +5233,71 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette 'assign_group' => 'Attribuer un groupe', 'paypal_advanced_cards' => 'Advanced Card Payments', 'local_domain_help' => 'EHLO domain (optional)', - 'port_help' => 'ie. 25,587,465', - 'host_help' => 'ie. smtp.gmail.com', - 'always_show_required_fields' => 'Allows show required fields form', + 'port_help' => 'ex. 25,587,465', + 'host_help' => 'ex. smtp.gmail.com', + 'always_show_required_fields' => 'Permet l\'affichage des champs requis d\'un formulaire', 'always_show_required_fields_help' => 'Displays the required fields form always at checkout', 'advanced_cards' => 'Advanced Cards', 'activity_140' => 'Statement sent to :client', - 'invoice_net_amount' => 'Invoice Net Amount', - 'round_to_minutes' => 'Round To Minutes', - '1_second' => '1 Second', - '1_minute' => '1 Minute', - '5_minutes' => '5 Minutes', - '15_minutes' => '15 Minutes', - '30_minutes' => '30 Minutes', - '1_hour' => '1 Hour', - '1_day' => '1 Day', + 'invoice_net_amount' => 'Montant hors taxe de la facture', + 'round_to_minutes' => 'Arrondir aux minutes', + '1_second' => '1 seconde', + '1_minute' => '1 minute', + '5_minutes' => '5 minutes', + '15_minutes' => '15 minutes', + '30_minutes' => '30 minutes', + '1_hour' => '1 heure', + '1_day' => '1 jour', 'round_tasks' => 'Task Rounding Direction', - 'round_tasks_help' => 'Round task times up or down.', + 'round_tasks_help' => 'Arrondir les temps des tâches vers le haut ou vers le bas', 'direction' => 'Direction', - 'round_up' => 'Round Up', - 'round_down' => 'Round Down', - 'task_round_to_nearest' => 'Round To Nearest', - 'task_round_to_nearest_help' => 'The interval to round the task to.', - 'bulk_updated' => 'Successfully updated data', - 'bulk_update' => 'Bulk Update', - 'calculate' => 'Calculate', - 'sum' => 'Sum', - 'money' => 'Money', - 'web_app' => 'Web App', + 'round_up' => 'Arrondir à hausse', + 'round_down' => 'Arrondir à la baisse', + 'task_round_to_nearest' => 'Arrondir au plus près', + 'task_round_to_nearest_help' => 'Intervalle d\'arrondi des tâches', + 'bulk_updated' => 'Les données ont été mises à jour', + 'bulk_update' => 'Mise à jour groupée', + 'calculate' => 'Calculer', + 'sum' => 'Somme', + 'money' => 'Argent', + 'web_app' => 'App web', 'desktop_app' => 'Desktop App', - 'disconnected' => 'Disconnected', - 'reconnect' => 'Reconnect', - 'e_invoice_settings' => 'E-Invoice Settings', + 'disconnected' => 'Déconnecté', + 'reconnect' => 'Reconnection', + 'e_invoice_settings' => 'Paramètres E-Facture', 'btcpay_refund_subject' => 'Refund of your invoice via BTCPay', 'btcpay_refund_body' => 'A refund intended for you has been issued. To claim it via BTCPay, please click on this link:', 'currency_mauritanian_ouguiya' => 'Mauritanian Ouguiya', 'currency_bhutan_ngultrum' => 'Bhutan Ngultrum', - 'end_of_month' => 'End Of Month', - 'merge_e_invoice_to_pdf' => 'Merge E-Invoice and PDF', + 'end_of_month' => 'Fin du mois', + 'merge_e_invoice_to_pdf' => 'Fusionner E-Facture et PDF', + 'task_assigned_subject' => 'New task assignment [Task :task] [ :date ]', + 'task_assigned_body' => 'You have been assigned task :task

Description: :description

Client: :client', + 'activity_141' => 'User :user entered note: :notes', + 'quote_reminder_subject' => 'Reminder: Quote :quote from :company', + 'quote_reminder_message' => 'Reminder for quote :number for :amount', + 'quote_reminder1' => 'Premier rappel pour l\'offre', + 'before_valid_until_date' => 'Before the valid until date', + 'after_valid_until_date' => 'After the valid until date', + 'after_quote_date' => 'After the quote date', + 'remind_quote' => 'Remind Quote', + 'end_of_month' => 'Fin du mois', + 'tax_currency_mismatch' => 'Tax currency is different from invoice currency', + 'edocument_import_already_exists' => 'The invoice has already been imported on :date', + 'before_valid_until' => 'Before the valid until', + 'after_valid_until' => 'After the valid until', + 'task_assigned_notification' => 'Task Assigned Notification', + 'task_assigned_notification_help' => 'Send an email when a task is assigned', + 'invoices_locked_end_of_month' => 'Invoices are locked at the end of the month', + 'referral_url' => 'Referral URL', + 'add_comment' => 'Add Comment', + 'added_comment' => 'Successfully saved comment', + 'tickets' => 'Tickets', + 'assigned_group' => 'Successfully assigned group', + 'merge_to_pdf' => 'Merge to PDF', + 'latest_requires_php_version' => 'Note: the latest version requires PHP :version', + 'auto_expand_product_table_notes' => 'Automatically expand products table notes', + 'auto_expand_product_table_notes_help' => 'Automatically expands the notes section within the products table to display more lines.', ); -return $lang; \ No newline at end of file +return $lang; diff --git a/lang/he/texts.php b/lang/he/texts.php index e76823443c71..89339eeaf4e9 100644 --- a/lang/he/texts.php +++ b/lang/he/texts.php @@ -2362,7 +2362,7 @@ $lang = array( 'currency_gold_troy_ounce' => 'זהב טרוי אונקה', 'currency_nicaraguan_córdoba' => 'קורדובה ניקרגואה', 'currency_malagasy_ariary' => 'ארית מלגזית', - "currency_tongan_pa_anga" => "פאאנגה טונגנית", + "currency_tongan_paanga" => "Tongan Pa'anga", 'review_app_help' => 'We hope you\'re enjoying using the app.
If you\'d consider :link we\'d greatly appreciate it!', 'writing_a_review' => 'writing a review', @@ -2878,19 +2878,6 @@ $lang = array( 'refunded' => 'הוחזר', 'marked_quote_as_sent' => 'ציטוט סומן בהצלחה כנשלח', 'custom_module_settings' => 'Custom Module Settings', - 'ticket' => 'כַּרְטִיס', - 'tickets' => 'כרטיסים', - 'ticket_number' => 'כרטיס מס'', - 'new_ticket' => 'כרטיס חדש', - 'edit_ticket' => 'ערוך כרטיס', - 'view_ticket' => 'צפה בכרטיס', - 'archive_ticket' => 'כרטיס ארכיון', - 'restore_ticket' => 'שחזור כרטיס', - 'delete_ticket' => 'מחק כרטיס', - 'archived_ticket' => 'הכרטיס הועבר לארכיון בהצלחה', - 'archived_tickets' => 'הכרטיסים הועברו לארכיון בהצלחה', - 'restored_ticket' => 'הכרטיס שוחזר בהצלחה', - 'deleted_ticket' => 'הכרטיס נמחק בהצלחה', 'open' => 'לִפְתוֹחַ', 'new' => 'חָדָשׁ', 'closed' => 'סָגוּר', @@ -2907,14 +2894,6 @@ $lang = array( 'assigned_to' => 'שהוקצה ל', 'reply' => 'תשובה', 'awaiting_reply' => 'ממתין לתגובה', - 'ticket_close' => 'סגור את הכרטיס', - 'ticket_reopen' => 'פתח מחדש את הכרטיס', - 'ticket_open' => 'כרטיס פתוח', - 'ticket_split' => 'כרטיס מפוצל', - 'ticket_merge' => 'מיזוג כרטיס', - 'ticket_update' => 'עדכון כרטיס', - 'ticket_settings' => 'הגדרות כרטיס', - 'updated_ticket' => 'הכרטיס עודכן', 'mark_spam' => 'סמן כספאם', 'local_part' => 'חלק מקומי', 'local_part_unavailable' => 'השם נלקח', @@ -2932,31 +2911,23 @@ $lang = array( 'mime_types' => 'סוגי פנטומימה', 'mime_types_placeholder' => '.pdf , .docx, .jpg', 'mime_types_help' => 'רשימה מופרדת בפסיק של סוגי פנטומימאי מותרים, השאר ריק עבור כולם', + 'ticket_number_start_help' => 'Ticket number must be greater than the current ticket number', + 'new_ticket_template_id' => 'New ticket', + 'new_ticket_autoresponder_help' => 'Selecting a template will send an auto response to a client/contact when a new ticket is created', + 'update_ticket_template_id' => 'Updated ticket', + 'update_ticket_autoresponder_help' => 'Selecting a template will send an auto response to a client/contact when a ticket is updated', + 'close_ticket_template_id' => 'Closed ticket', + 'close_ticket_autoresponder_help' => 'Selecting a template will send an auto response to a client/contact when a ticket is closed', 'default_priority' => 'עדיפות ברירת מחדל', 'alert_new_comment_id' => 'תגובה חדשה', - 'alert_comment_ticket_help' => 'בחירת תבנית תשלח הודעה (לסוכן) עם הערה.', - 'alert_comment_ticket_email_help' => 'הודעות דוא"ל מופרדות בפסיק לעותק מוסתר בהערה חדשה.', - 'new_ticket_notification_list' => 'הודעות נוספות על כרטיסים חדשים', 'update_ticket_notification_list' => 'התראות נוספות על הערות חדשות', 'comma_separated_values' => 'admin@example.com, supervisor@example.com', - 'alert_ticket_assign_agent_id' => 'הקצאת כרטיסים', - 'alert_ticket_assign_agent_id_hel' => 'Selecting a template will send a notification (to agent) when a ticket is assigned.', - 'alert_ticket_assign_agent_id_notifications' => 'הודעות נוספות שהוקצו לכרטיסים', - 'alert_ticket_assign_agent_id_help' => 'הודעות דוא"ל מופרדות בפסיק לעותק מוסתר בהקצאת כרטיס.', - 'alert_ticket_transfer_email_help' => 'הודעות דוא"ל מופרדות בפסיק לעותק מוסתר בהעברת כרטיס.', - 'alert_ticket_overdue_agent_id' => 'כרטיס איחור', - 'alert_ticket_overdue_email' => 'הודעות נוספות על כרטיס איחור', - 'alert_ticket_overdue_email_help' => 'הודעות דוא"ל מופרדות בפסיק לעותק מוסתר על איחור בכרטיס.', - 'alert_ticket_overdue_agent_id_help' => 'Selecting a template will send a notification (to agent) when a ticket becomes overdue.', 'default_agent' => 'סוכן ברירת מחדל', 'default_agent_help' => 'If selected will automatically be assigned to all inbound tickets', 'show_agent_details' => 'הצג פרטי סוכן בתגובות', 'avatar' => 'גִלגוּל', 'remove_avatar' => 'הסר את הדמות', - 'ticket_not_found' => 'הכרטיס לא נמצא', 'add_template' => 'הוסף תבנית', - 'updated_ticket_template' => 'תבנית כרטיס מעודכנת', - 'created_ticket_template' => 'נוצר תבנית כרטיס', 'archive_ticket_template' => 'תבנית ארכיון', 'restore_ticket_template' => 'שחזר תבנית', 'archived_ticket_template' => 'תבנית הועברה לארכיון בהצלחה', @@ -3813,7 +3784,7 @@ $lang = array( 'entity_number_placeholder' => ':entity # :entity_number', 'email_link_not_working' => 'If the button above isn\'t working for you, please click on the link', 'display_log' => 'הצג יומן', - 'send_fail_logs_to_our_server' => 'דווח על שגיאות בזמן אמת', + 'send_fail_logs_to_our_server' => 'Report errors to help improve the app', 'setup' => 'להכין', 'quick_overview_statistics' => 'סקירה מהירה וסטטיסטיקה', 'update_your_personal_info' => 'עדכן את המידע האישי שלך', @@ -5301,6 +5272,33 @@ $lang = array( 'currency_bhutan_ngultrum' => 'Bhutan Ngultrum', 'end_of_month' => 'End Of Month', 'merge_e_invoice_to_pdf' => 'Merge E-Invoice and PDF', + 'task_assigned_subject' => 'New task assignment [Task :task] [ :date ]', + 'task_assigned_body' => 'You have been assigned task :task

Description: :description

Client: :client', + 'activity_141' => 'User :user entered note: :notes', + 'quote_reminder_subject' => 'Reminder: Quote :quote from :company', + 'quote_reminder_message' => 'Reminder for quote :number for :amount', + 'quote_reminder1' => 'First Quote Reminder', + 'before_valid_until_date' => 'Before the valid until date', + 'after_valid_until_date' => 'After the valid until date', + 'after_quote_date' => 'After the quote date', + 'remind_quote' => 'Remind Quote', + 'end_of_month' => 'End Of Month', + 'tax_currency_mismatch' => 'Tax currency is different from invoice currency', + 'edocument_import_already_exists' => 'The invoice has already been imported on :date', + 'before_valid_until' => 'Before the valid until', + 'after_valid_until' => 'After the valid until', + 'task_assigned_notification' => 'Task Assigned Notification', + 'task_assigned_notification_help' => 'Send an email when a task is assigned', + 'invoices_locked_end_of_month' => 'Invoices are locked at the end of the month', + 'referral_url' => 'Referral URL', + 'add_comment' => 'Add Comment', + 'added_comment' => 'Successfully saved comment', + 'tickets' => 'Tickets', + 'assigned_group' => 'Successfully assigned group', + 'merge_to_pdf' => 'Merge to PDF', + 'latest_requires_php_version' => 'Note: the latest version requires PHP :version', + 'auto_expand_product_table_notes' => 'Automatically expand products table notes', + 'auto_expand_product_table_notes_help' => 'Automatically expands the notes section within the products table to display more lines.', ); -return $lang; \ No newline at end of file +return $lang; diff --git a/lang/hu/texts.php b/lang/hu/texts.php index b5b7d3694ead..0a38eb4fcddb 100644 --- a/lang/hu/texts.php +++ b/lang/hu/texts.php @@ -2348,7 +2348,7 @@ adva :date', 'currency_gold_troy_ounce' => 'Arany Troy Unce', 'currency_nicaraguan_córdoba' => 'nicaraguai Córdoba', 'currency_malagasy_ariary' => 'madagaszkári ariary', - "currency_tongan_pa_anga" => "Tonga Pa'anga", + "currency_tongan_paanga" => "Tongan Pa'anga", 'review_app_help' => 'Segítség az értékeléshez', 'writing_a_review' => 'Értékelés írása', @@ -2864,19 +2864,6 @@ adva :date', 'refunded' => 'Visszatérített', 'marked_quote_as_sent' => 'Az árajánlatot elküldöttnek jelölte', 'custom_module_settings' => 'Egyedi modul beállítások', - 'ticket' => 'Jegy', - 'tickets' => 'Jegyek', - 'ticket_number' => 'Jegy száma', - 'new_ticket' => 'Új jegy', - 'edit_ticket' => 'Jegy szerkesztése', - 'view_ticket' => 'Jegy megtekintése', - 'archive_ticket' => 'Jegy archiválása', - 'restore_ticket' => 'Jegy visszaállítása', - 'delete_ticket' => 'Jegy törlése', - 'archived_ticket' => 'Archivált jegy', - 'archived_tickets' => 'Archivált jegyek', - 'restored_ticket' => 'Visszaállított jegy', - 'deleted_ticket' => 'Törölt jegy', 'open' => 'Nyitott', 'new' => 'Új', 'closed' => 'Lezárva', @@ -2893,14 +2880,6 @@ adva :date', 'assigned_to' => 'Hozzárendelve:', 'reply' => 'Válasz', 'awaiting_reply' => 'Válaszra vár', - 'ticket_close' => 'Jegy lezárása', - 'ticket_reopen' => 'Jegy újranyitása', - 'ticket_open' => 'Jegy megnyitása', - 'ticket_split' => 'Jegy szétválasztása', - 'ticket_merge' => 'Jegy összevonása', - 'ticket_update' => 'Jegy frissítése', - 'ticket_settings' => 'Jegy beállítások', - 'updated_ticket' => 'Frissített jegy', 'mark_spam' => 'Spamként jelöl', 'local_part' => 'Helyi rész', 'local_part_unavailable' => 'A helyi rész már foglalt', @@ -2918,31 +2897,23 @@ adva :date', 'mime_types' => 'MIME típusok', 'mime_types_placeholder' => '.pdf, .docx, stb.', 'mime_types_help' => 'Példa MIME típusok: .pdf, .docx, .png', + 'ticket_number_start_help' => 'Ticket number must be greater than the current ticket number', + 'new_ticket_template_id' => 'New ticket', + 'new_ticket_autoresponder_help' => 'Selecting a template will send an auto response to a client/contact when a new ticket is created', + 'update_ticket_template_id' => 'Updated ticket', + 'update_ticket_autoresponder_help' => 'Selecting a template will send an auto response to a client/contact when a ticket is updated', + 'close_ticket_template_id' => 'Closed ticket', + 'close_ticket_autoresponder_help' => 'Selecting a template will send an auto response to a client/contact when a ticket is closed', 'default_priority' => 'Alapértelmezett prioritás', 'alert_new_comment_id' => 'Értesítés új megjegyzésről', - 'alert_comment_ticket_help' => 'Az új megjegyzésre adott értesítés kiválasztott sablonja', - 'alert_comment_ticket_email_help' => 'Az új megjegyzésre adott értesítés e-mailben történő kiküldésének beállítása', - 'new_ticket_notification_list' => 'Új jegy értesítési lista', 'update_ticket_notification_list' => 'Jegy frissítés értesítési lista', 'comma_separated_values' => 'Vesszővel elválasztott értékek', - 'alert_ticket_assign_agent_id' => 'Értesítés jegy hozzárendeléséről', - 'alert_ticket_assign_agent_id_hel' => 'Az ügynöknek történő jegy hozzárendelésre adott értesítés kiválasztott sablonja', - 'alert_ticket_assign_agent_id_notifications' => 'Az ügynöknek történő jegy hozzárendelésre adott értesítések küldése', - 'alert_ticket_assign_agent_id_help' => 'Értesítés küldése, amikor egy ügynöknek hozzárendelik a jegyet', - 'alert_ticket_transfer_email_help' => 'Az értesítés küldése, amikor egy jegyet átvisznek egy másik ügynökhöz', - 'alert_ticket_overdue_agent_id' => 'Értesítés lejárt jegyről', - 'alert_ticket_overdue_email' => 'Lejárt jegy e-mail értesítés', - 'alert_ticket_overdue_email_help' => 'Az értesítés küldése, amikor egy jegy lejár', - 'alert_ticket_overdue_agent_id_help' => 'Az ügynöknek történő értesítés küldése, amikor egy jegy lejár', 'default_agent' => 'Alapértelmezett ügynök', 'default_agent_help' => 'Az új jegyekhez rendelt alapértelmezett ügynök', 'show_agent_details' => 'Ügynök részleteinek megjelenítése', 'avatar' => 'Profilkép', 'remove_avatar' => 'Profilkép eltávolítása', - 'ticket_not_found' => 'A jegy nem található', 'add_template' => 'Sablon hozzáadása', - 'updated_ticket_template' => 'Frissített jegy sablon', - 'created_ticket_template' => 'Létrehozott jegy sablon', 'archive_ticket_template' => 'Jegy sablon archiválása', 'restore_ticket_template' => 'Jegy sablon visszaállítása', 'archived_ticket_template' => 'Archivált jegy sablon', @@ -3799,7 +3770,7 @@ adva :date', 'entity_number_placeholder' => 'Entitás szám helykitöltő', 'email_link_not_working' => 'Az e-mail link nem működik', 'display_log' => 'Napló megjelenítése', - 'send_fail_logs_to_our_server' => 'Küldje el a hibajegyzéket a szerverünkre', + 'send_fail_logs_to_our_server' => 'Report errors to help improve the app', 'setup' => 'Beállítás', 'quick_overview_statistics' => 'Gyors áttekintő statisztikák', 'update_your_personal_info' => 'Frissítse személyes adatait', @@ -5287,6 +5258,33 @@ adva :date', 'currency_bhutan_ngultrum' => 'Bhutan Ngultrum', 'end_of_month' => 'End Of Month', 'merge_e_invoice_to_pdf' => 'Merge E-Invoice and PDF', + 'task_assigned_subject' => 'New task assignment [Task :task] [ :date ]', + 'task_assigned_body' => 'You have been assigned task :task

Description: :description

Client: :client', + 'activity_141' => 'User :user entered note: :notes', + 'quote_reminder_subject' => 'Reminder: Quote :quote from :company', + 'quote_reminder_message' => 'Reminder for quote :number for :amount', + 'quote_reminder1' => 'First Quote Reminder', + 'before_valid_until_date' => 'Before the valid until date', + 'after_valid_until_date' => 'After the valid until date', + 'after_quote_date' => 'After the quote date', + 'remind_quote' => 'Remind Quote', + 'end_of_month' => 'End Of Month', + 'tax_currency_mismatch' => 'Tax currency is different from invoice currency', + 'edocument_import_already_exists' => 'The invoice has already been imported on :date', + 'before_valid_until' => 'Before the valid until', + 'after_valid_until' => 'After the valid until', + 'task_assigned_notification' => 'Task Assigned Notification', + 'task_assigned_notification_help' => 'Send an email when a task is assigned', + 'invoices_locked_end_of_month' => 'Invoices are locked at the end of the month', + 'referral_url' => 'Referral URL', + 'add_comment' => 'Add Comment', + 'added_comment' => 'Successfully saved comment', + 'tickets' => 'Tickets', + 'assigned_group' => 'Successfully assigned group', + 'merge_to_pdf' => 'Merge to PDF', + 'latest_requires_php_version' => 'Note: the latest version requires PHP :version', + 'auto_expand_product_table_notes' => 'Automatically expand products table notes', + 'auto_expand_product_table_notes_help' => 'Automatically expands the notes section within the products table to display more lines.', ); -return $lang; \ No newline at end of file +return $lang; diff --git a/lang/it/texts.php b/lang/it/texts.php index f72f831d3ff2..8269e81e7353 100644 --- a/lang/it/texts.php +++ b/lang/it/texts.php @@ -2355,7 +2355,7 @@ $lang = array( 'currency_gold_troy_ounce' => 'Oncia Troy d'oro', 'currency_nicaraguan_córdoba' => 'Cordova nicaraguense', 'currency_malagasy_ariary' => 'Ariary malgascio', - "currency_tongan_pa_anga" => "Tongano Pa'anga", + "currency_tongan_paanga" => "Tongan Pa'anga", 'review_app_help' => 'Ci auguriamo che ti piaccia usare l'app.
Se prendessi in considerazione :link lo apprezzeremmo molto!', 'writing_a_review' => 'scrivendo una recensione', @@ -2871,19 +2871,6 @@ $lang = array( 'refunded' => 'Rimborsato', 'marked_quote_as_sent' => 'Preventivo contrassegnato come inviato con successo', 'custom_module_settings' => 'Impostazioni modulo personalizzate', - 'ticket' => 'Ticket', - 'tickets' => 'Tickets', - 'ticket_number' => 'Ticket #', - 'new_ticket' => 'Nuovo Ticket', - 'edit_ticket' => 'Modifica Ticket', - 'view_ticket' => 'Vedi Ticket', - 'archive_ticket' => 'Archivia Ticket', - 'restore_ticket' => 'Ripristina Ticket', - 'delete_ticket' => 'Elimina Ticket', - 'archived_ticket' => 'Ticket archiviato con successo', - 'archived_tickets' => 'Ticket archiviati con successo', - 'restored_ticket' => 'Ticket ripristinato con successo', - 'deleted_ticket' => 'Biglietto cancellato con successo', 'open' => 'Apri', 'new' => 'Nuovo', 'closed' => 'Chiuso', @@ -2900,14 +2887,6 @@ $lang = array( 'assigned_to' => 'Assegnato a', 'reply' => 'Rispondi', 'awaiting_reply' => 'In attesa di risposta', - 'ticket_close' => 'Chiudi Ticket', - 'ticket_reopen' => 'Riapri Ticket', - 'ticket_open' => 'Apri Ticket', - 'ticket_split' => 'Dividi Ticket', - 'ticket_merge' => 'Unisci Ticket', - 'ticket_update' => 'Aggiorna Ticket', - 'ticket_settings' => 'Impostazioni Ticket', - 'updated_ticket' => 'Ticket Aggiornato', 'mark_spam' => 'Segnala come Spam', 'local_part' => 'Parte Locale', 'local_part_unavailable' => 'Nome già preso', @@ -2925,31 +2904,23 @@ $lang = array( 'mime_types' => 'Tipi file MIME', 'mime_types_placeholder' => '.pdf , .docx, .jpg', 'mime_types_help' => 'Elenco separato da virgole dei tipi mime consentiti, lasciare vuoto per tutti', + 'ticket_number_start_help' => 'Ticket number must be greater than the current ticket number', + 'new_ticket_template_id' => 'New ticket', + 'new_ticket_autoresponder_help' => 'Selecting a template will send an auto response to a client/contact when a new ticket is created', + 'update_ticket_template_id' => 'Updated ticket', + 'update_ticket_autoresponder_help' => 'Selecting a template will send an auto response to a client/contact when a ticket is updated', + 'close_ticket_template_id' => 'Closed ticket', + 'close_ticket_autoresponder_help' => 'Selecting a template will send an auto response to a client/contact when a ticket is closed', 'default_priority' => 'Priorità predefinita', 'alert_new_comment_id' => 'Nuovo commento', - 'alert_comment_ticket_help' => 'Selezionando un modello, verrà inviata una notifica (all\'agente) quando viene fatto un commento.', - 'alert_comment_ticket_email_help' => 'Email separate da virgole a bcc su un nuovo commento.', - 'new_ticket_notification_list' => 'Notifiche aggiuntive di nuovi ticket', 'update_ticket_notification_list' => 'Notifiche aggiuntive di nuovi commenti', 'comma_separated_values' => 'admin@example.com, supervisor@example.com', - 'alert_ticket_assign_agent_id' => 'Assegnazione ticket', - 'alert_ticket_assign_agent_id_hel' => 'Selezionando un modello verrà inviata una notifica (all\'agente) quando un ticket viene assegnato.', - 'alert_ticket_assign_agent_id_notifications' => 'Notifiche aggiuntive assegnate ai ticket', - 'alert_ticket_assign_agent_id_help' => 'Email separate da virgole a bcc sull'assegnazione del ticket.', - 'alert_ticket_transfer_email_help' => 'Email separate da virgole a bcc sul trasferimento del biglietto.', - 'alert_ticket_overdue_agent_id' => 'Ticket scaduto', - 'alert_ticket_overdue_email' => 'Ulteriori notifiche di ticket scaduti', - 'alert_ticket_overdue_email_help' => 'Email separate da virgole a bcc su ticket scaduti.', - 'alert_ticket_overdue_agent_id_help' => 'Selezionando un modello invierà una notifica (all\'agente) quando un ticket va in scadenza.', 'default_agent' => 'Agente predefinito', 'default_agent_help' => 'Se selezionato sarà automaticamente assegnato a tutti i ticket in entrata', 'show_agent_details' => 'Mostra i dettagli dell\'agente sulle risposte', 'avatar' => 'Avatar', 'remove_avatar' => 'Rimuovi avatar', - 'ticket_not_found' => 'Ticket non trovato', 'add_template' => 'Aggiungi Modello', - 'updated_ticket_template' => 'Modello Ticket Aggiornato', - 'created_ticket_template' => 'Modello Ticket Creato', 'archive_ticket_template' => 'Archivia il modello', 'restore_ticket_template' => 'Riprestina il modello', 'archived_ticket_template' => 'Modello archiviato con successo', @@ -3806,7 +3777,7 @@ $lang = array( 'entity_number_placeholder' => ':entity # :entity_numero', 'email_link_not_working' => 'Se il pulsante sopra non funziona per te, fai clic sul link', 'display_log' => 'Visualizza registro', - 'send_fail_logs_to_our_server' => 'Segnala gli errori in tempo reale', + 'send_fail_logs_to_our_server' => 'Report errors to help improve the app', 'setup' => 'Impostare', 'quick_overview_statistics' => 'Panoramica rapida e statistiche', 'update_your_personal_info' => 'Aggiorna le tue informazioni personali', @@ -5294,6 +5265,33 @@ $lang = array( 'currency_bhutan_ngultrum' => 'Bhutan Ngultrum', 'end_of_month' => 'End Of Month', 'merge_e_invoice_to_pdf' => 'Merge E-Invoice and PDF', + 'task_assigned_subject' => 'New task assignment [Task :task] [ :date ]', + 'task_assigned_body' => 'You have been assigned task :task

Description: :description

Client: :client', + 'activity_141' => 'User :user entered note: :notes', + 'quote_reminder_subject' => 'Reminder: Quote :quote from :company', + 'quote_reminder_message' => 'Reminder for quote :number for :amount', + 'quote_reminder1' => 'First Quote Reminder', + 'before_valid_until_date' => 'Before the valid until date', + 'after_valid_until_date' => 'After the valid until date', + 'after_quote_date' => 'After the quote date', + 'remind_quote' => 'Remind Quote', + 'end_of_month' => 'End Of Month', + 'tax_currency_mismatch' => 'Tax currency is different from invoice currency', + 'edocument_import_already_exists' => 'The invoice has already been imported on :date', + 'before_valid_until' => 'Before the valid until', + 'after_valid_until' => 'After the valid until', + 'task_assigned_notification' => 'Task Assigned Notification', + 'task_assigned_notification_help' => 'Send an email when a task is assigned', + 'invoices_locked_end_of_month' => 'Invoices are locked at the end of the month', + 'referral_url' => 'Referral URL', + 'add_comment' => 'Add Comment', + 'added_comment' => 'Successfully saved comment', + 'tickets' => 'Tickets', + 'assigned_group' => 'Successfully assigned group', + 'merge_to_pdf' => 'Merge to PDF', + 'latest_requires_php_version' => 'Note: the latest version requires PHP :version', + 'auto_expand_product_table_notes' => 'Automatically expand products table notes', + 'auto_expand_product_table_notes_help' => 'Automatically expands the notes section within the products table to display more lines.', ); -return $lang; \ No newline at end of file +return $lang; diff --git a/lang/km_KH/texts.php b/lang/km_KH/texts.php index 4aba9bb9ff15..11f88eb3c3c4 100644 --- a/lang/km_KH/texts.php +++ b/lang/km_KH/texts.php @@ -2344,7 +2344,7 @@ $lang = array( 'currency_gold_troy_ounce' => 'មាស Troy អោន', 'currency_nicaraguan_córdoba' => 'នីការ៉ាហ្គ័រ Córdoba', 'currency_malagasy_ariary' => 'អារីរីម៉ាឡាហ្គាស៊ី', - "currency_tongan_pa_anga" => "តុងហ្គាន ប៉ាអង់ហ្គា", + "currency_tongan_paanga" => "Tongan Pa'anga", 'review_app_help' => 'យើងសង្ឃឹមថាអ្នករីករាយនឹងការប្រើប្រាស់កម្មវិធី។
ប្រសិនបើអ្នកនឹងពិចារណា :link យើងនឹងកោតសរសើរវាយ៉ាងខ្លាំង!', 'writing_a_review' => 'សរសេរការពិនិត្យឡើងវិញ', @@ -2860,19 +2860,6 @@ $lang = array( 'refunded' => 'សងប្រាក់វិញ។', 'marked_quote_as_sent' => 'បាន​សម្គាល់​សម្រង់​ដោយ​ជោគជ័យ​ថា​បាន​ផ្ញើ', 'custom_module_settings' => 'ការកំណត់ម៉ូឌុលផ្ទាល់ខ្លួន', - 'ticket' => 'សំបុត្រ', - 'tickets' => 'សំបុត្រ', - 'ticket_number' => 'សំបុត្រ #', - 'new_ticket' => 'សំបុត្រថ្មី។', - 'edit_ticket' => 'កែសម្រួលសំបុត្រ', - 'view_ticket' => 'មើលសំបុត្រ', - 'archive_ticket' => 'បណ្ណសារសំបុត្រ', - 'restore_ticket' => 'ទិញសំបុត្រឡើងវិញ', - 'delete_ticket' => 'លុបសំបុត្រ', - 'archived_ticket' => 'បានរក្សាទុកសំបុត្រដោយជោគជ័យ', - 'archived_tickets' => 'បានរក្សាទុកសំបុត្រដោយជោគជ័យ', - 'restored_ticket' => 'បានស្ដារសំបុត្រឡើងវិញដោយជោគជ័យ', - 'deleted_ticket' => 'បានលុបសំបុត្រដោយជោគជ័យ', 'open' => 'បើក', 'new' => 'ថ្មី។', 'closed' => 'បិទ', @@ -2889,14 +2876,6 @@ $lang = array( 'assigned_to' => 'ចាត់តាំងទៅ', 'reply' => 'ឆ្លើយតប', 'awaiting_reply' => 'កំពុងរង់ចាំការឆ្លើយតប', - 'ticket_close' => 'បិទសំបុត្រ', - 'ticket_reopen' => 'បើកសំបុត្រឡើងវិញ', - 'ticket_open' => 'បើកសំបុត្រ', - 'ticket_split' => 'ចែកសំបុត្រ', - 'ticket_merge' => 'សំបុត្របញ្ចូលគ្នា', - 'ticket_update' => 'ធ្វើបច្ចុប្បន្នភាពសំបុត្រ', - 'ticket_settings' => 'ការកំណត់សំបុត្រ', - 'updated_ticket' => 'សំបុត្របានធ្វើបច្ចុប្បន្នភាព', 'mark_spam' => 'សម្គាល់ថាជាសារឥតបានការ', 'local_part' => 'ផ្នែកក្នុងស្រុក', 'local_part_unavailable' => 'ឈ្មោះបានយក', @@ -2914,31 +2893,23 @@ $lang = array( 'mime_types' => 'ប្រភេទ Mime', 'mime_types_placeholder' => '.pdf , .docx , .jpg', 'mime_types_help' => 'បញ្ជីដោយបំបែកដោយសញ្ញាក្បៀសនៃប្រភេទ mime ដែលបានអនុញ្ញាត ទុកទទេសម្រាប់ទាំងអស់គ្នា', + 'ticket_number_start_help' => 'Ticket number must be greater than the current ticket number', + 'new_ticket_template_id' => 'New ticket', + 'new_ticket_autoresponder_help' => 'Selecting a template will send an auto response to a client/contact when a new ticket is created', + 'update_ticket_template_id' => 'Updated ticket', + 'update_ticket_autoresponder_help' => 'Selecting a template will send an auto response to a client/contact when a ticket is updated', + 'close_ticket_template_id' => 'Closed ticket', + 'close_ticket_autoresponder_help' => 'Selecting a template will send an auto response to a client/contact when a ticket is closed', 'default_priority' => 'អាទិភាពលំនាំដើម', 'alert_new_comment_id' => 'មតិថ្មី។', - 'alert_comment_ticket_help' => 'ការជ្រើសរើសគំរូនឹងផ្ញើការជូនដំណឹង (ទៅភ្នាក់ងារ) នៅពេលមានមតិយោបល់។', - 'alert_comment_ticket_email_help' => 'សញ្ញាក្បៀសបានបំបែកអ៊ីមែលទៅ bcc នៅលើមតិយោបល់ថ្មី។', - 'new_ticket_notification_list' => 'ការជូនដំណឹងអំពីសំបុត្រថ្មីបន្ថែម', 'update_ticket_notification_list' => 'ការជូនដំណឹងអំពីមតិយោបល់ថ្មីបន្ថែម', 'comma_separated_values' => 'admin@example.com, supervisor@example.com', - 'alert_ticket_assign_agent_id' => 'ការកំណត់សំបុត្រ', - 'alert_ticket_assign_agent_id_hel' => 'ការជ្រើសរើសគំរូនឹងផ្ញើការជូនដំណឹង (ទៅភ្នាក់ងារ) នៅពេលដែលសំបុត្រត្រូវបានចាត់តាំង។', - 'alert_ticket_assign_agent_id_notifications' => 'ការជូនដំណឹងបន្ថែមដែលបានកំណត់សំបុត្រ', - 'alert_ticket_assign_agent_id_help' => 'សញ្ញាក្បៀសបានបំបែកអ៊ីមែលទៅ bcc នៅលើការចាត់តាំងសំបុត្រ។', - 'alert_ticket_transfer_email_help' => 'សញ្ញាក្បៀសបំបែកអ៊ីមែលទៅ bcc នៅលើការផ្ទេរសំបុត្រ។', - 'alert_ticket_overdue_agent_id' => 'សំបុត្រហួសកាលកំណត់', - 'alert_ticket_overdue_email' => 'ការជូនដំណឹងអំពីសំបុត្រហួសកាលកំណត់បន្ថែម', - 'alert_ticket_overdue_email_help' => 'សញ្ញាក្បៀសបានបំបែកអ៊ីមែលទៅជា bcc នៅលើសំបុត្រហួសកំណត់។', - 'alert_ticket_overdue_agent_id_help' => 'ការជ្រើសរើសគំរូនឹងផ្ញើការជូនដំណឹង (ទៅភ្នាក់ងារ) នៅពេលដែលសំបុត្រផុតកំណត់។', 'default_agent' => 'ភ្នាក់ងារលំនាំដើម', 'default_agent_help' => 'ប្រសិន​បើ​បាន​ជ្រើស​នឹង​ត្រូវ​បាន​កំណត់​ដោយ​ស្វ័យ​ប្រវត្តិ​ចំពោះ​សំបុត្រ​ចូល​ទាំង​អស់', 'show_agent_details' => 'បង្ហាញព័ត៌មានលម្អិតភ្នាក់ងារលើការឆ្លើយតប', 'avatar' => 'Avatar', 'remove_avatar' => 'លុបរូបតំណាង', - 'ticket_not_found' => 'រកមិនឃើញសំបុត្រទេ។', 'add_template' => 'បន្ថែមគំរូ', - 'updated_ticket_template' => 'គំរូសំបុត្រដែលបានធ្វើបច្ចុប្បន្នភាព', - 'created_ticket_template' => 'បានបង្កើតគំរូសំបុត្រ', 'archive_ticket_template' => 'បណ្ណសារគំរូ', 'restore_ticket_template' => 'ស្តារគំរូ', 'archived_ticket_template' => 'ពុម្ពដែលបានទុកក្នុងប័ណ្ណសារដោយជោគជ័យ', @@ -3795,7 +3766,7 @@ $lang = array( 'entity_number_placeholder' => ':entity # :entity_number', 'email_link_not_working' => 'ប្រសិនបើប៊ូតុងខាងលើមិនដំណើរការសម្រាប់អ្នក សូមចុចលើតំណ', 'display_log' => 'បង្ហាញកំណត់ហេតុ', - 'send_fail_logs_to_our_server' => 'រាយការណ៍កំហុសក្នុងពេលវេលាជាក់ស្តែង', + 'send_fail_logs_to_our_server' => 'Report errors to help improve the app', 'setup' => 'រៀបចំ', 'quick_overview_statistics' => 'ទិដ្ឋភាពទូទៅ និងស្ថិតិរហ័ស', 'update_your_personal_info' => 'ធ្វើបច្ចុប្បន្នភាពព័ត៌មានផ្ទាល់ខ្លួនរបស់អ្នក។', @@ -5283,6 +5254,33 @@ $lang = array( 'currency_bhutan_ngultrum' => 'Bhutan Ngultrum', 'end_of_month' => 'End Of Month', 'merge_e_invoice_to_pdf' => 'Merge E-Invoice and PDF', + 'task_assigned_subject' => 'New task assignment [Task :task] [ :date ]', + 'task_assigned_body' => 'You have been assigned task :task

Description: :description

Client: :client', + 'activity_141' => 'User :user entered note: :notes', + 'quote_reminder_subject' => 'Reminder: Quote :quote from :company', + 'quote_reminder_message' => 'Reminder for quote :number for :amount', + 'quote_reminder1' => 'First Quote Reminder', + 'before_valid_until_date' => 'Before the valid until date', + 'after_valid_until_date' => 'After the valid until date', + 'after_quote_date' => 'After the quote date', + 'remind_quote' => 'Remind Quote', + 'end_of_month' => 'End Of Month', + 'tax_currency_mismatch' => 'Tax currency is different from invoice currency', + 'edocument_import_already_exists' => 'The invoice has already been imported on :date', + 'before_valid_until' => 'Before the valid until', + 'after_valid_until' => 'After the valid until', + 'task_assigned_notification' => 'Task Assigned Notification', + 'task_assigned_notification_help' => 'Send an email when a task is assigned', + 'invoices_locked_end_of_month' => 'Invoices are locked at the end of the month', + 'referral_url' => 'Referral URL', + 'add_comment' => 'Add Comment', + 'added_comment' => 'Successfully saved comment', + 'tickets' => 'Tickets', + 'assigned_group' => 'Successfully assigned group', + 'merge_to_pdf' => 'Merge to PDF', + 'latest_requires_php_version' => 'Note: the latest version requires PHP :version', + 'auto_expand_product_table_notes' => 'Automatically expand products table notes', + 'auto_expand_product_table_notes_help' => 'Automatically expands the notes section within the products table to display more lines.', ); -return $lang; \ No newline at end of file +return $lang; diff --git a/lang/lo_LA/texts.php b/lang/lo_LA/texts.php index 5a0e5e16168c..90b6ef3d9bb8 100644 --- a/lang/lo_LA/texts.php +++ b/lang/lo_LA/texts.php @@ -2364,7 +2364,7 @@ $lang = array( 'currency_gold_troy_ounce' => 'ທອງຄຳ Troy ອອນສ໌', 'currency_nicaraguan_córdoba' => 'ນິກາຣາກົວ ໂກໂດບາ', 'currency_malagasy_ariary' => 'ມາລາກາຊີ ariary', - "currency_tongan_pa_anga" => "ຕົງກັນປາອາງາ", + "currency_tongan_paanga" => "Tongan Pa'anga", 'review_app_help' => 'ພວກ​ເຮົາ​ຫວັງ​ວ່າ​ທ່ານ​ຈະ​ມີ​ຄວາມ​ສຸກ​ກັບ​ການ​ນໍາ​ໃຊ້ app ໄດ້.
ຖ້າ​ຫາກ​ວ່າ​ທ່ານ \'ພິ​ຈາ​ລະ​ນາ :link ພວກ​ເຮົາ​ຈະ​ຂໍ​ຂອບ​ໃຈ​ເປັນ​ຢ່າງ​ຍິ່ງ​!', 'writing_a_review' => 'ຂຽນບົດວິຈານ', @@ -2880,19 +2880,6 @@ $lang = array( 'refunded' => 'ໄດ້ເງິນຄືນ', 'marked_quote_as_sent' => 'ໄດ້ໝາຍການອ້າງອີງສຳເລັດແລ້ວວ່າສົ່ງແລ້ວ', 'custom_module_settings' => 'ການຕັ້ງຄ່າໂມດູນແບບກຳນົດເອງ', - 'ticket' => 'ປີ້', - 'tickets' => 'ປີ້', - 'ticket_number' => 'ປີ້ #', - 'new_ticket' => 'ປີ້ໃໝ່', - 'edit_ticket' => 'ແກ້ໄຂປີ້', - 'view_ticket' => 'ເບິ່ງປີ້', - 'archive_ticket' => 'ເກັບປີ້', - 'restore_ticket' => 'ກູ້ປີ້ຄືນ', - 'delete_ticket' => 'ລຶບປີ້', - 'archived_ticket' => 'ປີ້ເຂົ້າແຟ້ມສຳເລັດແລ້ວ', - 'archived_tickets' => 'ເກັບປີ້ສຳເລັດແລ້ວ', - 'restored_ticket' => 'ໄດ້ຄືນປີ້ສຳເລັດແລ້ວ', - 'deleted_ticket' => 'ລຶບປີ້ສຳເລັດແລ້ວ', 'open' => 'ເປີດ', 'new' => 'ໃໝ່', 'closed' => 'ປິດ', @@ -2909,14 +2896,6 @@ $lang = array( 'assigned_to' => 'ມອບໝາຍໃຫ້', 'reply' => 'ຕອບ', 'awaiting_reply' => 'ກຳລັງລໍຖ້າຄຳຕອບ', - 'ticket_close' => 'ປິດປີ້', - 'ticket_reopen' => 'ເປີດປີ້ໃໝ່', - 'ticket_open' => 'ເປີດປີ້', - 'ticket_split' => 'ປີ້ແຍກ', - 'ticket_merge' => 'ລວມປີ້', - 'ticket_update' => 'ອັບເດດປີ້', - 'ticket_settings' => 'ການຕັ້ງຄ່າປີ້', - 'updated_ticket' => 'ປີ້ອັບເດດ', 'mark_spam' => 'ໝາຍເປັນສະແປມ', 'local_part' => 'ພາກສ່ວນທ້ອງຖິ່ນ', 'local_part_unavailable' => 'ເອົາຊື່', @@ -2934,31 +2913,23 @@ $lang = array( 'mime_types' => 'ປະເພດ Mime', 'mime_types_placeholder' => '.pdf , .docx, .jpg', 'mime_types_help' => 'ໝາຍຈຸດແຍກລາຍຊື່ປະເພດ mime ທີ່ອະນຸຍາດ, ປ່ອຍໃຫ້ຫວ່າງສຳລັບທັງໝົດ', + 'ticket_number_start_help' => 'Ticket number must be greater than the current ticket number', + 'new_ticket_template_id' => 'New ticket', + 'new_ticket_autoresponder_help' => 'Selecting a template will send an auto response to a client/contact when a new ticket is created', + 'update_ticket_template_id' => 'Updated ticket', + 'update_ticket_autoresponder_help' => 'Selecting a template will send an auto response to a client/contact when a ticket is updated', + 'close_ticket_template_id' => 'Closed ticket', + 'close_ticket_autoresponder_help' => 'Selecting a template will send an auto response to a client/contact when a ticket is closed', 'default_priority' => 'ບູລິມະສິດເລີ່ມຕົ້ນ', 'alert_new_comment_id' => 'ຄຳເຫັນໃໝ່', - 'alert_comment_ticket_help' => 'ການເລືອກແມ່ແບບຈະສົ່ງການແຈ້ງເຕືອນ (ໃຫ້ຕົວແທນ) ເມື່ອມີຄຳເຫັນ.', - 'alert_comment_ticket_email_help' => 'ໝາຍຈຸດແຍກອີເມວໃສ່ bcc ໃນຄຳເຫັນໃໝ່.', - 'new_ticket_notification_list' => 'ແຈ້ງປີ້ໃໝ່ເພີ່ມເຕີມ', 'update_ticket_notification_list' => 'ແຈ້ງຄຳເຫັນໃໝ່ເພີ່ມເຕີມ', 'comma_separated_values' => 'admin@example.com, supervisor@example.com', - 'alert_ticket_assign_agent_id' => 'ການມອບໝາຍປີ້', - 'alert_ticket_assign_agent_id_hel' => 'ການເລືອກແມ່ແບບຈະສົ່ງການແຈ້ງເຕືອນ (ໃຫ້ຕົວແທນ) ເມື່ອປີ້ຖືກມອບໝາຍ.', - 'alert_ticket_assign_agent_id_notifications' => 'ແຈ້ງການເພີ່ມເຕີມທີ່ໄດ້ຮັບມອບໝາຍປີ້', - 'alert_ticket_assign_agent_id_help' => 'ໝາຍຈຸດແຍກອີເມວໃສ່ bcc ໃນການມອບໝາຍປີ້.', - 'alert_ticket_transfer_email_help' => 'ໝາຍຈຸດແຍກອີເມວໄປຫາ bcc ໃນການໂອນປີ້.', - 'alert_ticket_overdue_agent_id' => 'ປີ້ໝົດກຳນົດ', - 'alert_ticket_overdue_email' => 'ການແຈ້ງປີ້ທີ່ເກີນກຳນົດເວລາເພີ່ມເຕີມ', - 'alert_ticket_overdue_email_help' => 'ໝາຍຈຸດທີ່ແຍກອີເມວໄປຫາ bcc ໃນປີ້ທີ່ໝົດກຳນົດ.', - 'alert_ticket_overdue_agent_id_help' => 'ການເລືອກແມ່ແບບຈະສົ່ງການແຈ້ງເຕືອນ (ໃຫ້ຕົວແທນ) ເມື່ອປີ້ໝົດກຳນົດ.', 'default_agent' => 'ຕົວແທນເລີ່ມຕົ້ນ', 'default_agent_help' => 'ຖ້າເລືອກຈະຖືກມອບໃຫ້ປີ້ເຂົ້າທັງໝົດໂດຍອັດຕະໂນມັດ', 'show_agent_details' => 'ສະແດງລາຍລະອຽດຕົວແທນກ່ຽວກັບການຕອບ', 'avatar' => 'ຮູບແທນຕົວ', 'remove_avatar' => 'ເອົາຮູບແທນຕົວອອກ', - 'ticket_not_found' => 'ບໍ່ພົບປີ້', 'add_template' => 'ເພີ່ມແມ່ແບບ', - 'updated_ticket_template' => 'ແມ່ແບບປີ້ທີ່ອັບເດດແລ້ວ', - 'created_ticket_template' => 'Ticket Template ທີ່ສ້າງແລ້ວ', 'archive_ticket_template' => 'ແມ່ແບບເກັບມ້ຽນ', 'restore_ticket_template' => 'ຟື້ນຟູແມ່ແບບ', 'archived_ticket_template' => 'ແມ່ແບບທີ່ເກັບໄວ້ສຳເລັດແລ້ວ', @@ -3815,7 +3786,7 @@ $lang = array( 'entity_number_placeholder' => ':entity # :entity_number', 'email_link_not_working' => 'ຖ້າປຸ່ມຂ້າງເທິງນີ້ບໍ່ໄດ້ເຮັດວຽກສໍາລັບທ່ານ, ກະລຸນາຄລິກໃສ່ການເຊື່ອມຕໍ່', 'display_log' => 'ບັນທຶກການສະແດງ', - 'send_fail_logs_to_our_server' => 'ລາຍງານຄວາມຜິດພາດໃນເວລາຈິງ', + 'send_fail_logs_to_our_server' => 'Report errors to help improve the app', 'setup' => 'ຕັ້ງຄ່າ', 'quick_overview_statistics' => 'ພາບລວມໄວ & ສະຖິຕິ', 'update_your_personal_info' => 'ອັບເດດຂໍ້ມູນສ່ວນຕົວຂອງເຈົ້າ', @@ -5303,6 +5274,33 @@ $lang = array( 'currency_bhutan_ngultrum' => 'Bhutan Ngultrum', 'end_of_month' => 'ທ້າຍເດືອນ', 'merge_e_invoice_to_pdf' => 'Merge E-Invoice and PDF', + 'task_assigned_subject' => 'New task assignment [Task :task] [ :date ]', + 'task_assigned_body' => 'You have been assigned task :task

Description: :description

Client: :client', + 'activity_141' => 'User :user entered note: :notes', + 'quote_reminder_subject' => 'Reminder: Quote :quote from :company', + 'quote_reminder_message' => 'Reminder for quote :number for :amount', + 'quote_reminder1' => 'First Quote Reminder', + 'before_valid_until_date' => 'Before the valid until date', + 'after_valid_until_date' => 'After the valid until date', + 'after_quote_date' => 'After the quote date', + 'remind_quote' => 'Remind Quote', + 'end_of_month' => 'ທ້າຍເດືອນ', + 'tax_currency_mismatch' => 'Tax currency is different from invoice currency', + 'edocument_import_already_exists' => 'The invoice has already been imported on :date', + 'before_valid_until' => 'Before the valid until', + 'after_valid_until' => 'After the valid until', + 'task_assigned_notification' => 'Task Assigned Notification', + 'task_assigned_notification_help' => 'Send an email when a task is assigned', + 'invoices_locked_end_of_month' => 'Invoices are locked at the end of the month', + 'referral_url' => 'Referral URL', + 'add_comment' => 'Add Comment', + 'added_comment' => 'Successfully saved comment', + 'tickets' => 'Tickets', + 'assigned_group' => 'Successfully assigned group', + 'merge_to_pdf' => 'Merge to PDF', + 'latest_requires_php_version' => 'Note: the latest version requires PHP :version', + 'auto_expand_product_table_notes' => 'Automatically expand products table notes', + 'auto_expand_product_table_notes_help' => 'Automatically expands the notes section within the products table to display more lines.', ); -return $lang; \ No newline at end of file +return $lang; diff --git a/lang/lt/texts.php b/lang/lt/texts.php index c03003a16a56..5f9b651641d0 100644 --- a/lang/lt/texts.php +++ b/lang/lt/texts.php @@ -2364,7 +2364,7 @@ $lang = array( 'currency_gold_troy_ounce' => 'Gold Troy Ounce', 'currency_nicaraguan_córdoba' => 'Nicaraguan Córdoba', 'currency_malagasy_ariary' => 'Malagasy ariary', - "currency_tongan_pa_anga" => "Tongan Pa'anga", + "currency_tongan_paanga" => "Tongan Pa'anga", 'review_app_help' => 'We hope you\'re enjoying using the app.
If you\'d consider :link we\'d greatly appreciate it!', 'writing_a_review' => 'writing a review', @@ -2880,19 +2880,6 @@ $lang = array( 'refunded' => 'Grąžinta', 'marked_quote_as_sent' => 'Successfully marked quote as sent', 'custom_module_settings' => 'Custom Module Settings', - 'ticket' => 'Ticket', - 'tickets' => 'Tickets', - 'ticket_number' => 'Ticket #', - 'new_ticket' => 'New Ticket', - 'edit_ticket' => 'Edit Ticket', - 'view_ticket' => 'View Ticket', - 'archive_ticket' => 'Archive Ticket', - 'restore_ticket' => 'Restore Ticket', - 'delete_ticket' => 'Delete Ticket', - 'archived_ticket' => 'Successfully archived ticket', - 'archived_tickets' => 'Successfully archived tickets', - 'restored_ticket' => 'Successfully restored ticket', - 'deleted_ticket' => 'Successfully deleted ticket', 'open' => 'Open', 'new' => 'New', 'closed' => 'Closed', @@ -2909,14 +2896,6 @@ $lang = array( 'assigned_to' => 'Assigned to', 'reply' => 'Reply', 'awaiting_reply' => 'Awaiting reply', - 'ticket_close' => 'Close Ticket', - 'ticket_reopen' => 'Reopen Ticket', - 'ticket_open' => 'Open Ticket', - 'ticket_split' => 'Split Ticket', - 'ticket_merge' => 'Merge Ticket', - 'ticket_update' => 'Update Ticket', - 'ticket_settings' => 'Ticket Settings', - 'updated_ticket' => 'Ticket Updated', 'mark_spam' => 'Mark as Spam', 'local_part' => 'Local Part', 'local_part_unavailable' => 'Name taken', @@ -2934,31 +2913,23 @@ $lang = array( 'mime_types' => 'Mime types', 'mime_types_placeholder' => '.pdf , .docx, .jpg', 'mime_types_help' => 'Comma separated list of allowed mime types, leave blank for all', + 'ticket_number_start_help' => 'Ticket number must be greater than the current ticket number', + 'new_ticket_template_id' => 'New ticket', + 'new_ticket_autoresponder_help' => 'Selecting a template will send an auto response to a client/contact when a new ticket is created', + 'update_ticket_template_id' => 'Updated ticket', + 'update_ticket_autoresponder_help' => 'Selecting a template will send an auto response to a client/contact when a ticket is updated', + 'close_ticket_template_id' => 'Closed ticket', + 'close_ticket_autoresponder_help' => 'Selecting a template will send an auto response to a client/contact when a ticket is closed', 'default_priority' => 'Default priority', 'alert_new_comment_id' => 'New comment', - 'alert_comment_ticket_help' => 'Selecting a template will send a notification (to agent) when a comment is made.', - 'alert_comment_ticket_email_help' => 'Comma separated emails to bcc on new comment.', - 'new_ticket_notification_list' => 'Additional new ticket notifications', 'update_ticket_notification_list' => 'Additional new comment notifications', 'comma_separated_values' => 'admin@example.com, supervisor@example.com', - 'alert_ticket_assign_agent_id' => 'Ticket assignment', - 'alert_ticket_assign_agent_id_hel' => 'Selecting a template will send a notification (to agent) when a ticket is assigned.', - 'alert_ticket_assign_agent_id_notifications' => 'Additional ticket assigned notifications', - 'alert_ticket_assign_agent_id_help' => 'Comma separated emails to bcc on ticket assignment.', - 'alert_ticket_transfer_email_help' => 'Comma separated emails to bcc on ticket transfer.', - 'alert_ticket_overdue_agent_id' => 'Ticket overdue', - 'alert_ticket_overdue_email' => 'Additional overdue ticket notifications', - 'alert_ticket_overdue_email_help' => 'Comma separated emails to bcc on ticket overdue.', - 'alert_ticket_overdue_agent_id_help' => 'Selecting a template will send a notification (to agent) when a ticket becomes overdue.', 'default_agent' => 'Default Agent', 'default_agent_help' => 'If selected will automatically be assigned to all inbound tickets', 'show_agent_details' => 'Show agent details on responses', 'avatar' => 'Avatar', 'remove_avatar' => 'Remove avatar', - 'ticket_not_found' => 'Ticket not found', 'add_template' => 'Pridėti Šabloną', - 'updated_ticket_template' => 'Atnaujintas Bilieto Šablonas', - 'created_ticket_template' => 'Sukurtas Bilieto Šablonas', 'archive_ticket_template' => 'Archyvuoti Šabloną', 'restore_ticket_template' => 'Atstatyti Šabloną', 'archived_ticket_template' => 'Sėkmingai archyvuotas šablonas', @@ -3815,7 +3786,7 @@ $lang = array( 'entity_number_placeholder' => ':entity # :entity_number', 'email_link_not_working' => 'If the button above isn\'t working for you, please click on the link', 'display_log' => 'Display Log', - 'send_fail_logs_to_our_server' => 'Pranešti apie klaidas realiuoju laiku', + 'send_fail_logs_to_our_server' => 'Report errors to help improve the app', 'setup' => 'Setup', 'quick_overview_statistics' => 'Trumpa apžvalga ir statistika', 'update_your_personal_info' => 'Update your personal information', @@ -5303,6 +5274,33 @@ $lang = array( 'currency_bhutan_ngultrum' => 'Bhutan Ngultrum', 'end_of_month' => 'End Of Month', 'merge_e_invoice_to_pdf' => 'Merge E-Invoice and PDF', + 'task_assigned_subject' => 'New task assignment [Task :task] [ :date ]', + 'task_assigned_body' => 'You have been assigned task :task

Description: :description

Client: :client', + 'activity_141' => 'User :user entered note: :notes', + 'quote_reminder_subject' => 'Reminder: Quote :quote from :company', + 'quote_reminder_message' => 'Reminder for quote :number for :amount', + 'quote_reminder1' => 'First Quote Reminder', + 'before_valid_until_date' => 'Before the valid until date', + 'after_valid_until_date' => 'After the valid until date', + 'after_quote_date' => 'After the quote date', + 'remind_quote' => 'Remind Quote', + 'end_of_month' => 'End Of Month', + 'tax_currency_mismatch' => 'Tax currency is different from invoice currency', + 'edocument_import_already_exists' => 'The invoice has already been imported on :date', + 'before_valid_until' => 'Before the valid until', + 'after_valid_until' => 'After the valid until', + 'task_assigned_notification' => 'Task Assigned Notification', + 'task_assigned_notification_help' => 'Send an email when a task is assigned', + 'invoices_locked_end_of_month' => 'Invoices are locked at the end of the month', + 'referral_url' => 'Referral URL', + 'add_comment' => 'Add Comment', + 'added_comment' => 'Successfully saved comment', + 'tickets' => 'Tickets', + 'assigned_group' => 'Successfully assigned group', + 'merge_to_pdf' => 'Merge to PDF', + 'latest_requires_php_version' => 'Note: the latest version requires PHP :version', + 'auto_expand_product_table_notes' => 'Automatically expand products table notes', + 'auto_expand_product_table_notes_help' => 'Automatically expands the notes section within the products table to display more lines.', ); -return $lang; \ No newline at end of file +return $lang; diff --git a/lang/nl/texts.php b/lang/nl/texts.php index 1b6a8f040e6a..23e040a598f9 100644 --- a/lang/nl/texts.php +++ b/lang/nl/texts.php @@ -2361,7 +2361,7 @@ Kom terug naar deze betalingsmethode pagina zodra u de bedragen heeft ontvangen 'currency_gold_troy_ounce' => 'Gouden Troy Ounce', 'currency_nicaraguan_córdoba' => 'Nicaraguaans Córdoba', 'currency_malagasy_ariary' => 'Malagassische ariarium', - "currency_tongan_pa_anga" => "Tongaanse Pa'anga", + "currency_tongan_paanga" => "Tongan Pa'anga", 'review_app_help' => 'We hopen dat je het leuk vindt om de app te gebruiken.
Als je zou overwegen :link, zouden we dat zeer op prijs stellen!', 'writing_a_review' => 'een recensie schrijven', @@ -2877,19 +2877,6 @@ Kom terug naar deze betalingsmethode pagina zodra u de bedragen heeft ontvangen 'refunded' => 'Gecrediteerd', 'marked_quote_as_sent' => 'De offerte is gemarkeerd als verzonden', 'custom_module_settings' => 'Aangepaste module-instellingen', - 'ticket' => 'Ticket', - 'tickets' => 'Tickets', - 'ticket_number' => 'Ticketnummer', - 'new_ticket' => 'Nieuw ticket', - 'edit_ticket' => 'Bewerk ticket', - 'view_ticket' => 'Bekijk ticket', - 'archive_ticket' => 'Archiveer ticket', - 'restore_ticket' => 'Herstel ticket', - 'delete_ticket' => 'Verwijder ticket', - 'archived_ticket' => 'Het ticket is gearchiveerd', - 'archived_tickets' => 'De tickets zijn gearchiveerd', - 'restored_ticket' => 'Het ticket is teruggezet', - 'deleted_ticket' => 'Het ticket is verwijderd', 'open' => 'Open', 'new' => 'Nieuw', 'closed' => 'Gesloten', @@ -2906,14 +2893,6 @@ Kom terug naar deze betalingsmethode pagina zodra u de bedragen heeft ontvangen 'assigned_to' => 'Toegewezen aan', 'reply' => 'Antwoord', 'awaiting_reply' => 'In afwachting van antwoord', - 'ticket_close' => 'Sluit ticket', - 'ticket_reopen' => 'Heropen ticket', - 'ticket_open' => 'Open ticket', - 'ticket_split' => 'Splits ticket', - 'ticket_merge' => 'Ticket samenvoegen', - 'ticket_update' => 'Werk ticket bij', - 'ticket_settings' => 'Ticket instellingen', - 'updated_ticket' => 'Ticket bijgewerkt', 'mark_spam' => 'Markeer als spam', 'local_part' => 'Lokaal gedeelte', 'local_part_unavailable' => 'Naam reeds in gebruik', @@ -2931,31 +2910,23 @@ Kom terug naar deze betalingsmethode pagina zodra u de bedragen heeft ontvangen 'mime_types' => 'MIME-types', 'mime_types_placeholder' => '.pdf, .docx, .jpg', 'mime_types_help' => 'Komma-gescheiden lijst met toegestane MIME-types, laat leeg voor alle', + 'ticket_number_start_help' => 'Ticket number must be greater than the current ticket number', + 'new_ticket_template_id' => 'New ticket', + 'new_ticket_autoresponder_help' => 'Selecting a template will send an auto response to a client/contact when a new ticket is created', + 'update_ticket_template_id' => 'Updated ticket', + 'update_ticket_autoresponder_help' => 'Selecting a template will send an auto response to a client/contact when a ticket is updated', + 'close_ticket_template_id' => 'Closed ticket', + 'close_ticket_autoresponder_help' => 'Selecting a template will send an auto response to a client/contact when a ticket is closed', 'default_priority' => 'Prioriteit', 'alert_new_comment_id' => 'Nieuwe opmerking', - 'alert_comment_ticket_help' => 'Het selecteren van een sjabloon zal een notificatie versturen (naar de agent) zodra een opmerking is geplaatst.', - 'alert_comment_ticket_email_help' => 'E-mailadressen gescheiden met een komma waar een notificatie in BCC naar gestuurd zal worden bij nieuwe reacties.', - 'new_ticket_notification_list' => 'Additionele notificaties bij nieuwe tickets', 'update_ticket_notification_list' => 'Additionele notificaties bij nieuwe opmerkingen', 'comma_separated_values' => 'admin@voorbeeld.com, beheerder@voorbeeld.com', - 'alert_ticket_assign_agent_id' => 'Tickettoewijzing', - 'alert_ticket_assign_agent_id_hel' => 'Het selecteren van een sjabloon zal een notificatie versturen (naar de agent) zodra een ticket is toegewezen.', - 'alert_ticket_assign_agent_id_notifications' => 'Additionele notificaties bij tickettoewijzigingen', - 'alert_ticket_assign_agent_id_help' => 'E-mailadressen gescheiden met een komma waar een notificatie in BCC naar gestuurd zal worden bij nieuwe tickettoewijzingen.', - 'alert_ticket_transfer_email_help' => 'E-mailadressen gescheiden met een komma waar een notificatie in BCC naar gestuurd zal worden bij het overdragen van tickets.', - 'alert_ticket_overdue_agent_id' => 'Ticket over tijd', - 'alert_ticket_overdue_email' => 'Additionele notificaties bij achterstallige tickets', - 'alert_ticket_overdue_email_help' => 'E-mailadressen gescheiden met een komma waar een notificatie in BCC naar gestuurd zal worden bij achterstallige tickets.', - 'alert_ticket_overdue_agent_id_help' => 'Het selecteren van een sjabloon zal een notificatie versturen (naar de agent) zodra een ticket achterstallig wordt.', 'default_agent' => 'Agent', 'default_agent_help' => 'Zal bij selectie automatisch toegewezen worden aan alle binnenkomende tickets', 'show_agent_details' => 'Toon details van de agent bij reacties', 'avatar' => 'Avatar', 'remove_avatar' => 'Verwijder avatar', - 'ticket_not_found' => 'Ticket niet gevonden', 'add_template' => 'Sjabloon toevoegen', - 'updated_ticket_template' => 'Ticketsjabloon gewijzigd', - 'created_ticket_template' => 'Ticketsjabloon aangemaakt', 'archive_ticket_template' => 'Archiveer sjabloon', 'restore_ticket_template' => 'Herstel sjabloon', 'archived_ticket_template' => 'Het sjabloon is gearchiveerd', @@ -3812,7 +3783,7 @@ Kom terug naar deze betalingsmethode pagina zodra u de bedragen heeft ontvangen 'entity_number_placeholder' => ':entity # :entity_number', 'email_link_not_working' => 'Indien de bovenstaande knop niet werkt voor u, gelieve op de link te klikken', 'display_log' => 'Toon logboek', - 'send_fail_logs_to_our_server' => 'Rapporteer fouten in realtime', + 'send_fail_logs_to_our_server' => 'Report errors to help improve the app', 'setup' => 'Setup', 'quick_overview_statistics' => 'Snel overzicht & statistieken', 'update_your_personal_info' => 'Update jouw persoonlijke informatie', @@ -5303,6 +5274,33 @@ Email: :email
', 'currency_bhutan_ngultrum' => 'Bhutan Ngultrum', 'end_of_month' => 'End Of Month', 'merge_e_invoice_to_pdf' => 'Merge E-Invoice and PDF', + 'task_assigned_subject' => 'New task assignment [Task :task] [ :date ]', + 'task_assigned_body' => 'You have been assigned task :task

Description: :description

Client: :client', + 'activity_141' => 'User :user entered note: :notes', + 'quote_reminder_subject' => 'Reminder: Quote :quote from :company', + 'quote_reminder_message' => 'Reminder for quote :number for :amount', + 'quote_reminder1' => 'First Quote Reminder', + 'before_valid_until_date' => 'Before the valid until date', + 'after_valid_until_date' => 'After the valid until date', + 'after_quote_date' => 'After the quote date', + 'remind_quote' => 'Remind Quote', + 'end_of_month' => 'End Of Month', + 'tax_currency_mismatch' => 'Tax currency is different from invoice currency', + 'edocument_import_already_exists' => 'The invoice has already been imported on :date', + 'before_valid_until' => 'Before the valid until', + 'after_valid_until' => 'After the valid until', + 'task_assigned_notification' => 'Task Assigned Notification', + 'task_assigned_notification_help' => 'Send an email when a task is assigned', + 'invoices_locked_end_of_month' => 'Invoices are locked at the end of the month', + 'referral_url' => 'Referral URL', + 'add_comment' => 'Add Comment', + 'added_comment' => 'Successfully saved comment', + 'tickets' => 'Tickets', + 'assigned_group' => 'Successfully assigned group', + 'merge_to_pdf' => 'Merge to PDF', + 'latest_requires_php_version' => 'Note: the latest version requires PHP :version', + 'auto_expand_product_table_notes' => 'Automatically expand products table notes', + 'auto_expand_product_table_notes_help' => 'Automatically expands the notes section within the products table to display more lines.', ); -return $lang; \ No newline at end of file +return $lang; diff --git a/lang/pl/texts.php b/lang/pl/texts.php index 778c05b55031..2c23cad8b98d 100644 --- a/lang/pl/texts.php +++ b/lang/pl/texts.php @@ -197,7 +197,7 @@ Przykłady dynamicznych zmiennych: 'removed_logo' => 'Logo zostało usunięte', 'sent_message' => 'Wiadomość została wysłana', 'invoice_error' => 'Pamiętaj, aby wybrać klienta i poprawić błędy', - 'limit_clients' => 'You\'ve hit the :count client limit on Free accounts. Congrats on your success!.', + 'limit_clients' => 'You\'ve hit the :count client limit on Free accounts. Congrats on your success!', 'payment_error' => 'Wystąpił błąd w trakcie przetwarzania płatności. Prosimy spróbować później.', 'registration_required' => 'Wymagana rejestracja', 'confirmation_required' => 'Potwierdź swój adres emailowy, :link do ponownego wysłania emailu weryfikujacego.', @@ -2362,7 +2362,7 @@ Gdy przelewy zostaną zaksięgowane na Twoim koncie, wróć do tej strony i klik 'currency_gold_troy_ounce' => 'Gold Troy Ounce', 'currency_nicaraguan_córdoba' => 'Nicaraguan Córdoba', 'currency_malagasy_ariary' => 'Malagasy ariary', - "currency_tongan_pa_anga" => "Tongan Pa'anga", + "currency_tongan_paanga" => "Tongan Pa'anga", 'review_app_help' => 'We hope you\'re enjoying using the app.
If you\'d consider :link we\'d greatly appreciate it!', 'writing_a_review' => 'pisanie recenzji', @@ -2693,7 +2693,7 @@ Gdy przelewy zostaną zaksięgowane na Twoim koncie, wróć do tej strony i klik 'no_assets' => 'No images, drag to upload', 'add_image' => 'Dodaj obraz', 'select_image' => 'Wybierz obraz', - 'upgrade_to_upload_images' => 'Upgrade to the Enterprise Plan to upload images', + 'upgrade_to_upload_images' => 'Upgrade to the Enterprise Plan to upload files & images', 'delete_image' => 'Usuń obraz', 'delete_image_help' => 'Warning: deleting the image will remove it from all proposals.', 'amount_variable_help' => 'Note: the invoice $amount field will use the partial/deposit field if set otherwise it will use the invoice balance.', @@ -2878,19 +2878,6 @@ Gdy przelewy zostaną zaksięgowane na Twoim koncie, wróć do tej strony i klik 'refunded' => 'Zwrócone', 'marked_quote_as_sent' => 'Successfully marked quote as sent', 'custom_module_settings' => 'Ustawienia własnego modułu', - 'ticket' => 'Ticket', - 'tickets' => 'Tickets', - 'ticket_number' => 'Ticket #', - 'new_ticket' => 'New Ticket', - 'edit_ticket' => 'Edit Ticket', - 'view_ticket' => 'View Ticket', - 'archive_ticket' => 'Archive Ticket', - 'restore_ticket' => 'Restore Ticket', - 'delete_ticket' => 'Delete Ticket', - 'archived_ticket' => 'Successfully archived ticket', - 'archived_tickets' => 'Successfully archived tickets', - 'restored_ticket' => 'Successfully restored ticket', - 'deleted_ticket' => 'Successfully deleted ticket', 'open' => 'Otwórz', 'new' => 'Nowy', 'closed' => 'Zamknięte', @@ -2907,14 +2894,6 @@ Gdy przelewy zostaną zaksięgowane na Twoim koncie, wróć do tej strony i klik 'assigned_to' => 'Przypisane do', 'reply' => 'Odpowiedz', 'awaiting_reply' => 'Oczekiwanie na odpowiedź', - 'ticket_close' => 'Close Ticket', - 'ticket_reopen' => 'Reopen Ticket', - 'ticket_open' => 'Open Ticket', - 'ticket_split' => 'Split Ticket', - 'ticket_merge' => 'Merge Ticket', - 'ticket_update' => 'Update Ticket', - 'ticket_settings' => 'Ticket Settings', - 'updated_ticket' => 'Ticket Updated', 'mark_spam' => 'Oznacz jako Spam', 'local_part' => 'Część lokalna', 'local_part_unavailable' => 'Nazwa zajęta', @@ -2941,66 +2920,25 @@ Gdy przelewy zostaną zaksięgowane na Twoim koncie, wróć do tej strony i klik 'close_ticket_autoresponder_help' => 'Selecting a template will send an auto response to a client/contact when a ticket is closed', 'default_priority' => 'Domyślny priorytet', 'alert_new_comment_id' => 'Nowy komentarz', - 'alert_comment_ticket_help' => 'Wybranie szablonu spowoduje wysłanie powiadomienia (do agenta) o pojawieniu się komentarza.', - 'alert_comment_ticket_email_help' => 'Comma separated emails to bcc on new comment.', - 'new_ticket_notification_list' => 'Additional new ticket notifications', 'update_ticket_notification_list' => 'Dodatkowe powiadomienia o nowych komentarzach', 'comma_separated_values' => 'admin@example.com, supervisor@example.com', - 'alert_ticket_assign_agent_id' => 'Ticket assignment', - 'alert_ticket_assign_agent_id_hel' => 'Selecting a template will send a notification (to agent) when a ticket is assigned.', - 'alert_ticket_assign_agent_id_notifications' => 'Additional ticket assigned notifications', - 'alert_ticket_assign_agent_id_help' => 'Comma separated emails to bcc on ticket assignment.', - 'alert_ticket_transfer_email_help' => 'Comma separated emails to bcc on ticket transfer.', - 'alert_ticket_overdue_agent_id' => 'Ticket overdue', - 'alert_ticket_overdue_email' => 'Additional overdue ticket notifications', - 'alert_ticket_overdue_email_help' => 'Comma separated emails to bcc on ticket overdue.', - 'alert_ticket_overdue_agent_id_help' => 'Selecting a template will send a notification (to agent) when a ticket becomes overdue.', - 'ticket_master' => 'Ticket Master', - 'ticket_master_help' => 'Has the ability to assign and transfer tickets. Assigned as the default agent for all tickets.', 'default_agent' => 'Domyślny agent', 'default_agent_help' => 'If selected will automatically be assigned to all inbound tickets', 'show_agent_details' => 'Pokaż szczegóły agenta w odpowiedziach', 'avatar' => 'Awatar', 'remove_avatar' => 'Usuń awatar', - 'ticket_not_found' => 'Ticket not found', 'add_template' => 'Dodaj Szablon', - 'ticket_template' => 'Ticket Template', - 'ticket_templates' => 'Ticket Templates', - 'updated_ticket_template' => 'Updated Ticket Template', - 'created_ticket_template' => 'Created Ticket Template', 'archive_ticket_template' => 'Archiwizuj Szablon', 'restore_ticket_template' => 'Przywróć Szablon', 'archived_ticket_template' => 'Szablon zarchiwizowany pomyślnie', 'restored_ticket_template' => 'Szablon przywrócony pomyślnie', - 'close_reason' => 'Let us know why you are closing this ticket', - 'reopen_reason' => 'Let us know why you are reopening this ticket', 'enter_ticket_message' => 'Please enter a message to update the ticket', 'show_hide_all' => 'Pokaż / Ukryj wszystko', 'subject_required' => 'Temat jest wymagany', 'mobile_refresh_warning' => 'Jeśli korzystasz z aplikacji mobilnej, może być konieczne pełne odświeżenie.', - 'enable_proposals_for_background' => 'To upload a background image :link to enable the proposals module.', - 'ticket_assignment' => 'Ticket :ticket_number has been assigned to :agent', - 'ticket_contact_reply' => 'Ticket :ticket_number has been updated by client :contact', - 'ticket_new_template_subject' => 'Ticket :ticket_number has been created.', - 'ticket_updated_template_subject' => 'Ticket :ticket_number has been updated.', - 'ticket_closed_template_subject' => 'Ticket :ticket_number has been closed.', - 'ticket_overdue_template_subject' => 'Ticket :ticket_number is now overdue', 'merge' => 'Scal', 'merged' => 'Scalone', 'agent' => 'Agent', - 'parent_ticket' => 'Parent Ticket', - 'linked_tickets' => 'Linked Tickets', - 'merge_prompt' => 'Enter ticket number to merge into', - 'merge_from_to' => 'Ticket #:old_ticket merged into Ticket #:new_ticket', - 'merge_closed_ticket_text' => 'Ticket #:old_ticket was closed and merged into Ticket#:new_ticket - :subject', - 'merge_updated_ticket_text' => 'Ticket #:old_ticket was closed and merged into this ticket', - 'merge_placeholder' => 'Merge ticket #:ticket into the following ticket', - 'select_ticket' => 'Select Ticket', - 'new_internal_ticket' => 'New internal ticket', - 'internal_ticket' => 'Internal ticket', - 'create_ticket' => 'Create ticket', - 'allow_inbound_email_tickets_external' => 'New Tickets by email (Client)', - 'allow_inbound_email_tickets_external_help' => 'Allow clients to create new tickets by email', 'include_in_filter' => 'Uwzględnij w filtrowaniu', 'custom_client1' => ':VALUE', 'custom_client2' => ':VALUE', @@ -3846,7 +3784,7 @@ Gdy przelewy zostaną zaksięgowane na Twoim koncie, wróć do tej strony i klik 'entity_number_placeholder' => ':entity # :entity_number', 'email_link_not_working' => 'Jeśli powyższy przycisk nie działa, kliknij link', 'display_log' => 'Pokaż log', - 'send_fail_logs_to_our_server' => 'Zgłaszaj błędy w czasie rzeczywistym', + 'send_fail_logs_to_our_server' => 'Report errors to help improve the app', 'setup' => 'Instalacja', 'quick_overview_statistics' => 'Quick overview & statistics', 'update_your_personal_info' => 'Aktualizacja Twoich danych osobowych', @@ -4027,7 +3965,7 @@ Gdy przelewy zostaną zaksięgowane na Twoim koncie, wróć do tej strony i klik 'user_detached' => 'Użytkownik odłączony od firmy', 'create_webhook_failure' => 'Failed to create Webhook', 'payment_message_extended' => 'Dziękujemy za wpłatę :amount za :invoice', - 'online_payments_minimum_note' => 'Note: Online payments are supported only if amount is bigger than $1 or currency equivalent.', + 'online_payments_minimum_note' => 'Note: Online payments are supported only if amount is larger than $1 or currency equivalent.', 'payment_token_not_found' => 'Payment token not found, please try again. If an issue still persist, try with another payment method', 'vendor_address1' => 'Vendor Street', 'vendor_address2' => 'Vendor Apt/Suite', @@ -4435,7 +4373,7 @@ Gdy przelewy zostaną zaksięgowane na Twoim koncie, wróć do tej strony i klik 'client_shipping_country' => 'Client Shipping Country', 'load_pdf' => 'Load PDF', 'start_free_trial' => 'Start Free Trial', - 'start_free_trial_message' => 'Start your FREE 14 day trial of the pro plan', + 'start_free_trial_message' => 'Start your FREE 14 day trial of the Pro Plan', 'due_on_receipt' => 'Due on Receipt', 'is_paid' => 'Zapłacone', 'age_group_paid' => 'Zapłacono', @@ -5145,7 +5083,7 @@ Gdy przelewy zostaną zaksięgowane na Twoim koncie, wróć do tej strony i klik 'payment_refund_receipt' => 'Payment Refund Receipt # :number', 'payment_receipt' => 'Payment Receipt # :number', 'load_template_description' => 'The template will be applied to following:', - 'run_template' => 'Run template', + 'run_template' => 'Run Template', 'statement_design' => 'Statement Design', 'delivery_note_design' => 'Delivery Note Design', 'payment_receipt_design' => 'Payment Receipt Design', @@ -5295,6 +5233,72 @@ Gdy przelewy zostaną zaksięgowane na Twoim koncie, wróć do tej strony i klik 'rappen_rounding_help' => 'Round amount to 5 cents', 'assign_group' => 'Assign group', 'paypal_advanced_cards' => 'Advanced Card Payments', + 'local_domain_help' => 'EHLO domain (optional)', + 'port_help' => 'ie. 25,587,465', + 'host_help' => 'ie. smtp.gmail.com', + 'always_show_required_fields' => 'Allows show required fields form', + 'always_show_required_fields_help' => 'Displays the required fields form always at checkout', + 'advanced_cards' => 'Advanced Cards', + 'activity_140' => 'Statement sent to :client', + 'invoice_net_amount' => 'Invoice Net Amount', + 'round_to_minutes' => 'Round To Minutes', + '1_second' => '1 Second', + '1_minute' => '1 Minute', + '5_minutes' => '5 Minutes', + '15_minutes' => '15 Minutes', + '30_minutes' => '30 Minutes', + '1_hour' => '1 Hour', + '1_day' => '1 Day', + 'round_tasks' => 'Task Rounding Direction', + 'round_tasks_help' => 'Round task times up or down.', + 'direction' => 'Direction', + 'round_up' => 'Round Up', + 'round_down' => 'Round Down', + 'task_round_to_nearest' => 'Round To Nearest', + 'task_round_to_nearest_help' => 'The interval to round the task to.', + 'bulk_updated' => 'Successfully updated data', + 'bulk_update' => 'Bulk Update', + 'calculate' => 'Calculate', + 'sum' => 'Sum', + 'money' => 'Money', + 'web_app' => 'Web App', + 'desktop_app' => 'Desktop App', + 'disconnected' => 'Disconnected', + 'reconnect' => 'Reconnect', + 'e_invoice_settings' => 'E-Invoice Settings', + 'btcpay_refund_subject' => 'Refund of your invoice via BTCPay', + 'btcpay_refund_body' => 'A refund intended for you has been issued. To claim it via BTCPay, please click on this link:', + 'currency_mauritanian_ouguiya' => 'Mauritanian Ouguiya', + 'currency_bhutan_ngultrum' => 'Bhutan Ngultrum', + 'end_of_month' => 'End Of Month', + 'merge_e_invoice_to_pdf' => 'Merge E-Invoice and PDF', + 'task_assigned_subject' => 'New task assignment [Task :task] [ :date ]', + 'task_assigned_body' => 'You have been assigned task :task

Description: :description

Client: :client', + 'activity_141' => 'User :user entered note: :notes', + 'quote_reminder_subject' => 'Reminder: Quote :quote from :company', + 'quote_reminder_message' => 'Reminder for quote :number for :amount', + 'quote_reminder1' => 'First Quote Reminder', + 'before_valid_until_date' => 'Before the valid until date', + 'after_valid_until_date' => 'After the valid until date', + 'after_quote_date' => 'After the quote date', + 'remind_quote' => 'Remind Quote', + 'end_of_month' => 'End Of Month', + 'tax_currency_mismatch' => 'Tax currency is different from invoice currency', + 'edocument_import_already_exists' => 'The invoice has already been imported on :date', + 'before_valid_until' => 'Before the valid until', + 'after_valid_until' => 'After the valid until', + 'task_assigned_notification' => 'Task Assigned Notification', + 'task_assigned_notification_help' => 'Send an email when a task is assigned', + 'invoices_locked_end_of_month' => 'Invoices are locked at the end of the month', + 'referral_url' => 'Referral URL', + 'add_comment' => 'Add Comment', + 'added_comment' => 'Successfully saved comment', + 'tickets' => 'Tickets', + 'assigned_group' => 'Successfully assigned group', + 'merge_to_pdf' => 'Merge to PDF', + 'latest_requires_php_version' => 'Note: the latest version requires PHP :version', + 'auto_expand_product_table_notes' => 'Automatically expand products table notes', + 'auto_expand_product_table_notes_help' => 'Automatically expands the notes section within the products table to display more lines.', ); return $lang; diff --git a/lang/pt_BR/texts.php b/lang/pt_BR/texts.php index 0679b128c9da..3f9048846ff9 100644 --- a/lang/pt_BR/texts.php +++ b/lang/pt_BR/texts.php @@ -2361,7 +2361,7 @@ Quando tiver as quantias, volte a esta página de formas de pagamento e clique " 'currency_gold_troy_ounce' => 'Onça Troy de Ouro', 'currency_nicaraguan_córdoba' => 'Córdoba Nicaraguense', 'currency_malagasy_ariary' => 'Ariário malgaxe', - "currency_tongan_pa_anga" => "Pa'anga de Tonga", + "currency_tongan_paanga" => "Tongan Pa'anga", 'review_app_help' => 'Esperamos que esteja aproveitando o app.
Se você considerar :link agradeceríamos bastante!', 'writing_a_review' => 'Escrevendo uma avaliação', @@ -2877,19 +2877,6 @@ Quando tiver as quantias, volte a esta página de formas de pagamento e clique " 'refunded' => 'Reembolsado', 'marked_quote_as_sent' => 'Orçamento marcado como enviado com sucesso', 'custom_module_settings' => 'Configurações Personalizadas de Módulo', - 'ticket' => 'Ticket', - 'tickets' => 'Tickets', - 'ticket_number' => 'Ticket #', - 'new_ticket' => 'Novo Ticket', - 'edit_ticket' => 'Editar Ticket', - 'view_ticket' => 'Visualizar Ticket', - 'archive_ticket' => 'Arquivar Ticket', - 'restore_ticket' => 'Restaurar Ticket', - 'delete_ticket' => 'Excluir Ticket', - 'archived_ticket' => 'Ticket arquivado com sucesso', - 'archived_tickets' => 'Tickets arquivados com sucesso', - 'restored_ticket' => 'Ticket restaurado com sucesso', - 'deleted_ticket' => 'Ticket excluído com sucesso', 'open' => 'Aberto', 'new' => 'Novo', 'closed' => 'Fechado', @@ -2906,14 +2893,6 @@ Quando tiver as quantias, volte a esta página de formas de pagamento e clique " 'assigned_to' => 'Atribuído para', 'reply' => 'Responder', 'awaiting_reply' => 'Aguardando Resposta', - 'ticket_close' => 'Fechar Ticket', - 'ticket_reopen' => 'Reabrir Ticket', - 'ticket_open' => 'Abrir Ticket', - 'ticket_split' => 'Dividir Ticket', - 'ticket_merge' => 'Unir Ticket', - 'ticket_update' => 'Atualizar Ticket', - 'ticket_settings' => 'Configurações do Ticket', - 'updated_ticket' => 'Ticket Atualizado', 'mark_spam' => 'Marcar como Spam', 'local_part' => 'Parte Local', 'local_part_unavailable' => 'Nome tomado', @@ -2931,31 +2910,23 @@ Quando tiver as quantias, volte a esta página de formas de pagamento e clique " 'mime_types' => 'Tipos MIME', 'mime_types_placeholder' => '.pdf , .docx , .jpg', 'mime_types_help' => 'Lista separada por vírgulas de tipos MIME permitidos, deixe em branco para TODOS', + 'ticket_number_start_help' => 'Ticket number must be greater than the current ticket number', + 'new_ticket_template_id' => 'New ticket', + 'new_ticket_autoresponder_help' => 'Selecting a template will send an auto response to a client/contact when a new ticket is created', + 'update_ticket_template_id' => 'Updated ticket', + 'update_ticket_autoresponder_help' => 'Selecting a template will send an auto response to a client/contact when a ticket is updated', + 'close_ticket_template_id' => 'Closed ticket', + 'close_ticket_autoresponder_help' => 'Selecting a template will send an auto response to a client/contact when a ticket is closed', 'default_priority' => 'Prioridade Padrão', 'alert_new_comment_id' => 'Novo comentário', - 'alert_comment_ticket_help' => 'Selecionar um modelo enviará uma notificação (para um agente) quando um novo comentário for feito.', - 'alert_comment_ticket_email_help' => 'Emails separados por vírgulas para cco após um novo comentário.', - 'new_ticket_notification_list' => 'Notificações adicionais de novo ticket', 'update_ticket_notification_list' => 'Notificações adicionais de novo comentário', 'comma_separated_values' => 'admin@example.com, supervisor@example.com', - 'alert_ticket_assign_agent_id' => 'Atribuição de Ticket', - 'alert_ticket_assign_agent_id_hel' => 'Selecionar um modelo enviará uma notificação (para um agente) quando um ticket for atribuído.', - 'alert_ticket_assign_agent_id_notifications' => 'Notificações adicionais de ticket atribuído', - 'alert_ticket_assign_agent_id_help' => 'Emails separados por vírgulas para cco após atribuição de ticket.', - 'alert_ticket_transfer_email_help' => 'Emails separados por vírgulas para cco após transferência de ticket.', - 'alert_ticket_overdue_agent_id' => 'Atraso de Ticket', - 'alert_ticket_overdue_email' => 'Notificações adicionais de ticket atrasado', - 'alert_ticket_overdue_email_help' => 'Emails separados por vírgulas para cco após atraso de ticket. ', - 'alert_ticket_overdue_agent_id_help' => 'Selecionar um modelo enviará uma notificação (para um agente) quando um ticket atrasar. ', 'default_agent' => 'Agente Padrão', 'default_agent_help' => 'Se selecionado irá automaticamente ser selecionado para todos os tickets entrantes', 'show_agent_details' => 'Exibir detalhes do agente nas respostas', 'avatar' => 'Avatar', 'remove_avatar' => 'Remover avatar', - 'ticket_not_found' => 'Ticket não encontrado', 'add_template' => 'Adicionar Modelo', - 'updated_ticket_template' => 'Modelo de Ticket Atualizado', - 'created_ticket_template' => 'Modelo de Ticket Criado', 'archive_ticket_template' => 'Arquivar Modelo', 'restore_ticket_template' => 'Restaurar Modelo', 'archived_ticket_template' => 'Modelo arquivado com sucesso', @@ -3812,7 +3783,7 @@ Quando tiver as quantias, volte a esta página de formas de pagamento e clique " 'entity_number_placeholder' => ':entity # :entity _número', 'email_link_not_working' => 'Se o botão acima não estiver funcionando para você, clique no link', 'display_log' => 'Exibir registro', - 'send_fail_logs_to_our_server' => 'Relate erros em tempo real', + 'send_fail_logs_to_our_server' => 'Report errors to help improve the app', 'setup' => 'Configurar', 'quick_overview_statistics' => 'Visão geral rápida e estatísticas', 'update_your_personal_info' => 'Atualize suas informações pessoais', @@ -5300,6 +5271,33 @@ Quando tiver as quantias, volte a esta página de formas de pagamento e clique " 'currency_bhutan_ngultrum' => 'Bhutan Ngultrum', 'end_of_month' => 'End Of Month', 'merge_e_invoice_to_pdf' => 'Merge E-Invoice and PDF', + 'task_assigned_subject' => 'New task assignment [Task :task] [ :date ]', + 'task_assigned_body' => 'You have been assigned task :task

Description: :description

Client: :client', + 'activity_141' => 'User :user entered note: :notes', + 'quote_reminder_subject' => 'Reminder: Quote :quote from :company', + 'quote_reminder_message' => 'Reminder for quote :number for :amount', + 'quote_reminder1' => 'First Quote Reminder', + 'before_valid_until_date' => 'Before the valid until date', + 'after_valid_until_date' => 'After the valid until date', + 'after_quote_date' => 'After the quote date', + 'remind_quote' => 'Remind Quote', + 'end_of_month' => 'End Of Month', + 'tax_currency_mismatch' => 'Tax currency is different from invoice currency', + 'edocument_import_already_exists' => 'The invoice has already been imported on :date', + 'before_valid_until' => 'Before the valid until', + 'after_valid_until' => 'After the valid until', + 'task_assigned_notification' => 'Task Assigned Notification', + 'task_assigned_notification_help' => 'Send an email when a task is assigned', + 'invoices_locked_end_of_month' => 'Invoices are locked at the end of the month', + 'referral_url' => 'Referral URL', + 'add_comment' => 'Add Comment', + 'added_comment' => 'Successfully saved comment', + 'tickets' => 'Tickets', + 'assigned_group' => 'Successfully assigned group', + 'merge_to_pdf' => 'Merge to PDF', + 'latest_requires_php_version' => 'Note: the latest version requires PHP :version', + 'auto_expand_product_table_notes' => 'Automatically expand products table notes', + 'auto_expand_product_table_notes_help' => 'Automatically expands the notes section within the products table to display more lines.', ); -return $lang; \ No newline at end of file +return $lang; diff --git a/lang/pt_PT/texts.php b/lang/pt_PT/texts.php index 912be7d90d4d..af121f6a2f4c 100644 --- a/lang/pt_PT/texts.php +++ b/lang/pt_PT/texts.php @@ -2362,7 +2362,7 @@ Quando tiver os valores dos depósitos, volte a esta página e conclua a verific 'currency_gold_troy_ounce' => 'Onça Troy de Ouro', 'currency_nicaraguan_córdoba' => 'Córdoba Nicaraguense', 'currency_malagasy_ariary' => 'Ariário malgaxe', - "currency_tongan_pa_anga" => "Pa'anga de Tonga", + "currency_tongan_paanga" => "Tongan Pa'anga", 'review_app_help' => 'Esperamos que esteja a gostar da aplicação.
Se eventualmente considerar :link agradecíamos muito!', 'writing_a_review' => 'escrever uma avaliação', @@ -2879,19 +2879,6 @@ debitar da sua conta de acordo com essas instruções. Está elegível a um reem 'refunded' => 'Reembolsado', 'marked_quote_as_sent' => 'Orçamento marcado como enviado com sucesso', 'custom_module_settings' => 'Configurações Personalizadas de Módulo', - 'ticket' => 'Bilhete', - 'tickets' => 'Bilhetes', - 'ticket_number' => 'Bilhete #', - 'new_ticket' => 'Novo Bilhete', - 'edit_ticket' => 'Editar Bilhete', - 'view_ticket' => 'Visualizar Bilhete', - 'archive_ticket' => 'Arquivar Bilhete', - 'restore_ticket' => 'Restaurar Bilhete', - 'delete_ticket' => 'Apagar Bilhete', - 'archived_ticket' => 'Bilhete arquivado com sucesso', - 'archived_tickets' => 'Bilhetes arquivados com sucesso', - 'restored_ticket' => 'Bilhete restaurado com sucesso', - 'deleted_ticket' => 'Bilhete apagado com sucesso', 'open' => 'Aberto', 'new' => 'Novo', 'closed' => 'Fechado', @@ -2908,14 +2895,6 @@ debitar da sua conta de acordo com essas instruções. Está elegível a um reem 'assigned_to' => 'Atribuído para', 'reply' => 'Responder', 'awaiting_reply' => 'Aguarda Resposta', - 'ticket_close' => 'Fechar Bilhete', - 'ticket_reopen' => 'Reabrir Bilhete', - 'ticket_open' => 'Abrir Bilhete', - 'ticket_split' => 'Dividir Bilhete', - 'ticket_merge' => 'Unir Bilhete', - 'ticket_update' => 'Atualizar Bilhete', - 'ticket_settings' => 'Configurações do Bilhete', - 'updated_ticket' => 'Bilhete Atualizado', 'mark_spam' => 'Marcar como Spam', 'local_part' => 'Parte Local', 'local_part_unavailable' => 'Nome indisponível', @@ -2933,31 +2912,23 @@ debitar da sua conta de acordo com essas instruções. Está elegível a um reem 'mime_types' => 'Tipos MIME', 'mime_types_placeholder' => '.pdf , .docx , .jpg', 'mime_types_help' => 'Lista separada por vírgulas de tipos MIME permitidos, deixe em branco para TODOS', + 'ticket_number_start_help' => 'Ticket number must be greater than the current ticket number', + 'new_ticket_template_id' => 'New ticket', + 'new_ticket_autoresponder_help' => 'Selecting a template will send an auto response to a client/contact when a new ticket is created', + 'update_ticket_template_id' => 'Updated ticket', + 'update_ticket_autoresponder_help' => 'Selecting a template will send an auto response to a client/contact when a ticket is updated', + 'close_ticket_template_id' => 'Closed ticket', + 'close_ticket_autoresponder_help' => 'Selecting a template will send an auto response to a client/contact when a ticket is closed', 'default_priority' => 'Prioridade Padrão', 'alert_new_comment_id' => 'Novo comentário', - 'alert_comment_ticket_help' => 'Selecionar um modelo enviará uma notificação (para um agente) quando um novo comentário for feito.', - 'alert_comment_ticket_email_help' => 'E-mails separados por vírgulas para bcc após um novo comentário.', - 'new_ticket_notification_list' => 'Notificações adicionais de novo bilhete', 'update_ticket_notification_list' => 'Notificações adicionais de novo comentário', 'comma_separated_values' => 'admin@example.com, supervisor@example.com', - 'alert_ticket_assign_agent_id' => 'Atribuição de Bilhete', - 'alert_ticket_assign_agent_id_hel' => 'Selecionar um modelo enviará uma notificação (para um agente) quando um bilhete for atribuído.', - 'alert_ticket_assign_agent_id_notifications' => 'Notificações adicionais de bilhete atribuído', - 'alert_ticket_assign_agent_id_help' => 'E-mails separados por vírgulas para bcc após atribuição de bilhete.', - 'alert_ticket_transfer_email_help' => 'Emails separados por vírgulas para bcc após transferência de bilhete.', - 'alert_ticket_overdue_agent_id' => 'Atraso de Bilhete', - 'alert_ticket_overdue_email' => 'Notificações adicionais de ticket atrasado', - 'alert_ticket_overdue_email_help' => 'Emails separados por vírgulas para bcc após atraso de ticket. ', - 'alert_ticket_overdue_agent_id_help' => 'Selecionar um modelo enviará uma notificação (para um agente) quando um ticket atrasar. ', 'default_agent' => 'Agente Padrão', 'default_agent_help' => 'Se selecionado irá automaticamente ser selecionado para todos os tickets entrantes', 'show_agent_details' => 'Exibir detalhes do agente nas respostas', 'avatar' => 'Avatar', 'remove_avatar' => 'Remover avatar', - 'ticket_not_found' => 'Ticket não encontrado', 'add_template' => 'Adicionar Modelo', - 'updated_ticket_template' => 'Modelo de Ticket Atualizado', - 'created_ticket_template' => 'Modelo de Ticket Criado', 'archive_ticket_template' => 'Arquivar Modelo', 'restore_ticket_template' => 'Restaurar Modelo', 'archived_ticket_template' => 'Modelo arquivado com sucesso', @@ -3814,7 +3785,7 @@ debitar da sua conta de acordo com essas instruções. Está elegível a um reem 'entity_number_placeholder' => ':entity # :entity_number', 'email_link_not_working' => 'Se o botão acima não estiver a funcionar, por favor carregue neste link', 'display_log' => 'Mostrar Log', - 'send_fail_logs_to_our_server' => 'Reportar erros em direto', + 'send_fail_logs_to_our_server' => 'Report errors to help improve the app', 'setup' => 'Configurar', 'quick_overview_statistics' => 'Visão Rápida & Estatísticas', 'update_your_personal_info' => 'Atualize a sua informação pessoal', @@ -5303,6 +5274,33 @@ O envio de E-mails foi suspenso. Será retomado às 23:00 UTC.', 'currency_bhutan_ngultrum' => 'Bhutan Ngultrum', 'end_of_month' => 'End Of Month', 'merge_e_invoice_to_pdf' => 'Merge E-Invoice and PDF', + 'task_assigned_subject' => 'New task assignment [Task :task] [ :date ]', + 'task_assigned_body' => 'You have been assigned task :task

Description: :description

Client: :client', + 'activity_141' => 'User :user entered note: :notes', + 'quote_reminder_subject' => 'Reminder: Quote :quote from :company', + 'quote_reminder_message' => 'Reminder for quote :number for :amount', + 'quote_reminder1' => 'First Quote Reminder', + 'before_valid_until_date' => 'Before the valid until date', + 'after_valid_until_date' => 'After the valid until date', + 'after_quote_date' => 'After the quote date', + 'remind_quote' => 'Remind Quote', + 'end_of_month' => 'End Of Month', + 'tax_currency_mismatch' => 'Tax currency is different from invoice currency', + 'edocument_import_already_exists' => 'The invoice has already been imported on :date', + 'before_valid_until' => 'Before the valid until', + 'after_valid_until' => 'After the valid until', + 'task_assigned_notification' => 'Task Assigned Notification', + 'task_assigned_notification_help' => 'Send an email when a task is assigned', + 'invoices_locked_end_of_month' => 'Invoices are locked at the end of the month', + 'referral_url' => 'Referral URL', + 'add_comment' => 'Add Comment', + 'added_comment' => 'Successfully saved comment', + 'tickets' => 'Tickets', + 'assigned_group' => 'Successfully assigned group', + 'merge_to_pdf' => 'Merge to PDF', + 'latest_requires_php_version' => 'Note: the latest version requires PHP :version', + 'auto_expand_product_table_notes' => 'Automatically expand products table notes', + 'auto_expand_product_table_notes_help' => 'Automatically expands the notes section within the products table to display more lines.', ); -return $lang; \ No newline at end of file +return $lang; diff --git a/lang/ro/texts.php b/lang/ro/texts.php index 268f088212ca..7009c2fbda99 100644 --- a/lang/ro/texts.php +++ b/lang/ro/texts.php @@ -2364,7 +2364,7 @@ Odată ce sumele au ajuns la dumneavoastră, reveniți la pagina cu metode de pl 'currency_gold_troy_ounce' => 'Uncie Troy de aur', 'currency_nicaraguan_córdoba' => 'Córdoba din Nicaragua', 'currency_malagasy_ariary' => 'ariar malgaș', - "currency_tongan_pa_anga" => "Tongan Pa'anga", + "currency_tongan_paanga" => "Tongan Pa'anga", 'review_app_help' => 'Sperăm că vă place aplicația.
Am aprecia dacă :link!', 'writing_a_review' => 'părerea dumneavoastră', @@ -2881,19 +2881,6 @@ Odată ce sumele au ajuns la dumneavoastră, reveniți la pagina cu metode de pl 'refunded' => 'Rambursată', 'marked_quote_as_sent' => 'Oferta a fost marcată cu succes ca trimisă ', 'custom_module_settings' => 'Setări personalizate pentru modul', - 'ticket' => 'Tichet', - 'tickets' => 'Tichete', - 'ticket_number' => 'Tichet #', - 'new_ticket' => 'Un tichet nou', - 'edit_ticket' => 'Modificați tichet', - 'view_ticket' => 'Vizualizare tichet', - 'archive_ticket' => 'Arhivați tichet', - 'restore_ticket' => 'Restabiliți tichet', - 'delete_ticket' => 'Sterge tichet', - 'archived_ticket' => 'Tichet arhivat cu succes', - 'archived_tickets' => 'Tichetele au fost arhivate cu succes', - 'restored_ticket' => 'Tichetele au fost restabilite cu succes', - 'deleted_ticket' => 'Tichet sters cu succes', 'open' => 'Deschideți', 'new' => 'Nou', 'closed' => 'Inchis', @@ -2910,14 +2897,6 @@ Odată ce sumele au ajuns la dumneavoastră, reveniți la pagina cu metode de pl 'assigned_to' => 'Asignare lui', 'reply' => 'Raspuns', 'awaiting_reply' => 'In asteptare raspuns', - 'ticket_close' => 'Inchide tichet', - 'ticket_reopen' => 'Redeschide tichet', - 'ticket_open' => 'Deschide tichet', - 'ticket_split' => 'Imparte tichet', - 'ticket_merge' => 'Îmbinați tichet', - 'ticket_update' => 'Actualizeaza tichet', - 'ticket_settings' => 'Configuratie tichet', - 'updated_ticket' => 'Tichet actualizat', 'mark_spam' => 'Marcheaza ca SPAM', 'local_part' => 'Parte locală', 'local_part_unavailable' => 'Numele este utilizat deja', @@ -2935,31 +2914,23 @@ Odată ce sumele au ajuns la dumneavoastră, reveniți la pagina cu metode de pl 'mime_types' => 'Tipuri de Mime', 'mime_types_placeholder' => '.pdf , .docx, .jpg', 'mime_types_help' => 'Listă separață prin virgule pentru tipuri de Mime permise. Nu scrieți nimic, pentru a selecta totul', + 'ticket_number_start_help' => 'Ticket number must be greater than the current ticket number', + 'new_ticket_template_id' => 'New ticket', + 'new_ticket_autoresponder_help' => 'Selecting a template will send an auto response to a client/contact when a new ticket is created', + 'update_ticket_template_id' => 'Updated ticket', + 'update_ticket_autoresponder_help' => 'Selecting a template will send an auto response to a client/contact when a ticket is updated', + 'close_ticket_template_id' => 'Closed ticket', + 'close_ticket_autoresponder_help' => 'Selecting a template will send an auto response to a client/contact when a ticket is closed', 'default_priority' => 'Prioritate implicita', 'alert_new_comment_id' => 'Comentariu nou', - 'alert_comment_ticket_help' => 'Selectarea unui sablon va trimite o notificare ( agentului ) cand apare un comentariu nou.', - 'alert_comment_ticket_email_help' => 'Email-uri separate prin virgule pentru BCC în comentarii noi.', - 'new_ticket_notification_list' => 'Notificare pentru tichete aditionale', 'update_ticket_notification_list' => 'Notificări adiționale pentru comentarii noi', 'comma_separated_values' => 'admin@exemplu.com, supervizor@exemplu.com', - 'alert_ticket_assign_agent_id' => 'Alocare tichet', - 'alert_ticket_assign_agent_id_hel' => 'Selectând un șablon, veți trimite o notificare (agentului), când este atribuit un tichet. ', - 'alert_ticket_assign_agent_id_notifications' => 'Notificări adiționale pentru tichetele atribuite', - 'alert_ticket_assign_agent_id_help' => 'Email-uri separate prin virgule pentru BCC în evaluarea tichetelor.', - 'alert_ticket_transfer_email_help' => 'Email-uri separate prin virgule pentru BCC în trasferul de tichete.', - 'alert_ticket_overdue_agent_id' => 'Tichet scadent', - 'alert_ticket_overdue_email' => 'Notificări adiționale pentru tichetele scadente', - 'alert_ticket_overdue_email_help' => 'Email-uri separate prin virgule pentru BCC în tichete scadente.', - 'alert_ticket_overdue_agent_id_help' => 'Selectând un șablon, veți trimite o notificare (agentului), când un tichet a trecut de data limită.', 'default_agent' => 'Agent implicit', 'default_agent_help' => 'Dacă este selectat, va atribui automat toate tichetele', 'show_agent_details' => 'Afișați detaliile agenților în răspunsuri', 'avatar' => 'Avatar', 'remove_avatar' => 'Îndepărtați avatar', - 'ticket_not_found' => 'Tichetul nu a fost găsit', 'add_template' => 'Adăugați un șablon', - 'updated_ticket_template' => 'Actualizați șablonul pentru tichete', - 'created_ticket_template' => 'Creați un șablon pentru tichete', 'archive_ticket_template' => 'Arhivați șablonul', 'restore_ticket_template' => 'Restabiliți șablonul', 'archived_ticket_template' => 'Șablonul a fost arhivat cu succes', @@ -3816,7 +3787,7 @@ Odată ce sumele au ajuns la dumneavoastră, reveniți la pagina cu metode de pl 'entity_number_placeholder' => ':entity # :entity_number', 'email_link_not_working' => 'În cazul în care nu funcționează butonul de mai sus, accesați link-ul', 'display_log' => 'Afișați înregistrările', - 'send_fail_logs_to_our_server' => 'Raportare erori în timp real', + 'send_fail_logs_to_our_server' => 'Report errors to help improve the app', 'setup' => 'Configurare', 'quick_overview_statistics' => 'Prezentare rapidă și statistici', 'update_your_personal_info' => 'Actualizați-vă informațiile', @@ -5304,6 +5275,33 @@ Odată ce sumele au ajuns la dumneavoastră, reveniți la pagina cu metode de pl 'currency_bhutan_ngultrum' => 'Bhutan Ngultrum', 'end_of_month' => 'End Of Month', 'merge_e_invoice_to_pdf' => 'Merge E-Invoice and PDF', + 'task_assigned_subject' => 'New task assignment [Task :task] [ :date ]', + 'task_assigned_body' => 'You have been assigned task :task

Description: :description

Client: :client', + 'activity_141' => 'User :user entered note: :notes', + 'quote_reminder_subject' => 'Reminder: Quote :quote from :company', + 'quote_reminder_message' => 'Reminder for quote :number for :amount', + 'quote_reminder1' => 'First Quote Reminder', + 'before_valid_until_date' => 'Before the valid until date', + 'after_valid_until_date' => 'After the valid until date', + 'after_quote_date' => 'After the quote date', + 'remind_quote' => 'Remind Quote', + 'end_of_month' => 'End Of Month', + 'tax_currency_mismatch' => 'Tax currency is different from invoice currency', + 'edocument_import_already_exists' => 'The invoice has already been imported on :date', + 'before_valid_until' => 'Before the valid until', + 'after_valid_until' => 'After the valid until', + 'task_assigned_notification' => 'Task Assigned Notification', + 'task_assigned_notification_help' => 'Send an email when a task is assigned', + 'invoices_locked_end_of_month' => 'Invoices are locked at the end of the month', + 'referral_url' => 'Referral URL', + 'add_comment' => 'Add Comment', + 'added_comment' => 'Successfully saved comment', + 'tickets' => 'Tickets', + 'assigned_group' => 'Successfully assigned group', + 'merge_to_pdf' => 'Merge to PDF', + 'latest_requires_php_version' => 'Note: the latest version requires PHP :version', + 'auto_expand_product_table_notes' => 'Automatically expand products table notes', + 'auto_expand_product_table_notes_help' => 'Automatically expands the notes section within the products table to display more lines.', ); -return $lang; \ No newline at end of file +return $lang; diff --git a/lang/sk/texts.php b/lang/sk/texts.php index 5f001c7e7359..99c3c792dc85 100644 --- a/lang/sk/texts.php +++ b/lang/sk/texts.php @@ -2351,7 +2351,7 @@ $lang = array( 'currency_gold_troy_ounce' => 'Zlatá trójska unca', 'currency_nicaraguan_córdoba' => 'Nikaragujská Córdoba', 'currency_malagasy_ariary' => 'Madagaskarský ariár', - "currency_tongan_pa_anga" => "Tongan Pa'anga", + "currency_tongan_paanga" => "Tongan Pa'anga", 'review_app_help' => 'Dúfame, že sa vám používanie aplikácie páči.
Ak by ste zvážili :link, veľmi by sme to ocenili!', 'writing_a_review' => 'písanie recenzie', @@ -2867,19 +2867,6 @@ $lang = array( 'refunded' => 'Vrátené', 'marked_quote_as_sent' => 'Ponuka bola úspešne označená ako odoslaná', 'custom_module_settings' => 'Vlastné nastavenia modulu', - 'ticket' => 'Tiket', - 'tickets' => 'Tikety', - 'ticket_number' => 'Tiket #', - 'new_ticket' => 'Nový tiket', - 'edit_ticket' => 'Upraviť tiket', - 'view_ticket' => 'Zobraziť tiket', - 'archive_ticket' => 'Archivovať tiket', - 'restore_ticket' => 'Obnoviť tiket', - 'delete_ticket' => 'Zmazať tiket', - 'archived_ticket' => 'Tiket úspešne archivovaný', - 'archived_tickets' => 'Tikety úspešne archivované', - 'restored_ticket' => 'Tiket úspešne obnovený', - 'deleted_ticket' => 'Tiket úspešne odstránený', 'open' => 'Otvoriť', 'new' => 'Nový', 'closed' => 'Zavretý', @@ -2896,14 +2883,6 @@ $lang = array( 'assigned_to' => 'Priradený', 'reply' => 'Odpovedať', 'awaiting_reply' => 'Čaká sa na odpoveď', - 'ticket_close' => 'Zatvoriť tiket', - 'ticket_reopen' => 'Znovu otvoriť tiket', - 'ticket_open' => 'Otvoriť tiket', - 'ticket_split' => 'Rozdeliť tiket', - 'ticket_merge' => 'Zlúčiť tiket', - 'ticket_update' => 'Aktualizovať tiket', - 'ticket_settings' => 'Nastavenia tiketu', - 'updated_ticket' => 'Tiket bol aktualizovaný', 'mark_spam' => 'Označiť ako spam', 'local_part' => 'Miestna časť', 'local_part_unavailable' => 'Meno je už obsadené', @@ -2921,31 +2900,23 @@ $lang = array( 'mime_types' => 'Mime typy', 'mime_types_placeholder' => '.pdf, .docx, .jpg', 'mime_types_help' => 'Čiarkami oddelený zoznam povolených typov MIME, ponechajte prázdne pre všetky', + 'ticket_number_start_help' => 'Ticket number must be greater than the current ticket number', + 'new_ticket_template_id' => 'New ticket', + 'new_ticket_autoresponder_help' => 'Selecting a template will send an auto response to a client/contact when a new ticket is created', + 'update_ticket_template_id' => 'Updated ticket', + 'update_ticket_autoresponder_help' => 'Selecting a template will send an auto response to a client/contact when a ticket is updated', + 'close_ticket_template_id' => 'Closed ticket', + 'close_ticket_autoresponder_help' => 'Selecting a template will send an auto response to a client/contact when a ticket is closed', 'default_priority' => 'Predvolená priorita', 'alert_new_comment_id' => 'Nový komentár', - 'alert_comment_ticket_help' => 'Výberom šablóny sa odošle upozornenie (agentovi) po vytvorení komentára.', - 'alert_comment_ticket_email_help' => 'E-maily oddelené čiarkami na skrytú kópiu nového komentára.', - 'new_ticket_notification_list' => 'Ďalšie upozornenia na nové tikety', 'update_ticket_notification_list' => 'Ďalšie upozornenia na nové komentáre', 'comma_separated_values' => 'admin@example.com, supervisor@example.com', - 'alert_ticket_assign_agent_id' => 'Priradenie tiketu', - 'alert_ticket_assign_agent_id_hel' => 'Výberom šablóny sa po priradení tiketu odošle upozornenie (agentovi).', - 'alert_ticket_assign_agent_id_notifications' => 'Ďalšie upozornenia o pridelení tiketu', - 'alert_ticket_assign_agent_id_help' => 'E-maily oddelené čiarkami na skrytú kópiu pri priradení lístka.', - 'alert_ticket_transfer_email_help' => 'E-maily oddelené čiarkami na skrytú kópiu pri prevode lístka.', - 'alert_ticket_overdue_agent_id' => 'Tiket po splatnosti', - 'alert_ticket_overdue_email' => 'Ďalšie upozornenia na tikety po splatnosti', - 'alert_ticket_overdue_email_help' => 'E-maily oddelené čiarkami na skrytú kópiu na lístku po splatnosti.', - 'alert_ticket_overdue_agent_id_help' => 'Výberom šablóny sa odošle upozornenie (agentovi), keď sa tiket bude po splatnosti.', 'default_agent' => 'Predvolený agent', 'default_agent_help' => 'Ak je vybraté, bude automaticky priradené ku všetkým prichádzajúcim tiketom', 'show_agent_details' => 'Zobraziť podrobnosti o agentovi v odpovediach', 'avatar' => 'Avatar', 'remove_avatar' => 'Odstrániť avatara', - 'ticket_not_found' => 'Tiket sa nenašiel', 'add_template' => 'Pridať šablónu', - 'updated_ticket_template' => 'Aktualizovaná šablóna tiketu', - 'created_ticket_template' => 'Vytvorená šablóna tiketu', 'archive_ticket_template' => 'Archivovať šablónu', 'restore_ticket_template' => 'Obnoviť šablónu', 'archived_ticket_template' => 'Šablóna úspešne archivovaná', @@ -3802,7 +3773,7 @@ $lang = array( 'entity_number_placeholder' => ':entity # :entity_number', 'email_link_not_working' => 'Ak vám vyššie uvedené tlačidlo nefunguje, kliknite na odkaz', 'display_log' => 'Zobraziť denník', - 'send_fail_logs_to_our_server' => 'Hlásiť chyby v reálnom čase', + 'send_fail_logs_to_our_server' => 'Report errors to help improve the app', 'setup' => 'Nastaviť', 'quick_overview_statistics' => 'Rýchly prehľad a štatistiky', 'update_your_personal_info' => 'Aktualizujte svoje osobné údaje', @@ -5290,6 +5261,33 @@ $lang = array( 'currency_bhutan_ngultrum' => 'Bhutan Ngultrum', 'end_of_month' => 'End Of Month', 'merge_e_invoice_to_pdf' => 'Merge E-Invoice and PDF', + 'task_assigned_subject' => 'New task assignment [Task :task] [ :date ]', + 'task_assigned_body' => 'You have been assigned task :task

Description: :description

Client: :client', + 'activity_141' => 'User :user entered note: :notes', + 'quote_reminder_subject' => 'Reminder: Quote :quote from :company', + 'quote_reminder_message' => 'Reminder for quote :number for :amount', + 'quote_reminder1' => 'First Quote Reminder', + 'before_valid_until_date' => 'Before the valid until date', + 'after_valid_until_date' => 'After the valid until date', + 'after_quote_date' => 'After the quote date', + 'remind_quote' => 'Remind Quote', + 'end_of_month' => 'End Of Month', + 'tax_currency_mismatch' => 'Tax currency is different from invoice currency', + 'edocument_import_already_exists' => 'The invoice has already been imported on :date', + 'before_valid_until' => 'Before the valid until', + 'after_valid_until' => 'After the valid until', + 'task_assigned_notification' => 'Task Assigned Notification', + 'task_assigned_notification_help' => 'Send an email when a task is assigned', + 'invoices_locked_end_of_month' => 'Invoices are locked at the end of the month', + 'referral_url' => 'Referral URL', + 'add_comment' => 'Add Comment', + 'added_comment' => 'Successfully saved comment', + 'tickets' => 'Tickets', + 'assigned_group' => 'Successfully assigned group', + 'merge_to_pdf' => 'Merge to PDF', + 'latest_requires_php_version' => 'Note: the latest version requires PHP :version', + 'auto_expand_product_table_notes' => 'Automatically expand products table notes', + 'auto_expand_product_table_notes_help' => 'Automatically expands the notes section within the products table to display more lines.', ); -return $lang; \ No newline at end of file +return $lang; diff --git a/lang/sr/texts.php b/lang/sr/texts.php index 03d8ab5136f5..62a764bd0b21 100644 --- a/lang/sr/texts.php +++ b/lang/sr/texts.php @@ -2364,7 +2364,7 @@ Kada budete imali iznose, vratite se na ovu stranicu sa načinima plaćanja i k 'currency_gold_troy_ounce' => 'Gold Troy Ounce', 'currency_nicaraguan_córdoba' => 'Nicaraguan Córdoba', 'currency_malagasy_ariary' => 'Malagasy ariary', - "currency_tongan_pa_anga" => "Tongan Pa'anga", + "currency_tongan_paanga" => "Tongan Pa'anga", 'review_app_help' => 'Nadamo se da uživate u korišćenju aplikacije.
Bili bismo veoma zahvalni ako biste razmotrili :link.', 'writing_a_review' => 'pisanje recenzije', @@ -2880,19 +2880,6 @@ Kada budete imali iznose, vratite se na ovu stranicu sa načinima plaćanja i k 'refunded' => 'Refundirano', 'marked_quote_as_sent' => 'Ponuda uspešno obeležena kao poslata', 'custom_module_settings' => 'Podešavanje dodatnih modula', - 'ticket' => 'Tiket', - 'tickets' => 'Tiketi', - 'ticket_number' => 'Tiket #', - 'new_ticket' => 'Novi tiket', - 'edit_ticket' => 'Izmeni tiket', - 'view_ticket' => 'Vidi tiket', - 'archive_ticket' => 'Arhiviraj tiket', - 'restore_ticket' => 'Vrati tiket', - 'delete_ticket' => 'Obriši tiket', - 'archived_ticket' => 'Tiket uspešno arhiviran', - 'archived_tickets' => 'Uspešno arhivirani tiketi', - 'restored_ticket' => 'Uspešno vraćen tiket', - 'deleted_ticket' => 'Uspešno obrisan tiket', 'open' => 'Otvori', 'new' => 'Novi', 'closed' => 'Zatvoreno', @@ -2909,14 +2896,6 @@ Kada budete imali iznose, vratite se na ovu stranicu sa načinima plaćanja i k 'assigned_to' => 'Dodeljeno za', 'reply' => 'Odgovor', 'awaiting_reply' => 'Čekanje odgovora', - 'ticket_close' => 'Zatvori tiket', - 'ticket_reopen' => 'Ponovo otvori tiket', - 'ticket_open' => 'Otvori tiket', - 'ticket_split' => 'Razdvoji tiket', - 'ticket_merge' => 'Spoji tiket', - 'ticket_update' => 'Ažuriraj tiket', - 'ticket_settings' => 'Podešavanje tiketa', - 'updated_ticket' => 'Tiket ažuriran', 'mark_spam' => 'Obeleži kao nepoželjno', 'local_part' => 'Lokalni deo', 'local_part_unavailable' => 'Ime zauzeto', @@ -2934,31 +2913,23 @@ Kada budete imali iznose, vratite se na ovu stranicu sa načinima plaćanja i k 'mime_types' => 'Dozvoljeni tipovi', 'mime_types_placeholder' => '.pdf , .docx, .jpg', 'mime_types_help' => 'Lista dozvoljenih tipova fajlova odvojenih zarezom, ostavite prazno za sve', + 'ticket_number_start_help' => 'Ticket number must be greater than the current ticket number', + 'new_ticket_template_id' => 'New ticket', + 'new_ticket_autoresponder_help' => 'Selecting a template will send an auto response to a client/contact when a new ticket is created', + 'update_ticket_template_id' => 'Updated ticket', + 'update_ticket_autoresponder_help' => 'Selecting a template will send an auto response to a client/contact when a ticket is updated', + 'close_ticket_template_id' => 'Closed ticket', + 'close_ticket_autoresponder_help' => 'Selecting a template will send an auto response to a client/contact when a ticket is closed', 'default_priority' => 'Podrazumevani prioritet', 'alert_new_comment_id' => 'Novi komentar', - 'alert_comment_ticket_help' => 'Izborom šablona će se poslati obaveštenje (agentu) prilikom unosa komentara.', - 'alert_comment_ticket_email_help' => 'Adrese e-pošte za slanje bcc kopija prilikom unosa komentara, odvojene zarezom', - 'new_ticket_notification_list' => 'Dodatna obaveštenja od novom tiketu', 'update_ticket_notification_list' => 'Dodatna obaveštenja o novom komentaru', 'comma_separated_values' => 'admin@example.com, supervisor@example.com', - 'alert_ticket_assign_agent_id' => 'Dodela tiketa', - 'alert_ticket_assign_agent_id_hel' => 'Izborom šablona će se poslati obaveštenje (agentu) prilikom dodeljivanja tiketa.', - 'alert_ticket_assign_agent_id_notifications' => 'Dodatna obaveštenja o dodeljivanju tiketa', - 'alert_ticket_assign_agent_id_help' => 'Adrese e-pošte za slanje bcc kopija prilikom dodeljivanja tiketa, odvojene zarezom', - 'alert_ticket_transfer_email_help' => 'Adrese e-pošte za slanje bcc kopija prilikom prenosa tiketa, odvojene zarezom', - 'alert_ticket_overdue_agent_id' => 'Zakasneo tiket', - 'alert_ticket_overdue_email' => 'Dodatna obaveštenja o zakasnelim tiketima', - 'alert_ticket_overdue_email_help' => 'Adrese e-pošte za slanje bcc kopija prilikom zakasnelog tiketa, odvojene zarezom', - 'alert_ticket_overdue_agent_id_help' => 'Izborom šablona će se poslati obaveštenje (agentu) kada je tiket zakasneo.', 'default_agent' => 'Podrazumevani agent', 'default_agent_help' => 'Ako se izabere, biće automatski dodeljen za sve dolazeće tikete', 'show_agent_details' => 'Prikaži detalje agenta u odgovorima', 'avatar' => 'Avatar', 'remove_avatar' => 'Ukloni avatar', - 'ticket_not_found' => 'Tiket nije pronađen', 'add_template' => 'Dodaj šablon', - 'updated_ticket_template' => 'Šablon tiketa ažuriran', - 'created_ticket_template' => 'Šablon tiketa kreiran', 'archive_ticket_template' => 'Arhiviraj šablon', 'restore_ticket_template' => 'Vrati šablon', 'archived_ticket_template' => 'Uspešno arhiviran šablon', @@ -3815,7 +3786,7 @@ Kada budete imali iznose, vratite se na ovu stranicu sa načinima plaćanja i k 'entity_number_placeholder' => ':entity # :entity_number', 'email_link_not_working' => 'Ako vam gornje dugme ne odgovara, kliknite na link', 'display_log' => 'Prikaži zapis', - 'send_fail_logs_to_our_server' => 'Prijavite greške u realnom vremenu', + 'send_fail_logs_to_our_server' => 'Report errors to help improve the app', 'setup' => 'Podesiti', 'quick_overview_statistics' => 'Brzi pregled i statistika', 'update_your_personal_info' => 'Ažurirajte svoje lične podatke', @@ -5303,6 +5274,33 @@ Kada budete imali iznose, vratite se na ovu stranicu sa načinima plaćanja i k 'currency_bhutan_ngultrum' => 'Bhutan Ngultrum', 'end_of_month' => 'End Of Month', 'merge_e_invoice_to_pdf' => 'Merge E-Invoice and PDF', + 'task_assigned_subject' => 'New task assignment [Task :task] [ :date ]', + 'task_assigned_body' => 'You have been assigned task :task

Description: :description

Client: :client', + 'activity_141' => 'User :user entered note: :notes', + 'quote_reminder_subject' => 'Reminder: Quote :quote from :company', + 'quote_reminder_message' => 'Reminder for quote :number for :amount', + 'quote_reminder1' => 'First Quote Reminder', + 'before_valid_until_date' => 'Before the valid until date', + 'after_valid_until_date' => 'After the valid until date', + 'after_quote_date' => 'After the quote date', + 'remind_quote' => 'Remind Quote', + 'end_of_month' => 'End Of Month', + 'tax_currency_mismatch' => 'Tax currency is different from invoice currency', + 'edocument_import_already_exists' => 'The invoice has already been imported on :date', + 'before_valid_until' => 'Before the valid until', + 'after_valid_until' => 'After the valid until', + 'task_assigned_notification' => 'Task Assigned Notification', + 'task_assigned_notification_help' => 'Send an email when a task is assigned', + 'invoices_locked_end_of_month' => 'Invoices are locked at the end of the month', + 'referral_url' => 'Referral URL', + 'add_comment' => 'Add Comment', + 'added_comment' => 'Successfully saved comment', + 'tickets' => 'Tickets', + 'assigned_group' => 'Successfully assigned group', + 'merge_to_pdf' => 'Merge to PDF', + 'latest_requires_php_version' => 'Note: the latest version requires PHP :version', + 'auto_expand_product_table_notes' => 'Automatically expand products table notes', + 'auto_expand_product_table_notes_help' => 'Automatically expands the notes section within the products table to display more lines.', ); -return $lang; \ No newline at end of file +return $lang; diff --git a/lang/sv/texts.php b/lang/sv/texts.php index b0a95827aad1..f387edc721b1 100644 --- a/lang/sv/texts.php +++ b/lang/sv/texts.php @@ -2372,7 +2372,7 @@ Den här funktionen kräver att en produkt skapas och en betalningsgateway är k 'currency_gold_troy_ounce' => 'Guld Troy Ounce', 'currency_nicaraguan_córdoba' => 'Nicaraguanska Córdoba', 'currency_malagasy_ariary' => 'Madagaskar ariary', - "currency_tongan_pa_anga" => "tonganska Pa'anga", + "currency_tongan_paanga" => "Tongan Pa'anga", 'review_app_help' => 'We hope you\'re enjoying using the app.
If you\'d consider :link we\'d greatly appreciate it!', 'writing_a_review' => 'writing a review', @@ -2888,19 +2888,6 @@ Den här funktionen kräver att en produkt skapas och en betalningsgateway är k 'refunded' => 'Återbetalad', 'marked_quote_as_sent' => 'Offerten har markerats som skickad', 'custom_module_settings' => 'Anpassade modulinställningar', - 'ticket' => 'Ärende', - 'tickets' => 'Ärenden', - 'ticket_number' => 'Ärende #', - 'new_ticket' => 'Skapa ärende', - 'edit_ticket' => 'Redigera ärende', - 'view_ticket' => 'Visa ärende', - 'archive_ticket' => 'Arkivera ärende', - 'restore_ticket' => 'Återskapa ärende', - 'delete_ticket' => 'Radera ärende', - 'archived_ticket' => 'Ärende har arkiverats', - 'archived_tickets' => 'Ärendena har arkiverats', - 'restored_ticket' => 'Ärendet har återställts', - 'deleted_ticket' => 'Ärendena har återställts', 'open' => 'Öppna', 'new' => 'Ny', 'closed' => 'Stängd', @@ -2917,14 +2904,6 @@ Den här funktionen kräver att en produkt skapas och en betalningsgateway är k 'assigned_to' => 'Tilldelat till', 'reply' => 'Svara', 'awaiting_reply' => 'Väntar på svar', - 'ticket_close' => 'Stäng ärende', - 'ticket_reopen' => 'Återöppna ärende', - 'ticket_open' => 'Öppna ärende', - 'ticket_split' => 'Dela ärende', - 'ticket_merge' => 'Slå ihop ärende', - 'ticket_update' => 'Uppdatera ärende', - 'ticket_settings' => 'Ärendeinställningar', - 'updated_ticket' => 'Ärende uppdaterat', 'mark_spam' => 'Markera som spam', 'local_part' => 'Lokal del', 'local_part_unavailable' => 'Namn upptaget', @@ -2942,31 +2921,23 @@ Den här funktionen kräver att en produkt skapas och en betalningsgateway är k 'mime_types' => 'Mimetyper', 'mime_types_placeholder' => '.pdf , .docx, .jpg', 'mime_types_help' => 'Kommaseparerad lista över tillåtna mimetyper, lämna tomt för alla', + 'ticket_number_start_help' => 'Ticket number must be greater than the current ticket number', + 'new_ticket_template_id' => 'New ticket', + 'new_ticket_autoresponder_help' => 'Selecting a template will send an auto response to a client/contact when a new ticket is created', + 'update_ticket_template_id' => 'Updated ticket', + 'update_ticket_autoresponder_help' => 'Selecting a template will send an auto response to a client/contact when a ticket is updated', + 'close_ticket_template_id' => 'Closed ticket', + 'close_ticket_autoresponder_help' => 'Selecting a template will send an auto response to a client/contact when a ticket is closed', 'default_priority' => 'Standardprioritet', 'alert_new_comment_id' => 'Ny kommentar', - 'alert_comment_ticket_help' => 'När du väljer en mall skickas ett meddelande (till agenten) när en kommentar görs.', - 'alert_comment_ticket_email_help' => 'Kommaseparerade e-postadresser till bcc på ny kommentar.', - 'new_ticket_notification_list' => 'Ytterligare nya ärende notifikationer', 'update_ticket_notification_list' => 'Ytterligare nya kommentarer notifikationer', 'comma_separated_values' => 'admin@example.com, supervisor@example.com', - 'alert_ticket_assign_agent_id' => 'Tilldelning av ärenden', - 'alert_ticket_assign_agent_id_hel' => 'När du väljer en mall skickas ett meddelande (till agenten) när ett ärende tilldelas.', - 'alert_ticket_assign_agent_id_notifications' => 'Ytterligare ärende tilldelats notifikationer', - 'alert_ticket_assign_agent_id_help' => 'Kommaseparerade e-postadresser till bcc vid tilldelning av ärende.', - 'alert_ticket_transfer_email_help' => 'Kommaseparerade e-postadresser till bcc vid överföring av ärende.', - 'alert_ticket_overdue_agent_id' => 'Ärende försenat', - 'alert_ticket_overdue_email' => 'Ytterligare ärende försenat notifikationer', - 'alert_ticket_overdue_email_help' => 'Kommaseparerade e-postadresser till bcc vid försening av ärende.', - 'alert_ticket_overdue_agent_id_help' => 'När du väljer en mall skickas ett meddelande (till agenten) när ett ärende blir försenat.', 'default_agent' => 'Standardagent', 'default_agent_help' => 'Om det väljs kommer alla inkommande ärenden automatiskt att tilldelas', 'show_agent_details' => 'Visa agentinformation vid svar', 'avatar' => 'Avatar', 'remove_avatar' => 'Ta bort avatar', - 'ticket_not_found' => 'Ärendet hittades inte', 'add_template' => 'Lägg till mall', - 'updated_ticket_template' => 'Uppdaterad ärendemall', - 'created_ticket_template' => 'Skapad ärendemall', 'archive_ticket_template' => 'Akrivera mall', 'restore_ticket_template' => 'Återställ ärendemall', 'archived_ticket_template' => 'Mallen har arkiverats', @@ -3823,7 +3794,7 @@ Den här funktionen kräver att en produkt skapas och en betalningsgateway är k 'entity_number_placeholder' => ':entity # :entity_number', 'email_link_not_working' => 'Om knappen ovan inte fungerar för dig, klicka på länken', 'display_log' => 'Visa logg', - 'send_fail_logs_to_our_server' => 'Rapportera fel i realtid', + 'send_fail_logs_to_our_server' => 'Report errors to help improve the app', 'setup' => 'Installation', 'quick_overview_statistics' => 'Snabb översikt och statistik', 'update_your_personal_info' => 'Uppdatera din personliga information', @@ -5311,6 +5282,33 @@ Den här funktionen kräver att en produkt skapas och en betalningsgateway är k 'currency_bhutan_ngultrum' => 'Bhutan Ngultrum', 'end_of_month' => 'End Of Month', 'merge_e_invoice_to_pdf' => 'Merge E-Invoice and PDF', + 'task_assigned_subject' => 'New task assignment [Task :task] [ :date ]', + 'task_assigned_body' => 'You have been assigned task :task

Description: :description

Client: :client', + 'activity_141' => 'User :user entered note: :notes', + 'quote_reminder_subject' => 'Reminder: Quote :quote from :company', + 'quote_reminder_message' => 'Reminder for quote :number for :amount', + 'quote_reminder1' => 'First Quote Reminder', + 'before_valid_until_date' => 'Before the valid until date', + 'after_valid_until_date' => 'After the valid until date', + 'after_quote_date' => 'After the quote date', + 'remind_quote' => 'Remind Quote', + 'end_of_month' => 'End Of Month', + 'tax_currency_mismatch' => 'Tax currency is different from invoice currency', + 'edocument_import_already_exists' => 'The invoice has already been imported on :date', + 'before_valid_until' => 'Before the valid until', + 'after_valid_until' => 'After the valid until', + 'task_assigned_notification' => 'Task Assigned Notification', + 'task_assigned_notification_help' => 'Send an email when a task is assigned', + 'invoices_locked_end_of_month' => 'Invoices are locked at the end of the month', + 'referral_url' => 'Referral URL', + 'add_comment' => 'Add Comment', + 'added_comment' => 'Successfully saved comment', + 'tickets' => 'Tickets', + 'assigned_group' => 'Successfully assigned group', + 'merge_to_pdf' => 'Merge to PDF', + 'latest_requires_php_version' => 'Note: the latest version requires PHP :version', + 'auto_expand_product_table_notes' => 'Automatically expand products table notes', + 'auto_expand_product_table_notes_help' => 'Automatically expands the notes section within the products table to display more lines.', ); -return $lang; \ No newline at end of file +return $lang; diff --git a/lang/zh_TW/texts.php b/lang/zh_TW/texts.php index e12ddf13d2d0..067277dc07e2 100644 --- a/lang/zh_TW/texts.php +++ b/lang/zh_TW/texts.php @@ -2364,7 +2364,7 @@ $lang = array( 'currency_gold_troy_ounce' => '金金衡盎司', 'currency_nicaraguan_córdoba' => '尼加拉瓜科爾多瓦', 'currency_malagasy_ariary' => '馬達加斯加阿里阿里', - "currency_tongan_pa_anga" => "東加潘加", + "currency_tongan_paanga" => "Tongan Pa'anga", 'review_app_help' => '我們希望您喜歡使用這個程式。
若您考慮 :link,我們會非常感謝!', 'writing_a_review' => '撰寫評語', @@ -2880,19 +2880,6 @@ $lang = array( 'refunded' => '退款', 'marked_quote_as_sent' => '標記報價單為已傳送成功', 'custom_module_settings' => '自訂模組設定', - 'ticket' => '票證', - 'tickets' => '票證', - 'ticket_number' => '票證 #', - 'new_ticket' => '新票證', - 'edit_ticket' => '編輯票證', - 'view_ticket' => '檢視票證', - 'archive_ticket' => '歸檔票證', - 'restore_ticket' => '復原票證', - 'delete_ticket' => '刪除票證', - 'archived_ticket' => '歸檔票證成功', - 'archived_tickets' => '歸檔票證成功', - 'restored_ticket' => '復原票證成功', - 'deleted_ticket' => '刪除票證成功', 'open' => '開啟', 'new' => '新增', 'closed' => '已關閉', @@ -2909,14 +2896,6 @@ $lang = array( 'assigned_to' => '分配給', 'reply' => '回覆', 'awaiting_reply' => '等待回覆', - 'ticket_close' => '關閉票證', - 'ticket_reopen' => '重開票證', - 'ticket_open' => '開啟票證', - 'ticket_split' => '拆分票證', - 'ticket_merge' => '合併票證', - 'ticket_update' => '更新票證', - 'ticket_settings' => '票證設定', - 'updated_ticket' => '票證更新', 'mark_spam' => '標記為垃圾郵件', 'local_part' => '本地部份', 'local_part_unavailable' => '取得的名稱', @@ -2934,31 +2913,23 @@ $lang = array( 'mime_types' => 'Mime 類型', 'mime_types_placeholder' => '.pdf , .docx, .jpg', 'mime_types_help' => '逗號分隔的允許的 mime 類型清單, 為所有', + 'ticket_number_start_help' => 'Ticket number must be greater than the current ticket number', + 'new_ticket_template_id' => 'New ticket', + 'new_ticket_autoresponder_help' => 'Selecting a template will send an auto response to a client/contact when a new ticket is created', + 'update_ticket_template_id' => 'Updated ticket', + 'update_ticket_autoresponder_help' => 'Selecting a template will send an auto response to a client/contact when a ticket is updated', + 'close_ticket_template_id' => 'Closed ticket', + 'close_ticket_autoresponder_help' => 'Selecting a template will send an auto response to a client/contact when a ticket is closed', 'default_priority' => '預設優先順序', 'alert_new_comment_id' => '新評論', - 'alert_comment_ticket_help' => '選取範本將在做出評論時 (向代理) 傳送通知。', - 'alert_comment_ticket_email_help' => '逗號分隔的電子郵件給 bcc 關於新的評論。', - 'new_ticket_notification_list' => '其它新票證通知', 'update_ticket_notification_list' => '其它新評論通知', 'comma_separated_values' => 'admin@example.com, supervisor@example.com', - 'alert_ticket_assign_agent_id' => '票證分配', - 'alert_ticket_assign_agent_id_hel' => '選取範本將在分配票證時 (向代理) 傳送通知。', - 'alert_ticket_assign_agent_id_notifications' => '分配的其它票證通知', - 'alert_ticket_assign_agent_id_help' => '逗號分隔的電子郵件給 bcc 的票證分配。', - 'alert_ticket_transfer_email_help' => '逗號分隔的電子郵件給 bcc 的票證轉讓。', - 'alert_ticket_overdue_agent_id' => '過期票證', - 'alert_ticket_overdue_email' => '其它逾期票證通知', - 'alert_ticket_overdue_email_help' => '逗號分隔的電子郵件給 bcc 的票證期。', - 'alert_ticket_overdue_agent_id_help' => '選取範本將在票證過期時 (向代理) 傳送通知。', 'default_agent' => '預設代理', 'default_agent_help' => '如果選取,將自動分配給所有入站票證', 'show_agent_details' => '顯示回應的代理詳細資訊', 'avatar' => '頭像', 'remove_avatar' => '刪除頭像', - 'ticket_not_found' => '找不到票證', 'add_template' => '加入範本', - 'updated_ticket_template' => '已更新票證範本', - 'created_ticket_template' => '已建立票證範本', 'archive_ticket_template' => '歸檔範本', 'restore_ticket_template' => '復原範本', 'archived_ticket_template' => '歸檔範本成功', @@ -3815,7 +3786,7 @@ $lang = array( 'entity_number_placeholder' => ':entity # :entity _number', 'email_link_not_working' => '如果上面的按鈕不適合您,請點擊連結', 'display_log' => '顯示日誌', - 'send_fail_logs_to_our_server' => '即時報告錯誤', + 'send_fail_logs_to_our_server' => 'Report errors to help improve the app', 'setup' => '設定', 'quick_overview_statistics' => '快速概覽和統計', 'update_your_personal_info' => '更新您的個人資訊', @@ -5303,6 +5274,33 @@ $lang = array( 'currency_bhutan_ngultrum' => 'Bhutan Ngultrum', 'end_of_month' => 'End Of Month', 'merge_e_invoice_to_pdf' => 'Merge E-Invoice and PDF', + 'task_assigned_subject' => 'New task assignment [Task :task] [ :date ]', + 'task_assigned_body' => 'You have been assigned task :task

Description: :description

Client: :client', + 'activity_141' => 'User :user entered note: :notes', + 'quote_reminder_subject' => 'Reminder: Quote :quote from :company', + 'quote_reminder_message' => 'Reminder for quote :number for :amount', + 'quote_reminder1' => 'First Quote Reminder', + 'before_valid_until_date' => 'Before the valid until date', + 'after_valid_until_date' => 'After the valid until date', + 'after_quote_date' => 'After the quote date', + 'remind_quote' => 'Remind Quote', + 'end_of_month' => 'End Of Month', + 'tax_currency_mismatch' => 'Tax currency is different from invoice currency', + 'edocument_import_already_exists' => 'The invoice has already been imported on :date', + 'before_valid_until' => 'Before the valid until', + 'after_valid_until' => 'After the valid until', + 'task_assigned_notification' => 'Task Assigned Notification', + 'task_assigned_notification_help' => 'Send an email when a task is assigned', + 'invoices_locked_end_of_month' => 'Invoices are locked at the end of the month', + 'referral_url' => 'Referral URL', + 'add_comment' => 'Add Comment', + 'added_comment' => 'Successfully saved comment', + 'tickets' => 'Tickets', + 'assigned_group' => 'Successfully assigned group', + 'merge_to_pdf' => 'Merge to PDF', + 'latest_requires_php_version' => 'Note: the latest version requires PHP :version', + 'auto_expand_product_table_notes' => 'Automatically expand products table notes', + 'auto_expand_product_table_notes_help' => 'Automatically expands the notes section within the products table to display more lines.', ); -return $lang; \ No newline at end of file +return $lang; From 092c3bfbce77a50262e0409ba5ac91735f891025 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Wed, 17 Jul 2024 11:12:33 +1000 Subject: [PATCH 25/45] merge ubl_email_attachment for einvoicing --- app/Mail/TemplateEmail.php | 13 +++++++++---- app/Models/Activity.php | 4 ++-- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/app/Mail/TemplateEmail.php b/app/Mail/TemplateEmail.php index 296142bcb773..78f45c372d1d 100644 --- a/app/Mail/TemplateEmail.php +++ b/app/Mail/TemplateEmail.php @@ -24,12 +24,17 @@ class TemplateEmail extends Mailable { private $build_email; - private $client; + /** @var \App\Models\Client $client */ + private $client; + + /** @var \App\Models\ClientContact | \App\Models\VendorContact $contact */ private $contact; + /** @var \App\Models\Company $company */ private $company; + /** @var \App\Models\InvoiceInvitation | \App\Models\QuoteInvitation | \App\Models\CreditInvitation | \App\Models\PurchaseOrderInvitation | \App\Models\RecurringInvoiceInvitation | null $invitation */ private $invitation; public function __construct($build_email, ClientContact $contact, $invitation = null) @@ -167,7 +172,7 @@ class TemplateEmail extends Mailable } - if ($this->invitation->invoice) { + if ($this->invitation->invoice) { //@phpstan-ignore-line if ($this->invitation->invoice->client->getSetting('enable_e_invoice') && $this->invitation->invoice->client->getSetting('ubl_email_attachment') && $this->company->account->hasFeature(Account::FEATURE_PDF_ATTACHMENT)) { $xml_string = $this->invitation->invoice->service()->getEInvoice($this->invitation->contact); @@ -176,7 +181,7 @@ class TemplateEmail extends Mailable } } - } elseif ($this->invitation->credit) { + } elseif ($this->invitation->credit) {//@phpstan-ignore-line if ($this->invitation->credit->client->getSetting('enable_e_invoice') && $this->invitation->invoice->client->getSetting('ubl_email_attachment') && $this->company->account->hasFeature(Account::FEATURE_PDF_ATTACHMENT)) { $xml_string = $this->invitation->credit->service()->getECredit($this->invitation->contact); @@ -185,7 +190,7 @@ class TemplateEmail extends Mailable } } - } elseif ($this->invitation->quote) { + } elseif ($this->invitation->quote) {//@phpstan-ignore-line if ($this->invitation->quote->client->getSetting('enable_e_invoice') && $this->invitation->invoice->client->getSetting('ubl_email_attachment') && $this->company->account->hasFeature(Account::FEATURE_PDF_ATTACHMENT)) { $xml_string = $this->invitation->quote->service()->getEQuote($this->invitation->contact); diff --git a/app/Models/Activity.php b/app/Models/Activity.php index 23804b0812f4..560ff07a11c5 100644 --- a/app/Models/Activity.php +++ b/app/Models/Activity.php @@ -431,11 +431,11 @@ class Activity extends StaticModel } if($this->client) { - $replacements['client'] = ['label' => $this?->client?->present()->name() ?? '', 'hashed_id' => $this->client->hashed_id ?? '']; + $replacements['client'] = ['label' => $this->client?->present()->name() ?? '', 'hashed_id' => $this->client->hashed_id ?? '']; } if($this->vendor) { - $replacements['vendor'] = ['label' => $this?->vendor?->present()->name() ?? '', 'hashed_id' => $this->vendor->hashed_id ?? '']; + $replacements['vendor'] = ['label' => $this->vendor?->present()->name() ?? '', 'hashed_id' => $this->vendor->hashed_id ?? '']; } if($this->activity_type_id == 4 && $this->recurring_invoice) { From e423816bd38e713d93d8aae995c5f3c3ddd9ff8e Mon Sep 17 00:00:00 2001 From: David Bomba Date: Wed, 17 Jul 2024 15:37:54 +1000 Subject: [PATCH 26/45] v5.10.10 --- VERSION.txt | 2 +- .../EDocument/Gateway/Storecove/Storecove.php | 31 ++++++++++++++++--- config/ninja.php | 4 +-- .../Einvoice/Storecove/StorecoveTest.php | 14 +++++++-- 4 files changed, 42 insertions(+), 9 deletions(-) diff --git a/VERSION.txt b/VERSION.txt index 44e4813bf4a8..576f92a4fe93 100644 --- a/VERSION.txt +++ b/VERSION.txt @@ -1 +1 @@ -5.10.9 \ No newline at end of file +5.10.10 \ No newline at end of file diff --git a/app/Services/EDocument/Gateway/Storecove/Storecove.php b/app/Services/EDocument/Gateway/Storecove/Storecove.php index fa84fbd615bf..5527b4482f7e 100644 --- a/app/Services/EDocument/Gateway/Storecove/Storecove.php +++ b/app/Services/EDocument/Gateway/Storecove/Storecove.php @@ -113,9 +113,9 @@ class Storecove { ], "document"=> [ 'documentType' => 'invoice', - 'rawDocumentData' => ['document' => base64_encode($document)], - 'parse' => true, - 'parseStrategy', 'ubl' + 'rawDocumentData' => ['document' => base64_encode($document), 'parse' => true, 'parseStrategy', 'ubl'], + // + // ' ], ]; @@ -258,6 +258,29 @@ class Storecove { } + + + public function addIdentifier(int $legal_entity_id, string $identifier, string $scheme) + { + $uri = "legal_entities/{$legal_entity_id}/peppol_identifiers"; + + $data = [ + "identifier" => $identifier, + "scheme" => $scheme, + "superscheme" => "iso6523-actorid-upis", + ]; + + $r = $this->httpClient($uri, (HttpVerb::POST)->value, $data); + + if($r->successful()) { + return $r->json(); + } + + return $r; + + } + + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// private function getHeaders(array $headers = []) { @@ -271,7 +294,7 @@ class Storecove { private function httpClient(string $uri, string $verb, array $data, ?array $headers = []) { -nlog("{$this->base_url}{$uri}"); + $r = Http::withToken(config('ninja.storecove_api_key')) ->withHeaders($this->getHeaders($headers)) ->{$verb}("{$this->base_url}{$uri}", $data); diff --git a/config/ninja.php b/config/ninja.php index 7680a6d74eb2..615673bec9c9 100644 --- a/config/ninja.php +++ b/config/ninja.php @@ -17,8 +17,8 @@ return [ 'require_https' => env('REQUIRE_HTTPS', true), 'app_url' => rtrim(env('APP_URL', ''), '/'), 'app_domain' => env('APP_DOMAIN', 'invoicing.co'), - 'app_version' => env('APP_VERSION', '5.10.9'), - 'app_tag' => env('APP_TAG', '5.10.9'), + 'app_version' => env('APP_VERSION', '5.10.10'), + 'app_tag' => env('APP_TAG', '5.10.10'), 'minimum_client_version' => '5.0.16', 'terms_version' => '1.0.1', 'api_secret' => env('API_SECRET', false), diff --git a/tests/Integration/Einvoice/Storecove/StorecoveTest.php b/tests/Integration/Einvoice/Storecove/StorecoveTest.php index d78c1ed5a4a6..df05079470fd 100644 --- a/tests/Integration/Einvoice/Storecove/StorecoveTest.php +++ b/tests/Integration/Einvoice/Storecove/StorecoveTest.php @@ -60,6 +60,18 @@ class StorecoveTest extends TestCase } + public function tesXAddPeppolIdentifier() + { + + $sc = new \App\Services\EDocument\Gateway\Storecove\Storecove(); + $r = $sc->addIdentifier(290868, "DE923356489", "DE:VAT"); + + // nlog($r->body()); + // $this->assertIsArray($r); + nlog($r); + + } + // public function testUpdateLegalEntity() // { // $data = [ @@ -86,8 +98,6 @@ class StorecoveTest extends TestCase $this->assertIsArray($r); - nlog($r); - } public function testSendDocument() From 014452e484e561c17c50534616a1f60a0afce70d Mon Sep 17 00:00:00 2001 From: David Bomba Date: Thu, 18 Jul 2024 07:56:44 +1000 Subject: [PATCH 27/45] Validation of entity input --- app/Http/Requests/Email/SendEmailRequest.php | 2 +- .../EDocument/Gateway/Storecove/Storecove.php | 17 ++++++----------- 2 files changed, 7 insertions(+), 12 deletions(-) diff --git a/app/Http/Requests/Email/SendEmailRequest.php b/app/Http/Requests/Email/SendEmailRequest.php index c9ab8aff95f5..60d82aec59a6 100644 --- a/app/Http/Requests/Email/SendEmailRequest.php +++ b/app/Http/Requests/Email/SendEmailRequest.php @@ -94,7 +94,7 @@ class SendEmailRequest extends Request $this->entity_plural = Str::plural($input['entity']) ?? ''; - if (isset($input['entity'])) { + if (isset($input['entity']) && in_array($input['entity'], ['invoice','quote','credit','recurring_invoice','purchase_order','payment'])) { $input['entity'] = "App\Models\\".ucfirst(Str::camel($input['entity'])); } diff --git a/app/Services/EDocument/Gateway/Storecove/Storecove.php b/app/Services/EDocument/Gateway/Storecove/Storecove.php index 5527b4482f7e..7ce2fbd07d3f 100644 --- a/app/Services/EDocument/Gateway/Storecove/Storecove.php +++ b/app/Services/EDocument/Gateway/Storecove/Storecove.php @@ -103,19 +103,14 @@ class Storecove { $payload = [ "legalEntityId"=> 290868, "idempotencyGuid"=> \Illuminate\Support\Str::uuid(), - "routing"=> [ - "eIdentifiers" => [ - [ - "scheme" => "DE:VAT", - "id"=> "DE:VAT" - ], - ] - ], "document"=> [ 'documentType' => 'invoice', - 'rawDocumentData' => ['document' => base64_encode($document), 'parse' => true, 'parseStrategy', 'ubl'], - // - // ' + "invoice" => [], + ], + "rawDocumentData"=> [ + "document" => base64_encode($document), + "parse" => true, + "parseStrategy"=> "ubl", ], ]; From 5f0c08e7e9f8d4afb4eb32bbcb40a88dcf870962 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Thu, 18 Jul 2024 08:53:19 +1000 Subject: [PATCH 28/45] Send UBL via storecove --- .../EDocument/Gateway/Storecove/Storecove.php | 15 +++++++++------ .../Einvoice/Storecove/StorecoveTest.php | 8 ++++++-- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/app/Services/EDocument/Gateway/Storecove/Storecove.php b/app/Services/EDocument/Gateway/Storecove/Storecove.php index 7ce2fbd07d3f..c3a424799e7e 100644 --- a/app/Services/EDocument/Gateway/Storecove/Storecove.php +++ b/app/Services/EDocument/Gateway/Storecove/Storecove.php @@ -103,14 +103,17 @@ class Storecove { $payload = [ "legalEntityId"=> 290868, "idempotencyGuid"=> \Illuminate\Support\Str::uuid(), + "routing" => [ + "eIdentifiers" => [], + "emails" => ["david@invoiceninja.com"] + ], "document"=> [ 'documentType' => 'invoice', - "invoice" => [], - ], - "rawDocumentData"=> [ - "document" => base64_encode($document), - "parse" => true, - "parseStrategy"=> "ubl", + "rawDocumentData"=> [ + "document" => base64_encode($document), + "parse" => true, + "parseStrategy"=> "ubl", + ], ], ]; diff --git a/tests/Integration/Einvoice/Storecove/StorecoveTest.php b/tests/Integration/Einvoice/Storecove/StorecoveTest.php index df05079470fd..2bd38ec13141 100644 --- a/tests/Integration/Einvoice/Storecove/StorecoveTest.php +++ b/tests/Integration/Einvoice/Storecove/StorecoveTest.php @@ -103,7 +103,12 @@ class StorecoveTest extends TestCase public function testSendDocument() { - $x = ' + $x = ' + + 0061 2024-07-15 380 @@ -221,7 +226,6 @@ class StorecoveTest extends TestCase '; - $sc = new \App\Services\EDocument\Gateway\Storecove\Storecove(); $sc->sendDocument($x); From acf73fb6fd6b5347e2e6bd19036457194e755945 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Thu, 18 Jul 2024 12:21:24 +1000 Subject: [PATCH 29/45] DE solved! --- .../EDocument/Gateway/Storecove/Storecove.php | 2 + app/Services/EDocument/Standards/Peppol.php | 68 +++++- tests/Feature/EInvoice/PeppolTest.php | 125 +++++++++- .../Einvoice/Storecove/StorecoveTest.php | 231 +++++++++--------- 4 files changed, 292 insertions(+), 134 deletions(-) diff --git a/app/Services/EDocument/Gateway/Storecove/Storecove.php b/app/Services/EDocument/Gateway/Storecove/Storecove.php index c3a424799e7e..fe1d0bbc1fec 100644 --- a/app/Services/EDocument/Gateway/Storecove/Storecove.php +++ b/app/Services/EDocument/Gateway/Storecove/Storecove.php @@ -119,6 +119,8 @@ class Storecove { $uri = "document_submissions"; + nlog($payload); + $r = $this->httpClient($uri, (HttpVerb::POST)->value, $payload, $this->getHeaders()); nlog($r->body()); diff --git a/app/Services/EDocument/Standards/Peppol.php b/app/Services/EDocument/Standards/Peppol.php index 572f69212838..def2cee37bcd 100644 --- a/app/Services/EDocument/Standards/Peppol.php +++ b/app/Services/EDocument/Standards/Peppol.php @@ -11,11 +11,13 @@ namespace App\Services\EDocument\Standards; +use App\Models\Company; use App\Models\Invoice; use App\Services\AbstractService; use App\Helpers\Invoice\InvoiceSum; -use App\Helpers\Invoice\InvoiceSumInclusive; use InvoiceNinja\EInvoice\EInvoice; +use App\Helpers\Invoice\InvoiceSumInclusive; +use InvoiceNinja\EInvoice\Models\Peppol\PaymentMeans; use InvoiceNinja\EInvoice\Models\Peppol\ItemType\Item; use InvoiceNinja\EInvoice\Models\Peppol\PartyType\Party; use InvoiceNinja\EInvoice\Models\Peppol\PriceType\Price; @@ -24,9 +26,13 @@ use InvoiceNinja\EInvoice\Models\Peppol\ContactType\Contact; use InvoiceNinja\EInvoice\Models\Peppol\CountryType\Country; use InvoiceNinja\EInvoice\Models\Peppol\AmountType\TaxAmount; use InvoiceNinja\EInvoice\Models\Peppol\TaxTotalType\TaxTotal; +use App\Services\EDocument\Standards\Settings\PropertyResolver; +use InvoiceNinja\EInvoice\Models\Peppol\AmountType\PriceAmount; use InvoiceNinja\EInvoice\Models\Peppol\PartyNameType\PartyName; use InvoiceNinja\EInvoice\Models\Peppol\TaxSchemeType\TaxScheme; use InvoiceNinja\EInvoice\Models\Peppol\AmountType\PayableAmount; +use InvoiceNinja\EInvoice\Models\Peppol\AmountType\TaxableAmount; +use InvoiceNinja\EInvoice\Models\Peppol\TaxTotal as PeppolTaxTotal; use InvoiceNinja\EInvoice\Models\Peppol\InvoiceLineType\InvoiceLine; use InvoiceNinja\EInvoice\Models\Peppol\TaxCategoryType\TaxCategory; use InvoiceNinja\EInvoice\Models\Peppol\TaxSubtotalType\TaxSubtotal; @@ -34,13 +40,11 @@ use InvoiceNinja\EInvoice\Models\Peppol\TaxScheme as PeppolTaxScheme; use InvoiceNinja\EInvoice\Models\Peppol\AmountType\TaxExclusiveAmount; use InvoiceNinja\EInvoice\Models\Peppol\AmountType\TaxInclusiveAmount; use InvoiceNinja\EInvoice\Models\Peppol\AmountType\LineExtensionAmount; -use InvoiceNinja\EInvoice\Models\Peppol\AmountType\PriceAmount; -use InvoiceNinja\EInvoice\Models\Peppol\AmountType\TaxableAmount; use InvoiceNinja\EInvoice\Models\Peppol\MonetaryTotalType\LegalMonetaryTotal; use InvoiceNinja\EInvoice\Models\Peppol\TaxCategoryType\ClassifiedTaxCategory; use InvoiceNinja\EInvoice\Models\Peppol\CustomerPartyType\AccountingCustomerParty; use InvoiceNinja\EInvoice\Models\Peppol\SupplierPartyType\AccountingSupplierParty; -use InvoiceNinja\EInvoice\Models\Peppol\TaxTotal as PeppolTaxTotal; +use InvoiceNinja\EInvoice\Models\Peppol\FinancialAccountType\PayeeFinancialAccount; class Peppol extends AbstractService { @@ -59,16 +63,17 @@ class Peppol extends AbstractService "896" => "Debit note related to self-billed invoice" ]; - private \InvoiceNinja\EInvoice\Models\Peppol\Invoice $p_invoice; + private Company $company; private InvoiceSum | InvoiceSumInclusive $calc; /** * @param Invoice $invoice */ - public function __construct(public Invoice $invoice) + public function __construct(public Invoice $invoice, public ?\InvoiceNinja\EInvoice\Models\Peppol\Invoice $p_invoice = null) { - $this->p_invoice = new \InvoiceNinja\EInvoice\Models\Peppol\Invoice(); + $this->p_invoice = $p_invoice ?? new \InvoiceNinja\EInvoice\Models\Peppol\Invoice(); + $this->company = $invoice->company; $this->calc = $this->invoice->calc(); } @@ -95,6 +100,7 @@ class Peppol extends AbstractService $this->p_invoice->InvoiceLine = $this->getInvoiceLines(); $this->p_invoice->TaxTotal = $this->getTotalTaxes(); $this->p_invoice->LegalMonetaryTotal = $this->getLegalMonetaryTotal(); + // $this->p_invoice->PaymentMeans = $this->getPaymentMeans(); // $payeeFinancialAccount = (new PayeeFinancialAccount()) // ->setBankId($company->settings->custom_value1) @@ -107,6 +113,17 @@ class Peppol extends AbstractService } + private function getPaymentMeans(): PaymentMeans + { + // $payeeFinancialAccount = new PayeeFinancialAccount() + // $payeeFinancialAccount-> + + // $ppm = new PaymentMeans(); + // $ppm->PayeeFinancialAccount = $payeeFinancialAccount; + + // return $ppm; + } + private function getLegalMonetaryTotal(): LegalMonetaryTotal { $taxable = $this->getTaxable(); @@ -310,7 +327,7 @@ class Peppol extends AbstractService $tax_amount = new TaxAmount(); $tax_amount->currencyID = $this->invoice->client->currency()->code; - $tax_amount->amount = round(($item->line_total * (1 / $item->tax_rate1)), 2); + $tax_amount->amount = round(($item->line_total * ($item->tax_rate1/100)), 2); $tax_subtotal = new TaxSubtotal(); $tax_subtotal->TaxAmount = $tax_amount; @@ -339,7 +356,7 @@ class Peppol extends AbstractService $tax_amount = new TaxAmount(); $tax_amount->currencyID = $this->invoice->client->currency()->code; - $tax_amount->amount = round(($item->line_total * (1 / $item->tax_rate2)), 2); + $tax_amount->amount = round(($item->line_total * ($item->tax_rate2/100)), 2); $tax_subtotal = new TaxSubtotal(); $tax_subtotal->TaxAmount = $tax_amount; @@ -372,7 +389,7 @@ class Peppol extends AbstractService $tax_amount = new TaxAmount(); $tax_amount->currencyID = $this->invoice->client->currency()->code; - $tax_amount->amount = round(($item->line_total * (1 / $item->tax_rate3)), 2); + $tax_amount->amount = round(($item->line_total * ($item->tax_rate3/100)), 2); $tax_subtotal = new TaxSubtotal(); $tax_subtotal->TaxAmount = $tax_amount; @@ -520,4 +537,35 @@ class Peppol extends AbstractService return $total; } + public function setInvoiceDefaults(): self + { + $settings = [ + 'AccountingCostCode' => 7, + 'AccountingCost' => 7, + 'BuyerReference' => 6, + 'AccountingSupplierParty' => 1, + 'AccountingCustomerParty' => 2, + 'PayeeParty' => 1, + 'BuyerCustomerParty' => 2, + 'SellerSupplierParty' => 1, + 'TaxRepresentativeParty' => 1, + 'Delivery' => 1, + 'DeliveryTerms' => 7, + 'PaymentMeans' => 7, + 'PaymentTerms' => 7, + ]; + + foreach($settings as $prop => $visibility){ + + if($prop_value = PropertyResolver::resolve($this->invoice->client->e_invoice, $prop)) + $this->p_invoice->{$prop} = $prop_value; + elseif($prop_value = PropertyResolver::resolve($this->invoice->company->e_invoice, $prop)) { + $this->p_invoice->{$prop} = $prop_value; + } + + + } + + return $this; + } } diff --git a/tests/Feature/EInvoice/PeppolTest.php b/tests/Feature/EInvoice/PeppolTest.php index 2933d571d488..787ad6913e72 100644 --- a/tests/Feature/EInvoice/PeppolTest.php +++ b/tests/Feature/EInvoice/PeppolTest.php @@ -14,20 +14,23 @@ namespace Tests\Feature\EInvoice; use Tests\TestCase; use App\Models\Client; use App\Models\Company; +use App\Models\Invoice; use Tests\MockAccountData; +use App\DataMapper\InvoiceItem; use App\DataMapper\ClientSettings; use App\DataMapper\CompanySettings; -use App\DataMapper\InvoiceItem; -use App\Models\Invoice; +use InvoiceNinja\EInvoice\EInvoice; use InvoiceNinja\EInvoice\Symfony\Encode; -use App\Services\EDocument\Standards\FatturaPANew; use App\Services\EDocument\Standards\Peppol; +use App\Services\EDocument\Standards\FatturaPANew; use Illuminate\Routing\Middleware\ThrottleRequests; use Illuminate\Foundation\Testing\DatabaseTransactions; -use InvoiceNinja\EInvoice\EInvoice; use InvoiceNinja\EInvoice\Models\FatturaPA\FatturaElettronica; +use InvoiceNinja\EInvoice\Models\Peppol\BranchType\FinancialInstitutionBranch; +use InvoiceNinja\EInvoice\Models\Peppol\FinancialAccountType\PayeeFinancialAccount; use InvoiceNinja\EInvoice\Models\FatturaPA\FatturaElettronicaBodyType\FatturaElettronicaBody; use InvoiceNinja\EInvoice\Models\FatturaPA\FatturaElettronicaHeaderType\FatturaElettronicaHeader; +use InvoiceNinja\EInvoice\Models\Peppol\PaymentMeans; /** * @test @@ -51,6 +54,120 @@ class PeppolTest extends TestCase ); } + public function testDeInvoice() + { + + $settings = CompanySettings::defaults(); + $settings->address1 = 'Dudweilerstr. 34b'; + $settings->city = 'Ost Alessa'; + $settings->state = 'Bayern'; + $settings->postal_code = '98060'; + $settings->vat_number = 'DE923356489'; + $settings->country_id = '276'; + $settings->currency_id = '3'; + + + $einvoice = new \InvoiceNinja\EInvoice\Models\Peppol\Invoice(); + + + $fib = new FinancialInstitutionBranch(); + $fib->ID = "DEUTDEMMXXX"; //BIC + $fib->Name = 'Deutsche Bank'; + + $pfa = new PayeeFinancialAccount(); + $pfa->ID = 'DE89370400440532013000'; + $pfa->Name = 'PFA-NAME'; + $pfa->AliasName = 'PFA-Alias'; + $pfa->AccountTypeCode = 'CHECKING'; + $pfa->AccountFormatCode = 'IBAN'; + $pfa->CurrencyCode = 'EUR'; + $pfa->FinancialInstitutionBranch = $fib; + + $pm = new PaymentMeans(); + $pm->PayeeFinancialAccount = $pfa; + $einvoice->PaymentMeans[] = $pm; + + $company = Company::factory()->create([ + 'account_id' => $this->account->id, + 'settings' => $settings, + 'e_invoice' => $einvoice, + ]); + + $client_settings = ClientSettings::defaults(); + $client_settings->currency_id = '3'; + + $client = Client::factory()->create([ + 'company_id' => $company->id, + 'user_id' => $this->user->id, + 'name' => 'German Client Name', + 'address1' => 'Kinderhausen 96b', + 'address2' => 'Apt. 842', + 'city' => 'Süd Jessestadt', + 'state' => 'Bayern', + 'postal_code' => '33323', + 'country_id' => 276, + 'routing_id' => 'ABC1234', + 'settings' => $client_settings, + ]); + + + $item = new InvoiceItem(); + $item->product_key = "Product Key"; + $item->notes = "Product Description"; + $item->cost = 10; + $item->quantity = 10; + $item->tax_rate1 = 19; + $item->tax_name1 = 'mwst'; + + $invoice = Invoice::factory()->create([ + 'company_id' => $company->id, + 'user_id' => $this->user->id, + 'client_id' => $client->id, + 'discount' => 0, + 'uses_inclusive_taxes' => false, + 'status_id' => 1, + 'tax_rate1' => 0, + 'tax_name1' => '', + 'tax_rate2' => 0, + 'tax_rate3' => 0, + 'tax_name2' => '', + 'tax_name3' => '', + 'line_items' => [$item], + 'number' => 'DE-'.rand(1000, 100000), + 'date' => now()->format('Y-m-d') + ]); + + $invoice = $invoice->calc()->getInvoice(); + $invoice->service()->markSent()->save(); + + $this->assertEquals(119, $invoice->amount); + + + $peppol = new Peppol($invoice); + $peppol->setInvoiceDefaults(); + $peppol->run(); + + $de_invoice = $peppol->getInvoice(); + + $this->assertNotNull($de_invoice); + + $e = new EInvoice(); + $xml = $e->encode($de_invoice, 'xml'); + $this->assertNotNull($xml); + + nlog($xml); + + $errors = $e->validate($de_invoice); + + if(count($errors) > 0) { + nlog($errors); + } + + $this->assertCount(0, $errors); + + + } + public function testInvoiceBoot() { diff --git a/tests/Integration/Einvoice/Storecove/StorecoveTest.php b/tests/Integration/Einvoice/Storecove/StorecoveTest.php index 2bd38ec13141..ab732d73af59 100644 --- a/tests/Integration/Einvoice/Storecove/StorecoveTest.php +++ b/tests/Integration/Einvoice/Storecove/StorecoveTest.php @@ -105,126 +105,117 @@ class StorecoveTest extends TestCase $x = ' - - 0061 - 2024-07-15 - 380 - - - - Eladio Ullrich I - - - Jasper Brook - Kodychester - 73445-5131 - South Dakota - - AT - - - - Jasper Brook - Kodychester - 73445-5131 - South Dakota - - AT - - - - small@example.com - - - - - - - Beispiel GmbH - - - 45 Hauptstraße - Berlin - 10115 - Berlin - - DE - - - - 45 Hauptstraße - Berlin - 10115 - Berlin - - DE - - - - TTKGjKW9Rv00LEr@example.com - - - - - - 215 - 215 - 215.00 - 215.00 - - - 1 - 1 - 10 - - 0.5 - - 10 - 0.5 - - C62 - 20 - - USt - - - - - - The Pro Plan NO MORE - ee - - - 10 - - - - 2 - 1 - 14 - - The Enterprise Plan - eee - - - 14 - - - - 3 - 1 - 191 - - Soluta provident. - k - - - 191 - - '; + + DE-77323 + 2024-07-18 + 380 + + + + Untitled Company + + + Dudweilerstr. 34b + Ost Alessa + 98060 + Bayern + + DE + + + + Dudweilerstr. 34b + Ost Alessa + 98060 + Bayern + + DE + + + + owner@gmail.com + + + + + + + German Client Name + + + Kinderhausen 96b + Süd Jessestadt + 33323 + Bayern + + DE + + + + Kinderhausen 96b + Süd Jessestadt + 33323 + Bayern + + DE + + + + No Email Set + + + + + + DE89370400440532013000 + PFA-NAME + PFA-Alias + CHECKING + IBAN + EUR + + DEUTDEMMXXX + Deutsche Bank + + + + + + 100 + 100 + 119.00 + 119.00 + + + 1 + 10 + 100 + + 19 + + 100 + 19 + + C62 + 19 + + mwst + + + + + + Product Description + Product Key + + + 10 + + + '; $sc = new \App\Services\EDocument\Gateway\Storecove\Storecove(); $sc->sendDocument($x); From a72f26b242e1aecfe63a7d56fdea8b8d023be30c Mon Sep 17 00:00:00 2001 From: David Bomba Date: Thu, 18 Jul 2024 14:13:07 +1000 Subject: [PATCH 30/45] Add prop resolver --- app/Services/EDocument/Standards/Peppol.php | 24 ++-- .../Standards/Settings/PropertyResolver.php | 44 +++++++ tests/Feature/EInvoice/PeppolTest.php | 113 +++++++++++++++++ .../Einvoice/Storecove/StorecoveTest.php | 116 ++++++++++++++++++ 4 files changed, 286 insertions(+), 11 deletions(-) create mode 100644 app/Services/EDocument/Standards/Settings/PropertyResolver.php diff --git a/app/Services/EDocument/Standards/Peppol.php b/app/Services/EDocument/Standards/Peppol.php index def2cee37bcd..afc2825813a2 100644 --- a/app/Services/EDocument/Standards/Peppol.php +++ b/app/Services/EDocument/Standards/Peppol.php @@ -17,6 +17,7 @@ use App\Services\AbstractService; use App\Helpers\Invoice\InvoiceSum; use InvoiceNinja\EInvoice\EInvoice; use App\Helpers\Invoice\InvoiceSumInclusive; +use App\Helpers\Invoice\Taxer; use InvoiceNinja\EInvoice\Models\Peppol\PaymentMeans; use InvoiceNinja\EInvoice\Models\Peppol\ItemType\Item; use InvoiceNinja\EInvoice\Models\Peppol\PartyType\Party; @@ -27,6 +28,7 @@ use InvoiceNinja\EInvoice\Models\Peppol\CountryType\Country; use InvoiceNinja\EInvoice\Models\Peppol\AmountType\TaxAmount; use InvoiceNinja\EInvoice\Models\Peppol\TaxTotalType\TaxTotal; use App\Services\EDocument\Standards\Settings\PropertyResolver; +use App\Utils\Traits\NumberFormatter; use InvoiceNinja\EInvoice\Models\Peppol\AmountType\PriceAmount; use InvoiceNinja\EInvoice\Models\Peppol\PartyNameType\PartyName; use InvoiceNinja\EInvoice\Models\Peppol\TaxSchemeType\TaxScheme; @@ -48,6 +50,9 @@ use InvoiceNinja\EInvoice\Models\Peppol\FinancialAccountType\PayeeFinancialAccou class Peppol extends AbstractService { + use Taxer; + use NumberFormatter; + private array $InvoiceTypeCodes = [ "380" => "Commercial invoice", "381" => "Credit note", @@ -137,7 +142,7 @@ class Peppol extends AbstractService $tea = new TaxExclusiveAmount(); $tea->currencyID = $this->invoice->client->currency()->code; - $tea->amount = $taxable; + $tea->amount = $this->invoice->uses_inclusive_taxes ? round($this->invoice->amount - $this->invoice->total_taxes,2) : $taxable; $lmt->TaxExclusiveAmount = $tea; $tia = new TaxInclusiveAmount(); @@ -163,19 +168,16 @@ class Peppol extends AbstractService $tax_amount = new TaxAmount(); $tax_amount->currencyID = $this->invoice->client->currency()->code; - $tax_amount->amount = round($this->invoice->amount * (1 / $this->invoice->tax_rate1), 2); + $tax_amount->amount = $this->invoice->uses_inclusive_taxes ? $this->calcInclusiveLineTax($this->invoice->tax_rate1, $this->invoice->amount) : $this->calcAmountLineTax($this->invoice->tax_rate1, $this->invoice->amount); $tax_subtotal = new TaxSubtotal(); $tax_subtotal->TaxAmount = $tax_amount; - $taxable_amount = new TaxableAmount(); $taxable_amount->currencyID = $this->invoice->client->currency()->code; $taxable_amount->amount = $this->invoice->amount; $tax_subtotal->TaxableAmount = $taxable_amount; - - $tc = new TaxCategory(); $tc->ID = $type_id == '2' ? 'HUR' : 'C62'; $tc->Percent = $this->invoice->tax_rate1; @@ -196,7 +198,8 @@ class Peppol extends AbstractService $tax_amount = new TaxAmount(); $tax_amount->currencyID = $this->invoice->client->currency()->code; - $tax_amount->amount = round($this->invoice->amount * (1 / $this->invoice->tax_rate2), 2); + + $tax_amount->amount = $this->invoice->uses_inclusive_taxes ? $this->calcInclusiveLineTax($this->invoice->tax_rate2, $this->invoice->amount) : $this->calcAmountLineTax($this->invoice->tax_rate2, $this->invoice->amount); $tax_subtotal = new TaxSubtotal(); $tax_subtotal->TaxAmount = $tax_amount; @@ -228,7 +231,7 @@ class Peppol extends AbstractService $tax_amount = new TaxAmount(); $tax_amount->currencyID = $this->invoice->client->currency()->code; - $tax_amount->amount = round($this->invoice->amount * (1 / $this->invoice->tax_rate1), 2); + $tax_amount->amount = $this->invoice->uses_inclusive_taxes ? $this->calcInclusiveLineTax($this->invoice->tax_rate3, $this->invoice->amount) : $this->calcAmountLineTax($this->invoice->tax_rate3, $this->invoice->amount); $tax_subtotal = new TaxSubtotal(); $tax_subtotal->TaxAmount = $tax_amount; @@ -327,7 +330,7 @@ class Peppol extends AbstractService $tax_amount = new TaxAmount(); $tax_amount->currencyID = $this->invoice->client->currency()->code; - $tax_amount->amount = round(($item->line_total * ($item->tax_rate1/100)), 2); + $tax_amount->amount = $this->invoice->uses_inclusive_taxes ? $this->calcInclusiveLineTax($item->tax_rate1, $item->line_total) : $this->calcAmountLineTax($item->tax_rate1, $item->line_total); $tax_subtotal = new TaxSubtotal(); $tax_subtotal->TaxAmount = $tax_amount; @@ -356,7 +359,7 @@ class Peppol extends AbstractService $tax_amount = new TaxAmount(); $tax_amount->currencyID = $this->invoice->client->currency()->code; - $tax_amount->amount = round(($item->line_total * ($item->tax_rate2/100)), 2); + $tax_amount->amount = $this->invoice->uses_inclusive_taxes ? $this->calcInclusiveLineTax($item->tax_rate2, $item->line_total) : $this->calcAmountLineTax($item->tax_rate2, $item->line_total); $tax_subtotal = new TaxSubtotal(); $tax_subtotal->TaxAmount = $tax_amount; @@ -389,7 +392,7 @@ class Peppol extends AbstractService $tax_amount = new TaxAmount(); $tax_amount->currencyID = $this->invoice->client->currency()->code; - $tax_amount->amount = round(($item->line_total * ($item->tax_rate3/100)), 2); + $tax_amount->amount = $this->invoice->uses_inclusive_taxes ? $this->calcInclusiveLineTax($item->tax_rate3, $item->line_total) : $this->calcAmountLineTax($item->tax_rate3, $item->line_total); $tax_subtotal = new TaxSubtotal(); $tax_subtotal->TaxAmount = $tax_amount; @@ -563,7 +566,6 @@ class Peppol extends AbstractService $this->p_invoice->{$prop} = $prop_value; } - } return $this; diff --git a/app/Services/EDocument/Standards/Settings/PropertyResolver.php b/app/Services/EDocument/Standards/Settings/PropertyResolver.php new file mode 100644 index 000000000000..2476a70b39a0 --- /dev/null +++ b/app/Services/EDocument/Standards/Settings/PropertyResolver.php @@ -0,0 +1,44 @@ +{$currentProperty})) { + $nextObject = $object->{$currentProperty}; + } elseif (is_array($object) && array_key_exists($currentProperty, $object)) { + $nextObject = $object[$currentProperty]; + } else { + return null; + } + + if (empty($pathSegments)) { + return $nextObject; + } + + return self::traverse($nextObject, $pathSegments); + } +} \ No newline at end of file diff --git a/tests/Feature/EInvoice/PeppolTest.php b/tests/Feature/EInvoice/PeppolTest.php index 787ad6913e72..e7d85b759340 100644 --- a/tests/Feature/EInvoice/PeppolTest.php +++ b/tests/Feature/EInvoice/PeppolTest.php @@ -168,6 +168,119 @@ class PeppolTest extends TestCase } + + public function testDeInvoiceInclusiveTaxes() + { + + $settings = CompanySettings::defaults(); + $settings->address1 = 'Dudweilerstr. 34b'; + $settings->city = 'Ost Alessa'; + $settings->state = 'Bayern'; + $settings->postal_code = '98060'; + $settings->vat_number = 'DE923356489'; + $settings->country_id = '276'; + $settings->currency_id = '3'; + + $einvoice = new \InvoiceNinja\EInvoice\Models\Peppol\Invoice(); + + $fib = new FinancialInstitutionBranch(); + $fib->ID = "DEUTDEMMXXX"; //BIC + $fib->Name = 'Deutsche Bank'; + + $pfa = new PayeeFinancialAccount(); + $pfa->ID = 'DE89370400440532013000'; + $pfa->Name = 'PFA-NAME'; + $pfa->AliasName = 'PFA-Alias'; + $pfa->AccountTypeCode = 'CHECKING'; + $pfa->AccountFormatCode = 'IBAN'; + $pfa->CurrencyCode = 'EUR'; + $pfa->FinancialInstitutionBranch = $fib; + + $pm = new PaymentMeans(); + $pm->PayeeFinancialAccount = $pfa; + $einvoice->PaymentMeans[] = $pm; + + $company = Company::factory()->create([ + 'account_id' => $this->account->id, + 'settings' => $settings, + 'e_invoice' => $einvoice, + ]); + + $client_settings = ClientSettings::defaults(); + $client_settings->currency_id = '3'; + + $client = Client::factory()->create([ + 'company_id' => $company->id, + 'user_id' => $this->user->id, + 'name' => 'German Client Name', + 'address1' => 'Kinderhausen 96b', + 'address2' => 'Apt. 842', + 'city' => 'Süd Jessestadt', + 'state' => 'Bayern', + 'postal_code' => '33323', + 'country_id' => 276, + 'routing_id' => 'ABC1234', + 'settings' => $client_settings, + ]); + + + $item = new InvoiceItem(); + $item->product_key = "Product Key"; + $item->notes = "Product Description"; + $item->cost = 10; + $item->quantity = 10; + $item->tax_rate1 = 19; + $item->tax_name1 = 'mwst'; + + $invoice = Invoice::factory()->create([ + 'company_id' => $company->id, + 'user_id' => $this->user->id, + 'client_id' => $client->id, + 'discount' => 0, + 'uses_inclusive_taxes' => true, + 'status_id' => 1, + 'tax_rate1' => 0, + 'tax_name1' => '', + 'tax_rate2' => 0, + 'tax_rate3' => 0, + 'tax_name2' => '', + 'tax_name3' => '', + 'line_items' => [$item], + 'number' => 'DE-'.rand(1000, 100000), + 'date' => now()->format('Y-m-d') + ]); + + $invoice = $invoice->calc()->getInvoice(); + $invoice->service()->markSent()->save(); + + $this->assertEquals(100, $invoice->amount); + + $peppol = new Peppol($invoice); + $peppol->setInvoiceDefaults(); + $peppol->run(); + + $de_invoice = $peppol->getInvoice(); + + $this->assertNotNull($de_invoice); + + $e = new EInvoice(); + $xml = $e->encode($de_invoice, 'xml'); + $this->assertNotNull($xml); + + nlog("inclusive"); + nlog($xml); + + $errors = $e->validate($de_invoice); + + if(count($errors) > 0) { + nlog($errors); + } + + $this->assertCount(0, $errors); + + } + + public function testInvoiceBoot() { diff --git a/tests/Integration/Einvoice/Storecove/StorecoveTest.php b/tests/Integration/Einvoice/Storecove/StorecoveTest.php index ab732d73af59..414feab2047a 100644 --- a/tests/Integration/Einvoice/Storecove/StorecoveTest.php +++ b/tests/Integration/Einvoice/Storecove/StorecoveTest.php @@ -217,6 +217,122 @@ class StorecoveTest extends TestCase '; +//inclusive +$x = ' + + +DE-53423 + 2024-07-18 + 380 + + + + Untitled Company + + + Dudweilerstr. 34b + Ost Alessa + 98060 + Bayern + + DE + + + + Dudweilerstr. 34b + Ost Alessa + 98060 + Bayern + + DE + + + + owner@gmail.com + + + + + + + German Client Name + + + Kinderhausen 96b + Süd Jessestadt + 33323 + Bayern + + DE + + + + Kinderhausen 96b + Süd Jessestadt + 33323 + Bayern + + DE + + + + No Email Set + + + + + + DE89370400440532013000 + PFA-NAME + PFA-Alias + CHECKING + IBAN + EUR + + DEUTDEMMXXX + Deutsche Bank + + + + + + 100 + 84.03 + 100.00 + 100.00 + + + 1 + 10 + 100 + + 15.97 + + 100 + 15.97 + + C62 + 19 + + mwst + + + + + + Product Description + Product Key + + + 10 + + +'; + + $sc = new \App\Services\EDocument\Gateway\Storecove\Storecove(); $sc->sendDocument($x); From 8fb08ea786d5730382b4902123404565667fcc83 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Thu, 18 Jul 2024 15:03:26 +1000 Subject: [PATCH 31/45] Tax calculations --- app/Services/EDocument/Standards/Peppol.php | 15 ++++++--------- .../Einvoice/Storecove/StorecoveTest.php | 8 ++++---- 2 files changed, 10 insertions(+), 13 deletions(-) diff --git a/app/Services/EDocument/Standards/Peppol.php b/app/Services/EDocument/Standards/Peppol.php index afc2825813a2..83174ca0c051 100644 --- a/app/Services/EDocument/Standards/Peppol.php +++ b/app/Services/EDocument/Standards/Peppol.php @@ -137,7 +137,7 @@ class Peppol extends AbstractService $lea = new LineExtensionAmount(); $lea->currencyID = $this->invoice->client->currency()->code; - $lea->amount = $taxable; + $lea->amount = $this->invoice->uses_inclusive_taxes ? round($this->invoice->amount - $this->invoice->total_taxes, 2) : $taxable; $lmt->LineExtensionAmount = $lea; $tea = new TaxExclusiveAmount(); @@ -279,14 +279,11 @@ class Peppol extends AbstractService $lea = new LineExtensionAmount(); $lea->currencyID = $this->invoice->client->currency()->code; - $lea->amount = $item->line_total; + // $lea->amount = $item->line_total; + $lea->amount = $this->invoice->uses_inclusive_taxes ? round($item->line_total - $this->calcInclusiveLineTax($item->tax_rate1, $item->line_total), 2) : $item->line_total; $line->LineExtensionAmount = $lea; $line->Item = $_item; - // $ta = new TaxAmount; - // $ta->amount = $this->getItemTaxes($item); - // $ta->currencyID = $this->invoice->client->currency()->Code; - // $tt->TaxAmount = $ta; $item_taxes = $this->getItemTaxes($item); if(count($item_taxes) > 0) { @@ -336,7 +333,7 @@ class Peppol extends AbstractService $taxable_amount = new TaxableAmount(); $taxable_amount->currencyID = $this->invoice->client->currency()->code; - $taxable_amount->amount = $item->line_total; + $taxable_amount->amount = $this->invoice->uses_inclusive_taxes ? round($item->line_total - $tax_amount->amount,2) : $item->line_total; $tax_subtotal->TaxableAmount = $taxable_amount; $tc = new TaxCategory(); $tc->ID = $item->type_id == '2' ? 'HUR' : 'C62'; @@ -366,7 +363,7 @@ class Peppol extends AbstractService $taxable_amount = new TaxableAmount(); $taxable_amount->currencyID = $this->invoice->client->currency()->code; - $taxable_amount->amount = $item->line_total; + $taxable_amount->amount = $this->invoice->uses_inclusive_taxes ? round($item->line_total - $tax_amount->amount, 2) : $item->line_total; $tax_subtotal->TaxableAmount = $taxable_amount; @@ -399,7 +396,7 @@ class Peppol extends AbstractService $taxable_amount = new TaxableAmount(); $taxable_amount->currencyID = $this->invoice->client->currency()->code; - $taxable_amount->amount = $item->line_total; + $taxable_amount->amount = $this->invoice->uses_inclusive_taxes ? round($item->line_total - $tax_amount->amount, 2) : $item->line_total; $tax_subtotal->TaxableAmount = $taxable_amount; diff --git a/tests/Integration/Einvoice/Storecove/StorecoveTest.php b/tests/Integration/Einvoice/Storecove/StorecoveTest.php index 414feab2047a..1c4b353cc794 100644 --- a/tests/Integration/Einvoice/Storecove/StorecoveTest.php +++ b/tests/Integration/Einvoice/Storecove/StorecoveTest.php @@ -224,7 +224,7 @@ $x = ' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2"> -DE-53423 +DE-10515 2024-07-18 380 @@ -299,7 +299,7 @@ $x = ' - 100 + 84.03 84.03 100.00 100.00 @@ -307,11 +307,11 @@ $x = ' 1 10 - 100 + 84.03 15.97 - 100 + 84.03 15.97 C62 From d9302021472c3e7e23bac8c3d5fbec57a5f38f0c Mon Sep 17 00:00:00 2001 From: David Bomba Date: Fri, 19 Jul 2024 08:53:30 +1000 Subject: [PATCH 32/45] unwind route hash --- app/Services/EDocument/Standards/Peppol.php | 31 ++++++++++--------- routes/client.php | 20 ++++++------ .../Einvoice/Storecove/StorecoveTest.php | 22 ++++++++++--- 3 files changed, 44 insertions(+), 29 deletions(-) diff --git a/app/Services/EDocument/Standards/Peppol.php b/app/Services/EDocument/Standards/Peppol.php index 83174ca0c051..8387a799e4ad 100644 --- a/app/Services/EDocument/Standards/Peppol.php +++ b/app/Services/EDocument/Standards/Peppol.php @@ -164,18 +164,19 @@ class Peppol extends AbstractService $type_id = $this->invoice->line_items[0]->type_id; - if(strlen($this->invoice->tax_name1 ?? '') > 1) { + // if(strlen($this->invoice->tax_name1 ?? '') > 1) { $tax_amount = new TaxAmount(); $tax_amount->currencyID = $this->invoice->client->currency()->code; - $tax_amount->amount = $this->invoice->uses_inclusive_taxes ? $this->calcInclusiveLineTax($this->invoice->tax_rate1, $this->invoice->amount) : $this->calcAmountLineTax($this->invoice->tax_rate1, $this->invoice->amount); + // $tax_amount->amount = $this->invoice->uses_inclusive_taxes ? $this->calcInclusiveLineTax($this->invoice->tax_rate1, $this->invoice->amount) : $this->calcAmountLineTax($this->invoice->tax_rate1, $this->invoice->amount); + $tax_amount->amount = $this->invoice->uses_inclusive_taxes ? $this->invoice->total_taxes : $this->calcAmountLineTax($this->invoice->tax_rate1, $this->invoice->amount); $tax_subtotal = new TaxSubtotal(); $tax_subtotal->TaxAmount = $tax_amount; $taxable_amount = new TaxableAmount(); $taxable_amount->currencyID = $this->invoice->client->currency()->code; - $taxable_amount->amount = $this->invoice->amount; + $taxable_amount->amount = $this->invoice->uses_inclusive_taxes ? $this->invoice->amount - $this->invoice->total_taxes : $this->invoice->amount; $tax_subtotal->TaxableAmount = $taxable_amount; $tc = new TaxCategory(); @@ -188,10 +189,10 @@ class Peppol extends AbstractService $tax_total = new TaxTotal(); $tax_total->TaxAmount = $tax_amount; - $tax_total->TaxSubtotal = $tax_subtotal; + $tax_total->TaxSubtotal[] = $tax_subtotal; $taxes[] = $tax_total; - } + // } if(strlen($this->invoice->tax_name2 ?? '') > 1) { @@ -206,7 +207,7 @@ class Peppol extends AbstractService $taxable_amount = new TaxableAmount(); $taxable_amount->currencyID = $this->invoice->client->currency()->code; - $taxable_amount->amount = $this->invoice->amount; + $taxable_amount->amount = $this->invoice->uses_inclusive_taxes ? $this->invoice->amount- $this->invoice->total_taxes : $this->invoice->amount; $tax_subtotal->TaxableAmount = $taxable_amount; @@ -238,7 +239,7 @@ class Peppol extends AbstractService $taxable_amount = new TaxableAmount(); $taxable_amount->currencyID = $this->invoice->client->currency()->code; - $taxable_amount->amount = $this->invoice->amount; + $taxable_amount->amount = $this->invoice->uses_inclusive_taxes ? $this->invoice->amount - $this->invoice->total_taxes : $this->invoice->amount; $tax_subtotal->TaxableAmount = $taxable_amount; @@ -280,7 +281,7 @@ class Peppol extends AbstractService $lea = new LineExtensionAmount(); $lea->currencyID = $this->invoice->client->currency()->code; // $lea->amount = $item->line_total; - $lea->amount = $this->invoice->uses_inclusive_taxes ? round($item->line_total - $this->calcInclusiveLineTax($item->tax_rate1, $item->line_total), 2) : $item->line_total; + $lea->amount = $this->invoice->uses_inclusive_taxes ? $item->line_total - $this->calcInclusiveLineTax($item->tax_rate1, $item->line_total) : $item->line_total; $line->LineExtensionAmount = $lea; $line->Item = $_item; @@ -293,7 +294,7 @@ class Peppol extends AbstractService $price = new Price(); $pa = new PriceAmount(); $pa->currencyID = $this->invoice->client->currency()->code; - $pa->amount = $this->costWithDiscount($item); + $pa->amount = $this->costWithDiscount($item) - ( $this->invoice->uses_inclusive_taxes ? ($this->calcInclusiveLineTax($item->tax_rate1, $item->line_total)/$item->quantity) : 0); $price->PriceAmount = $pa; $line->Price = $price; @@ -333,7 +334,7 @@ class Peppol extends AbstractService $taxable_amount = new TaxableAmount(); $taxable_amount->currencyID = $this->invoice->client->currency()->code; - $taxable_amount->amount = $this->invoice->uses_inclusive_taxes ? round($item->line_total - $tax_amount->amount,2) : $item->line_total; + $taxable_amount->amount = $this->invoice->uses_inclusive_taxes ? $item->line_total - $tax_amount->amount : $item->line_total; $tax_subtotal->TaxableAmount = $taxable_amount; $tc = new TaxCategory(); $tc->ID = $item->type_id == '2' ? 'HUR' : 'C62'; @@ -356,14 +357,15 @@ class Peppol extends AbstractService $tax_amount = new TaxAmount(); $tax_amount->currencyID = $this->invoice->client->currency()->code; - $tax_amount->amount = $this->invoice->uses_inclusive_taxes ? $this->calcInclusiveLineTax($item->tax_rate2, $item->line_total) : $this->calcAmountLineTax($item->tax_rate2, $item->line_total); + +$tax_amount->amount = $this->invoice->uses_inclusive_taxes ? $this->calcInclusiveLineTax($item->tax_rate2, $item->line_total) : $this->calcAmountLineTax($item->tax_rate2, $item->line_total); $tax_subtotal = new TaxSubtotal(); $tax_subtotal->TaxAmount = $tax_amount; $taxable_amount = new TaxableAmount(); $taxable_amount->currencyID = $this->invoice->client->currency()->code; - $taxable_amount->amount = $this->invoice->uses_inclusive_taxes ? round($item->line_total - $tax_amount->amount, 2) : $item->line_total; + $taxable_amount->amount = $item->line_total; $tax_subtotal->TaxableAmount = $taxable_amount; @@ -389,14 +391,15 @@ class Peppol extends AbstractService $tax_amount = new TaxAmount(); $tax_amount->currencyID = $this->invoice->client->currency()->code; - $tax_amount->amount = $this->invoice->uses_inclusive_taxes ? $this->calcInclusiveLineTax($item->tax_rate3, $item->line_total) : $this->calcAmountLineTax($item->tax_rate3, $item->line_total); + +$tax_amount->amount = $this->invoice->uses_inclusive_taxes ? $this->calcInclusiveLineTax($item->tax_rate3, $item->line_total) : $this->calcAmountLineTax($item->tax_rate3, $item->line_total); $tax_subtotal = new TaxSubtotal(); $tax_subtotal->TaxAmount = $tax_amount; $taxable_amount = new TaxableAmount(); $taxable_amount->currencyID = $this->invoice->client->currency()->code; - $taxable_amount->amount = $this->invoice->uses_inclusive_taxes ? round($item->line_total - $tax_amount->amount, 2) : $item->line_total; + $taxable_amount->amount = $item->line_total; $tax_subtotal->TaxableAmount = $taxable_amount; diff --git a/routes/client.php b/routes/client.php index 8b29dc956c17..7f9d4614f0e0 100644 --- a/routes/client.php +++ b/routes/client.php @@ -144,20 +144,20 @@ Route::group(['middleware' => ['invite_db'], 'prefix' => 'client', 'as' => 'clie Route::get('unsubscribe/{entity}/{invitation_key}', [App\Http\Controllers\ClientPortal\InvitationController::class, 'unsubscribe'])->name('unsubscribe'); }); -Route::get('route/{hash}', function ($hash) { +// Route::get('route/{hash}', function ($hash) { - $route = '/'; +// $route = '/'; - try { - $route = decrypt($hash); - } - catch (\Exception $e) { - abort(404); - } +// try { +// $route = decrypt($hash); +// } +// catch (\Exception $e) { +// abort(404); +// } - return redirect($route); +// return redirect($route); -})->middleware('throttle:404'); +// })->middleware('throttle:404'); Route::get('phantom/{entity}/{invitation_key}', [Phantom::class, 'displayInvitation'])->middleware(['invite_db', 'phantom_secret'])->name('phantom_view'); Route::get('blade/', [Phantom::class, 'blade'])->name('blade'); diff --git a/tests/Integration/Einvoice/Storecove/StorecoveTest.php b/tests/Integration/Einvoice/Storecove/StorecoveTest.php index 1c4b353cc794..e121caf0ba5c 100644 --- a/tests/Integration/Einvoice/Storecove/StorecoveTest.php +++ b/tests/Integration/Einvoice/Storecove/StorecoveTest.php @@ -218,13 +218,12 @@ class StorecoveTest extends TestCase '; //inclusive -$x = ' - +$x = ' -DE-10515 +DE-93090 2024-07-18 380 @@ -297,7 +296,20 @@ $x = ' - + + 15.97 + + 84.03 + 15.97 + + C62 + 0 + + + + + + 84.03 84.03 @@ -327,7 +339,7 @@ $x = ' Product Key - 10 + 8.403 '; From 2b3f4ec3317e493f8cbc6150d8c5ea5389e7035a Mon Sep 17 00:00:00 2001 From: David Bomba Date: Fri, 19 Jul 2024 08:55:28 +1000 Subject: [PATCH 33/45] Remove unused routes --- VERSION.txt | 2 +- config/ninja.php | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/VERSION.txt b/VERSION.txt index 576f92a4fe93..e9ea7868d298 100644 --- a/VERSION.txt +++ b/VERSION.txt @@ -1 +1 @@ -5.10.10 \ No newline at end of file +5.10.11 \ No newline at end of file diff --git a/config/ninja.php b/config/ninja.php index 615673bec9c9..21f22b804175 100644 --- a/config/ninja.php +++ b/config/ninja.php @@ -17,8 +17,8 @@ return [ 'require_https' => env('REQUIRE_HTTPS', true), 'app_url' => rtrim(env('APP_URL', ''), '/'), 'app_domain' => env('APP_DOMAIN', 'invoicing.co'), - 'app_version' => env('APP_VERSION', '5.10.10'), - 'app_tag' => env('APP_TAG', '5.10.10'), + 'app_version' => env('APP_VERSION', '5.10.11'), + 'app_tag' => env('APP_TAG', '5.10.11'), 'minimum_client_version' => '5.0.16', 'terms_version' => '1.0.1', 'api_secret' => env('API_SECRET', false), From 62e91b6f21f06ba22fa4b3e87f93da84ee4088a0 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Fri, 19 Jul 2024 10:13:19 +1000 Subject: [PATCH 34/45] Fixes for twig templatse --- app/Services/Template/TemplateService.php | 2 +- resources/views/templates/payments/tp6.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/Services/Template/TemplateService.php b/app/Services/Template/TemplateService.php index 196e3c5f2cdc..5a033c2f5383 100644 --- a/app/Services/Template/TemplateService.php +++ b/app/Services/Template/TemplateService.php @@ -124,7 +124,7 @@ class TemplateService $this->twig->addFilter($filter); $allowedTags = ['if', 'for', 'set', 'filter']; - $allowedFilters = ['escape', 'e', 'upper', 'lower', 'capitalize', 'filter', 'length', 'merge','format_currency', 'format_number','format_percent_number','map', 'join', 'first', 'date','sum']; + $allowedFilters = ['escape', 'e', 'upper', 'lower', 'capitalize', 'filter', 'length', 'merge','format_currency', 'format_number','format_percent_number','map', 'join', 'first', 'date', 'sum', 'number_format']; $allowedFunctions = ['range', 'cycle', 'constant', 'date',]; $allowedProperties = ['type_id']; $allowedMethods = ['img','t']; diff --git a/resources/views/templates/payments/tp6.html b/resources/views/templates/payments/tp6.html index 0c762d869bb5..c6d38d258589 100644 --- a/resources/views/templates/payments/tp6.html +++ b/resources/views/templates/payments/tp6.html @@ -394,7 +394,7 @@ - ${{ totalPrice|number_format(2, '.', ',') }} + ${{ totalPrice|format_currency(2, '.', ',') }} From 447278ca807c9361560f1f5d114a5de1b48c71bc Mon Sep 17 00:00:00 2001 From: David Bomba Date: Fri, 19 Jul 2024 10:28:28 +1000 Subject: [PATCH 35/45] Fixes for twig templatse --- resources/views/templates/payments/tp6.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/views/templates/payments/tp6.html b/resources/views/templates/payments/tp6.html index c6d38d258589..ed3e7d85f1a4 100644 --- a/resources/views/templates/payments/tp6.html +++ b/resources/views/templates/payments/tp6.html @@ -394,7 +394,7 @@ - ${{ totalPrice|format_currency(2, '.', ',') }} + ${{ totalPrice|format_currency(currency_code) }} From bf00219bbedbedfbeef0dcf0deac0cc1c5e4dce6 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Fri, 19 Jul 2024 10:51:52 +1000 Subject: [PATCH 36/45] Minor fixes when restoring designs --- app/Repositories/DesignRepository.php | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/app/Repositories/DesignRepository.php b/app/Repositories/DesignRepository.php index e9c979e5e4a5..f63e54b45ec3 100644 --- a/app/Repositories/DesignRepository.php +++ b/app/Repositories/DesignRepository.php @@ -11,6 +11,7 @@ namespace App\Repositories; +use App\Utils\Ninja; use App\Models\Design; use Illuminate\Support\Str; @@ -54,4 +55,20 @@ class DesignRepository extends BaseRepository return $design; } + + /** + * @param $entity + */ + public function restore($design) + { + + $design->name = str_ireplace("_deleted_", "_restored_", $design->name); + + parent::restore($design); + + return $design; + + } + + } From 684533a5914c587587463fa33bf8fe7e24104196 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Sat, 20 Jul 2024 13:36:38 +1000 Subject: [PATCH 37/45] Fixes for paypal driver --- .../PayPal/PayPalBasePaymentDriver.php | 86 +++++++++++-------- .../PayPalRestPaymentDriver.php | 79 ++++++++++------- .../gateways/paypal/ppcp/card.blade.php | 32 +++---- 3 files changed, 106 insertions(+), 91 deletions(-) diff --git a/app/PaymentDrivers/PayPal/PayPalBasePaymentDriver.php b/app/PaymentDrivers/PayPal/PayPalBasePaymentDriver.php index 4e01c7582c0b..ec637548d3ae 100644 --- a/app/PaymentDrivers/PayPal/PayPalBasePaymentDriver.php +++ b/app/PaymentDrivers/PayPal/PayPalBasePaymentDriver.php @@ -530,56 +530,68 @@ class PayPalBasePaymentDriver extends BaseDriver public function createNinjaPayment($request, $response) { - $data = [ - 'payment_type' => $this->getPaymentMethod($request->gateway_type_id), - 'amount' => $response['purchase_units'][0]['payments']['captures'][0]['amount']['value'], - 'transaction_reference' => $response['purchase_units'][0]['payments']['captures'][0]['id'], - 'gateway_type_id' => GatewayType::PAYPAL, - ]; + if(isset($response['purchase_units'][0]['payments']['captures'][0]['status']) && in_array($response['purchase_units'][0]['payments']['captures'][0]['status'], ['COMPLETED', 'PENDING'])) + { - $payment = $this->createPayment($data, \App\Models\Payment::STATUS_COMPLETED); + $payment_status = $response['purchase_units'][0]['payments']['captures'][0]['status'] == 'COMPLETED' ? \App\Models\Payment::STATUS_COMPLETED : \App\Models\Payment::STATUS_PENDING; - if ($request->has('store_card') && $request->input('store_card') === true) { - $payment_source = $response->json()['payment_source'] ?? false; + $data = [ + 'payment_type' => $this->getPaymentMethod($request->gateway_type_id), + 'amount' => $response['purchase_units'][0]['payments']['captures'][0]['amount']['value'], + 'transaction_reference' => $response['purchase_units'][0]['payments']['captures'][0]['id'], + 'gateway_type_id' => GatewayType::PAYPAL, + ]; - if(isset($payment_source['card']) && ($payment_source['card']['attributes']['vault']['status'] ?? false) && $payment_source['card']['attributes']['vault']['status'] == 'VAULTED') { + $payment = $this->createPayment($data, $payment_status); - $last4 = $payment_source['card']['last_digits']; - $expiry = $payment_source['card']['expiry']; //'2025-01' - $expiry_meta = explode('-', $expiry); - $brand = $payment_source['card']['brand']; + if ($request->has('store_card') && $request->input('store_card') === true) { + $payment_source = $response->json()['payment_source'] ?? false; - $payment_meta = new \stdClass(); - $payment_meta->exp_month = $expiry_meta[1] ?? ''; - $payment_meta->exp_year = $expiry_meta[0] ?? $expiry; - $payment_meta->brand = $brand; - $payment_meta->last4 = $last4; - $payment_meta->type = GatewayType::CREDIT_CARD; + if(isset($payment_source['card']) && ($payment_source['card']['attributes']['vault']['status'] ?? false) && $payment_source['card']['attributes']['vault']['status'] == 'VAULTED') { - $token = $payment_source['card']['attributes']['vault']['id']; // 09f28652d01257021 - $gateway_customer_reference = $payment_source['card']['attributes']['vault']['customer']['id']; //rbTHnLsZqE; + $last4 = $payment_source['card']['last_digits']; + $expiry = $payment_source['card']['expiry']; //'2025-01' + $expiry_meta = explode('-', $expiry); + $brand = $payment_source['card']['brand']; - $data['token'] = $token; - $data['payment_method_id'] = GatewayType::PAYPAL_ADVANCED_CARDS; - $data['payment_meta'] = $payment_meta; + $payment_meta = new \stdClass(); + $payment_meta->exp_month = $expiry_meta[1] ?? ''; + $payment_meta->exp_year = $expiry_meta[0] ?? $expiry; + $payment_meta->brand = $brand; + $payment_meta->last4 = $last4; + $payment_meta->type = GatewayType::CREDIT_CARD; - $additional['gateway_customer_reference'] = $gateway_customer_reference; + $token = $payment_source['card']['attributes']['vault']['id']; // 09f28652d01257021 + $gateway_customer_reference = $payment_source['card']['attributes']['vault']['customer']['id']; //rbTHnLsZqE; - $this->storeGatewayToken($data, $additional); + $data['token'] = $token; + $data['payment_method_id'] = GatewayType::PAYPAL_ADVANCED_CARDS; + $data['payment_meta'] = $payment_meta; + $additional['gateway_customer_reference'] = $gateway_customer_reference; + + $this->storeGatewayToken($data, $additional); + + } } + + SystemLogger::dispatch( + ['response' => $response->json(), 'data' => $data], + SystemLog::CATEGORY_GATEWAY_RESPONSE, + SystemLog::EVENT_GATEWAY_SUCCESS, + SystemLog::TYPE_PAYPAL, + $this->client, + $this->client->company, + ); + + return response()->json(['redirect' => route('client.payments.show', ['payment' => $this->encodePrimaryKey($payment->id)], false)]); } - SystemLogger::dispatch( - ['response' => $response->json(), 'data' => $data], - SystemLog::CATEGORY_GATEWAY_RESPONSE, - SystemLog::EVENT_GATEWAY_SUCCESS, - SystemLog::TYPE_PAYPAL, - $this->client, - $this->client->company, - ); - - return response()->json(['redirect' => route('client.payments.show', ['payment' => $this->encodePrimaryKey($payment->id)], false)]); + SystemLogger::dispatch($response, SystemLog::CATEGORY_GATEWAY_RESPONSE, SystemLog::EVENT_GATEWAY_FAILURE, SystemLog::TYPE_PAYPAL, $this->client, $this->client->company); + + $error = isset($response['purchase_units'][0]['payments']['captures'][0]['status_details'][0]) ? $response['purchase_units'][0]['payments']['captures'][0]['status_details'][0] : $response['purchase_units'][0]['payments']['captures'][0]['status']; + + return response()->json(['message' => $error], 400); } diff --git a/app/PaymentDrivers/PayPalRestPaymentDriver.php b/app/PaymentDrivers/PayPalRestPaymentDriver.php index d6e8dbadcf5c..524b59f8c632 100644 --- a/app/PaymentDrivers/PayPalRestPaymentDriver.php +++ b/app/PaymentDrivers/PayPalRestPaymentDriver.php @@ -288,8 +288,6 @@ class PayPalRestPaymentDriver extends PayPalBasePaymentDriver $orderId = $this->createOrder($data); - // $r = $this->gatewayRequest("/v2/checkout/orders/{$orderId}", 'get', ['body' => '']); - try { $r = $this->gatewayRequest("/v2/checkout/orders/{$orderId}", 'get', ['body' => '']); @@ -318,25 +316,33 @@ class PayPalRestPaymentDriver extends PayPalBasePaymentDriver $response = $r->json(); - $data = [ - 'payment_type' => $this->getPaymentMethod($request->gateway_type_id), - 'amount' => $response['purchase_units'][0]['payments']['captures'][0]['amount']['value'], - 'transaction_reference' => $response['purchase_units'][0]['payments']['captures'][0]['id'], - 'gateway_type_id' => $this->gateway_type_id, - ]; + if(isset($response['purchase_units'][0]['payments']['captures'][0]['status']) && $response['purchase_units'][0]['payments']['captures'][0]['status'] == 'COMPLETED') + { + $data = [ + 'payment_type' => $this->getPaymentMethod($request->gateway_type_id), + 'amount' => $response['purchase_units'][0]['payments']['captures'][0]['amount']['value'], + 'transaction_reference' => $response['purchase_units'][0]['payments']['captures'][0]['id'], + 'gateway_type_id' => $this->gateway_type_id, + ]; - $payment = $this->createPayment($data, \App\Models\Payment::STATUS_COMPLETED); + $payment = $this->createPayment($data, \App\Models\Payment::STATUS_COMPLETED); - SystemLogger::dispatch( - ['response' => $response, 'data' => $data], - SystemLog::CATEGORY_GATEWAY_RESPONSE, - SystemLog::EVENT_GATEWAY_SUCCESS, - SystemLog::TYPE_PAYPAL, - $this->client, - $this->client->company, - ); + SystemLogger::dispatch( + ['response' => $response, 'data' => $data], + SystemLog::CATEGORY_GATEWAY_RESPONSE, + SystemLog::EVENT_GATEWAY_SUCCESS, + SystemLog::TYPE_PAYPAL, + $this->client, + $this->client->company, + ); - return redirect()->route('client.payments.show', ['payment' => $this->encodePrimaryKey($payment->id)]); + return redirect()->route('client.payments.show', ['payment' => $this->encodePrimaryKey($payment->id)]); + + } + + + + } @@ -387,24 +393,31 @@ class PayPalRestPaymentDriver extends PayPalBasePaymentDriver $response = $r->json(); - $data = [ - 'payment_type' => $this->getPaymentMethod((string)$cgt->gateway_type_id), - 'amount' => $response['purchase_units'][0]['payments']['captures'][0]['amount']['value'], - 'transaction_reference' => $response['purchase_units'][0]['payments']['captures'][0]['id'], - 'gateway_type_id' => $this->gateway_type_id, - ]; + if(isset($response['purchase_units'][0]['payments']['captures'][0]['status']) && $response['purchase_units'][0]['payments']['captures'][0]['status'] == 'COMPLETED') + { - $payment = $this->createPayment($data, \App\Models\Payment::STATUS_COMPLETED); + $data = [ + 'payment_type' => $this->getPaymentMethod((string)$cgt->gateway_type_id), + 'amount' => $response['purchase_units'][0]['payments']['captures'][0]['amount']['value'], + 'transaction_reference' => $response['purchase_units'][0]['payments']['captures'][0]['id'], + 'gateway_type_id' => $this->gateway_type_id, + ]; - SystemLogger::dispatch( - ['response' => $response, 'data' => $data], - SystemLog::CATEGORY_GATEWAY_RESPONSE, - SystemLog::EVENT_GATEWAY_SUCCESS, - SystemLog::TYPE_PAYPAL_PPCP, - $this->client, - $this->client->company, - ); + $payment = $this->createPayment($data, \App\Models\Payment::STATUS_COMPLETED); + SystemLogger::dispatch( + ['response' => $response, 'data' => $data], + SystemLog::CATEGORY_GATEWAY_RESPONSE, + SystemLog::EVENT_GATEWAY_SUCCESS, + SystemLog::TYPE_PAYPAL_PPCP, + $this->client, + $this->client->company, + ); + } + + $this->processInternallyFailedPayment($this, new \Exception('Auto billing failed.', 400)); + + SystemLogger::dispatch($data, SystemLog::CATEGORY_GATEWAY_RESPONSE, SystemLog::EVENT_GATEWAY_FAILURE, SystemLog::TYPE_PAYPAL, $this->client, $this->client->company); } } diff --git a/resources/views/portal/ninja2020/gateways/paypal/ppcp/card.blade.php b/resources/views/portal/ninja2020/gateways/paypal/ppcp/card.blade.php index 63e1578f3dd8..43554bebb306 100644 --- a/resources/views/portal/ninja2020/gateways/paypal/ppcp/card.blade.php +++ b/resources/views/portal/ninja2020/gateways/paypal/ppcp/card.blade.php @@ -14,10 +14,10 @@ @endphp @section('gateway_head') - + script-src 'self' https://c.paypal.com;"> --> @endsection @section('gateway_content') @@ -86,7 +86,7 @@ } - + @if(isset($merchantId)) @@ -138,10 +138,15 @@ body: formData, }) .then(response => { + if (!response.ok) { - throw new Error('Network response was not ok ' + response.statusText); + return response.json().then(errorData => { + throw new Error(errorData.message); + }); } + return response.json(); + }) .then(data => { @@ -164,7 +169,6 @@ document.getElementById('errors').textContent = `Sorry, your transaction could not be processed...\n\n${error.message}`; document.getElementById('errors').hidden = false; - }); }, @@ -172,20 +176,6 @@ window.location.href = "/client/invoices/"; }, - // onError: function(error) { - - - // console.log("submit catch"); - // const errorM = parseError(error); - - // console.log(errorM); - - // const msg = handle422Error(errorM); - - // document.getElementById('errors').textContent = `Sorry, your transaction could not be processed...\n\n${msg.description}`; - // document.getElementById('errors').hidden = false; - - // }, onClick: function (){ } @@ -195,8 +185,8 @@ // Render each field after checking for eligibility if (cardField.isEligible()) { - // const nameField = cardField.NameField(); - // nameField.render("#card-name-field-container"); + const nameField = cardField.NameField(); + nameField.render("#card-name-field-container"); const numberField = cardField.NumberField({ inputEvents: { From e6186e9a83856e139f58efcf79a89bfdbc09ef44 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Sat, 20 Jul 2024 13:38:12 +1000 Subject: [PATCH 38/45] V5.10.12 --- VERSION.txt | 2 +- config/ninja.php | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/VERSION.txt b/VERSION.txt index e9ea7868d298..645ef4b2679d 100644 --- a/VERSION.txt +++ b/VERSION.txt @@ -1 +1 @@ -5.10.11 \ No newline at end of file +5.10.12 \ No newline at end of file diff --git a/config/ninja.php b/config/ninja.php index 21f22b804175..44f971416b66 100644 --- a/config/ninja.php +++ b/config/ninja.php @@ -17,8 +17,8 @@ return [ 'require_https' => env('REQUIRE_HTTPS', true), 'app_url' => rtrim(env('APP_URL', ''), '/'), 'app_domain' => env('APP_DOMAIN', 'invoicing.co'), - 'app_version' => env('APP_VERSION', '5.10.11'), - 'app_tag' => env('APP_TAG', '5.10.11'), + 'app_version' => env('APP_VERSION', '5.10.12'), + 'app_tag' => env('APP_TAG', '5.10.12'), 'minimum_client_version' => '5.0.16', 'terms_version' => '1.0.1', 'api_secret' => env('API_SECRET', false), From 3981d59ef37203f82ff5872f6b093817a9e2b4d3 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Sun, 21 Jul 2024 11:12:07 +1000 Subject: [PATCH 39/45] Fixes for translations --- .../PayPal/PayPalBasePaymentDriver.php | 1 + .../PayPalPPCPPaymentDriver.php | 79 +++++++++++-------- .../PayPalRestPaymentDriver.php | 7 +- app/Services/Client/PaymentMethod.php | 2 +- lang/en/texts.php | 2 +- .../ninja2020/gateways/paypal/pay.blade.php | 33 ++++---- .../gateways/paypal/ppcp/pay.blade.php | 9 ++- 7 files changed, 74 insertions(+), 59 deletions(-) diff --git a/app/PaymentDrivers/PayPal/PayPalBasePaymentDriver.php b/app/PaymentDrivers/PayPal/PayPalBasePaymentDriver.php index ec637548d3ae..56824c840269 100644 --- a/app/PaymentDrivers/PayPal/PayPalBasePaymentDriver.php +++ b/app/PaymentDrivers/PayPal/PayPalBasePaymentDriver.php @@ -525,6 +525,7 @@ class PayPalBasePaymentDriver extends BaseDriver $this->init(); PayPalWebhook::dispatch($request->all(), $request->headers->all(), $this->access_token); + } public function createNinjaPayment($request, $response) diff --git a/app/PaymentDrivers/PayPalPPCPPaymentDriver.php b/app/PaymentDrivers/PayPalPPCPPaymentDriver.php index 14fd0ace2dcb..4cb22ad728b7 100644 --- a/app/PaymentDrivers/PayPalPPCPPaymentDriver.php +++ b/app/PaymentDrivers/PayPalPPCPPaymentDriver.php @@ -306,7 +306,6 @@ class PayPalPPCPPaymentDriver extends PayPalBasePaymentDriver * * @param mixed $request * @param array $response - * @return void */ public function processTokenPayment($request, array $response) { @@ -362,26 +361,32 @@ class PayPalPPCPPaymentDriver extends PayPalBasePaymentDriver } $response = $r->json(); + + if(isset($response['purchase_units'][0]['payments']['captures'][0]['status']) && $response['purchase_units'][0]['payments']['captures'][0]['status'] == 'COMPLETED') + { - $data = [ - 'payment_type' => $this->getPaymentMethod($request->gateway_type_id), - 'amount' => $response['purchase_units'][0]['payments']['captures'][0]['amount']['value'], - 'transaction_reference' => $response['purchase_units'][0]['payments']['captures'][0]['id'], - 'gateway_type_id' => $this->gateway_type_id, - ]; + $data = [ + 'payment_type' => $this->getPaymentMethod($request->gateway_type_id), + 'amount' => $response['purchase_units'][0]['payments']['captures'][0]['amount']['value'], + 'transaction_reference' => $response['purchase_units'][0]['payments']['captures'][0]['id'], + 'gateway_type_id' => $this->gateway_type_id, + ]; - $payment = $this->createPayment($data, \App\Models\Payment::STATUS_COMPLETED); + $payment = $this->createPayment($data, \App\Models\Payment::STATUS_COMPLETED); - SystemLogger::dispatch( - ['response' => $response, 'data' => $data], - SystemLog::CATEGORY_GATEWAY_RESPONSE, - SystemLog::EVENT_GATEWAY_SUCCESS, - SystemLog::TYPE_PAYPAL_PPCP, - $this->client, - $this->client->company, - ); + SystemLogger::dispatch( + ['response' => $response, 'data' => $data], + SystemLog::CATEGORY_GATEWAY_RESPONSE, + SystemLog::EVENT_GATEWAY_SUCCESS, + SystemLog::TYPE_PAYPAL_PPCP, + $this->client, + $this->client->company, + ); - return redirect()->route('client.payments.show', ['payment' => $this->encodePrimaryKey($payment->id)]); + return redirect()->route('client.payments.show', ['payment' => $this->encodePrimaryKey($payment->id)]); + } + + return response()->json(['message' => 'Error processing token payment'], 400); } @@ -431,26 +436,36 @@ class PayPalPPCPPaymentDriver extends PayPalBasePaymentDriver } $response = $r->json(); + if(isset($response['purchase_units'][0]['payments']['captures'][0]['status']) && $response['purchase_units'][0]['payments']['captures'][0]['status'] == 'COMPLETED') + { - $data = [ - 'payment_type' => $this->getPaymentMethod((string)$cgt->gateway_type_id), - 'amount' => $response['purchase_units'][0]['payments']['captures'][0]['amount']['value'], - 'transaction_reference' => $response['purchase_units'][0]['payments']['captures'][0]['id'], - 'gateway_type_id' => $this->gateway_type_id, - ]; + $data = [ + 'payment_type' => $this->getPaymentMethod((string)$cgt->gateway_type_id), + 'amount' => $response['purchase_units'][0]['payments']['captures'][0]['amount']['value'], + 'transaction_reference' => $response['purchase_units'][0]['payments']['captures'][0]['id'], + 'gateway_type_id' => $this->gateway_type_id, + ]; - $payment = $this->createPayment($data, \App\Models\Payment::STATUS_COMPLETED); + $payment = $this->createPayment($data, \App\Models\Payment::STATUS_COMPLETED); - SystemLogger::dispatch( - ['response' => $response, 'data' => $data], - SystemLog::CATEGORY_GATEWAY_RESPONSE, - SystemLog::EVENT_GATEWAY_SUCCESS, - SystemLog::TYPE_PAYPAL_PPCP, - $this->client, - $this->client->company, - ); + SystemLogger::dispatch( + ['response' => $response, 'data' => $data], + SystemLog::CATEGORY_GATEWAY_RESPONSE, + SystemLog::EVENT_GATEWAY_SUCCESS, + SystemLog::TYPE_PAYPAL_PPCP, + $this->client, + $this->client->company, + ); + } + + $this->processInternallyFailedPayment($this, new \Exception('Auto billing failed.', 400)); + + SystemLogger::dispatch($response, SystemLog::CATEGORY_GATEWAY_RESPONSE, SystemLog::EVENT_GATEWAY_FAILURE, SystemLog::TYPE_PAYPAL, $this->client, $this->client->company); } + + + } diff --git a/app/PaymentDrivers/PayPalRestPaymentDriver.php b/app/PaymentDrivers/PayPalRestPaymentDriver.php index 524b59f8c632..ba1cbc62e7f2 100644 --- a/app/PaymentDrivers/PayPalRestPaymentDriver.php +++ b/app/PaymentDrivers/PayPalRestPaymentDriver.php @@ -340,9 +340,7 @@ class PayPalRestPaymentDriver extends PayPalBasePaymentDriver } - - - + return response()->json(['message' => 'Error processing token payment'], 400); } @@ -413,11 +411,12 @@ class PayPalRestPaymentDriver extends PayPalBasePaymentDriver $this->client, $this->client->company, ); + } $this->processInternallyFailedPayment($this, new \Exception('Auto billing failed.', 400)); - SystemLogger::dispatch($data, SystemLog::CATEGORY_GATEWAY_RESPONSE, SystemLog::EVENT_GATEWAY_FAILURE, SystemLog::TYPE_PAYPAL, $this->client, $this->client->company); + SystemLogger::dispatch($response, SystemLog::CATEGORY_GATEWAY_RESPONSE, SystemLog::EVENT_GATEWAY_FAILURE, SystemLog::TYPE_PAYPAL, $this->client, $this->client->company); } } diff --git a/app/Services/Client/PaymentMethod.php b/app/Services/Client/PaymentMethod.php index 8a27f3183144..de5e1622585d 100644 --- a/app/Services/Client/PaymentMethod.php +++ b/app/Services/Client/PaymentMethod.php @@ -169,7 +169,7 @@ class PaymentMethod if (isset($gateway->fees_and_limits) && is_object($gateway->fees_and_limits) && property_exists($gateway->fees_and_limits, GatewayType::CREDIT_CARD)) { //@phpstan-ignore-line if ($this->validGatewayForAmount($gateway->fees_and_limits->{GatewayType::CREDIT_CARD}, $this->amount)) { // $this->payment_methods[] = [$gateway->id => $type]; - //@15-06-2024 + // @15-06-2024 $this->buildUrl($gateway, $type); } } else { diff --git a/lang/en/texts.php b/lang/en/texts.php index fbfdef2e6177..e2bad2efdae3 100644 --- a/lang/en/texts.php +++ b/lang/en/texts.php @@ -5238,7 +5238,7 @@ $lang = array( 'local_domain_help' => 'EHLO domain (optional)', 'port_help' => 'ie. 25,587,465', 'host_help' => 'ie. smtp.gmail.com', - 'always_show_required_fields' => 'Allows show required fields form', + 'always_show_required_fields' => 'Always show required fields form', 'always_show_required_fields_help' => 'Displays the required fields form always at checkout', 'advanced_cards' => 'Advanced Cards', 'activity_140' => 'Statement sent to :client', diff --git a/resources/views/portal/ninja2020/gateways/paypal/pay.blade.php b/resources/views/portal/ninja2020/gateways/paypal/pay.blade.php index 29137b17a426..b11b968a7f15 100644 --- a/resources/views/portal/ninja2020/gateways/paypal/pay.blade.php +++ b/resources/views/portal/ninja2020/gateways/paypal/pay.blade.php @@ -30,16 +30,6 @@ @push('footer') - - - - -