From 143e1590e0ff293500b19536b18a6ce13fc7bb1c Mon Sep 17 00:00:00 2001 From: Kwesi Banson Jnr Date: Mon, 27 Jul 2026 09:03:12 +0000 Subject: [PATCH] updated client module --- app/Http/Controllers/AuthController.php | 11 +- app/Http/Controllers/ClientsController.php | 262 ++++++++++++++++++ public/assets/js/client-show-modal.js | 88 ++++++ resources/views/clients/index.blade.php | 2 +- .../shortcode-payment-docs-modal.blade.php | 125 +++++++++ resources/views/clients/show.blade.php | 24 +- routes/web.php | 7 +- 7 files changed, 514 insertions(+), 5 deletions(-) create mode 100644 public/assets/js/client-show-modal.js create mode 100644 resources/views/clients/partials/shortcode-payment-docs-modal.blade.php diff --git a/app/Http/Controllers/AuthController.php b/app/Http/Controllers/AuthController.php index 08718f6..b767cb3 100644 --- a/app/Http/Controllers/AuthController.php +++ b/app/Http/Controllers/AuthController.php @@ -7,8 +7,17 @@ use Illuminate\Support\Facades\Auth; class AuthController extends Controller { - // Your login method is likely here... + // public function login(Request $request) + // { + // if (Auth::attempt($credentials)) { + // $request->session()->regenerate(); + + // return redirect()->intended('/'); + // } + + // return back()->withErrors([...]); + // } /** * Log the user out of the application. */ diff --git a/app/Http/Controllers/ClientsController.php b/app/Http/Controllers/ClientsController.php index aae2fce..1cfeaf6 100644 --- a/app/Http/Controllers/ClientsController.php +++ b/app/Http/Controllers/ClientsController.php @@ -382,4 +382,266 @@ class ClientsController extends Controller Session::flash('success_message', 'Client successfully added'); return redirect('clients'); } + + + + + public function storeFiles(AddFilesRequest $request){ + $document_arr = $request->except('document'); + if ($request->hasFile('document')) { + if ($request->file('document')->isValid()) { + $filename = "erp_" . time() . "." . $request->document->extension(); + $request->document->storeAs('client_files', $filename, 'public'); + $document_arr['document'] = json_encode([$filename]); + } + } + $client = Models\Client::find($request->client_id); + $document_arr['file_extension'] = $request->document->extension(); + $document_arr['file_reff'] = time() . uniqid(); + $document_arr['last_modified_by'] = session('current_user.id'); + + $result = Models\ClientFile::create($document_arr); + + if ($result) { + $data = ['code' => 1, 'msg' => 'Document successfully uploaded']; + } + else{ + $data = ['code' => 3, 'msg' => 'Your request could not be handled at this time']; + } + $user_id = session('current_user.id'); + $username = session('current_user.name'); + $content = "User ID : " . $user_id . " (" . $username . ") Document successfully uploaded for " . $client->name; + $this->logUsersActivity($type = 'staff', $content); + return response()->json($data, 200); + + } + public function getClientFile($id){ + $client_file = Models\ClientFile::with('client_info')->findOrFail($id); + $file = public_path('documents/client_files/') . $client_file->file_path; + + $headers = []; + $filename = $client_file->client_info->name . "_" . $client_file->name; + $filename = $this->cleanStr($filename); + $filename = $filename . "." . $client_file->file_extension; + return \Response::download($file, $filename, $headers); + } + public function paymentsStore(Request $request){ + $request->validate([ + 'client_id' => 'required', + 'services' => 'required', + 'invoice_number' => 'required', + 'invoice_amount' => 'required|numeric', + 'invoice_date' => 'required', + 'invoice_status' => 'required', + ]); + $auth_user = session('current_user'); + + if ($request->short_code !== null) { + $check = is_numeric($request->short_code); + if ($check == false) { + $data = ['code' => 3, 'msg' => 'Short Code must be a number']; + return response()->json($data, 200); + } + } + + $finance_arr = [ + 'invoice_number' => $request->invoice_number, + 'invoice_amount' => $request->invoice_amount, + 'invoice_date' => $request->invoice_date, + 'invoice_status' => $request->invoice_status, + 'short_code' => ($request->short_code) ? $request->short_code : "", + 'services' => implode(',', $request->services), + 'user_id' => $auth_user['id'], + 'client_id' => $request->client_id + ]; + if ($request->has('remarks')) { + $finance_arr['remarks'] = $request->remarks; + } + $client = Models\Client::find($request->client_id); + $result = Models\ClientPayment::updateOrCreate(['invoice_number' => $request->invoice_number, 'client_id' => $request->client_id, ], $finance_arr); + if ($request->has('short_code')) { + $short_code_list = Models\ClientShortCode::where('client_id', $request->client_id)->get(); + $client = Models\Client::find($request->client_id); + $message_body = $auth_user['name'] . " has added a new Short Code ($request->short_code) Payment entry for " . $client->name; + + dispatch(new SendShortCodeListToFinance($short_code_list, $message_body, $finance_arr)); + } + + #$payments = Models\ClientPayment::with('client_info', 'created_by_info')->find($result->id); + if ($result) { + $data = ['code' => 1, 'msg' => 'Payment Details successfully added']; + } + else{ + $data = ['code' => 3, 'msg' => 'Your request could not be handled at this time']; + } + $user_id = session('current_user.id'); + $username = session('current_user.name'); + $content = "User ID : " . $user_id . " (" . $username . ") Added a payment record for : " . $client->name; + $this->logUsersActivity($type = 'staff', $content); + return response()->json($data, 200); + } + public function financeUpdate(Request $request){ + $request->validate([ + 'payment_id' => 'required', + 'client_id' => 'required', + 'services' => 'required', + 'invoice_number' => 'required', + 'invoice_amount' => 'required|numeric', + 'invoice_date' => 'required', + 'invoice_status' => 'required' + ]); + + $auth_user = session('current_user'); + $payment = Models\ClientPayment::findOrFail($request->payment_id); + + $payment->invoice_number = $request->invoice_number; + $payment->invoice_amount = $request->invoice_amount; + $payment->invoice_date = $request->invoice_date; + $payment->invoice_status = $request->invoice_status; + $payment->short_code = ($request->short_code) ? $request->short_code : ""; + + $payment->services = implode(',', $request->services); + $result = $payment->save(); + $client = Models\Client::find($request->client_id); + if ($request->has('short_code')) { + $short_code_list = Models\ClientShortCode::where('client_id', $request->client_id)->get(); + + $finance_arr = [ + 'invoice_number' => $request->invoice_number, + 'invoice_amount' => $request->invoice_amount, + 'invoice_date' => $request->invoice_date, + 'invoice_status' => $request->invoice_status, + 'short_code' => ($request->short_code) ? $request->short_code : "", + 'services' => implode(',', $request->services), + 'user_id' => $auth_user['id'], + 'client_id' => $request->client_id + ]; + if ($request->has('remarks')) { + $finance_arr['remarks'] = $request->remarks; + } + $message_body = $auth_user['name'] . " has updated a Short Code ($request->short_code) Payment entry for " . $client->name; + #dispatch(new SendShortCodeListToFinance($short_code_list, $message_body, $finance_arr)); + } + + if ($result) { + $data = ['code' => 1, 'msg' => 'Payment Details successfully updated']; + } + else{ + $data = ['code' => 3, 'msg' => 'Your request could not be handled at this time']; + } + $user_id = session('current_user.id'); + $username = session('current_user.name'); + $content = "User ID : " . $user_id . " (" . $username . ") updated an existing payment record for " . $client->name; + $this->logUsersActivity($type = 'staff', $content); + + + + return response()->json($data, 200); + } + public function shortcodeStore(Request $request){ + $request->validate([ + 'client_id' => 'required', + 'network' => 'required', + 'shortcode' => 'required', + 'code_type' => 'required', + 'toll_free' => 'required', + 'status' => 'required', + 'remarks' => 'required', + 'launch_date' => 'required', + 'expiry_date' => 'required', + 'monthly_fee' => 'sometimes' + ]); + $auth_user = session('current_user'); + + $shortcode_arr = [ + 'name' => $request->name, + 'client_id' => $request->client_id, + 'network' => $request->network, + // 'country' => $mnoCountry, //$network->country, + 'shortcode' => $request->shortcode, + 'code_type' => $request->code_type, + 'toll_free' => $request->toll_free, + 'last_updated_by' => $auth_user['id'], + 'launch_date' => $request->launch_date, + 'expiry_date' => $request->expiry_date, + 'status' => $request->status + + ]; + + // dd($shortcode_arr); + if ($request->has('remarks')) { + $shortcode_arr['remarks'] = $request->remarks; + } + if ($request->has('monthly_fee')) { + $shortcode_arr['monthly_fee'] = $request->monthly_fee; + } + + $result = Models\ClientShortCode::create($shortcode_arr); + $client = Models\Client::find($request->client_id); + if ($result) { + $data = ['code' => 1, 'msg' => 'ShortCode Details successfully added']; + } + else{ + $data = ['code' => 3, 'msg' => 'Your request could not be handled at this time']; + } + $user_id = session('current_user.id'); + $username = session('current_user.name'); + $content = "User ID : " . $user_id . " (" . $username . ") Added new short code for " . $client->name; + $this->logUsersActivity($type = 'staff', $content); + return response()->json($data, 200); + } + public function shortCodeUpdate(Request $request){ + $request->validate([ + 'client_id' => 'required', + 'network' => 'required', + 'shortcode' => 'required', + 'code_type' => 'required', + 'toll_free' => 'required', + 'monthly_fee' => 'sometimes', + 'status' => 'required', + 'remarks' => 'required', + 'launch_date' => 'required', + 'expiry_date' => 'required' + ]); + $auth_user = session('current_user'); + $mnoCountry = $this->getMnoCountry($request->network); + if ($mnoCountry == false) { + $data = ['code' => 3, 'msg' => 'Your request could not be handled at this time']; + return response()->json($data, 200); + // code... + } + $shortcode_arr = [ + 'name' => $request->name, + 'client_id' => $request->client_id, + 'network' => $request->network, + 'country' => $mnoCountry, + 'shortcode' => $request->shortcode, + 'code_type' => $request->code_type, + 'toll_free' => $request->toll_free, + 'last_updated_by' => $auth_user['id'], + 'launch_date' => $request->launch_date, + 'expiry_date' => $request->expiry_date, + 'status' => $request->status + ]; + if ($request->has('remarks')) { + $shortcode_arr['remarks'] = $request->remarks; + } + if ($request->has('monthly_fee')) { + $shortcode_arr['monthly_fee'] = $request->monthly_fee; + } + $result = Models\ClientShortCode::where('id', $request->shortcode_id)->update($shortcode_arr); + + if ($result) { + $data = ['code' => 1, 'msg' => 'Short Code Details successfully updated']; + } + else{ + $data = ['code' => 3, 'msg' => 'Your request could not be handled at this time']; + } + $user_id = session('current_user.id'); + $username = session('current_user.name'); + $content = "User ID : " . $user_id . " (" . $username . ") updated short code enty for " . $request->short_code; + $this->logUsersActivity($type = 'staff', $content); + return response()->json($data, 200); + } + } diff --git a/public/assets/js/client-show-modal.js b/public/assets/js/client-show-modal.js new file mode 100644 index 0000000..cb5c150 --- /dev/null +++ b/public/assets/js/client-show-modal.js @@ -0,0 +1,88 @@ +$(document).ready(function() { + + // Generic AJAX handler for standard forms (Shortcodes & Payments) + function submitAjaxForm(formId, modalId) { + $(formId).on('submit', function(e) { + e.preventDefault(); + let $form = $(this); + let $submitBtn = $form.find('button[type="submit"]'); + let originalBtnText = $submitBtn.text(); + + // Disable button and show loading state + $submitBtn.prop('disabled', true).text('Saving...'); + + $.ajax({ + url: $form.attr('action'), + type: 'POST', + data: $form.serialize(), + headers: { + 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content') + }, + success: function(response) { + // Hide modal + $(modalId).modal('hide'); + // Reset form + $form[0].reset(); + // Reload page to show fresh data (or dynamically append to table) + location.reload(); + }, + error: function(xhr) { + let errors = xhr.responseJSON?.errors; + let errorMsg = 'Something went wrong. Please check your inputs.'; + if (errors) { + errorMsg = Object.values(errors).flat().join('\n'); + } + alert(errorMsg); + }, + complete: function() { + $submitBtn.prop('disabled', false).text(originalBtnText); + } + }); + }); + } + + // AJAX handler for Document Upload (Requires FormData for files) + function submitFileForm(formId, modalId) { + $(formId).on('submit', function(e) { + e.preventDefault(); + let formElement = $(this)[0]; + let formData = new FormData(formElement); + let $submitBtn = $(this).find('button[type="submit"]'); + let originalBtnText = $submitBtn.text(); + + $submitBtn.prop('disabled', true).text('Uploading...'); + + $.ajax({ + url: $(this).attr('action'), + type: 'POST', + data: formData, + processData: false, // Essential for file uploads + contentType: false, // Essential for file uploads + headers: { + 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content') + }, + success: function(response) { + $(modalId).modal('hide'); + formElement.reset(); + location.reload(); + }, + error: function(xhr) { + let errors = xhr.responseJSON?.errors; + let errorMsg = 'Failed to upload document. Please check the file size and format.'; + if (errors) { + errorMsg = Object.values(errors).flat().join('\n'); + } + alert(errorMsg); + }, + complete: function() { + $submitBtn.prop('disabled', false).text(originalBtnText); + } + }); + }); + } + + // Initialize the handlers + submitAjaxForm('#shortcodeForm', '#addShortcodeModal'); + submitAjaxForm('#paymentForm', '#addPaymentModal'); + submitFileForm('#documentForm', '#uploadDocumentModal'); +}); \ No newline at end of file diff --git a/resources/views/clients/index.blade.php b/resources/views/clients/index.blade.php index aa7f80a..105ff88 100644 --- a/resources/views/clients/index.blade.php +++ b/resources/views/clients/index.blade.php @@ -344,7 +344,7 @@ format: format }); - // Redirect the browser to trigger the file download + window.location.href = "{{ route('clients.export') }}?" + queryParams; }); // Render Table Rows diff --git a/resources/views/clients/partials/shortcode-payment-docs-modal.blade.php b/resources/views/clients/partials/shortcode-payment-docs-modal.blade.php new file mode 100644 index 0000000..75db8fb --- /dev/null +++ b/resources/views/clients/partials/shortcode-payment-docs-modal.blade.php @@ -0,0 +1,125 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/resources/views/clients/show.blade.php b/resources/views/clients/show.blade.php index f424682..bf4a28d 100644 --- a/resources/views/clients/show.blade.php +++ b/resources/views/clients/show.blade.php @@ -291,8 +291,10 @@
-
-
+@include('clients.partials.shortcode-payment-docs-modal') +@endsection +@section('scripts') + @endsection \ No newline at end of file diff --git a/routes/web.php b/routes/web.php index 4ea4ead..a1b028a 100644 --- a/routes/web.php +++ b/routes/web.php @@ -17,7 +17,12 @@ Route::middleware(['auth'])->group(function () { Route::get('/clients/data', [App\Http\Controllers\ClientsController::class, 'fetchData'])->name('clients.data'); Route::get('/clients/export', [App\Http\Controllers\ClientController::class, 'export'])->name('clients.export'); - + // {{ route('shortcodes.store') }} + // {{ route('client-payments.store') }} + // {{ route('client-files.store') }} + Route::get('/clients/shortcodes-store', [App\Http\Controllers\ClientController::class, 'shortcodeStore'])->name('shortcodes.store'); + Route::get('/clients/payments-store', [App\Http\Controllers\ClientController::class, 'paymentsStore'])->name('client-payments.store'); + Route::get('/clients/files-store', [App\Http\Controllers\ClientController::class, 'storeFiles'])->name('client-files.store'); Route::resource('clients', App\Http\Controllers\ClientsController::class);