diff --git a/API.md b/API.md index 586036b..76054b9 100644 --- a/API.md +++ b/API.md @@ -243,3 +243,5 @@ How it updates `messages`: Missing or invalid `Authorization: Bearer ` returns a `ProblemDetail` response with `status=401`. + http://206.225.84.201:9990/api/clients?page=0&size=20&sort=createdAt,desc + diff --git a/accounts.md b/accounts.md index 0bac4ae..58967f7 100644 --- a/accounts.md +++ b/accounts.md @@ -19,4 +19,19 @@ - remove delivery receipt -http://10.199.0.11/botswana/bpc/web \ No newline at end of file +http://10.199.0.11/botswana/bpc/web + +https://smsgateway.clickmlapps.com/api/ + +## Sunking Mozambique +{ + "id": 14, + "name": "Sunking Mozambique", + "email": "mozambiqueinf@sunking.com", + "country": "Mozambique", + "phoneNumber": "+258858480000", + "status": "NEW", + "createdAt": "2026-06-22T10:20:10.319231Z", + "updatedAt": "2026-06-22T10:20:10.319244Z" +} +info@sunkingmozambique.com/oc4P6i@510A8U6 \ No newline at end of file diff --git a/api-change-june-22-2026.md b/api-change-june-22-2026.md new file mode 100644 index 0000000..a8630b4 --- /dev/null +++ b/api-change-june-22-2026.md @@ -0,0 +1,18 @@ +http://localhost:9990/api/ucm/reports/daily-sms-units-by-network?from={{reportDateFrom}}&to={{reportDateTo}}&ucm_org_id=701 +http://localhost:9990/api/ucm/reports/daily-sms-units-by-network?from={{reportDateFrom}}&to={{reportDateTo}}&ucm_org_id=701 + +Expected response:{ + "reportDate": "2026-02-26 to 2026-03-27", + "orgId": 701, + "movitelMzSmsUnits": 0, + "tmcelMzSmsUnits": 0, + "vodacomMzSmsUnits": 0 +} + +{{baseUrl}}/api/ucm/reports/daily-sms-units?from={{reportDateFrom}}&to={{reportDateTo}}&ucm_org_id=629 +expected response: { + "reportDate": "2026-02-26 to 2026-03-27", + "orgId": 629, + "smsUnits": 908202, + "clientChargeTotal": 6596.267261251807 +} \ No newline at end of file diff --git a/app/Http/Controllers/ClientsLoginController.php b/app/Http/Controllers/ClientsLoginController.php index 08c463a..fc59231 100644 --- a/app/Http/Controllers/ClientsLoginController.php +++ b/app/Http/Controllers/ClientsLoginController.php @@ -44,7 +44,6 @@ class ClientsLoginController extends Controller } public function activation(Request $request){ $this->validate($request, [ - // 'activation_hash' => 'required', 'password' => 'required', // 'password' => ['required', 'min:8', 'confirmed'] 'password' => ['required','confirmed', Password::min(8)->letters()->numbers(),] @@ -83,19 +82,21 @@ class ClientsLoginController extends Controller $logged_in = ''; $client = Models\ClientSession::where('email', $request->email)->first(); + // dump($client); if ($client == false) { return redirect()->back()->withErrors(['Invalid credentials']); } + $client_url = "clients/" . $client->client_id; $result = ApiCalls::CurlGet($client_url); - + // dd($result); $result_arr = json_decode($result, true); $logged_in = $result_arr; // dd($logged_in); - $request->session()->regenerate(true); $request->session()->put('current_user.user_id', $logged_in['id']); $request->session()->put('current_user.org_id', $logged_in['id']); + $request->session()->put('current_user.ucm_org_id', $client->ucm_org_id); $request->session()->put('current_user.name', $logged_in['name']); $request->session()->put('current_user.email', $logged_in['email']); $request->session()->put('current_user.role', $client['role']); diff --git a/app/Http/Controllers/ClientsTrafficController.php b/app/Http/Controllers/ClientsTrafficController.php index 92cd245..2bc4bd3 100644 --- a/app/Http/Controllers/ClientsTrafficController.php +++ b/app/Http/Controllers/ClientsTrafficController.php @@ -38,26 +38,36 @@ class ClientsTrafficController extends Controller ['path' => $request->url(), 'query' => $request->query()] ); } + public function indexTest(){ + $data = ['page_title' => 'Test Page']; + return view('client-traffic.test', $data); + } public function index(){ $client_id = session('current_user.org_id'); + $ucm_org_id = session('current_user.ucm_org_id'); + // dd($client_id); $clients_url = "messages/client/$client_id?page=0&size=1000&sort=createdAt,desc"; $result = ApiCalls::CurlGet($clients_url); $result_arr = json_decode($result); - + // dd($result_arr); + $current_date = new DateTime(); $start_date = $current_date->modify('-10 days'); $start_date = $start_date->format('Y-m-d'); $end_date = date('Y-m-d'); - $daily_smsunits_url = "ucm/reports/daily-sms-units?from=$start_date&to=$end_date"; + $daily_smsunits_url = "ucm/reports/daily-sms-units?from=$start_date&to=$end_date&ucm_org_id=$ucm_org_id"; + $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"; + $daily_smsunits_url_split = "ucm/reports/daily-sms-units-by-network?from=$start_date&to=$end_date&ucm_org_id=$ucm_org_id"; + // dump($daily_smsunits_url_split); $result = ApiCalls::CurlGet($daily_smsunits_url_split); $split_sms_units_arr = json_decode($result, true); - + // dd($split_sms_units_arr); $orgId = session('current_user.org_id'); $sms_balance_url = "clients/$orgId/balance"; $result = ApiCalls::CurlGet($sms_balance_url); @@ -77,22 +87,49 @@ class ClientsTrafficController extends Controller "TNM SMSUnits" => 18796 */ // dump($split_sms_units_arr); - $airtel_rate = 14; - $tnm_rate = 18; - $airtel_computation = $split_sms_units_arr['Airtel SMSUnits'] * $airtel_rate; - $tnm_computation = $split_sms_units_arr['TNM SMSUnits'] * $tnm_rate; - $charge_computation = $airtel_computation + $tnm_computation; - + + if ($ucm_org_id == 629) { + $airtel_rate = 14; + $tnm_rate = 18; + $airtel_computation = $split_sms_units_arr['Airtel SMSUnits'] * $airtel_rate; + $tnm_computation = $split_sms_units_arr['TNM SMSUnits'] * $tnm_rate; + $charge_computation = $airtel_computation + $tnm_computation; + $split_sms_units_arr['charge_computation'] = number_format($charge_computation); - $split_sms_units_arr['charge_computation'] = number_format($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 - ]; + $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 + ]; + } + elseif($ucm_org_id == 701){ + // "movitelMzSmsUnits" => 0 + // "tmcelMzSmsUnits" => 0 + // "vodacomMzSmsUnits" => 1 + $movitel_rate = 0.32; + $tmcell_rate = 0.32; + $vodacom_rate = 0.32; + $movitel_computation = $split_sms_units_arr['movitelMzSmsUnits'] * $movitel_rate; + $tmcell_computation = $split_sms_units_arr['tmcelMzSmsUnits'] * $tmcell_rate; + $vodacom_computation = $split_sms_units_arr['tmcelMzSmsUnits'] * $vodacom_rate; + + $charge_computation = $movitel_computation + $tmcell_computation + $vodacom_computation; + $split_sms_units_arr['charge_computation'] = number_format($charge_computation); + $split_sms_units_arr['units_computation'] = $split_sms_units_arr['movitelMzSmsUnits'] + $split_sms_units_arr['tmcelMzSmsUnits'] + $split_sms_units_arr['vodacomMzSmsUnits']; + $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); } @@ -210,19 +247,61 @@ class ClientsTrafficController extends Controller ]); $start_date = $request->start_date; $end_date = $request->end_date; + $client_id = session('current_user.org_id'); + $ucm_org_id = session('current_user.ucm_org_id'); /* $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"; + $daily_smsunits_url_split = "ucm/reports/daily-sms-units-by-network?from=$start_date&to=$end_date&ucm_org_id=$ucm_org_id"; $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); + if ($ucm_org_id == 629) { + + $airtel_rate = 14; + $tnm_rate = 18; + + $airtel_computation = $split_sms_units_arr['Airtel SMSUnits'] * $airtel_rate; + $tnm_computation = $split_sms_units_arr['TNM SMSUnits'] * $tnm_rate; + + $charge_computation = (int)$airtel_computation + (int)$tnm_computation; + + $data['ucm_org_id'] = $ucm_org_id; + $data['charge_computation'] = number_format($charge_computation); + $data['airtel_sms_units'] = number_format($split_sms_units_arr['Airtel SMSUnits']); + $data['tnm_sms_units'] = number_format($split_sms_units_arr['TNM SMSUnits']); + + return response()->json($data); + } + elseif($ucm_org_id == 701){ + // "movitelMzSmsUnits" => 0 + // "tmcelMzSmsUnits" => 0 + // "vodacomMzSmsUnits" => 1 + + $movitel_rate = 0.32; + $tmcell_rate = 0.32; + $vodacom_rate = 0.32; + + $movitel_computation = $split_sms_units_arr['movitelMzSmsUnits'] * $movitel_rate; + $tmcell_computation = $split_sms_units_arr['tmcelMzSmsUnits'] * $tmcell_rate; + $vodacom_computation = $split_sms_units_arr['tmcelMzSmsUnits'] * $vodacom_rate; + + + $charge_computation = (int)$movitel_computation + (int)$tmcell_computation + (int)$vodacom_computation; + + $data['ucm_org_id'] = $ucm_org_id; + $data['charge_computation'] = number_format($charge_computation); + $units_computation = (int)$split_sms_units_arr['movitelMzSmsUnits'] + (int)$split_sms_units_arr['tmcelMzSmsUnits'] + (int)$split_sms_units_arr['vodacomMzSmsUnits']; + $data['units_computation'] = $units_computation; + return response()->json($data); + } + /* $airtel_rate = 14; $tnm_rate = 18; @@ -237,8 +316,9 @@ class ClientsTrafficController extends Controller $data['charge_computation'] = number_format($charge_computation); $data['airtel_sms_units'] = number_format($split_sms_units_arr['Airtel SMSUnits']); $data['tnm_sms_units'] = number_format($split_sms_units_arr['TNM SMSUnits']); + */ - return response()->json($data); + } public function dailySmsUnitsSplit(){ diff --git a/app/Utilities/ApiCalls.php b/app/Utilities/ApiCalls.php index d9cac87..c105217 100644 --- a/app/Utilities/ApiCalls.php +++ b/app/Utilities/ApiCalls.php @@ -42,7 +42,7 @@ class ApiCalls $api_key = $result_arr->content[0]->apiKey; $header_part = "Authorization: Bearer " . $api_key; //env('SUNKING_APIKEY'); } - // dd($header_part); + \Log::info('Request Params :' . $data); $curl = curl_init(); curl_setopt_array($curl, array( diff --git a/public/assets/js/traffic-mgt.js b/public/assets/js/traffic-mgt.js index 42c6639..66bec83 100644 --- a/public/assets/js/traffic-mgt.js +++ b/public/assets/js/traffic-mgt.js @@ -13,28 +13,7 @@ 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)); - } + function sendDailySmsUnits() { document.getElementById('loadingOverlay').style.display = 'flex'; const endpoint = "client-dailysmsunits"; @@ -52,18 +31,17 @@ const theSmsUnitsValue = document.getElementById('smsUnitsValue'); const theSmsChargeTotalValue = document.getElementById('smsUnitsCharge'); theReportRange.innerHTML = data.reportDate; + - //const formattedTNMUnits = Number(data.tnm_sms_units']).toLocaleString('en-GH'); + if (data.ucm_org_id === 629) { + theSmsChargeTotalValue.innerHTML = 'SMS Charge (MWK) : ' + data.charge_computation + ''; + theSmsUnitsValue.innerHTML = 'SMS Units: Airtel ' + data.airtel_sms_units + ' | TNM: ' + data.tnm_sms_units + ''; + } + else { + theSmsChargeTotalValue.innerHTML = 'SMS Charge (MZM) : ' + data.charge_computation + ''; + theSmsUnitsValue.innerHTML = 'SMS Units: ' + data.units_computation; - // const formattedAirtelUnits = Number(data.data['airtel_sms_units']).toLocaleString('en-GH', { - // minimumFractionDigits: 2, - // maximumFractionDigits: 2 - // }); - - theSmsChargeTotalValue.innerHTML = 'SMS Charge (MWK) : ' + data.charge_computation + ''; - console.log(data.charge_computation); - console.log(data.airtel_sms_units); - theSmsUnitsValue.innerHTML = 'SMS Units: Airtel ' + data.airtel_sms_units + ' | TNM: ' + data.tnm_sms_units + ''; + } }) .catch(error => console.error('Error:', error)); } diff --git a/resources/views/client-traffic/client-apps.blade.php b/resources/views/client-traffic/client-apps.blade.php index 7b035cd..f627d1d 100644 --- a/resources/views/client-traffic/client-apps.blade.php +++ b/resources/views/client-traffic/client-apps.blade.php @@ -63,9 +63,9 @@

