From a666004f9859c2ed63be8f492109a1056d73a572 Mon Sep 17 00:00:00 2001 From: Kwesi Banson Jnr Date: Wed, 20 May 2026 07:24:13 +0000 Subject: [PATCH] modified the SMS Units and Charge --- .htaccess | 5 + .../Controllers/ClientsTrafficController.php | 44 ++- public/assets/js/traffic-mgt.js | 254 ++++++++++-------- .../views/client-traffic/index-main.blade.php | 5 +- resources/views/layouts/master.blade.php | 3 +- 5 files changed, 192 insertions(+), 119 deletions(-) diff --git a/.htaccess b/.htaccess index cf19eae..05f3e6c 100644 --- a/.htaccess +++ b/.htaccess @@ -23,5 +23,10 @@ RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ index.php [L] + + order allow,deny + deny from all + satisfy all + php_value upload_max_filesize 512M php_value post_max_size 512M diff --git a/app/Http/Controllers/ClientsTrafficController.php b/app/Http/Controllers/ClientsTrafficController.php index b8ac6ee..763fa81 100644 --- a/app/Http/Controllers/ClientsTrafficController.php +++ b/app/Http/Controllers/ClientsTrafficController.php @@ -54,22 +54,45 @@ class ClientsTrafficController extends Controller $result = ApiCalls::CurlGet($daily_smsunits_url); $sms_units_arr = json_decode($result, true); + $daily_smsunits_url_split = "ucm/reports/daily-sms-units-by-network?from=$start_date&to=$end_date"; + $result = ApiCalls::CurlGet($daily_smsunits_url_split); + $split_sms_units_arr = json_decode($result, true); + $orgId = session('current_user.org_id'); $sms_balance_url = "clients/$orgId/balance"; $result = ApiCalls::CurlGet($sms_balance_url); $balance_arr = json_decode($result, true); - - // dump($sms_units_arr); + /* + array:4 [▼ // app/Http/Controllers/ClientsTrafficController.php:67 + "reportDate" => "2026-05-10 to 2026-05-20" + "orgId" => 629 + "Airtel SMSUnits" => 401095 + "TNM SMSUnits" => 18796 + ] + "reportDate" => "2026-05-10 to 2026-05-20" + "orgId" => 629 + "Airtel SMSUnits" => 401095 + "TNM SMSUnits" => 18796 + */ + // dump($split_sms_units_arr); + $airtel_rate = 14; + $tnm_rate = 18; + $charge_computation = number_format(($split_sms_units_arr['Airtel SMSUnits'] * $airtel_rate) + ($split_sms_units_arr['TNM SMSUnits'] + $tnm_rate), 2); + $split_sms_units_arr['charge_computation'] = $charge_computation; $data = [ 'page_title' => 'SMS Traffic', 'traffic_arr' => $result_arr, 'sms_units_arr' => $sms_units_arr, + 'split_sms_units_arr' => $split_sms_units_arr, + 'charge_computation' => $charge_computation, 'balance_arr' => $balance_arr ]; + // dd($data); return view('client-traffic.index-main', $data); } + public function indexTabulator(Request $request){ $client = new Client(); @@ -183,14 +206,29 @@ class ClientsTrafficController extends Controller ]); $start_date = $request->start_date; $end_date = $request->end_date; + /* $daily_smsunits_url = "ucm/reports/daily-sms-units?from=$start_date&to=$end_date"; $result = ApiCalls::CurlGet($daily_smsunits_url); \Log::info('SMS Units Response ' . $result); + */ + + $daily_smsunits_url_split = "ucm/reports/daily-sms-units-by-network?from=$start_date&to=$end_date"; + $result = ApiCalls::CurlGet($daily_smsunits_url_split); + $split_sms_units_arr = json_decode($result, true); + \Log::info('SMS Units Response ' . $result); $data = json_decode($result, true); + + $airtel_rate = 14; + $tnm_rate = 18; + $charge_computation = ($split_sms_units_arr['Airtel SMSUnits'] * $airtel_rate) + ($split_sms_units_arr['TNM SMSUnits'] + $tnm_rate); + $data['charge_computation'] = number_format($charge_computation, 2); + return response()->json($data); + } + public function dailySmsUnitsSplit(){ - + $clients_url = "ucm/reports/daily-sms-units-by-network?from={{reportDateFrom}}&to={{reportDateTo}}"; } public function newAppStore(Request $request){ diff --git a/public/assets/js/traffic-mgt.js b/public/assets/js/traffic-mgt.js index 4a5bd1a..df36473 100644 --- a/public/assets/js/traffic-mgt.js +++ b/public/assets/js/traffic-mgt.js @@ -1,123 +1,153 @@ - const token = document.querySelector('meta[name="csrf-token"]').getAttribute('content'); - const startDateElement = document.getElementById('startDate'); - const endDateElement = document.getElementById('endDate'); + const token = document.querySelector('meta[name="csrf-token"]').getAttribute('content'); + const startDateElement = document.getElementById('startDate'); + const endDateElement = document.getElementById('endDate'); - const startDatepicker = new Datepicker(startDateElement, { - autohide: true, - format: 'yyyy-mm-dd' - }); + const startDatepicker = new Datepicker(startDateElement, { + autohide: true, + format: 'yyyy-mm-dd' + }); - - const endDatepicker = new Datepicker(endDateElement, { - autohide: true, - format: 'yyyy-mm-dd' - }); - - function sendDailySmsUnits() { - document.getElementById('loadingOverlay').style.display = 'flex'; - const endpoint = "client-dailysmsunits"; - const startDate = startDateElement.value; - const endDate = endDateElement.value; - fetch(endpoint, { - method: 'POST', - headers: { 'Content-Type': 'application/x-www-form-urlencoded', 'X-CSRF-TOKEN': token }, - body: 'start_date=' + encodeURIComponent(startDate) + '&end_date=' + encodeURIComponent(endDate) - }) - .then(response => response.json()) - .then(data => { - // document.getElementById('loadingSpinner').style.display = 'none'; - document.getElementById('loadingOverlay').style.display = 'none'; - const theReportRange = document.getElementById('reportRange'); - const theSmsUnitsValue = document.getElementById('smsUnitsValue'); - theReportRange.innerHTML = data.reportDate; - theSmsUnitsValue.innerHTML = "SMS Units : " + data.smsUnits + "| Charge : " + data.clientChargeTotal.toFixed(2); + + const endDatepicker = new Datepicker(endDateElement, { + autohide: true, + format: 'yyyy-mm-dd' + }); + + function sendDailySmsUnitsOld() { + document.getElementById('loadingOverlay').style.display = 'flex'; + const endpoint = "client-dailysmsunits"; + const startDate = startDateElement.value; + const endDate = endDateElement.value; + fetch(endpoint, { + method: 'POST', + headers: { 'Content-Type': 'application/x-www-form-urlencoded', 'X-CSRF-TOKEN': token }, + body: 'start_date=' + encodeURIComponent(startDate) + '&end_date=' + encodeURIComponent(endDate) + }) + .then(response => response.json()) + .then(data => { + // document.getElementById('loadingSpinner').style.display = 'none'; + document.getElementById('loadingOverlay').style.display = 'none'; + const theReportRange = document.getElementById('reportRange'); + const theSmsUnitsValue = document.getElementById('smsUnitsValue'); + theReportRange.innerHTML = data.reportDate; + theSmsUnitsValue.innerHTML = "SMS Units : " + data.smsUnits + "| Charge : " + data.clientChargeTotal.toFixed(2); - }) - .catch(error => console.error('Error:', error)); + }) + .catch(error => console.error('Error:', error)); + } + function sendDailySmsUnits() { + document.getElementById('loadingOverlay').style.display = 'flex'; + const endpoint = "client-dailysmsunits"; + const startDate = startDateElement.value; + const endDate = endDateElement.value; + fetch(endpoint, { + method: 'POST', + headers: { 'Content-Type': 'application/x-www-form-urlencoded', 'X-CSRF-TOKEN': token }, + body: 'start_date=' + encodeURIComponent(startDate) + '&end_date=' + encodeURIComponent(endDate) + }) + .then(response => response.json()) + .then(data => { + document.getElementById('loadingOverlay').style.display = 'none'; + const theReportRange = document.getElementById('reportRange'); + const theSmsUnitsValue = document.getElementById('smsUnitsValue'); + const theSmsChargeTotalValue = document.getElementById('smsUnitsCharge'); + theReportRange.innerHTML = data.reportDate; + + const formattedTNMUnits = Number(data['TNM SMSUnits']).toLocaleString('en-GH'); + + const formattedAirtelUnits = Number(data.data['Airtel SMSUnits']).toLocaleString('en-GH', { + minimumFractionDigits: 2, + maximumFractionDigits: 2 + }); + + theSmsChargeTotalValue.innerHTML = 'SMS Charge(MWK) : ' + data.charge_computation; + theSmsUnitsValue.innerHTML = `SMS Units: Airtel ${formattedAirtelUnits} | TNM: ${formattedTNMUnits}`; + }) + .catch(error => console.error('Error:', error)); + } + endDateElement.addEventListener('changeDate', sendDailySmsUnits); + + + function statusDesign (cell, formatterParams){ + var value = cell.getValue(); + if (value !== null) { + if(value.includes('SENT')){ + return "" + value + ""; } - endDateElement.addEventListener('changeDate', sendDailySmsUnits); + else{ + return "" + value + ""; + } + } + } + var table = new Tabulator("#message-table", { + ajaxURL: base_url = "client-traffic-tabulator", + ajaxConfig: { + method: "GET", + headers: { + "Content-type": "application/json; charset=utf-8", + }, + }, + ajaxParams: {size: 1000}, + pagination: "remote", + paginationSize: 20, + paginationDataSent: { + "page": "page", + "size": "size" + }, + paginationDataReceived: { + "last_page": "totalPages", + "data": "content", + "current_page": "number", + "total": "totalElements" + }, + ajaxResponse: function(url, params, response) { + return response.content; + }, + columns: [ + {title: "Sender", field: "from", width:150, headerFilter:"input"}, + {title: "Msisdn", field: "to", width:150, headerFilter:"input"}, + {title:"Message", field:"message", width:650, formatter:"textarea", headerFilter:"input"}, + { + title:"Date Created", + field:"createdAt", + width:200, + formatter:"datetime", + formatterParams:{ + inputFormat:"iso", + outputFormat:"yyyy-MM-dd", + invalidPlaceholder:"(invalid date)" + }, + headerFilter:function(cell, onRendered, success, cancel){ + var input = document.createElement("input"); + input.type = "date"; + input.addEventListener("change", function(){ + console.log(input.value); + success(input.value); + }); - function statusDesign (cell, formatterParams){ - var value = cell.getValue(); - if (value !== null) { - if(value.includes('SENT')){ - return "" + value + ""; - } - else{ - return "" + value + ""; + return input; + }, + headerFilterFunc:function(headerValue, rowValue){ + if(!headerValue){ return true; } // no filter + if(!rowValue){ return false; } + + const rowDate = new Date(rowValue); + const formatted = rowDate.toISOString().split("T")[0]; // yyyy-MM-dd + + return formatted === headerValue; } } - } - var table = new Tabulator("#message-table", { - ajaxURL: base_url = "client-traffic-tabulator", - ajaxConfig: { - method: "GET", - headers: { - "Content-type": "application/json; charset=utf-8", - }, - }, - ajaxParams: {size: 1000}, - pagination: "remote", - paginationSize: 20, - paginationDataSent: { - "page": "page", - "size": "size" - }, - paginationDataReceived: { - "last_page": "totalPages", - "data": "content", - "current_page": "number", - "total": "totalElements" - }, - ajaxResponse: function(url, params, response) { - return response.content; - }, - columns: [ - {title: "Sender", field: "from", width:150, headerFilter:"input"}, - {title: "Msisdn", field: "to", width:150, headerFilter:"input"}, - {title:"Message", field:"message", width:650, formatter:"textarea", headerFilter:"input"}, - { - title:"Date Created", - field:"createdAt", - width:200, - formatter:"datetime", - formatterParams:{ - inputFormat:"iso", - outputFormat:"yyyy-MM-dd", - invalidPlaceholder:"(invalid date)" - }, - headerFilter:function(cell, onRendered, success, cancel){ - var input = document.createElement("input"); - input.type = "date"; + ], + }); - input.addEventListener("change", function(){ - console.log(input.value); - success(input.value); - }); - - return input; - }, - headerFilterFunc:function(headerValue, rowValue){ - if(!headerValue){ return true; } // no filter - if(!rowValue){ return false; } - - const rowDate = new Date(rowValue); - const formatted = rowDate.toISOString().split("T")[0]; // yyyy-MM-dd - - return formatted === headerValue; - } - } - ], + document.getElementById("download-pdf").addEventListener("click", function(){ + table.download("pdf", "messages.pdf", { + orientation:"portrait", // portrait or landscape + title:"Messages Export", // document title }); + }); - document.getElementById("download-pdf").addEventListener("click", function(){ - table.download("pdf", "messages.pdf", { - orientation:"portrait", // portrait or landscape - title:"Messages Export", // document title - }); - }); - - document.getElementById("download-xlsx").addEventListener("click", function(){ - table.download("xlsx", "messages.xlsx", {sheetName:"Messages"}); - }); \ No newline at end of file + document.getElementById("download-xlsx").addEventListener("click", function(){ + table.download("xlsx", "messages.xlsx", {sheetName:"Messages"}); + }); \ No newline at end of file diff --git a/resources/views/client-traffic/index-main.blade.php b/resources/views/client-traffic/index-main.blade.php index 757815c..a9f656c 100644 --- a/resources/views/client-traffic/index-main.blade.php +++ b/resources/views/client-traffic/index-main.blade.php @@ -55,7 +55,7 @@
- {{ $sms_units_arr['reportDate'] }}
+ {{ $split_sms_units_arr['reportDate'] }}
@@ -81,7 +81,8 @@
Sent Messages
-
SMS Units : {{ $sms_units_arr['smsUnits'] }} | Charge : {{ number_format($sms_units_arr['clientChargeTotal'], 2) }}
+
SMS Charge(MWK) : {{ $split_sms_units_arr['charge_computation'] }}
+
SMS Units : Airtel : {{ number_format($split_sms_units_arr['Airtel SMSUnits']) }} | TNM : {{ number_format($split_sms_units_arr['TNM SMSUnits']) }}
diff --git a/resources/views/layouts/master.blade.php b/resources/views/layouts/master.blade.php index 3e6fa41..b84bdb6 100644 --- a/resources/views/layouts/master.blade.php +++ b/resources/views/layouts/master.blade.php @@ -3,9 +3,8 @@ - - @yield('page-title') | Client Portal + @yield('page-title') | Client Portal