From cb9e40d44290965f305e64f7ca8a2c923912941e Mon Sep 17 00:00:00 2001 From: David Bomba Date: Wed, 19 Jun 2024 12:45:42 +1000 Subject: [PATCH 01/20] Referral Meta --- app/Libraries/MultiDB.php | 17 +++++++++++ app/Models/User.php | 3 ++ app/Transformers/UserTransformer.php | 1 + ...9_015127_2024_06_19_referral_meta_data.php | 28 +++++++++++++++++++ 4 files changed, 49 insertions(+) create mode 100644 database/migrations/2024_06_19_015127_2024_06_19_referral_meta_data.php diff --git a/app/Libraries/MultiDB.php b/app/Libraries/MultiDB.php index 712ed37184e4..a0cd1aa8606f 100644 --- a/app/Libraries/MultiDB.php +++ b/app/Libraries/MultiDB.php @@ -449,6 +449,23 @@ class MultiDB return false; } + + public static function findUserByReferralCode(string $referral_code): ?User + { + $current_db = config('database.default'); + + foreach (self::$dbs as $db) { + if ($user = User::on($db)->where('referral_code', $referral_code)->first()) { + self::setDb($db); + return $user; + } + } + + self::setDB($current_db); + + return false; + } + public static function findAndSetDbByClientId($client_id): ?Client { $current_db = config('database.default'); diff --git a/app/Models/User.php b/app/Models/User.php index c10132696530..b3b71535599e 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -67,6 +67,7 @@ use Laracasts\Presenter\PresentableTrait; * @property string|null $custom_value2 * @property string|null $custom_value3 * @property string|null $custom_value4 + * @property object|null $referral_meta * @property int|null $created_at * @property int|null $updated_at * @property int|null|Carbon $deleted_at @@ -181,6 +182,7 @@ class User extends Authenticatable implements MustVerifyEmail 'created_at' => 'timestamp', 'deleted_at' => 'timestamp', 'oauth_user_token_expiry' => 'datetime', + 'referral_meta' => 'object', ]; public function name() @@ -680,4 +682,5 @@ class User extends Authenticatable implements MustVerifyEmail { return ctrans('texts.user'); } + } diff --git a/app/Transformers/UserTransformer.php b/app/Transformers/UserTransformer.php index 83d4d8fb10a0..5ad95ba7cb9b 100644 --- a/app/Transformers/UserTransformer.php +++ b/app/Transformers/UserTransformer.php @@ -66,6 +66,7 @@ class UserTransformer extends EntityTransformer 'language_id' => (string) $user->language_id ?: '', 'user_logged_in_notification' => (bool) $user->user_logged_in_notification, 'referral_code' => (string) $user->referral_code, + 'referral_meta' => $user->referral_meta ? (object)$user->referral_meta : new \stdClass, ]; } diff --git a/database/migrations/2024_06_19_015127_2024_06_19_referral_meta_data.php b/database/migrations/2024_06_19_015127_2024_06_19_referral_meta_data.php new file mode 100644 index 000000000000..b85db245d48d --- /dev/null +++ b/database/migrations/2024_06_19_015127_2024_06_19_referral_meta_data.php @@ -0,0 +1,28 @@ +mediumText('referral_meta')->nullable(); + }); + + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + // + } +}; From 45b43094b0900f30e055759d6ce9685e4396f8d1 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Wed, 19 Jun 2024 13:57:50 +1000 Subject: [PATCH 02/20] Notify user on assignment of task --- .../Transformer/TransactionTransformer.php | 2 +- app/Helpers/Invoice/ProRata.php | 4 +- .../Preview/PreviewPurchaseOrderRequest.php | 10 +-- app/Jobs/Task/TaskAssigned.php | 71 +++++++++++++++++++ app/Models/Task.php | 12 +++- app/Observers/ClientContactObserver.php | 11 +-- app/Observers/TaskObserver.php | 1 - app/Repositories/TaskRepository.php | 5 ++ .../Traits/Notifications/UserNotifies.php | 5 ++ lang/en/texts.php | 38 +--------- 10 files changed, 103 insertions(+), 56 deletions(-) create mode 100644 app/Jobs/Task/TaskAssigned.php diff --git a/app/Helpers/Bank/Nordigen/Transformer/TransactionTransformer.php b/app/Helpers/Bank/Nordigen/Transformer/TransactionTransformer.php index 8e85a806289d..1cf71f50c506 100644 --- a/app/Helpers/Bank/Nordigen/Transformer/TransactionTransformer.php +++ b/app/Helpers/Bank/Nordigen/Transformer/TransactionTransformer.php @@ -186,7 +186,7 @@ class TransactionTransformer implements BankRevenueInterface } try { - return Carbon::createFromFormat("d-m-Y", $input)->setTimezone($timezone_name)->format($date_format_default) ?? $input; + return Carbon::createFromFormat("d-m-Y", $input)->setTimezone($timezone_name)->format($date_format_default); } catch (\Exception $e) { return $input; } diff --git a/app/Helpers/Invoice/ProRata.php b/app/Helpers/Invoice/ProRata.php index d5f42c0c9573..2d657e277fea 100644 --- a/app/Helpers/Invoice/ProRata.php +++ b/app/Helpers/Invoice/ProRata.php @@ -70,9 +70,9 @@ class ProRata } /** @var \App\Models\RecurringInvoice $recurring_invoice **/ - $recurring_invoice = RecurringInvoice::find($invoice->recurring_id)->first(); + $recurring_invoice = RecurringInvoice::find($invoice->recurring_id); - if (! $recurring_invoice) { + if (! $recurring_invoice) { // @phpstan-ignore-line throw new \Exception("Invoice isn't attached to a recurring invoice"); } diff --git a/app/Http/Requests/Preview/PreviewPurchaseOrderRequest.php b/app/Http/Requests/Preview/PreviewPurchaseOrderRequest.php index 23dbb8b2ad9c..0af8542f97ab 100644 --- a/app/Http/Requests/Preview/PreviewPurchaseOrderRequest.php +++ b/app/Http/Requests/Preview/PreviewPurchaseOrderRequest.php @@ -24,7 +24,6 @@ class PreviewPurchaseOrderRequest extends Request use CleanLineItems; private ?Vendor $vendor = null; - private string $entity_plural = ''; /** * Determine if the user is authorized to make this request. @@ -72,7 +71,7 @@ class PreviewPurchaseOrderRequest extends Request { $invitation = false; - if(! $this->entity_id ?? false) { + if(! isset($this->entity_id)) { return $this->stubInvitation(); } @@ -130,12 +129,5 @@ class PreviewPurchaseOrderRequest extends Request return $entity; } - private function convertEntityPlural(string $entity): self - { - - $this->entity_plural = 'purchase_orders'; - - return $this; - } } diff --git a/app/Jobs/Task/TaskAssigned.php b/app/Jobs/Task/TaskAssigned.php new file mode 100644 index 000000000000..63f79109a376 --- /dev/null +++ b/app/Jobs/Task/TaskAssigned.php @@ -0,0 +1,71 @@ +db); + + $company_user = $this->task->assignedCompanyUser(); + + if($this->findEntityAssignedNotification($company_user, 'task')) + { + $mo = new EmailObject(); + $mo->subject = ctrans('texts.task_assigned_subject', ['task' => $this->task->number, 'date' => now()->setTimeZone($this->task->company->timezone()->name)->format($this->task->company->date_format()) ]); + $mo->body = ctrans('texts.task_assigned_body',['task' => $this->task->number, 'description' => $this->task->description ?? '', 'client' => $this->task->client ? $this->task->client->present()->name() : ' ']); + $mo->text_body = ctrans('texts.task_assigned_body',['task' => $this->task->number, 'description' => $this->task->description ?? '', 'client' => $this->task->client ? $this->task->client->present()->name() : ' ']); + $mo->company_key = $this->task->company->company_key; + $mo->html_template = 'email.template.generic'; + $mo->to = [new Address($this->task->assigned_user->email, $this->task->assigned_user->present()->name())]; + $mo->email_template_body = 'task_assigned_body'; + $mo->email_template_subject = 'task_assigned_subject'; + + (new Email($mo, $this->task->company))->handle(); + + } + + } + + public function failed($exception = null) + { + } +} diff --git a/app/Models/Task.php b/app/Models/Task.php index 87a63d0da2dd..4646f203c450 100644 --- a/app/Models/Task.php +++ b/app/Models/Task.php @@ -11,10 +11,11 @@ namespace App\Models; -use App\Utils\Traits\MakesHash; use Carbon\CarbonInterval; -use Illuminate\Database\Eloquent\SoftDeletes; +use App\Models\CompanyUser; use Illuminate\Support\Carbon; +use App\Utils\Traits\MakesHash; +use Illuminate\Database\Eloquent\SoftDeletes; /** * App\Models\Task @@ -332,4 +333,11 @@ class Task extends BaseModel })->toArray(); } + public function assignedCompanyUser() + { + if(!$this->assigned_user_id) + return false; + + return CompanyUser::where('company_id', $this->company_id)->where('user_id', $this->assigned_user_id)->first(); + } } diff --git a/app/Observers/ClientContactObserver.php b/app/Observers/ClientContactObserver.php index dec67dbccb61..f9c4fd5984f7 100644 --- a/app/Observers/ClientContactObserver.php +++ b/app/Observers/ClientContactObserver.php @@ -57,28 +57,29 @@ class ClientContactObserver $clientContact->recurring_invoice_invitations()->delete(); //ensure entity state is preserved - + InvoiceInvitation::withTrashed()->where('client_contact_id', $client_contact_id)->cursor()->each(function ($invite) { - if ($invite->invoice()->doesnthave('invitations')) { + /** @var \App\Models\InvoiceInvitation $invite */ + if ($invite->invoice()->doesnthave('invitations')) { // @phpstan-ignore-line $invite->invoice->service()->createInvitations(); } }); QuoteInvitation::withTrashed()->where('client_contact_id', $client_contact_id)->cursor()->each(function ($invite) { - if ($invite->quote()->doesnthave('invitations')) { + if ($invite->quote()->doesnthave('invitations')) { // @phpstan-ignore-line $invite->quote->service()->createInvitations(); } }); RecurringInvoiceInvitation::withTrashed()->where('client_contact_id', $client_contact_id)->cursor()->each(function ($invite) { - if ($invite->recurring_invoice()->doesnthave('invitations')) { + if ($invite->recurring_invoice()->doesnthave('invitations')) {// @phpstan-ignore-line $invite->recurring_invoice->service()->createInvitations(); } }); CreditInvitation::withTrashed()->where('client_contact_id', $client_contact_id)->cursor()->each(function ($invite) { - if ($invite->credit()->doesnthave('invitations')) { + if ($invite->credit()->doesnthave('invitations')) {// @phpstan-ignore-line $invite->credit->service()->createInvitations(); } }); diff --git a/app/Observers/TaskObserver.php b/app/Observers/TaskObserver.php index a8ccd6d9489c..96dc353159e8 100644 --- a/app/Observers/TaskObserver.php +++ b/app/Observers/TaskObserver.php @@ -54,7 +54,6 @@ class TaskObserver $event = Webhook::EVENT_DELETE_TASK; } - $subscriptions = Webhook::where('company_id', $task->company_id) ->where('event_id', $event) ->exists(); diff --git a/app/Repositories/TaskRepository.php b/app/Repositories/TaskRepository.php index 4035021b7bfc..4017dd749479 100644 --- a/app/Repositories/TaskRepository.php +++ b/app/Repositories/TaskRepository.php @@ -12,6 +12,7 @@ namespace App\Repositories; use App\Factory\TaskFactory; +use App\Jobs\Task\TaskAssigned; use App\Models\Task; use App\Utils\Traits\GeneratesCounter; use Illuminate\Database\QueryException; @@ -45,6 +46,10 @@ class TaskRepository extends BaseRepository $this->new_task = false; } + if(isset($data['assigned_user_id']) && $data['assigned_user_id'] != $task->assigned_user_id){ + TaskAssigned::dispatch($task, $task->company->db)->delay(2); + } + $task->fill($data); $task->saveQuietly(); diff --git a/app/Utils/Traits/Notifications/UserNotifies.php b/app/Utils/Traits/Notifications/UserNotifies.php index a53f0d8c9204..043071c23db0 100644 --- a/app/Utils/Traits/Notifications/UserNotifies.php +++ b/app/Utils/Traits/Notifications/UserNotifies.php @@ -164,4 +164,9 @@ trait UserNotifies return count(array_intersect($required_notification, $company_user->notifications->email)) >= 1; } + + public function findEntityAssignedNotification(\App\Models\CompanyUser $company_user, string $entity) + { + return count(array_intersect(["{$entity}_assigned"], $company_user->notifications->email)) >= 1; + } } diff --git a/lang/en/texts.php b/lang/en/texts.php index 758575e06cdf..94f85a222dfa 100644 --- a/lang/en/texts.php +++ b/lang/en/texts.php @@ -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' => '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', @@ -2936,29 +2915,14 @@ $lang = array( 'mime_types_help' => 'Comma separated list of allowed mime types, leave blank for all', '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' => 'Add Template', - 'updated_ticket_template' => 'Updated Ticket Template', - 'created_ticket_template' => 'Created Ticket Template', 'archive_ticket_template' => 'Archive Template', 'restore_ticket_template' => 'Restore Template', 'archived_ticket_template' => 'Successfully archived template', @@ -5303,6 +5267,8 @@ $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', ); return $lang; \ No newline at end of file From d8a753055a0c2a6ae4a8f8c4b0cb224bd2bd5bb8 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Wed, 19 Jun 2024 14:57:40 +1000 Subject: [PATCH 03/20] Fixes for tongan paanga --- app/DataMapper/CompanySettings.php | 2 + app/Http/Controllers/ActivityController.php | 120 +++++++++- app/Jobs/User/VerifyPhone.php | 4 +- app/Models/Activity.php | 3 +- app/Utils/HtmlEngine.php | 5 +- lang/en/texts.php | 3 +- routes/api.php | 1 + tests/Feature/ActivityApiTest.php | 244 ++++++++++++++++++++ 8 files changed, 365 insertions(+), 17 deletions(-) diff --git a/app/DataMapper/CompanySettings.php b/app/DataMapper/CompanySettings.php index aa9bb7064d34..1b055e71ea78 100644 --- a/app/DataMapper/CompanySettings.php +++ b/app/DataMapper/CompanySettings.php @@ -962,6 +962,7 @@ class CompanySettings extends BaseSettings '$invoice.due_date', '$invoice.total', '$invoice.balance_due', + '$invoice.project', ], 'quote_details' => [ '$quote.number', @@ -969,6 +970,7 @@ class CompanySettings extends BaseSettings '$quote.date', '$quote.valid_until', '$quote.total', + '$quote.project', ], 'credit_details' => [ '$credit.number', diff --git a/app/Http/Controllers/ActivityController.php b/app/Http/Controllers/ActivityController.php index 93445d7caf09..0abd534023b4 100644 --- a/app/Http/Controllers/ActivityController.php +++ b/app/Http/Controllers/ActivityController.php @@ -11,19 +11,31 @@ namespace App\Http\Controllers; -use App\Http\Requests\Activity\DownloadHistoricalEntityRequest; -use App\Http\Requests\Activity\ShowActivityRequest; -use App\Models\Activity; -use App\Transformers\ActivityTransformer; -use App\Utils\HostedPDF\NinjaPdf; -use App\Utils\Ninja; -use App\Utils\PhantomJS\Phantom; -use App\Utils\Traits\MakesHash; -use App\Utils\Traits\Pdf\PageNumbering; -use App\Utils\Traits\Pdf\PdfMaker; -use Illuminate\Http\Request; -use Illuminate\Support\Facades\Storage; use stdClass; +use App\Utils\Ninja; +use App\Models\Client; +use App\Models\Invoice; +use App\Models\Activity; +use Illuminate\Http\Request; +use App\Utils\Traits\MakesHash; +use App\Utils\PhantomJS\Phantom; +use App\Utils\HostedPDF\NinjaPdf; +use App\Utils\Traits\Pdf\PdfMaker; +use App\Utils\Traits\Pdf\PageNumbering; +use Illuminate\Support\Facades\Storage; +use App\Transformers\ActivityTransformer; +use App\Http\Requests\Activity\StoreNoteRequest; +use App\Http\Requests\Activity\ShowActivityRequest; +use App\Http\Requests\Activity\DownloadHistoricalEntityRequest; +use App\Models\Credit; +use App\Models\Expense; +use App\Models\Payment; +use App\Models\PurchaseOrder; +use App\Models\Quote; +use App\Models\RecurringExpense; +use App\Models\RecurringInvoice; +use App\Models\Task; +use App\Models\Vendor; class ActivityController extends BaseController { @@ -177,4 +189,88 @@ class ActivityController extends BaseController echo $pdf; }, $filename, ['Content-Type' => 'application/pdf']); } + + public function note(StoreNoteRequest $request) + { + /** @var \App\Models\User $user */ + $user = auth()->user(); + + $entity = $request->getEntity(); + + $activity = new Activity(); + $activity->account_id = $user->account_id; + $activity->company_id = $user->company()->id; + $activity->notes = $request->notes; + $activity->user_id = $user->id; + $activity->ip = $request->ip(); + + switch (get_class($entity)) { + case Invoice::class: + $activity->invoice_id = $entity->id; + $activity->client_id = $entity->client_id; + $activity->project_id = $entity->project_id; + $activity->vendor_id = $entity->vendor_id; + break; + case Credit::class: + $activity->credit_id = $entity->id; + $activity->client_id = $entity->client_id; + $activity->project_id = $entity->project_id; + $activity->vendor_id = $entity->vendor_id; + $activity->invoice_id = $entity->invoice_id; + break; + case Client::class: + $activity->client_id = $entity->id; + break; + case Quote::class: + $activity->quote_id = $entity->id; + $activity->client_id = $entity->client_id; + $activity->project_id = $entity->project_id; + $activity->vendor_id = $entity->vendor_id; + break; + case RecurringInvoice::class: + $activity->recurring_invoice_id = $entity->id; + $activity->client_id = $entity->client_id; + break; + case Expense::class: + $activity->expense_id = $entity->id; + $activity->client_id = $entity->client_id; + $activity->project_id = $entity->project_id; + $activity->vendor_id = $entity->vendor_id; + break; + case RecurringExpense::class: + $activity->recurring_expense_id = $entity->id; + $activity->expense_id = $entity->id; + $activity->client_id = $entity->client_id; + $activity->project_id = $entity->project_id; + $activity->vendor_id = $entity->vendor_id; + break; + case Vendor::class: + $activity->vendor_id = $entity->id; + break; + case PurchaseOrder::class: + $activity->purchase_order_id = $entity->id; + $activity->expense_id = $entity->id; + $activity->client_id = $entity->client_id; + $activity->project_id = $entity->project_id; + $activity->vendor_id = $entity->vendor_id; + case Task::class: + $activity->task_id = $entity->id; + $activity->expense_id = $entity->id; + $activity->client_id = $entity->client_id; + $activity->project_id = $entity->project_id; + $activity->vendor_id = $entity->vendor_id; + case Payment::class: + $activity->payment_id = $entity->id; + $activity->expense_id = $entity->id; + $activity->client_id = $entity->client_id; + $activity->project_id = $entity->project_id; + default: + # code... + break; + } + + $activity->save(); + + return $this->itemResponse($activity); + } } diff --git a/app/Jobs/User/VerifyPhone.php b/app/Jobs/User/VerifyPhone.php index 54aa7565289b..58281a07ec77 100644 --- a/app/Jobs/User/VerifyPhone.php +++ b/app/Jobs/User/VerifyPhone.php @@ -56,7 +56,7 @@ class VerifyPhone implements ShouldQueue $twilio = new \Twilio\Rest\Client($sid, $token); - $country = $this->user->account?->companies()?->first()?->country(); + $country = $this->user->account?->companies()?->first()?->country(); //@phpstan-ignore-line if (!$country || strlen($this->user->phone) < 2) { return; @@ -73,7 +73,7 @@ class VerifyPhone implements ShouldQueue return; } - if ($phone_number && strlen($phone_number->phoneNumber) > 1) { + if ($phone_number && strlen($phone_number->phoneNumber) > 1) { //@phpstan-ignore-line $this->user->phone = $phone_number->phoneNumber; $this->user->verified_phone_number = true; $this->user->save(); diff --git a/app/Models/Activity.php b/app/Models/Activity.php index 97e561b41c97..37e235c7fee4 100644 --- a/app/Models/Activity.php +++ b/app/Models/Activity.php @@ -261,7 +261,8 @@ class Activity extends StaticModel public const EMAIL_STATEMENT = 140; - + public const USER_NOTE = 141; + protected $casts = [ 'is_system' => 'boolean', 'updated_at' => 'timestamp', diff --git a/app/Utils/HtmlEngine.php b/app/Utils/HtmlEngine.php index 073d7d55b882..f85f3909be52 100644 --- a/app/Utils/HtmlEngine.php +++ b/app/Utils/HtmlEngine.php @@ -222,6 +222,7 @@ class HtmlEngine if ($this->entity->project) { $data['$project.name'] = ['value' => $this->entity->project->name, 'label' => ctrans('texts.project')]; $data['$invoice.project'] = &$data['$project.name']; + $data['$quote.project'] = &$data['$project.name']; } $data['$status_logo'] = ['value' => '
' . ctrans('texts.paid') .'
', 'label' => '']; @@ -276,8 +277,10 @@ class HtmlEngine $data['$credit.custom4'] = &$data['$quote.custom4']; if ($this->entity->project) { - $data['$project.name'] = ['value' => $this->entity->project->name, 'label' => ctrans('texts.project_name')]; + $data['$project.name'] = ['value' => $this->entity->project->name, 'label' => ctrans('texts.project_name')]; $data['$invoice.project'] = &$data['$project.name']; + $data['$quote.project'] = &$data['$project.name']; + } if ($this->entity->vendor) { diff --git a/lang/en/texts.php b/lang/en/texts.php index 94f85a222dfa..5de0e456cf28 100644 --- a/lang/en/texts.php +++ b/lang/en/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', @@ -5269,6 +5269,7 @@ $lang = array( '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', ); return $lang; \ No newline at end of file diff --git a/routes/api.php b/routes/api.php index 9befaf9a07f8..556e3ab6bc8b 100644 --- a/routes/api.php +++ b/routes/api.php @@ -155,6 +155,7 @@ Route::group(['middleware' => ['throttle:api', 'api_db', 'token_auth', 'locale'] Route::get('activities', [ActivityController::class, 'index']); Route::post('activities/entity', [ActivityController::class, 'entityActivity']); + Route::post('activities/notes', [ActivityController::class, 'note']); Route::get('activities/download_entity/{activity}', [ActivityController::class, 'downloadHistoricalEntity']); Route::post('charts/totals', [ChartController::class, 'totals'])->name('chart.totals'); diff --git a/tests/Feature/ActivityApiTest.php b/tests/Feature/ActivityApiTest.php index 9b81136bb2d2..8b381a0dd821 100644 --- a/tests/Feature/ActivityApiTest.php +++ b/tests/Feature/ActivityApiTest.php @@ -40,6 +40,250 @@ class ActivityApiTest extends TestCase } + public function testActivityInvoiceNotes() + { + $data = [ + 'entity' => 'invoices', + 'entity_id' => $this->invoice->hashed_id, + 'notes' => 'These are notes' + ]; + + $response = $this->withHeaders([ + 'X-API-SECRET' => config('ninja.api_secret'), + 'X-API-TOKEN' => $this->token, + ])->postJson('/api/v1/activities/notes', $data); + + $response->assertStatus(200); + + $arr = $response->json(); + + $this->assertEquals('These are notes', $arr['data']['notes']); + } + + public function testActivityCreditNotes() + { + $data = [ + 'entity' => 'credits', + 'entity_id' => $this->credit->hashed_id, + 'notes' => 'These are notes' + ]; + + $response = $this->withHeaders([ + 'X-API-SECRET' => config('ninja.api_secret'), + 'X-API-TOKEN' => $this->token, + ])->postJson('/api/v1/activities/notes', $data); + + $response->assertStatus(200); + + $arr = $response->json(); + + $this->assertEquals('These are notes', $arr['data']['notes']); + } + + public function testActivityQuoteNotes() + { + $data = [ + 'entity' => 'quotes', + 'entity_id' => $this->quote->hashed_id, + 'notes' => 'These are notes' + ]; + + $response = $this->withHeaders([ + 'X-API-SECRET' => config('ninja.api_secret'), + 'X-API-TOKEN' => $this->token, + ])->postJson('/api/v1/activities/notes', $data); + + $response->assertStatus(200); + + $arr = $response->json(); + + $this->assertEquals('These are notes', $arr['data']['notes']); + } + + + public function testActivityClientNotes() + { + $data = [ + 'entity' => 'clients', + 'entity_id' => $this->client->hashed_id, + 'notes' => 'These are notes' + ]; + + $response = $this->withHeaders([ + 'X-API-SECRET' => config('ninja.api_secret'), + 'X-API-TOKEN' => $this->token, + ])->postJson('/api/v1/activities/notes', $data); + + $response->assertStatus(200); + + $arr = $response->json(); + + $this->assertEquals('These are notes', $arr['data']['notes']); + } + + + public function testActivityRecurringInvoiceNotes() + { + $data = [ + 'entity' => 'recurring_invoices', + 'entity_id' => $this->recurring_invoice->hashed_id, + 'notes' => 'These are notes' + ]; + + $response = $this->withHeaders([ + 'X-API-SECRET' => config('ninja.api_secret'), + 'X-API-TOKEN' => $this->token, + ])->postJson('/api/v1/activities/notes', $data); + + $response->assertStatus(200); + + $arr = $response->json(); + + $this->assertEquals('These are notes', $arr['data']['notes']); + } + + + public function testActivityExpenseNotes() + { + $data = [ + 'entity' => 'expenses', + 'entity_id' => $this->expense->hashed_id, + 'notes' => 'These are notes' + ]; + + $response = $this->withHeaders([ + 'X-API-SECRET' => config('ninja.api_secret'), + 'X-API-TOKEN' => $this->token, + ])->postJson('/api/v1/activities/notes', $data); + + $response->assertStatus(200); + + $arr = $response->json(); + + $this->assertEquals('These are notes', $arr['data']['notes']); + } + + public function testActivityRecurringExpenseNotes() + { + $data = [ + 'entity' => 'recurring_expenses', + 'entity_id' => $this->recurring_expense->hashed_id, + 'notes' => 'These are notes' + ]; + + $response = $this->withHeaders([ + 'X-API-SECRET' => config('ninja.api_secret'), + 'X-API-TOKEN' => $this->token, + ])->postJson('/api/v1/activities/notes', $data); + + $response->assertStatus(200); + + $arr = $response->json(); + + $this->assertEquals('These are notes', $arr['data']['notes']); + } + + + public function testActivityVendorNotes() + { + $data = [ + 'entity' => 'vendors', + 'entity_id' => $this->vendor->hashed_id, + 'notes' => 'These are notes' + ]; + + $response = $this->withHeaders([ + 'X-API-SECRET' => config('ninja.api_secret'), + 'X-API-TOKEN' => $this->token, + ])->postJson('/api/v1/activities/notes', $data); + + $response->assertStatus(200); + + $arr = $response->json(); + + $this->assertEquals('These are notes', $arr['data']['notes']); + } + + public function testActivityPurchaseOrderNotes() + { + $data = [ + 'entity' => 'purchase_orders', + 'entity_id' => $this->purchase_order->hashed_id, + 'notes' => 'These are notes' + ]; + + $response = $this->withHeaders([ + 'X-API-SECRET' => config('ninja.api_secret'), + 'X-API-TOKEN' => $this->token, + ])->postJson('/api/v1/activities/notes', $data); + + $response->assertStatus(200); + + $arr = $response->json(); + + $this->assertEquals('These are notes', $arr['data']['notes']); + } + + public function testActivityTaskNotes() + { + $data = [ + 'entity' => 'tasks', + 'entity_id' => $this->task->hashed_id, + 'notes' => 'These are notes' + ]; + + $response = $this->withHeaders([ + 'X-API-SECRET' => config('ninja.api_secret'), + 'X-API-TOKEN' => $this->token, + ])->postJson('/api/v1/activities/notes', $data); + + $response->assertStatus(200); + + $arr = $response->json(); + + $this->assertEquals('These are notes', $arr['data']['notes']); + } + + public function testActivityProjectNotes() + { + $data = [ + 'entity' => 'projects', + 'entity_id' => $this->project->hashed_id, + 'notes' => 'These are notes' + ]; + + $response = $this->withHeaders([ + 'X-API-SECRET' => config('ninja.api_secret'), + 'X-API-TOKEN' => $this->token, + ])->postJson('/api/v1/activities/notes', $data); + + $response->assertStatus(200); + + $arr = $response->json(); + + $this->assertEquals('These are notes', $arr['data']['notes']); + } + + public function testActivityPaymentNotes() + { + $data = [ + 'entity' => 'payments', + 'entity_id' => $this->payment->hashed_id, + 'notes' => 'These are notes' + ]; + + $response = $this->withHeaders([ + 'X-API-SECRET' => config('ninja.api_secret'), + 'X-API-TOKEN' => $this->token, + ])->postJson('/api/v1/activities/notes', $data); + + $response->assertStatus(200); + + $arr = $response->json(); + + $this->assertEquals('These are notes', $arr['data']['notes']); + } + public function testActivityEntity() { From 0bca8b607414753e59adbacef0f0eb80826d075c Mon Sep 17 00:00:00 2001 From: David Bomba Date: Wed, 19 Jun 2024 15:42:06 +1000 Subject: [PATCH 04/20] Fixes for tests --- .../Requests/Activity/StoreNoteRequest.php | 76 ++++++++++++ app/Models/Company.php | 1 - app/Services/Bank/BankService.php | 16 --- app/Services/Bank/ProcessBankRules.php | 108 +++++++++++++++++- 4 files changed, 179 insertions(+), 22 deletions(-) create mode 100644 app/Http/Requests/Activity/StoreNoteRequest.php diff --git a/app/Http/Requests/Activity/StoreNoteRequest.php b/app/Http/Requests/Activity/StoreNoteRequest.php new file mode 100644 index 000000000000..88e90a45f306 --- /dev/null +++ b/app/Http/Requests/Activity/StoreNoteRequest.php @@ -0,0 +1,76 @@ +checkAuthority(); + } + + public function rules() + { + /** @var \App\Models\User $user */ + $user = auth()->user(); + + $rules = [ + 'entity' => 'required|in:invoices,quotes,credits,recurring_invoices,clients,vendors,credits,payments,projects,tasks,expenses,recurring_expenses,bank_transactions,purchase_orders', + 'entity_id' => ['required','bail', Rule::exists($this->entity, 'id')->where('company_id', $user->company()->id)], + 'notes' => 'required', + ]; + + return $rules; + } + + public function prepareForValidation() + { + $input = $this->all(); + + if(isset($input['entity_id']) && $input['entity_id'] != null) { + $input['entity_id'] = $this->decodePrimaryKey($input['entity_id']); + } + + $this->replace($input); + } + + public function checkAuthority(): bool + { + + $this->error_message = ctrans('texts.authorization_failure'); + + /** @var \App\Models\User $user */ + $user = auth()->user(); + + $entity = $this->getEntity(); + + return $user->isAdmin() || $user->can('view', $entity); + + } + + public function getEntity() + { + $class = "\\App\\Models\\".ucfirst(Str::camel(rtrim($this->entity, 's'))); + return $class::withTrashed()->find(is_string($this->entity_id) ? $this->decodePrimaryKey($this->entity_id) : $this->entity_id); + + } + +} diff --git a/app/Models/Company.php b/app/Models/Company.php index 8a0ef899de12..d1e402ece50b 100644 --- a/app/Models/Company.php +++ b/app/Models/Company.php @@ -842,7 +842,6 @@ class Company extends BaseModel ->get(); } - public function resolveRouteBinding($value, $field = null) { return $this->where('id', $this->decodePrimaryKey($value)) diff --git a/app/Services/Bank/BankService.php b/app/Services/Bank/BankService.php index f17bf8dba34c..8460a6249a20 100644 --- a/app/Services/Bank/BankService.php +++ b/app/Services/Bank/BankService.php @@ -20,22 +20,6 @@ class BankService { } - - public function matchInvoiceNumber() - { - if (strlen($this->bank_transaction->description) > 1) { - $i = Invoice::query()->where('company_id', $this->bank_transaction->company_id) - ->whereIn('status_id', [1,2,3]) - ->where('is_deleted', 0) - ->where('number', 'LIKE', '%'.$this->bank_transaction->description.'%') - ->first(); - - return $i ?: false; - } - - return false; - } - public function processRules() { (new ProcessBankRules($this->bank_transaction))->run(); diff --git a/app/Services/Bank/ProcessBankRules.php b/app/Services/Bank/ProcessBankRules.php index e65a4462bcad..d0f207f9f4c5 100644 --- a/app/Services/Bank/ProcessBankRules.php +++ b/app/Services/Bank/ProcessBankRules.php @@ -16,6 +16,7 @@ use App\Factory\ExpenseFactory; use App\Models\BankTransaction; use App\Models\ExpenseCategory; use App\Models\Invoice; +use App\Models\Payment; use App\Services\AbstractService; use App\Utils\Traits\GeneratesCounter; use Illuminate\Support\Carbon; @@ -70,19 +71,116 @@ class ProcessBankRules extends AbstractService $this->credit_rules = $this->bank_transaction->company->credit_rules(); //stub for credit rules - foreach ($this->credit_rules as $rule) { - // $this->bank_transaction->bank_transaction_rule_id = $bank_transaction_rule->id; + foreach ($this->credit_rules as $bank_transaction_rule) { + $matches = 0; + + if (!is_array($bank_transaction_rule['rules'])) { + continue; + } + + foreach ($bank_transaction_rule['rules'] as $rule) { + $rule_count = count($bank_transaction_rule['rules']); + + if ($rule['search_key'] == '$invoice.number') { + + $this->invoices = Invoice::query()->where('company_id', $this->bank_transaction->company_id) + ->whereIn('status_id', [1,2,3]) + ->where('is_deleted', 0) + ->get(); + + $invoiceNumber = $this->invoices->first(function ($value, $key) { + return str_contains($this->bank_transaction->description, $value->number) || str_contains(str_replace("\n", "", $this->bank_transaction->description), $value->number); + }); + + if($invoiceNumber) + $matches++; + + } + + if ($rule['search_key'] == '$invoice.amount') { + + $this->invoices = Invoice::query()->where('company_id', $this->bank_transaction->company_id) + ->whereIn('status_id', [1,2,3]) + ->where('is_deleted', 0) + ->where('amount', $rule['operator'], $this->bank_transaction->amount) + ->get(); + + $invoiceAmounts = $this->invoices; + + if($invoiceAmounts->count() > 0) { + $matches++; + } + + } + + if ($rule['search_key'] == '$payment.amount') { + + + $paymentAmounts = Payment::query()->where('company_id', $this->bank_transaction->company_id) + ->whereIn('status_id', [1,4]) + ->where('is_deleted', 0) + ->whereNull('transaction_id') + ->where('amount', $rule['operator'], $this->bank_transaction->amount) + ->get(); + + + + if($paymentAmounts->count() > 0) { + $matches++; + } + + } + + + if ($rule['search_key'] == '$payment.transaction_reference') { + + $ref_search = $this->bank_transaction->description; + + switch ($rule['operator']) { + case 'is': + $operator = '='; + break; + case 'contains': + $ref_search = "%".$ref_search."%"; + $operator = 'LIKE'; + break; + + default: + $operator = '='; + break; + } + + $paymentReferences = Payment::query()->where('company_id', $this->bank_transaction->company_id) + ->whereIn('status_id', [1,4]) + ->where('is_deleted', 0) + ->whereNull('transaction_id') + ->where('transaction_reference', $operator, $ref_search) + ->get(); + + + + if($paymentReferences->count() > 0) { + $matches++; + } + + } + + + + } + } + } + + private function matchDebit() { $this->debit_rules = $this->bank_transaction->company->debit_rules(); $this->categories = collect(Cache::get('bank_categories')); - - foreach ($this->debit_rules as $bank_transaction_rule) { $matches = 0; @@ -142,7 +240,7 @@ class ProcessBankRules extends AbstractService private function coalesceExpenses($expense): string { - if (!$this->bank_transaction->expense_id || strlen($this->bank_transaction->expense_id) < 1) { + if (!$this->bank_transaction->expense_id || strlen($this->bank_transaction->expense_id ?? '') < 2) { return $expense; } From bd94f7bb65330b48910933444c4314b9814846f3 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Wed, 19 Jun 2024 18:18:05 +1000 Subject: [PATCH 05/20] Working on credit rules for bank transactions --- app/Services/Bank/ProcessBankRules.php | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/app/Services/Bank/ProcessBankRules.php b/app/Services/Bank/ProcessBankRules.php index d0f207f9f4c5..4a4becf4d443 100644 --- a/app/Services/Bank/ProcessBankRules.php +++ b/app/Services/Bank/ProcessBankRules.php @@ -50,6 +50,13 @@ class ProcessBankRules extends AbstractService } } + // $payment.amount => "Payment Amount", float + // $payment.transaction_reference => "Payment Transaction Reference", string + // $invoice.amount => "Invoice Amount", float + // $invoice.number => "Invoice Number", string + // $client.id_number => "Client ID Number", string + // $client.email => "Client Email", string + // $invoice.po_number => "Invoice Purchase Order Number", string private function matchCredit() { $this->invoices = Invoice::query()->where('company_id', $this->bank_transaction->company_id) @@ -97,6 +104,20 @@ class ProcessBankRules extends AbstractService } + if ($rule['search_key'] == '$invoice.po_number') { + + $invoicePONumbers = Invoice::query()->where('company_id', $this->bank_transaction->company_id) + ->whereIn('status_id', [1,2,3]) + ->where('is_deleted', 0) + ->where('po_number', $this->bank_transaction->description) + ->get(); + + if($invoicePONumbers->count() > 0) { + $matches++; + } + + } + if ($rule['search_key'] == '$invoice.amount') { $this->invoices = Invoice::query()->where('company_id', $this->bank_transaction->company_id) From 897d31f89a15b394f2616810566445b19e6fbf28 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Thu, 20 Jun 2024 14:28:33 +1000 Subject: [PATCH 06/20] updates for matching payments --- app/Jobs/Bank/MatchBankTransactions.php | 2 +- app/Libraries/MultiDB.php | 4 +- app/Services/Bank/ProcessBankRules.php | 178 +++++++++++++++++++++++- 3 files changed, 178 insertions(+), 6 deletions(-) diff --git a/app/Jobs/Bank/MatchBankTransactions.php b/app/Jobs/Bank/MatchBankTransactions.php index e5d4ddad6a48..c377a9c05dce 100644 --- a/app/Jobs/Bank/MatchBankTransactions.php +++ b/app/Jobs/Bank/MatchBankTransactions.php @@ -387,7 +387,7 @@ class MatchBankTransactions implements ShouldQueue $hashed_keys = []; - foreach($this->attachable_invoices as $attachable_invoice){ + foreach($this->attachable_invoices as $attachable_invoice){ //@phpstan-ignore-line $hashed_keys[] = $this->encodePrimaryKey($attachable_invoice['id']); } diff --git a/app/Libraries/MultiDB.php b/app/Libraries/MultiDB.php index a0cd1aa8606f..962bc657f6f7 100644 --- a/app/Libraries/MultiDB.php +++ b/app/Libraries/MultiDB.php @@ -463,7 +463,7 @@ class MultiDB self::setDB($current_db); - return false; + return null; } public static function findAndSetDbByClientId($client_id): ?Client @@ -555,7 +555,7 @@ class MultiDB $current_db = config('database.default'); - if(SMSNumbers::hasNumber($phone)) { + if(SMSNumbers::hasNumber($phone)) { // @phpstan-ignore-line return true; } diff --git a/app/Services/Bank/ProcessBankRules.php b/app/Services/Bank/ProcessBankRules.php index 4a4becf4d443..171864304f1e 100644 --- a/app/Services/Bank/ProcessBankRules.php +++ b/app/Services/Bank/ProcessBankRules.php @@ -14,6 +14,7 @@ namespace App\Services\Bank; use App\Factory\ExpenseCategoryFactory; use App\Factory\ExpenseFactory; use App\Models\BankTransaction; +use App\Models\Client; use App\Models\ExpenseCategory; use App\Models\Invoice; use App\Models\Payment; @@ -88,14 +89,23 @@ class ProcessBankRules extends AbstractService foreach ($bank_transaction_rule['rules'] as $rule) { $rule_count = count($bank_transaction_rule['rules']); + $invoiceNumbers = false; + $invoiceNumber = false; + $invoiceAmounts = false; + $paymentAmounts = false; + $paymentReferences = false; + $clientIdNumbers = false; + $clientEmails = false; + $invoicePONumbers = false; + if ($rule['search_key'] == '$invoice.number') { - $this->invoices = Invoice::query()->where('company_id', $this->bank_transaction->company_id) + $invoiceNumbers = Invoice::query()->where('company_id', $this->bank_transaction->company_id) ->whereIn('status_id', [1,2,3]) ->where('is_deleted', 0) ->get(); - $invoiceNumber = $this->invoices->first(function ($value, $key) { + $invoiceNumber = $invoiceNumbers->first(function ($value, $key) { return str_contains($this->bank_transaction->description, $value->number) || str_contains(str_replace("\n", "", $this->bank_transaction->description), $value->number); }); @@ -120,7 +130,7 @@ class ProcessBankRules extends AbstractService if ($rule['search_key'] == '$invoice.amount') { - $this->invoices = Invoice::query()->where('company_id', $this->bank_transaction->company_id) + $$invoiceAmounts = Invoice::query()->where('company_id', $this->bank_transaction->company_id) ->whereIn('status_id', [1,2,3]) ->where('is_deleted', 0) ->where('amount', $rule['operator'], $this->bank_transaction->amount) @@ -186,7 +196,138 @@ class ProcessBankRules extends AbstractService } + if ($rule['search_key'] == '$client.id_number') { + + $ref_search = $this->bank_transaction->description; + switch ($rule['operator']) { + case 'is': + $operator = '='; + break; + case 'contains': + $ref_search = "%".$ref_search."%"; + $operator = 'LIKE'; + break; + + default: + $operator = '='; + break; + } + + $clientIdNumbers = Client::query()->where('company_id', $this->bank_transaction->company_id) + ->where('id_number', $operator, $ref_search) + ->get(); + + if($clientIdNumbers->count() > 0) { + $matches++; + } + + } + + + if ($rule['search_key'] == '$client.email') { + + $clientEmails = Client::query() + ->where('company_id', $this->bank_transaction->company_id) + ->whereHas('contacts', function ($q){ + $q->where('email', $this->bank_transaction->description); + }) + ->get(); + + + if($clientEmails->count() > 0) { + $matches++; + } + + if (($bank_transaction_rule['matches_on_all'] && ($matches == $rule_count)) || (!$bank_transaction_rule['matches_on_all'] && $matches > 0)) { + + //determine which combination has succeeded, ie link a payment / or / invoice + $invoice_ids = null; + $payment_id = null; + + if($invoiceNumber){ + $invoice_ids = $invoiceNumber->hashed_id; + } + + if($invoicePONumbers && strlen($invoice_ids ?? '') == 0){ + + if($clientEmails){ // @phpstan-ignore-line + + $invoice_ids = $this->matchInvoiceAndClient($invoicePONumbers, $clientEmails); + + } + + if($clientIdNumbers && strlen($invoice_ids ?? '') == 0) + { + + $invoice_ids = $this->matchInvoiceAndClient($invoicePONumbers, $clientIdNumbers); + + } + + if(strlen($invoice_ids ?? '') == 0) + { + $invoice_ids = $invoicePONumbers->first()->hashed_id; + } + + } + + + if($invoiceAmounts && strlen($invoice_ids ?? '') == 0) { + + if($clientEmails) {// @phpstan-ignore-line + + $invoice_ids = $this->matchInvoiceAndClient($invoiceAmounts, $clientEmails); + + } + + if($clientIdNumbers && strlen($invoice_ids ?? '') == 0) { + + $invoice_ids = $this->matchInvoiceAndClient($invoiceAmounts, $clientIdNumbers); + + } + + if(strlen($invoice_ids ?? '') == 0) { + $invoice_ids = $invoiceAmounts->first()->hashed_id; + } + + } + + + if($paymentAmounts && strlen($invoice_ids ?? '') == 0 && is_null($payment_id)) { + + if($clientEmails) {// @phpstan-ignore-line + + $payment_id = $this->matchPaymentAndClient($paymentAmounts, $clientEmails); + + } + + if($clientIdNumbers && is_null($payment_id)) { + + + $payment_id = $this->matchPaymentAndClient($paymentAmounts, $clientEmails); + + } + + if(is_null($payment_id)) { + $payment_id = $paymentAmounts->first()->id; + } + + } + + if(strlen($invoice_ids ?? '') > 1 || is_int($payment_id)) + { + + $this->bank_transaction->payment_id = $payment_id; + $this->bank_transaction->invoice_ids = $invoice_ids; + $this->bank_transaction->status_id = BankTransaction::STATUS_MATCHED; + $this->bank_transaction->bank_transaction_rule_id = $bank_transaction_rule->id; + $this->bank_transaction->save(); + + } + + } + + } } @@ -195,6 +336,37 @@ class ProcessBankRules extends AbstractService } + private function matchPaymentAndClient($payments, $clients): ?int + { + /** @var \Illuminate\Support\Collection $payments */ + foreach($payments as $payment) { + foreach($clients as $client) { + + if($payment->client_id == $client->id) { + return $payment->id; + + } + } + } + + return null; + } + + private function matchInvoiceAndClient($invoices, $clients): ?Invoice + { + /** @var \Illuminate\Support\Collection $invoices */ + foreach($invoices as $invoice) { + foreach($clients as $client) { + + if($invoice->client_id == $client->id) { + return $invoice->hashed_id; + + } + } + } + + return null; + } private function matchDebit() { From 957556b8d07ac22a9afcf0b7a996d7b8393e4b67 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Thu, 20 Jun 2024 22:03:23 +1000 Subject: [PATCH 07/20] Validation for task rate --- app/Http/Requests/Task/StoreTaskRequest.php | 5 +- .../Feature/Bank/BankTransactionRuleTest.php | 55 ++++++++++++++++++- 2 files changed, 56 insertions(+), 4 deletions(-) diff --git a/app/Http/Requests/Task/StoreTaskRequest.php b/app/Http/Requests/Task/StoreTaskRequest.php index f61bc4267a23..3aaedf108a29 100644 --- a/app/Http/Requests/Task/StoreTaskRequest.php +++ b/app/Http/Requests/Task/StoreTaskRequest.php @@ -55,7 +55,8 @@ class StoreTaskRequest extends Request } $rules['hash'] = 'bail|sometimes|string|nullable'; - + $rules['rate'] = 'bail|numeric'; + $rules['time_log'] = ['bail',function ($attribute, $values, $fail) { if(is_string($values)) { @@ -123,6 +124,8 @@ class StoreTaskRequest extends Request } } + $input['rate'] = isset($input['rate']) ? $input['rate'] : 0; + if(!isset($input['time_log']) || empty($input['time_log']) || $input['time_log'] == '{}') { $input['time_log'] = json_encode([]); } diff --git a/tests/Feature/Bank/BankTransactionRuleTest.php b/tests/Feature/Bank/BankTransactionRuleTest.php index 8d86dd769baf..2b77c321870f 100644 --- a/tests/Feature/Bank/BankTransactionRuleTest.php +++ b/tests/Feature/Bank/BankTransactionRuleTest.php @@ -12,13 +12,14 @@ namespace Tests\Feature\Bank; +use Tests\TestCase; +use Tests\MockAccountData; use App\Models\BankIntegration; use App\Models\BankTransaction; use App\Models\BankTransactionRule; -use Illuminate\Foundation\Testing\DatabaseTransactions; use Illuminate\Validation\ValidationException; -use Tests\MockAccountData; -use Tests\TestCase; +use Illuminate\Routing\Middleware\ThrottleRequests; +use Illuminate\Foundation\Testing\DatabaseTransactions; class BankTransactionRuleTest extends TestCase { @@ -38,6 +39,54 @@ class BankTransactionRuleTest extends TestCase $this->withoutExceptionHandling(); } + + + + + public function testMatchCreditOnInvoiceNumber() + { + + $bi = BankIntegration::factory()->create([ + 'company_id' => $this->company->id, + 'user_id' => $this->user->id, + 'account_id' => $this->account->id, + ]); + + $hash = md5(time()); + + $bt = BankTransaction::factory()->create([ + 'bank_integration_id' => $bi->id, + 'company_id' => $this->company->id, + 'user_id' => $this->user->id, + 'description' => $hash, + 'base_type' => 'CREDIT', + 'amount' => 100 + ]); + + $br = BankTransactionRule::factory()->create([ + 'company_id' => $this->company->id, + 'user_id' => $this->user->id, + 'matches_on_all' => false, + 'auto_convert' => true, + 'applies_to' => 'CREDIT', + 'rules' => [ + [ + 'search_key' => '$invoice.number', + 'operator' => 'is', + ] + ] + ]); + + $bt = $bt->refresh(); + + $debit_rules = $bt->company->debit_rules(); + + $bt->service()->processRules(); + + $bt = $bt->fresh(); + + } + public function testMatchingWithStripos() { $bt_value = strtolower(str_replace(" ", "", 'hello soldier')); From 3ab899f58e6e98db9f904a107dfe762f302e1576 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Fri, 21 Jun 2024 07:37:46 +1000 Subject: [PATCH 08/20] Validation for task rate --- app/Http/Requests/Task/UpdateTaskRequest.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/Http/Requests/Task/UpdateTaskRequest.php b/app/Http/Requests/Task/UpdateTaskRequest.php index 85b2c4de955b..bfe43b763b90 100644 --- a/app/Http/Requests/Task/UpdateTaskRequest.php +++ b/app/Http/Requests/Task/UpdateTaskRequest.php @@ -61,7 +61,7 @@ class UpdateTaskRequest extends Request } $rules['hash'] = 'bail|sometimes|string|nullable'; - + $rules['rate'] = 'bail|numeric'; $rules['time_log'] = ['bail', function ($attribute, $values, $fail) { if(is_string($values)) { @@ -137,6 +137,9 @@ class UpdateTaskRequest extends Request $input['time_log'] = json_encode([]); } + + $input['rate'] = isset($input['rate']) ? $input['rate'] : 0; + $this->replace($input); } From 698a376de353a29f27c91a4fb8d4503640a59a26 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Fri, 21 Jun 2024 10:29:38 +1000 Subject: [PATCH 09/20] remove cache build steps --- app/Console/Commands/DemoMode.php | 4 +- app/Console/Commands/HostedMigrations.php | 1 - app/Console/Commands/ImportMigrations.php | 2 - app/Console/Commands/PostUpdate.php | 3 +- app/DataMapper/Tax/BaseRule.php | 2 +- app/DataProviders/USStates.php | 2 +- app/Http/Controllers/ActivityController.php | 1 + app/Http/Controllers/BaseController.php | 2 - app/Http/Controllers/SelfUpdateController.php | 3 +- app/Http/Controllers/SetupController.php | 5 +- app/Providers/StaticServiceProvider.php | 145 ++++++++++++++++-- app/Utils/Traits/AppSetup.php | 65 ++------ ...3_215053_update_canadian_dollar_symbol.php | 3 +- ..._023350_update_singapore_dollar_symbol.php | 2 - ...dd_property_to_checkout_gateway_config.php | 1 - ...4937_heal_stripe_gateway_configuration.php | 1 - ...n_show_production_description_dropdown.php | 1 - ...6_080127_add_purchase_order_to_expense.php | 2 - ..._11_22_215618_lock_tasks_when_invoiced.php | 2 - ...d_payment_id_to_bank_transaction_table.php | 1 - database/seeders/RandomDataSeeder.php | 2 - tests/Feature/Client/ClientMergeTest.php | 1 - tests/Feature/ClientPortal/CreditsTest.php | 1 - tests/Feature/ClientPortal/InvoicesTest.php | 1 - tests/Feature/Export/ArDetailReportTest.php | 2 - .../Feature/Export/ProductSalesReportTest.php | 2 - tests/Integration/CompanyLedgerTest.php | 1 - tests/TestCase.php | 2 - tests/Unit/CreditBalanceTest.php | 2 - tests/Unit/RecurringExpenseCloneTest.php | 2 - 30 files changed, 147 insertions(+), 117 deletions(-) diff --git a/app/Console/Commands/DemoMode.php b/app/Console/Commands/DemoMode.php index 7ea0edb4e604..11169d5832d5 100644 --- a/app/Console/Commands/DemoMode.php +++ b/app/Console/Commands/DemoMode.php @@ -90,9 +90,9 @@ class DemoMode extends Command Artisan::call('migrate:fresh --force'); $this->info('Seeding'); - Artisan::call('db:seed --force'); - $this->buildCache(true); + Artisan::call('db:seed --force'); + Artisan::call('cache:clear'); $this->info('Seeding Random Data'); $this->createSmallAccount(); diff --git a/app/Console/Commands/HostedMigrations.php b/app/Console/Commands/HostedMigrations.php index bf83024f0729..3a005852e921 100644 --- a/app/Console/Commands/HostedMigrations.php +++ b/app/Console/Commands/HostedMigrations.php @@ -62,7 +62,6 @@ class HostedMigrations extends Command */ public function handle() { - $this->buildCache(); if (! MultiDB::userFindAndSetDb($this->option('email'))) { $this->info('Could not find a user with that email address'); diff --git a/app/Console/Commands/ImportMigrations.php b/app/Console/Commands/ImportMigrations.php index aa78739e1117..3be007aa4509 100644 --- a/app/Console/Commands/ImportMigrations.php +++ b/app/Console/Commands/ImportMigrations.php @@ -75,8 +75,6 @@ class ImportMigrations extends Command { $this->faker = Factory::create(); - $this->buildCache(); - $path = $this->option('path') ?? public_path('storage/migrations/import'); $directory = new DirectoryIterator($path); diff --git a/app/Console/Commands/PostUpdate.php b/app/Console/Commands/PostUpdate.php index 9de7b55b0710..648ebb2d6966 100644 --- a/app/Console/Commands/PostUpdate.php +++ b/app/Console/Commands/PostUpdate.php @@ -86,8 +86,7 @@ class PostUpdate extends Command info('queue restarted'); - $this->buildCache(true); - + Artisan::call('cache:clear'); VersionCheck::dispatch(); info('Sent for version check'); diff --git a/app/DataMapper/Tax/BaseRule.php b/app/DataMapper/Tax/BaseRule.php index dca4576c6e3d..78eb1bd9445b 100644 --- a/app/DataMapper/Tax/BaseRule.php +++ b/app/DataMapper/Tax/BaseRule.php @@ -262,7 +262,7 @@ class BaseRule implements RuleInterface return $this->client->state; } - return USStates::getState(strlen($this->client->postal_code) > 1 ? $this->client->postal_code : $this->client->shipping_postal_code); + return USStates::getState(strlen($this->client->postal_code ?? '') > 1 ? $this->client->postal_code : $this->client->shipping_postal_code); } catch (\Exception $e) { return 'CA'; diff --git a/app/DataProviders/USStates.php b/app/DataProviders/USStates.php index 666f9356ef2a..a638bca2f937 100644 --- a/app/DataProviders/USStates.php +++ b/app/DataProviders/USStates.php @@ -34006,7 +34006,7 @@ class USStates 'WA', 'WA', 'WA', 'WA', 'WA', 'WA', 'WA', 'AK', 'AK', 'AK', 'AK', 'AK' ]; - $prefix = substr($zip, 0, 3); + $prefix = substr(($zip ?? ''), 0, 3); $index = intval($prefix); /* converts prefix to integer */ return $zip_by_state[$index] == "--" ? false : $zip_by_state[$index]; diff --git a/app/Http/Controllers/ActivityController.php b/app/Http/Controllers/ActivityController.php index 0abd534023b4..dac6478f326b 100644 --- a/app/Http/Controllers/ActivityController.php +++ b/app/Http/Controllers/ActivityController.php @@ -203,6 +203,7 @@ class ActivityController extends BaseController $activity->notes = $request->notes; $activity->user_id = $user->id; $activity->ip = $request->ip(); + $activity->activity_type_id = Activity::USER_NOTE; switch (get_class($entity)) { case Invoice::class: diff --git a/app/Http/Controllers/BaseController.php b/app/Http/Controllers/BaseController.php index e9b7fcc96dfa..dbd7545e9dc1 100644 --- a/app/Http/Controllers/BaseController.php +++ b/app/Http/Controllers/BaseController.php @@ -1158,8 +1158,6 @@ class BaseController extends Controller $data['path'] = $this->setBuild(); - $this->buildCache(); - if (Ninja::isSelfHost() && $account->set_react_as_default_ap) { return response()->view('react.index', $data)->header('X-Frame-Options', 'SAMEORIGIN', false); } else { diff --git a/app/Http/Controllers/SelfUpdateController.php b/app/Http/Controllers/SelfUpdateController.php index c5c2f07f2398..09127929bd77 100644 --- a/app/Http/Controllers/SelfUpdateController.php +++ b/app/Http/Controllers/SelfUpdateController.php @@ -112,8 +112,7 @@ class SelfUpdateController extends BaseController Artisan::call('view:clear'); Artisan::call('migrate', ['--force' => true]); Artisan::call('config:clear'); - - $this->buildCache(true); + Artisan::call('cache:clear'); $this->runModelChecks(); diff --git a/app/Http/Controllers/SetupController.php b/app/Http/Controllers/SetupController.php index 7c91dc91a019..eadc26b0fd74 100644 --- a/app/Http/Controllers/SetupController.php +++ b/app/Http/Controllers/SetupController.php @@ -159,8 +159,6 @@ class SetupController extends Controller (new VersionCheck())->handle(); - $this->buildCache(true); - return redirect('/'); } catch (Exception $e) { nlog($e->getMessage()); @@ -287,8 +285,7 @@ class SetupController extends Controller Artisan::call('migrate', ['--force' => true]); Artisan::call('db:seed', ['--force' => true]); - - $this->buildCache(true); + Artisan::call('cache:clear'); (new SchedulerCheck())->handle(); diff --git a/app/Providers/StaticServiceProvider.php b/app/Providers/StaticServiceProvider.php index 77dc905535a4..8b03c2e8a2e6 100644 --- a/app/Providers/StaticServiceProvider.php +++ b/app/Providers/StaticServiceProvider.php @@ -23,6 +23,7 @@ use App\Models\DateFormat; use App\Models\PaymentTerm; use App\Models\PaymentType; use App\Models\DatetimeFormat; +use Illuminate\Support\Facades\Cache; use Illuminate\Support\ServiceProvider; use App\DataMapper\EmailTemplateDefaults; @@ -37,62 +38,174 @@ class StaticServiceProvider extends ServiceProvider { /** @return \Illuminate\Support\Collection */ app()->singleton('currencies', function ($app) { - return Currency::query()->orderBy('name')->get(); + + if($resource = Cache::get('currencies')) { + return $resource; + } + + $resource = Currency::query()->orderBy('name')->get(); + + Cache::forever('currencies', $resource); + + return $resource; + }); /** @return \Illuminate\Support\Collection */ app()->singleton('languages', function ($app) { - return Language::query()->orderBy('name')->get(); + + if($resource = Cache::get('languages')) { + return $resource; + } + + $resource = Language::query()->orderBy('name')->get(); + + Cache::forever('languages', $resource); + + return $resource; + }); /** @return \Illuminate\Support\Collection */ app()->singleton('countries', function ($app) { - return Country::query()->orderBy('name')->get(); + + if($resource = Cache::get('countries')) { + return $resource; + } + + $resource = Country::query()->orderBy('name')->get(); + + Cache::forever('countries', $resource); + + return $resource; + }); /** @return \Illuminate\Support\Collection */ app()->singleton('payment_types', function ($app) { - return PaymentType::query()->orderBy('id')->get(); + + if($resource = Cache::get('payment_types')) { + return $resource; + } + + $resource = PaymentType::query()->orderBy('id')->get(); + + Cache::forever('payment_types', $resource); + + return $resource; + }); - /** @return \Illuminate\Support\Collection */ - app()->singleton('industries', function ($app) { - return Industry::query()->orderBy('name')->get(); - }); /** @return \Illuminate\Support\Collection */ app()->singleton('banks', function ($app) { - return Bank::query()->orderBy('name')->get(); + + + if($resource = Cache::get('banks')) { + return $resource; + } + + $resource = Bank::query()->orderBy('name')->get(); + + Cache::forever('banks', $resource); + + return $resource; + }); /** @return \Illuminate\Support\Collection */ app()->singleton('date_formats', function ($app) { - return DateFormat::query()->orderBy('id')->get(); + + + if($resource = Cache::get('date_formats')) { + return $resource; + } + + $resource = DateFormat::query()->orderBy('id')->get(); + + Cache::forever('date_formats', $resource); + + return $resource; + }); /** @return \Illuminate\Support\Collection */ app()->singleton('timezones', function ($app) { - return Timezone::query()->orderBy('id')->get(); + + + if($resource = Cache::get('timezones')) { + return $resource; + } + + $resource = Timezone::query()->orderBy('id')->get(); + + Cache::forever('timezones', $resource); + + return $resource; + }); - + /** @return \Illuminate\Support\Collection */ app()->singleton('gateways', function ($app) { - return Gateway::query()->orderBy('id')->get(); + + if($resource = Cache::get('gateways')) { + return $resource; + } + + $resource = Gateway::query()->orderBy('id')->get(); + + Cache::forever('gateways', $resource); + + return $resource; + + }); /** @return \Illuminate\Support\Collection */ app()->singleton('industries', function ($app) { - return Industry::query()->orderBy('id')->get(); + + + if($resource = Cache::get('industries')) { + return $resource; + } + + $resource = Industry::query()->orderBy('id')->get(); + + Cache::forever('industries', $resource); + + return $resource; + }); /** @return \Illuminate\Support\Collection */ app()->singleton('sizes', function ($app) { - return Size::query()->orderBy('id')->get(); + + + if($resource = Cache::get('sizes')) { + return $resource; + } + + $resource = Size::query()->orderBy('id')->get(); + + Cache::forever('sizes', $resource); + + return $resource; + }); /** @return \Illuminate\Support\Collection */ app()->singleton('datetime_formats', function ($app) { - return DatetimeFormat::query()->orderBy('id')->get(); + + if($resource = Cache::get('datetime_formats')) { + return $resource; + } + + $resource = DatetimeFormat::query()->orderBy('id')->get(); + + Cache::forever('datetime_formats', $resource); + + return $resource; + }); app()->singleton('templates', function ($app) { diff --git a/app/Utils/Traits/AppSetup.php b/app/Utils/Traits/AppSetup.php index f95e398f85a2..bd39635136f6 100644 --- a/app/Utils/Traits/AppSetup.php +++ b/app/Utils/Traits/AppSetup.php @@ -29,9 +29,17 @@ trait AppSetup return $check['system_health'] == 'true'; } - + + /** + * @deprecated + * + * @param mixed $force + * @return void + */ public function buildCache($force = false) { + return; + $cached_tables = config('ninja.cached_tables'); foreach ($cached_tables as $name => $class) { @@ -53,61 +61,6 @@ trait AppSetup } /*Build template cache*/ - $this->buildTemplates(); - } - - private function buildTemplates($name = 'templates') - { - $data = [ - - 'invoice' => [ - 'subject' => EmailTemplateDefaults::emailInvoiceSubject(), - 'body' => EmailTemplateDefaults::emailInvoiceTemplate(), - ], - - 'quote' => [ - 'subject' => EmailTemplateDefaults::emailQuoteSubject(), - 'body' => EmailTemplateDefaults::emailQuoteTemplate(), - ], - 'payment' => [ - 'subject' => EmailTemplateDefaults::emailPaymentSubject(), - 'body' => EmailTemplateDefaults::emailPaymentTemplate(), - ], - 'payment_partial' => [ - 'subject' => EmailTemplateDefaults::emailPaymentPartialSubject(), - 'body' => EmailTemplateDefaults::emailPaymentPartialTemplate(), - ], - 'reminder1' => [ - 'subject' => EmailTemplateDefaults::emailReminder1Subject(), - 'body' => EmailTemplateDefaults::emailReminder1Template(), - ], - 'reminder2' => [ - 'subject' => EmailTemplateDefaults::emailReminder2Subject(), - 'body' => EmailTemplateDefaults::emailReminder2Template(), - ], - 'reminder3' => [ - 'subject' => EmailTemplateDefaults::emailReminder3Subject(), - 'body' => EmailTemplateDefaults::emailReminder3Template(), - ], - 'reminder_endless' => [ - 'subject' => EmailTemplateDefaults::emailReminderEndlessSubject(), - 'body' => EmailTemplateDefaults::emailReminderEndlessTemplate(), - ], - 'statement' => [ - 'subject' => EmailTemplateDefaults::emailStatementSubject(), - 'body' => EmailTemplateDefaults::emailStatementTemplate(), - ], - 'credit' => [ - 'subject' => EmailTemplateDefaults::emailCreditSubject(), - 'body' => EmailTemplateDefaults::emailCreditTemplate(), - ], - 'purchase_order' => [ - 'subject' => EmailTemplateDefaults::emailPurchaseOrderSubject(), - 'body' => EmailTemplateDefaults::emailPurchaseOrderTemplate(), - ], - ]; - - Cache::forever($name, $data); } private function updateEnvironmentProperty(string $property, $value): void diff --git a/database/migrations/2021_01_03_215053_update_canadian_dollar_symbol.php b/database/migrations/2021_01_03_215053_update_canadian_dollar_symbol.php index 0a8d5c9204c0..43ea32fd5b8a 100644 --- a/database/migrations/2021_01_03_215053_update_canadian_dollar_symbol.php +++ b/database/migrations/2021_01_03_215053_update_canadian_dollar_symbol.php @@ -19,8 +19,7 @@ return new class extends Migration { if ($currency) { $currency->update(['symbol' => '$']); } - - $this->buildCache(true); + } /** diff --git a/database/migrations/2021_01_07_023350_update_singapore_dollar_symbol.php b/database/migrations/2021_01_07_023350_update_singapore_dollar_symbol.php index 1915a4cfdee6..30a64c7f8403 100644 --- a/database/migrations/2021_01_07_023350_update_singapore_dollar_symbol.php +++ b/database/migrations/2021_01_07_023350_update_singapore_dollar_symbol.php @@ -19,8 +19,6 @@ return new class extends Migration { if ($currency) { $currency->update(['symbol' => '$']); } - - $this->buildCache(true); } /** diff --git a/database/migrations/2021_04_22_110240_add_property_to_checkout_gateway_config.php b/database/migrations/2021_04_22_110240_add_property_to_checkout_gateway_config.php index 734063651bb8..ba55cc317150 100644 --- a/database/migrations/2021_04_22_110240_add_property_to_checkout_gateway_config.php +++ b/database/migrations/2021_04_22_110240_add_property_to_checkout_gateway_config.php @@ -36,7 +36,6 @@ return new class extends Migration { $checkout->save(); }); - // $this->buildCache(true); } /** diff --git a/database/migrations/2022_05_08_004937_heal_stripe_gateway_configuration.php b/database/migrations/2022_05_08_004937_heal_stripe_gateway_configuration.php index e12fafc9982f..b7c71804a628 100644 --- a/database/migrations/2022_05_08_004937_heal_stripe_gateway_configuration.php +++ b/database/migrations/2022_05_08_004937_heal_stripe_gateway_configuration.php @@ -34,7 +34,6 @@ return new class extends Migration { $record->save(); } - $this->buildCache(true); } } diff --git a/database/migrations/2022_05_23_050754_drop_redundant_column_show_production_description_dropdown.php b/database/migrations/2022_05_23_050754_drop_redundant_column_show_production_description_dropdown.php index 4574df9e7dbc..2a5569b59202 100644 --- a/database/migrations/2022_05_23_050754_drop_redundant_column_show_production_description_dropdown.php +++ b/database/migrations/2022_05_23_050754_drop_redundant_column_show_production_description_dropdown.php @@ -19,7 +19,6 @@ return new class extends Migration { $table->dropColumn('show_production_description_dropdown'); }); - $this->buildCache(true); } /** diff --git a/database/migrations/2022_07_06_080127_add_purchase_order_to_expense.php b/database/migrations/2022_07_06_080127_add_purchase_order_to_expense.php index 741b54b3999b..510c50b62f17 100644 --- a/database/migrations/2022_07_06_080127_add_purchase_order_to_expense.php +++ b/database/migrations/2022_07_06_080127_add_purchase_order_to_expense.php @@ -36,8 +36,6 @@ class AddPurchaseOrderToExpense extends Migration if (!$language) { Language::unguard(); Language::create(['id' => 36, 'name' => 'Bulgarian', 'locale' => 'bg']); - - $this->buildCache(true); } } diff --git a/database/migrations/2022_11_22_215618_lock_tasks_when_invoiced.php b/database/migrations/2022_11_22_215618_lock_tasks_when_invoiced.php index 29bb60d3f649..ec7807063e35 100644 --- a/database/migrations/2022_11_22_215618_lock_tasks_when_invoiced.php +++ b/database/migrations/2022_11_22_215618_lock_tasks_when_invoiced.php @@ -60,8 +60,6 @@ return new class extends Migration { } \Illuminate\Support\Facades\Artisan::call('ninja:design-update'); - - $this->buildCache(true); } /** diff --git a/database/migrations/2022_11_30_063229_add_payment_id_to_bank_transaction_table.php b/database/migrations/2022_11_30_063229_add_payment_id_to_bank_transaction_table.php index affa8ec6ff57..4ede57e4b06f 100644 --- a/database/migrations/2022_11_30_063229_add_payment_id_to_bank_transaction_table.php +++ b/database/migrations/2022_11_30_063229_add_payment_id_to_bank_transaction_table.php @@ -21,7 +21,6 @@ return new class extends Migration { \Illuminate\Support\Facades\Artisan::call('ninja:design-update'); - $this->buildCache(true); } /** diff --git a/database/seeders/RandomDataSeeder.php b/database/seeders/RandomDataSeeder.php index 16d7d4e42154..9e134dcf8ef1 100644 --- a/database/seeders/RandomDataSeeder.php +++ b/database/seeders/RandomDataSeeder.php @@ -59,8 +59,6 @@ class RandomDataSeeder extends Seeder public function run() { - $this->buildCache(true); - $this->command->info('Running RandomDataSeeder'); Model::unguard(); diff --git a/tests/Feature/Client/ClientMergeTest.php b/tests/Feature/Client/ClientMergeTest.php index d6ff8069412a..a11ca2d0fcd5 100644 --- a/tests/Feature/Client/ClientMergeTest.php +++ b/tests/Feature/Client/ClientMergeTest.php @@ -44,7 +44,6 @@ class ClientMergeTest extends TestCase parent::setUp(); $this->faker = Factory::create(); - $this->buildCache(true); } public function testSearchingForContacts() diff --git a/tests/Feature/ClientPortal/CreditsTest.php b/tests/Feature/ClientPortal/CreditsTest.php index 139694be153f..9f3f0e88fb65 100644 --- a/tests/Feature/ClientPortal/CreditsTest.php +++ b/tests/Feature/ClientPortal/CreditsTest.php @@ -40,7 +40,6 @@ class CreditsTest extends TestCase parent::setUp(); $this->faker = Factory::create(); - $this->buildCache(true); } diff --git a/tests/Feature/ClientPortal/InvoicesTest.php b/tests/Feature/ClientPortal/InvoicesTest.php index 3aab7fcd7c01..581dbf1d2405 100644 --- a/tests/Feature/ClientPortal/InvoicesTest.php +++ b/tests/Feature/ClientPortal/InvoicesTest.php @@ -37,7 +37,6 @@ class InvoicesTest extends TestCase parent::setUp(); $this->faker = Factory::create(); - $this->buildCache(true); } public function testInvoiceTableFilters() diff --git a/tests/Feature/Export/ArDetailReportTest.php b/tests/Feature/Export/ArDetailReportTest.php index cfd3ddc6d899..c623936fb3db 100644 --- a/tests/Feature/Export/ArDetailReportTest.php +++ b/tests/Feature/Export/ArDetailReportTest.php @@ -45,8 +45,6 @@ class ArDetailReportTest extends TestCase ); $this->withoutExceptionHandling(); - - $this->buildCache(true); } diff --git a/tests/Feature/Export/ProductSalesReportTest.php b/tests/Feature/Export/ProductSalesReportTest.php index f530acb3f3ec..8e86dd4c8f72 100644 --- a/tests/Feature/Export/ProductSalesReportTest.php +++ b/tests/Feature/Export/ProductSalesReportTest.php @@ -47,8 +47,6 @@ class ProductSalesReportTest extends TestCase ); $this->withoutExceptionHandling(); - - $this->buildCache(true); } public $company; diff --git a/tests/Integration/CompanyLedgerTest.php b/tests/Integration/CompanyLedgerTest.php index 6ee1bce7f5e9..4086f00ba55d 100644 --- a/tests/Integration/CompanyLedgerTest.php +++ b/tests/Integration/CompanyLedgerTest.php @@ -57,7 +57,6 @@ class CompanyLedgerTest extends TestCase $this->withoutExceptionHandling(); $this->artisan('db:seed --force'); - $this->buildCache(true); $this->faker = \Faker\Factory::create(); $fake_email = $this->faker->email(); diff --git a/tests/TestCase.php b/tests/TestCase.php index ffa0f237e183..a56725512a72 100644 --- a/tests/TestCase.php +++ b/tests/TestCase.php @@ -14,7 +14,5 @@ abstract class TestCase extends BaseTestCase { parent::setUp(); - $this->buildCache(true); - } } diff --git a/tests/Unit/CreditBalanceTest.php b/tests/Unit/CreditBalanceTest.php index 68122c2739d0..af9b3a393fe1 100644 --- a/tests/Unit/CreditBalanceTest.php +++ b/tests/Unit/CreditBalanceTest.php @@ -33,8 +33,6 @@ class CreditBalanceTest extends TestCase }); $this->makeTestData(); - - $this->buildCache(true); } public function testCreditBalance() diff --git a/tests/Unit/RecurringExpenseCloneTest.php b/tests/Unit/RecurringExpenseCloneTest.php index 3c6d589d4297..9048e28b4882 100644 --- a/tests/Unit/RecurringExpenseCloneTest.php +++ b/tests/Unit/RecurringExpenseCloneTest.php @@ -33,8 +33,6 @@ class RecurringExpenseCloneTest extends TestCase { parent::setUp(); $this->faker = \Faker\Factory::create(); - $this->buildCache(true); - } public function testBadBase64String() From d764f2736f34f65656259be66c1708f740984cae Mon Sep 17 00:00:00 2001 From: David Bomba Date: Fri, 21 Jun 2024 10:40:51 +1000 Subject: [PATCH 10/20] Fixes for cache in tests --- tests/Unit/RedisVsDatabaseTest.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tests/Unit/RedisVsDatabaseTest.php b/tests/Unit/RedisVsDatabaseTest.php index e2b0af1b7015..eb4ce119a2b6 100644 --- a/tests/Unit/RedisVsDatabaseTest.php +++ b/tests/Unit/RedisVsDatabaseTest.php @@ -31,11 +31,13 @@ class RedisVsDatabaseTest extends TestCase { $start = microtime(true); + app('currencies'); + $currencies = Cache::get('currencies'); - $currencies->filter(function ($item) { + $currencies->first(function ($item) { return $item->id == 17; - })->first(); + }); nlog(microtime(true) - $start); From 5ddda5aa33415b02437e496fbb1f54ddf6cf856d Mon Sep 17 00:00:00 2001 From: David Bomba Date: Fri, 21 Jun 2024 10:43:52 +1000 Subject: [PATCH 11/20] Fixes for tests --- tests/Unit/RedisVsDatabaseTest.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/Unit/RedisVsDatabaseTest.php b/tests/Unit/RedisVsDatabaseTest.php index eb4ce119a2b6..8016627913bf 100644 --- a/tests/Unit/RedisVsDatabaseTest.php +++ b/tests/Unit/RedisVsDatabaseTest.php @@ -29,10 +29,10 @@ class RedisVsDatabaseTest extends TestCase public function testRedisSpeed() { - $start = microtime(true); - app('currencies'); + $start = microtime(true); + $currencies = Cache::get('currencies'); $currencies->first(function ($item) { From a65d0d506754c89f1d91792fac89f194aca632bb Mon Sep 17 00:00:00 2001 From: David Bomba Date: Fri, 21 Jun 2024 10:56:18 +1000 Subject: [PATCH 12/20] Remove cache warmers --- app/Console/Commands/CreateAccount.php | 22 ---- app/Console/Commands/CreateSingleAccount.php | 30 ----- app/Console/Commands/CreateTestData.php | 29 ----- app/Console/Commands/DemoMode.php | 29 ----- app/Http/Middleware/StartupCheck.php | 109 ------------------- tests/Feature/Export/UserSalesReportTest.php | 25 ----- tests/MockAccountData.php | 27 ----- 7 files changed, 271 deletions(-) delete mode 100644 app/Http/Middleware/StartupCheck.php diff --git a/app/Console/Commands/CreateAccount.php b/app/Console/Commands/CreateAccount.php index f40814f28585..e62bb6bfd988 100644 --- a/app/Console/Commands/CreateAccount.php +++ b/app/Console/Commands/CreateAccount.php @@ -121,28 +121,6 @@ class CreateAccount extends Command (new CreateCompanyTaskStatuses($company, $user))->handle(); (new VersionCheck())->handle(); - $this->warmCache(); } - private function warmCache() - { - /* Warm up the cache !*/ - $cached_tables = config('ninja.cached_tables'); - - foreach ($cached_tables as $name => $class) { - if ($name == 'payment_terms') { - $orderBy = 'num_days'; - } elseif ($name == 'fonts') { - $orderBy = 'sort_order'; - } elseif (in_array($name, ['currencies', 'industries', 'languages', 'countries', 'banks'])) { - $orderBy = 'name'; - } else { - $orderBy = 'id'; - } - $tableData = $class::orderBy($orderBy)->get(); - if ($tableData->count()) { - Cache::forever($name, $tableData); - } - } - } } diff --git a/app/Console/Commands/CreateSingleAccount.php b/app/Console/Commands/CreateSingleAccount.php index f2769de649a1..50d915cca2a4 100644 --- a/app/Console/Commands/CreateSingleAccount.php +++ b/app/Console/Commands/CreateSingleAccount.php @@ -97,10 +97,6 @@ class CreateSingleAccount extends Command $this->count = 5; $this->gateway = $this->argument('gateway'); - $this->info('Warming up cache'); - - $this->warmCache(); - $this->createSmallAccount(); @@ -774,32 +770,6 @@ class CreateSingleAccount extends Command return $line_items; } - private function warmCache() - { - /* Warm up the cache !*/ - $cached_tables = config('ninja.cached_tables'); - - foreach ($cached_tables as $name => $class) { - // check that the table exists in case the migration is pending - if (! Schema::hasTable((new $class())->getTable())) { - continue; - } - if ($name == 'payment_terms') { - $orderBy = 'num_days'; - } elseif ($name == 'fonts') { - $orderBy = 'sort_order'; - } elseif (in_array($name, ['currencies', 'industries', 'languages', 'countries', 'banks'])) { - $orderBy = 'name'; - } else { - $orderBy = 'id'; - } - $tableData = $class::orderBy($orderBy)->get(); - if ($tableData->count()) { - Cache::forever($name, $tableData); - } - } - } - private function createGateways($company, $user) { if (config('ninja.testvars.stripe') && ($this->gateway == 'all' || $this->gateway == 'stripe')) { diff --git a/app/Console/Commands/CreateTestData.php b/app/Console/Commands/CreateTestData.php index 496e877c45d9..6bb5811ecb4f 100644 --- a/app/Console/Commands/CreateTestData.php +++ b/app/Console/Commands/CreateTestData.php @@ -86,8 +86,6 @@ class CreateTestData extends Command $this->info('Warming up cache'); - $this->warmCache(); - $this->createSmallAccount(); $this->createMediumAccount(); $this->createLargeAccount(); @@ -673,31 +671,4 @@ class CreateTestData extends Command return $line_items; } - private function warmCache() - { - /* Warm up the cache !*/ - $cached_tables = config('ninja.cached_tables'); - - foreach ($cached_tables as $name => $class) { - if (! Cache::has($name)) { - // check that the table exists in case the migration is pending - if (! Schema::hasTable((new $class())->getTable())) { - continue; - } - if ($name == 'payment_terms') { - $orderBy = 'num_days'; - } elseif ($name == 'fonts') { - $orderBy = 'sort_order'; - } elseif (in_array($name, ['currencies', 'industries', 'languages', 'countries', 'banks'])) { - $orderBy = 'name'; - } else { - $orderBy = 'id'; - } - $tableData = $class::orderBy($orderBy)->get(); - if ($tableData->count()) { - Cache::forever($name, $tableData); - } - } - } - } } diff --git a/app/Console/Commands/DemoMode.php b/app/Console/Commands/DemoMode.php index 11169d5832d5..8e4014d1ef17 100644 --- a/app/Console/Commands/DemoMode.php +++ b/app/Console/Commands/DemoMode.php @@ -84,8 +84,6 @@ class DemoMode extends Command $this->invoice_repo = new InvoiceRepository(); - $cached_tables = config('ninja.cached_tables'); - $this->info('Migrating'); Artisan::call('migrate:fresh --force'); @@ -623,31 +621,4 @@ class DemoMode extends Command return $line_items; } - private function warmCache() - { - /* Warm up the cache !*/ - $cached_tables = config('ninja.cached_tables'); - - foreach ($cached_tables as $name => $class) { - if (! Cache::has($name)) { - // check that the table exists in case the migration is pending - if (! Schema::hasTable((new $class())->getTable())) { - continue; - } - if ($name == 'payment_terms') { - $orderBy = 'num_days'; - } elseif ($name == 'fonts') { - $orderBy = 'sort_order'; - } elseif (in_array($name, ['currencies', 'industries', 'languages', 'countries', 'banks'])) { - $orderBy = 'name'; - } else { - $orderBy = 'id'; - } - $tableData = $class::orderBy($orderBy)->get(); - if ($tableData->count()) { - Cache::forever($name, $tableData); - } - } - } - } } diff --git a/app/Http/Middleware/StartupCheck.php b/app/Http/Middleware/StartupCheck.php deleted file mode 100644 index 75a4a010c951..000000000000 --- a/app/Http/Middleware/StartupCheck.php +++ /dev/null @@ -1,109 +0,0 @@ - $class) { - if ($request->has('clear_cache') || ! Cache::has($name)) { - // check that the table exists in case the migration is pending - if (! Schema::hasTable((new $class())->getTable())) { - continue; - } - if ($name == 'payment_terms') { - $orderBy = 'num_days'; - } elseif ($name == 'fonts') { - $orderBy = 'sort_order'; - } elseif (in_array($name, ['currencies', 'industries', 'languages', 'countries', 'banks'])) { - $orderBy = 'name'; - } else { - $orderBy = 'id'; - } - $tableData = $class::orderBy($orderBy)->get(); - if ($tableData->count()) { - Cache::forever($name, $tableData); - } - } - } - - /*Build template cache*/ - if ($request->has('clear_cache') || ! Cache::has('templates')) { - $this->buildTemplates(); - } - - return $next($request); - } - - private function buildTemplates($name = 'templates') - { - $data = [ - 'invoice' => [ - 'subject' => EmailTemplateDefaults::emailInvoiceSubject(), - 'body' => EmailTemplateDefaults::emailInvoiceTemplate(), - ], - 'quote' => [ - 'subject' => EmailTemplateDefaults::emailQuoteSubject(), - 'body' => EmailTemplateDefaults::emailQuoteTemplate(), - ], - 'payment' => [ - 'subject' => EmailTemplateDefaults::emailPaymentSubject(), - 'body' => EmailTemplateDefaults::emailPaymentTemplate(), - ], - 'reminder1' => [ - 'subject' => EmailTemplateDefaults::emailReminder1Subject(), - 'body' => EmailTemplateDefaults::emailReminder1Template(), - ], - 'reminder2' => [ - 'subject' => EmailTemplateDefaults::emailReminder2Subject(), - 'body' => EmailTemplateDefaults::emailReminder2Template(), - ], - 'reminder3' => [ - 'subject' => EmailTemplateDefaults::emailReminder3Subject(), - 'body' => EmailTemplateDefaults::emailReminder3Template(), - ], - 'reminder_endless' => [ - 'subject' => EmailTemplateDefaults::emailReminderEndlessSubject(), - 'body' => EmailTemplateDefaults::emailReminderEndlessTemplate(), - ], - 'statement' => [ - 'subject' => EmailTemplateDefaults::emailStatementSubject(), - 'body' => EmailTemplateDefaults::emailStatementTemplate(), - ], - ]; - - Cache::forever($name, $data); - } -} diff --git a/tests/Feature/Export/UserSalesReportTest.php b/tests/Feature/Export/UserSalesReportTest.php index 2be1a220237e..76253abac29a 100644 --- a/tests/Feature/Export/UserSalesReportTest.php +++ b/tests/Feature/Export/UserSalesReportTest.php @@ -46,31 +46,6 @@ class UserSalesReportTest extends TestCase $this->withoutExceptionHandling(); - /* Warm up the cache !*/ - $cached_tables = config('ninja.cached_tables'); - - $this->artisan('db:seed --force'); - - foreach ($cached_tables as $name => $class) { - // check that the table exists in case the migration is pending - if (! Schema::hasTable((new $class())->getTable())) { - continue; - } - if ($name == 'payment_terms') { - $orderBy = 'num_days'; - } elseif ($name == 'fonts') { - $orderBy = 'sort_order'; - } elseif (in_array($name, ['currencies', 'industries', 'languages', 'countries', 'banks'])) { - $orderBy = 'name'; - } else { - $orderBy = 'id'; - } - $tableData = $class::orderBy($orderBy)->get(); - if ($tableData->count()) { - Cache::forever($name, $tableData); - } - } - } public $company; diff --git a/tests/MockAccountData.php b/tests/MockAccountData.php index 32b5e057e3f7..c2d047d2fec0 100644 --- a/tests/MockAccountData.php +++ b/tests/MockAccountData.php @@ -203,33 +203,6 @@ trait MockAccountData { config(['database.default' => config('ninja.db.default')]); - // /* Warm up the cache !*/ - // $cached_tables = config('ninja.cached_tables'); - - // Artisan::call('db:seed', [ - // '--force' => true - // ]); - - // foreach ($cached_tables as $name => $class) { - // // check that the table exists in case the migration is pending - // if (! Schema::hasTable((new $class())->getTable())) { - // continue; - // } - // if ($name == 'payment_terms') { - // $orderBy = 'num_days'; - // } elseif ($name == 'fonts') { - // $orderBy = 'sort_order'; - // } elseif (in_array($name, ['currencies', 'industries', 'languages', 'countries', 'banks'])) { - // $orderBy = 'name'; - // } else { - // $orderBy = 'id'; - // } - // $tableData = $class::orderBy($orderBy)->get(); - // if ($tableData->count()) { - // Cache::forever($name, $tableData); - // } - // } - $this->faker = \Faker\Factory::create(); $fake_email = $this->faker->email(); From 50f13eca5a16d9fbf6268fdeb0c898fd1d8329df Mon Sep 17 00:00:00 2001 From: David Bomba Date: Fri, 21 Jun 2024 14:09:25 +1000 Subject: [PATCH 13/20] minor clean up --- .../Requests/Activity/StoreNoteRequest.php | 7 ++++-- .../Transformer/Csv/ClientTransformer.php | 22 ++++++++++--------- 2 files changed, 17 insertions(+), 12 deletions(-) diff --git a/app/Http/Requests/Activity/StoreNoteRequest.php b/app/Http/Requests/Activity/StoreNoteRequest.php index 88e90a45f306..8233cfd0592c 100644 --- a/app/Http/Requests/Activity/StoreNoteRequest.php +++ b/app/Http/Requests/Activity/StoreNoteRequest.php @@ -33,9 +33,9 @@ class StoreNoteRequest extends Request $user = auth()->user(); $rules = [ - 'entity' => 'required|in:invoices,quotes,credits,recurring_invoices,clients,vendors,credits,payments,projects,tasks,expenses,recurring_expenses,bank_transactions,purchase_orders', + 'entity' => 'required|bail|in:invoices,quotes,credits,recurring_invoices,clients,vendors,credits,payments,projects,tasks,expenses,recurring_expenses,bank_transactions,purchase_orders', 'entity_id' => ['required','bail', Rule::exists($this->entity, 'id')->where('company_id', $user->company()->id)], - 'notes' => 'required', + 'notes' => 'required|bail', ]; return $rules; @@ -68,6 +68,9 @@ class StoreNoteRequest extends Request public function getEntity() { + if(!$this->entity) + return false; + $class = "\\App\\Models\\".ucfirst(Str::camel(rtrim($this->entity, 's'))); return $class::withTrashed()->find(is_string($this->entity_id) ? $this->decodePrimaryKey($this->entity_id) : $this->entity_id); diff --git a/app/Import/Transformer/Csv/ClientTransformer.php b/app/Import/Transformer/Csv/ClientTransformer.php index 3599c9edf06b..287b6ab2e049 100644 --- a/app/Import/Transformer/Csv/ClientTransformer.php +++ b/app/Import/Transformer/Csv/ClientTransformer.php @@ -70,16 +70,18 @@ class ClientTransformer extends BaseTransformer 'custom_value2' => $this->getString($data, 'client.custom_value2'), 'custom_value3' => $this->getString($data, 'client.custom_value3'), 'custom_value4' => $this->getString($data, 'client.custom_value4'), - 'balance' => preg_replace( - '/[^0-9,.]+/', - '', - $this->getFloat($data, 'client.balance') - ), - 'paid_to_date' => preg_replace( - '/[^0-9,.]+/', - '', - $this->getFloat($data, 'client.paid_to_date') - ), + // 'balance' => preg_replace( + // '/[^0-9,.]+/', + // '', + // $this->getFloat($data, 'client.balance') + // ), + // 'paid_to_date' => preg_replace( + // '/[^0-9,.]+/', + // '', + // $this->getFloat($data, 'client.paid_to_date') + // ), + 'paid_to_date' => 0, + 'balance' => 0, 'credit_balance' => 0, 'settings' => $settings, 'client_hash' => Str::random(40), From 2d87131627a0520dce0b28ae4caef88111f2c99e Mon Sep 17 00:00:00 2001 From: David Bomba Date: Fri, 21 Jun 2024 14:16:21 +1000 Subject: [PATCH 14/20] Fixes for project name label --- app/Utils/HtmlEngine.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Utils/HtmlEngine.php b/app/Utils/HtmlEngine.php index f85f3909be52..05880f5bcee9 100644 --- a/app/Utils/HtmlEngine.php +++ b/app/Utils/HtmlEngine.php @@ -277,7 +277,7 @@ class HtmlEngine $data['$credit.custom4'] = &$data['$quote.custom4']; if ($this->entity->project) { - $data['$project.name'] = ['value' => $this->entity->project->name, 'label' => ctrans('texts.project_name')]; + $data['$project.name'] = ['value' => $this->entity->project->name, 'label' => ctrans('texts.project')]; $data['$invoice.project'] = &$data['$project.name']; $data['$quote.project'] = &$data['$project.name']; From 4855276794a3fd3f2ab67f12efc6df0e24720596 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Fri, 21 Jun 2024 19:40:56 +1000 Subject: [PATCH 15/20] Working on quote reminders --- app/Console/Kernel.php | 4 + app/DataMapper/CompanySettings.php | 18 + app/DataMapper/EmailTemplateDefaults.php | 20 + app/Events/Quote/QuoteReminderWasEmailed.php | 28 + app/Jobs/Util/QuoteReminderJob.php | 323 ++++++++++++ .../Quote/QuoteReminderEmailActivity.php | 60 +++ app/Models/Activity.php | 2 + app/Models/Quote.php | 22 + app/Models/Webhook.php | 3 + app/Providers/EventServiceProvider.php | 492 +++++++++--------- app/Providers/StaticServiceProvider.php | 4 + app/Services/Invoice/UpdateReminder.php | 3 +- app/Services/Quote/QuoteService.php | 9 +- lang/ar/texts.php | 118 ++--- lang/bg/texts.php | 92 ++-- lang/ca/texts.php | 36 +- lang/da/texts.php | 36 +- lang/de/texts.php | 36 +- lang/el/texts.php | 84 +-- lang/en/texts.php | 7 + lang/es/texts.php | 36 +- lang/es_ES/texts.php | 36 +- lang/et/texts.php | 84 +-- lang/fa/texts.php | 84 +-- lang/fi/texts.php | 88 ++-- lang/fr/texts.php | 36 +- lang/fr_CA/texts.php | 36 +- lang/fr_CH/texts.php | 36 +- lang/he/texts.php | 36 +- lang/hr/texts.php | 84 +-- lang/hu/texts.php | 36 +- lang/it/texts.php | 36 +- lang/ja/texts.php | 63 +-- lang/km_KH/texts.php | 36 +- lang/lo_LA/texts.php | 36 +- lang/lt/texts.php | 90 ++-- lang/lv_LV/texts.php | 84 +-- lang/mk_MK/texts.php | 84 +-- lang/nl/texts.php | 36 +- lang/pt_BR/texts.php | 36 +- lang/pt_PT/texts.php | 36 +- lang/ro/texts.php | 36 +- lang/ru_RU/texts.php | 84 +-- lang/sk/texts.php | 36 +- lang/sl/texts.php | 84 +-- lang/sr/texts.php | 79 +-- lang/sv/texts.php | 36 +- lang/zh_TW/texts.php | 36 +- 48 files changed, 1402 insertions(+), 1515 deletions(-) create mode 100644 app/Events/Quote/QuoteReminderWasEmailed.php create mode 100644 app/Jobs/Util/QuoteReminderJob.php create mode 100644 app/Listeners/Quote/QuoteReminderEmailActivity.php diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php index f18d1c3d2f4a..2c1a731228ad 100644 --- a/app/Console/Kernel.php +++ b/app/Console/Kernel.php @@ -27,6 +27,7 @@ use App\Jobs\Ninja\TaskScheduler; use App\Jobs\Quote\QuoteCheckExpired; use App\Jobs\Subscription\CleanStaleInvoiceOrder; use App\Jobs\Util\DiskCleanup; +use App\Jobs\Util\QuoteReminderJob; use App\Jobs\Util\ReminderJob; use App\Jobs\Util\SchedulerCheck; use App\Jobs\Util\UpdateExchangeRates; @@ -55,6 +56,9 @@ class Kernel extends ConsoleKernel /* Send reminders */ $schedule->job(new ReminderJob())->hourly()->withoutOverlapping()->name('reminder-job')->onOneServer(); + /* Send quote reminders */ + $schedule->job(new QuoteReminderJob())->hourly()->withoutOverlapping()->name('quote-reminder-job')->onOneServer(); + /* Sends recurring invoices*/ $schedule->job(new RecurringInvoicesCron())->hourly()->withoutOverlapping()->name('recurring-invoice-job')->onOneServer(); diff --git a/app/DataMapper/CompanySettings.php b/app/DataMapper/CompanySettings.php index 1b055e71ea78..db51415837fa 100644 --- a/app/DataMapper/CompanySettings.php +++ b/app/DataMapper/CompanySettings.php @@ -507,7 +507,25 @@ class CompanySettings extends BaseSettings public int $task_round_to_nearest = 1; + /** quote reminders */ + public $email_quote_template_reminder1 = ''; + public $email_quote_subject_reminder1 = ''; + public $enable_quote_reminder1 = false; + public $quote_num_days_reminder1 = 0; + public $quote_schedule_reminder1 = ''; //before_valid_until_date,after_valid_until_date,after_quote_date + public $quote_late_fee_amount1 = 0; + public $quote_late_fee_percent1 = 0; + + + public static $casts = [ + 'enable_quote_reminder1' => 'bool', + 'quote_num_days_reminder1' => 'string', + 'quote_schedule_reminder1' => 'string', + 'quote_late_fee_amount1' => 'float', + 'quote_late_fee_percent1' => 'float', + 'email_quote_template_reminder1' => 'string', + 'email_quote_subject_reminder1' => 'string', 'task_round_up' => 'bool', 'task_round_to_nearest' => 'int', 'e_quote_type' => 'string', diff --git a/app/DataMapper/EmailTemplateDefaults.php b/app/DataMapper/EmailTemplateDefaults.php index c5390aa1d826..ff24f0d2f1f2 100644 --- a/app/DataMapper/EmailTemplateDefaults.php +++ b/app/DataMapper/EmailTemplateDefaults.php @@ -115,12 +115,32 @@ class EmailTemplateDefaults case 'email_vendor_notification_body': return self::emailVendorNotificationBody(); + case 'email_quote_template_reminder1': + return self::emailQuoteReminder1Body(); + + case 'email_quote_subject_reminder1': + return self::emailQuoteReminder1Subject(); + default: return self::emailInvoiceTemplate(); } } + public static function emailQuoteReminder1Subject() + { + return ctrans('texts.quote_reminder_subject', ['quote' => '$number', 'company' => '$company.name']); + } + + public static function emailQuoteReminder1Body() + { + + $invoice_message = '

$client

'.self::transformText('quote_reminder_message').'

$view_button
'; + + return $invoice_message; + + } + public static function emailVendorNotificationSubject() { return self::transformText('vendor_notification_subject'); diff --git a/app/Events/Quote/QuoteReminderWasEmailed.php b/app/Events/Quote/QuoteReminderWasEmailed.php new file mode 100644 index 000000000000..8ec95d798469 --- /dev/null +++ b/app/Events/Quote/QuoteReminderWasEmailed.php @@ -0,0 +1,28 @@ +format('Y-m-d h:i:s')); + + Quote::query() + ->where('is_deleted', 0) + ->whereIn('status_id', [Invoice::STATUS_SENT]) + ->whereNull('deleted_at') + ->where('next_send_date', '<=', now()->toDateTimeString()) + ->whereHas('client', function ($query) { + $query->where('is_deleted', 0) + ->where('deleted_at', null); + }) + ->whereHas('company', function ($query) { + $query->where('is_disabled', 0); + }) + ->with('invitations')->chunk(50, function ($quotes) { + foreach ($quotes as $quote) { + $this->sendReminderForQuote($quote); + } + + sleep(1); + }); + } else { + //multiDB environment, need to + + foreach (MultiDB::$dbs as $db) { + MultiDB::setDB($db); + + nrlog("Sending quote reminders on db {$db} ".now()->format('Y-m-d h:i:s')); + + Quote::query() + ->where('is_deleted', 0) + ->whereIn('status_id', [Invoice::STATUS_SENT]) + ->whereNull('deleted_at') + ->where('next_send_date', '<=', now()->toDateTimeString()) + ->whereHas('client', function ($query) { + $query->where('is_deleted', 0) + ->where('deleted_at', null); + }) + ->whereHas('company', function ($query) { + $query->where('is_disabled', 0); + }) + ->with('invitations')->chunk(50, function ($quotes) { + + foreach ($quotes as $quote) { + $this->sendReminderForQuote($quote); + } + + sleep(1); + }); + } + } + } + + private function sendReminderForQuote(Quote $quote) + { + App::forgetInstance('translator'); + $t = app('translator'); + $t->replace(Ninja::transformTranslations($quote->client->getMergedSettings())); + App::setLocale($quote->client->locale()); + + if ($quote->isPayable()) { + //Attempts to prevent duplicates from sending + if ($quote->reminder_last_sent && Carbon::parse($quote->reminder_last_sent)->startOfDay()->eq(now()->startOfDay())) { + nrlog("caught a duplicate reminder for quote {$quote->number}"); + return; + } + + $reminder_template = $quote->calculateTemplate('invoice'); + nrlog("#{$quote->number} => reminder template = {$reminder_template}"); + $quote->service()->touchReminder($reminder_template)->save(); + $fees = $this->calcLateFee($quote, $reminder_template); + + if($quote->isLocked()) { + return $this->addFeeToNewQuote($quote, $reminder_template, $fees); + } + + $quote = $this->setLateFee($quote, $fees[0], $fees[1]); + + //20-04-2022 fixes for endless reminders - generic template naming was wrong + $enabled_reminder = 'enable_'.$reminder_template; + if ($reminder_template == 'endless_reminder') { + $enabled_reminder = 'enable_reminder_endless'; + } + + if (in_array($reminder_template, ['reminder1', 'reminder2', 'reminder3', 'reminder_endless', 'endless_reminder']) && + $quote->client->getSetting($enabled_reminder) && + $quote->client->getSetting('send_reminders') && + (Ninja::isSelfHost() || $quote->company->account->isPaidHostedClient())) { + $quote->invitations->each(function ($invitation) use ($quote, $reminder_template) { + if ($invitation->contact && !$invitation->contact->trashed() && $invitation->contact->email) { + EmailEntity::dispatch($invitation, $invitation->company, $reminder_template); + nrlog("Firing reminder email for invoice {$quote->number} - {$reminder_template}"); + $quote->entityEmailEvent($invitation, $reminder_template); + $quote->sendEvent(Webhook::EVENT_REMIND_INVOICE, "client"); + } + }); + } + $quote->service()->setReminder()->save(); + } else { + $quote->next_send_date = null; + $quote->save(); + } + } + + private function addFeeToNewQuote(Quote $over_due_quote, string $reminder_template, array $fees) + { + + $amount = $fees[0]; + $percent = $fees[1]; + + $quote = false; + + //2024-06-07 this early return prevented any reminders from sending for users who enabled lock_invoices. + if ($amount > 0 || $percent > 0) { + // return; + + $fee = $amount; + + if ($over_due_quote->partial > 0) { + $fee += round($over_due_quote->partial * $percent / 100, 2); + } else { + $fee += round($over_due_quote->balance * $percent / 100, 2); + } + + /** @var \App\Models\Invoice $quote */ + $quote = InvoiceFactory::create($over_due_quote->company_id, $over_due_quote->user_id); + $quote->client_id = $over_due_quote->client_id; + $quote->date = now()->format('Y-m-d'); + $quote->due_date = now()->format('Y-m-d'); + + $quote_item = new InvoiceItem(); + $quote_item->type_id = '5'; + $quote_item->product_key = trans('texts.fee'); + $quote_item->notes = ctrans('texts.late_fee_added_locked_invoice', ['invoice' => $over_due_quote->number, 'date' => $this->translateDate(now()->startOfDay(), $over_due_invoice->client->date_format(), $over_due_invoice->client->locale())]); + $quote_item->quantity = 1; + $quote_item->cost = $fee; + + $quote_items = []; + $quote_items[] = $quote_item; + + $quote->line_items = $quote_items; + + /**Refresh Invoice values*/ + $quote = $quote->calc()->getInvoice(); + $quote->service() + ->createInvitations() + ->applyNumber() + ->markSent() + ->save(); + } + + if(!$quote) { + $quote = $over_due_quote; + } + + $enabled_reminder = 'enable_'.$reminder_template; + // if ($reminder_template == 'endless_reminder') { + // $enabled_reminder = 'enable_reminder_endless'; + // } + + if (in_array($reminder_template, ['reminder1', 'reminder2', 'reminder3', 'reminder_endless', 'endless_reminder']) && + $quote->client->getSetting($enabled_reminder) && + $quote->client->getSetting('send_reminders') && + (Ninja::isSelfHost() || $quote->company->account->isPaidHostedClient())) { + $quote->invitations->each(function ($invitation) use ($quote, $reminder_template) { + if ($invitation->contact && !$invitation->contact->trashed() && $invitation->contact->email) { + EmailEntity::dispatch($invitation, $invitation->company, $reminder_template); + nrlog("Firing reminder email for qipte {$quote->number} - {$reminder_template}"); + event(new QuoteReminderWasEmailed($invitation, $invitation->company, Ninja::eventVars(auth()->user() ? auth()->user()->id : null), $reminder_template)); + $quote->sendEvent(Webhook::EVENT_REMIND_QUOTE, "client"); + } + }); + } + + $quote->service()->setReminder()->save(); + + } + + /** + * Calculates the late if - if any - and rebuilds the invoice + * + * @param Invoice $quote + * @param string $template + * @return array + */ + private function calcLateFee($quote, $template): array + { + $late_fee_amount = 0; + $late_fee_percent = 0; + + switch ($template) { + case 'reminder1': + $late_fee_amount = $quote->client->getSetting('late_fee_amount1'); + $late_fee_percent = $quote->client->getSetting('late_fee_percent1'); + break; + case 'reminder2': + $late_fee_amount = $quote->client->getSetting('late_fee_amount2'); + $late_fee_percent = $quote->client->getSetting('late_fee_percent2'); + break; + case 'reminder3': + $late_fee_amount = $quote->client->getSetting('late_fee_amount3'); + $late_fee_percent = $quote->client->getSetting('late_fee_percent3'); + break; + case 'endless_reminder': + $late_fee_amount = $quote->client->getSetting('late_fee_endless_amount'); + $late_fee_percent = $quote->client->getSetting('late_fee_endless_percent'); + break; + default: + $late_fee_amount = 0; + $late_fee_percent = 0; + break; + } + + return [$late_fee_amount, $late_fee_percent]; + } + + /** + * Applies the late fee to the invoice line items + * + * @param Invoice $quote + * @param float $amount The fee amount + * @param float $percent The fee percentage amount + * + * @return Invoice + */ + private function setLateFee($quote, $amount, $percent): Invoice + { + + $temp_invoice_balance = $quote->balance; + + if ($amount <= 0 && $percent <= 0) { + return $quote; + } + + $fee = $amount; + + if ($quote->partial > 0) { + $fee += round($quote->partial * $percent / 100, 2); + } else { + $fee += round($quote->balance * $percent / 100, 2); + } + + $quote_item = new InvoiceItem(); + $quote_item->type_id = '5'; + $quote_item->product_key = trans('texts.fee'); + $quote_item->notes = ctrans('texts.late_fee_added', ['date' => $this->translateDate(now()->startOfDay(), $quote->client->date_format(), $quote->client->locale())]); + $quote_item->quantity = 1; + $quote_item->cost = $fee; + + $quote_items = $quote->line_items; + $quote_items[] = $quote_item; + + $quote->line_items = $quote_items; + + /**Refresh Invoice values*/ + $quote = $quote->calc()->getInvoice(); + + $quote->ledger()->updateInvoiceBalance($quote->balance - $temp_invoice_balance, "Late Fee Adjustment for invoice {$quote->number}"); + $quote->client->service()->calculateBalance(); + + return $quote; + } +} diff --git a/app/Listeners/Quote/QuoteReminderEmailActivity.php b/app/Listeners/Quote/QuoteReminderEmailActivity.php new file mode 100644 index 000000000000..f343b248b218 --- /dev/null +++ b/app/Listeners/Quote/QuoteReminderEmailActivity.php @@ -0,0 +1,60 @@ +company->db); + + $fields = new stdClass(); + + $user_id = isset($event->event_vars['user_id']) ? $event->event_vars['user_id'] : $event->invitation->quote->user_id; + + $reminder = match($event->template) { + 'quote_reminder1' => 142, + default => 142, + }; + + $fields->user_id = $user_id; + $fields->quote_id = $event->invitation->quote_id; + $fields->company_id = $event->invitation->company_id; + $fields->client_contact_id = $event->invitation->client_contact_id; + $fields->client_id = $event->invitation->quote->client_id; + $fields->activity_type_id = $reminder; + + $this->activity_repo->save($fields, $event->invitation, $event->event_vars); + } +} diff --git a/app/Models/Activity.php b/app/Models/Activity.php index 37e235c7fee4..13e52f5619ac 100644 --- a/app/Models/Activity.php +++ b/app/Models/Activity.php @@ -263,6 +263,8 @@ class Activity extends StaticModel public const USER_NOTE = 141; + public const QUOTE_REMINDER1_SENT = 142; + protected $casts = [ 'is_system' => 'boolean', 'updated_at' => 'timestamp', diff --git a/app/Models/Quote.php b/app/Models/Quote.php index 283d55b3aeb2..b0f7a17f6d53 100644 --- a/app/Models/Quote.php +++ b/app/Models/Quote.php @@ -399,4 +399,26 @@ class Quote extends BaseModel { return $entity_string; } + + + /** + * isPayable - proxy for matching Invoice status as + * to whether the quote is still valid, allows + * reuse of UpdateReminder class + * + * @return bool + */ + public function isPayable(): bool + { + if ($this->status_id == self::STATUS_SENT && $this->is_deleted == false && $this->due_date->gte(now()->addSeconds($this->timezone_offset()))) { + return true; + } elseif ($this->status_id == self::STATUS_DRAFT || $this->is_deleted) { + return false; + } elseif (in_array($this->status_id, [self::STATUS_APPROVED, self::STATUS_CONVERTED])) { + return false; + } else { + return false; + } + } + } diff --git a/app/Models/Webhook.php b/app/Models/Webhook.php index 02eb4911f006..3b90960b60c5 100644 --- a/app/Models/Webhook.php +++ b/app/Models/Webhook.php @@ -174,7 +174,10 @@ class Webhook extends BaseModel public const EVENT_SENT_PURCHASE_ORDER = 63; + public const EVENT_REMIND_QUOTE = 64; + public static $valid_events = [ + self::EVENT_REMIND_QUOTE, self::EVENT_CREATE_PURCHASE_ORDER, self::EVENT_UPDATE_PURCHASE_ORDER, self::EVENT_DELETE_PURCHASE_ORDER, diff --git a/app/Providers/EventServiceProvider.php b/app/Providers/EventServiceProvider.php index b7f1a37159e5..54e3039ea124 100644 --- a/app/Providers/EventServiceProvider.php +++ b/app/Providers/EventServiceProvider.php @@ -11,269 +11,271 @@ namespace App\Providers; -use App\Events\Account\AccountCreated; -use App\Events\Account\StripeConnectFailure; -use App\Events\Client\ClientWasArchived; -use App\Events\Client\ClientWasCreated; -use App\Events\Client\ClientWasDeleted; -use App\Events\Client\ClientWasRestored; -use App\Events\Client\ClientWasUpdated; -use App\Events\Company\CompanyDocumentsDeleted; -use App\Events\Contact\ContactLoggedIn; -use App\Events\Credit\CreditWasArchived; -use App\Events\Credit\CreditWasCreated; -use App\Events\Credit\CreditWasDeleted; -use App\Events\Credit\CreditWasEmailed; -use App\Events\Credit\CreditWasEmailedAndFailed; -use App\Events\Credit\CreditWasMarkedSent; -use App\Events\Credit\CreditWasRestored; -use App\Events\Credit\CreditWasUpdated; -use App\Events\Credit\CreditWasViewed; -use App\Events\Design\DesignWasArchived; -use App\Events\Design\DesignWasDeleted; -use App\Events\Design\DesignWasRestored; -use App\Events\Design\DesignWasUpdated; -use App\Events\Document\DocumentWasArchived; -use App\Events\Document\DocumentWasCreated; -use App\Events\Document\DocumentWasDeleted; -use App\Events\Document\DocumentWasRestored; -use App\Events\Document\DocumentWasUpdated; -use App\Events\Expense\ExpenseWasArchived; -use App\Events\Expense\ExpenseWasCreated; -use App\Events\Expense\ExpenseWasDeleted; -use App\Events\Expense\ExpenseWasRestored; -use App\Events\Expense\ExpenseWasUpdated; -use App\Events\Invoice\InvoiceReminderWasEmailed; -use App\Events\Invoice\InvoiceWasArchived; -use App\Events\Invoice\InvoiceWasCancelled; -use App\Events\Invoice\InvoiceWasCreated; -use App\Events\Invoice\InvoiceWasDeleted; -use App\Events\Invoice\InvoiceWasEmailed; -use App\Events\Invoice\InvoiceWasEmailedAndFailed; -use App\Events\Invoice\InvoiceWasMarkedSent; -use App\Events\Invoice\InvoiceWasPaid; -use App\Events\Invoice\InvoiceWasRestored; -use App\Events\Invoice\InvoiceWasReversed; -use App\Events\Invoice\InvoiceWasUpdated; -use App\Events\Invoice\InvoiceWasViewed; -use App\Events\Misc\InvitationWasViewed; -use App\Events\Payment\PaymentWasArchived; -use App\Events\Payment\PaymentWasCreated; -use App\Events\Payment\PaymentWasDeleted; -use App\Events\Payment\PaymentWasEmailed; -use App\Events\Payment\PaymentWasEmailedAndFailed; -use App\Events\Payment\PaymentWasRefunded; -use App\Events\Payment\PaymentWasRestored; -use App\Events\Payment\PaymentWasUpdated; -use App\Events\Payment\PaymentWasVoided; -use App\Events\PurchaseOrder\PurchaseOrderWasAccepted; -use App\Events\PurchaseOrder\PurchaseOrderWasArchived; -use App\Events\PurchaseOrder\PurchaseOrderWasCreated; -use App\Events\PurchaseOrder\PurchaseOrderWasDeleted; -use App\Events\PurchaseOrder\PurchaseOrderWasEmailed; -use App\Events\PurchaseOrder\PurchaseOrderWasRestored; -use App\Events\PurchaseOrder\PurchaseOrderWasUpdated; -use App\Events\PurchaseOrder\PurchaseOrderWasViewed; -use App\Events\Quote\QuoteWasApproved; -use App\Events\Quote\QuoteWasArchived; -use App\Events\Quote\QuoteWasCreated; -use App\Events\Quote\QuoteWasDeleted; -use App\Events\Quote\QuoteWasEmailed; -use App\Events\Quote\QuoteWasRestored; -use App\Events\Quote\QuoteWasUpdated; -use App\Events\Quote\QuoteWasViewed; -use App\Events\RecurringExpense\RecurringExpenseWasArchived; -use App\Events\RecurringExpense\RecurringExpenseWasCreated; -use App\Events\RecurringExpense\RecurringExpenseWasDeleted; -use App\Events\RecurringExpense\RecurringExpenseWasRestored; -use App\Events\RecurringExpense\RecurringExpenseWasUpdated; -use App\Events\RecurringInvoice\RecurringInvoiceWasArchived; -use App\Events\RecurringInvoice\RecurringInvoiceWasCreated; -use App\Events\RecurringInvoice\RecurringInvoiceWasDeleted; -use App\Events\RecurringInvoice\RecurringInvoiceWasRestored; -use App\Events\RecurringInvoice\RecurringInvoiceWasUpdated; -use App\Events\RecurringQuote\RecurringQuoteWasArchived; -use App\Events\RecurringQuote\RecurringQuoteWasCreated; -use App\Events\RecurringQuote\RecurringQuoteWasDeleted; -use App\Events\RecurringQuote\RecurringQuoteWasRestored; -use App\Events\RecurringQuote\RecurringQuoteWasUpdated; -use App\Events\Statement\StatementWasEmailed; -use App\Events\Subscription\SubscriptionWasArchived; -use App\Events\Subscription\SubscriptionWasCreated; -use App\Events\Subscription\SubscriptionWasDeleted; -use App\Events\Subscription\SubscriptionWasRestored; -use App\Events\Subscription\SubscriptionWasUpdated; -use App\Events\Task\TaskWasArchived; -use App\Events\Task\TaskWasCreated; -use App\Events\Task\TaskWasDeleted; -use App\Events\Task\TaskWasRestored; -use App\Events\Task\TaskWasUpdated; -use App\Events\User\UserLoggedIn; -use App\Events\User\UserWasArchived; -use App\Events\User\UserWasCreated; -use App\Events\User\UserWasDeleted; -use App\Events\User\UserWasRestored; -use App\Events\User\UserWasUpdated; -use App\Events\Vendor\VendorContactLoggedIn; -use App\Events\Vendor\VendorWasArchived; -use App\Events\Vendor\VendorWasCreated; -use App\Events\Vendor\VendorWasDeleted; -use App\Events\Vendor\VendorWasRestored; -use App\Events\Vendor\VendorWasUpdated; -use App\Listeners\Account\StripeConnectFailureListener; -use App\Listeners\Activity\ArchivedClientActivity; -use App\Listeners\Activity\ClientUpdatedActivity; -use App\Listeners\Activity\CreatedClientActivity; -use App\Listeners\Activity\CreatedCreditActivity; -use App\Listeners\Activity\CreatedExpenseActivity; -use App\Listeners\Activity\CreatedQuoteActivity; -use App\Listeners\Activity\CreatedSubscriptionActivity; -use App\Listeners\Activity\CreatedTaskActivity; -use App\Listeners\Activity\CreatedVendorActivity; -use App\Listeners\Activity\CreditArchivedActivity; -use App\Listeners\Activity\DeleteClientActivity; -use App\Listeners\Activity\DeleteCreditActivity; -use App\Listeners\Activity\ExpenseArchivedActivity; -use App\Listeners\Activity\ExpenseDeletedActivity; -use App\Listeners\Activity\ExpenseRestoredActivity; -use App\Listeners\Activity\ExpenseUpdatedActivity; -use App\Listeners\Activity\PaymentArchivedActivity; -use App\Listeners\Activity\PaymentCreatedActivity; -use App\Listeners\Activity\PaymentDeletedActivity; -use App\Listeners\Activity\PaymentRefundedActivity; -use App\Listeners\Activity\PaymentUpdatedActivity; -use App\Listeners\Activity\PaymentVoidedActivity; -use App\Listeners\Activity\QuoteUpdatedActivity; -use App\Listeners\Activity\RestoreClientActivity; -use App\Listeners\Activity\SubscriptionArchivedActivity; -use App\Listeners\Activity\SubscriptionDeletedActivity; -use App\Listeners\Activity\SubscriptionRestoredActivity; -use App\Listeners\Activity\SubscriptionUpdatedActivity; -use App\Listeners\Activity\TaskArchivedActivity; -use App\Listeners\Activity\TaskDeletedActivity; -use App\Listeners\Activity\TaskRestoredActivity; -use App\Listeners\Activity\TaskUpdatedActivity; -use App\Listeners\Activity\UpdatedCreditActivity; -use App\Listeners\Activity\VendorArchivedActivity; -use App\Listeners\Activity\VendorDeletedActivity; -use App\Listeners\Activity\VendorRestoredActivity; -use App\Listeners\Activity\VendorUpdatedActivity; -use App\Listeners\Contact\UpdateContactLastLogin; -use App\Listeners\Credit\CreditCreatedNotification; -use App\Listeners\Credit\CreditEmailedNotification; -use App\Listeners\Credit\CreditRestoredActivity; -use App\Listeners\Credit\CreditViewedActivity; -use App\Listeners\Document\DeleteCompanyDocuments; -use App\Listeners\Invoice\CreateInvoiceActivity; -use App\Listeners\Invoice\InvoiceArchivedActivity; -use App\Listeners\Invoice\InvoiceCancelledActivity; -use App\Listeners\Invoice\InvoiceCreatedNotification; -use App\Listeners\Invoice\InvoiceDeletedActivity; -use App\Listeners\Invoice\InvoiceEmailActivity; -use App\Listeners\Invoice\InvoiceEmailedNotification; -use App\Listeners\Invoice\InvoiceEmailFailedActivity; -use App\Listeners\Invoice\InvoiceFailedEmailNotification; -use App\Listeners\Invoice\InvoicePaidActivity; -use App\Listeners\Invoice\InvoiceReminderEmailActivity; -use App\Listeners\Invoice\InvoiceRestoredActivity; -use App\Listeners\Invoice\InvoiceReversedActivity; -use App\Listeners\Invoice\InvoiceViewedActivity; -use App\Listeners\Invoice\UpdateInvoiceActivity; -use App\Listeners\Mail\MailSentListener; -use App\Listeners\Misc\InvitationViewedListener; -use App\Listeners\Payment\PaymentBalanceActivity; -use App\Listeners\Payment\PaymentEmailedActivity; -use App\Listeners\Payment\PaymentNotification; -use App\Listeners\Payment\PaymentRestoredActivity; -use App\Listeners\PurchaseOrder\CreatePurchaseOrderActivity; -use App\Listeners\PurchaseOrder\PurchaseOrderAcceptedActivity; -use App\Listeners\PurchaseOrder\PurchaseOrderAcceptedListener; -use App\Listeners\PurchaseOrder\PurchaseOrderArchivedActivity; -use App\Listeners\PurchaseOrder\PurchaseOrderCreatedListener; -use App\Listeners\PurchaseOrder\PurchaseOrderDeletedActivity; -use App\Listeners\PurchaseOrder\PurchaseOrderEmailActivity; -use App\Listeners\PurchaseOrder\PurchaseOrderEmailedNotification; -use App\Listeners\PurchaseOrder\PurchaseOrderRestoredActivity; -use App\Listeners\PurchaseOrder\PurchaseOrderViewedActivity; -use App\Listeners\PurchaseOrder\UpdatePurchaseOrderActivity; -use App\Listeners\Quote\QuoteApprovedActivity; -use App\Listeners\Quote\QuoteApprovedNotification; -use App\Listeners\Quote\QuoteApprovedWebhook; -use App\Listeners\Quote\QuoteArchivedActivity; -use App\Listeners\Quote\QuoteCreatedNotification; -use App\Listeners\Quote\QuoteDeletedActivity; -use App\Listeners\Quote\QuoteEmailActivity; -use App\Listeners\Quote\QuoteEmailedNotification; -use App\Listeners\Quote\QuoteRestoredActivity; -use App\Listeners\Quote\QuoteViewedActivity; -use App\Listeners\Quote\ReachWorkflowSettings; -use App\Listeners\RecurringExpense\CreatedRecurringExpenseActivity; -use App\Listeners\RecurringExpense\RecurringExpenseArchivedActivity; -use App\Listeners\RecurringExpense\RecurringExpenseDeletedActivity; -use App\Listeners\RecurringExpense\RecurringExpenseRestoredActivity; -use App\Listeners\RecurringExpense\RecurringExpenseUpdatedActivity; -use App\Listeners\RecurringInvoice\CreateRecurringInvoiceActivity; -use App\Listeners\RecurringInvoice\RecurringInvoiceArchivedActivity; -use App\Listeners\RecurringInvoice\RecurringInvoiceDeletedActivity; -use App\Listeners\RecurringInvoice\RecurringInvoiceRestoredActivity; -use App\Listeners\RecurringInvoice\UpdateRecurringInvoiceActivity; -use App\Listeners\RecurringQuote\CreateRecurringQuoteActivity; -use App\Listeners\RecurringQuote\RecurringQuoteArchivedActivity; -use App\Listeners\RecurringQuote\RecurringQuoteDeletedActivity; -use App\Listeners\RecurringQuote\RecurringQuoteRestoredActivity; -use App\Listeners\RecurringQuote\UpdateRecurringQuoteActivity; -use App\Listeners\SendVerificationNotification; -use App\Listeners\Statement\StatementEmailedActivity; -use App\Listeners\User\ArchivedUserActivity; -use App\Listeners\User\CreatedUserActivity; -use App\Listeners\User\DeletedUserActivity; -use App\Listeners\User\RestoredUserActivity; -use App\Listeners\User\UpdatedUserActivity; -use App\Listeners\User\UpdateUserLastLogin; -use App\Listeners\Vendor\UpdateVendorContactLastLogin; -use App\Models\Account; +use App\Models\Task; +use App\Models\User; +use App\Models\Quote; use App\Models\Client; -use App\Models\ClientContact; -use App\Models\Company; -use App\Models\CompanyGateway; -use App\Models\CompanyToken; use App\Models\Credit; +use App\Models\Vendor; +use App\Models\Account; +use App\Models\Company; use App\Models\Expense; use App\Models\Invoice; use App\Models\Payment; use App\Models\Product; use App\Models\Project; use App\Models\Proposal; -use App\Models\PurchaseOrder; -use App\Models\Quote; +use App\Models\CompanyToken; use App\Models\Subscription; -use App\Models\Task; -use App\Models\User; -use App\Models\Vendor; +use App\Models\ClientContact; +use App\Models\PurchaseOrder; use App\Models\VendorContact; -use App\Observers\AccountObserver; -use App\Observers\ClientContactObserver; +use App\Models\CompanyGateway; +use App\Observers\TaskObserver; +use App\Observers\UserObserver; +use App\Observers\QuoteObserver; +use App\Events\User\UserLoggedIn; use App\Observers\ClientObserver; -use App\Observers\CompanyGatewayObserver; -use App\Observers\CompanyObserver; -use App\Observers\CompanyTokenObserver; use App\Observers\CreditObserver; +use App\Observers\VendorObserver; +use App\Observers\AccountObserver; +use App\Observers\CompanyObserver; use App\Observers\ExpenseObserver; use App\Observers\InvoiceObserver; use App\Observers\PaymentObserver; use App\Observers\ProductObserver; use App\Observers\ProjectObserver; +use App\Events\Task\TaskWasCreated; +use App\Events\Task\TaskWasDeleted; +use App\Events\Task\TaskWasUpdated; +use App\Events\User\UserWasCreated; +use App\Events\User\UserWasDeleted; +use App\Events\User\UserWasUpdated; use App\Observers\ProposalObserver; -use App\Observers\PurchaseOrderObserver; -use App\Observers\QuoteObserver; +use App\Events\Quote\QuoteWasViewed; +use App\Events\Task\TaskWasArchived; +use App\Events\Task\TaskWasRestored; +use App\Events\User\UserWasArchived; +use App\Events\User\UserWasRestored; +use App\Events\Quote\QuoteWasCreated; +use App\Events\Quote\QuoteWasDeleted; +use App\Events\Quote\QuoteWasEmailed; +use App\Events\Quote\QuoteWasUpdated; +use App\Events\Account\AccountCreated; +use App\Events\Credit\CreditWasViewed; +use App\Events\Invoice\InvoiceWasPaid; +use App\Events\Quote\QuoteWasApproved; +use App\Events\Quote\QuoteWasArchived; +use App\Events\Quote\QuoteWasRestored; +use App\Events\Client\ClientWasCreated; +use App\Events\Client\ClientWasDeleted; +use App\Events\Client\ClientWasUpdated; +use App\Events\Contact\ContactLoggedIn; +use App\Events\Credit\CreditWasCreated; +use App\Events\Credit\CreditWasDeleted; +use App\Events\Credit\CreditWasEmailed; +use App\Events\Credit\CreditWasUpdated; +use App\Events\Design\DesignWasDeleted; +use App\Events\Design\DesignWasUpdated; +use App\Events\Vendor\VendorWasCreated; +use App\Events\Vendor\VendorWasDeleted; +use App\Events\Vendor\VendorWasUpdated; +use App\Observers\CompanyTokenObserver; use App\Observers\SubscriptionObserver; -use App\Observers\TaskObserver; -use App\Observers\UserObserver; -use App\Observers\VendorContactObserver; -use App\Observers\VendorObserver; -use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider; -use Illuminate\Mail\Events\MessageSending; use Illuminate\Mail\Events\MessageSent; +use App\Events\Client\ClientWasArchived; +use App\Events\Client\ClientWasRestored; +use App\Events\Credit\CreditWasArchived; +use App\Events\Credit\CreditWasRestored; +use App\Events\Design\DesignWasArchived; +use App\Events\Design\DesignWasRestored; +use App\Events\Invoice\InvoiceWasViewed; +use App\Events\Misc\InvitationWasViewed; +use App\Events\Payment\PaymentWasVoided; +use App\Events\Vendor\VendorWasArchived; +use App\Events\Vendor\VendorWasRestored; +use App\Listeners\Mail\MailSentListener; +use App\Observers\ClientContactObserver; +use App\Observers\PurchaseOrderObserver; +use App\Observers\VendorContactObserver; +use App\Events\Expense\ExpenseWasCreated; +use App\Events\Expense\ExpenseWasDeleted; +use App\Events\Expense\ExpenseWasUpdated; +use App\Events\Invoice\InvoiceWasCreated; +use App\Events\Invoice\InvoiceWasDeleted; +use App\Events\Invoice\InvoiceWasEmailed; +use App\Events\Invoice\InvoiceWasUpdated; +use App\Events\Payment\PaymentWasCreated; +use App\Events\Payment\PaymentWasDeleted; +use App\Events\Payment\PaymentWasEmailed; +use App\Events\Payment\PaymentWasUpdated; +use App\Observers\CompanyGatewayObserver; +use App\Events\Credit\CreditWasMarkedSent; +use App\Events\Expense\ExpenseWasArchived; +use App\Events\Expense\ExpenseWasRestored; +use App\Events\Invoice\InvoiceWasArchived; +use App\Events\Invoice\InvoiceWasRestored; +use App\Events\Invoice\InvoiceWasReversed; +use App\Events\Payment\PaymentWasArchived; +use App\Events\Payment\PaymentWasRefunded; +use App\Events\Payment\PaymentWasRestored; +use Illuminate\Mail\Events\MessageSending; +use App\Events\Document\DocumentWasCreated; +use App\Events\Document\DocumentWasDeleted; +use App\Events\Document\DocumentWasUpdated; +use App\Events\Invoice\InvoiceWasCancelled; +use App\Listeners\Quote\QuoteEmailActivity; +use App\Listeners\User\CreatedUserActivity; +use App\Listeners\User\DeletedUserActivity; +use App\Listeners\User\UpdatedUserActivity; +use App\Listeners\User\UpdateUserLastLogin; +use App\Events\Account\StripeConnectFailure; +use App\Events\Document\DocumentWasArchived; +use App\Events\Document\DocumentWasRestored; +use App\Events\Invoice\InvoiceWasMarkedSent; +use App\Events\Vendor\VendorContactLoggedIn; +use App\Listeners\Quote\QuoteViewedActivity; +use App\Listeners\User\ArchivedUserActivity; +use App\Listeners\User\RestoredUserActivity; +use App\Events\Quote\QuoteReminderWasEmailed; +use App\Events\Statement\StatementWasEmailed; +use App\Listeners\Quote\QuoteApprovedWebhook; +use App\Listeners\Quote\QuoteDeletedActivity; +use App\Listeners\Credit\CreditViewedActivity; +use App\Listeners\Invoice\InvoicePaidActivity; +use App\Listeners\Payment\PaymentNotification; +use App\Listeners\Quote\QuoteApprovedActivity; +use App\Listeners\Quote\QuoteArchivedActivity; +use App\Listeners\Quote\QuoteRestoredActivity; +use App\Listeners\Quote\ReachWorkflowSettings; +use App\Events\Company\CompanyDocumentsDeleted; +use App\Listeners\Activity\CreatedTaskActivity; +use App\Listeners\Activity\TaskDeletedActivity; +use App\Listeners\Activity\TaskUpdatedActivity; +use App\Listeners\Invoice\InvoiceEmailActivity; +use App\Listeners\SendVerificationNotification; +use App\Events\Credit\CreditWasEmailedAndFailed; +use App\Listeners\Activity\CreatedQuoteActivity; +use App\Listeners\Activity\DeleteClientActivity; +use App\Listeners\Activity\DeleteCreditActivity; +use App\Listeners\Activity\QuoteUpdatedActivity; +use App\Listeners\Activity\TaskArchivedActivity; +use App\Listeners\Activity\TaskRestoredActivity; +use App\Listeners\Credit\CreditRestoredActivity; +use App\Listeners\Invoice\CreateInvoiceActivity; +use App\Listeners\Invoice\InvoiceViewedActivity; +use App\Listeners\Invoice\UpdateInvoiceActivity; +use App\Listeners\Misc\InvitationViewedListener; +use App\Events\Invoice\InvoiceReminderWasEmailed; +use App\Listeners\Activity\ClientUpdatedActivity; +use App\Listeners\Activity\CreatedClientActivity; +use App\Listeners\Activity\CreatedCreditActivity; +use App\Listeners\Activity\CreatedVendorActivity; +use App\Listeners\Activity\PaymentVoidedActivity; +use App\Listeners\Activity\RestoreClientActivity; +use App\Listeners\Activity\UpdatedCreditActivity; +use App\Listeners\Activity\VendorDeletedActivity; +use App\Listeners\Activity\VendorUpdatedActivity; +use App\Listeners\Contact\UpdateContactLastLogin; +use App\Listeners\Invoice\InvoiceDeletedActivity; +use App\Listeners\Payment\PaymentBalanceActivity; +use App\Listeners\Payment\PaymentEmailedActivity; +use App\Listeners\Quote\QuoteCreatedNotification; +use App\Listeners\Quote\QuoteEmailedNotification; +use App\Events\Invoice\InvoiceWasEmailedAndFailed; +use App\Events\Payment\PaymentWasEmailedAndFailed; +use App\Listeners\Activity\ArchivedClientActivity; +use App\Listeners\Activity\CreatedExpenseActivity; +use App\Listeners\Activity\CreditArchivedActivity; +use App\Listeners\Activity\ExpenseDeletedActivity; +use App\Listeners\Activity\ExpenseUpdatedActivity; +use App\Listeners\Activity\PaymentCreatedActivity; +use App\Listeners\Activity\PaymentDeletedActivity; +use App\Listeners\Activity\PaymentUpdatedActivity; +use App\Listeners\Activity\VendorArchivedActivity; +use App\Listeners\Activity\VendorRestoredActivity; +use App\Listeners\Document\DeleteCompanyDocuments; +use App\Listeners\Invoice\InvoiceArchivedActivity; +use App\Listeners\Invoice\InvoiceRestoredActivity; +use App\Listeners\Invoice\InvoiceReversedActivity; +use App\Listeners\Payment\PaymentRestoredActivity; +use App\Listeners\Quote\QuoteApprovedNotification; +use App\Events\Subscription\SubscriptionWasCreated; +use App\Events\Subscription\SubscriptionWasDeleted; +use App\Events\Subscription\SubscriptionWasUpdated; +use App\Listeners\Activity\ExpenseArchivedActivity; +use App\Listeners\Activity\ExpenseRestoredActivity; +use App\Listeners\Activity\PaymentArchivedActivity; +use App\Listeners\Activity\PaymentRefundedActivity; +use App\Listeners\Credit\CreditCreatedNotification; +use App\Listeners\Credit\CreditEmailedNotification; +use App\Listeners\Invoice\InvoiceCancelledActivity; +use App\Listeners\Quote\QuoteReminderEmailActivity; +use App\Events\PurchaseOrder\PurchaseOrderWasViewed; +use App\Events\Subscription\SubscriptionWasArchived; +use App\Events\Subscription\SubscriptionWasRestored; +use App\Events\PurchaseOrder\PurchaseOrderWasCreated; +use App\Events\PurchaseOrder\PurchaseOrderWasDeleted; +use App\Events\PurchaseOrder\PurchaseOrderWasEmailed; +use App\Events\PurchaseOrder\PurchaseOrderWasUpdated; +use App\Listeners\Invoice\InvoiceCreatedNotification; +use App\Listeners\Invoice\InvoiceEmailedNotification; +use App\Listeners\Invoice\InvoiceEmailFailedActivity; +use App\Listeners\Statement\StatementEmailedActivity; +use App\Events\PurchaseOrder\PurchaseOrderWasAccepted; +use App\Events\PurchaseOrder\PurchaseOrderWasArchived; +use App\Events\PurchaseOrder\PurchaseOrderWasRestored; +use App\Listeners\Vendor\UpdateVendorContactLastLogin; +use App\Events\RecurringQuote\RecurringQuoteWasCreated; +use App\Events\RecurringQuote\RecurringQuoteWasDeleted; +use App\Events\RecurringQuote\RecurringQuoteWasUpdated; +use App\Listeners\Account\StripeConnectFailureListener; +use App\Listeners\Activity\CreatedSubscriptionActivity; +use App\Listeners\Activity\SubscriptionDeletedActivity; +use App\Listeners\Activity\SubscriptionUpdatedActivity; +use App\Listeners\Invoice\InvoiceReminderEmailActivity; +use App\Events\RecurringQuote\RecurringQuoteWasArchived; +use App\Events\RecurringQuote\RecurringQuoteWasRestored; +use App\Listeners\Activity\SubscriptionArchivedActivity; +use App\Listeners\Activity\SubscriptionRestoredActivity; +use App\Listeners\Invoice\InvoiceFailedEmailNotification; +use App\Events\RecurringExpense\RecurringExpenseWasCreated; +use App\Events\RecurringExpense\RecurringExpenseWasDeleted; +use App\Events\RecurringExpense\RecurringExpenseWasUpdated; +use App\Events\RecurringInvoice\RecurringInvoiceWasCreated; +use App\Events\RecurringInvoice\RecurringInvoiceWasDeleted; +use App\Events\RecurringInvoice\RecurringInvoiceWasUpdated; +use App\Listeners\PurchaseOrder\PurchaseOrderEmailActivity; +use App\Events\RecurringExpense\RecurringExpenseWasArchived; +use App\Events\RecurringExpense\RecurringExpenseWasRestored; +use App\Events\RecurringInvoice\RecurringInvoiceWasArchived; +use App\Events\RecurringInvoice\RecurringInvoiceWasRestored; +use App\Listeners\PurchaseOrder\CreatePurchaseOrderActivity; +use App\Listeners\PurchaseOrder\PurchaseOrderViewedActivity; +use App\Listeners\PurchaseOrder\UpdatePurchaseOrderActivity; +use App\Listeners\PurchaseOrder\PurchaseOrderCreatedListener; +use App\Listeners\PurchaseOrder\PurchaseOrderDeletedActivity; +use App\Listeners\PurchaseOrder\PurchaseOrderAcceptedActivity; +use App\Listeners\PurchaseOrder\PurchaseOrderAcceptedListener; +use App\Listeners\PurchaseOrder\PurchaseOrderArchivedActivity; +use App\Listeners\PurchaseOrder\PurchaseOrderRestoredActivity; +use App\Listeners\RecurringQuote\CreateRecurringQuoteActivity; +use App\Listeners\RecurringQuote\UpdateRecurringQuoteActivity; +use App\Listeners\RecurringQuote\RecurringQuoteDeletedActivity; +use App\Listeners\RecurringQuote\RecurringQuoteArchivedActivity; +use App\Listeners\RecurringQuote\RecurringQuoteRestoredActivity; +use App\Listeners\PurchaseOrder\PurchaseOrderEmailedNotification; +use App\Listeners\RecurringInvoice\CreateRecurringInvoiceActivity; +use App\Listeners\RecurringInvoice\UpdateRecurringInvoiceActivity; +use App\Listeners\RecurringExpense\CreatedRecurringExpenseActivity; +use App\Listeners\RecurringExpense\RecurringExpenseDeletedActivity; +use App\Listeners\RecurringExpense\RecurringExpenseUpdatedActivity; +use App\Listeners\RecurringInvoice\RecurringInvoiceDeletedActivity; +use App\Listeners\RecurringExpense\RecurringExpenseArchivedActivity; +use App\Listeners\RecurringExpense\RecurringExpenseRestoredActivity; +use App\Listeners\RecurringInvoice\RecurringInvoiceArchivedActivity; +use App\Listeners\RecurringInvoice\RecurringInvoiceRestoredActivity; +use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider; class EventServiceProvider extends ServiceProvider { @@ -534,6 +536,10 @@ class EventServiceProvider extends ServiceProvider QuoteWasRestored::class => [ QuoteRestoredActivity::class, ], + QuoteReminderWasEmailed::class =>[ + QuoteReminderEmailActivity::class, + // QuoteEmailedNotification::class, + ], RecurringExpenseWasCreated::class => [ CreatedRecurringExpenseActivity::class, ], diff --git a/app/Providers/StaticServiceProvider.php b/app/Providers/StaticServiceProvider.php index 8b03c2e8a2e6..00aa774c204f 100644 --- a/app/Providers/StaticServiceProvider.php +++ b/app/Providers/StaticServiceProvider.php @@ -222,6 +222,10 @@ class StaticServiceProvider extends ServiceProvider 'subject' => EmailTemplateDefaults::emailPaymentSubject(), 'body' => EmailTemplateDefaults::emailPaymentTemplate(), ], + 'quote_reminder1' => [ + 'subject' => EmailTemplateDefaults::emailQuoteReminder1Subject(), + 'body' => EmailTemplateDefaults::emailQuoteReminder1Body(), + ], 'reminder1' => [ 'subject' => EmailTemplateDefaults::emailReminder1Subject(), 'body' => EmailTemplateDefaults::emailReminder1Template(), diff --git a/app/Services/Invoice/UpdateReminder.php b/app/Services/Invoice/UpdateReminder.php index 96239d6780ef..2d861632d2f8 100644 --- a/app/Services/Invoice/UpdateReminder.php +++ b/app/Services/Invoice/UpdateReminder.php @@ -12,13 +12,14 @@ namespace App\Services\Invoice; use App\Models\Invoice; +use App\Models\Quote; use App\Models\RecurringInvoice; use App\Services\AbstractService; use Carbon\Carbon; class UpdateReminder extends AbstractService { - public function __construct(public Invoice $invoice, public mixed $settings = null) + public function __construct(public Invoice | Quote $invoice, public mixed $settings = null) { } diff --git a/app/Services/Quote/QuoteService.php b/app/Services/Quote/QuoteService.php index fc8508591649..cdc1b1dccd6c 100644 --- a/app/Services/Quote/QuoteService.php +++ b/app/Services/Quote/QuoteService.php @@ -17,6 +17,7 @@ use App\Jobs\EDocument\CreateEDocument; use App\Models\Project; use App\Models\Quote; use App\Repositories\QuoteRepository; +use App\Services\Invoice\UpdateReminder; use App\Utils\Ninja; use App\Utils\Traits\MakesHash; use Illuminate\Support\Facades\Storage; @@ -133,7 +134,6 @@ class QuoteService $this->invoice ->service() ->markSent() - // ->deletePdf() ->save(); } @@ -259,6 +259,13 @@ class QuoteService return $this; } + public function setReminder($settings = null) + { + $this->quote = (new UpdateReminder($this->quote, $settings))->run(); + + return $this; + } + /** * Saves the quote. * @return Quote|null diff --git a/lang/ar/texts.php b/lang/ar/texts.php index 7de2e7d1e491..b5f08b03cf2c 100644 --- a/lang/ar/texts.php +++ b/lang/ar/texts.php @@ -192,7 +192,7 @@ $lang = array( 'removed_logo' => 'تمت إزالة الشعار بنجاح', 'sent_message' => 'تم إرسال الرسالة بنجاح', 'invoice_error' => 'يرجى التأكد من تحديد العميل وتصحيح أي أخطاء', - 'limit_clients' => 'You\'ve hit the :count client limit on Free accounts. Congrats on your success!', + 'limit_clients' => 'لقد وصلت إلى حد العميل :count للحسابات المجانية. تهانينا على نجاحك!', 'payment_error' => 'كان هناك خطأ في معالجة الدفع الخاص بك. الرجاء معاودة المحاولة في وقت لاحق', 'registration_required' => 'التسجيل مطلوب', 'confirmation_required' => 'يرجى تأكيد عنوان بريدك الإلكتروني: رابط لإعادة إرسال رسالة التأكيد عبر البريد الإلكتروني.', @@ -2676,7 +2676,7 @@ $lang = array( 'no_assets' => 'لا توجد صور ، اسحب للتحميل', 'add_image' => 'إضافة صورة', 'select_image' => 'اختر صورة', - 'upgrade_to_upload_images' => 'Upgrade to the Enterprise Plan to upload files & images', + 'upgrade_to_upload_images' => 'قم بالترقية إلى خطة Enterprise لتحميل الملفات والصور', 'delete_image' => 'حذف صورة', 'delete_image_help' => 'تحذير: سيؤدي حذف الصورة إلى إزالتها من جميع المقترحات.', 'amount_variable_help' => 'ملاحظة: سيستخدم حقل مبلغ الفاتورة $ الحقل الجزئي / الإيداع إذا تم تعيينه وإلا فسيستخدم رصيد الفاتورة.', @@ -2915,13 +2915,6 @@ $lang = array( 'mime_types' => 'أنواع التمثيل الصامت', 'mime_types_placeholder' => '.pdf ، .docx ، .jpg', 'mime_types_help' => 'قائمة مفصولة بفواصل لأنواع التمثيل الصامت المسموح بها ، اتركها فارغة للجميع', - 'ticket_number_start_help' => 'يجب أن يكون رقم التذكرة أكبر من رقم التذكرة الحالي', - 'new_ticket_template_id' => 'تذكرة جديدة', - 'new_ticket_autoresponder_help' => 'سيؤدي تحديد قالب إلى إرسال رد تلقائي إلى العميل / جهة الاتصال عند إنشاء بطاقة جديدة', - 'update_ticket_template_id' => 'تذكرة محدثة', - 'update_ticket_autoresponder_help' => 'سيؤدي تحديد قالب إلى إرسال رد تلقائي إلى العميل / جهة الاتصال عند تحديث التذكرة', - 'close_ticket_template_id' => 'تذكرة مغلقة', - 'close_ticket_autoresponder_help' => 'سيؤدي تحديد قالب إلى إرسال رد تلقائي إلى العميل / جهة الاتصال عند إغلاق التذكرة', 'default_priority' => 'الأولوية الافتراضية', 'alert_new_comment_id' => 'تعليق جديد', 'alert_comment_ticket_help' => 'سيؤدي تحديد قالب إلى إرسال إشعار (إلى الوكيل) عند إجراء تعليق.', @@ -2938,8 +2931,6 @@ $lang = array( 'alert_ticket_overdue_email' => 'إشعارات إضافية بشأن التذاكر المتأخرة', 'alert_ticket_overdue_email_help' => 'رسائل بريد إلكتروني مفصولة بفاصلة لإرسالها إلى نسخة مخفية الوجهة عند التأخر في تقديم التذكرة.', 'alert_ticket_overdue_agent_id_help' => 'سيؤدي تحديد قالب إلى إرسال إشعار (إلى الوكيل) عندما تصبح التذكرة متأخرة.', - 'ticket_master' => 'مدير التذاكر', - 'ticket_master_help' => 'لديه القدرة على تخصيص ونقل التذاكر. تم تعيينه كوكيل افتراضي لجميع التذاكر.', 'default_agent' => 'الوكيل الافتراضي', 'default_agent_help' => 'إذا تم تحديده فسيتم تخصيصه تلقائيًا لجميع التذاكر الواردة', 'show_agent_details' => 'إظهار تفاصيل الوكيل في الردود', @@ -2947,43 +2938,19 @@ $lang = array( 'remove_avatar' => 'إزالة الصورة الرمزية', 'ticket_not_found' => 'لم يتم العثور على التذكرة', 'add_template' => 'أضف قالبًا', - 'ticket_template' => 'قالب التذكرة', - 'ticket_templates' => 'قوالب التذاكر', 'updated_ticket_template' => 'نموذج تذكرة محدث', 'created_ticket_template' => 'تم إنشاء نموذج تذكرة', 'archive_ticket_template' => 'قالب الأرشيف', 'restore_ticket_template' => 'استعادة النموذج', 'archived_ticket_template' => 'تمت أرشفة النموذج بنجاح', 'restored_ticket_template' => 'تمت استعادة القالب بنجاح', - 'close_reason' => 'دعنا نعرف سبب إغلاق هذه التذكرة', - 'reopen_reason' => 'أخبرنا عن سبب إعادة فتح هذه التذكرة', 'enter_ticket_message' => 'الرجاء إدخال رسالة لتحديث التذكرة', 'show_hide_all' => 'إظهار / إخفاء الكل', 'subject_required' => 'الموضوع (مطلوب', 'mobile_refresh_warning' => 'إذا كنت تستخدم تطبيق الهاتف المحمول ، فقد تحتاج إلى إجراء تحديث كامل.', - 'enable_proposals_for_background' => 'لتحميل صورة خلفية :link لتمكين وحدة العروض.', - 'ticket_assignment' => 'تم تخصيص التذكرة :ticket_number إلى :agent', - 'ticket_contact_reply' => 'تم تحديث التذكرة :ticket_number بواسطة العميل :contact', - 'ticket_new_template_subject' => 'تم إنشاء التذكرة :ticket_number.', - 'ticket_updated_template_subject' => 'تم تحديث التذكرة :ticket_number.', - 'ticket_closed_template_subject' => 'تم إغلاق التذكرة :ticket_number.', - 'ticket_overdue_template_subject' => 'لقد فات موعد التذكرة :ticket_number الآن', 'merge' => 'دمج', 'merged' => 'مندمجة', 'agent' => 'عامل', - 'parent_ticket' => 'تذكرة الوالدين', - 'linked_tickets' => 'التذاكر المرتبطة', - 'merge_prompt' => 'أدخل رقم التذكرة للدمج فيها', - 'merge_from_to' => 'التذكرة رقم: اندمجت old_ticket في تذكرة #: new_ticket', - 'merge_closed_ticket_text' => 'التذكرة رقم: تم إغلاق old_ticket ودمجها في تذكرة #: new_ticket - :subject', - 'merge_updated_ticket_text' => 'التذكرة رقم: تم إغلاق التذكرة القديمة ودمجها في هذه التذكرة', - 'merge_placeholder' => 'دمج التذكرة #: التذكرة في التذكرة التالية', - 'select_ticket' => 'حدد تذكرة', - 'new_internal_ticket' => 'تذكرة داخلية جديدة', - 'internal_ticket' => 'تذكرة داخلية', - 'create_ticket' => 'إنشاء تذكرة', - 'allow_inbound_email_tickets_external' => 'تذاكر جديدة عن طريق البريد الإلكتروني (العميل)', - 'allow_inbound_email_tickets_external_help' => 'السماح للعملاء بإنشاء تذاكر جديدة عن طريق البريد الإلكتروني', 'include_in_filter' => 'تضمين في التصفية', 'custom_client1' => ':قيمة', 'custom_client2' => ':قيمة', @@ -4418,7 +4385,7 @@ $lang = array( 'client_shipping_country' => 'بلد شحن العميل', 'load_pdf' => 'قم بتحميل ملف PDF', 'start_free_trial' => 'ابدأ الإصدار التجريبي المجاني', - 'start_free_trial_message' => 'Start your FREE 14 day trial of the Pro Plan', + 'start_free_trial_message' => 'ابدأ تجربتك المجانية لمدة 14 يومًا للخطة الاحترافية', 'due_on_receipt' => 'المستحقة على إيصال', 'is_paid' => 'مدفوع', 'age_group_paid' => 'مدفوع', @@ -5277,45 +5244,46 @@ $lang = array( 'rappen_rounding' => 'تقريب رابين', 'rappen_rounding_help' => 'جولة المبلغ إلى 5 سنتات', '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' + 'paypal_advanced_cards' => 'مدفوعات البطاقة المتقدمة', + 'local_domain_help' => 'مجال EHLO (اختياري)', + 'port_help' => 'أي. 25,587,465', + 'host_help' => 'أي. smtp.gmail.com', + 'always_show_required_fields' => 'يسمح بإظهار نموذج الحقول المطلوبة', + 'always_show_required_fields_help' => 'يعرض نموذج الحقول المطلوبة دائمًا عند الخروج', + 'advanced_cards' => 'بطاقات متقدمة', + 'activity_140' => 'تم إرسال البيان إلى :client', + 'invoice_net_amount' => 'صافي مبلغ الفاتورة', + 'round_to_minutes' => 'جولة إلى دقائق', + '1_second' => '1 ثانية', + '1_minute' => '1 دقيقة', + '5_minutes' => '5 دقائق', + '15_minutes' => '15 دقيقة', + '30_minutes' => '30 دقيقة', + '1_hour' => '1 ساعة', + '1_day' => 'يوم 1', + 'round_tasks' => 'اتجاه تقريب المهمة', + 'round_tasks_help' => 'قم بتقريب أوقات المهام لأعلى أو لأسفل.', + 'direction' => 'اتجاه', + 'round_up' => 'جمع الشمل', + 'round_down' => 'المستدير لأسفل', + 'task_round_to_nearest' => 'جولة إلى الأقرب', + 'task_round_to_nearest_help' => 'الفاصل الزمني لتقريب المهمة إلى.', + 'bulk_updated' => 'تم تحديث البيانات بنجاح', + 'bulk_update' => 'تحديث بالجملة', + 'calculate' => 'احسب', + 'sum' => 'مجموع', + 'money' => 'مال', + 'web_app' => 'التطبيق على شبكة الإنترنت', + 'desktop_app' => 'التطبيق سطح المكتب', + 'disconnected' => 'انقطع الاتصال', + 'reconnect' => 'أعد الاتصال', + 'e_invoice_settings' => 'إعدادات الفاتورة الإلكترونية', + 'btcpay_refund_subject' => 'استرداد فاتورتك عبر BTCPay', + 'btcpay_refund_body' => 'لقد تم إصدار المبلغ المسترد المخصص لك. للمطالبة بها عبر BTCPay، يرجى النقر على هذا الرابط:', + 'currency_mauritanian_ouguiya' => 'الأوقية الموريتانية', + 'currency_bhutan_ngultrum' => 'بوتان نغولتروم', + 'end_of_month' => 'نهاية الشهر', + 'merge_e_invoice_to_pdf' => 'Merge E-Invoice and PDF', ); return $lang; \ No newline at end of file diff --git a/lang/bg/texts.php b/lang/bg/texts.php index af87cbbca4f4..716ec93c7cc0 100644 --- a/lang/bg/texts.php +++ b/lang/bg/texts.php @@ -200,7 +200,7 @@ $lang = array( 'removed_logo' => 'Логото е премахнато успешно', 'sent_message' => 'Съобщението е изпратено успешно', 'invoice_error' => 'Моля изберете клиент и коригирайте грешките', - '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' => 'Имаше проблем при обработването на плащането Ви. Моля опитайте пак по късно.', 'registration_required' => 'Необходима е регистрация', 'confirmation_required' => 'Моля потвърдете мейл адреса си, :link за да изпратите наново писмото за потвърждение ', @@ -2198,7 +2198,7 @@ $lang = array( 'mailgun_private_key' => 'Mailgun частен ключ', 'brevo_domain' => 'Brevo Domain', 'brevo_private_key' => 'Brevo Private Key', - 'send_test_email' => 'Изпращане на тестов имейл', + 'send_test_email' => 'Send Test Email', 'select_label' => 'Избор на етикет', 'label' => 'Етикет', 'service' => 'Услуга', @@ -2696,7 +2696,7 @@ $lang = array( 'no_assets' => 'Без изображения, завлачете за качване', 'add_image' => 'Добави картинка', 'select_image' => 'Избери картинка', - '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' => 'Изтриване на изображение', 'delete_image_help' => 'Внимание: Изтриването на изображението ще го премахне от всички предложения.', 'amount_variable_help' => 'Забележка: Полето $amount във фактурата ще използва полето частично/депозит, ако е заложено; иначе ще използва баланса по фактурата.', @@ -2935,13 +2935,6 @@ $lang = array( 'mime_types' => 'Mime типове', 'mime_types_placeholder' => '.pdf , .docx, .jpg', 'mime_types_help' => 'Разделен със запетая списък на разрешените mime типове. Оставете празно, за да разрешите всички.', - 'ticket_number_start_help' => 'Новерът на тикета трябва да е по-голям от номера на настоящия', - 'new_ticket_template_id' => 'Нов Ticket', - 'new_ticket_autoresponder_help' => 'Изборът на шаблон ще активира изпращането на автоматичен отговор на клиента / контакта при създаването на нов Ticket.', - 'update_ticket_template_id' => 'Актуализиран Ticket', - 'update_ticket_autoresponder_help' => 'Изборът на шаблон ще активира изпращането на автоматичен отговор на клиента / контакта при актуализирането на Ticket.', - 'close_ticket_template_id' => 'Затворен Ticket', - 'close_ticket_autoresponder_help' => 'Изборът на шаблон ще активира изпращането на автоматичен отговор на клиента / контакта при затварянето на Ticket.', 'default_priority' => 'Приоритет по подразбиране', 'alert_new_comment_id' => 'Нов коментар', 'alert_comment_ticket_help' => 'С избора на шаблон ще бъде изпращано известие (към агента), когато бъде направен коментар.', @@ -2958,8 +2951,6 @@ $lang = array( 'alert_ticket_overdue_email' => 'Допълнителни известия за просрочен Ticket', 'alert_ticket_overdue_email_help' => 'Разделени със запетая имей адреси за bcc при просрочие на Ticket.', 'alert_ticket_overdue_agent_id_help' => 'С избора на шаблон ще бъде изпращано известие (към агента), когато тикетът стане просрочен.', - 'ticket_master' => 'Ticket Master', - 'ticket_master_help' => 'Може да присвоява и да прехвърля тикети. Присвоен като агент по подразбиране за всички тикети.', 'default_agent' => 'Агент по подразбиране', 'default_agent_help' => 'Ако е избран, ще бъде присвоен на всички входящи тикет-и', 'show_agent_details' => 'Показване на детайлите на агента при отговор', @@ -2967,43 +2958,19 @@ $lang = array( 'remove_avatar' => 'Премахване на аватар', 'ticket_not_found' => 'Тикетът не е намерен', 'add_template' => 'Добавяне на шаблон', - 'ticket_template' => 'Шаблон за Ticket', - 'ticket_templates' => 'Шаблони за Ticket', 'updated_ticket_template' => 'Актуализиран шаблон за Ticket', 'created_ticket_template' => 'Създаден шаблон за Ticket', 'archive_ticket_template' => 'Архивиране на шаблон', 'restore_ticket_template' => 'Възстановяване на шаблон', 'archived_ticket_template' => 'Успешно архивиран шаблон', 'restored_ticket_template' => 'Успешно възстановен шаблон', - 'close_reason' => 'Кажете ни, защо затваряте този тикет', - 'reopen_reason' => 'Кажете ни, защо отваряте отново този тикет', 'enter_ticket_message' => 'Моля, въведете съобщение за да актуализирате тикет-а', 'show_hide_all' => 'Показване / Скриване на всички', 'subject_required' => 'Полето Относно е задължително', 'mobile_refresh_warning' => 'Ако използвате мобилното приложение, може да трябва да направите full refresh.', - 'enable_proposals_for_background' => 'За да качите фоново изображение :link за активиране на модула за предложения.', - 'ticket_assignment' => 'Ticket :ticket_number е присвоен на :agent', - 'ticket_contact_reply' => 'Ticket :ticket_number е актуализиран от клиент :contact', - 'ticket_new_template_subject' => 'Ticket :ticket_number е създаден.', - 'ticket_updated_template_subject' => 'Ticket :ticket_number е актуализиран.', - 'ticket_closed_template_subject' => 'Ticket :ticket_number е затворен.', - 'ticket_overdue_template_subject' => 'Ticket :ticket_number вече е просрочен', 'merge' => 'Обединяване', 'merged' => 'Обединен', 'agent' => 'Агент', - 'parent_ticket' => 'Родителски тикет', - 'linked_tickets' => 'Свързани тикети', - 'merge_prompt' => 'Въведете номер на Ticket, към който да бъде добавен', - 'merge_from_to' => 'Ticket #:old_ticket обединен в Ticket #:new_ticket', - 'merge_closed_ticket_text' => 'Ticket #:old_ticket е затворен и обединен в Ticket#:new_ticket - :subject', - 'merge_updated_ticket_text' => 'Ticket #:old_ticket е затворед и добавен в този', - 'merge_placeholder' => 'Обедини Ticket #:ticket в следния', - 'select_ticket' => 'Избор на Ticket', - 'new_internal_ticket' => 'Нов вътрешен Ticket', - 'internal_ticket' => 'Вътрешен Ticket', - 'create_ticket' => 'Създаване на Ticket', - 'allow_inbound_email_tickets_external' => 'Нови Tickets по имейл (клиент)', - 'allow_inbound_email_tickets_external_help' => 'Клиентите могат да създават нови Ticket по имейл', 'include_in_filter' => 'Включи във филтъра', 'custom_client1' => ':VALUE', 'custom_client2' => ':VALUE', @@ -4030,7 +3997,7 @@ $lang = array( 'user_detached' => 'User detached from company', 'create_webhook_failure' => 'Failed to create Webhook', 'payment_message_extended' => 'Thank you for your payment of :amount for :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', @@ -4171,7 +4138,7 @@ $lang = array( 'one_time_purchases' => 'One time purchases', 'recurring_purchases' => 'Recurring purchases', 'you_might_be_interested_in_following' => 'You might be interested in the following', - 'quotes_with_status_sent_can_be_approved' => 'Only quotes with "Sent" status can be approved.', + 'quotes_with_status_sent_can_be_approved' => 'Only quotes with "Sent" status can be approved. Expired quotes cannot be approved.', 'no_quotes_available_for_download' => 'No quotes available for download.', 'copyright' => 'Copyright', 'user_created_user' => ':user created :created_user at :time', @@ -4438,7 +4405,7 @@ $lang = array( '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' => 'Is Paid', 'age_group_paid' => 'Paid', @@ -5148,7 +5115,7 @@ $lang = array( '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', @@ -5296,8 +5263,47 @@ $lang = array( 'flutter_web_warning' => 'We recommend using the new web app or the desktop app for the best performance', 'rappen_rounding' => 'Rappen Rounding', 'rappen_rounding_help' => 'Round amount to 5 cents', - 'always_show_required_fields' => 'Always display required fields', - 'always_show_required_fields_help' => 'Will show the form regards if the fields are filled or not' + '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', ); -return $lang; +return $lang; \ No newline at end of file diff --git a/lang/ca/texts.php b/lang/ca/texts.php index 07ff822ace02..ef7b8ccbb261 100644 --- a/lang/ca/texts.php +++ b/lang/ca/texts.php @@ -2934,13 +2934,6 @@ $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' => 'Nou tiquet', - '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' => 'Tiquet actualitzat', - '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' => 'Tiquet tancat', - '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.', @@ -2957,8 +2950,6 @@ $lang = array( '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' => 'Default Agent', 'default_agent_help' => 'If selected will automatically be assigned to all inbound tickets', 'show_agent_details' => 'Show agent details on responses', @@ -2966,43 +2957,19 @@ $lang = array( 'remove_avatar' => 'Remove avatar', 'ticket_not_found' => 'Ticket not found', 'add_template' => 'Add Template', - 'ticket_template' => 'Ticket Template', - 'ticket_templates' => 'Plantilles de tiquet', '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', 'restored_ticket_template' => 'Successfully restored template', - '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' => 'Mostra / oculta tot', 'subject_required' => 'Subject required', 'mobile_refresh_warning' => 'If you\'re using the mobile app you may need to do a full refresh.', - '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' => 'Fusiona', 'merged' => 'Fusionat', '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' => 'Include in filter', 'custom_client1' => ':VALUE', 'custom_client2' => ':VALUE', @@ -5334,7 +5301,8 @@ $lang = array( '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' + 'end_of_month' => 'End Of Month', + 'merge_e_invoice_to_pdf' => 'Merge E-Invoice and PDF', ); return $lang; \ No newline at end of file diff --git a/lang/da/texts.php b/lang/da/texts.php index df4dc4f1fe5d..1f0bd29703f3 100644 --- a/lang/da/texts.php +++ b/lang/da/texts.php @@ -2933,13 +2933,6 @@ $lang = array( 'mime_types' => 'Mime typer', 'mime_types_placeholder' => '. PDF , .docx, .jpg', 'mime_types_help' => 'Kommasepareret liste over tilladte mime-typer, lad tom for alle', - 'ticket_number_start_help' => 'Sagsnummer skal være større end det nuværende sagsnummer', - 'new_ticket_template_id' => 'Ny sag', - 'new_ticket_autoresponder_help' => 'Valg af en skabelon vil sende et auto-svar til en klient/kontakt når en ny sag oprettes', - 'update_ticket_template_id' => 'Sag blev opdateret', - 'update_ticket_autoresponder_help' => 'Valg af en skabelon vil sende et auto-svar til en klient/kontakt når en sag bliver opdateret', - 'close_ticket_template_id' => 'Sag blev lukket', - 'close_ticket_autoresponder_help' => 'Valg af en skabelon vil sende et auto-svar til en klient/kontakt når en sag lukkes', 'default_priority' => 'Standardprioritet', 'alert_new_comment_id' => 'Ny kommentar', 'alert_comment_ticket_help' => 'Hvis du vælger en skabelon, sendes der en meddelelse (til agent), når der kommer en kommentar.', @@ -2956,8 +2949,6 @@ $lang = array( 'alert_ticket_overdue_email' => 'Yderligere forfaldne Sag -meddelelser', 'alert_ticket_overdue_email_help' => 'Kommaseparerede e-mails til bcc på Sag forsinket.', 'alert_ticket_overdue_agent_id_help' => 'Valg af en skabelon vil sende en meddelelse (til agent), når en Sag bliver forsinket.', - 'ticket_master' => 'Sag Master', - 'ticket_master_help' => 'Har evnen til at tildele og overføre billetter. Tildelt som standardagent for alle billetter.', 'default_agent' => 'Standardagent', 'default_agent_help' => 'Hvis valgt vil det automatisk blive tildelt alle indgående billetter', 'show_agent_details' => 'Vis agentoplysninger om svar', @@ -2965,43 +2956,19 @@ $lang = array( 'remove_avatar' => 'Fjern avatar', 'ticket_not_found' => 'Sag blev ikke fundet', 'add_template' => 'Tilføj skabelon', - 'ticket_template' => 'Sagsskabelon', - 'ticket_templates' => 'Sagsskabeloner', 'updated_ticket_template' => 'Sagsskabelon blev opdateret', 'created_ticket_template' => 'Sagsskabelon blev oprettet', 'archive_ticket_template' => 'Arkiv skabelon', 'restore_ticket_template' => 'Genskab skabelon', 'archived_ticket_template' => 'Succesfuldt arkiveret skabelon', 'restored_ticket_template' => 'Succesfuldt genskabt skabelon', - 'close_reason' => 'Fortæl os hvorfor du lukker denne sag', - 'reopen_reason' => 'Fortæl os hvorfor du genåbner denne sag', 'enter_ticket_message' => 'Skriv venligst en besked for at opdatere denne sag', 'show_hide_all' => 'Vis/skjul alle', 'subject_required' => 'Emne påkrævet', 'mobile_refresh_warning' => 'Hvis du bruger mobilappen, skal du muligvis foretage en fuld opdatering.', - 'enable_proposals_for_background' => 'For at uploade et baggrundsbillede :link for at aktivere modulet forslag.', - 'ticket_assignment' => 'Sag :ticket_number er blevet tildelt til :agent', - 'ticket_contact_reply' => 'Sag :ticket_number er blevet opdateret af klienten :contact', - 'ticket_new_template_subject' => 'Sag :ticket_number blev oprettet', - 'ticket_updated_template_subject' => 'Sag :ticket_number er blevet opdateret', - 'ticket_closed_template_subject' => 'Sag :ticket_number er blevet lukket.', - 'ticket_overdue_template_subject' => 'Sag :ticket_number er nu forfalden', 'merge' => 'Fusionere', 'merged' => 'Fusioneret', 'agent' => 'Agent', - 'parent_ticket' => 'Overordnet sag', - 'linked_tickets' => 'Sammenkædede sager', - 'merge_prompt' => 'Angiv dét sagsnummer som der skal flettes ind i', - 'merge_from_to' => 'Sagen #:old_ticket blev flettet ind i sag #:new_ticket', - 'merge_closed_ticket_text' => 'Sagen #:old_ticket blev lukket og flettet ind i sag#:new_ticket - :subject', - 'merge_updated_ticket_text' => 'Sagen #:old_ticket blev lukket og flettet ind i denne sag', - 'merge_placeholder' => 'Sammenflet sagen #:ticket ind i følgende sag', - 'select_ticket' => 'Vælg sag', - 'new_internal_ticket' => 'Ny intern sag', - 'internal_ticket' => 'Intern sag', - 'create_ticket' => 'Opret sag', - 'allow_inbound_email_tickets_external' => 'Nye sager per e-mail (klient)', - 'allow_inbound_email_tickets_external_help' => 'Tillad at klienter opretter nye sager per e-mail', 'include_in_filter' => 'Inkluder i filter', 'custom_client1' => ':VÆRDI', 'custom_client2' => ':VÆRDI', @@ -5333,7 +5300,8 @@ $lang = array( 'btcpay_refund_body' => 'En refundering til dig er blevet udstedt. For at gøre krav på det via BTCPay, klik venligst på dette link:', 'currency_mauritanian_ouguiya' => 'Mauritanian Ouguiya', 'currency_bhutan_ngultrum' => 'Bhutan Ngultrum', - 'end_of_month' => 'End Of Month' + 'end_of_month' => 'End Of Month', + 'merge_e_invoice_to_pdf' => 'Merge E-Invoice and PDF', ); return $lang; \ No newline at end of file diff --git a/lang/de/texts.php b/lang/de/texts.php index 83575735e1ed..a282945440a5 100644 --- a/lang/de/texts.php +++ b/lang/de/texts.php @@ -2935,13 +2935,6 @@ 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' => 'Die Ticketnummer muss größer sein als die aktuelle Ticketnummer.', - 'new_ticket_template_id' => 'Neues Ticket', - 'new_ticket_autoresponder_help' => 'Die Auswahl einer Vorlage sendet eine automatische Antwort an einen Kunden/Kontakt, wenn ein neues Ticket erstellt wird.', - 'update_ticket_template_id' => 'Ticket aktualisiert', - 'update_ticket_autoresponder_help' => 'Die Auswahl einer Vorlage sendet eine automatische Antwort an einen Kunden/Kontakt, wenn ein Ticket aktualisiert wird.', - 'close_ticket_template_id' => 'Ticket geschlossen', - 'close_ticket_autoresponder_help' => 'Die Auswahl einer Vorlage sendet eine automatische Antwort an einen Kunden/Kontakt, wenn ein Ticket geschlossen ist.', '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.', @@ -2958,8 +2951,6 @@ Sobald Sie die Beträge erhalten haben, kommen Sie bitte wieder zurück zu diese '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.', - 'ticket_master' => 'Ticket Master', - 'ticket_master_help' => 'Hat die Fähigkeit, Tickets zuzuordnen und zu übertragen. Wird als Standard-Agent für alle Tickets zugewiesen.', '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', @@ -2967,43 +2958,19 @@ Sobald Sie die Beträge erhalten haben, kommen Sie bitte wieder zurück zu diese 'remove_avatar' => 'Profilbild entfernen', 'ticket_not_found' => 'Ticket nicht gefunden', 'add_template' => 'Vorlage hinzufügen', - 'ticket_template' => 'Ticket Vorlage', - 'ticket_templates' => 'Ticket Vorlagen', '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', 'restored_ticket_template' => 'Vorlage erfolgreich wieder hergestellt', - 'close_reason' => 'Lassen Sie uns wissen, warum Sie dieses Ticket schließen.', - 'reopen_reason' => 'Lassen Sie uns wissen, warum Sie dieses Ticket wieder öffnen.', 'enter_ticket_message' => 'Bitte geben Sie eine Nachricht ein, um das Ticket zu aktualisieren.', 'show_hide_all' => 'Alle anzeigen / verstecken', 'subject_required' => 'Betreff erforderlich', 'mobile_refresh_warning' => 'Wenn Sie die mobile App verwenden, müssen Sie möglicherweise eine vollständige Aktualisierung durchführen.', - 'enable_proposals_for_background' => 'So laden Sie ein Hintergrundbild hoch :link zum Aktivieren des Vorschlagsmoduls.', - 'ticket_assignment' => 'Ticket :ticket_number wurde dem :agent zugewiesen.', - 'ticket_contact_reply' => 'Ticket :ticket_number wurde vom Kunden :contact aktualisiert', - 'ticket_new_template_subject' => 'Ticket :ticket_number wurde erstellt.', - 'ticket_updated_template_subject' => 'Ticket :ticket_number wurde aktualisiert.', - 'ticket_closed_template_subject' => 'Ticket :ticket_number wurde geschlossen.', - 'ticket_overdue_template_subject' => 'Ticket :ticket_number ist jetzt überfällig.', 'merge' => 'Zusammenführen', 'merged' => 'Zusammengeführt', 'agent' => 'Agent', - 'parent_ticket' => 'Übergeordnetes Ticket', - 'linked_tickets' => 'Verknüpfte Tickets', - 'merge_prompt' => 'Geben Sie die Ticketnummer ein, mit der Sie zusammenführen möchten.', - 'merge_from_to' => 'Ticket #:old_ticket mit Ticket #:new_ticket zusammengeführt', - 'merge_closed_ticket_text' => 'Ticket #:old_ticket wurde geschlossen und in Ticket#:new_ticket zusammengeführt -:: Subject', - 'merge_updated_ticket_text' => 'Ticket #:old_ticket wurde geschlossen und mit diesem Ticket zusammengeführt.', - 'merge_placeholder' => 'Zusammenführen von Ticket #:ticket in das folgende Ticket', - 'select_ticket' => 'Ticket auswählen', - 'new_internal_ticket' => 'Neues internes Ticket', - 'internal_ticket' => 'Internes Ticket', - 'create_ticket' => 'Ticket erstellen', - 'allow_inbound_email_tickets_external' => 'Neue Tickets per E-Mail (Kunde)', - 'allow_inbound_email_tickets_external_help' => 'Ermöglicht es Kunden, neue Tickets per E-Mail zu erstellen.', 'include_in_filter' => 'In den Filter aufnehmen', 'custom_client1' => ':VALUE', 'custom_client2' => ':VALUE', @@ -5338,7 +5305,8 @@ Leistungsempfängers', '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' + 'end_of_month' => 'End Of Month', + 'merge_e_invoice_to_pdf' => 'Merge E-Invoice and PDF', ); return $lang; \ No newline at end of file diff --git a/lang/el/texts.php b/lang/el/texts.php index 025735402c50..9dde6b9dafd8 100644 --- a/lang/el/texts.php +++ b/lang/el/texts.php @@ -199,7 +199,7 @@ $lang = array( 'removed_logo' => 'Επιτυχής διαγραφή λογότυπου', 'sent_message' => 'Επιτυχής αποστολή μηνύματος', 'invoice_error' => 'Παρακαλώ σιγουρευτείτε ότι επιλέξατε ένα πελάτη και διορθώσατε τυχόν σφάλματα', - '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' => 'Προέκυψε ένα σφάλμα κατά τη διαδικασία της πληρωμής. Παρακαλώ, δοκιμάστε ξανά σε λίγο.', 'registration_required' => 'Registration Required', 'confirmation_required' => 'Παρακαλώ επιβεβαιώστε τη διεύθυνση email, :link για να ξαναστείλετε το email επιβεβαίωσης.', @@ -2695,7 +2695,7 @@ $lang = array( 'no_assets' => 'Δεν υπάρχουν εικόνες, σύρατε για μεταφόρτωση', 'add_image' => 'Προσθήκη εικόνας', 'select_image' => 'Επιλογή εικόνας', - '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' => 'Διαγραφή εικόνας', 'delete_image_help' => 'Ειδοποίηση: διαγράφοντας την εικόνα θα την αφαιρέσει από όλες τις προτάσεις.', 'amount_variable_help' => 'Σημείωση: το πεδίο $amount του τιμολογίου θα χρησιμοποιήσει το πεδίο μερική προκαταβολή εάν οριστεί διαφορετικά θα χρησιμοποιήσει το υπόλοιπο του τιμολογίου.', @@ -2934,13 +2934,6 @@ $lang = array( 'mime_types' => 'Τύποι αρχείων', 'mime_types_placeholder' => '.pdf , .docx, .jpg', 'mime_types_help' => 'Λίστα χωριζόμενων με κόμμα τύπων αρχείων, αφήστε το κενό για όλους', - 'ticket_number_start_help' => 'Ο αριθμός του αιτήματος υποστήριξης πρέπει να είναι μεγαλύτερος από τον τρέχοντα αριθμό αιτήματος βοήθειας', - 'new_ticket_template_id' => 'Νέο αίτημα υποστήριξης', - 'new_ticket_autoresponder_help' => 'Η επιλογή ενός προτύπου θα στείλει μία αυτόματη ειδοποίηση στον πελάτη/επαφή όταν δημιουργηθεί ένα νέο αίτημα υποστήριξης.', - 'update_ticket_template_id' => 'Ενημερωμένο Αιτήματος υποστήριξης', - 'update_ticket_autoresponder_help' => 'Η επιλογή ενός προτύπου θα στείλει μία αυτόματη ειδοποίηση στον πελάτη/επαφή όταν ανανεωθεί ένα αίτημα υποστήριξης.', - 'close_ticket_template_id' => 'Κλεισμένο Αίτημα υποστήριξης', - 'close_ticket_autoresponder_help' => 'Η επιλογή ενός προτύπου θα στείλει μία αυτόματη ειδοποίηση στον πελάτη/επαφή όταν κλείσει ένα αίτημα υποστήριξης.', 'default_priority' => 'Προεπιλεγμένη προτεραιότητα', 'alert_new_comment_id' => 'Νέο σχόλιο', 'alert_comment_ticket_help' => 'Η επιλογή ενός προτύπου θα στείλει μία ειδοποίηση (στον εκπρόσωπο) όταν προστεθεί ένα σχόλιο.', @@ -2957,8 +2950,6 @@ $lang = array( 'alert_ticket_overdue_email' => 'Επιπλέον ειδοποιήσεις καθυστερούμενου αιτήματος υποστήριξης', 'alert_ticket_overdue_email_help' => 'Διαχωρίστε με κόμμα τα emails για να σταλεί μια κρυφή κοινοποίηση όταν το αίτημα υποστήριξης τεθεί σε καθυστέρηση', 'alert_ticket_overdue_agent_id_help' => 'Η επιλογή ενός προτύπου θα στείλει μία ειδοποίηση (στον εκπρόσωπο) όταν ένα αίτημα υποστήριξης γίνει εκπρόθεσμο.', - 'ticket_master' => 'Αρχηγός Αιτημάτων Βοήθειας', - 'ticket_master_help' => 'Έχει τη δυνατότητα να αναθέτει και να μεταφέρει αιτήματα υποστήριξης. Ορίζεται ως προεπιλεγμένος εκπρόσωπος σε όλα τα αιτήματα υποστήριξης.', 'default_agent' => 'Προεπιλεγμένος Εκπρόσωπος', 'default_agent_help' => 'Εάν επιλεγεί θα του ανατεθούν όλα τα εισερχόμενα αιτήματα υποστήριξης', 'show_agent_details' => 'Εμφάνιση λεπτομερειών εκπροσώπου στις απαντήσεις', @@ -2966,43 +2957,19 @@ $lang = array( 'remove_avatar' => 'Διαγραφή avatar', 'ticket_not_found' => 'Δεν βρέθηκε το αίτημα υποστήριξης', 'add_template' => 'Προσθήκη Προτύπου', - 'ticket_template' => 'Πρότυπο αιτήματος υποστήριξης', - 'ticket_templates' => 'Πρότυπα αιτήματος υποστήριξης', 'updated_ticket_template' => 'Ενημερώθηκε το πρότυπο αιτήματος υποστήριξης', 'created_ticket_template' => 'Δημιουργήθηκε το πρότυπο αιτήματος υποστήριξης', 'archive_ticket_template' => 'Αρχειοθέτηση Προτύπου', 'restore_ticket_template' => 'Ανάκτηση Προτύπου', 'archived_ticket_template' => 'Επιτυχής αρχειοθέτηση προτύπου', 'restored_ticket_template' => 'Επιτυχής ανάκτηση προτύπου', - 'close_reason' => 'Ενημερώστε μας γιατί κλείνετε αυτό το αίτημα υποστήριξης', - 'reopen_reason' => 'Ενημερώστε μας γιατί ξανά ανοίγετε αυτό το αίτημα υποστήριξης', 'enter_ticket_message' => 'Παρακαλώ εισάγετε ένα μήνυμα για να ενημερώσετε το αίτημα υποστήριξης', 'show_hide_all' => 'Εμφάνιση / Απόκρυψη όλων', 'subject_required' => 'Απαιτείται Θέμα', 'mobile_refresh_warning' => 'Εάν χρησιμοποιείτε την εφαρμογή κινητού ίσως χρειαστεί να κάνετε μία πλήρη ανανέωση.', - 'enable_proposals_for_background' => 'Για να ανεβάσετε μια εικόνα φόντου :link για να ενεργοποιήσετε τη λειτουργική μονάδα προτάσεων.', - 'ticket_assignment' => 'Το αίτημα υποστήριξης :ticket_number έχει ανατεθεί στον :agent', - 'ticket_contact_reply' => 'Το αίτημα υποστήριξης :ticket_number έχει ενημερωθεί από τον πελάτη :contact', - 'ticket_new_template_subject' => 'Το αίτημα υποστήριξης :ticket_number έχει δημιουργηθεί.', - 'ticket_updated_template_subject' => 'Το αίτημα υποστήριξης :ticket_number έχει ανανεωθεί.', - 'ticket_closed_template_subject' => 'Το αίτημα υποστήριξης :ticket_number έχει κλείσει.', - 'ticket_overdue_template_subject' => 'Το αίτημα υποστήριξης :ticket_number βρίσκεται πλέον σε καθυστέρηση', 'merge' => 'Συνένωση', 'merged' => 'Συνενώθηκε', 'agent' => 'Εκπρόσωπος', - 'parent_ticket' => 'Πατρικό Αίτημα υποστήριξης', - 'linked_tickets' => 'Συνδεδεμένα Αιτήματα υποστήριξης', - 'merge_prompt' => 'Επιλέξτε αριθμό αιτήματος υποστήριξης στο οποίο να γίνει η συνένωση', - 'merge_from_to' => 'Το αίτημα υποστήριξης #:old_ticket συνενώθηκε στο αίτημα υποστήριξης #:new_ticket', - 'merge_closed_ticket_text' => 'Το αίτημα υποστήριξης #:old_ticket έκλεισε και συνενώθηκε στο αίτημα υποστήριξης #:new_ticket', - 'merge_updated_ticket_text' => 'Το αίτημα υποστήριξης #:old_ticket έκλεισε και συνενώθηκε στο παρόν αίτημα υποστήριξης', - 'merge_placeholder' => 'Συνενώστε το αίτημα υποστήριξης #:ticket στο ακόλουθο αίτημα υποστήριξης', - 'select_ticket' => 'Επιλέξτε Αίτημα υποστήριξης', - 'new_internal_ticket' => 'Νέο εσωτερικό αίτημα υποστήριξης', - 'internal_ticket' => 'Εσωτερικό αίτημα υποστήριξης', - 'create_ticket' => 'Δημιουργήστε αίτημα υποστήριξης', - 'allow_inbound_email_tickets_external' => 'Νέα Αιτήματα υποστήριξης ανά email (Πελάτη)', - 'allow_inbound_email_tickets_external_help' => 'Επιτρέψτε στους πελάτες να δημιουργούν αιτήματα υποστήριξης μέσω email', 'include_in_filter' => 'Συμπεριλάβετε στο φίλτρο', 'custom_client1' => ':VALUE', 'custom_client2' => ':VALUE', @@ -4029,7 +3996,7 @@ $lang = array( 'user_detached' => 'User detached from company', 'create_webhook_failure' => 'Failed to create Webhook', 'payment_message_extended' => 'Thank you for your payment of :amount for :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', @@ -4437,7 +4404,7 @@ $lang = array( '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' => 'Is Paid', 'age_group_paid' => 'Paid', @@ -5147,7 +5114,7 @@ $lang = array( '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', @@ -5297,6 +5264,45 @@ $lang = array( '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', ); -return $lang; +return $lang; \ No newline at end of file diff --git a/lang/en/texts.php b/lang/en/texts.php index 5de0e456cf28..183f9b2731a7 100644 --- a/lang/en/texts.php +++ b/lang/en/texts.php @@ -5270,6 +5270,13 @@ $lang = array( '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', ); return $lang; \ No newline at end of file diff --git a/lang/es/texts.php b/lang/es/texts.php index 0cc1d8c1a34c..ad5fccf156b8 100644 --- a/lang/es/texts.php +++ b/lang/es/texts.php @@ -2933,13 +2933,6 @@ $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' => 'El número de boleto debe ser mayor que el número de boleto actual', - 'new_ticket_template_id' => 'Nuevo billete', - 'new_ticket_autoresponder_help' => 'Al seleccionar una plantilla, se enviará una respuesta automática a un cliente/contacto cuando se cree un nuevo ticket.', - 'update_ticket_template_id' => 'Boleto actualizado', - 'update_ticket_autoresponder_help' => 'Al seleccionar una plantilla, se enviará una respuesta automática a un cliente/contacto cuando se actualice un ticket.', - 'close_ticket_template_id' => 'Boleto cerrado', - 'close_ticket_autoresponder_help' => 'Al seleccionar una plantilla, se enviará una respuesta automática a un cliente/contacto cuando se cierre un ticket.', '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.', @@ -2956,8 +2949,6 @@ $lang = array( '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.', - 'ticket_master' => 'Maestro de boletos', - 'ticket_master_help' => 'Tiene la capacidad de asignar y transferir boletos. Asignado como agente predeterminado para todos los tickets.', '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', @@ -2965,43 +2956,19 @@ $lang = array( 'remove_avatar' => 'Quitar avatar', 'ticket_not_found' => 'Boleto no encontrado', 'add_template' => 'Agregar plantilla', - 'ticket_template' => 'Plantilla de boleto', - 'ticket_templates' => 'Plantillas de entradas', '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', 'restored_ticket_template' => 'Plantilla restaurada con éxito', - 'close_reason' => 'Háganos saber por qué está cerrando este ticket', - 'reopen_reason' => 'Háganos saber por qué está reabriendo este ticket', 'enter_ticket_message' => 'Por favor ingrese un mensaje para actualizar el boleto', 'show_hide_all' => 'Mostrar / Ocultar todo', 'subject_required' => 'Sujeto (requerido', 'mobile_refresh_warning' => 'Si está utilizando la aplicación móvil, es posible que deba realizar una actualización completa.', - 'enable_proposals_for_background' => 'Para subir una imagen de fondo :link para habilitar el módulo de propuestas.', - 'ticket_assignment' => 'El ticket :ticket_number ha sido asignado a :agent', - 'ticket_contact_reply' => 'El ticket :ticket_number ha sido actualizado por el cliente :contact', - 'ticket_new_template_subject' => 'Se ha creado el ticket :ticket_number.', - 'ticket_updated_template_subject' => 'El ticket :ticket_number ha sido actualizado.', - 'ticket_closed_template_subject' => 'El ticket :ticket_number se ha cerrado.', - 'ticket_overdue_template_subject' => 'El ticket :ticket_number ya venció', 'merge' => 'Unir', 'merged' => 'fusionado', 'agent' => 'Agente', - 'parent_ticket' => 'Boleto para padres', - 'linked_tickets' => 'Entradas vinculadas', - 'merge_prompt' => 'Ingrese el número de boleto para fusionarse', - 'merge_from_to' => 'Ticket #:old_ticket combinado con Ticket #:new_ticket', - 'merge_closed_ticket_text' => 'Ticket #:old_ticket se cerró y se fusionó con Ticket#:new_ticket - :subject', - 'merge_updated_ticket_text' => 'El ticket #:old_ticket se cerró y se fusionó con este ticket', - 'merge_placeholder' => 'Fusionar ticket #:ticket en el siguiente ticket', - 'select_ticket' => 'Seleccionar billete', - 'new_internal_ticket' => 'Nuevo ticket interno', - 'internal_ticket' => 'Boleto interno', - 'create_ticket' => 'Crear Ticket', - 'allow_inbound_email_tickets_external' => 'Nuevos Tickets por email (Cliente)', - 'allow_inbound_email_tickets_external_help' => 'Permitir a los clientes crear nuevos tickets por correo electrónico', 'include_in_filter' => 'Incluir en el filtro', 'custom_client1' => ':VALOR', 'custom_client2' => ':VALOR', @@ -5333,7 +5300,8 @@ $lang = array( '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' + 'end_of_month' => 'End Of Month', + 'merge_e_invoice_to_pdf' => 'Merge E-Invoice and PDF', ); return $lang; \ No newline at end of file diff --git a/lang/es_ES/texts.php b/lang/es_ES/texts.php index c8a26a3abe21..ea9cba5585dd 100644 --- a/lang/es_ES/texts.php +++ b/lang/es_ES/texts.php @@ -2930,13 +2930,6 @@ 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' => 'El número de ticket debe ser mayor que el número de ticket actual', - 'new_ticket_template_id' => 'Nuevo ticket', - 'new_ticket_autoresponder_help' => 'Seleccionando una plantilla enviará una auto respuesta a un cliente/contacto cuando cree un nuevo ticket', - 'update_ticket_template_id' => 'Ticket actualizado', - 'update_ticket_autoresponder_help' => 'Seleccionando una plantilla enviará una auto respuesta a un cliente/contacto cuando actualice un ticket', - 'close_ticket_template_id' => 'Ticket cerrado', - 'close_ticket_autoresponder_help' => 'Seleccionando una plantilla enviará una auto respuesta a un cliente/contacto cuando cierre un ticket', '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.', @@ -2953,8 +2946,6 @@ Una vez que tenga los montos, vuelva a esta página de métodos de pago y haga c '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.', - 'ticket_master' => 'Jefe de Tickets', - 'ticket_master_help' => 'Tiene la facultad de asignar y transferir tickets. Asignado como agente por defecto para todos los tickets.', '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', @@ -2962,43 +2953,19 @@ Una vez que tenga los montos, vuelva a esta página de métodos de pago y haga c 'remove_avatar' => 'Eliminar avatar', 'ticket_not_found' => 'Ticket no encontrado', 'add_template' => 'Añadir Plantila', - 'ticket_template' => 'Plantilla de Ticket', - 'ticket_templates' => 'Plantillas de Ticket', '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', 'restored_ticket_template' => 'Plantilla restaurada correctamente', - 'close_reason' => 'Háznos saber por qué estás cerrando este ticket', - 'reopen_reason' => 'Indícanos por qué estás reabriendo este ticket', 'enter_ticket_message' => 'Por favor, introduce un mensaje para actualizar el ticket', 'show_hide_all' => 'Mostrar / Ocultar todo', 'subject_required' => 'Asunto requerido', 'mobile_refresh_warning' => 'Si estás usando la app móvil necesitarás hacer un refresco completo.', - 'enable_proposals_for_background' => 'Para subir una imagen de fondo :link para activar el módulo de propuestas.', - 'ticket_assignment' => 'El ticket :ticket_number ha sido asignado a :agent', - 'ticket_contact_reply' => 'El ticket :ticket_number ha sido actualizado por el cliente :contact', - 'ticket_new_template_subject' => 'El ticket :ticket_number ha sido creado.', - 'ticket_updated_template_subject' => 'El ticket :ticket_number ha sido actualizado.', - 'ticket_closed_template_subject' => 'El ticket :ticket_number ha sido cerrado.', - 'ticket_overdue_template_subject' => 'El ticket :ticket_number ha vencido.', 'merge' => 'Unir', 'merged' => 'Unidos', 'agent' => 'Agente', - 'parent_ticket' => 'Ticket Padre', - 'linked_tickets' => 'Tickets Enlazados', - 'merge_prompt' => 'Introduce número de ticket con el que unir', - 'merge_from_to' => 'Ticket #:old_ticket se ha unido con el ticket #:new_ticket', - 'merge_closed_ticket_text' => 'Ticket #:old_ticket se ha cerrado y unido con el Ticket#:new_ticket - :subject', - 'merge_updated_ticket_text' => 'Ticket #:old_ticket se ha cerrado y unido con este ticket', - 'merge_placeholder' => 'Unir ticket #:ticket con el siguiente ticket', - 'select_ticket' => 'Seleccionar Ticket', - 'new_internal_ticket' => 'Nuevo ticket interno', - 'internal_ticket' => 'Ticket Interno', - 'create_ticket' => 'Crear ticket', - 'allow_inbound_email_tickets_external' => 'Nuevos Tickets por email (Cliente)', - 'allow_inbound_email_tickets_external_help' => 'Permitir a los clientes crear nuevos tickets por email', 'include_in_filter' => 'Incluir en el filtro', 'custom_client1' => ':VALUE', 'custom_client2' => ':VALUE', @@ -5331,7 +5298,8 @@ De lo contrario, este campo deberá dejarse en blanco.', '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' + 'end_of_month' => 'End Of Month', + 'merge_e_invoice_to_pdf' => 'Merge E-Invoice and PDF', ); return $lang; \ No newline at end of file diff --git a/lang/et/texts.php b/lang/et/texts.php index 0db32759e38f..49c6a1a51309 100644 --- a/lang/et/texts.php +++ b/lang/et/texts.php @@ -200,7 +200,7 @@ $lang = array( 'removed_logo' => 'Logo edukalt eemaldatud', 'sent_message' => 'Sõnum edukalt saadetud', 'invoice_error' => 'Valige kindlasti klient ja parandage kõik vead', - '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' => 'Teie makse töötlemisel ilmnes viga. Palun proovi hiljem uuesti.', 'registration_required' => 'Registration Required', 'confirmation_required' => 'Palun kinnitage oma meiliaadress, :link kinnitusmeili uuesti saatmiseks.', @@ -2695,7 +2695,7 @@ $lang = array( 'no_assets' => 'Pilte pole, lohistage üleslaadimiseks ', 'add_image' => 'Lisa Pilt', 'select_image' => 'Valige Pilt', - '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' => 'Kustuta pilt', '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.', @@ -2934,13 +2934,6 @@ $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' => 'Pileti number peab olema suurem kui praegune pileti number', - 'new_ticket_template_id' => 'Uus pilet', - 'new_ticket_autoresponder_help' => 'Malli valimine saadab uue pileti loomisel kliendile/kontaktile automaatse vastuse', - 'update_ticket_template_id' => 'Uuendatud pilet', - 'update_ticket_autoresponder_help' => 'Malli valimine saadab pileti värskendamisel kliendile/kontaktile automaatse vastuse', - 'close_ticket_template_id' => 'Suletud pilet', - 'close_ticket_autoresponder_help' => 'Malli valimine saadab pileti sulgemisel kliendile/kontaktile automaatse vastuse', 'default_priority' => 'Default priority', 'alert_new_comment_id' => 'Uus kommentaar', 'alert_comment_ticket_help' => 'Malli valimine saadab kommentaari tegemisel teate (agendile).', @@ -2957,8 +2950,6 @@ $lang = array( '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.', - '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' => 'Vaikimisi agent', 'default_agent_help' => 'If selected will automatically be assigned to all inbound tickets', 'show_agent_details' => 'Näidake vastuste kohta agendi üksikasju', @@ -2966,43 +2957,19 @@ $lang = array( 'remove_avatar' => 'Eemalda avatar', 'ticket_not_found' => 'Piletit ei leitud', 'add_template' => 'Lisa mall', - 'ticket_template' => 'Pileti mall', - 'ticket_templates' => 'Pileti mallid', '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', 'restored_ticket_template' => 'Mall edukalt taastatud', - 'close_reason' => 'Andke meile teada, miks te selle pileti sulgete', - 'reopen_reason' => 'Andke meile teada, miks te selle pileti uuesti avate', 'enter_ticket_message' => 'Pileti uuendamiseks sisestage teade', 'show_hide_all' => 'Näita/peida kõik', 'subject_required' => 'Teema nõutav', 'mobile_refresh_warning' => 'Kui kasutate mobiilirakendust, peate võib-olla tegema täieliku värskenduse.', - 'enable_proposals_for_background' => 'Taustapildi üleslaadimiseks :link ettepanekute mooduli lubamiseks.', - 'ticket_assignment' => 'Pilet :ticket_number on määratud :agent', - 'ticket_contact_reply' => 'Piletit :ticket_number on uuendanud kliendi :contact poolt', - 'ticket_new_template_subject' => 'Pilet :ticket_number on loodud.', - 'ticket_updated_template_subject' => 'Pilet :ticket_number on uuendatud.', - 'ticket_closed_template_subject' => 'Pilet :ticket_number on suletud.', - 'ticket_overdue_template_subject' => 'Pilet :ticket_number on nüüd üle tähtaja', 'merge' => 'Ühendage', 'merged' => 'Ühendatud', 'agent' => 'Agent', - 'parent_ticket' => 'Vanem pilet', - 'linked_tickets' => 'Lingitud piletid', - 'merge_prompt' => 'Sisestage ühendamiseks pileti number', - 'merge_from_to' => 'Pilet #:old_ticket liideti piletiga #:new_ticket', - 'merge_closed_ticket_text' => 'Pilet #:old_ticket suleti ja liideti piletiga #:new_ticket - :subject', - 'merge_updated_ticket_text' => 'Pilet #:old_ticket suleti ja liideti sellesse piletisse', - 'merge_placeholder' => 'Ühendage pilet #:ticket järgmiseks piletiks', - 'select_ticket' => 'Valige Pilet', - 'new_internal_ticket' => 'New internal ticket', - 'internal_ticket' => 'Internal ticket', - 'create_ticket' => 'Loo pilet', - 'allow_inbound_email_tickets_external' => 'Uued piletid meili teel (klient)', - 'allow_inbound_email_tickets_external_help' => 'Lubage klientidel e-posti teel uusi pileteid luua', 'include_in_filter' => 'Kaasake filtrisse', 'custom_client1' => ':VALUE', 'custom_client2' => ':VALUE', @@ -4029,7 +3996,7 @@ $lang = array( 'user_detached' => 'User detached from company', 'create_webhook_failure' => 'Failed to create Webhook', 'payment_message_extended' => 'Thank you for your payment of :amount for :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', @@ -4437,7 +4404,7 @@ $lang = array( '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' => 'Is Paid', 'age_group_paid' => 'Paid', @@ -5147,7 +5114,7 @@ $lang = array( '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', @@ -5297,6 +5264,45 @@ $lang = array( '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', ); -return $lang; +return $lang; \ No newline at end of file diff --git a/lang/fa/texts.php b/lang/fa/texts.php index c07313ce65e4..6e8601a35128 100644 --- a/lang/fa/texts.php +++ b/lang/fa/texts.php @@ -199,7 +199,7 @@ $lang = array( 'removed_logo' => 'Successfully removed logo', 'sent_message' => 'Successfully sent message', 'invoice_error' => 'Please make sure to select a client and correct any errors', - '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' => 'There was an error processing your payment. Please try again later.', 'registration_required' => 'Registration Required', 'confirmation_required' => 'Please confirm your email address, :link to resend the confirmation email.', @@ -2695,7 +2695,7 @@ $lang = array( 'no_assets' => 'No images, drag to upload', 'add_image' => 'Add Image', 'select_image' => 'Select Image', - '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' => 'Delete Image', '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.', @@ -2934,13 +2934,6 @@ $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.', @@ -2957,8 +2950,6 @@ $lang = array( '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' => 'Default Agent', 'default_agent_help' => 'If selected will automatically be assigned to all inbound tickets', 'show_agent_details' => 'Show agent details on responses', @@ -2966,43 +2957,19 @@ $lang = array( 'remove_avatar' => 'Remove avatar', 'ticket_not_found' => 'Ticket not found', 'add_template' => 'Add Template', - 'ticket_template' => 'Ticket Template', - 'ticket_templates' => 'Ticket Templates', 'updated_ticket_template' => 'Updated Ticket Template', 'created_ticket_template' => 'Created Ticket Template', 'archive_ticket_template' => 'Archive Template', 'restore_ticket_template' => 'Restore Template', 'archived_ticket_template' => 'Successfully archived template', 'restored_ticket_template' => 'Successfully restored template', - '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' => 'Show / Hide all', 'subject_required' => 'Subject required', 'mobile_refresh_warning' => 'If you\'re using the mobile app you may need to do a full refresh.', - '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' => 'Merge', 'merged' => 'Merged', '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' => 'Include in filter', 'custom_client1' => ':VALUE', 'custom_client2' => ':VALUE', @@ -4029,7 +3996,7 @@ $lang = array( 'user_detached' => 'User detached from company', 'create_webhook_failure' => 'Failed to create Webhook', 'payment_message_extended' => 'Thank you for your payment of :amount for :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', @@ -4437,7 +4404,7 @@ $lang = array( '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' => 'Is Paid', 'age_group_paid' => 'Paid', @@ -5147,7 +5114,7 @@ $lang = array( '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', @@ -5297,6 +5264,45 @@ $lang = array( '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', ); -return $lang; +return $lang; \ No newline at end of file diff --git a/lang/fi/texts.php b/lang/fi/texts.php index 6c1c6174df43..d23e9dc3672c 100644 --- a/lang/fi/texts.php +++ b/lang/fi/texts.php @@ -199,7 +199,7 @@ $lang = array( 'removed_logo' => 'Logo on poistettu onnistuneesti ', 'sent_message' => 'Viesti on onnistuneesti lähetetty', 'invoice_error' => 'Ystävällisesti varmistakaa että asiakasta on valittu ja korjaatkaa kaikki virheet', - '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' => 'Maksukäsittelyssä ilmeni ongelma. Yrittäkää myöhemmin uudelleen.', 'registration_required' => 'Rekisteröinti vaaditaan', 'confirmation_required' => 'Ole hyvä ja vahvista sähköpostiosoitteesi, :link paina tästä uudelleenlähettääksesi vahvistussähköpostin. ', @@ -2200,7 +2200,7 @@ Kun saat summat, palaa tälle maksutapasivulle ja klikkaa "Saata loppuun todenta 'send_test_email' => 'Send Test Email', 'select_label' => 'Valitse kenttä', 'label' => 'Label', - 'service' => 'Service', + 'service' => 'Palvelu', 'update_payment_details' => 'Päivitä maksu tiedot', 'updated_payment_details' => 'Onnistuneesti päivitetty maksun tiedot', 'update_credit_card' => 'päivitä luotto kortti', @@ -2453,7 +2453,7 @@ Kun saat summat, palaa tälle maksutapasivulle ja klikkaa "Saata loppuun todenta 'time_hrs' => 'hrs', 'clear' => 'Clear', 'warn_payment_gateway' => 'Huom: Online-maksujen vastaanottaminen vaatii maksujen käsittelyjärjestelmän (maksutavan), :link lisätäksesi sellaisen.', - 'task_rate' => 'Tehtävän luokitus', + 'task_rate' => 'Tehtävän hinta', 'task_rate_help' => 'Aseta oletus luokitus laskutetuille tehtäville.', 'past_due' => 'Past Due', 'document' => 'Document', @@ -2695,7 +2695,7 @@ Kun saat summat, palaa tälle maksutapasivulle ja klikkaa "Saata loppuun todenta 'no_assets' => 'ei images, drag upload', 'add_image' => 'Lisää kuva', 'select_image' => 'Select Image', - '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' => 'Poista Image', 'delete_image_help' => 'Warning: deleting kuva will remove it from kaikki proposals.', 'amount_variable_help' => 'Huom: lasku $amount kenttä will use partial/deposit kenttä jos set otherwise it will use lasku balance.', @@ -2934,13 +2934,6 @@ Kun saat summat, palaa tälle maksutapasivulle ja klikkaa "Saata loppuun todenta 'mime_types' => 'Mime types', 'mime_types_placeholder' => '.pdf , .docx, .jpg', 'mime_types_help' => 'Pilkulla erotettu lista allowed mime types, jätä tyhjäksi kaikki', - 'ticket_number_start_help' => 'tiketti numero must be greater than current tiketti numero', - 'new_ticket_template_id' => 'uusi tiketti', - 'new_ticket_autoresponder_help' => 'Selecting template will send auto response asiakas/kontakti when uusi tiketti is luotu', - 'update_ticket_template_id' => 'päivitetty tiketti', - 'update_ticket_autoresponder_help' => 'Selecting template will send auto response asiakas/kontakti when tiketti is päivitetty', - 'close_ticket_template_id' => 'suljettu tiketti', - 'close_ticket_autoresponder_help' => 'Selecting template will send auto response asiakas/kontakti when tiketti is closed', 'default_priority' => 'oletus priority', 'alert_new_comment_id' => 'uusi comment', 'alert_comment_ticket_help' => 'Selecting template will send notification ( agent) when comment is made.', @@ -2957,8 +2950,6 @@ Kun saat summat, palaa tälle maksutapasivulle ja klikkaa "Saata loppuun todenta 'alert_ticket_overdue_email' => 'Täydentävät Uusi tiketti yliajalla -ilmoitukset', 'alert_ticket_overdue_email_help' => 'pilkulla erotetut sähköpostit bcc on tiketti overdue.', 'alert_ticket_overdue_agent_id_help' => 'Selecting template will send notification ( agent) when tiketti becomes overdue.', - 'ticket_master' => 'tiketti Master', - 'ticket_master_help' => 'Has ability assign ja transfer tiketit. Assigned as oletus agent kaikki tiketit.', 'default_agent' => 'oletus Agent', 'default_agent_help' => 'If selected will automatically be assigned kaikki inbound tiketit', 'show_agent_details' => 'Näytä agentin tiedot vastauksissa', @@ -2966,43 +2957,19 @@ Kun saat summat, palaa tälle maksutapasivulle ja klikkaa "Saata loppuun todenta 'remove_avatar' => 'Remove avatar', 'ticket_not_found' => 'tiketti ei löydy', 'add_template' => 'Lisää mallipohja', - 'ticket_template' => 'tiketti pohja', - 'ticket_templates' => 'tiketti pohjat', 'updated_ticket_template' => 'päivitetty tiketti pohja', 'created_ticket_template' => 'luotu tiketti pohja', 'archive_ticket_template' => 'Arkistoi pohja', 'restore_ticket_template' => 'palauta pohja', 'archived_ticket_template' => 'onnistuneesti arkistoitu template', 'restored_ticket_template' => 'onnistuneesti palautettu template', - 'close_reason' => 'Let us know why you on closing this tiketti', - 'reopen_reason' => 'Let us know why you on reopening this tiketti', 'enter_ticket_message' => ' Kirjoita viesti päivittääksesi tiketin', 'show_hide_all' => 'Näytä / Piilota kaikki', 'subject_required' => 'Subject required', 'mobile_refresh_warning' => 'If you\'re using mobile app you may need do full refresh.', - 'enable_proposals_for_background' => 'To upload background kuva :link enable proposals module.', - 'ticket_assignment' => 'tiketti :ticket_number on assigned :agent', - 'ticket_contact_reply' => 'tiketti :ticket_number on päivitetty by asiakas :kontakti', - 'ticket_new_template_subject' => 'tiketti :ticket_number on luotu.', - 'ticket_updated_template_subject' => 'tiketti :ticket_number on päivitetty.', - 'ticket_closed_template_subject' => 'tiketti :ticket_number on closed.', - 'ticket_overdue_template_subject' => 'tiketti :ticket_number is nyt overdue', 'merge' => 'Merge', 'merged' => 'Merged', 'agent' => 'Agent', - 'parent_ticket' => 'Parent tiketti', - 'linked_tickets' => 'Linked Tickets', - 'merge_prompt' => 'Enter tiketti numero merge into', - 'merge_from_to' => 'tiketti #:old_ticket merged into tiketti #:new_ticket', - 'merge_closed_ticket_text' => 'tiketti #:old_ticket was closed ja merged into tiketti#:new_ticket - :subject', - 'merge_updated_ticket_text' => 'tiketti #:old_ticket was closed ja merged into this tiketti', - 'merge_placeholder' => 'Merge tiketti #:tiketti into following tiketti', - 'select_ticket' => 'Select tiketti', - 'new_internal_ticket' => 'uusi internal tiketti', - 'internal_ticket' => 'Internal tiketti', - 'create_ticket' => 'luo tiketti', - 'allow_inbound_email_tickets_external' => 'uusi Tickets by sähköposti (asiakas)', - 'allow_inbound_email_tickets_external_help' => 'Allow asiakkaat create uusi tiketit by sähköposti', 'include_in_filter' => 'Include in filter', 'custom_client1' => ':VALUE', 'custom_client2' => ':VALUE', @@ -4029,7 +3996,7 @@ Kun saat summat, palaa tälle maksutapasivulle ja klikkaa "Saata loppuun todenta 'user_detached' => 'User detached from company', 'create_webhook_failure' => 'Failed to create Webhook', 'payment_message_extended' => 'Thank you for your payment of :amount for :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' => 'Toimittajan katuosoite', 'vendor_address2' => 'Toimittajan huoneisto-osoite', @@ -4437,7 +4404,7 @@ Kun saat summat, palaa tälle maksutapasivulle ja klikkaa "Saata loppuun todenta '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' => 'Is Paid', 'age_group_paid' => 'Paid', @@ -5147,7 +5114,7 @@ Kun saat summat, palaa tälle maksutapasivulle ja klikkaa "Saata loppuun todenta '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', @@ -5297,6 +5264,45 @@ Kun saat summat, palaa tälle maksutapasivulle ja klikkaa "Saata loppuun todenta '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', ); -return $lang; +return $lang; \ No newline at end of file diff --git a/lang/fr/texts.php b/lang/fr/texts.php index 46957138dc48..864588991af3 100644 --- a/lang/fr/texts.php +++ b/lang/fr/texts.php @@ -2934,13 +2934,6 @@ 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' => 'Le numéro du billet doit être plus grand que le billet en cours', - 'new_ticket_template_id' => 'Nouveau ticket', - 'new_ticket_autoresponder_help' => 'En sélectionnant un modèle, une réponse automatique sera envoyée à un client/contact lorsqu\'un nouveau ticket est créé', - 'update_ticket_template_id' => 'Ticket mis à jour', - 'update_ticket_autoresponder_help' => 'En sélectionnant un modèle, une réponse automatique sera envoyée à un client/contact lorsqu\'un ticket est mis à jour', - 'close_ticket_template_id' => 'Fermer le ticket', - 'close_ticket_autoresponder_help' => 'En sélectionnant un modèle, une réponse automatique sera envoyée à un client/contact lorsqu\'un ticket est fermé', '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é', @@ -2957,8 +2950,6 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette '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.', - 'ticket_master' => 'Ticket maitre', - 'ticket_master_help' => 'Peut assigner et transférer les tickets. Assigné par défaut pour tous les tickets.', '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', @@ -2966,43 +2957,19 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette 'remove_avatar' => 'Enlever l\'avatar', 'ticket_not_found' => 'Ticket non trouvé', 'add_template' => 'Ajouter un modèle', - 'ticket_template' => 'Modèle de ticket', - 'ticket_templates' => 'Modèles de ticket', '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', 'restored_ticket_template' => 'Modèle restaurer avec succès', - 'close_reason' => 'Faites nous savoir pourquoi vous fermez ce ticket', - 'reopen_reason' => 'Faites nous savoir pourquoi vous ré-ouvrez ce ticket', 'enter_ticket_message' => 'Entrez un message pour mettre à jour le ticket', 'show_hide_all' => 'Afficher / Masquer tout', 'subject_required' => 'Sujet requis', 'mobile_refresh_warning' => 'Si vous utilisez l\'app mobile, vous devez faire une actualisation complète.', - 'enable_proposals_for_background' => 'Pour envoyer une image de fond :link pour activer le module de propositions.', - 'ticket_assignment' => 'Le ticket :ticket_number a été assigné à :agent', - 'ticket_contact_reply' => 'Le ticket :ticket_number a été mis à jour par le client :contact', - 'ticket_new_template_subject' => 'Ticket :ticket_number a été crée.', - 'ticket_updated_template_subject' => 'Ticket :ticket_number a été mis à jour.', - 'ticket_closed_template_subject' => 'Ticket :ticket_number a été fermé.', - 'ticket_overdue_template_subject' => 'Ticket :ticket_number est maintenant arriéré.', 'merge' => 'Fusionner', 'merged' => 'Fusionné', 'agent' => 'Agent', - 'parent_ticket' => 'Ticket parent', - 'linked_tickets' => 'Ticket lié', - 'merge_prompt' => 'Entrez un numéro de ticket pour fusionner avec', - 'merge_from_to' => 'Le ticket #:old_ticket a été fusionné avec le ticket #:new_ticket', - 'merge_closed_ticket_text' => 'Le ticket #:old_ticket a été fermé et fusionner dans le ticket #:new_ticket - :subject', - 'merge_updated_ticket_text' => 'Le ticket #:old_ticket a été fermé et fusionner dans ce ticket', - 'merge_placeholder' => 'Fusionner le ticket #:ticket dans le ticket suivant', - 'select_ticket' => 'Sélectionner un ticket', - 'new_internal_ticket' => 'Nouveau ticket interne', - 'internal_ticket' => 'Ticket interne', - 'create_ticket' => 'Créer un ticket', - 'allow_inbound_email_tickets_external' => 'Nouveaux tickets par courriel (Client)', - 'allow_inbound_email_tickets_external_help' => 'Permettre aux clients de créer des nouveaux tickets par courriel', 'include_in_filter' => 'Inclure dans le filtre', 'custom_client1' => ':VALUE', 'custom_client2' => ':VALUE', @@ -5334,7 +5301,8 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette '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' + 'end_of_month' => 'End Of Month', + 'merge_e_invoice_to_pdf' => 'Merge E-Invoice and PDF', ); return $lang; \ No newline at end of file diff --git a/lang/fr_CA/texts.php b/lang/fr_CA/texts.php index 4f89ea736773..fff46aa33247 100644 --- a/lang/fr_CA/texts.php +++ b/lang/fr_CA/texts.php @@ -2931,13 +2931,6 @@ 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' => 'Le numéro du billet doit être plus grand que le billet en cours', - 'new_ticket_template_id' => 'Nouveau billet', - 'new_ticket_autoresponder_help' => 'En sélectionnant un modèle, une réponse automatique sera envoyée à un client/contact lorsqu\'un nouveau billet est créé', - 'update_ticket_template_id' => 'Billet mis à jour', - 'update_ticket_autoresponder_help' => 'En sélectionnant un modèle, une réponse automatique sera envoyée à un client/contact lorsqu\'un billet est mis à jour', - 'close_ticket_template_id' => 'Billet fermé', - 'close_ticket_autoresponder_help' => 'En sélectionnant un modèle, une réponse automatique sera envoyée à un client/contact lorsqu\'un billet est fermé', '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', @@ -2954,8 +2947,6 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette '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.', - 'ticket_master' => 'Gestionnaire de billet', - 'ticket_master_help' => 'Peut assigner et transférer les billets. Assigné par défaut pour tous les billets.', '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', @@ -2963,43 +2954,19 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette 'remove_avatar' => 'Retirer l\'avatar', 'ticket_not_found' => 'Billet introuvable', 'add_template' => 'Ajouter un modèle', - 'ticket_template' => 'Modèle de billet', - 'ticket_templates' => 'Modèles de billets', '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é', 'restored_ticket_template' => 'Le modèle a été restauré', - 'close_reason' => 'Faites-nous savoir pourquoi vous fermez ce billet', - 'reopen_reason' => 'Faites-nous savoir pourquoi vous souhaitez réouvrir ce billet', 'enter_ticket_message' => 'Veuillez saisir un message pour mettre à jour ce billet', 'show_hide_all' => 'Afficher / masquer tout', 'subject_required' => 'Objet requis', 'mobile_refresh_warning' => 'Si vous utilisez l\'app mobile, vous devez faire une actualisation complète.', - 'enable_proposals_for_background' => 'Pour téléverser une image de fond :link pour activer le module de propositions.', - 'ticket_assignment' => 'Le billet :ticket_number a été assigné à :agent', - 'ticket_contact_reply' => 'Le billet :ticket_number a été mis à jour par le client :contact', - 'ticket_new_template_subject' => 'Le billet :ticket_number a été créé.', - 'ticket_updated_template_subject' => 'Le billet :ticket_number a été mis à jour.', - 'ticket_closed_template_subject' => 'Le billet :ticket_number a été fermé.', - 'ticket_overdue_template_subject' => 'Le biller :ticket_number est en retard', 'merge' => 'Fusionner', 'merged' => 'Fusionné', 'agent' => 'Agent', - 'parent_ticket' => 'Billet parent', - 'linked_tickets' => 'Billets liés', - 'merge_prompt' => 'Veuillez saisir un numéro de billet pour fusionner', - 'merge_from_to' => 'Le billet #:old_ticket a été fusionné avec le billet #:new_ticket', - 'merge_closed_ticket_text' => 'Le billet #:old_ticket a été fermé et fusionner avec le billet #:new_ticket - :subject', - 'merge_updated_ticket_text' => 'Le billet #:old_ticket a été fermé et fusionné avec ce billet', - 'merge_placeholder' => 'Fusionner le billet #:ticket avec le billet suivant', - 'select_ticket' => 'Sélectionner le billet', - 'new_internal_ticket' => 'Nouveau billet interne', - 'internal_ticket' => 'Billet interne', - 'create_ticket' => 'Créer un billet', - 'allow_inbound_email_tickets_external' => 'Nouveaux billets par courriel (client)', - 'allow_inbound_email_tickets_external_help' => 'Autoriser les clients à créer de nouveaux billets par courriel', 'include_in_filter' => 'Inclure dans le filtre', 'custom_client1' => ':VALUE', 'custom_client2' => ':VALUE', @@ -5331,7 +5298,8 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette 'btcpay_refund_body' => 'Un remboursement qui vous est destiné a été émis. Pour le réclamer via BTCPay, veuillez cliquer sur ce lien :', 'currency_mauritanian_ouguiya' => 'Ouguiya mauritanien', 'currency_bhutan_ngultrum' => 'Ngultrum Bhoutan', - 'end_of_month' => 'Fin de mois' + 'end_of_month' => 'Fin de mois', + 'merge_e_invoice_to_pdf' => 'Fusionner E-Facture et PDF', ); return $lang; \ No newline at end of file diff --git a/lang/fr_CH/texts.php b/lang/fr_CH/texts.php index c0c848899595..18e98ff527fc 100644 --- a/lang/fr_CH/texts.php +++ b/lang/fr_CH/texts.php @@ -2931,13 +2931,6 @@ 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' => 'Le numéro du billet doit être plus grand que le billet en cours', - 'new_ticket_template_id' => 'Nouveau billet', - 'new_ticket_autoresponder_help' => 'En sélectionnant un modèle, une réponse automatique sera envoyée à un client/contact lorsqu\'un nouveau billet est créé', - 'update_ticket_template_id' => 'Billet mis à jour', - 'update_ticket_autoresponder_help' => 'En sélectionnant un modèle, une réponse automatique sera envoyée à un client/contact lorsqu\'un billet est mis à jour', - 'close_ticket_template_id' => 'Billet fermé', - 'close_ticket_autoresponder_help' => 'En sélectionnant un modèle, une réponse automatique sera envoyée à un client/contact lorsqu\'un billet est fermé', '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', @@ -2954,8 +2947,6 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette '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.', - 'ticket_master' => 'Gestionnaire de billet', - 'ticket_master_help' => 'Peut assigner et transférer les billets. Assigné par défaut pour tous les billets.', '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', @@ -2963,43 +2954,19 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette 'remove_avatar' => 'Retirer l\'avatar', 'ticket_not_found' => 'Billet introuvable', 'add_template' => 'Ajouter un modèle', - 'ticket_template' => 'Modèle de billet', - 'ticket_templates' => 'Modèles de billets', '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', 'restored_ticket_template' => 'Le modèle a été restauré avec succès', - 'close_reason' => 'Faites-nous savoir pourquoi vous fermez ce billet', - 'reopen_reason' => 'Faites-nous savoir pourquoi vous souhaitez réouvrir ce billet', 'enter_ticket_message' => 'Veuillez entrer un message pour mettre à jour ce billet', 'show_hide_all' => 'Afficher / masquer tout', 'subject_required' => 'Objet requis', 'mobile_refresh_warning' => 'Si vous utilisez l\'app mobile, vous devez faire une actualisation complète.', - 'enable_proposals_for_background' => 'Pour téléverser une image de fond :link pour activer le module de propositions.', - 'ticket_assignment' => 'Le billet :ticket_number a été assigné à :agent', - 'ticket_contact_reply' => 'Le billet :ticket_number a été mis à jour par le client :contact', - 'ticket_new_template_subject' => 'Le billet :ticket_number a été créé.', - 'ticket_updated_template_subject' => 'Le billet :ticket_number a été mis à jour.', - 'ticket_closed_template_subject' => 'Le billet :ticket_number a été fermé.', - 'ticket_overdue_template_subject' => 'Le biller :ticket_number est en retard', 'merge' => 'Fusionner', 'merged' => 'Fusionné', 'agent' => 'Agent', - 'parent_ticket' => 'Billet parent', - 'linked_tickets' => 'Billets liés', - 'merge_prompt' => 'Veuillez saisir un numéro de billet pour fusionner', - 'merge_from_to' => 'Le billet #:old_ticket a été fusionné avec le billet #:new_ticket', - 'merge_closed_ticket_text' => 'Le billet #:old_ticket a été fermé et fusionner avec le billet #:new_ticket - :subject', - 'merge_updated_ticket_text' => 'Le billet #:old_ticket a été fermé et fusionné avec ce billet', - 'merge_placeholder' => 'Fusionner le billet #:ticket avec le billet suivant', - 'select_ticket' => 'Sélectionner le billet', - 'new_internal_ticket' => 'Nouveau billet interne', - 'internal_ticket' => 'Billet interne', - 'create_ticket' => 'Créer un billet', - 'allow_inbound_email_tickets_external' => 'Nouveaux billets par courriel (client)', - 'allow_inbound_email_tickets_external_help' => 'Autoriser les clients à créer de nouveaux billets par courriel', 'include_in_filter' => 'Inclure dans le filtre', 'custom_client1' => ':VALUE', 'custom_client2' => ':VALUE', @@ -5331,7 +5298,8 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette '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' + 'end_of_month' => 'End Of Month', + 'merge_e_invoice_to_pdf' => 'Merge E-Invoice and PDF', ); return $lang; \ No newline at end of file diff --git a/lang/he/texts.php b/lang/he/texts.php index 85ea250aca9b..e76823443c71 100644 --- a/lang/he/texts.php +++ b/lang/he/texts.php @@ -2932,13 +2932,6 @@ $lang = array( 'mime_types' => 'סוגי פנטומימה', 'mime_types_placeholder' => '.pdf , .docx, .jpg', 'mime_types_help' => 'רשימה מופרדת בפסיק של סוגי פנטומימאי מותרים, השאר ריק עבור כולם', - 'ticket_number_start_help' => 'מספר הכרטיס חייב להיות גדול ממספר הכרטיס הנוכחי', - 'new_ticket_template_id' => 'כרטיס חדש', - 'new_ticket_autoresponder_help' => 'בחירת תבנית תשלח תגובה אוטומטית ללקוח/איש קשר כאשר נוצר כרטיס חדש', - 'update_ticket_template_id' => 'כרטיס מעודכן', - 'update_ticket_autoresponder_help' => 'בחירת תבנית תשלח תגובה אוטומטית ללקוח/איש קשר כאשר הכרטיס מעודכן', - 'close_ticket_template_id' => 'כרטיס סגור', - 'close_ticket_autoresponder_help' => 'בחירת תבנית תשלח תגובה אוטומטית ללקוח/איש קשר כאשר כרטיס נסגר', 'default_priority' => 'עדיפות ברירת מחדל', 'alert_new_comment_id' => 'תגובה חדשה', 'alert_comment_ticket_help' => 'בחירת תבנית תשלח הודעה (לסוכן) עם הערה.', @@ -2955,8 +2948,6 @@ $lang = array( '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.', - 'ticket_master' => 'מאסטר כרטיסים', - 'ticket_master_help' => 'בעל יכולת להקצות ולהעביר כרטיסים. הוקצה כסוכן ברירת המחדל עבור כל הכרטיסים.', 'default_agent' => 'סוכן ברירת מחדל', 'default_agent_help' => 'If selected will automatically be assigned to all inbound tickets', 'show_agent_details' => 'הצג פרטי סוכן בתגובות', @@ -2964,43 +2955,19 @@ $lang = array( 'remove_avatar' => 'הסר את הדמות', 'ticket_not_found' => 'הכרטיס לא נמצא', 'add_template' => 'הוסף תבנית', - 'ticket_template' => 'תבנית כרטיס', - 'ticket_templates' => 'תבניות כרטיסים', 'updated_ticket_template' => 'תבנית כרטיס מעודכנת', 'created_ticket_template' => 'נוצר תבנית כרטיס', 'archive_ticket_template' => 'תבנית ארכיון', 'restore_ticket_template' => 'שחזר תבנית', 'archived_ticket_template' => 'תבנית הועברה לארכיון בהצלחה', 'restored_ticket_template' => 'התבנית שוחזרה בהצלחה', - 'close_reason' => 'מהי סיבת סגירת הכרטיס?', - 'reopen_reason' => 'סיבת פתיחת הכרטיס?', 'enter_ticket_message' => 'נא להזין הודעה כדי לעדכן את הכרטיס', 'show_hide_all' => 'הצג / הסתר הכל', 'subject_required' => 'נושא חובה', 'mobile_refresh_warning' => 'אם אתה משתמש באפליקציה לנייד, ייתכן שיהיה עליך לבצע רענון מלא.', - 'enable_proposals_for_background' => 'To upload a background image :link to enable the proposals module.', - 'ticket_assignment' => 'הכרטיס :ticket_number הוקצה ל-:agent', - 'ticket_contact_reply' => 'כרטיס :ticket_number עודכן על ידי הלקוח :contact', - 'ticket_new_template_subject' => 'כרטיס :ticket_number נוצר.', - 'ticket_updated_template_subject' => 'כרטיס :ticket_number עודכן.', - 'ticket_closed_template_subject' => 'כרטיס :ticket_number נסגר.', - 'ticket_overdue_template_subject' => 'כרטיס :ticket_number הגיע לאיחור', 'merge' => 'לְמַזֵג', 'merged' => 'מוזג', 'agent' => 'סוֹכֵן', - 'parent_ticket' => 'כרטיס הורה', - 'linked_tickets' => 'Linked Tickets', - 'merge_prompt' => 'הזן את מספר הכרטיס להתמזג אליו', - 'merge_from_to' => 'כרטיס מס':כרטיס_ישן מוזג לכרטיס מס':כרטיס_חדש', - 'merge_closed_ticket_text' => 'כרטיס מס':old_ticket נסגר ומוזג לתוך Ticket#:new_ticket - :subject', - 'merge_updated_ticket_text' => 'כרטיס מס':old_ticket נסגר ואוחד לתוך כרטיס זה', - 'merge_placeholder' => 'מיזוג כרטיס מס':כרטיס לכרטיס הבא', - 'select_ticket' => 'בחר כרטיס', - 'new_internal_ticket' => 'כרטיס פנימי חדש', - 'internal_ticket' => 'כרטיס פנימי', - 'create_ticket' => 'צור כרטיס', - 'allow_inbound_email_tickets_external' => 'כרטיסים חדשים בדוא"ל (לקוח)', - 'allow_inbound_email_tickets_external_help' => 'אפשר ללקוחות ליצור כרטיסים חדשים בדוא"ל', 'include_in_filter' => 'כלול בפילטר', 'custom_client1' => ':ערך', 'custom_client2' => ':ערך', @@ -5332,7 +5299,8 @@ $lang = array( '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' + 'end_of_month' => 'End Of Month', + 'merge_e_invoice_to_pdf' => 'Merge E-Invoice and PDF', ); return $lang; \ No newline at end of file diff --git a/lang/hr/texts.php b/lang/hr/texts.php index 56a7db783fc4..14077898567f 100644 --- a/lang/hr/texts.php +++ b/lang/hr/texts.php @@ -199,7 +199,7 @@ $lang = array( 'removed_logo' => 'Logo je uspješno uklonjen', 'sent_message' => 'Poruka je uspješno poslana', 'invoice_error' => 'Molimo provjerite da odaberete klijenta i korigirate greške', - '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' => 'Došlo je do greške pri procesuiranju vaše uplate. Molimo pokušajte kasnije.', 'registration_required' => 'Registration Required', 'confirmation_required' => 'Please confirm your email address, :link to resend the confirmation email.', @@ -2696,7 +2696,7 @@ Nevažeći kontakt email', 'no_assets' => 'No images, drag to upload', 'add_image' => 'Add Image', 'select_image' => 'Select Image', - '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' => 'Delete Image', '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.', @@ -2935,13 +2935,6 @@ Nevažeći kontakt email', 'mime_types' => 'MIME tipovi', 'mime_types_placeholder' => '.pdf , .docx, .jpg', 'mime_types_help' => 'Popis dopuštenih vrsta MIME tipova, odvojeni zarezima. Za sve, ostavite prazno', - 'ticket_number_start_help' => 'Broj radnog naloga mora biti veći od zadnjeg broja naloga', - 'new_ticket_template_id' => 'Novi radni nalog', - 'new_ticket_autoresponder_help' => 'Odabir predloška poslat će automatski odgovor klijentu / kontaktu kada se kreira novi radni nalog', - 'update_ticket_template_id' => 'Ažurirani radni nalog', - 'update_ticket_autoresponder_help' => 'Odabir predloška poslat će automatski odgovor klijentu / kontaktu kada se radni nalog ažurira', - 'close_ticket_template_id' => 'Radni nalog zatvoren', - 'close_ticket_autoresponder_help' => 'Odabir predloška poslat će automatski odgovor klijentu / kontaktu kada se radni nalog zatvori', 'default_priority' => 'Zadani prioritet', 'alert_new_comment_id' => 'Novi komentar', 'alert_comment_ticket_help' => 'Odabirom predloška poslat će se obavijest (agentu) kad se kreira komentar.', @@ -2958,8 +2951,6 @@ Nevažeći kontakt email', 'alert_ticket_overdue_email' => 'Dodatne obavijesti o kašnjenju radnog naloga', 'alert_ticket_overdue_email_help' => 'E-adrese odvojene zarezom na koje će se poslati skrivena kopija kašnjenja radnog naloga.', 'alert_ticket_overdue_agent_id_help' => 'Odabirom predloška, obavijesti će biti poslana (agentu) kada je radni nalog kasni.', - 'ticket_master' => 'Vlasnik radnog naloga', - 'ticket_master_help' => 'Ima mogućnost dodjeljivanja i prijenosa radnih naloga. Dodijeljen kao zadani agent za sve ulaznice.', 'default_agent' => 'Zadani agent', 'default_agent_help' => 'Ako se odabere, automatski će se dodijeliti svim ulaznim radnim nalozima', 'show_agent_details' => 'Prikaži detalje agenta u odgovorima', @@ -2967,43 +2958,19 @@ Nevažeći kontakt email', 'remove_avatar' => 'Ukloni Avatar', 'ticket_not_found' => 'Radni nalog nije pronađen', 'add_template' => 'Dodaj Predložak', - 'ticket_template' => 'Predložak radnog naloga', - 'ticket_templates' => 'Predlošci radnih naloga', 'updated_ticket_template' => 'Ažuriran predložak radnog naloga', 'created_ticket_template' => 'Kreirani predložak radnog naloga', 'archive_ticket_template' => 'Arhiviran predložak ranog naloga', 'restore_ticket_template' => 'Vrati predložak radnog naloga', 'archived_ticket_template' => 'Predložak uspješno arhiviran', 'restored_ticket_template' => 'Uspješno obnovljen predložak', - 'close_reason' => 'Recite nam zašto zatvarate radni nalog', - 'reopen_reason' => 'Recite nam zašto ponovno otvarate radni nalog', 'enter_ticket_message' => 'Unesite poruku kako biste ažurirali radni nalog', 'show_hide_all' => 'Prikaži / sakrij sve', 'subject_required' => 'Predmet je obavezan', 'mobile_refresh_warning' => 'Ako koristite mobilnu aplikaciju, možda ćete morati izvršiti potpuno osvježavanje.', - 'enable_proposals_for_background' => 'Za učitavanje pozadinske slike :link za omogućavanje modula prijedloga.', - 'ticket_assignment' => 'Radni nalog :ticket_number dodijeljen je agentu :agent', - 'ticket_contact_reply' => 'Radni nalog :ticket_number je ažuriran od strane klijenta :contact', - 'ticket_new_template_subject' => 'Radni nalog :ticket_number je stvoren.', - 'ticket_updated_template_subject' => 'Radni nalog :ticket_number je ažuriran.', - 'ticket_closed_template_subject' => 'Radni nalog :ticket_number je zatvoren.', - 'ticket_overdue_template_subject' => 'Radni nalog :ticket_number kasni.', 'merge' => 'Spoji', 'merged' => 'Spojeno', 'agent' => 'Agent', - 'parent_ticket' => 'Parent Ticket', - 'linked_tickets' => 'Povezani radni nalozi', - 'merge_prompt' => 'Unesite broj ranog naloga u kojeg će se spojiti', - 'merge_from_to' => 'Radni nalog #:old_ticket je spojen u radni nalog #:new_ticket', - 'merge_closed_ticket_text' => 'Radni nalog #:old_ticket je zatvoren i spojen u radni nalog #:new_ticket - :subject', - 'merge_updated_ticket_text' => 'Radni nalog #:old_ticket je zatvoren i spojen s ovime', - 'merge_placeholder' => 'Spoji radni nalog #:ticket u sljedeći radni nalog', - 'select_ticket' => 'Odaberi radni nalog', - 'new_internal_ticket' => 'Novi interni radni nalog', - 'internal_ticket' => 'Interni radni nalog', - 'create_ticket' => 'Stvori radni nalog', - 'allow_inbound_email_tickets_external' => 'Novi radni nalog putem e-maila (Klijent)', - 'allow_inbound_email_tickets_external_help' => 'Dozvoli klijentima da kreiraju novi radni nalog putem e-maila', 'include_in_filter' => 'Uključi u filter', 'custom_client1' => ':VALUE', 'custom_client2' => ':VALUE', @@ -4030,7 +3997,7 @@ Nevažeći kontakt email', 'user_detached' => 'User detached from company', 'create_webhook_failure' => 'Failed to create Webhook', 'payment_message_extended' => 'Thank you for your payment of :amount for :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', @@ -4438,7 +4405,7 @@ Nevažeći kontakt email', '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' => 'Is Paid', 'age_group_paid' => 'Paid', @@ -5148,7 +5115,7 @@ Nevažeći kontakt email', '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', @@ -5298,6 +5265,45 @@ Nevažeći kontakt email', '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', ); -return $lang; +return $lang; \ No newline at end of file diff --git a/lang/hu/texts.php b/lang/hu/texts.php index a932fd05b79a..b5b7d3694ead 100644 --- a/lang/hu/texts.php +++ b/lang/hu/texts.php @@ -2918,13 +2918,6 @@ 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' => 'A jegyazonosító első száma', - 'new_ticket_template_id' => 'Új jegy sablon', - 'new_ticket_autoresponder_help' => 'Az új jegy automatikus válaszának kiválasztott sablonja', - 'update_ticket_template_id' => 'Jegy frissítése sablon', - 'update_ticket_autoresponder_help' => 'A jegy frissítésére adott automatikus válasz kiválasztott sablonja', - 'close_ticket_template_id' => 'Jegy bezárása sablon', - 'close_ticket_autoresponder_help' => 'A jegy bezárására adott automatikus válasz kiválasztott sablonja', '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', @@ -2941,8 +2934,6 @@ adva :date', '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', - 'ticket_master' => 'Jegymester', - 'ticket_master_help' => 'Az összes jegyhez hozzáférő felhasználó', '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', @@ -2950,43 +2941,19 @@ adva :date', 'remove_avatar' => 'Profilkép eltávolítása', 'ticket_not_found' => 'A jegy nem található', 'add_template' => 'Sablon hozzáadása', - 'ticket_template' => 'Jegy sablon', - 'ticket_templates' => 'Jegy sablonok', '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', 'restored_ticket_template' => 'Visszaállított jegy sablon', - 'close_reason' => 'Bezárás oka', - 'reopen_reason' => 'Újranyitás oka', 'enter_ticket_message' => 'Írja be a jegy üzenetét', 'show_hide_all' => 'Összes megjelenítése/elrejtése', 'subject_required' => 'Tárgy kötelező', 'mobile_refresh_warning' => 'Ha mobilalkalmazást használ, frissítheti az alkalmazást az új tartalom megtekintéséhez.', - 'enable_proposals_for_background' => 'A háttérhez engedélyezze az ajánlatokat', - 'ticket_assignment' => 'Jegy hozzárendelése', - 'ticket_contact_reply' => 'Jegy válasz ügyfélnek', - 'ticket_new_template_subject' => 'Új jegy sablon tárgya', - 'ticket_updated_template_subject' => 'Frissített jegy sablon tárgya', - 'ticket_closed_template_subject' => 'Bezárt jegy sablon tárgya', - 'ticket_overdue_template_subject' => 'Lejárt jegy sablon tárgya', 'merge' => 'Összevonás', 'merged' => 'Összevont', 'agent' => 'Ügyintéző', - 'parent_ticket' => 'Szülő jegy', - 'linked_tickets' => 'Kapcsolt jegyek', - 'merge_prompt' => 'Összevonás felhívás', - 'merge_from_to' => 'Összevonás forrás-ide', - 'merge_closed_ticket_text' => 'Az összevont jegyek bezárva lesznek', - 'merge_updated_ticket_text' => 'Az összevont jegy frissítve lesz', - 'merge_placeholder' => 'Összevonás helyőrző', - 'select_ticket' => 'Jegy kiválasztása', - 'new_internal_ticket' => 'Új belső jegy', - 'internal_ticket' => 'Belső jegy', - 'create_ticket' => 'Jegy létrehozása', - 'allow_inbound_email_tickets_external' => 'Beérkező e-mail jegyek engedélyezése külső', - 'allow_inbound_email_tickets_external_help' => 'Engedélyezi a külső ügyfeleknek a beérkező e-mail alapú jegyek létrehozását.', 'include_in_filter' => 'Beleértve a szűrőbe', 'custom_client1' => 'Egyéni ügyfél 1', 'custom_client2' => 'Egyéni ügyfél 2', @@ -5318,7 +5285,8 @@ adva :date', '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' + 'end_of_month' => 'End Of Month', + 'merge_e_invoice_to_pdf' => 'Merge E-Invoice and PDF', ); return $lang; \ No newline at end of file diff --git a/lang/it/texts.php b/lang/it/texts.php index f3b397946071..f72f831d3ff2 100644 --- a/lang/it/texts.php +++ b/lang/it/texts.php @@ -2925,13 +2925,6 @@ $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' => 'Il numero del ticket deve essere maggiore del numero di ticket corrente', - 'new_ticket_template_id' => 'Nuovo ticket', - 'new_ticket_autoresponder_help' => 'Selezionando un modello verrà inviata una risposta automatica a un cliente/contatto quando viene creato un nuovo ticket', - 'update_ticket_template_id' => 'Ticket aggiornato', - 'update_ticket_autoresponder_help' => 'Selezionando un modello verrà inviata una risposta automatica a un cliente/contatto quando un ticket viene aggiornato', - 'close_ticket_template_id' => 'Ticket chiuso', - 'close_ticket_autoresponder_help' => 'Selezionando un modello verrà inviata una risposta automatica a un cliente/contatto quando un ticket viene chiuso', '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.', @@ -2948,8 +2941,6 @@ $lang = array( '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.', - 'ticket_master' => 'Ticket Master', - 'ticket_master_help' => 'Ha la capacità di assegnare e trasferire ticket. Assegnato come agente predefinito per tutti i ticket.', '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', @@ -2957,43 +2948,19 @@ $lang = array( 'remove_avatar' => 'Rimuovi avatar', 'ticket_not_found' => 'Ticket non trovato', 'add_template' => 'Aggiungi Modello', - 'ticket_template' => 'Modello Ticket', - 'ticket_templates' => 'Modelli Ticket', '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', 'restored_ticket_template' => 'Modello ripristinato con successo', - 'close_reason' => 'Facci sapere perché stai chiudendo questo ticket', - 'reopen_reason' => 'Facci sapere perché stai riaprendo questo ticket', 'enter_ticket_message' => 'Inserire un messaggio per aggiornare il biglietto', 'show_hide_all' => 'Mostra / Nascondi tutto', 'subject_required' => 'Soggetto richiesto', 'mobile_refresh_warning' => 'Se stai usando l\'app mobile potresti aver bisogno di fare un ricaricamento completo.', - 'enable_proposals_for_background' => 'Per caricare un'immagine di sfondo :link per abilitare il modulo proposte.', - 'ticket_assignment' => 'Il ticket :ticket_number è stato assegnato a :agent', - 'ticket_contact_reply' => 'Il ticket :ticket_number è stato aggiornato dal cliente :contact', - 'ticket_new_template_subject' => 'Il ticket :ticket_number è stato creato.', - 'ticket_updated_template_subject' => 'Il ticket :ticket_number è stato aggiornato.', - 'ticket_closed_template_subject' => 'Il ticket :ticket_number è stato chiuso.', - 'ticket_overdue_template_subject' => 'Il ticket :ticket_number è scaduto', 'merge' => 'Unisci', 'merged' => 'Unito', 'agent' => 'Agente', - 'parent_ticket' => 'Ticket padre', - 'linked_tickets' => 'Tickets collegati', - 'merge_prompt' => 'Inserisci il numero del ticket da unire', - 'merge_from_to' => 'Ticket #:old_ticket unito al ticket #:new_ticket', - 'merge_closed_ticket_text' => 'Il ticket #:old_ticket è stato chiuso e unito al ticket #:new_ticket - :subject', - 'merge_updated_ticket_text' => 'Il ticket #:old_ticket è stato chiuso e unito a questo ticket', - 'merge_placeholder' => 'Unisci il ticket #:ticket al seguente ticket', - 'select_ticket' => 'Seleziona ticket', - 'new_internal_ticket' => 'Nuovo ticket interno', - 'internal_ticket' => 'Ticket interno', - 'create_ticket' => 'Crea ticket', - 'allow_inbound_email_tickets_external' => 'Nuovi ticket via e-mail (cliente)', - 'allow_inbound_email_tickets_external_help' => 'Permettere ai clienti di creare nuovi ticket via e-mail', 'include_in_filter' => 'Includi nel filtro', 'custom_client1' => ':VALUE', 'custom_client2' => ':VALUE', @@ -5325,7 +5292,8 @@ $lang = array( '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' + 'end_of_month' => 'End Of Month', + 'merge_e_invoice_to_pdf' => 'Merge E-Invoice and PDF', ); return $lang; \ No newline at end of file diff --git a/lang/ja/texts.php b/lang/ja/texts.php index dfec27c63c5c..fd1ef612f47f 100644 --- a/lang/ja/texts.php +++ b/lang/ja/texts.php @@ -199,7 +199,7 @@ $lang = array( 'removed_logo' => 'ロゴを削除しました。', 'sent_message' => 'メッセージを送信しました。', 'invoice_error' => '顧客を選択し、エラーを修正したことを確認してください。', - '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' => 'There was an error processing your payment. Please try again later.', 'registration_required' => 'Registration Required', 'confirmation_required' => 'メールボックスを確認してください。確認メールを再送する場合は :link をクリックしてください。', @@ -2695,7 +2695,7 @@ $lang = array( 'no_assets' => 'No images, drag to upload', 'add_image' => 'Add Image', 'select_image' => 'Select Image', - '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' => 'Delete Image', 'delete_image_help' => '警告: 画像を削除すると、すべての提案から削除されます。', 'amount_variable_help' => '注: 請求書の $amount フィールドは、設定されている場合は部分/預金フィールドを使用し、それ以外の場合は請求書の残高を使用します。', @@ -2934,13 +2934,6 @@ $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' => 'テンプレートを選択すると、チケット更新時にクライアント/連絡先に対して自動応答が送信されます。', - '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.', @@ -2957,8 +2950,6 @@ $lang = array( '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' => 'Default Agent', 'default_agent_help' => 'If selected will automatically be assigned to all inbound tickets', 'show_agent_details' => 'Show agent details on responses', @@ -2966,43 +2957,19 @@ $lang = array( 'remove_avatar' => 'Remove avatar', 'ticket_not_found' => 'Ticket not found', 'add_template' => 'Add Template', - 'ticket_template' => 'Ticket Template', - 'ticket_templates' => 'Ticket Templates', 'updated_ticket_template' => 'Updated Ticket Template', 'created_ticket_template' => 'Created Ticket Template', 'archive_ticket_template' => 'Archive Template', 'restore_ticket_template' => 'Restore Template', 'archived_ticket_template' => 'Successfully archived template', 'restored_ticket_template' => 'Successfully restored template', - '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' => 'Show / Hide all', 'subject_required' => 'Subject required', 'mobile_refresh_warning' => 'If you\'re using the mobile app you may need to do a full refresh.', - 'enable_proposals_for_background' => '背景画像 :link をアップロードして、提案モジュールを有効にします。', - 'ticket_assignment' => 'チケット :ticket_number が :agent に割り当てられました', - 'ticket_contact_reply' => 'チケット :ticket_number がクライアント :contact によって更新されました', - 'ticket_new_template_subject' => 'チケット :ticket_number が作成されました。', - 'ticket_updated_template_subject' => 'チケット :ticket_number が更新されました。', - 'ticket_closed_template_subject' => 'チケット :ticket_number はクローズされました。', - 'ticket_overdue_template_subject' => 'チケット :ticket_number の期限が過ぎています', 'merge' => 'Merge', 'merged' => 'Merged', 'agent' => 'Agent', - 'parent_ticket' => 'Parent Ticket', - 'linked_tickets' => 'Linked Tickets', - 'merge_prompt' => 'Enter ticket number to merge into', - 'merge_from_to' => 'チケット #:old_ticket はチケット #:new_ticket に統合されました', - 'merge_closed_ticket_text' => 'チケット #:old_ticket はクローズされ、Ticket#:new_ticket に統合されました - :subject', - 'merge_updated_ticket_text' => 'チケット #:old_ticket はクローズされ、このチケットに統合されました', - 'merge_placeholder' => 'チケット #: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' => 'Include in filter', 'custom_client1' => ':価値', 'custom_client2' => ':価値', @@ -4437,7 +4404,7 @@ $lang = array( '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' => 'Is Paid', 'age_group_paid' => 'Paid', @@ -5147,7 +5114,7 @@ $lang = array( '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', @@ -5306,20 +5273,36 @@ $lang = array( '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' => 'Round Tasks', - 'round_tasks_help' => 'Round time intervals when saving tasks', + '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', ); -return $lang; +return $lang; \ No newline at end of file diff --git a/lang/km_KH/texts.php b/lang/km_KH/texts.php index a0f8f9b411dd..4aba9bb9ff15 100644 --- a/lang/km_KH/texts.php +++ b/lang/km_KH/texts.php @@ -2914,13 +2914,6 @@ $lang = array( 'mime_types' => 'ប្រភេទ Mime', 'mime_types_placeholder' => '.pdf , .docx , .jpg', 'mime_types_help' => 'បញ្ជីដោយបំបែកដោយសញ្ញាក្បៀសនៃប្រភេទ mime ដែលបានអនុញ្ញាត ទុកទទេសម្រាប់ទាំងអស់គ្នា', - 'ticket_number_start_help' => 'លេខសំបុត្រត្រូវតែធំជាងលេខសំបុត្របច្ចុប្បន្ន', - 'new_ticket_template_id' => 'សំបុត្រថ្មី។', - 'new_ticket_autoresponder_help' => 'ការជ្រើសរើសគំរូនឹងផ្ញើការឆ្លើយតបដោយស្វ័យប្រវត្តិទៅអតិថិជន/ទំនាក់ទំនង នៅពេលសំបុត្រថ្មីត្រូវបានបង្កើត', - 'update_ticket_template_id' => 'សំបុត្រដែលបានធ្វើបច្ចុប្បន្នភាព', - 'update_ticket_autoresponder_help' => 'ការជ្រើសរើសគំរូនឹងផ្ញើការឆ្លើយតបដោយស្វ័យប្រវត្តិទៅអតិថិជន/ទំនាក់ទំនង នៅពេលសំបុត្រត្រូវបានធ្វើបច្ចុប្បន្នភាព', - 'close_ticket_template_id' => 'សំបុត្របិទ', - 'close_ticket_autoresponder_help' => 'ការជ្រើសរើសគំរូនឹងផ្ញើការឆ្លើយតបដោយស្វ័យប្រវត្តិទៅអតិថិជន/ទំនាក់ទំនង នៅពេលសំបុត្រត្រូវបានបិទ', 'default_priority' => 'អាទិភាពលំនាំដើម', 'alert_new_comment_id' => 'មតិថ្មី។', 'alert_comment_ticket_help' => 'ការជ្រើសរើសគំរូនឹងផ្ញើការជូនដំណឹង (ទៅភ្នាក់ងារ) នៅពេលមានមតិយោបល់។', @@ -2937,8 +2930,6 @@ $lang = array( 'alert_ticket_overdue_email' => 'ការជូនដំណឹងអំពីសំបុត្រហួសកាលកំណត់បន្ថែម', 'alert_ticket_overdue_email_help' => 'សញ្ញាក្បៀសបានបំបែកអ៊ីមែលទៅជា bcc នៅលើសំបុត្រហួសកំណត់។', 'alert_ticket_overdue_agent_id_help' => 'ការជ្រើសរើសគំរូនឹងផ្ញើការជូនដំណឹង (ទៅភ្នាក់ងារ) នៅពេលដែលសំបុត្រផុតកំណត់។', - 'ticket_master' => 'ម្ចាស់សំបុត្រ', - 'ticket_master_help' => 'មាន​សមត្ថភាព​ក្នុង​ការ​ចាត់តាំង និង​ផ្ទេរ​សំបុត្រ។ ត្រូវបានចាត់តាំងជាភ្នាក់ងារលំនាំដើមសម្រាប់សំបុត្រទាំងអស់។', 'default_agent' => 'ភ្នាក់ងារលំនាំដើម', 'default_agent_help' => 'ប្រសិន​បើ​បាន​ជ្រើស​នឹង​ត្រូវ​បាន​កំណត់​ដោយ​ស្វ័យ​ប្រវត្តិ​ចំពោះ​សំបុត្រ​ចូល​ទាំង​អស់', 'show_agent_details' => 'បង្ហាញព័ត៌មានលម្អិតភ្នាក់ងារលើការឆ្លើយតប', @@ -2946,43 +2937,19 @@ $lang = array( 'remove_avatar' => 'លុបរូបតំណាង', 'ticket_not_found' => 'រកមិនឃើញសំបុត្រទេ។', 'add_template' => 'បន្ថែមគំរូ', - 'ticket_template' => 'គំរូសំបុត្រ', - 'ticket_templates' => 'គំរូសំបុត្រ', 'updated_ticket_template' => 'គំរូសំបុត្រដែលបានធ្វើបច្ចុប្បន្នភាព', 'created_ticket_template' => 'បានបង្កើតគំរូសំបុត្រ', 'archive_ticket_template' => 'បណ្ណសារគំរូ', 'restore_ticket_template' => 'ស្តារគំរូ', 'archived_ticket_template' => 'ពុម្ពដែលបានទុកក្នុងប័ណ្ណសារដោយជោគជ័យ', 'restored_ticket_template' => 'បានស្ដារគំរូដោយជោគជ័យ', - 'close_reason' => 'ប្រាប់យើងពីមូលហេតុដែលអ្នកបិទសំបុត្រនេះ។', - 'reopen_reason' => 'អនុញ្ញាតឱ្យពួកយើងដឹងពីមូលហេតុដែលអ្នកកំពុងបើកសំបុត្រនេះឡើងវិញ', 'enter_ticket_message' => 'សូមបញ្ចូលសារដើម្បីធ្វើបច្ចុប្បន្នភាពសំបុត្រ', 'show_hide_all' => 'បង្ហាញ / លាក់ទាំងអស់។', 'subject_required' => 'ប្រធានបទដែលត្រូវការ', 'mobile_refresh_warning' => 'ប្រសិនបើអ្នកកំពុងប្រើកម្មវិធីទូរស័ព្ទ អ្នកប្រហែលជាត្រូវធ្វើការអាប់ដេតពេញលេញ។', - 'enable_proposals_for_background' => 'ដើម្បីបង្ហោះរូបភាពផ្ទៃខាងក្រោយ :link ដើម្បីបើកម៉ូឌុលសំណើ។', - 'ticket_assignment' => 'សំបុត្រ :ticket_number ត្រូវបានចាត់ឱ្យទៅ :agent', - 'ticket_contact_reply' => 'សំបុត្រ :ticket_number ត្រូវបានធ្វើបច្ចុប្បន្នភាពដោយអតិថិជន :contact', - 'ticket_new_template_subject' => 'សំបុត្រ :ticket_number ត្រូវបានបង្កើត។', - 'ticket_updated_template_subject' => 'សំបុត្រ :ticket_number ត្រូវបានធ្វើបច្ចុប្បន្នភាព។', - 'ticket_closed_template_subject' => 'សំបុត្រ :ticket_number ត្រូវបានបិទ។', - 'ticket_overdue_template_subject' => 'សំបុត្រ :ticket_number ឥឡូវនេះផុតកំណត់ហើយ។', 'merge' => 'បញ្ចូលគ្នា', 'merged' => 'បញ្ចូលគ្នា', 'agent' => 'ភ្នាក់ងារ', - 'parent_ticket' => 'សំបុត្រឪពុកម្តាយ', - 'linked_tickets' => 'សំបុត្រភ្ជាប់', - 'merge_prompt' => 'បញ្ចូលលេខសំបុត្រដើម្បីបញ្ចូលចូលគ្នា។', - 'merge_from_to' => 'សំបុត្រ #:old_ticket បានបញ្ចូលទៅក្នុង Ticket #:new_ticket', - 'merge_closed_ticket_text' => 'សំបុត្រ #:old_ticket ត្រូវបានបិទ ហើយបញ្ចូលទៅក្នុង Ticket#:new_ticket - :subject', - 'merge_updated_ticket_text' => 'សំបុត្រ #:old_ticket ត្រូវបានបិទ ហើយបញ្ចូលទៅក្នុងសំបុត្រនេះ។', - 'merge_placeholder' => 'បញ្ចូលសំបុត្រ #: សំបុត្រចូលទៅក្នុងសំបុត្រខាងក្រោម', - 'select_ticket' => 'ជ្រើសរើសសំបុត្រ', - 'new_internal_ticket' => 'សំបុត្រខាងក្នុងថ្មី។', - 'internal_ticket' => 'សំបុត្រខាងក្នុង', - 'create_ticket' => 'បង្កើតសំបុត្រ', - 'allow_inbound_email_tickets_external' => 'សំបុត្រថ្មីតាមអ៊ីមែល (អតិថិជន)', - 'allow_inbound_email_tickets_external_help' => 'អនុញ្ញាតឱ្យអតិថិជនបង្កើតសំបុត្រថ្មីតាមអ៊ីមែល', 'include_in_filter' => 'រួមបញ្ចូលនៅក្នុងតម្រង', 'custom_client1' => '៖ VALUE', 'custom_client2' => '៖ VALUE', @@ -5314,7 +5281,8 @@ $lang = array( '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' + 'end_of_month' => 'End Of Month', + 'merge_e_invoice_to_pdf' => 'Merge E-Invoice and PDF', ); return $lang; \ No newline at end of file diff --git a/lang/lo_LA/texts.php b/lang/lo_LA/texts.php index 3fab708c8e0f..5a0e5e16168c 100644 --- a/lang/lo_LA/texts.php +++ b/lang/lo_LA/texts.php @@ -2934,13 +2934,6 @@ $lang = array( 'mime_types' => 'ປະເພດ Mime', 'mime_types_placeholder' => '.pdf , .docx, .jpg', 'mime_types_help' => 'ໝາຍຈຸດແຍກລາຍຊື່ປະເພດ mime ທີ່ອະນຸຍາດ, ປ່ອຍໃຫ້ຫວ່າງສຳລັບທັງໝົດ', - 'ticket_number_start_help' => 'ໝາຍເລກປີ້ຕ້ອງໃຫຍ່ກວ່າໝາຍເລກປີ້ປະຈຸບັນ', - 'new_ticket_template_id' => 'ປີ້ໃໝ່', - 'new_ticket_autoresponder_help' => 'ການເລືອກແມ່ແບບຈະສົ່ງການຕອບໂຕ້ອັດຕະໂນມັດໃຫ້ກັບລູກຄ້າ / ຕິດຕໍ່ເມື່ອປີ້ໃຫມ່ຖືກສ້າງຂື້ນ', - 'update_ticket_template_id' => 'ປີ້ອັບເດດ', - 'update_ticket_autoresponder_help' => 'ການເລືອກແມ່ແບບຈະສົ່ງການຕອບໂຕ້ອັດຕະໂນມັດໃຫ້ກັບລູກຄ້າ / ຕິດຕໍ່ເມື່ອປີ້ໄດ້ຖືກປັບປຸງ', - 'close_ticket_template_id' => 'ປີ້ປິດ', - 'close_ticket_autoresponder_help' => 'ການເລືອກແມ່ແບບຈະສົ່ງການຕອບໂຕ້ອັດຕະໂນມັດໃຫ້ກັບລູກຄ້າ / ຕິດຕໍ່ເມື່ອປີ້ປິດ', 'default_priority' => 'ບູລິມະສິດເລີ່ມຕົ້ນ', 'alert_new_comment_id' => 'ຄຳເຫັນໃໝ່', 'alert_comment_ticket_help' => 'ການເລືອກແມ່ແບບຈະສົ່ງການແຈ້ງເຕືອນ (ໃຫ້ຕົວແທນ) ເມື່ອມີຄຳເຫັນ.', @@ -2957,8 +2950,6 @@ $lang = array( 'alert_ticket_overdue_email' => 'ການແຈ້ງປີ້ທີ່ເກີນກຳນົດເວລາເພີ່ມເຕີມ', 'alert_ticket_overdue_email_help' => 'ໝາຍຈຸດທີ່ແຍກອີເມວໄປຫາ bcc ໃນປີ້ທີ່ໝົດກຳນົດ.', 'alert_ticket_overdue_agent_id_help' => 'ການເລືອກແມ່ແບບຈະສົ່ງການແຈ້ງເຕືອນ (ໃຫ້ຕົວແທນ) ເມື່ອປີ້ໝົດກຳນົດ.', - 'ticket_master' => 'Ticket Master', - 'ticket_master_help' => 'ມີຄວາມສາມາດໃນການມອບຫມາຍແລະໂອນປີ້. ມອບໝາຍໃຫ້ເປັນຕົວແທນເລີ່ມຕົ້ນສຳລັບປີ້ທັງໝົດ.', 'default_agent' => 'ຕົວແທນເລີ່ມຕົ້ນ', 'default_agent_help' => 'ຖ້າເລືອກຈະຖືກມອບໃຫ້ປີ້ເຂົ້າທັງໝົດໂດຍອັດຕະໂນມັດ', 'show_agent_details' => 'ສະແດງລາຍລະອຽດຕົວແທນກ່ຽວກັບການຕອບ', @@ -2966,43 +2957,19 @@ $lang = array( 'remove_avatar' => 'ເອົາຮູບແທນຕົວອອກ', 'ticket_not_found' => 'ບໍ່ພົບປີ້', 'add_template' => 'ເພີ່ມແມ່ແບບ', - 'ticket_template' => 'ແມ່ແບບປີ້', - 'ticket_templates' => 'ແມ່ແບບປີ້', 'updated_ticket_template' => 'ແມ່ແບບປີ້ທີ່ອັບເດດແລ້ວ', 'created_ticket_template' => 'Ticket Template ທີ່ສ້າງແລ້ວ', 'archive_ticket_template' => 'ແມ່ແບບເກັບມ້ຽນ', 'restore_ticket_template' => 'ຟື້ນຟູແມ່ແບບ', 'archived_ticket_template' => 'ແມ່ແບບທີ່ເກັບໄວ້ສຳເລັດແລ້ວ', 'restored_ticket_template' => 'ແມ່ແບບຟື້ນຟູສຳເລັດແລ້ວ', - 'close_reason' => 'ບອກໃຫ້ພວກເຮົາຮູ້ວ່າເປັນຫຍັງເຈົ້າຈຶ່ງປິດປີ້ນີ້', - 'reopen_reason' => 'ບອກໃຫ້ພວກເຮົາຮູ້ວ່າເປັນຫຍັງທ່ານຈຶ່ງເປີດປີ້ນີ້ຄືນໃໝ່', 'enter_ticket_message' => 'ກະລຸນາໃສ່ຂໍ້ຄວາມເພື່ອອັບເດດປີ້', 'show_hide_all' => 'ສະແດງ / ເຊື່ອງທັງໝົດ', 'subject_required' => 'ວິຊາທີ່ຕ້ອງການ', 'mobile_refresh_warning' => 'ຫາກເຈົ້າກຳລັງໃຊ້ແອັບມືຖື ເຈົ້າອາດຕ້ອງໂຫຼດຂໍ້ມູນຄືນໃໝ່.', - 'enable_proposals_for_background' => 'ເພື່ອອັບໂຫລດຮູບພື້ນຫຼັງ: ລິ້ງເພື່ອເປີດໃຊ້ໂມດູນຂໍ້ສະເໜີ.', - 'ticket_assignment' => 'ປີ້ :ticket_number ໄດ້ຖືກມອບໝາຍໃຫ້: ຕົວແທນ', - 'ticket_contact_reply' => 'ປີ້ :ticket_number ໄດ້ຖືກປັບປຸງໂດຍລູກຄ້າ: ຕິດຕໍ່', - 'ticket_new_template_subject' => 'ປີ້ :ticket_number ໄດ້ຖືກສ້າງຂຶ້ນແລ້ວ.', - 'ticket_updated_template_subject' => 'ປີ້:ticket_number ໄດ້ຖືກປັບປຸງແລ້ວ.', - 'ticket_closed_template_subject' => 'ປີ້:ticket_number ໄດ້ຖືກປິດແລ້ວ.', - 'ticket_overdue_template_subject' => 'ປີ້:ticket_number ດຽວນີ້ໝົດກຳນົດແລ້ວ', 'merge' => 'ລວມ', 'merged' => 'ລວມເຂົ້າກັນ', 'agent' => 'ຕົວແທນ', - 'parent_ticket' => 'ປີ້ພໍ່ແມ່', - 'linked_tickets' => 'ປີ້ທີ່ເຊື່ອມຕໍ່', - 'merge_prompt' => 'ໃສ່ໝາຍເລກປີ້ເຂົ້າໃສ່', - 'merge_from_to' => 'ປີ້ #:old_ticket ລວມເຂົ້າເປັນ Ticket #:new_ticket', - 'merge_closed_ticket_text' => 'ປີ້ #:old_ticket ໄດ້ຖືກປິດ ແລະລວມເຂົ້າເປັນ Ticket#:new_ticket - :subject', - 'merge_updated_ticket_text' => 'ປີ້ #:old_ticket ໄດ້ຖືກປິດ ແລະຮວມເຂົ້າກັນໃນປີ້ນີ້', - 'merge_placeholder' => 'ລວມປີ້ #: ປີ້ເຂົ້າໄປໃນປີ້ຕໍ່ໄປນີ້', - 'select_ticket' => 'ເລືອກປີ້', - 'new_internal_ticket' => 'ປີ້ພາຍໃນໃໝ່', - 'internal_ticket' => 'ປີ້ພາຍໃນ', - 'create_ticket' => 'ສ້າງປີ້', - 'allow_inbound_email_tickets_external' => 'ປີ້ໃໝ່ທາງອີເມວ (ລູກຄ້າ)', - 'allow_inbound_email_tickets_external_help' => 'ອະນຸຍາດໃຫ້ລູກຄ້າສ້າງປີ້ໃຫມ່ທາງອີເມວ', 'include_in_filter' => 'ລວມຢູ່ໃນຕົວກອງ', 'custom_client1' => ':VALUE', 'custom_client2' => ':VALUE', @@ -5334,7 +5301,8 @@ $lang = array( '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', ); return $lang; \ No newline at end of file diff --git a/lang/lt/texts.php b/lang/lt/texts.php index 50daaf7ce971..c03003a16a56 100644 --- a/lang/lt/texts.php +++ b/lang/lt/texts.php @@ -199,7 +199,7 @@ $lang = array( 'removed_logo' => 'Logo ištrintas sėkmingai', 'sent_message' => 'Žinutė išsiųsta', 'invoice_error' => 'Pasitinkite klientą ir pataisykite klaidas', - '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' => 'There was an error processing your payment. Please try again later.', 'registration_required' => 'Būtina registracija', 'confirmation_required' => 'Prašome patvirtinti jūsų el.pašto adresą, :link jei norite dar kartą atsiųsti patvirtinimo laišką.', @@ -2197,7 +2197,7 @@ $lang = array( 'mailgun_private_key' => 'Mailgun Private Key', 'brevo_domain' => 'Brevo Domain', 'brevo_private_key' => 'Brevo Private Key', - 'send_test_email' => 'Send test email', + 'send_test_email' => 'Send Test Email', 'select_label' => 'Select Label', 'label' => 'Label', 'service' => 'Service', @@ -2695,7 +2695,7 @@ $lang = array( 'no_assets' => 'No images, drag to upload', 'add_image' => 'Add Image', 'select_image' => 'Select Image', - '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' => 'Delete Image', 'delete_image_help' => 'Perspėjimas: ištrynus nuotrauką ji bus pašalinta iš visų pasiūlymų', 'amount_variable_help' => 'Note: the invoice $amount field will use the partial/deposit field if set otherwise it will use the invoice balance.', @@ -2934,13 +2934,6 @@ $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.', @@ -2957,8 +2950,6 @@ $lang = array( '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' => 'Default Agent', 'default_agent_help' => 'If selected will automatically be assigned to all inbound tickets', 'show_agent_details' => 'Show agent details on responses', @@ -2966,43 +2957,19 @@ $lang = array( 'remove_avatar' => 'Remove avatar', 'ticket_not_found' => 'Ticket not found', 'add_template' => 'Pridėti Šabloną', - 'ticket_template' => 'Bilieto Šablonas', - 'ticket_templates' => 'Bilieto Šablonai', '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', 'restored_ticket_template' => 'Sėkmingai atkurtas šablonas', - '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' => 'Show / Hide all', 'subject_required' => 'Subject required', 'mobile_refresh_warning' => 'If you\'re using the mobile app you may need to do a full refresh.', - 'enable_proposals_for_background' => 'Norėdami užkelti fono nuotrauką :link kad įgalintumėte pasiūlymų modulį.', - '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' => 'Merge', 'merged' => 'Merged', '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' => 'Include in filter', 'custom_client1' => ':VALUE', 'custom_client2' => ':VALUE', @@ -4029,7 +3996,7 @@ $lang = array( 'user_detached' => 'User detached from company', 'create_webhook_failure' => 'Failed to create Webhook', 'payment_message_extended' => 'Thank you for your payment of :amount for :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', @@ -4170,7 +4137,7 @@ $lang = array( 'one_time_purchases' => 'One time purchases', 'recurring_purchases' => 'Recurring purchases', 'you_might_be_interested_in_following' => 'You might be interested in the following', - 'quotes_with_status_sent_can_be_approved' => 'Only quotes with "Sent" status can be approved.', + 'quotes_with_status_sent_can_be_approved' => 'Only quotes with "Sent" status can be approved. Expired quotes cannot be approved.', 'no_quotes_available_for_download' => 'No quotes available for download.', 'copyright' => 'Copyright', 'user_created_user' => ':user created :created_user at :time', @@ -4437,7 +4404,7 @@ $lang = array( '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' => 'Is Paid', 'age_group_paid' => 'Paid', @@ -5147,7 +5114,7 @@ $lang = array( '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 +5262,47 @@ $lang = array( 'flutter_web_warning' => 'We recommend using the new web app or the desktop app for the best performance', 'rappen_rounding' => 'Rappen Rounding', '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', ); -return $lang; +return $lang; \ No newline at end of file diff --git a/lang/lv_LV/texts.php b/lang/lv_LV/texts.php index b0a80cbf4fea..8cabdf50d29f 100644 --- a/lang/lv_LV/texts.php +++ b/lang/lv_LV/texts.php @@ -199,7 +199,7 @@ $lang = array( 'removed_logo' => 'Veiksmīgi noņemts logotips', 'sent_message' => 'Veiksmīgi nosūtīts ziņojums', 'invoice_error' => 'Please make sure to select a client and correct any errors', - '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' => 'There was an error processing your payment. Please try again later.', 'registration_required' => 'Registration Required', 'confirmation_required' => 'Please confirm your email address, :link to resend the confirmation email.', @@ -2695,7 +2695,7 @@ $lang = array( 'no_assets' => 'No images, drag to upload', 'add_image' => 'Pievienot attēlu', 'select_image' => 'Izvēlēties attēlu', - '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' => 'Dzēst attēlu', '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.', @@ -2934,13 +2934,6 @@ $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' => 'Jauns komentārs', 'alert_comment_ticket_help' => 'Selecting a template will send a notification (to agent) when a comment is made.', @@ -2957,8 +2950,6 @@ $lang = array( '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' => 'Default Agent', 'default_agent_help' => 'If selected will automatically be assigned to all inbound tickets', 'show_agent_details' => 'Show agent details on responses', @@ -2966,43 +2957,19 @@ $lang = array( 'remove_avatar' => 'Remove avatar', 'ticket_not_found' => 'Ticket not found', 'add_template' => 'Add Template', - 'ticket_template' => 'Ticket Template', - 'ticket_templates' => 'Ticket Templates', 'updated_ticket_template' => 'Updated Ticket Template', 'created_ticket_template' => 'Created Ticket Template', 'archive_ticket_template' => 'Archive Template', 'restore_ticket_template' => 'Restore Template', 'archived_ticket_template' => 'Successfully archived template', 'restored_ticket_template' => 'Successfully restored template', - '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' => 'Show / Hide all', 'subject_required' => 'Subject required', 'mobile_refresh_warning' => 'If you\'re using the mobile app you may need to do a full refresh.', - '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' => 'Merge', 'merged' => 'Merged', 'agent' => 'Aģents', - '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' => 'Atzīmēt biļeti', - 'new_internal_ticket' => 'Jaunā iekšējā biļete', - 'internal_ticket' => 'Iekšējā biļete', - 'create_ticket' => 'Izveidot biļeti', - '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' => 'Pievienot filtram', 'custom_client1' => ':VALUE', 'custom_client2' => ':VALUE', @@ -4029,7 +3996,7 @@ $lang = array( 'user_detached' => 'User detached from company', 'create_webhook_failure' => 'Failed to create Webhook', 'payment_message_extended' => 'Thank you for your payment of :amount for :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', @@ -4437,7 +4404,7 @@ $lang = array( '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' => 'Is Paid', 'age_group_paid' => 'Paid', @@ -5147,7 +5114,7 @@ $lang = array( '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', @@ -5297,6 +5264,45 @@ $lang = array( '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', ); -return $lang; +return $lang; \ No newline at end of file diff --git a/lang/mk_MK/texts.php b/lang/mk_MK/texts.php index 59e8fc47c975..b72e2dac8e11 100644 --- a/lang/mk_MK/texts.php +++ b/lang/mk_MK/texts.php @@ -200,7 +200,7 @@ $lang = array( 'removed_logo' => 'Успешно отстранување на лого', 'sent_message' => 'Успешно пратена порака', 'invoice_error' => 'Ве молиме одберете клиент и поправете можни грешки', - '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' => 'Има грешка при процесирањето на плаќањето. Ве молиме обидете се повторно подоцна.', 'registration_required' => 'Registration Required', 'confirmation_required' => 'Ве молиме потврдете ја Вашата адреса за е-пошта, :link за повторно испраќање на е-пошта за потврда.', @@ -2696,7 +2696,7 @@ $lang = array( 'no_assets' => 'Нема слики, повлечи за прикачување', 'add_image' => 'Додај слика', 'select_image' => 'Избери слика', - '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' => 'Избриши слика', 'delete_image_help' => 'Предупредување: со бришење на сликата таа ќе биде отстранета од сите предлози.', 'amount_variable_help' => 'Забелешка: полето за $износ на фактурата ќе го користи полето за делумно/депозит а ако е поставено поинаку, ќе го користи сумата по фактурата.', @@ -2935,13 +2935,6 @@ $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.', @@ -2958,8 +2951,6 @@ $lang = array( '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' => 'Default Agent', 'default_agent_help' => 'If selected will automatically be assigned to all inbound tickets', 'show_agent_details' => 'Show agent details on responses', @@ -2967,43 +2958,19 @@ $lang = array( 'remove_avatar' => 'Remove avatar', 'ticket_not_found' => 'Ticket not found', 'add_template' => 'Add Template', - 'ticket_template' => 'Ticket Template', - 'ticket_templates' => 'Ticket Templates', 'updated_ticket_template' => 'Updated Ticket Template', 'created_ticket_template' => 'Created Ticket Template', 'archive_ticket_template' => 'Archive Template', 'restore_ticket_template' => 'Restore Template', 'archived_ticket_template' => 'Successfully archived template', 'restored_ticket_template' => 'Successfully restored template', - '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' => 'Show / Hide all', 'subject_required' => 'Subject required', 'mobile_refresh_warning' => 'Ако ја користите мобилната апликација можеби ќе треба да направите целосно освежување.', - 'enable_proposals_for_background' => 'За да прикажите позадинска слика :link за овозможување на модулот за предлози.', - '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' => 'Merge', 'merged' => 'Merged', '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' => 'Include in filter', 'custom_client1' => ':VALUE', 'custom_client2' => ':VALUE', @@ -4030,7 +3997,7 @@ $lang = array( 'user_detached' => 'User detached from company', 'create_webhook_failure' => 'Failed to create Webhook', 'payment_message_extended' => 'Thank you for your payment of :amount for :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', @@ -4438,7 +4405,7 @@ $lang = array( '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' => 'Is Paid', 'age_group_paid' => 'Paid', @@ -5148,7 +5115,7 @@ $lang = array( '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', @@ -5298,6 +5265,45 @@ $lang = array( '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', ); -return $lang; +return $lang; \ No newline at end of file diff --git a/lang/nl/texts.php b/lang/nl/texts.php index d2b930c8d050..1b6a8f040e6a 100644 --- a/lang/nl/texts.php +++ b/lang/nl/texts.php @@ -2931,13 +2931,6 @@ 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' => 'Het ticketnummer moet groter zijn dan het huidige ticket nummer', - 'new_ticket_template_id' => 'Nieuw ticket', - 'new_ticket_autoresponder_help' => 'Het selecteren van een sjabloon zal ertoe leiden dat een automatische reactie wordt gestuurd naar de klant/contact wanneer een nieuw ticket wordt aangemaakt', - 'update_ticket_template_id' => 'Bijgewerkt ticket', - 'update_ticket_autoresponder_help' => 'Het selecteren van een sjabloon zal ertoe leiden dat een automatische reactie wordt verstuurd naar de klant/contact wanneer een ticket wordt bijgewerkt', - 'close_ticket_template_id' => 'Gesloten ticket', - 'close_ticket_autoresponder_help' => 'Het selecteren van een sjabloon zal ertoe leiden dat een automatische reactie wordt verstuurd naar de klant/contact wanneer een ticket wordt gesloten', '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.', @@ -2954,8 +2947,6 @@ Kom terug naar deze betalingsmethode pagina zodra u de bedragen heeft ontvangen '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.', - 'ticket_master' => 'Ticketmaster', - 'ticket_master_help' => 'Heeft de mogelijkheid om tickets toe te wijzen en over te dragen. Toegewezen als de standaard agent voor alle tickets.', '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', @@ -2963,43 +2954,19 @@ Kom terug naar deze betalingsmethode pagina zodra u de bedragen heeft ontvangen 'remove_avatar' => 'Verwijder avatar', 'ticket_not_found' => 'Ticket niet gevonden', 'add_template' => 'Sjabloon toevoegen', - 'ticket_template' => 'Ticketsjabloon', - 'ticket_templates' => 'Ticketsjablonen', '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', 'restored_ticket_template' => 'Het sjabloon is hersteld', - 'close_reason' => 'Laat ons weten waarom u dit ticket sluit', - 'reopen_reason' => 'Laat ons weten waarom u dit ticket heropent', 'enter_ticket_message' => 'Gelieve een bericht in te geven om het ticket aan te passen', 'show_hide_all' => 'Toon / verberg alles', 'subject_required' => 'Onderwerp vereist', 'mobile_refresh_warning' => 'Als u de mobiele app gebruikt, moet u mogelijk een volledige vernieuwing uitvoeren.', - 'enable_proposals_for_background' => 'Een achtergrondafbeelding uploaden :link om de voorstellenmodule in te schakelen.', - 'ticket_assignment' => 'Ticket :ticket_number is toegewezen aan :agent', - 'ticket_contact_reply' => 'Ticket :ticket_number is bijgewerkt door klant :contact', - 'ticket_new_template_subject' => 'Ticket :ticket_number is aangemaakt.', - 'ticket_updated_template_subject' => 'Ticket :ticket_number is bijgewerkt.', - 'ticket_closed_template_subject' => 'Ticket :ticket_number is gesloten.', - 'ticket_overdue_template_subject' => 'Ticket :ticket_number is nu achterstallig', 'merge' => 'Samenvoegen', 'merged' => 'Samengevoegd', 'agent' => 'Agent', - 'parent_ticket' => 'Hoofdticket', - 'linked_tickets' => 'Gelinkte tickets', - 'merge_prompt' => 'Voer ticketnummer in om met samen te voegen', - 'merge_from_to' => 'Ticket #:old_ticket is samengevoegd met ticket #:new_ticket', - 'merge_closed_ticket_text' => 'Ticket :#old_ticket is gesloten en samengevoegd met ticket #:new_ticket - :subject', - 'merge_updated_ticket_text' => 'Ticket #:old_ticket is gesloten en samengevoegd met dit ticket', - 'merge_placeholder' => 'Ticket #:ticket samenvoegen met het volgende ticket', - 'select_ticket' => 'Selecteer een ticket', - 'new_internal_ticket' => 'Nieuw intern ticket', - 'internal_ticket' => 'Intern ticket', - 'create_ticket' => 'Creëer ticket', - 'allow_inbound_email_tickets_external' => 'Nieuwe tickets per e-mail (klant)', - 'allow_inbound_email_tickets_external_help' => 'Laat klanten per e-mail nieuwe tickets aanmaken', 'include_in_filter' => 'Opnemen in filter', 'custom_client1' => ':VALUE', 'custom_client2' => ':VALUE', @@ -5334,7 +5301,8 @@ Email: :email
', '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' + 'end_of_month' => 'End Of Month', + 'merge_e_invoice_to_pdf' => 'Merge E-Invoice and PDF', ); return $lang; \ No newline at end of file diff --git a/lang/pt_BR/texts.php b/lang/pt_BR/texts.php index ecb0ffea95e5..0679b128c9da 100644 --- a/lang/pt_BR/texts.php +++ b/lang/pt_BR/texts.php @@ -2931,13 +2931,6 @@ 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' => 'O número do Ticket precisa ser maior que o número de ticket atual', - 'new_ticket_template_id' => 'Novo Ticket', - 'new_ticket_autoresponder_help' => 'Selecionar um modelo enviará uma resposta automática para um cliente/contato quando um novo Ticket for criado', - 'update_ticket_template_id' => 'Ticket atualizado', - 'update_ticket_autoresponder_help' => 'Selecionar um modelo enviará uma resposta automática para um cliente/contato quando um novo Ticket for atualizado', - 'close_ticket_template_id' => 'Ticket fechado', - 'close_ticket_autoresponder_help' => 'Selecionar um modelo enviará uma resposta automática para um cliente/contato quando um novo Ticket for fechado', '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.', @@ -2954,8 +2947,6 @@ Quando tiver as quantias, volte a esta página de formas de pagamento e clique " '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. ', - 'ticket_master' => 'Gestor de Tickets', - 'ticket_master_help' => 'Possui a habilidade de atribuir e transferir Tickets. Atribuído como o agente padrão para todos os Tickets.', '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', @@ -2963,43 +2954,19 @@ Quando tiver as quantias, volte a esta página de formas de pagamento e clique " 'remove_avatar' => 'Remover avatar', 'ticket_not_found' => 'Ticket não encontrado', 'add_template' => 'Adicionar Modelo', - 'ticket_template' => 'Modelo de Ticket', - 'ticket_templates' => 'Modelos de Tickets', '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', 'restored_ticket_template' => 'Modelo restaurado com sucesso', - 'close_reason' => 'Conte-nos o motivo de você estar fechando este ticket', - 'reopen_reason' => 'Conte-nos o motivo de você estar reabrindo este ticket', 'enter_ticket_message' => 'Por favor digite uma mensagem para atualizar o ticket', 'show_hide_all' => 'Exibir / Esconder tudo', 'subject_required' => 'Assunto obrigatório', 'mobile_refresh_warning' => 'Se você está utilizando o app móvel você pode precisar executar um refresh total.', - 'enable_proposals_for_background' => 'Para enviar uma imagem de fundo :link para habilitar o módulo de propostas', - 'ticket_assignment' => 'Ticket :ticket_number foi atribuído para :agent', - 'ticket_contact_reply' => 'Ticket :ticket_number foi atualizado pelo cliente :contact', - 'ticket_new_template_subject' => 'Ticket :ticket_number foi criado.', - 'ticket_updated_template_subject' => 'Ticket :ticket_number foi atualizado.', - 'ticket_closed_template_subject' => 'Ticket :ticket_number foi fechado.', - 'ticket_overdue_template_subject' => 'Ticket :ticket_number agora está atrasado', 'merge' => 'Unir', 'merged' => 'Unidos', 'agent' => 'Agente', - 'parent_ticket' => 'Ticket Pai', - 'linked_tickets' => 'Tickets Vinculados', - 'merge_prompt' => 'Digite o número do ticket para união', - 'merge_from_to' => 'Ticket #:old_ticket unido ao Ticket #:new_ticket', - 'merge_closed_ticket_text' => 'Ticket #:old_ticket foi fechado e unido ao Ticket #:new_ticket - :subject', - 'merge_updated_ticket_text' => 'Ticket #:old_ticket foi fechado e unido a este ticket', - 'merge_placeholder' => 'Unir ticket #:ticket no seguinte ticket', - 'select_ticket' => 'Selecione um Ticket', - 'new_internal_ticket' => 'Novo ticket interno', - 'internal_ticket' => 'Ticket interno', - 'create_ticket' => 'Criar ticket', - 'allow_inbound_email_tickets_external' => 'Novos Tickets por email (Cliente)', - 'allow_inbound_email_tickets_external_help' => 'Permitir que clientes criem novos Tickets por email', 'include_in_filter' => 'Incluir no filtro', 'custom_client1' => ':VALUE', 'custom_client2' => ':VALUE', @@ -5331,7 +5298,8 @@ Quando tiver as quantias, volte a esta página de formas de pagamento e clique " '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' + 'end_of_month' => 'End Of Month', + 'merge_e_invoice_to_pdf' => 'Merge E-Invoice and PDF', ); return $lang; \ No newline at end of file diff --git a/lang/pt_PT/texts.php b/lang/pt_PT/texts.php index 656264d2df44..912be7d90d4d 100644 --- a/lang/pt_PT/texts.php +++ b/lang/pt_PT/texts.php @@ -2933,13 +2933,6 @@ 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' => 'O número do Bilhete precisa ser maior que o número de Bilhete atual', - 'new_ticket_template_id' => 'Novo Bilhete', - 'new_ticket_autoresponder_help' => 'Selecionar um modelo enviará uma resposta automática para um cliente/contato quando um novo bilhete for criado', - 'update_ticket_template_id' => 'Bilhete atualizado', - 'update_ticket_autoresponder_help' => 'Selecionar um modelo enviará uma resposta automática para um cliente/contato quando um novo Bilhete for atualizado', - 'close_ticket_template_id' => 'Bilhete fechado', - 'close_ticket_autoresponder_help' => 'Selecionar um modelo enviará uma resposta automática para um cliente/contato quando um novo Bilhete for fechado', '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.', @@ -2956,8 +2949,6 @@ debitar da sua conta de acordo com essas instruções. Está elegível a um reem '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. ', - 'ticket_master' => 'Gestor de Tickets', - 'ticket_master_help' => 'Possui a habilidade de atribuir e transferir Tickets. Atribuído como o agente padrão para todos os Tickets.', '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', @@ -2965,43 +2956,19 @@ debitar da sua conta de acordo com essas instruções. Está elegível a um reem 'remove_avatar' => 'Remover avatar', 'ticket_not_found' => 'Ticket não encontrado', 'add_template' => 'Adicionar Modelo', - 'ticket_template' => 'Modelo de Ticket', - 'ticket_templates' => 'Modelos de Tickets', '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', 'restored_ticket_template' => 'Modelo restaurado com sucesso', - 'close_reason' => 'Conte-nos o motivo para o fecho deste ticket', - 'reopen_reason' => 'Conte-nos o motivo para a reabertura deste ticket', 'enter_ticket_message' => 'Por favor introduza uma mensagem para atualizar o ticket', 'show_hide_all' => 'Exibir / Esconder tudo', 'subject_required' => 'Assunto obrigatório', 'mobile_refresh_warning' => 'Se estiver a utilizar a aplicação móvel pode ser necessário realizar um recarregamento total.', - 'enable_proposals_for_background' => 'Para enviar uma imagem de fundo :link para habilitar o módulo de propostas', - 'ticket_assignment' => 'Ticket :ticket_number foi atribuído para :agent', - 'ticket_contact_reply' => 'Ticket :ticket_number foi atualizado pelo cliente :contact', - 'ticket_new_template_subject' => 'Ticket :ticket_number foi criado.', - 'ticket_updated_template_subject' => 'Ticket :ticket_number foi atualizado.', - 'ticket_closed_template_subject' => 'Ticket :ticket_number foi fechado.', - 'ticket_overdue_template_subject' => 'Ticket :ticket_number agora está atrasado', 'merge' => 'Unir', 'merged' => 'Unidos', 'agent' => 'Agente', - 'parent_ticket' => 'Ticket Principal', - 'linked_tickets' => 'Tickets Vinculados', - 'merge_prompt' => 'Digite o número do ticket para união', - 'merge_from_to' => 'Ticket #:old_ticket unido ao Ticket #:new_ticket', - 'merge_closed_ticket_text' => 'Ticket #:old_ticket foi fechado e unido ao Ticket #:new_ticket - :subject', - 'merge_updated_ticket_text' => 'Ticket #:old_ticket foi fechado e unido a este ticket', - 'merge_placeholder' => 'Unir ticket #:ticket no seguinte ticket', - 'select_ticket' => 'Selecione um Ticket', - 'new_internal_ticket' => 'Novo ticket interno', - 'internal_ticket' => 'Ticket interno', - 'create_ticket' => 'Criar ticket', - 'allow_inbound_email_tickets_external' => 'Novos Tickets por email (Cliente)', - 'allow_inbound_email_tickets_external_help' => 'Permitir que clientes criem novos Tickets por email', 'include_in_filter' => 'Incluir no filtro', 'custom_client1' => ':VALUE', 'custom_client2' => ':VALUE', @@ -5334,7 +5301,8 @@ O envio de E-mails foi suspenso. Será retomado às 23:00 UTC.', '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' + 'end_of_month' => 'End Of Month', + 'merge_e_invoice_to_pdf' => 'Merge E-Invoice and PDF', ); return $lang; \ No newline at end of file diff --git a/lang/ro/texts.php b/lang/ro/texts.php index 6e78c5006972..268f088212ca 100644 --- a/lang/ro/texts.php +++ b/lang/ro/texts.php @@ -2935,13 +2935,6 @@ 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' => 'Numărul tichetului trebuie să fie mai mare decât numărul actual al tichetului', - 'new_ticket_template_id' => 'Tichet nou', - 'new_ticket_autoresponder_help' => 'Selectând un șablon, veți trimite un răspuns automat clientului/contactului, când este creat un tichet nou.', - 'update_ticket_template_id' => 'Tichet actualizat', - 'update_ticket_autoresponder_help' => 'Selectând un șablon, veți trimite un răspuns automat clientului/contactului, când este actualizat un tichet.', - 'close_ticket_template_id' => 'Tichet inchis', - 'close_ticket_autoresponder_help' => 'Selectând un șablon, veți trimite un răspuns automat clientului/contactului, când este închis un tichet.', '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.', @@ -2958,8 +2951,6 @@ Odată ce sumele au ajuns la dumneavoastră, reveniți la pagina cu metode de pl '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ă.', - 'ticket_master' => 'Ticket Master', - 'ticket_master_help' => 'Poate să atribuie și să transfere tichete. Desemnat ca agent implicit pentru toate tichetele.', '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', @@ -2967,43 +2958,19 @@ Odată ce sumele au ajuns la dumneavoastră, reveniți la pagina cu metode de pl 'remove_avatar' => 'Îndepărtați avatar', 'ticket_not_found' => 'Tichetul nu a fost găsit', 'add_template' => 'Adăugați un șablon', - 'ticket_template' => 'Șablon pentru tichete', - 'ticket_templates' => 'Șabloane pentru tichete', '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', 'restored_ticket_template' => 'Șablonul a fost restabilit cu succes', - 'close_reason' => 'Am dori să aflăm care este motivul pentru care închideți acest tichet', - 'reopen_reason' => 'Am dori să aflăm care este motivul pentru care redeschideți acest tichet', 'enter_ticket_message' => 'Introduceți un mesaj pentru a actualiza tichetul', 'show_hide_all' => 'Arată / Ascunde tot', 'subject_required' => 'Subiect Obligatoriu', 'mobile_refresh_warning' => 'În cazul în care utilizați aplicația pentru telefon, este posibil să fie nevoie să reîncărcați pagina complet.', - 'enable_proposals_for_background' => 'Pentru a încărca o imagine de fundal, :link pentru a activa modulul pentru propuneri.', - 'ticket_assignment' => 'Tichetul :ticket_number i-a fost atribuit (lui) :agent', - 'ticket_contact_reply' => 'Tichetul :ticket_number a fost actualizat de clientul :contact', - 'ticket_new_template_subject' => 'Tichetul :ticket_number a fost creat.', - 'ticket_updated_template_subject' => 'Tichetul :ticket_number a fost actualizat.', - 'ticket_closed_template_subject' => 'Tichetul :ticket_number a fost închis.', - 'ticket_overdue_template_subject' => 'Tichetul :ticket_number a depășit data limită.', 'merge' => 'Îmbinați', 'merged' => 'Îmbinate', 'agent' => 'Agent', - 'parent_ticket' => 'Tichet Părinte', - 'linked_tickets' => 'Tichete conexe', - 'merge_prompt' => 'Introduceți numărul tichetului pentru a-l îmbina cu', - 'merge_from_to' => 'Tichetul #:old_ticket a fost contopit cu Tichetul #:new_ticket ', - 'merge_closed_ticket_text' => 'Tichetul #:old_ticket a fost închis și comasat în Tichet #:new_ticket - :subject', - 'merge_updated_ticket_text' => 'Tichetul #:old_ticket a fost închis și comasat în acest tichet', - 'merge_placeholder' => 'Comasați tichetul #:ticket în următorul tichet', - 'select_ticket' => 'Selectează Tichet', - 'new_internal_ticket' => 'Adaugă Tichet Intern', - 'internal_ticket' => 'Tichet Intern', - 'create_ticket' => 'Crează Tichet', - 'allow_inbound_email_tickets_external' => 'Tichete noi prin email (Client)', - 'allow_inbound_email_tickets_external_help' => 'Permiteți clienților să creeze tichete noi prin email', 'include_in_filter' => 'Includeți în filtru', 'custom_client1' => ':VALUE', 'custom_client2' => ':VALUE', @@ -5335,7 +5302,8 @@ Odată ce sumele au ajuns la dumneavoastră, reveniți la pagina cu metode de pl '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' + 'end_of_month' => 'End Of Month', + 'merge_e_invoice_to_pdf' => 'Merge E-Invoice and PDF', ); return $lang; \ No newline at end of file diff --git a/lang/ru_RU/texts.php b/lang/ru_RU/texts.php index 935fcf185522..880b898e5670 100644 --- a/lang/ru_RU/texts.php +++ b/lang/ru_RU/texts.php @@ -199,7 +199,7 @@ $lang = array( 'removed_logo' => 'Логотип успешно удалён', 'sent_message' => 'Сообщение успешно отправлено', 'invoice_error' => 'Обязательно выберите клиента и исправьте ошибки.', - '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' => 'Произошла ошибка при обработке вашего платежа. Пожалуйста, повторите попытку позже.', 'registration_required' => 'Registration Required', 'confirmation_required' => 'Пожалуйста, подтвердите свой адрес электронной почты, :link, чтобы отправить письмо с подтверждением ещё раз.', @@ -2696,7 +2696,7 @@ $lang = array( 'no_assets' => 'No images, drag to upload', 'add_image' => 'Add Image', 'select_image' => 'Select Image', - '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' => 'Delete Image', '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.', @@ -2935,13 +2935,6 @@ $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_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' => 'закрытый тикет', - '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' => 'Selecting a template will send a notification (to agent) when a comment is made.', @@ -2958,8 +2951,6 @@ $lang = array( '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' => 'Default Agent', 'default_agent_help' => 'If selected will automatically be assigned to all inbound tickets', 'show_agent_details' => 'Show agent details on responses', @@ -2967,43 +2958,19 @@ $lang = array( 'remove_avatar' => 'Удалить аватар', 'ticket_not_found' => 'Тикет не найден', 'add_template' => 'Добавить Шаблон', - 'ticket_template' => 'Шаблон Тикета', - 'ticket_templates' => 'Шаблоны Тикетов', 'updated_ticket_template' => 'Updated Ticket Template', 'created_ticket_template' => 'Created Ticket Template', 'archive_ticket_template' => 'Архивировать шаблон', 'restore_ticket_template' => 'Восстановить шаблон', 'archived_ticket_template' => 'Successfully archived template', 'restored_ticket_template' => 'Successfully restored template', - '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' => 'Пожалуйста, введите сообщение для того чтобы обновить тикет', 'show_hide_all' => 'Показать / Скрыть всё', 'subject_required' => 'Требуется ввести Тему', 'mobile_refresh_warning' => 'If you\'re using the mobile app you may need to do a full refresh.', - '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' => 'Объединить', 'merged' => 'Обединён', 'agent' => 'Агент', - 'parent_ticket' => 'Родительский Тикет', - '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' => 'Выбирите тикет', - 'new_internal_ticket' => 'Новый внутренний тикет', - 'internal_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' => 'Include in filter', 'custom_client1' => ':VALUE', 'custom_client2' => ':VALUE', @@ -4030,7 +3997,7 @@ $lang = array( 'user_detached' => 'User detached from company', 'create_webhook_failure' => 'Failed to create Webhook', 'payment_message_extended' => 'Thank you for your payment of :amount for :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', @@ -4438,7 +4405,7 @@ $lang = array( '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' => 'Is Paid', 'age_group_paid' => 'Paid', @@ -5148,7 +5115,7 @@ $lang = array( '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', @@ -5298,6 +5265,45 @@ $lang = array( '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', ); -return $lang; +return $lang; \ No newline at end of file diff --git a/lang/sk/texts.php b/lang/sk/texts.php index bdc5336eb90d..5f001c7e7359 100644 --- a/lang/sk/texts.php +++ b/lang/sk/texts.php @@ -2921,13 +2921,6 @@ $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' => 'Číslo tiketu musí byť väčšie ako aktuálne číslo tiketu', - 'new_ticket_template_id' => 'Nový tiket', - 'new_ticket_autoresponder_help' => 'Výberom šablóny sa pri vytvorení nového tiketu odošle automatická odpoveď klientovi/kontaktu', - 'update_ticket_template_id' => 'Aktualizovaný tiket', - 'update_ticket_autoresponder_help' => 'Výberom šablóny sa po aktualizácii lístka odošle automatická odpoveď klientovi/kontaktu', - 'close_ticket_template_id' => 'Uzavretý tiket', - 'close_ticket_autoresponder_help' => 'Výberom šablóny sa po zatvorení tiketu odošle automatická odpoveď klientovi/kontaktu', '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.', @@ -2944,8 +2937,6 @@ $lang = array( '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.', - 'ticket_master' => 'Ticket Master', - 'ticket_master_help' => 'Má schopnosť prideľovať a prenášať tikety. Priradený ako predvolený agent pre všetky tikety.', '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', @@ -2953,43 +2944,19 @@ $lang = array( 'remove_avatar' => 'Odstrániť avatara', 'ticket_not_found' => 'Tiket sa nenašiel', 'add_template' => 'Pridať šablónu', - 'ticket_template' => 'Šablóna tiketu', - 'ticket_templates' => 'Šablóny tiketu', '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á', 'restored_ticket_template' => 'Šablóna úspešne obnovená', - 'close_reason' => 'Dajte nám vedieť, prečo zatvárate tento tiket', - 'reopen_reason' => 'Dajte nám vedieť, prečo znovu otvárate tento lístok', 'enter_ticket_message' => 'Ak chcete aktualizovať tiket, zadajte správu', 'show_hide_all' => 'Zobraziť / Skryť všetko', 'subject_required' => 'Vyžaduje sa predmet', 'mobile_refresh_warning' => 'Ak používate mobilnú aplikáciu, možno budete musieť vykonať úplné obnovenie.', - 'enable_proposals_for_background' => 'Ak chcete nahrať obrázok na pozadí :link na aktiváciu modulu návrhov.', - 'ticket_assignment' => 'Tiket :ticket_number bol priradený :agent', - 'ticket_contact_reply' => 'Tiket :ticket_number bol aktualizovaný klientom :contact', - 'ticket_new_template_subject' => 'Tiket :ticket_number bol vytvorený', - 'ticket_updated_template_subject' => 'Tiket :ticket_number bol aktualizovaný.', - 'ticket_closed_template_subject' => 'Tiket :ticket_number bol uzatvorený.', - 'ticket_overdue_template_subject' => 'Tiket :ticket_number je teraz po splatnosti', 'merge' => 'Spojiť', 'merged' => 'Spojené', 'agent' => 'Agent', - 'parent_ticket' => 'Nadradený tiket', - 'linked_tickets' => 'Prepojené tikety', - 'merge_prompt' => 'Zadajte číslo tiketu na zlúčenie', - 'merge_from_to' => 'Tiket #:old_ticket sa zlúčil do tiketu #:new_ticket', - 'merge_closed_ticket_text' => 'Tiket #:old_ticket bol uzavretý a zlúčený do Ticketu#:new_ticket - :subject', - 'merge_updated_ticket_text' => 'Tiket #:old_ticket bol uzavretý a zlúčený s týmto lístkom', - 'merge_placeholder' => 'Zlúčte tiket #:ticket do nasledujúceho lístka', - 'select_ticket' => 'Vyberte tiket', - 'new_internal_ticket' => 'Nový interný tiket', - 'internal_ticket' => 'Interný tiket', - 'create_ticket' => 'Vytvoriť tiket', - 'allow_inbound_email_tickets_external' => 'Nové tikety cez email (zákazník)', - 'allow_inbound_email_tickets_external_help' => 'Povoliť zákazníkom vytvárať tikety cez email', 'include_in_filter' => 'Zahrnút do filtra', 'custom_client1' => ':VALUE', 'custom_client2' => ':VALUE', @@ -5321,7 +5288,8 @@ $lang = array( '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' + 'end_of_month' => 'End Of Month', + 'merge_e_invoice_to_pdf' => 'Merge E-Invoice and PDF', ); return $lang; \ No newline at end of file diff --git a/lang/sl/texts.php b/lang/sl/texts.php index b0a586907305..f818a5ca1d67 100644 --- a/lang/sl/texts.php +++ b/lang/sl/texts.php @@ -199,7 +199,7 @@ $lang = array( 'removed_logo' => 'Uspešno odstranjen logotip', 'sent_message' => 'Sporočilo uspešno poslano', 'invoice_error' => 'Prosim izberite stranko in popravite napake', - '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' => 'Pri izvedbi plačila je prišlo do napake. Prosim poizkusite ponovno.', 'registration_required' => 'Registration Required', 'confirmation_required' => 'Prosim potrdite vaš elektronski naslov, :link za ponovno pošiljanje potrditvenega sporočila.', @@ -2696,7 +2696,7 @@ Ko imate zneske, se vrnite na to stran plačilnega sredstva in kliknite na "Comp 'no_assets' => 'Ni slik, povleci za upload', 'add_image' => 'Dodaj Sliko', 'select_image' => 'Izberi Sliko', - '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' => 'Zbriši Sliko', 'delete_image_help' => 'Opozorilo: če odstranite sliko, bo odstranjena iz vseh ponudb.', 'amount_variable_help' => 'Opomba: na računu v polju $amount /znesek računa/ bo uporabjena vrednost iz polja "partial/deposit". V kolikor je nastavitev drugačna se bo uporabila skupna vrednost računa.', @@ -2935,13 +2935,6 @@ Ko imate zneske, se vrnite na to stran plačilnega sredstva in kliknite na "Comp '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' => 'Št. podpornega zahtevka mora biti večja od trenutnega podpornega zahtevka', - 'new_ticket_template_id' => 'Novi podproni zahtevek', - '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' => 'Posodabi podporni zahtevek', - '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' => 'Zaprt podporni zahtevek', - '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.', @@ -2958,8 +2951,6 @@ Ko imate zneske, se vrnite na to stran plačilnega sredstva in kliknite na "Comp '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' => 'Default Agent', 'default_agent_help' => 'If selected will automatically be assigned to all inbound tickets', 'show_agent_details' => 'Show agent details on responses', @@ -2967,43 +2958,19 @@ Ko imate zneske, se vrnite na to stran plačilnega sredstva in kliknite na "Comp 'remove_avatar' => 'Remove avatar', 'ticket_not_found' => 'Ticket not found', 'add_template' => 'Add Template', - 'ticket_template' => 'Ticket Template', - 'ticket_templates' => 'Ticket Templates', 'updated_ticket_template' => 'Updated Ticket Template', 'created_ticket_template' => 'Created Ticket Template', 'archive_ticket_template' => 'Archive Template', 'restore_ticket_template' => 'Restore Template', 'archived_ticket_template' => 'Successfully archived template', 'restored_ticket_template' => 'Successfully restored template', - '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' => 'Show / Hide all', 'subject_required' => 'Subject required', 'mobile_refresh_warning' => 'If you\'re using the mobile app you may need to do a full refresh.', - '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' => 'Merge', 'merged' => 'Merged', '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' => 'Include in filter', 'custom_client1' => ':VALUE', 'custom_client2' => ':VALUE', @@ -4030,7 +3997,7 @@ Ko imate zneske, se vrnite na to stran plačilnega sredstva in kliknite na "Comp 'user_detached' => 'User detached from company', 'create_webhook_failure' => 'Failed to create Webhook', 'payment_message_extended' => 'Thank you for your payment of :amount for :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', @@ -4438,7 +4405,7 @@ Ko imate zneske, se vrnite na to stran plačilnega sredstva in kliknite na "Comp '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' => 'Is Paid', 'age_group_paid' => 'Paid', @@ -5148,7 +5115,7 @@ Ko imate zneske, se vrnite na to stran plačilnega sredstva in kliknite na "Comp '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', @@ -5298,6 +5265,45 @@ Ko imate zneske, se vrnite na to stran plačilnega sredstva in kliknite na "Comp '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', ); -return $lang; +return $lang; \ No newline at end of file diff --git a/lang/sr/texts.php b/lang/sr/texts.php index 616b5db0f574..03d8ab5136f5 100644 --- a/lang/sr/texts.php +++ b/lang/sr/texts.php @@ -199,7 +199,7 @@ $lang = array( 'removed_logo' => 'Logo je uspešno uklonjen', 'sent_message' => 'Poruka je uspešno poslata', 'invoice_error' => 'Molimo proverite da li ste odaberali klijenta i korigujte greške', - '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' => 'Došlo je do greške pri procesiranju vaše uplate. Molimo pokušajte kasnije.', 'registration_required' => 'Registration Required', 'confirmation_required' => 'Molimo Vas da potvrdite adresu vaše e-pošte, :link za ponovno slanje konfirmacione e-poruke.', @@ -2695,7 +2695,7 @@ Kada budete imali iznose, vratite se na ovu stranicu sa načinima plaćanja i k 'no_assets' => 'Nema slika, prevucite da biste otpremili', 'add_image' => 'Dodaj fotografiju', 'select_image' => 'Izaberi fotografiju', - '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' => 'Izbriši fotografiju', 'delete_image_help' => 'Upozorenje: brisanje fotografije će je ukloniti sa svih ponuda.', 'amount_variable_help' => 'Napomena: polje računa $amount će koristiti polje za avans/depozit ako postoji, inače će koristiti stanje računa.', @@ -2934,13 +2934,6 @@ 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' => 'Broj tiketa mora biti viši od broja aktuelnog tiketa', - 'new_ticket_template_id' => 'Novi tiket', - 'new_ticket_autoresponder_help' => 'Izborom šablona će se poslati automatski odgovor klijentu/kontaktu prilikom kreiranja novog tiketa', - 'update_ticket_template_id' => 'Ažuriran tiket', - 'update_ticket_autoresponder_help' => 'Izbor šablona će poslati automatski odgovor klijentu/kontaktu kada se tiket ažurira', - 'close_ticket_template_id' => 'Zatvoren tiket', - 'close_ticket_autoresponder_help' => 'Izbor šablona će poslati automatski odgovor klijentu/kontaktu kada se tiket zatvori', '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.', @@ -2957,8 +2950,6 @@ Kada budete imali iznose, vratite se na ovu stranicu sa načinima plaćanja i k '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.', - 'ticket_master' => 'Rukovodilac Tiketa', - 'ticket_master_help' => 'Ima mogućnost da dodeljuje i prenosi tikete. Dodeljen kao podrazumevani agent za sve tikete.', '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', @@ -2966,43 +2957,19 @@ Kada budete imali iznose, vratite se na ovu stranicu sa načinima plaćanja i k 'remove_avatar' => 'Ukloni avatar', 'ticket_not_found' => 'Tiket nije pronađen', 'add_template' => 'Dodaj šablon', - 'ticket_template' => 'Šablon tiketa', - 'ticket_templates' => 'Šabloni tiketa', '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', 'restored_ticket_template' => 'Uspešno vraćen šablon', - 'close_reason' => 'Upišite razlog zatvaranja tiketa', - 'reopen_reason' => 'Upišite razlog ponovnog otvaranja tiketa', 'enter_ticket_message' => 'Unesite poruku da ažurirate tiket', 'show_hide_all' => 'Pokaži / Sakrij sve', 'subject_required' => 'Naslov je obavezan', 'mobile_refresh_warning' => 'Ukoliko koristite mobilnu aplikaciju, potrebno je da osvežite stranicu.', - 'enable_proposals_for_background' => 'Za slanje pozadinske slike :link omogući modul za ponude.', - 'ticket_assignment' => 'Tiket :ticket_number je dodeljen :agent', - 'ticket_contact_reply' => 'Tiket :ticket_number je ažuriran od strane kontakta :contact', - 'ticket_new_template_subject' => 'Tiket :ticket_number je kreiran.', - 'ticket_updated_template_subject' => 'Tiket :ticket_number je ažuriran.', - 'ticket_closed_template_subject' => 'Tiket :ticket_number je zatvoren.', - 'ticket_overdue_template_subject' => 'Tiket :ticket_number je zakasneo', 'merge' => 'Spoji', 'merged' => 'Spojeni', 'agent' => 'Agent', - 'parent_ticket' => 'Nadređeni tiket', - 'linked_tickets' => 'Povezani tiketi', - 'merge_prompt' => 'Unesite broj tiketa za spajanje', - 'merge_from_to' => 'Tiket #:old_ticket je spojen u Tiket #:new_ticket', - 'merge_closed_ticket_text' => 'Tiket #:old_ticket je zatvoren i spojen u Tiket #:new_ticket', - 'merge_updated_ticket_text' => 'Tiket #:old_ticket je zatvoren i spojen u ovaj tiket', - 'merge_placeholder' => 'Spoji tiket #:ticket u sledeći tiket', - 'select_ticket' => 'Izaberi tiket', - 'new_internal_ticket' => 'Novi interni tiket', - 'internal_ticket' => 'Interni tiket', - 'create_ticket' => 'Kreiraj tiket', - 'allow_inbound_email_tickets_external' => 'Novi tiketi preko e-pošte (klijent)', - 'allow_inbound_email_tickets_external_help' => 'Dozvoli klijentima da naprave nove tikete preko e-pošte', 'include_in_filter' => 'Dodaj u filter', 'custom_client1' => ':VALUE', 'custom_client2' => ':VALUE', @@ -4437,7 +4404,7 @@ Kada budete imali iznose, vratite se na ovu stranicu sa načinima plaćanja i k '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' => 'Is Paid', 'age_group_paid' => 'Paid', @@ -5147,7 +5114,7 @@ Kada budete imali iznose, vratite se na ovu stranicu sa načinima plaćanja i k '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', @@ -5300,6 +5267,42 @@ Kada budete imali iznose, vratite se na ovu stranicu sa načinima plaćanja i k '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', ); -return $lang; +return $lang; \ No newline at end of file diff --git a/lang/sv/texts.php b/lang/sv/texts.php index 93a53489e012..b0a95827aad1 100644 --- a/lang/sv/texts.php +++ b/lang/sv/texts.php @@ -2942,13 +2942,6 @@ 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' => 'Ärendenumret måste vara större än det aktuella ärendenumret', - 'new_ticket_template_id' => 'Nytt ärende', - 'new_ticket_autoresponder_help' => 'När du väljer en mall skickas ett automatiskt svar till en kund/kontakt när ett nytt ärende skapas', - 'update_ticket_template_id' => 'Uppdaterat ärende', - 'update_ticket_autoresponder_help' => 'När du väljer en mall skickas ett automatiskt svar till en kund/kontakt när ett ärende uppdateras', - 'close_ticket_template_id' => 'Avslutade ärenden', - 'close_ticket_autoresponder_help' => 'När du väljer en mall skickas ett automatiskt svar till en kund/kontakt när ett ärende avslutas', '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.', @@ -2965,8 +2958,6 @@ Den här funktionen kräver att en produkt skapas och en betalningsgateway är k '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.', - 'ticket_master' => 'Ärendeadministratör', - 'ticket_master_help' => 'Har möjlighet att tilldela och överföra ärenden. Tilldelad som standardagent för alla ärenden.', 'default_agent' => 'Standardagent', 'default_agent_help' => 'Om det väljs kommer alla inkommande ärenden automatiskt att tilldelas', 'show_agent_details' => 'Visa agentinformation vid svar', @@ -2974,43 +2965,19 @@ Den här funktionen kräver att en produkt skapas och en betalningsgateway är k 'remove_avatar' => 'Ta bort avatar', 'ticket_not_found' => 'Ärendet hittades inte', 'add_template' => 'Lägg till mall', - 'ticket_template' => 'Ärendemall', - 'ticket_templates' => 'Ärendemallar', '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', 'restored_ticket_template' => 'Mallen har återställts', - 'close_reason' => 'Låt oss veta varför du stänger ärendet', - 'reopen_reason' => 'Låt oss veta varför du öpnnar ärendet igen', 'enter_ticket_message' => 'Ange ett meddelande för att uppdatera ärendet', 'show_hide_all' => 'Visa / Dölj alla', 'subject_required' => 'Ämne är obligatoriskt', 'mobile_refresh_warning' => 'Om du använder mobilappen kan du behöva göra en fullständig uppdatering.', - 'enable_proposals_for_background' => 'För att ladda upp en bakgrundsbild :link för att aktivera förslag modulen', - 'ticket_assignment' => 'Ärende :ticket_number har tilldelats till :agent', - 'ticket_contact_reply' => 'Ärende :ticket_number har uppdaterats av :contact', - 'ticket_new_template_subject' => 'Ärende :ticket_number har skapats.', - 'ticket_updated_template_subject' => 'Ärende :ticket_number har uppdaterats.', - 'ticket_closed_template_subject' => 'Ärende :ticket_number har stängts.', - 'ticket_overdue_template_subject' => 'Ärende :ticket_number är nu försenat', 'merge' => 'Slå samman', 'merged' => 'Sammanslagen', 'agent' => 'Agent', - 'parent_ticket' => 'Ärendeförälder', - 'linked_tickets' => 'Länkat ärende', - 'merge_prompt' => 'Ange ett ärendenummer som du vill slå ihop', - 'merge_from_to' => 'Ärende #:old_ticket slogs samman med #:new_ticket', - 'merge_closed_ticket_text' => 'Ärende #:old_ticket stängdes och slogs samman med ärende#:new_ticket - :subject', - 'merge_updated_ticket_text' => 'Ärende #:old_ticket stängdes och slogs samman med detta ärende', - 'merge_placeholder' => 'Slå ihop ärende #:ticket med följande ärende', - 'select_ticket' => 'Välj ärende', - 'new_internal_ticket' => 'Nytt internt ärende', - 'internal_ticket' => 'Internt ärende', - 'create_ticket' => 'Skapa ärende', - 'allow_inbound_email_tickets_external' => 'Nya ärende via e-post (kund)', - 'allow_inbound_email_tickets_external_help' => 'Tillåt kunder skapa nya ärende via e-post', 'include_in_filter' => 'Inkludera i filter', 'custom_client1' => ':VALUE', 'custom_client2' => ':VALUE', @@ -5342,7 +5309,8 @@ Den här funktionen kräver att en produkt skapas och en betalningsgateway är k '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' + 'end_of_month' => 'End Of Month', + 'merge_e_invoice_to_pdf' => 'Merge E-Invoice and PDF', ); return $lang; \ No newline at end of file diff --git a/lang/zh_TW/texts.php b/lang/zh_TW/texts.php index cc7cc58c5fe5..e12ddf13d2d0 100644 --- a/lang/zh_TW/texts.php +++ b/lang/zh_TW/texts.php @@ -2934,13 +2934,6 @@ $lang = array( 'mime_types' => 'Mime 類型', 'mime_types_placeholder' => '.pdf , .docx, .jpg', 'mime_types_help' => '逗號分隔的允許的 mime 類型清單, 為所有', - 'ticket_number_start_help' => '票證號必須大於目前票證號', - 'new_ticket_template_id' => '新票證', - 'new_ticket_autoresponder_help' => '選擇範本將在建立新票證時向用戶/連絡人傳送自動回應', - 'update_ticket_template_id' => '更新後的票證', - 'update_ticket_autoresponder_help' => '選擇範本將在更新票證時向用戶/連絡人傳送自動回應', - 'close_ticket_template_id' => '已關閉票證', - 'close_ticket_autoresponder_help' => '選擇範本將在票證關閉時向用戶/連絡人傳送自動回應', 'default_priority' => '預設優先順序', 'alert_new_comment_id' => '新評論', 'alert_comment_ticket_help' => '選取範本將在做出評論時 (向代理) 傳送通知。', @@ -2957,8 +2950,6 @@ $lang = array( 'alert_ticket_overdue_email' => '其它逾期票證通知', 'alert_ticket_overdue_email_help' => '逗號分隔的電子郵件給 bcc 的票證期。', 'alert_ticket_overdue_agent_id_help' => '選取範本將在票證過期時 (向代理) 傳送通知。', - 'ticket_master' => '票證主人', - 'ticket_master_help' => '有分配和傳送票證的能力。 將所有票證分配為給預設代理。', 'default_agent' => '預設代理', 'default_agent_help' => '如果選取,將自動分配給所有入站票證', 'show_agent_details' => '顯示回應的代理詳細資訊', @@ -2966,43 +2957,19 @@ $lang = array( 'remove_avatar' => '刪除頭像', 'ticket_not_found' => '找不到票證', 'add_template' => '加入範本', - 'ticket_template' => '票證範本', - 'ticket_templates' => '票證範本', 'updated_ticket_template' => '已更新票證範本', 'created_ticket_template' => '已建立票證範本', 'archive_ticket_template' => '歸檔範本', 'restore_ticket_template' => '復原範本', 'archived_ticket_template' => '歸檔範本成功', 'restored_ticket_template' => '復原範本成功', - 'close_reason' => '讓我們知道您為何要關閉這張票證', - 'reopen_reason' => '讓我們知道您為何要重新開啟這張票證', 'enter_ticket_message' => '請輸入訊息以更新票證', 'show_hide_all' => '顯示/全部隱藏', 'subject_required' => '需要主旨', 'mobile_refresh_warning' => '若您使用行動 APP,您可能需要做一次重新整理。', - 'enable_proposals_for_background' => '上傳一個背景圖片 :link 以啟用提案模組。', - 'ticket_assignment' => '票證 :ticket_number 已分配給 :agent', - 'ticket_contact_reply' => '用戶 :contact 已更新票證 :ticket_number', - 'ticket_new_template_subject' => '票證 :ticket_number 已建立。', - 'ticket_updated_template_subject' => '票證 :ticket_number 已更新。', - 'ticket_closed_template_subject' => '票證 :ticket_number 已關閉。', - 'ticket_overdue_template_subject' => '票證 :ticket_number 現在過期', 'merge' => '合併', 'merged' => '合併', 'agent' => '代理', - 'parent_ticket' => '上層票證', - 'linked_tickets' => '連結的票證', - 'merge_prompt' => '輸入要合併到的票證號', - 'merge_from_to' => '票證 #:old_ticket 合併到票證 #:new_ticket', - 'merge_closed_ticket_text' => '票證 #:old_ticket 已關閉和合併成票證 #:new_ticket - :subject', - 'merge_updated_ticket_text' => '票證 #:old_ticket 已關閉和合併到這張票證中', - 'merge_placeholder' => '合併票證 #:ticket 到以下票證', - 'select_ticket' => '選取票證', - 'new_internal_ticket' => '新的內部票證', - 'internal_ticket' => '內部票證', - 'create_ticket' => '建立票證', - 'allow_inbound_email_tickets_external' => '透過電子郵件的新票證 (用戶)', - 'allow_inbound_email_tickets_external_help' => '允許用戶以電子郵件建立票證', 'include_in_filter' => '包含在篩選器', 'custom_client1' => ':VALUE', 'custom_client2' => ':VALUE', @@ -5334,7 +5301,8 @@ $lang = array( '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' + 'end_of_month' => 'End Of Month', + 'merge_e_invoice_to_pdf' => 'Merge E-Invoice and PDF', ); return $lang; \ No newline at end of file From ba7651cdae722305b68826457cb624f3b3579d46 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Fri, 21 Jun 2024 19:51:04 +1000 Subject: [PATCH 16/20] Fixes for tests --- app/DataMapper/CompanySettings.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/DataMapper/CompanySettings.php b/app/DataMapper/CompanySettings.php index db51415837fa..f3731531734d 100644 --- a/app/DataMapper/CompanySettings.php +++ b/app/DataMapper/CompanySettings.php @@ -520,7 +520,7 @@ class CompanySettings extends BaseSettings public static $casts = [ 'enable_quote_reminder1' => 'bool', - 'quote_num_days_reminder1' => 'string', + 'quote_num_days_reminder1' => 'int', 'quote_schedule_reminder1' => 'string', 'quote_late_fee_amount1' => 'float', 'quote_late_fee_percent1' => 'float', From 83e3147462004951d8d66ce3b5bf99dae6847195 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Sat, 22 Jun 2024 09:38:09 +1000 Subject: [PATCH 17/20] updates for type casting --- app/Helpers/Invoice/InvoiceItemSum.php | 2 +- app/Http/Requests/Task/StoreTaskRequest.php | 5 +---- app/Http/Requests/Task/UpdateTaskRequest.php | 5 +---- app/Repositories/TaskRepository.php | 3 +++ 4 files changed, 6 insertions(+), 9 deletions(-) diff --git a/app/Helpers/Invoice/InvoiceItemSum.php b/app/Helpers/Invoice/InvoiceItemSum.php index ef2cddb0ef3b..69b09cabd820 100644 --- a/app/Helpers/Invoice/InvoiceItemSum.php +++ b/app/Helpers/Invoice/InvoiceItemSum.php @@ -332,7 +332,7 @@ class InvoiceItemSum public function setLineTotal($total) { - $this->item->line_total = $total; + $this->item->line_total = (float)$total; return $this; } diff --git a/app/Http/Requests/Task/StoreTaskRequest.php b/app/Http/Requests/Task/StoreTaskRequest.php index 3aaedf108a29..f61bc4267a23 100644 --- a/app/Http/Requests/Task/StoreTaskRequest.php +++ b/app/Http/Requests/Task/StoreTaskRequest.php @@ -55,8 +55,7 @@ class StoreTaskRequest extends Request } $rules['hash'] = 'bail|sometimes|string|nullable'; - $rules['rate'] = 'bail|numeric'; - + $rules['time_log'] = ['bail',function ($attribute, $values, $fail) { if(is_string($values)) { @@ -124,8 +123,6 @@ class StoreTaskRequest extends Request } } - $input['rate'] = isset($input['rate']) ? $input['rate'] : 0; - if(!isset($input['time_log']) || empty($input['time_log']) || $input['time_log'] == '{}') { $input['time_log'] = json_encode([]); } diff --git a/app/Http/Requests/Task/UpdateTaskRequest.php b/app/Http/Requests/Task/UpdateTaskRequest.php index bfe43b763b90..85b2c4de955b 100644 --- a/app/Http/Requests/Task/UpdateTaskRequest.php +++ b/app/Http/Requests/Task/UpdateTaskRequest.php @@ -61,7 +61,7 @@ class UpdateTaskRequest extends Request } $rules['hash'] = 'bail|sometimes|string|nullable'; - $rules['rate'] = 'bail|numeric'; + $rules['time_log'] = ['bail', function ($attribute, $values, $fail) { if(is_string($values)) { @@ -137,9 +137,6 @@ class UpdateTaskRequest extends Request $input['time_log'] = json_encode([]); } - - $input['rate'] = isset($input['rate']) ? $input['rate'] : 0; - $this->replace($input); } diff --git a/app/Repositories/TaskRepository.php b/app/Repositories/TaskRepository.php index 4017dd749479..3ae0aca75190 100644 --- a/app/Repositories/TaskRepository.php +++ b/app/Repositories/TaskRepository.php @@ -50,6 +50,9 @@ class TaskRepository extends BaseRepository TaskAssigned::dispatch($task, $task->company->db)->delay(2); } + if(!$task->rate || !isset($data['rate'])) + $data['rate'] = 0; + $task->fill($data); $task->saveQuietly(); From 2a97787ddba771bef16c2b1d4f31a51eeaa489ba Mon Sep 17 00:00:00 2001 From: David Bomba Date: Sat, 22 Jun 2024 12:39:46 +1000 Subject: [PATCH 18/20] Fixes for testse --- app/Helpers/Invoice/InvoiceItemSum.php | 2 +- app/Jobs/Subscription/CleanStaleInvoiceOrder.php | 4 ++-- tests/Feature/QuoteTest.php | 8 +++++--- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/app/Helpers/Invoice/InvoiceItemSum.php b/app/Helpers/Invoice/InvoiceItemSum.php index 69b09cabd820..ef2cddb0ef3b 100644 --- a/app/Helpers/Invoice/InvoiceItemSum.php +++ b/app/Helpers/Invoice/InvoiceItemSum.php @@ -332,7 +332,7 @@ class InvoiceItemSum public function setLineTotal($total) { - $this->item->line_total = (float)$total; + $this->item->line_total = $total; return $this; } diff --git a/app/Jobs/Subscription/CleanStaleInvoiceOrder.php b/app/Jobs/Subscription/CleanStaleInvoiceOrder.php index c585aa33647a..6cc5a6440a12 100644 --- a/app/Jobs/Subscription/CleanStaleInvoiceOrder.php +++ b/app/Jobs/Subscription/CleanStaleInvoiceOrder.php @@ -60,7 +60,7 @@ class CleanStaleInvoiceOrder implements ShouldQueue Invoice::query() ->withTrashed() ->where('status_id', Invoice::STATUS_SENT) - ->where('created_at', '<', now()->subMinutes(30)) + ->where('updated_at', '<', now()->subHour()) ->where('balance', '>', 0) ->whereJsonContains('line_items', ['type_id' => '3']) ->cursor() @@ -88,7 +88,7 @@ class CleanStaleInvoiceOrder implements ShouldQueue Invoice::query() ->withTrashed() ->where('status_id', Invoice::STATUS_SENT) - ->where('created_at', '<', now()->subMinutes(30)) + ->where('updated_at', '<', now()->subHour()) ->where('balance', '>', 0) ->whereJsonContains('line_items', ['type_id' => '3']) ->cursor() diff --git a/tests/Feature/QuoteTest.php b/tests/Feature/QuoteTest.php index 25c6639e4b37..77bcdcaf9974 100644 --- a/tests/Feature/QuoteTest.php +++ b/tests/Feature/QuoteTest.php @@ -52,6 +52,8 @@ class QuoteTest extends TestCase $this->withoutMiddleware( ThrottleRequests::class ); + + $this->markTestSkipped('22-06-2024'); } public function testQuoteDueDateInjectionValidationLayer() @@ -216,19 +218,19 @@ class QuoteTest extends TestCase 'date' => now(), 'line_items' =>[ [ - 'type_id' => 2, + 'type_id' => '2', 'cost' => 200, 'quantity' => 2, 'notes' => 'Test200', ], [ - 'type_id' => 2, + 'type_id' => '2', 'cost' => 100, 'quantity' => 1, 'notes' => 'Test100', ], [ - 'type_id' => 1, + 'type_id' => '1', 'cost' => 10, 'quantity' => 1, 'notes' => 'Test', From 79b93f75bb79e5e70e42746965821be7f8d55e24 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Sat, 22 Jun 2024 12:48:43 +1000 Subject: [PATCH 19/20] Fixes for tests --- app/Helpers/Invoice/InvoiceItemSum.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Helpers/Invoice/InvoiceItemSum.php b/app/Helpers/Invoice/InvoiceItemSum.php index ef2cddb0ef3b..76ba72ca5e4f 100644 --- a/app/Helpers/Invoice/InvoiceItemSum.php +++ b/app/Helpers/Invoice/InvoiceItemSum.php @@ -332,7 +332,7 @@ class InvoiceItemSum public function setLineTotal($total) { - $this->item->line_total = $total; + $this->item->line_total = (float) $total; return $this; } From 104ad33042cb9a392d7b37754f14404b429d752c Mon Sep 17 00:00:00 2001 From: David Bomba Date: Sat, 22 Jun 2024 13:00:33 +1000 Subject: [PATCH 20/20] Fixes for tests --- app/Http/Requests/User/DisconnectUserMailerRequest.php | 1 - app/Repositories/TaskRepository.php | 2 +- tests/Feature/QuoteTest.php | 1 - 3 files changed, 1 insertion(+), 3 deletions(-) diff --git a/app/Http/Requests/User/DisconnectUserMailerRequest.php b/app/Http/Requests/User/DisconnectUserMailerRequest.php index 00a0e8b07ddb..b1c805176eee 100644 --- a/app/Http/Requests/User/DisconnectUserMailerRequest.php +++ b/app/Http/Requests/User/DisconnectUserMailerRequest.php @@ -15,7 +15,6 @@ use App\Http\Requests\Request; class DisconnectUserMailerRequest extends Request { - private bool $phone_has_changed = false; /** * Determine if the user is authorized to make this request. diff --git a/app/Repositories/TaskRepository.php b/app/Repositories/TaskRepository.php index 3ae0aca75190..ff6684287aa4 100644 --- a/app/Repositories/TaskRepository.php +++ b/app/Repositories/TaskRepository.php @@ -50,7 +50,7 @@ class TaskRepository extends BaseRepository TaskAssigned::dispatch($task, $task->company->db)->delay(2); } - if(!$task->rate || !isset($data['rate'])) + if(!is_numeric($task->rate) && !isset($data['rate'])) $data['rate'] = 0; $task->fill($data); diff --git a/tests/Feature/QuoteTest.php b/tests/Feature/QuoteTest.php index 77bcdcaf9974..bc646a21dfdc 100644 --- a/tests/Feature/QuoteTest.php +++ b/tests/Feature/QuoteTest.php @@ -53,7 +53,6 @@ class QuoteTest extends TestCase ThrottleRequests::class ); - $this->markTestSkipped('22-06-2024'); } public function testQuoteDueDateInjectionValidationLayer()