Initial commit

This commit is contained in:
Kwesi Banson Jnr
2026-08-04 14:50:01 +00:00
commit 2cfcfade4e
1605 changed files with 499334 additions and 0 deletions

View File

@@ -0,0 +1,383 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Models;
use Session;
use DB;
use Illuminate\Support\Facades\Hash;
use App\ActivityLog;
use App\Libs\Smsgateway;
class AdminController extends Controller
{
public function index(){
$dealers = Models\OrgUser::latest()->paginate(20);
$data = [
'organisations' => $dealers,
'page_title' => 'Dealers'
];
return view('super_admin.organisations',$data);
}
public function merchant_index(){
$merchants = Models\Merchant::paginate(20);
$data = [
'merchants' => $merchants,
'page_title' => 'Merchants'
];
return view('super_admin.merchants',$data);
}
public function createOrg(){ //create a dealer
$data = [
'page_title' => 'New Dealer'
];
return view('super_admin.create-org', $data);
}
/**
* Store a newly created merchant in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request){ // save merchant in the DB
$this->validate($request, [
'fullname' => 'required',
'phone_number'=> 'required|unique:merchants,phone',
'language' => 'required'
]);
$check_phone = $this->validatePhoneNumber($request->phone_number);
if ($check_phone == false) {
return redirect()->back()->withInput()->with('admin-error', 'Invalid phone number!');
}
$fullname = $request->input('fullname');
$phone_number = $request->input('phone_number');
$pin = rand(1000,9999);
$merchant = Models\Merchant::create([
'fullname' => $fullname,
'phone' => $check_phone,
'pin' => md5($pin),
'language' => $request->language
]);
$desc = [
'title' => 'Created a merchant',
'data' => $fullname,
'type' => 'merchant',
];
$activity = new ActivityLog;
$activity->user_id = Auth::user()->id;
$activity->user_type = 'admin';
$activity->description = json_encode($desc);
$activity->save();
// TODO: send sms with PIN to merchant phone -
$msg = "You have been Successfully registered as an Airtime sales merchant. Your 4-digit PIN is $pin. You wull need it for all your activities. Dial *349# to begin.";
$smsgateway = new Smsgateway;
if (env('APP_ENV') != 'local') {
$result = $smsgateway->sendSmsNew($check_phone, $msg);
}
// $result = $smsgateway->sendSmsNew($check_phone, $msg);
\Log::info($msg);
return redirect()->to('/admin/merchant')->with('admin-sucsess', 'Successfully Added New Merchant');
}
public function organisationStore(Request $request){
$this->validate($request, [
'user_phone' => 'required',
'user_email' => 'required',
'user_name' => 'required',
'country' => 'required',
'currency' => 'required'
]);
$generated_password = $this->randomPassword();
$org_user_results = Models\OrgUser::create([
'name' => $request->user_name,
'phone' => $request->user_phone,
'email' => $request->user_email,
'country' => $request->country,
'currency' => $request->currency,
'added_by' => \Auth::user()->name,
'password' => Hash::make($generated_password),
]);
$desc = [
'title' => 'New Dealer',
'data' => \Auth::user()->name . ' added a new dealer with name ' . $request->name,
'type' => 'store',
];
$activity = new ActivityLog;
$activity->user_id = \Auth::user()->id;
$activity->user_type = 'admin';
$activity->description = json_encode($desc);
$activity->save();
$login_url = env('MAIN_WEB_URL') . "/organisation";
// TODO: send sms with Password to merchant phone -
$msg = "Hello ($request->name), you have successfully been registered as an Airtime Sales Dealer. Your Password is $generated_password. You will need it for all your activities. \r\nLogin Here : $login_url";
$smsgateway = new Smsgateway;
if (env('APP_ENV') != 'local') {
$result = $smsgateway->sendSmsNew($check_user_phone, $msg);
}
\Log::info($msg);
Session::flash('success_message', 'Dealer Successfully added!');
return redirect()->to('/admin/organisations');
}
/**
* Show the form for editing the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function edit($id)
{
//
$dealer = Models\OrgUser::findOrfail($id);
if (!$dealer) {
return redirect()->back()->with('admin-error', 'Dealer not found!');
}
// check if the user is allowed to edit this organisation
$data = [
'organisation' => $dealer,
'page_title' => 'Edit Dealer',
];
return view('super_admin.organisation_edit',$data);
}
public function show($id)
{
//
$dealer = Models\OrgUser::findOrfail($id);
if (!$dealer) {
return redirect()->back()->with('admin-error', 'Dealer not found!');
}
// check if the user is allowed to edit this organisation
$data = [
'organisation' => $dealer,
'page_title' => 'Dealer Details',
];
return view('super_admin.organisation_show', $data);
}
public function merchant_edit($id){
$merchant = Models\Merchant::findOrfail($id);
if (!$merchant) {
return redirect()->back()->with('admin-error', 'Merchant not found!');
}
$data = [
'merchant' => $merchant,
'page_title' => 'Edit Merchant Details',
];
return view('super_admin.merchant_edit',$data);
}
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param int $id
* @return \Illuminate\Http\Response
*/
public function update(Request $request, $id)
{
$this->validate($request, [
'name' => 'required',
'email' => 'required',
'country' => 'required',
'currency' => 'required',
'phone' => [
'required',
'string',
'regex:/^\+?[0-9\s\-\(\)]{7,15}$/', // Allows optional leading '+' and 7 to 15 digits/formatting characters
],
]);
// dd($request->all());
Models\OrgUser::where('id', $id)->update([
'name' => $request->name,
'phone' => $request->phone,
'email' => $request->email,
'last_modified_user_id' => \Auth::user()->id,
'status' => $request->status,
]);
$desc = [
'title' =>'Updated Dealer details',
'data' => $request->all(),
'type' => 'update',
];
$activity = new ActivityLog;
$activity->user_id = \Auth::user()->id; //session('current_org_user.id');// organisation user ID
$activity->user_type = 'super_admin';
$activity->description = json_encode($desc);
$activity->save();
// dd('Activity logged');
return redirect()->to('admin/organisations')->with('admin-success', 'Successfully Updated Dealer details');
}
public function merchant_update(Request $request, $id)
{
$this->validate($request, [
'fullname' => 'required',
'phone'=> 'required',
// 'email' => 'required',
'language' => 'required',
'status' => 'required',
// 'user_name' => 'required',
]);
$check_phone = $this->validatePhoneNumber($request->phone);
if ($check_phone == false) {
return redirect()->back()->withInput()->with('admin-error', 'Invalid phone number!');
}
// dd($request->all());
Models\Merchant::where('id', $id)->update([
'fullname' => $request->fullname,
'phone' => $check_phone,
'language' => $request->language,
// 'last_modified_user_id' => \Auth::user()->id,
'status' => $request->status,
// 'user_email' => $request->user_email,
// 'user_name' => $request->user_name
]);
$desc = [
'title' =>'Updated Dealer details',
'data' => $request->all(),
'type' => 'Merchant',
];
$activity = new ActivityLog;
$activity->user_id = \Auth::user()->id; //session('current_org_user.id');// organisation user ID
$activity->user_type = 'merchant';
$activity->description = json_encode($desc);
$activity->save();
// dd('Activity logged');
return redirect()->to('admin/merchants')->with('admin-success', 'Successfully Updated merchant details');
}
public function getMerchantSales(){
// sales from merchants to end users
$merchant_sales = Models\Transaction::with('merchant')->latest()->paginate(30);
$data = [
'merchant_sales' => $merchant_sales,
'page_title' => 'Merchant Sales'
];
return view('super_admin.merchant_sales', $data);
}
public function getDealerSales(){
// sales from dealers to merchants
$dealer_sales = Models\MerchantTopUp::with('merchantInfo', 'orgInfo')->latest()->paginate(20);
// dd($dealer_sales);
$data = [
'dealer_sales' => $dealer_sales,
'page_title' => 'Dealer Sales'
];
return view('super_admin.dealer_sales', $data);
}
public function AdminTransactions(){
$data = [
'page_title' => 'Admin Transactions'
];
return view('super_admin.admin-transactions', $data);
}
public function getTransactionsJson(Request $request)
{
//$this->log_query();
$transactions_arr = \DB::table('merchant_top_ups')
->join('org_users', 'merchant_top_ups.org_user_id', '=', 'org_users.id')
->select('merchant_top_ups.id', 'merchant_top_ups.status', 'org_users.name', 'merchant_top_ups.payment_method', 'merchant_top_ups.org_user_id', 'merchant_top_ups.amount', 'merchant_top_ups.created_at')
->orderBy('merchant_top_ups.created_at', 'DESC')
->paginate(10);
if($request->has('keyword')){
$queries = [];
$keyword = $request->keyword;
$queries['keyword'] = $keyword;
$transactions_arr = \DB::table('merchant_top_ups')
->join('org_users', 'merchant_top_ups.org_user_id', '=', 'org_users.id')
->select('merchant_top_ups.id', 'merchant_top_ups.status', 'org_users.name', 'merchant_top_ups.payment_method', 'merchant_top_ups.org_user_id', 'merchant_top_ups.amount', 'merchant_top_ups.created_at')
->whereRaw("org_user.name LIKE '%$keyword%' OR merchant_top_ups.status LIKE '%$keyword%' OR merchant_top_ups.payment_method LIKE '%$keyword%' OR merchant_top_ups.amount LIKE '%$keyword%' OR merchant_top_ups.created_at LIKE '%$keyword%'")
->orderBy('merchant_top_ups.created_at', 'DESC')
->paginate(10)->appends($queries);
}
return response()->json($transactions_arr);
}
public function getAdminTransactionsJson(Request $request)
{
$query = \DB::table('organisation_top_ups')
->join('users', 'users.id', '=', 'organisation_top_ups.user_id')
->join('organisations', 'organisations.id', '=', 'organisation_top_ups.org_id')
->select(
'organisation_top_ups.id', 'organisation_top_ups.current_balance', 'organisations.balance',
'organisation_top_ups.amount', 'organisation_top_ups.status', 'users.name AS admin_name',
'organisation_top_ups.created_at', 'users.name', 'organisations.name AS dealer_name'
);
if ($request->has('filter')) {
$filters = $request->input('filter');
// Map the Tabulator JS fields to the actual database table columns
$columnMap = [
'admin_name' => 'users.name',
'balance' => 'organisations.balance',
'current_balance' => 'organisation_top_ups.current_balance',
'amount' => 'organisation_top_ups.amount',
'dealer_name' => 'organisations.name'
];
foreach ($filters as $filter) {
$field = $filter['field'];
$value = $filter['value'];
// Determine the correct DB column. Default to sender_ids table to avoid 'ambiguous column' errors
$dbColumn = $columnMap[$field] ?? 'organisation_top_ups.' . $field;
// Securely bind the value using Laravel's active record (prevents SQL injection)
$query->where($dbColumn, 'LIKE', '%' . $value . '%');
}
}
$query->orderBy('organisation_top_ups.created_at', 'DESC');
$perPage = $request->input('size', 15);
$senderid_arr = $query->paginate($perPage);
// If using the global keyword, append it to the pagination links
if ($request->has('keyword')) {
$senderid_arr->appends(['keyword' => $request->keyword]);
}
return response()->json($senderid_arr);
}
public function randomPassword() {
$alphabet = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890';
$pass = array(); //remember to declare $pass as an array
$alphaLength = strlen($alphabet) - 1; //put the length -1 in cache
for ($i = 0; $i < 8; $i++) {
$n = rand(0, $alphaLength);
$pass[] = $alphabet[$n];
}
return implode($pass); //turn the array into a string
}
}