diff --git a/app/Http/Controllers/V3/Dashboard/Mission/RequestPortalController.php b/app/Http/Controllers/V3/Dashboard/Mission/RequestPortalController.php index 43e9b865..2aba04b8 100644 --- a/app/Http/Controllers/V3/Dashboard/Mission/RequestPortalController.php +++ b/app/Http/Controllers/V3/Dashboard/Mission/RequestPortalController.php @@ -37,8 +37,8 @@ class RequestPortalController extends Controller 'username' => $user->username, 'province_id' => $user->province_id, 'province_name' => $user->province_fa, - 'edare_shahri_id' => $user->edare_shahri_id ?? null, - 'edare_shahri_name' => $user->edare_shahri_name ?? null, + 'edare_shahri_id' => $user->edarate_shahri_id ?? null, + 'edare_shahri_name' => $user->edarate_shahri_name ?? null, 'state_id' => $state, 'state_name' => MissionStates::name($state), 'requested_machines' => json_encode($request->requested_machines), @@ -100,7 +100,10 @@ class RequestPortalController extends Controller $mission->rahdaran()->sync($request->rahdaran); if ($request->category_id == 3){ - $mission->roadObserved()->attach($request->road_observed_id); + RoadObserved::query() + ->find($request->road_observed_id) + ->missions() + ->sync($mission->id); } }); diff --git a/app/Http/Controllers/V3/NotificationController.php b/app/Http/Controllers/V3/NotificationController.php index 293a79b3..b05f9f72 100644 --- a/app/Http/Controllers/V3/NotificationController.php +++ b/app/Http/Controllers/V3/NotificationController.php @@ -2,10 +2,12 @@ namespace App\Http\Controllers\V3; +use App\Enums\MissionStates; use App\Exceptions\ProhibitedAction; use App\Http\Controllers\Controller; use App\Http\Traits\ApiResponse; use App\Models\EdarateOstani; +use App\Models\Mission; use App\Models\RoadItemsProject; use App\Models\RoadObserved; use App\Models\SafetyAndPrivacy; @@ -28,6 +30,7 @@ class NotificationController extends Controller 'roadItem' => $this->roadItemNotifications(), 'safetyAndPrivacy' => $this->safetyAndPrivacyNotifications(), 'roadObserved' => $this->roadObservedNotifications(), + 'mission' => $this->missionNotification(), ]); } @@ -185,4 +188,35 @@ class NotificationController extends Controller return $road_observations; } + + public function missionNotification(): array + { + $user = auth()->user(); + $missions = [ + 'request_portal' => Mission::query() + ->where([ + ['state_id', '=', MissionStates::REJECT_BY_TRANSPORTATION->value], + ['user_id', '=', $user->id] + ])->count(), + 'transportation' => 0, + 'control' => 0, + ]; + + if ($user->hasPermissionTo('manage-transportation-unit')) { + $missions['transportation'] = Mission::query()->where([ + ['state_id', '=', MissionStates::REQUEST_CREATED->value], + ['edare_shahri_id', '=', $user->edarate_shahri_id] + ])->count(); + } + if ($user->hasPermissionTo('manage-control-unit')) { + $missions['control'] = Mission::query()->where([ + ['state_id', '=', MissionStates::PENDING_CONFIRMATION->value], + ['edare_shahri_id', '=', $user->edarate_shahri_id] + ])->count(); + } + + $missions['total'] = $missions['request_portal'] + $missions['transportation'] + $missions['control']; + + return $missions; + } } diff --git a/app/Http/Controllers/V3/ProfileController.php b/app/Http/Controllers/V3/ProfileController.php index 008ec6e7..b4b0fa70 100644 --- a/app/Http/Controllers/V3/ProfileController.php +++ b/app/Http/Controllers/V3/ProfileController.php @@ -22,6 +22,7 @@ class ProfileController extends Controller $user = Auth::user(); return $this->successResponse([ + 'id' => $user->id, 'username' => $user->username, 'first_name' => $user->first_name, 'last_name' => $user->last_name, diff --git a/app/Http/Controllers/V3/RahdaranController.php b/app/Http/Controllers/V3/RahdaranController.php index 12ebc614..e287ff84 100644 --- a/app/Http/Controllers/V3/RahdaranController.php +++ b/app/Http/Controllers/V3/RahdaranController.php @@ -61,16 +61,10 @@ class RahdaranController extends Controller public function search(Request $request): JsonResponse { - if ($request->has('code')) { - $matchedSearchedRahdaran = Rahdaran::query() - ->where('code', 'LIKE', "%{$request->code}%") - ->get(); - } - else { - $matchedSearchedRahdaran = Rahdaran::query() - ->where('name', 'LIKE', "%{$request->name}%") - ->get(); - } + $matchedSearchedRahdaran = Rahdaran::query() + ->where('code', 'LIKE', "%{$request->search}%") + ->orWhere('name', 'LIKE', "%{$request->search}%") + ->get(); return $this->successResponse($matchedSearchedRahdaran); } diff --git a/app/Http/Controllers/V3/Dashboard/RoadItem/WebServiceController.php b/app/Http/Controllers/V3/WebServices/RoadItemController.php similarity index 54% rename from app/Http/Controllers/V3/Dashboard/RoadItem/WebServiceController.php rename to app/Http/Controllers/V3/WebServices/RoadItemController.php index cb7af26c..e395f4dd 100644 --- a/app/Http/Controllers/V3/Dashboard/RoadItem/WebServiceController.php +++ b/app/Http/Controllers/V3/WebServices/RoadItemController.php @@ -1,22 +1,23 @@ from_date; $toDate = $request->to_date; $roadItems = RoadItemsProject::query() - ->whereBetween('created_at', [$fromDate, $toDate]) + ->where('is_new', '=', 1) + ->whereBetween('activity_date_time', [$fromDate, $toDate]) ->get(); return $this->successResponse($roadItems); diff --git a/app/Http/Controllers/V3/WebServices/RoadMaintenanceStationController.php b/app/Http/Controllers/V3/WebServices/RoadMaintenanceStationController.php new file mode 100644 index 00000000..a16294c8 --- /dev/null +++ b/app/Http/Controllers/V3/WebServices/RoadMaintenanceStationController.php @@ -0,0 +1,33 @@ +province; + $status = $request->status; + $type = $request->type; + + $data = RahdariPoint::query() + ->when($status, fn ($query, $status) => $query->where('status', $status)) + ->when($type, fn ($query, $type) => $query->where('type', $type)) + ->when($province, fn($query, $province) => $query->where('province_id', $province)) + ->get([ + 'id', 'province_name', 'city_name', 'name', 'status', 'type_fa', 'phone', + 'code', 'lat', 'lng', + ]); + + return $this->successResponse($data); + } +} diff --git a/app/Http/Requests/V3/Mission/ControlUnit/StartRequest.php b/app/Http/Requests/V3/Mission/ControlUnit/StartRequest.php index 5c9af18b..59b7f5e1 100644 --- a/app/Http/Requests/V3/Mission/ControlUnit/StartRequest.php +++ b/app/Http/Requests/V3/Mission/ControlUnit/StartRequest.php @@ -5,6 +5,7 @@ namespace App\Http\Requests\V3\Mission\ControlUnit; use App\Enums\MissionStates; use Illuminate\Contracts\Validation\ValidationRule; use Illuminate\Foundation\Http\FormRequest; +use Illuminate\Validation\Validator; class StartRequest extends FormRequest { @@ -13,7 +14,7 @@ class StartRequest extends FormRequest */ public function authorize(): bool { - return ($this->mission->state_id == MissionStates::PENDING_CONFIRMATION->value && $this->mission->code == $this->code); + return $this->mission->state_id == MissionStates::PENDING_CONFIRMATION->value; } /** @@ -27,4 +28,18 @@ class StartRequest extends FormRequest 'code' => 'required|string', ]; } + + public function after(): array + { + return [ + function (Validator $validator) { + if ($this->mission->code != $this->code){ + $validator->errors()->add( + 'code', + 'کد وارد شده صحیح نمی باشد' + ); + } + } + ]; + } } diff --git a/app/Http/Requests/V3/Mission/RequestPortal/StoreRequest.php b/app/Http/Requests/V3/Mission/RequestPortal/StoreRequest.php index 537de257..430e18b1 100644 --- a/app/Http/Requests/V3/Mission/RequestPortal/StoreRequest.php +++ b/app/Http/Requests/V3/Mission/RequestPortal/StoreRequest.php @@ -47,7 +47,7 @@ class StoreRequest extends FormRequest { return [ function (Validator $validator) { - if ($this->type === 1){ + if ($this->type == 1){ $start = Carbon::parse($this->start_date); $end = Carbon::parse($this->end_date); diff --git a/app/Http/Requests/V3/RoadItem/WebService/CheckRequest.php b/app/Http/Requests/V3/WebServices/RoadItem/IndexRequest.php similarity index 55% rename from app/Http/Requests/V3/RoadItem/WebService/CheckRequest.php rename to app/Http/Requests/V3/WebServices/RoadItem/IndexRequest.php index b88ec8ed..2ea5c62e 100644 --- a/app/Http/Requests/V3/RoadItem/WebService/CheckRequest.php +++ b/app/Http/Requests/V3/WebServices/RoadItem/IndexRequest.php @@ -1,29 +1,27 @@ username === 'service_user257'&& - Hash::check('S3rv1ce@123', $user->password) ); + return + $this->username === 'service_user257' && + Hash::check('S3rv1ce@123', $this->password); } /** * Get the validation rules that apply to the request. * - * @return array|string> + * @return array */ public function rules(): array { diff --git a/app/Http/Requests/V3/WebServices/RoadMaintenanceStation/IndexRequest.php b/app/Http/Requests/V3/WebServices/RoadMaintenanceStation/IndexRequest.php new file mode 100644 index 00000000..e03e9ae1 --- /dev/null +++ b/app/Http/Requests/V3/WebServices/RoadMaintenanceStation/IndexRequest.php @@ -0,0 +1,34 @@ +username === 'service_user257' && + Hash::check('S3rv1ce@123', $this->password); + } + + /** + * Get the validation rules that apply to the request. + * + * @return array + */ + public function rules(): array + { + return [ + 'province' => 'exists:provinces,id', + 'status' => 'in:0,1', + 'type' => 'in:1,2,3', + ]; + } +} diff --git a/app/Models/Mission.php b/app/Models/Mission.php index 3f29202d..95d92d4c 100644 --- a/app/Models/Mission.php +++ b/app/Models/Mission.php @@ -13,6 +13,7 @@ class Mission extends Model use HasFactory; protected $guarded = []; + protected $hidden = ['pivot']; protected function requestedMachines(): Attribute { @@ -70,11 +71,12 @@ class Mission extends Model public function roadObserved(): MorphToMany { - return $this->morphToMany(RoadObserved::class, + return $this->morphedByMany( + RoadObserved::class, 'missionable', 'missionables', 'mission_id', - 'missionable_id', + 'missionable_id' ); } } diff --git a/app/Models/RoadObserved.php b/app/Models/RoadObserved.php index 16d30d16..3b9f3449 100644 --- a/app/Models/RoadObserved.php +++ b/app/Models/RoadObserved.php @@ -77,6 +77,7 @@ class RoadObserved extends Model 'rms_start_latlng' => 'array', 'rms_end_latlng' => 'array' ]; + protected $hidden = ['pivot']; /** * Get all of the project's files. diff --git a/app/Services/Cartables/Mission/ControlUnitService.php b/app/Services/Cartables/Mission/ControlUnitService.php index 271d459f..aa559a65 100644 --- a/app/Services/Cartables/Mission/ControlUnitService.php +++ b/app/Services/Cartables/Mission/ControlUnitService.php @@ -20,7 +20,7 @@ class ControlUnitService ->whereIn('state_id', [ MissionStates::PENDING_CONFIRMATION->value, MissionStates::START_MISSION->value ]) - ->where('edare_shahri_name', '=', Auth::user()->edarate_shahri_id); + ->where('edare_shahri_id', '=', Auth::user()->edarate_shahri_id); return DataTableFacade::run( $query, @@ -30,7 +30,8 @@ class ControlUnitService allowedSelects: [ 'id', 'user_id', 'username', 'state_name', 'province_name', 'edare_shahri_name', 'description', 'requested_machines', 'type', 'type_fa', 'start_date', 'state_id', - 'end_date', 'request_date', 'end_point', 'area', 'zone', 'zone_fa', 'start_time', 'finish_time' + 'end_date', 'request_date', 'end_point', 'area', 'zone', 'zone_fa', 'start_time', 'finish_time', + 'code', 'category_id', 'category_name', 'explanation' ] ); } diff --git a/app/Services/Cartables/Mission/RequestPortalService.php b/app/Services/Cartables/Mission/RequestPortalService.php index ca765a5e..fcd160af 100644 --- a/app/Services/Cartables/Mission/RequestPortalService.php +++ b/app/Services/Cartables/Mission/RequestPortalService.php @@ -15,7 +15,7 @@ class RequestPortalService public function datatable(Request $request) { $user = auth()->user(); - $query = Mission::query(); + $query = Mission::query()->with('roadObserved:id'); if ($user->hasPermissionTo('manage-request-portal-city')) { $query->where('edare_shahri_id', '=', $user->edarate_shahri_id); diff --git a/app/Services/Cartables/Mission/TransportationUnitService.php b/app/Services/Cartables/Mission/TransportationUnitService.php index 606e2e58..7c5cc186 100644 --- a/app/Services/Cartables/Mission/TransportationUnitService.php +++ b/app/Services/Cartables/Mission/TransportationUnitService.php @@ -14,7 +14,7 @@ class TransportationUnitService { $query = Mission::query() ->where('state_id', '=', MissionStates::REQUEST_CREATED->value) - ->where('edare_shahri_name', '=', Auth::user()->edarate_shahri_id); + ->where('edare_shahri_id', '=', Auth::user()->edarate_shahri_id); return DataTableFacade::run( $query, @@ -24,7 +24,8 @@ class TransportationUnitService allowedSelects: [ 'id', 'user_id', 'username', 'state_name', 'province_name', 'edare_shahri_name', 'description', 'requested_machines', 'type', 'type_fa', 'start_date', 'state_id', - 'end_date', 'request_date', 'end_point', 'area', 'zone', 'zone_fa', 'start_time', 'finish_time' + 'end_date', 'request_date', 'end_point', 'area', 'zone', 'zone_fa', 'start_time', 'finish_time', + 'code', 'category_id', 'category_name', 'explanation' ] ); } diff --git a/database/migrations/2025_05_18_090655_create_missionables_table.php b/database/migrations/2025_05_18_090655_create_missionables_table.php index 3bd88f09..977d6f5d 100644 --- a/database/migrations/2025_05_18_090655_create_missionables_table.php +++ b/database/migrations/2025_05_18_090655_create_missionables_table.php @@ -13,7 +13,7 @@ return new class extends Migration { Schema::create('missionables', function (Blueprint $table) { $table->id(); - $table->foreignId('mission_id')->constrained('missions')->noActionOnDelete(); + $table->foreignId('mission_id')->constrained('missions')->cascadeOnDelete(); $table->morphs('missionable'); $table->timestamps(); }); diff --git a/routes/v3.php b/routes/v3.php index 4df794cf..a12dcfab 100644 --- a/routes/v3.php +++ b/routes/v3.php @@ -15,7 +15,6 @@ use App\Http\Controllers\V3\Dashboard\Mission\RequestPortalController; use App\Http\Controllers\V3\Dashboard\Mission\TransportationUnitController; use App\Http\Controllers\V3\Dashboard\ObservedItemController; use App\Http\Controllers\V3\Dashboard\OtpManagementController; -use App\Http\Controllers\V3\Dashboard\RoadItem\WebServiceController; use App\Http\Controllers\V3\Dashboard\RoadMaintenanceStationController; use App\Http\Controllers\V3\Dashboard\RoadPatrol\ReportController; use App\Http\Controllers\V3\Dashboard\SafetyAndPrivacy\OperatorController; @@ -28,6 +27,7 @@ use App\Http\Controllers\V3\NotificationController; use App\Http\Controllers\V3\PermissionManagementController; use App\Http\Controllers\V3\ProfileController; use App\Http\Controllers\V3\RahdaranController; +use App\Http\Controllers\V3\WebServices\RoadItemController; use Illuminate\Support\Facades\Route; Route::get('admin/permissions', function () { @@ -160,7 +160,7 @@ Route::prefix('road_items') }); Route::prefix('webservice') ->name('webservice.') - ->controller(WebServiceController::class) + ->controller(RoadItemController::class) ->group(function () { Route::get('/', 'getRoadItems')->name('getRoadItem'); });