diff --git a/.env.example b/.env.example
index e9d4cec8ed9a..5d3e7d4f78db 100644
--- a/.env.example
+++ b/.env.example
@@ -63,3 +63,5 @@ APPLE_REDIRECT_URI=
NORDIGEN_SECRET_ID=
NORDIGEN_SECRET_KEY=
+
+OPENEXCHANGE_APP_ID=
diff --git a/VERSION.txt b/VERSION.txt
index b54822f0da68..e5cce47b3049 100644
--- a/VERSION.txt
+++ b/VERSION.txt
@@ -1 +1 @@
-5.10.7
\ No newline at end of file
+5.10.8
\ No newline at end of file
diff --git a/app/Jobs/Task/TaskAssigned.php b/app/Jobs/Task/TaskAssigned.php
index 064363c418a0..5668a39d388e 100644
--- a/app/Jobs/Task/TaskAssigned.php
+++ b/app/Jobs/Task/TaskAssigned.php
@@ -13,14 +13,15 @@ namespace App\Jobs\Task;
use App\Models\Task;
use App\Libraries\MultiDB;
+use App\Models\CompanyUser;
use App\Services\Email\Email;
use Illuminate\Bus\Queueable;
use App\Services\Email\EmailObject;
use Illuminate\Mail\Mailables\Address;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
-use Illuminate\Contracts\Queue\ShouldQueue;
+use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use App\Utils\Traits\Notifications\UserNotifies;
@@ -47,7 +48,7 @@ class TaskAssigned implements ShouldQueue
$company_user = $this->task->assignedCompanyUser();
- if($company_user && $this->findEntityAssignedNotification($company_user, 'task'))
+ if(($company_user instanceof CompanyUser) && $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()) ]);
diff --git a/app/Utils/Traits/MakesReminders.php b/app/Utils/Traits/MakesReminders.php
index 232c15525d8d..119351ba4d00 100644
--- a/app/Utils/Traits/MakesReminders.php
+++ b/app/Utils/Traits/MakesReminders.php
@@ -82,7 +82,7 @@ trait MakesReminders
private function checkEndlessReminder($last_sent_date, $endless_reminder_frequency_id): bool
{
- if(!$last_sent_date)
+ if(is_null($last_sent_date) || !$last_sent_date)
return false;
if (Carbon::now()->startOfDay()->eq($this->addTimeInterval($last_sent_date, $endless_reminder_frequency_id))) {
diff --git a/config/ninja.php b/config/ninja.php
index 325fcd1188f2..e6bd9d75ae72 100644
--- a/config/ninja.php
+++ b/config/ninja.php
@@ -17,8 +17,8 @@ return [
'require_https' => env('REQUIRE_HTTPS', true),
'app_url' => rtrim(env('APP_URL', ''), '/'),
'app_domain' => env('APP_DOMAIN', 'invoicing.co'),
- 'app_version' => env('APP_VERSION', '5.10.7'),
- 'app_tag' => env('APP_TAG', '5.10.7'),
+ 'app_version' => env('APP_VERSION', '5.10.8'),
+ 'app_tag' => env('APP_TAG', '5.10.8'),
'minimum_client_version' => '5.0.16',
'terms_version' => '1.0.1',
'api_secret' => env('API_SECRET', false),
diff --git a/lang/da/texts.php b/lang/da/texts.php
index 6612e9c386b6..4f9e288f350f 100644
--- a/lang/da/texts.php
+++ b/lang/da/texts.php
@@ -5285,7 +5285,7 @@ $lang = array(
'remind_quote' => 'Remind Quote',
'end_of_month' => 'End Of Month',
'tax_currency_mismatch' => 'Tax currency is different from invoice currency',
- 'edocument_import_already_exists' => '\nThe invoice has already been imported on :date'
+ 'edocument_import_already_exists' => 'The invoice has already been imported on :date'
);
return $lang;
diff --git a/lang/en/texts.php b/lang/en/texts.php
index 550c81dfd1a7..906a18c46c37 100644
--- a/lang/en/texts.php
+++ b/lang/en/texts.php
@@ -5286,7 +5286,7 @@ $lang = array(
'remind_quote' => 'Remind Quote',
'end_of_month' => 'End Of Month',
'tax_currency_mismatch' => 'Tax currency is different from invoice currency',
- 'edocument_import_already_exists' => '\nThe invoice has already been imported on :date',
+ 'edocument_import_already_exists' => 'The invoice has already been imported on :date',
'before_valid_until' => 'Before the valid until',
'after_valid_until' => 'After the valid until',
'task_assigned_notification' => 'Task Assigned Notification',
@@ -5296,6 +5296,9 @@ $lang = array(
'add_comment' => 'Add Comment',
'added_comment' => 'Successfully saved comment',
'tickets' => 'Tickets',
+ 'assigned_group' => 'Successfully assigned group',
+ 'merge_to_pdf' => 'Merge to PDF',
+ 'latest_requires_php_version' => 'Note: the latest version requires PHP :version',
);
return $lang;
diff --git a/lang/en_GB/texts.php b/lang/en_GB/texts.php
index bb29aefb7490..8bc57af05add 100644
--- a/lang/en_GB/texts.php
+++ b/lang/en_GB/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.',
@@ -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',
@@ -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.',
@@ -2783,7 +2783,7 @@ $lang = array(
'paid_invoice' => 'Paid Invoice',
'unapproved_quote' => 'Unapproved Quote',
'unapproved_proposal' => 'Unapproved Proposal',
- 'autofills_city_state' => 'Auto-fills city/state',
+ 'autofills_city_state' => 'Auto-fills city/county',
'no_match_found' => 'No match found',
'password_strength' => 'Password Strength',
'strength_weak' => 'Weak',
@@ -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',
@@ -2943,66 +2922,25 @@ $lang = array(
'close_ticket_autoresponder_help' => 'Selecting a template will send an auto response to a client/contact when a ticket is closed',
'default_priority' => 'Default priority',
'alert_new_comment_id' => 'New comment',
- 'alert_comment_ticket_help' => 'Selecting a template will send a notification (to agent) when a comment is made.',
- 'alert_comment_ticket_email_help' => 'Comma separated emails to bcc on new comment.',
- 'new_ticket_notification_list' => 'Additional new ticket notifications',
'update_ticket_notification_list' => 'Additional new comment notifications',
'comma_separated_values' => 'admin@example.com, supervisor@example.com',
- 'alert_ticket_assign_agent_id' => 'Ticket assignment',
- 'alert_ticket_assign_agent_id_hel' => 'Selecting a template will send a notification (to agent) when a ticket is assigned.',
- 'alert_ticket_assign_agent_id_notifications' => 'Additional ticket assigned notifications',
- 'alert_ticket_assign_agent_id_help' => 'Comma separated emails to bcc on ticket assignment.',
- 'alert_ticket_transfer_email_help' => 'Comma separated emails to bcc on ticket transfer.',
- 'alert_ticket_overdue_agent_id' => 'Ticket overdue',
- 'alert_ticket_overdue_email' => 'Additional overdue ticket notifications',
- 'alert_ticket_overdue_email_help' => 'Comma separated emails to bcc on ticket overdue.',
- 'alert_ticket_overdue_agent_id_help' => 'Selecting a template will send a notification (to agent) when a ticket becomes overdue.',
- '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',
'avatar' => 'Avatar',
'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',
@@ -3340,7 +3278,7 @@ $lang = array(
'email_subject_payment' => 'Email Payment Subject',
'switch_list_table' => 'Switch List Table',
'client_city' => 'Client City',
- 'client_state' => 'Client State',
+ 'client_state' => 'Client County',
'client_country' => 'Client Country',
'client_is_active' => 'Client is Active',
'client_balance' => 'Client Balance',
@@ -3363,7 +3301,7 @@ $lang = array(
'custom_surcharge4' => 'Custom Surcharge 4',
'is_deleted' => 'Is Deleted',
'vendor_city' => 'Vendor City',
- 'vendor_state' => 'Vendor State',
+ 'vendor_state' => 'Vendor County',
'vendor_country' => 'Vendor Country',
'credit_footer' => 'Credit Footer',
'credit_terms' => 'Credit Terms',
@@ -4437,7 +4375,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 +5085,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,18 +5244,20 @@ $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',
@@ -5325,6 +5265,37 @@ $lang = array(
'money' => 'Money',
'web_app' => 'Web App',
'desktop_app' => 'Desktop App',
+ 'disconnected' => 'Disconnected',
+ 'reconnect' => 'Reconnect',
+ 'e_invoice_settings' => 'E-Invoice Settings',
+ 'btcpay_refund_subject' => 'Refund of your invoice via BTCPay',
+ 'btcpay_refund_body' => 'A refund intended for you has been issued. To claim it via BTCPay, please click on this link:',
+ 'currency_mauritanian_ouguiya' => 'Mauritanian Ouguiya',
+ 'currency_bhutan_ngultrum' => 'Bhutan Ngultrum',
+ 'end_of_month' => 'End Of Month',
+ 'merge_e_invoice_to_pdf' => 'Merge E-Invoice and PDF',
+ 'task_assigned_subject' => 'New task assignment [Task :task] [ :date ]',
+ 'task_assigned_body' => 'You have been assigned task :task
Description: :description
Client: :client',
+ 'activity_141' => 'User :user entered note: :notes',
+ 'quote_reminder_subject' => 'Reminder: Quote :quote from :company',
+ 'quote_reminder_message' => 'Reminder for quote :number for :amount',
+ 'quote_reminder1' => 'First Quote Reminder',
+ 'before_valid_until_date' => 'Before the valid until date',
+ 'after_valid_until_date' => 'After the valid until date',
+ 'after_quote_date' => 'After the quote date',
+ 'remind_quote' => 'Remind Quote',
+ 'end_of_month' => 'End Of Month',
+ 'tax_currency_mismatch' => 'Tax currency is different from invoice currency',
+ 'edocument_import_already_exists' => '\nThe invoice has already been imported on :date',
+ 'before_valid_until' => 'Before the valid until',
+ 'after_valid_until' => 'After the valid until',
+ 'task_assigned_notification' => 'Task Assigned Notification',
+ 'task_assigned_notification_help' => 'Send an email when a task is assigned',
+ 'invoices_locked_end_of_month' => 'Invoices are locked at the end of the month',
+ 'referral_url' => 'Referral URL',
+ 'add_comment' => 'Add Comment',
+ 'added_comment' => 'Successfully saved comment',
+ 'tickets' => 'Tickets',
);
return $lang;