Recent activity

-
Sender ID approved
+
-
Campaign completed
+
diff --git a/resources/views/client-traffic/index-main.blade.php b/resources/views/client-traffic/index-main.blade.php index 2dc09c9..a84a996 100644 --- a/resources/views/client-traffic/index-main.blade.php +++ b/resources/views/client-traffic/index-main.blade.php @@ -81,9 +81,12 @@
Sent Messages (last 10 days)
-
SMS Charge(MWK) : {{ $split_sms_units_arr['charge_computation'] }}
+
SMS Charge() : {{ $split_sms_units_arr['charge_computation'] }}
+ @if(session('current_user.ucm_org_id') == 629)
SMS Units : Airtel : {{ number_format($split_sms_units_arr['Airtel SMSUnits']) }} | TNM : {{ number_format($split_sms_units_arr['TNM SMSUnits']) }}
- + @else +
SMS Units : {{ number_format($split_sms_units_arr['units_computation']) }}
+ @endif
diff --git a/resources/views/client-traffic/test.blade.php b/resources/views/client-traffic/test.blade.php new file mode 100644 index 0000000..ce4130d --- /dev/null +++ b/resources/views/client-traffic/test.blade.php @@ -0,0 +1,59 @@ + + + + + + Bootstrap 5 Starter + + + + + + + + + +
+
+
+
+
+
+

Welcome to the Test Page!

+
+
+

This is a clean, responsive section built with Bootstrap 5. + Components like forms, cards, and navigation on the way.

+

Grid system for layout and utility classes for styling.

+ +
+
+
+
+
+
+ + + + + \ No newline at end of file diff --git a/resources/views/layouts/master.blade.php b/resources/views/layouts/master.blade.php index b84bdb6..96f1686 100644 --- a/resources/views/layouts/master.blade.php +++ b/resources/views/layouts/master.blade.php @@ -27,6 +27,7 @@ @include('client-traffic.partials.new-app') +