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,334 @@
<?php
//dealers are not using the OrgUsers like SRWB
namespace App\Http\Controllers;
use App\Models;
use Illuminate\Http\Request;
use App\Libs\Smsgateway;
use Session;
use App\ActivityLog;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Str;
class OrganisationsController extends Controller
{
public function index(){
$org_user = session('current_org_user');
// dd($org_user);
$merchants = Models\Merchant::where('org_id', $org_user['org_id'])->latest()->paginate(20);
$data = [
'merchants_list' => $merchants,
'merchants' => $merchants,
'page_title' => 'Merchants',
'org_user' => $org_user,
];
return view('organisation.merchants',$data);
}
public function landing(){
$org_user = session('current_org_user');
$merchants = Models\Merchant::get(); // to be used for tops in the dropdown
$dealer = Models\OrgUser::find($org_user['org_id']);
$merchant_ids = $merchants->pluck('id');
$merchant_topups = Models\MerchantTopUp::with('merchantInfo')->where('org_user_id', $org_user['id'])->orderBy('id', 'DESC')->get();
$data = [
'transaction_count' => $merchant_topups->count(),
'merchants' => $merchants,
'merchant_topups' => $merchant_topups->take(5),
'organisation' => $dealer,
'page_title' => 'Dashboard'
];
return view('organisation.landing',$data);
}
public function transactions(){
$org_user = session('current_org_user');
$data = [
// 'merchant_topups' => $merchant_topups,
'org_user' => $org_user,
'page_title' => 'Dealer Transactions'
];
return view('organisation.transactions', $data);
}
public function getTransactionsJson(Request $request){
$dealer_id = session('current_org_user.id');
$transactions_arr = \DB::table('merchant_top_ups')
->join('org_users', 'merchant_top_ups.org_user_id', '=', 'org_users.id')
->join('merchants', 'merchant_top_ups.merchant_id', '=', 'merchants.id')
->select('merchant_top_ups.id', 'merchant_top_ups.status', 'merchants.phone', 'merchants.fullname', 'merchant_top_ups.payment_method', 'merchant_top_ups.org_user_id', 'merchant_top_ups.amount', 'merchant_top_ups.created_at')
->whereRaw('merchant_top_ups.org_user_id = '. $dealer_id)
->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')
->join('merchants', 'merchant_top_ups.merchant_id', '=', 'merchants.id')
->select('merchant_top_ups.id', 'merchant_top_ups.status', 'merchants.phone', 'merchants.fullname', 'merchant_top_ups.payment_method', 'merchant_top_ups.org_user_id', 'merchant_top_ups.amount', 'merchant_top_ups.created_at')
->whereRaw("merchants.fullname LIKE '%$keyword%' OR merchants.phone 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%'")
->whereRaw('merchant_top_ups.org_user_id = '. $dealer_id)
->orderBy('merchant_top_ups.created_at', 'DESC')
->paginate(10)->appends($queries);
}
return response()->json($transactions_arr);
}
public function mytopups(){
$org_user = session('current_org_user');
$data = [
'org_user' => $org_user,
'page_title' => 'My Top Ups'
];
return view('organisation.mytopups', $data);
}
public function getMyTopUpsJson(Request $request){
$dealer_id = session('current_org_user.id');
$transactions_arr = \DB::table('organisation_top_ups')
->join('org_users', 'organisation_top_ups.org_id', '=', 'org_users.org_id')
->join('users', 'organisation_top_ups.user_id', '=', 'users.id')
->select('organisation_top_ups.id', 'organisation_top_ups.status', 'org_users.phone', 'users.name', 'organisation_top_ups.payment_method', 'organisation_top_ups.org_id', 'organisation_top_ups.amount', 'organisation_top_ups.created_at')
->whereRaw('organisation_top_ups.org_user_id = '. $dealer_id)
->orderBy('organisation_top_ups.created_at', 'DESC')
->paginate(10);
if($request->has('keyword')){
$queries = [];
$keyword = $request->keyword;
$queries['keyword'] = $keyword;
$transactions_arr = \DB::table('organisation_top_ups')
->join('org_users', 'organisation_top_ups.org_user_id', '=', 'org_users.id')
->join('users', 'organisation_top_ups.user_id', '=', 'users.id')
->select('organisation_top_ups.id', 'organisation_top_ups.status', 'org_users.phone', 'users.name', 'organisation_top_ups.payment_method', 'organisation_top_ups.org_id', 'organisation_top_ups.amount', 'organisation_top_ups.created_at')
->whereRaw("org_users.name LIKE '%$keyword%' OR org_users.phone LIKE '%$keyword%' OR organisation_top_ups.status LIKE '%$keyword%' OR organisation_top_ups.payment_method LIKE '%$keyword%' OR organisation_top_ups.amount LIKE '%$keyword%' OR organisation_top_ups.created_at LIKE '%$keyword%'")
->whereRaw('organisation_top_ups.org_user_id = '. $dealer_id)
->orderBy('organisation_top_ups.created_at', 'DESC')
->paginate(10)->appends($queries);
}
return response()->json($transactions_arr);
}
/**
* Show the form for creating a new resource.
*
* @return \Illuminate\Http\Response
*/
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
/**
* Display the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function show($id)
{
$merchant = Merchant::where('id',$id)->with('transactions')->get()[0];
$data = [
'merchant'=>$merchant,
];
return view('merchant.show',$data);
}
/**
* Show the form for editing the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function edit($id)
{
//
$merchant = Merchant::findorfail($id);
$countries = Countries::all();
$data = [
'countries'=>$countries,
'merchant'=>$merchant,
];
return \view('merchant.update',$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, [
'fullname' => 'required',
'phone_number'=> 'required',
'language' => 'required'
]);
$check_phone = $this->validatePhoneNumber($request->phone_number);
if ($check_phone == false) {
return redirect()->back()->withInput()->with('admin-error', 'Invalid phone number!');
}
Merchant::where('id', $id)->update([
'fullname'=> $request->fullname,
'phone'=> $check_phone,
'language' => $request->language
]);
$desc = [
'title' =>'updated a merchant',
'data' => $request->fullname,
'type' => 'merchant',
];
$activity = new ActivityLog;
$activity->user_id = $request->session()->get('current_org_user.id');
$activity->user_type = 'dealer';
$activity->description = json_encode($desc);
$activity->save();
return redirect()->to('/admin/merchant')->with('admin-sucsess', 'Successfully Updated Merchant');
}
public function merchantTopupOtpStore(Request $request){
$org_id = $request->session()->get('current_org_user.org_id');
$org_otp = random_int(1000, 9999);
$dealer = Models\OrgUser::where('org_id', $org_id)->first();
$smsgateway = new Smsgateway;
$request->session()->put('current_org_user.otp', $org_otp);
$msg = "Hello $dealer->name, your one time PIN is $org_otp. Enter this on the form to complete the top up.";
if(env('APP_ENV') !== 'local'){
$message_result = $smsgateway->sendSmsNew($dealer->phone, $msg);
}
\Log::info($msg);
//$this->sendNtfy($msg);
$lastThree = substr($dealer->phone, -3);
return response()->json([
'code' => 1,
'status' => 'success',
'message' => "An OTP has been sent to your phone number ending ... $lastThree. Enter this on the form to complete the top up."
]);
}
public function merchantTopupStore(Request $request)
{
$request->validate([
'merchant' => 'required|exists:merchants,id',
'amount' => 'required|numeric|min:1',
]);
$currentUser = $request->session()->get('current_org_user');
$orgId = $currentUser['org_id'];
$userId = $currentUser['id'];
$amount = (float) $request->amount;
$dealer = Models\OrgUser::findOrFail($orgId);
$merchant = Models\Merchant::findOrFail($request->merchant);
if ($amount > $dealer->balance) {
if ($request->expectsJson()) {
return response()->json([
'code' => 3,
'status' => 'failed',
'message' => 'Insufficient Balance.'
]);
}
Session::flash('success_message', 'Insufficient Balance!!');
return back()->withInput()->withErrors(['amount' => 'Insufficient Balance.']);
}
DB::beginTransaction();
try {
$topup = Models\MerchantTopUp::create([
'merchant_id' => $merchant->id,
// 'org_id' => $orgId,
'amount' => $amount,
'transaction_id' => 'MCH-' . Str::uuid(),
'org_user_id' => $userId,
'created_by' => $userId,
'payment_method' => 'cash'
]);
$merchant->increment('balance', $amount);
$dealer->decrement('balance', $amount);
DB::commit();
} catch (\Exception $e) {
DB::rollBack();
\Log::error($e);
if ($request->expectsJson()) {
return response()->json([
'code' => 3,
'status' => 'failed',
'message' => 'Merchant Top Up failed.'
]);
}
Session::flash('error_message', 'Merchant Top Up failed!!');
return back()->withInput()->with('error', 'Merchant Top Up failed.');
}
ActivityLog::create([
'user_id' => $userId,
'user_type' => 'dealer',
'description' => json_encode([
'title' => 'dealer Added new Top Up',
'data' => 'MWK ' . number_format($amount, 2) . ' for ' . $merchant->fullname,
'type' => 'Dealer topup'
])
]);
$merchant->refresh();
try {
if (!app()->environment('local')) {
(new Smsgateway())->sendSmsNew(
$merchant->phone,
"Hello {$merchant->fullname}, your account has been credited with MWK {$amount}. Your new balance is MWK {$merchant->balance}."
);
}
} catch (\Exception $e) {
\Log::error($e);
}
if ($request->expectsJson()) {
return response()->json([
'code' => 1,
'status' => 'success',
'message' => 'Merchant Top Up Successfully completed.'
]);
}
Session::flash('success_message', 'Merchant Top Up Successfully completed!!');
return back()->with('success', 'Merchant Top Up Successfully completed.');
}
public function getActivity()
{
//
$org_user = session('current_org_user');
$activities = ActivityLog::with('admin')->where('user_type', 'dealer')
->where('user_id', $org_user['id'])
->orderBy('created_at', 'desc')
->paginate(20);
$data = [
'activities' => $activities,
'org_user' => $org_user,
'page_title' => 'Dealer Activity Log'
];
return view('organisation.activity', $data);
}
}