diff --git a/app/Http/Controllers/ClientPortal/EmailPreferencesController.php b/app/Http/Controllers/ClientPortal/EmailPreferencesController.php
index f7b1417aa516..6fd5063756aa 100644
--- a/app/Http/Controllers/ClientPortal/EmailPreferencesController.php
+++ b/app/Http/Controllers/ClientPortal/EmailPreferencesController.php
@@ -12,14 +12,15 @@
namespace App\Http\Controllers\ClientPortal;
-use App\Http\Controllers\Controller;
+use Illuminate\Support\Str;
+use Illuminate\Http\Request;
+use App\Models\ClientContact;
use App\Jobs\Mail\NinjaMailer;
use App\Jobs\Mail\NinjaMailerJob;
+use App\Http\Controllers\Controller;
use App\Jobs\Mail\NinjaMailerObject;
+use Illuminate\Support\Facades\Cache;
use App\Mail\Admin\ClientUnsubscribedObject;
-use App\Models\ClientContact;
-use Illuminate\Http\Request;
-use Illuminate\Support\Str;
class EmailPreferencesController extends Controller
{
@@ -42,14 +43,16 @@ class EmailPreferencesController extends Controller
$invitation->contact->is_locked = $request->action === 'unsubscribe' ? true : false;
$invitation->contact->push();
- if ($invitation->contact->is_locked) {
+ if ($invitation->contact->is_locked && !Cache::has("unsubscribe_notitfication_suppression:{$invitation_key}")) {
$nmo = new NinjaMailerObject();
- $nmo->mailable = new NinjaMailer((new ClientUnsubscribedObject($invitation->contact, $invitation->contact->company))->build());
+ $nmo->mailable = new NinjaMailer((new ClientUnsubscribedObject($invitation->contact, $invitation->contact->company, $invitation->contact->company->owner()->company_users()->first()->portalType() ?? true))->build());
$nmo->company = $invitation->contact->company;
$nmo->to_user = $invitation->contact->company->owner();
$nmo->settings = $invitation->contact->company->settings;
NinjaMailerJob::dispatch($nmo);
+
+ Cache::put("unsubscribe_notitfication_suppression:{$invitation_key}", true, 3600);
}
return back()->with('message', ctrans('texts.updated_settings'));
diff --git a/app/Mail/Admin/ClientUnsubscribedObject.php b/app/Mail/Admin/ClientUnsubscribedObject.php
index e884840acb82..eb0190ab161f 100644
--- a/app/Mail/Admin/ClientUnsubscribedObject.php
+++ b/app/Mail/Admin/ClientUnsubscribedObject.php
@@ -20,7 +20,8 @@ class ClientUnsubscribedObject
{
public function __construct(
public ClientContact $contact,
- public Company $company
+ public Company $company,
+ private bool $use_react_link = false
) {
}
@@ -36,12 +37,13 @@ class ClientUnsubscribedObject
$data = [
'title' => ctrans('texts.client_unsubscribed'),
- 'message' => ctrans('texts.client_unsubscribed_help', ['client' => $this->contact->present()->name()]),
- 'url' => $this->contact->client->portalUrl(false),
+ 'content' => ctrans('texts.client_unsubscribed_help', ['client' => $this->contact->present()->name()]),
+ 'url' => $this->contact->getAdminLink($this->use_react_link),
'button' => ctrans('texts.view_client'),
'signature' => $this->company->settings->email_signature,
'settings' => $this->company->settings,
'logo' => $this->company->present()->logo(),
+ 'text_body' => "\n\n".ctrans('texts.client_unsubscribed_help', ['client' => $this->contact->present()->name()])."\n\n",
];
$mail_obj = new \stdClass();
@@ -49,6 +51,7 @@ class ClientUnsubscribedObject
$mail_obj->data = $data;
$mail_obj->markdown = 'email.admin.generic';
$mail_obj->tag = $this->company->company_key;
+ $mail_obj->text_view = 'email.template.text';
return $mail_obj;
}
diff --git a/app/Models/ClientContact.php b/app/Models/ClientContact.php
index 0acdfb09cf42..2f5a948feae8 100644
--- a/app/Models/ClientContact.php
+++ b/app/Models/ClientContact.php
@@ -11,22 +11,23 @@
namespace App\Models;
-use App\Jobs\Mail\NinjaMailer;
-use App\Jobs\Mail\NinjaMailerJob;
-use App\Jobs\Mail\NinjaMailerObject;
-use App\Mail\ClientContact\ClientContactResetPasswordObject;
-use App\Models\Presenters\ClientContactPresenter;
use App\Utils\Ninja;
+use Illuminate\Support\Str;
+use App\Jobs\Mail\NinjaMailer;
use App\Utils\Traits\AppSetup;
use App\Utils\Traits\MakesHash;
-use Illuminate\Contracts\Translation\HasLocalePreference;
-use Illuminate\Database\Eloquent\Factories\HasFactory;
-use Illuminate\Database\Eloquent\Model;
-use Illuminate\Database\Eloquent\SoftDeletes;
-use Illuminate\Foundation\Auth\User as Authenticatable;
-use Illuminate\Notifications\Notifiable;
+use App\Jobs\Mail\NinjaMailerJob;
+use App\Jobs\Mail\NinjaMailerObject;
use Illuminate\Support\Facades\Cache;
+use Illuminate\Database\Eloquent\Model;
+use Illuminate\Notifications\Notifiable;
use Laracasts\Presenter\PresentableTrait;
+use Illuminate\Database\Eloquent\SoftDeletes;
+use App\Models\Presenters\ClientContactPresenter;
+use Illuminate\Database\Eloquent\Factories\HasFactory;
+use Illuminate\Foundation\Auth\User as Authenticatable;
+use Illuminate\Contracts\Translation\HasLocalePreference;
+use App\Mail\ClientContact\ClientContactResetPasswordObject;
/**
* Class ClientContact
@@ -339,4 +340,16 @@ class ClientContact extends Authenticatable implements HasLocalePreference
return '';
}
}
+
+ public function getAdminLink($use_react_link = false): string
+ {
+ return $use_react_link ? $this->getReactLink() : config('ninja.app_url');
+ }
+
+ private function getReactLink(): string
+ {
+ return config('ninja.react_url')."/#/clients/{$this->client->hashed_id}";
+ }
+
+
}
diff --git a/lang/en/texts.php b/lang/en/texts.php
index 4fc584147e40..ceb0e221993e 100644
--- a/lang/en/texts.php
+++ b/lang/en/texts.php
@@ -5213,8 +5213,8 @@ $lang = array(
'nordigen_requisition_body' => 'Access to bank account feeds has expired as set in End User Agreement.
Please log into Invoice Ninja and re-authenticate with your banks to continue receiving transactions.',
'participant' => 'Participant',
'participant_name' => 'Participant name',
- 'client_unsubscribed' => 'Client changed e-mail preferences',
- 'client_unsubscribed_help' => 'Client :client changed preferences and unsubscribed from e-mails.',
+ 'client_unsubscribed' => 'Client unsubscribed from emails.',
+ 'client_unsubscribed_help' => 'Client :client has unsubscribed from your e-mails. The client needs to consent to receive future emails from you.',
'resubscribe' => 'Resubscribe',
'subscribe' => 'Subscribe',
'subscribe_help' => 'You are currently subscribed and will continue to receive email communications.',