added SMS balance and Sent SMS

This commit is contained in:
Kwesi Banson Jnr
2026-04-22 13:46:57 +00:00
parent 431dbc7da6
commit d42764a89d
7 changed files with 172 additions and 12 deletions

View File

@@ -9,7 +9,10 @@
### client
- hixu@mailinator.com/frantic@300
## Sunking
- https://smsportal.clickmlapps.com/
- info@sunking.com
- 847SIcgO9sUX
### add
- change pagination to 1000 from 20
- remove delivery receipt

View File

@@ -83,15 +83,17 @@ class ClientsLoginController extends Controller
$logged_in = '';
$client = Models\ClientSession::where('email', $request->email)->first();
// dd($client);
if ($client == false) {
return redirect()->back()->withErrors(['Invalid credentials']);
}
$client_url = "clients/" . $client->client_id;
$result = ApiCalls::CurlGet($client_url);
$result_arr = json_decode($result, true);
$logged_in = $result_arr;
$request->session()->regenerate(true);
$request->session()->put('current_user.user_id', $logged_in['id']);
$request->session()->put('current_user.org_id', $logged_in['id']);

View File

@@ -8,6 +8,7 @@ use App\Utilities\ApiCalls;
use Session;
use Illuminate\Pagination\LengthAwarePaginator;
use GuzzleHttp\Client;
use DateTime;
class ClientsTrafficController extends Controller
{
@@ -38,15 +39,34 @@ class ClientsTrafficController extends Controller
);
}
public function index(){
//dump(session('current_user'));
$client_id = session('current_user.org_id');
$clients_url = "messages/client/$client_id?page=0&size=1000&sort=createdAt,desc";
$result = ApiCalls::CurlGet($clients_url);
$result_arr = json_decode($result);
// dump($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";
$result = ApiCalls::CurlGet($daily_smsunits_url);
$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);
$data = [
'page_title' => 'SMS Traffic',
'traffic_arr' => $result_arr
'traffic_arr' => $result_arr,
'sms_units_arr' => $sms_units_arr,
'balance_arr' => $balance_arr
];
return view('client-traffic.index-test', $data);
}
@@ -155,6 +175,22 @@ class ClientsTrafficController extends Controller
}
Session::flash('success_message', 'Message successfully submitted for delivery!');
return redirect("send-sms");
}
public function dailySmsUnits(Request $request){
$this->validate($request, [
'start_date' => 'required|date',
'end_date' => 'required|date',
]);
$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);
$data = json_decode($result, true);
return response()->json($data);
}
public function newAppStore(Request $request){

11
info.md Normal file
View File

@@ -0,0 +1,11 @@
Messaging Notes- meeting with Victor on messaging with focus on the dashboard
They would like a Finance feature that shows the account balances
App to include option for report that shows balances , consumption and balances
They do not require CDRs for the report but volumes of the messages sent
Messaging report for call centre usage that enables them to extract OTP
Message access for last 3-6 hours
Sam added that we can provide functionality for the App to be useable by multiple departments
Victor will be able to share feedback on the endpoint change by 24th April.
They have Mozambique and Madagascar offices that we could potentially onboard and Victor will loop us in but mentioned they would require the dashboard functionality

View File

@@ -5,9 +5,11 @@
@section('page-css')
<!-- <link href="https://unpkg.com/tabulator-tables@6.4.0/dist/css/tabulator.min.css" rel="stylesheet"> -->
<link href="{{ url('public/libs/tabulator-master/dist/css/tabulator_bootstrap5.css') }}" rel="stylesheet">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/vanillajs-datepicker@1.1.4/dist/css/datepicker.min.css">
@endsection
@section('content')
<section class="traffic-hero mb-4">
<div class="row g-4 align-items-end">
<div class="col-lg-8">
@@ -17,8 +19,65 @@
Search sent SMS, review delivery outcomes, inspect failed attempts, and give clients a fast audit trail for every campaign.
</p> -->
</div>
<div class="col-lg-4"></div>
<div class="col-lg-4">
<div class="row g-3">
<!-- <div class="col-6">
<div class="rounded-4 p-3 bg-white bg-opacity-10">
<div class="small opacity-75">Campaigns</div>
<div class="h3 mb-0">18</div>
</div>
</div> -->
<div class="col-12">
<div class="rounded-4 p-3 bg-white bg-opacity-10">
<div class="small opacity-75">SMS Account Balance</div>
<div class="h3 mb-0" id="mainSmsBalance">{{ number_format($balance_arr['balance']) }}</div>
</div>
</div>
</div>
</div>
</div>
</section>
<section class="row g-4 mb-4">
<div class="col-md-6 col-xl-6">
<article class="traffic-card">
<div class="d-flex align-items-start justify-content-between mb-3">
<!-- <div class="icon-wrap"><i class="bi bi-send-check"></i></div> -->
<!-- <span class="small text-success fw-semibold">+12.6%</span> -->
</div>
<div class="muted-label mb-2">
<!-- Messages sent from -->
<span id="reportRange">{{ $sms_units_arr['reportDate'] }}</span> </div>
<div class="row">
<div class="col-md-6">
<input id="startDate" name="start_date" type="text" class="form-control" placeholder="Select Start Date">
</div>
<div class="col-md-6">
<input id="endDate" name="end_date" type="text" class="form-control" placeholder="Select End Date">
</div>
<div id="loadingSpinner" class="spinner-border text-primary" role="status" style="display:none;">
<span class="visually-hidden">Loading...</span>
</div>
</div>
<!-- <div class="h3 mb-2 pt-1" id="smsUnitsValue">SMS Units : {{ $sms_units_arr['smsUnits'] }}</div> -->
<!-- <div class="mini-chart"><span style="width: 52%;"></span></div> -->
</article>
</div>
<div class="col-md-6 col-xl-6">
<article class="traffic-card">
<div class="d-flex align-items-start justify-content-between mb-3">
<div class="icon-wrap"><i class="bi bi-check2-circle"></i></div>
<!-- <span class="small text-success fw-semibold">98.4%</span> -->
</div>
<div class="muted-label mb-2">Sent Messages</div>
<!-- <div class="h3 mb-2">183,372</div> -->
<div class="h3 mb-2 pt-1" id="smsUnitsValue">SMS Units : {{ $sms_units_arr['smsUnits'] }}</div>
<div class="mini-chart"><span style="width: 98%;"></span></div>
</article>
</div>
</section>
<section class="row g-4">
<div class="col-xl-12">
@@ -38,7 +97,6 @@
<div class="col-md-12">
<div class="float-end">
<!-- <label for="search" class="form-label fw-semibold">Search</label> -->
<!-- <input id="search" type="text" class="form-control" placeholder="Phone, sender ID, text"> -->
</div>
@@ -47,6 +105,7 @@
</div>
<div class="traffic-table-card">
<h2 class="h4 mb-1">Sent SMS list</h2>
<div class="p-1">
<button id="download-pdf" class="btn btn-danger"><i class="bi bi-file-pdf-fill me-2"></i> Export PDF</button>
<button id="download-xlsx" class="btn btn-success"><i class="bi bi-file-excel-fill me-2"></i> Export Excel</button>
@@ -77,6 +136,8 @@
@endsection
@section('page-js')
<!-- <script src="https://unpkg.com/tabulator-tables@6.4.0/dist/js/tabulator.min.js"></script> -->
<script src="https://cdn.jsdelivr.net/npm/vanillajs-datepicker@1.1.4/dist/js/datepicker.min.js"></script>
<script src="{{ url('public/libs/tabulator-master/dist/js/tabulator.min.js') }}"></script>
<script src="https://unpkg.com/jspdf@latest/dist/jspdf.umd.min.js"></script>
@@ -85,6 +146,51 @@
<script src="{{ url('public/libs/tabulator-master/dist/js/autotable.min.js') }}"></script>
<script>
console.log(base_url);
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 endDatepicker = new Datepicker(endDateElement, {
autohide: true,
format: 'yyyy-mm-dd'
});
function sendDailySmsUnits() {
document.getElementById('loadingSpinner').style.display = 'inline-block';
const endpoint = "{{ route('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 => {
console.log('Server response:', data);
console.log(data.smsUnits);
document.getElementById('loadingSpinner').style.display = 'none';
const theReportRange = document.getElementById('reportRange');
const theSmsUnitsValue = document.getElementById('smsUnitsValue');
theReportRange.innerHTML = data.reportDate;
theSmsUnitsValue.innerHTML = "SMS Units : " + data.smsUnits;
})
.catch(error => console.error('Error:', error));
}
//startDateElement.addEventListener('changeDate', sendDailySmsUnits);
endDateElement.addEventListener('changeDate', sendDailySmsUnits);
function statusDesign (cell, formatterParams){
var value = cell.getValue();
// if(value === 'Approved'){
@@ -102,7 +208,7 @@
}
}
var table = new Tabulator("#message-table", {
ajaxURL: "https://smsportal.clickmlapps.com/client-traffic-tabulator/",
ajaxURL: base_url = "client-traffic-tabulator", // "https://smsportal.clickmlapps.com/client-traffic-tabulator/",
ajaxConfig: {
method: "GET",
headers: {

View File

@@ -6,6 +6,7 @@
<!-- <title>Click Client Portal | SMS Traffic</title> -->
<title>@yield('page-title') | Client Portal </title>
<meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests">
<meta name="csrf-token" content="{{ csrf_token() }}">
<link rel="icon" type="image/png" href="{{ url('public/assets/images/click-logo.png') }}">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>

View File

@@ -60,6 +60,7 @@ Route::post('/client-activation', [App\Http\Controllers\ClientsLoginController::
Route::post('send-sms', [App\Http\Controllers\ClientsTrafficController::class, 'store'])->name('client.sendsms');
Route::post('client-newapp', [App\Http\Controllers\ClientsTrafficController::class, 'newAppStore'])->name('client.sendsms');
Route::post('client-dailysmsunits', [App\Http\Controllers\ClientsTrafficController::class, 'dailySmsUnits'])->name('client.dailysmsunits');
// Route::post('send-sms', [App\Http\Controllers\ClientsTrafficController::class, 'store'])->name('client.sendsms');