Samson Mutunga 1 жил өмнө
parent
commit
6aef0edcf2

+ 35 - 0
app/Http/Controllers/AdminController.php

@@ -306,6 +306,12 @@ class AdminController extends Controller
         return $this->pass();
     }
 
+    public function userEmails(Request $request, User $user){
+        $detailJson = $user->detailJson();
+        $emailsSent = @$detailJson->emails_sent ?? [];
+        return view('app.my-account.admin.users.sub.emails', compact('user', 'emailsSent'));
+    }
+
     public function userMessages(Request $request, User $user){
         $messages = Message::where('to_user_id', $user->id)->orWhere('from_user_id', $user->id);
         $messages = $messages->orderBy('created_at', 'ASC')->paginate(25);
@@ -406,6 +412,35 @@ class AdminController extends Controller
         return $this->pass($userCreateAccountResponse['data']);
     }
 
+    public function createNewEmail(Request $request){
+        $userUid = $request->get('userUid');
+        $user = User::where('uid', $userUid)->first();
+        if (!$user) {
+        return $this->fail('Invalid user!');
+        }
+        $content = $request->get('content');
+        $subject = $request->get('subject');
+
+        $detailJson = $user->detailJson();
+        $detailJson->emails_sent = @$detailJson->emails_sent ?? [];
+
+        $emailData = [
+            'created_at' => date('Y-m-d h:m:s'),
+            'to' => $user->getEmail(),
+            'subject' => $subject,
+            'content' => $content
+        ];
+
+        array_unshift($detailJson->emails_sent, $emailData);
+
+        $this->emailService->sendUserCustomEmail($user, $emailData);
+
+        $user->detail_json = json_encode($detailJson);
+        $user->save();
+
+        return $this->pass($user->uid);
+    }
+
     public function storeUserDetailJson(Request $request, User $user)
   {
     $data = [

+ 6 - 1
app/Http/Controllers/EmailTestController.php

@@ -41,7 +41,12 @@ class EmailTestController extends Controller
                 $appUrl = $this->appUrl;
                 $emailFromName = '[EMAIL_FROM_NAME]';
                 $storeOrder = StoreOrder::first();
-                return view('emails/templates/' . $email, compact('user', 'appUrl', 'stringMappingConfig', 'appInternalName', 'emailFromName', 'storeOrder',));
+                $emailData = [
+                    'to' => 'abc@def.com',
+                    'suject' => '',
+                    'content' => 'Some content'
+                ];
+                return view('emails/templates/' . $email, compact('user', 'emailData', 'appUrl', 'stringMappingConfig', 'appInternalName', 'emailFromName', 'storeOrder',));
             } 
             else {
                 abort(404);

+ 24 - 0
app/Http/Services/EmailService.php

@@ -191,4 +191,28 @@ class EmailService
 
         $response = $this->callJava('/api/email/send', $params, null);
     }
+
+    public function sendUserCustomEmail(User $user, array $emailData)
+    {
+        if (!@$emailData['to']) return;
+        $appInternalName = $this->appInternalName;
+        $stringMappingConfig = $this->stringMappingConfig;
+        $appUrl = $this->appUrl;
+        $emailFromName = $this->emailFromName;
+        $html = (string) view('emails.templates.user-custom-email', compact('user', 'emailData', 'appUrl', 'emailFromName', 'appInternalName', 'stringMappingConfig'));
+        $plainText = (string) '';
+
+        $params = [
+            'fromEmailAddress' => $this->fromEmailAddress,
+            'fromName' => $this->emailFromName,
+            'toEmailAddress' => @$emailData['to'],
+            'subject' => @$emailData['subject'],
+            'contentHtml' => $html,
+            'contentText' => $plainText,
+            'entityType' => 'USER',
+            'entityUid' => $user->uid,
+        ];
+
+        $response = $this->callJava('/api/email/send', $params, null);
+    }
 }

+ 2 - 0
app/Models/User.php

@@ -12,6 +12,8 @@ class User extends BaseModel
 
     protected $table = 'app_user';
 
