diff --git a/app/Console/Commands/DemoMode.php b/app/Console/Commands/DemoMode.php index f9ac406ee02e..022b7e70026d 100644 --- a/app/Console/Commands/DemoMode.php +++ b/app/Console/Commands/DemoMode.php @@ -307,6 +307,14 @@ class DemoMode extends Command 'client_id' => $client->id, 'company_id' => $client->company_id, ]); + + Expense::all()->each(function ($expense){ + + $expense->number = $this->getNextExpenseNumber($expense); + $expense->save(); + + }); + } private function createVendor($client, $assigned_user_id = null) @@ -329,15 +337,23 @@ class DemoMode extends Command 'company_id' => $client->company_id, 'is_primary' => 0, ]); + + + $vendor->id_number = $this->getNextVendorNumber($vendor); + $vendor->save(); } private function createTask($client, $assigned_user_id = null) { - $vendor = Task::factory()->create([ + $task = Task::factory()->create([ 'user_id' => $client->user->id, 'company_id' => $client->company_id, 'client_id' => $client->id ]); + + $task->number = $this->getNextTaskNumber($task); + $task->save(); + } private function createProject($client, $assigned_user_id = null) diff --git a/app/Events/Invoice/InvoiceWasPaid.php b/app/Events/Invoice/InvoiceWasPaid.php index 4aa412813160..95a6d23556b2 100644 --- a/app/Events/Invoice/InvoiceWasPaid.php +++ b/app/Events/Invoice/InvoiceWasPaid.php @@ -13,6 +13,7 @@ namespace App\Events\Invoice; use App\Models\Company; use App\Models\Invoice; +use App\Models\Payment; use Illuminate\Queue\SerializesModels; /** @@ -27,6 +28,8 @@ class InvoiceWasPaid */ public $invoice; + public $payment; + public $company; public $event_vars; @@ -38,9 +41,10 @@ class InvoiceWasPaid * @param Company $company * @param array $event_vars */ - public function __construct(Invoice $invoice, Company $company, array $event_vars) + public function __construct(Invoice $invoice, Payment $payment, Company $company, array $event_vars) { $this->invoice = $invoice; + $this->payment = $payment; $this->company = $company; $this->event_vars = $event_vars; } diff --git a/app/Http/Controllers/ActivityController.php b/app/Http/Controllers/ActivityController.php index e6a962651b6b..19c31d2aa453 100644 --- a/app/Http/Controllers/ActivityController.php +++ b/app/Http/Controllers/ActivityController.php @@ -136,7 +136,7 @@ class ActivityController extends BaseController $backup = $activity->backup; if (! $backup || ! $backup->html_backup) { - return response()->json(['message'=> 'No backup exists for this activity', 'errors' => new stdClass], 404); + return response()->json(['message'=> ctrans('texts.no_backup_exists'), 'errors' => new stdClass], 404); } $pdf = $this->makePdf(null, null, $backup->html_backup); diff --git a/app/Http/Controllers/BaseController.php b/app/Http/Controllers/BaseController.php index 7ee03112f51e..00f3d6b750c3 100644 --- a/app/Http/Controllers/BaseController.php +++ b/app/Http/Controllers/BaseController.php @@ -150,7 +150,7 @@ class BaseController extends Controller */ public function notFound() { - return response()->json(['message' => '404 | Nothing to see here!'], 404) + return response()->json(['message' => ctrans('texts.api_404')], 404) ->header('X-API-VERSION', config('ninja.minimum_client_version')) ->header('X-APP-VERSION', config('ninja.app_version')); } @@ -198,7 +198,7 @@ class BaseController extends Controller $updated_at = request()->has('updated_at') ? request()->input('updated_at') : 0; if (auth()->user()->getCompany()->is_large && ! request()->has('updated_at')) { - return response()->json(['message' => 'Cannot load a large account without a updated_at parameter', 'errors' =>[]], 401); + return response()->json(['message' => ctrans('texts.large_account_update_parameter'), 'errors' =>[]], 401); } $updated_at = date('Y-m-d H:i:s', $updated_at); diff --git a/app/Http/Controllers/CompanyController.php b/app/Http/Controllers/CompanyController.php index e03599b1cf4b..0b437b32b2b7 100644 --- a/app/Http/Controllers/CompanyController.php +++ b/app/Http/Controllers/CompanyController.php @@ -501,6 +501,6 @@ class CompanyController extends BaseController } } - return response()->json(['message' => 'success'], 200); + return response()->json(['message' => ctrans('texts.success')], 200); } } diff --git a/app/Http/Controllers/CompanyUserController.php b/app/Http/Controllers/CompanyUserController.php index b13730a71658..be0a75a85a77 100644 --- a/app/Http/Controllers/CompanyUserController.php +++ b/app/Http/Controllers/CompanyUserController.php @@ -115,7 +115,7 @@ class CompanyUserController extends BaseController $company_user = CompanyUser::whereUserId($user->id)->whereCompanyId($company->id)->first(); if (! $company_user) { - throw new ModelNotFoundException('Company User record not found'); + throw new ModelNotFoundException(ctrans('texts.company_user_not_found')); return; } diff --git a/app/Http/Controllers/CreditController.php b/app/Http/Controllers/CreditController.php index 30019c4ed99c..346dda1ee391 100644 --- a/app/Http/Controllers/CreditController.php +++ b/app/Http/Controllers/CreditController.php @@ -484,7 +484,7 @@ class CreditController extends BaseController $credits = Credit::withTrashed()->whereIn('id', $this->transformKeys($ids)); if (! $credits) { - return response()->json(['message' => 'No Credits Found']); + return response()->json(['message' => ctrans('texts.no_credits_found')]); } $credits->each(function ($credit, $key) use ($action) { @@ -561,7 +561,7 @@ class CreditController extends BaseController break; default: - return response()->json(['message' => "The requested action `{$action}` is not available."], 400); + return response()->json(['message' => ctrans('texts.action_unavailable', ['action' => $action])], 400); break; } } diff --git a/app/Http/Controllers/DocumentController.php b/app/Http/Controllers/DocumentController.php index 6b0cd34feb58..0fd18e00289e 100644 --- a/app/Http/Controllers/DocumentController.php +++ b/app/Http/Controllers/DocumentController.php @@ -124,7 +124,7 @@ class DocumentController extends BaseController { $this->document_repo->delete($document); - return response()->json(['message'=>'success']); + return response()->json(['message'=> ctrans('texts.success')]); } public function bulk() @@ -136,7 +136,7 @@ class DocumentController extends BaseController $documents = Document::withTrashed()->whereIn('id', $this->transformKeys($ids))->company()->get(); if (! $invoices) { - return response()->json(['message' => 'No Documents Found']); + return response()->json(['message' => ctrans('texts.no_documents_found')]); } /* diff --git a/app/Http/Controllers/GroupSettingController.php b/app/Http/Controllers/GroupSettingController.php index 8f7f828270e0..2c4815427f50 100644 --- a/app/Http/Controllers/GroupSettingController.php +++ b/app/Http/Controllers/GroupSettingController.php @@ -481,7 +481,7 @@ class GroupSettingController extends BaseController $group_settings = GroupSetting::withTrashed()->whereIn('id', $this->transformKeys($ids))->company()->get(); if (! $group_settings) { - return response()->json(['message' => 'No Group Settings Found']); + return response()->json(['message' => ctrans('texts.no_group_settings_found')]); } /* diff --git a/app/Http/Controllers/ImportController.php b/app/Http/Controllers/ImportController.php index e11a88103003..aa23c649e5e2 100644 --- a/app/Http/Controllers/ImportController.php +++ b/app/Http/Controllers/ImportController.php @@ -95,7 +95,7 @@ class ImportController extends Controller { CSVImport::dispatch($request->all(), auth()->user()->company()); - return response()->json(['message' => 'Importing data, email will be sent on completion'], 200); + return response()->json(['message' => ctrans('texts.import_started')], 200); } private function getEntityMap($entity_type) diff --git a/app/Http/Controllers/InvoiceController.php b/app/Http/Controllers/InvoiceController.php index 9866f43133ae..bc2c5c138edc 100644 --- a/app/Http/Controllers/InvoiceController.php +++ b/app/Http/Controllers/InvoiceController.php @@ -387,7 +387,7 @@ class InvoiceController extends BaseController } if ($invoice->isLocked()) { - return response()->json(['message' => 'Invoice is locked, no modifications allowed']); + return response()->json(['message' => ctrans('texts.locked_invoice')]); } $invoice = $this->invoice_repo->save($request->all(), $invoice); @@ -526,13 +526,13 @@ class InvoiceController extends BaseController if ($action == 'download' && $invoices->count() > 1) { $invoices->each(function ($invoice) { if (auth()->user()->cannot('view', $invoice)) { - return response()->json(['message' => 'Insufficient privileges to access invoice '.$invoice->number]); + return response()->json(['message' => ctrans('text.access_denied')]); } }); ZipInvoices::dispatch($invoices, $invoices->first()->company, auth()->user()->email); - return response()->json(['message' => 'Email Sent!'], 200); + return response()->json(['message' => ctrans('texts.sent_message')], 200); } /* @@ -649,7 +649,7 @@ class InvoiceController extends BaseController break; case 'mark_paid': if ($invoice->balance < 0 || $invoice->status_id == Invoice::STATUS_PAID || $invoice->is_deleted === true) { - return $this->errorResponse(['message' => 'Invoice cannot be marked as paid'], 400); + return $this->errorResponse(['message' => ctrans('texts.invoice_cannot_be_marked_paid')], 400); } $invoice = $invoice->service()->markPaid(); @@ -686,9 +686,7 @@ class InvoiceController extends BaseController } break; case 'delete': - //need to make sure the invoice is cancelled first!! - //$invoice->service()->handleCancellation()s->save(); -nlog("inside delete"); + $this->invoice_repo->delete($invoice); if (! $bulk) { @@ -735,7 +733,7 @@ nlog("inside delete"); break; default: - return response()->json(['message' => "The requested action `{$action}` is not available."], 400); + return response()->json(['message' => ctrans('texts.action_unavailable', ['action' => $action])], 400); break; } } diff --git a/app/Http/Controllers/LicenseController.php b/app/Http/Controllers/LicenseController.php index f812f897951c..4549203ce418 100644 --- a/app/Http/Controllers/LicenseController.php +++ b/app/Http/Controllers/LicenseController.php @@ -134,7 +134,7 @@ class LicenseController extends BaseController } $error = [ - 'message' => 'Invalid license, or invalid environment '.config('ninja.environment'), + 'message' => ctrans('texts.invoice_license_or_environment', ['environment' => config('ninja.environment')]), 'errors' => new stdClass, ]; diff --git a/app/Http/Controllers/PingController.php b/app/Http/Controllers/PingController.php index 45a5d52ffd4b..5764a769c8dd 100644 --- a/app/Http/Controllers/PingController.php +++ b/app/Http/Controllers/PingController.php @@ -74,7 +74,7 @@ class PingController extends BaseController public function health() { if (Ninja::isNinja()) { - return response()->json(['message' => 'Route not available', 'errors'=>[]], 403); + return response()->json(['message' => ctrans('texts.route_not_available'), 'errors'=>[]], 403); } return response()->json(SystemHealth::check(), 200); diff --git a/app/Http/Controllers/PreviewController.php b/app/Http/Controllers/PreviewController.php index 16e0372021e3..182dcb0c9348 100644 --- a/app/Http/Controllers/PreviewController.php +++ b/app/Http/Controllers/PreviewController.php @@ -81,7 +81,7 @@ class PreviewController extends BaseController $design_object = json_decode(json_encode(request()->input('design'))); if (! is_object($design_object)) { - return response()->json(['message' => 'Invalid custom design object'], 400); + return response()->json(['message' => ctrans('texts.invalid_design_object')], 400); } $entity = ucfirst(request()->input('entity')); diff --git a/app/Http/Controllers/QuoteController.php b/app/Http/Controllers/QuoteController.php index 0aca87c000d2..d80d5b244c7a 100644 --- a/app/Http/Controllers/QuoteController.php +++ b/app/Http/Controllers/QuoteController.php @@ -507,7 +507,7 @@ class QuoteController extends BaseController $quotes = Quote::withTrashed()->whereIn('id', $this->transformKeys($ids))->company()->get(); if (! $quotes) { - return response()->json(['message' => 'No Quote/s Found']); + return response()->json(['message' => ctrans('texts.quote_not_found')]); } /* @@ -517,13 +517,13 @@ class QuoteController extends BaseController if ($action == 'download' && $quotes->count() >= 1) { $quotes->each(function ($quote) { if (auth()->user()->cannot('view', $quote)) { - return response()->json(['message'=>'Insufficient privileges to access quote '.$quote->number]); + return response()->json(['message'=> ctrans('texts.access_denied')]); } }); ZipInvoices::dispatch($quotes, $quotes->first()->company, auth()->user()->email); - return response()->json(['message' => 'Email Sent!'], 200); + return response()->json(['message' => ctrans('texts.sent_message')], 200); } if ($action == 'convert') { @@ -651,7 +651,7 @@ class QuoteController extends BaseController case 'approve': //make sure it hasn't already been approved!! if ($quote->status_id != Quote::STATUS_SENT) { - return response()->json(['message' => 'Unable to approve this quote as it has expired.'], 400); + return response()->json(['message' => ctrans('texts.quote_unapprovable')], 400); } return $this->itemResponse($quote->service()->approve()->save()); @@ -692,7 +692,7 @@ class QuoteController extends BaseController case 'email': $quote->service()->sendEmail(); - return response()->json(['message'=>'email sent'], 200); + return response()->json(['message'=> ctrans('texts.sent_message')], 200); break; case 'mark_sent': $quote->service()->markSent()->save(); @@ -702,7 +702,7 @@ class QuoteController extends BaseController } break; default: - return response()->json(['message' => "The requested action `{$action}` is not available."], 400); + return response()->json(['message' => ctrans('texts.action_unavailable',['action' => $action])], 400); break; } } diff --git a/app/Http/Controllers/SchedulerController.php b/app/Http/Controllers/SchedulerController.php index 80e011ca3e2a..e1788ce4e85c 100644 --- a/app/Http/Controllers/SchedulerController.php +++ b/app/Http/Controllers/SchedulerController.php @@ -7,9 +7,9 @@ class SchedulerController extends Controller public function index() { if (auth()->user()->company()->account->latest_version == '0.0.0') { - return response()->json(['message' => 'Scheduler has never run'], 400); + return response()->json(['message' => ctrans('texts.scheduler_has_never_run')], 400); } else { - return response()->json(['message' => 'Scheduler has run'], 200); + return response()->json(['message' => ctrans('texts.scheduler_has_run')], 200); } } } diff --git a/app/Http/Controllers/SelfUpdateController.php b/app/Http/Controllers/SelfUpdateController.php index 29d745034832..1ecc2ae675ba 100644 --- a/app/Http/Controllers/SelfUpdateController.php +++ b/app/Http/Controllers/SelfUpdateController.php @@ -59,7 +59,7 @@ class SelfUpdateController extends BaseController define('STDIN', fopen('php://stdin', 'r')); if (Ninja::isNinja()) { - return response()->json(['message' => 'Self update not available on this system.'], 403); + return response()->json(['message' => ctrans('texts.self_update_not_available')], 403); } /* .git MUST be owned/writable by the webserver user */ diff --git a/app/Http/Controllers/SettingsController.php b/app/Http/Controllers/SettingsController.php deleted file mode 100644 index faa5b37a2a9c..000000000000 --- a/app/Http/Controllers/SettingsController.php +++ /dev/null @@ -1,101 +0,0 @@ -easyMinify(json_encode($strings)).';'; - exit(); - } - - private function easyMinify($javascript) - { - return preg_replace(["/\s+\n/", "/\n\s+/", '/ +/'], ["\n", "\n ", ' '], $javascript); - } - - /** - * Show the form for creating a new resource. - * - * @return void - */ - public function create() - { - // - } - - /** - * Store a newly created resource in storage. - * - * @param Request $request - * @return void - */ - public function store(Request $request) - { - // - } - - /** - * Display the specified resource. - * - * @param int $id - * @return void - */ - public function show($id) - { - // - } - - /** - * Show the form for editing the specified resource. - * - * @param int $id - * @return void - */ - public function edit($id) - { - // - } - - /** - * Update the specified resource in storage. - * - * @param Request $request - * @param int $id - * @return void - */ - public function update(Request $request, $id) - { - // - } - - /** - * Remove the specified resource from storage. - * - * @param int $id - * @return void - */ - public function destroy($id) - { - // - } -} diff --git a/app/Http/Controllers/UserController.php b/app/Http/Controllers/UserController.php index 80509d283e13..37f956b50abb 100644 --- a/app/Http/Controllers/UserController.php +++ b/app/Http/Controllers/UserController.php @@ -668,6 +668,6 @@ class UserController extends BaseController $company_user->delete(); } - return response()->json(['message' => 'User detached from company'], 200); + return response()->json(['message' => ctrans('texts.user_detached')], 200); } } diff --git a/app/Http/Controllers/WebhookController.php b/app/Http/Controllers/WebhookController.php index 5b1c5594d249..84dd09d16876 100644 --- a/app/Http/Controllers/WebhookController.php +++ b/app/Http/Controllers/WebhookController.php @@ -364,7 +364,7 @@ class WebhookController extends BaseController $webhook->save(); if (! $webhook->id) { - return response()->json('Failed to create Webhook', 400); + return response()->json(ctrans('texts.create_webhook_failure'), 400); } return $this->itemResponse($webhook); diff --git a/app/Http/Requests/Client/EditClientRequest.php b/app/Http/Requests/Client/EditClientRequest.php index ffe1c448ac69..d3db2c4ce036 100644 --- a/app/Http/Requests/Client/EditClientRequest.php +++ b/app/Http/Requests/Client/EditClientRequest.php @@ -25,13 +25,4 @@ class EditClientRequest extends Request return auth()->user()->can('edit', $this->client); } - // public function prepareForValidation() - // { - // $input = $this->all(); - - // //$input['id'] = $this->encodePrimaryKey($input['id']); - - // $this->replace($input); - - // } } diff --git a/app/Listeners/Invoice/InvoicePaidActivity.php b/app/Listeners/Invoice/InvoicePaidActivity.php index 5a6e5cc7e1d5..98dcf939c19f 100644 --- a/app/Listeners/Invoice/InvoicePaidActivity.php +++ b/app/Listeners/Invoice/InvoicePaidActivity.php @@ -47,7 +47,8 @@ class InvoicePaidActivity implements ShouldQueue $fields->user_id = $event->invoice->user_id; $fields->company_id = $event->invoice->company_id; $fields->activity_type_id = Activity::PAID_INVOICE; - + $fields->payment_id = $event->payment->id; + $this->activity_repo->save($fields, $event->invoice, $event->event_vars); try { diff --git a/app/PaymentDrivers/BaseDriver.php b/app/PaymentDrivers/BaseDriver.php index 4dfb178c798d..a8e5b6e6f343 100644 --- a/app/PaymentDrivers/BaseDriver.php +++ b/app/PaymentDrivers/BaseDriver.php @@ -187,7 +187,7 @@ class BaseDriver extends AbstractPaymentDriver $payment->invoices()->sync($invoices); $invoices->each(function ($invoice) use ($payment) { - event(new InvoiceWasPaid($invoice, $payment->company, Ninja::eventVars())); + event(new InvoiceWasPaid($invoice, $payment, $payment->company, Ninja::eventVars())); }); return $payment->service()->applyNumber()->save(); diff --git a/app/Services/Credit/ApplyPayment.php b/app/Services/Credit/ApplyPayment.php index c69dcf1b8589..e97e38c3854b 100644 --- a/app/Services/Credit/ApplyPayment.php +++ b/app/Services/Credit/ApplyPayment.php @@ -148,7 +148,7 @@ class ApplyPayment if ((int)$this->invoice->balance == 0) { $this->invoice->service()->deletePdf(); - event(new InvoiceWasPaid($this->invoice, $this->payment->company, Ninja::eventVars())); + event(new InvoiceWasPaid($this->invoice, $payment, $this->payment->company, Ninja::eventVars())); } } } diff --git a/app/Services/Invoice/MarkPaid.php b/app/Services/Invoice/MarkPaid.php index 285287b67ea5..55c7e18016b8 100644 --- a/app/Services/Invoice/MarkPaid.php +++ b/app/Services/Invoice/MarkPaid.php @@ -80,7 +80,7 @@ class MarkPaid extends AbstractService /* Update Invoice balance */ event(new PaymentWasCreated($payment, $payment->company, Ninja::eventVars())); - event(new InvoiceWasPaid($this->invoice, $payment->company, Ninja::eventVars())); + event(new InvoiceWasPaid($this->invoice, $payment, $payment->company, Ninja::eventVars())); $payment->ledger() ->updatePaymentBalance($payment->amount * -1); diff --git a/app/Transformers/VendorTransformer.php b/app/Transformers/VendorTransformer.php index 8642721bc5e5..f351701830f3 100644 --- a/app/Transformers/VendorTransformer.php +++ b/app/Transformers/VendorTransformer.php @@ -98,12 +98,12 @@ class VendorTransformer extends EntityTransformer 'custom_value3' => $vendor->custom_value3 ?: '', 'custom_value4' => $vendor->custom_value4 ?: '', 'is_deleted' => (bool) $vendor->is_deleted, - 'vat_number' => $vendor->vat_number ?: '', - 'id_number' => $vendor->id_number ?: '', + 'vat_number' => (string) $vendor->vat_number ?: '', + 'id_number' => (string) $vendor->id_number ?: '', 'updated_at' => (int) $vendor->updated_at, 'archived_at' => (int) $vendor->deleted_at, 'created_at' => (int) $vendor->created_at, - 'number' => (string)$vendor->number ?: '', + 'number' => (string) $vendor->number ?: '', ]; } } diff --git a/app/Utils/HtmlEngine.php b/app/Utils/HtmlEngine.php index 0357db69184b..bcb400224f28 100644 --- a/app/Utils/HtmlEngine.php +++ b/app/Utils/HtmlEngine.php @@ -188,6 +188,7 @@ class HtmlEngine $data['$invoice.custom4'] = ['value' => $this->helpers->formatCustomFieldValue($this->company->custom_fields, 'invoice4', $this->entity->custom_value4, $this->client) ?: ' ', 'label' => $this->helpers->makeCustomField($this->company->custom_fields, 'invoice4')]; $data['$invoice.public_notes'] = ['value' => nl2br($this->entity->public_notes) ?: ' ', 'label' => ctrans('texts.public_notes')]; $data['$entity.public_notes'] = &$data['$invoice.public_notes']; + $data['$public_notes'] = &$data['$invoice.public_notes']; $data['$entity_issued_to'] = ['value' => '', 'label' => ctrans("texts.{$this->entity_string}_issued_to")]; $data['$your_entity'] = ['value' => '', 'label' => ctrans("texts.your_{$this->entity_string}")]; diff --git a/resources/lang/en/texts.php b/resources/lang/en/texts.php index 133ad13de41a..085e4cb2d6b1 100644 --- a/resources/lang/en/texts.php +++ b/resources/lang/en/texts.php @@ -3407,4 +3407,26 @@ return [ 'invoice_cannot_be_refunded' => 'Invoice id :number cannot be refunded', 'attempted_refund_failed' => 'Attempting to refund :amount only :refundable_amount available for refund', 'user_not_associated_with_this_account' => 'This user is unable to be attached to this company. Perhaps they have already registered a user on another account?', + 'migration_completed' => 'Migration completed', + 'migration_completed_description' => 'Your migration has completed, please review your data after logging in.', + 'api_404' => '404 | Nothing to see here!', + 'large_account_update_parameter' => 'Cannot load a large account without a updated_at parameter', + 'no_backup_exists' => 'No backup exists for this activity', + 'company_user_not_found' => 'Company User record not found', + 'no_credits_found' => 'No credits found.', + 'action_unavailable' => 'The requested action :action is not available.', + 'no_documents_found' => 'No Documents Found', + 'no_group_settings_found' => 'No group settings found', + 'access_denied' => 'Insufficient privileges to access/modify this resource', + 'invoice_cannot_be_marked_paid' => 'Invoice cannot be marked as paid', + 'invoice_license_or_environment' => 'Invalid license, or invalid environment :environment', + 'route_not_available' => 'Route not available', + 'invalid_design_object' => 'Invalid custom design object', + 'quote_not_found' => 'Quote/s not found', + 'quote_unapprovable' => 'Unable to approve this quote as it has expired.', + 'scheduler_has_run' => 'Scheduler has run', + 'scheduler_has_never_run' => 'Scheduler has never run', + 'self_update_not_available' => 'Self update not available on this system.', + 'user_detached' => 'User detached from company', + 'create_webhook_failure' => 'Failed to create Webhook', ]; diff --git a/resources/views/email/migration/completed.blade.php b/resources/views/email/migration/completed.blade.php index 6c72f61b7deb..fc36280e43f9 100644 --- a/resources/views/email/migration/completed.blade.php +++ b/resources/views/email/migration/completed.blade.php @@ -4,10 +4,10 @@ @include('email.components.header', ['logo' => 'https://www.invoiceninja.com/wp-content/uploads/2015/10/logo-white-horizontal-1.png']) @endslot -
We're happy to inform you that migration has been completed successfully. It is ready for you to review it.
+{{ ctrans('texts.migration_completed_description')}}
- Visit portal + {{ ctrans('texts.account_login')}} -Thank you,
Invoice Ninja
{{ ctrans('texts.email_signature')}}
{{ ctrans('texts.email_from') }}