Edit File: DelegateController.php
<?php namespace App\Http\Controllers\Admin; use App\Enums\NotificationTypeEnum; use App\Http\Controllers\Controller; use App\Http\Requests\Admin\Delegate\StoreRequest; use App\Http\Requests\Admin\Delegate\UpdateRequest; use App\Http\Requests\Admin\Notification\SendRequest; use App\Http\Requests\Admin\Wallet\UpdateBalanceRequest; use App\Models\DelegateUpdate; use App\Models\Neighborhood; use App\Notifications\NotifyUser; use App\Services\CityService; use App\Services\CountryService; use App\Services\DelegateService; use App\Services\NeighborhoodService; use App\Services\NotificationService; use App\Traits\ReportTrait; use Illuminate\Http\Request; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Notification; class DelegateController extends Controller { public function __construct( protected DelegateService $delegateService, protected CountryService $countryService, protected CityService $cityService, protected NeighborhoodService $neighborhoodService, ) { } public function index($id = null) { if (request()->ajax()) { $delegates = $this->delegateService->all(paginateNum: 20); $html = view('admin.delegates.table', compact('delegates'))->render(); return response()->json(['html' => $html]); } return view('admin.delegates.index'); } public function getData() { $countries = $this->countryService->allWithoutPagination()->pluck('key', 'key')->toArray(); $cities = $this->cityService->allWithoutPagination()->pluck('name', 'id')->toArray(); $neighborhoods = $this->neighborhoodService->allWithoutPagination()->pluck('name', 'id')->toArray(); return compact('countries', 'cities', 'neighborhoods'); } public function create() { return view('admin.delegates.create', $this->getData()); } public function store(StoreRequest $request) { $result = $this->delegateService->create(request: $request->validated()); $this->delegateService ->CreateManyToManyRelation(relationName: 'neighborhoods', user: $result, request: $request->neighborhoods); $this->delegateService ->createHasOneRelation(relationName: 'bankAccount', user: $result, request: $request->validated()); ReportTrait::addToLog(' اضافه مندوب'); return response()->json(['url' => route('admin.delegates.index')]); } public function edit($id) { $row = $this->delegateService->find($id); $neighborhoods = $this->neighborhoodService->allWhereColumn('city_id', $row->city_id)->pluck('name', 'id')->toArray(); return view('admin.delegates.edit', ['row' => $row, 'neighborhoods' => $neighborhoods] + $this->getData()); } public function update(UpdateRequest $request, $id) { $user = $this->delegateService->edit($request->validated(), $id); $this->delegateService ->updateManyToManyRelation(relationName: 'neighborhoods', user: $user, request: $request->neighborhoods); $this->delegateService ->createHasOneRelation(relationName: 'bankAccount', user: $user, request: $request->validated()); ReportTrait::addToLog(' تعديل مندوب'); return response()->json(['url' => route('admin.delegates.index')]); } public function showNewDataRequested($id) { $row = DelegateUpdate::with('delegate') ->whereHas('delegate', function ($query) use ($id) { $query->where('id', $id); })->first(); if (!$row) { return redirect()->route('admin.delegates.index'); } $neighborhoods = Neighborhood::whereIn('id', $row->neighborhoods)->pluck('name')->toArray(); return view('admin.delegates.show_update_request', compact('row', 'neighborhoods')); } public function approveNewDataRequested($id) { $row = DelegateUpdate::with('delegate') ->whereHas('delegate', function ($query) use ($id) { $query->where('id', $id); })->first(); try { DB::beginTransaction(); DB::table('delegates')->where('id', $id)->update([ 'name' => $row->name ?? $row->delegate->name, 'email' => $row->email, 'car_plat_number' => $row->car_plat_number ?? $row->delegate->car_plat_number, 'city_id' => $row->city_id ?? $row->delegate->city_id, 'lat' => $row->lat ?? $row->delegate->lat, 'lng' => $row->lng ?? $row->delegate->lng, 'map_desc' => $row->map_desc ?? $row->delegate->map_desc, 'car_images' => $row->getRawOriginal('car_images') ?: $row->delegate->getRawOriginal('car_images'), 'identity_images' => $row->getRawOriginal('identity_images') ?: $row->delegate->getRawOriginal('identity_images'), 'licencses_certificate' => $row->getRawOriginal('licencses_certificate') ?: $row->delegate->getRawOriginal('licencses_certificate'), 'image' => $row->getRawOriginal('image') ?: $row->delegate->getRawOriginal('image'), ]); $row->delegate?->neighborhoods()->sync($row->neighborhoods); $row->delegate?->bankAccount()->update([ 'account_name' => $row->account_name, 'account_number' => $row->account_number, 'bank_name' => $row->bank_name, 'iban' => $row->iban, ]); $this->sendNotification($row->delegate, NotificationTypeEnum::Admin_Accept_Request_For_Edit->value); $row->delete(); DB::commit(); return redirect(route('admin.delegates.index'))->with('success', 'تم قبول التعديل بنجاح'); } catch (\Exception $exception) { DB::rollBack(); return redirect(route('admin.delegates.index'))->with('error', 'حدث خطأ ما'); } } public function refuseNewDataRequested($id) { $row = DelegateUpdate::with('delegate') ->whereHas('delegate', function ($query) use ($id) { $query->where('id', $id); })->first(); $this->sendNotification($row->delegate, NotificationTypeEnum::Admin_Decline_Request_For_Edit->value); $row->delete(); return redirect(route('admin.delegates.index'))->with('success', 'تم رفض التعديل بنجاح'); } protected function sendNotification($user, $type): void { $title = 'title_' . $type; $body = 'body_' . $type; $data = [ 'body_ar' => __(key: "notification.$body", locale: 'ar'), 'body_en' => __(key: "notification.$body", locale: 'en'), 'body_ur' => __(key: "notification.$body", locale: 'ur'), 'title_ar' => __(key: "notification.$title", locale: 'ar'), 'title_en' => __(key: "notification.$title", locale: 'en'), 'title_ur' => __(key: "notification.$title", locale: 'ur'), ]; Notification::send($user, new NotifyUser($data, $type)); } public function block(Request $request) { $data = $this->delegateService->block($request->id); return response()->json(['message' => $data['msg']]); } public function approve(Request $request) { $data = $this->delegateService->approve($request->id); return response()->json(['message' => $data['msg']]); } public function notify(SendRequest $request, NotificationService $notificationService) { $notificationService->send($request); return response()->json(); } public function updateBalance(UpdateBalanceRequest $request, $id) { $data = $this->delegateService->updateBalance(request: $request, id: $id); return response()->json(['key' => $data['key'], 'msg' => $data['msg'], 'balance' => $data['balance']]); } public function show($id) { $row = $this->delegateService->find($id); $neighborhoods = $this->neighborhoodService->allWhereColumn('city_id', $row->city_id)->pluck('name', 'id')->toArray(); if (request()->ajax()) { $data = $this->delegateService->details(user: $row); return response()->json(['html' => $data['html']]); } return view('admin.delegates.show', ['row' => $row, 'neighborhoods' => $neighborhoods]); } // getNeighborhoods public function getNeighborhoods(Request $request) { $neighborhoods = $this->neighborhoodService->allWhereColumn('city_id', $request->city_id)->pluck('name', 'id')->toArray(); return response()->json(['neighborhoods' => $neighborhoods]); } }
Back to File Manager