+    public $timestamps = false;
+
     public function getRouteKeyName()
     {
         return 'uid';

+ 21 - 0
resources/views/app/my-account/admin/users/forms/create-email.blade.php

@@ -0,0 +1,21 @@
+<div moe relative>
+    <a start show href="#">+ Send Email</a>
+    <form url="{{ route('admin.create-new-email') }}" redir="/admin/users/view/[data]/emails" right>
+        <input type="hidden" name="userUid" value="{{ $user->uid }}" />
+        <h4 class="fw-bold mb-4">New Email</h4>
+        <div>
+            <div class="mb-2">
+                <label class="text-sm text-secondary mb-1">Subject<sup class="text-danger">*</sup></label>
+                <input type="text" name="subject" class="form-control form-control-sm" required />
+            </div>
+            <div class="mb-2">
+                <label class="text-sm text-secondary mb-1">Email Message<sup class="text-danger">*</sup></label>
+                <textarea name="content" class="form-control form-control-sm" rows="5" required style="height: auto;"></textarea>
+            </div>
+        </div>
+        <div class="d-flex align-items-center mt-3">
+            <button type="button" class="btn py-2 btn-grey border w-100 no-shadow" cancel>Cancel</button>
+            <button class="btn py-2 btn-primary w-100 ms-3" submit>Send</button>
+        </div>
+    </form>
+</div>

+ 4 - 0
resources/views/app/my-account/admin/users/partials/sidebar.blade.php

@@ -38,6 +38,10 @@ $currentMenu = \Illuminate\Support\Facades\Request::segment(4);
                 <a class="nav-link {{\Illuminate\Support\Facades\Route::getCurrentRoute()->getName() === 'admin.users.view.payment-methods' ? 'active' : ''}}"
                    href="{{ route('admin.users.view.payment-methods', $user) }}">Payment Methods</a>
             </li>
+            <li class="nav-item ps-2">
+                <a class="nav-link {{\Illuminate\Support\Facades\Route::getCurrentRoute()->getName() === 'admin.users.view.emails' ? 'active' : ''}}"
+                   href="{{ route('admin.users.view.emails', $user) }}">Emails Sent</a>
+            </li>
             <li class="nav-item ps-2">
                 <a class="nav-link {{\Illuminate\Support\Facades\Route::getCurrentRoute()->getName() === 'admin.users.view.messages' ? 'active' : ''}}"
                    href="{{ route('admin.users.view.messages', $user) }}">Messages</a>

+ 40 - 0
resources/views/app/my-account/admin/users/sub/emails.blade.php

@@ -0,0 +1,40 @@
+@extends('app.my-account.admin.users.single')
+
+@section('details')
+    <div class="my-4">
+        <div class="d-flex align-items-center justify-content-between">
+            <h4 class="m-0"><b>Emails Sent</b></h4>  
+            <div>
+                @include('app.my-account.admin.users.forms.create-email')
+            </div>
+        </div>
+        
+        <div class="table-responsive">
+            <table class="table table-sm table-hover table-striped table-bordered mb-0">
+                <thead>
+                    <tr>
+                        <th>Sent At</th>
+                        <th>To</th>
+                        <th>Subject</th>
+                        <th>Text</th>
+                    </tr>
+                </thead>
+                <tbody>
+                    @foreach ($emailsSent as $email)
+                        <tr>
+                            <td>{{ friendly_date($email->created_at) }}</td>
+                            <td><?= $email->to ?></td>
+                            <td><?= $email->subject ?></td>
+                            <td><?= nl2br($email->content) ?></td>
+                        </tr>
+                    @endforeach
+                    @if(!count($emailsSent))
+                        <tr>
+                            <td colspan="4">No emails sent!</td>
+                        </tr>
+                    @endif
+                </tbody>
+            </table>
+        </div>
+    </div>
+@endsection

+ 3 - 0
resources/views/app/my-account/admin/users/sub/info/name.blade.php

@@ -23,6 +23,9 @@
             @endif
             <span class="me-2">Phone Number: <b>{{ $user->phone_number ?? @$userDetailJson->phone_number ?? '--' }}</b></span>
             <span class="me-2">Notification Option: <b>{{ @$userDetailJson->notification_option ?? '--' }}</b></span>
+            <span>
+                @include('app.my-account.admin.users.forms.create-email')
+            </span>
         </div>
     </div>
     <div>

+ 12 - 0
resources/views/emails/templates/user-custom-email.blade.php

@@ -0,0 +1,12 @@
+@extends('emails.layout')
+@section('salutation')
+    Hi, {{$user->displayName()}}!
+@endsection
+
+@section('content')
+<p class="f-fallback" style="color: #000; font-size: 15px; padding: 0 15px; line-height: 24px; margin: .4em 0 0.1875em;">
+    <?= nl2br(@$emailData['content']) ?>
+</p>
+    @include('emails.call-to-action-button', ['link'=>$stringMappingConfig['productUrl'] .'/my-account', 'label' => 'Access your account'])
+
+@endsection

+ 2 - 0
routes/web.php

@@ -50,6 +50,7 @@ Route::group(['middleware' => ['ensureUserLoggedIn']], function () {
             Route::get('/dashboard', [AdminController::class, 'dashboard'])->name('.dashboard');
             Route::get('/users', [AdminController::class, 'users'])->name('.users');
             Route::post('/create-new-user', [AdminController::class, 'createNewUser'])->name('.create-new-user');
+            Route::post('/create-new-email', [AdminController::class, 'createNewEmail'])->name('.create-new-email');
             Route::prefix('/users/view/{user}')->name('.users.view')->group(function () {
                 Route::get('/dashboard', [AdminController::class, 'userDashboard'])->name('.dashboard');
                 Route::get('/orders', [AdminController::class, 'userOrders'])->name('.orders');
@@ -57,6 +58,7 @@ Route::group(['middleware' => ['ensureUserLoggedIn']], function () {
                 Route::get('/sessions', [AdminController::class, 'userSessions'])->name('.sessions');
                 Route::get('/user-events', [AdminController::class, 'userUserEvents'])->name('.user-events');
                 Route::get('/payment-methods', [AdminController::class, 'userPaymentMethods'])->name('.payment-methods');
+                Route::get('/emails', [AdminController::class, 'userEmails'])->name('.emails');
                 Route::get('/messages', [AdminController::class, 'userMessages'])->name('.messages');
                 Route::get('messages/{message}/attachments', [AdminController::class, 'userMessageAttachments'])->name('message-attachments');
             });