Merge branch 'feature/debug' into 'develop'

Feature/debug

See merge request witelgroup/rms_v2!142
This commit is contained in:
2025-07-19 11:01:23 +00:00
17 changed files with 157 additions and 39 deletions

View File

@@ -37,8 +37,8 @@ class RequestPortalController extends Controller
'username' => $user->username, 'username' => $user->username,
'province_id' => $user->province_id, 'province_id' => $user->province_id,
'province_name' => $user->province_fa, 'province_name' => $user->province_fa,
'edare_shahri_id' => $user->edare_shahri_id ?? null, 'edare_shahri_id' => $user->edarate_shahri_id ?? null,
'edare_shahri_name' => $user->edare_shahri_name ?? null, 'edare_shahri_name' => $user->edarate_shahri_name ?? null,
'state_id' => $state, 'state_id' => $state,
'state_name' => MissionStates::name($state), 'state_name' => MissionStates::name($state),
'requested_machines' => json_encode($request->requested_machines), 'requested_machines' => json_encode($request->requested_machines),
@@ -100,7 +100,10 @@ class RequestPortalController extends Controller
$mission->rahdaran()->sync($request->rahdaran); $mission->rahdaran()->sync($request->rahdaran);
if ($request->category_id == 3){ if ($request->category_id == 3){
$mission->roadObserved()->attach($request->road_observed_id); RoadObserved::query()
->find($request->road_observed_id)
->missions()
->sync($mission->id);
} }
}); });

View File

@@ -2,10 +2,12 @@
namespace App\Http\Controllers\V3; namespace App\Http\Controllers\V3;
use App\Enums\MissionStates;
use App\Exceptions\ProhibitedAction; use App\Exceptions\ProhibitedAction;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use App\Http\Traits\ApiResponse; use App\Http\Traits\ApiResponse;
use App\Models\EdarateOstani; use App\Models\EdarateOstani;
use App\Models\Mission;
use App\Models\RoadItemsProject; use App\Models\RoadItemsProject;
use App\Models\RoadObserved; use App\Models\RoadObserved;
use App\Models\SafetyAndPrivacy; use App\Models\SafetyAndPrivacy;
@@ -28,6 +30,7 @@ class NotificationController extends Controller
'roadItem' => $this->roadItemNotifications(), 'roadItem' => $this->roadItemNotifications(),
'safetyAndPrivacy' => $this->safetyAndPrivacyNotifications(), 'safetyAndPrivacy' => $this->safetyAndPrivacyNotifications(),
'roadObserved' => $this->roadObservedNotifications(), 'roadObserved' => $this->roadObservedNotifications(),
'mission' => $this->missionNotification(),
]); ]);
} }
@@ -185,4 +188,35 @@ class NotificationController extends Controller
return $road_observations; 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;
}
} }

View File

@@ -22,6 +22,7 @@ class ProfileController extends Controller
$user = Auth::user(); $user = Auth::user();
return $this->successResponse([ return $this->successResponse([
'id' => $user->id,
'username' => $user->username, 'username' => $user->username,
'first_name' => $user->first_name, 'first_name' => $user->first_name,
'last_name' => $user->last_name, 'last_name' => $user->last_name,

View File

@@ -61,16 +61,10 @@ class RahdaranController extends Controller
public function search(Request $request): JsonResponse public function search(Request $request): JsonResponse
{ {
if ($request->has('code')) { $matchedSearchedRahdaran = Rahdaran::query()
$matchedSearchedRahdaran = Rahdaran::query() ->where('code', 'LIKE', "%{$request->search}%")
->where('code', 'LIKE', "%{$request->code}%") ->orWhere('name', 'LIKE', "%{$request->search}%")
->get(); ->get();
}
else {
$matchedSearchedRahdaran = Rahdaran::query()
->where('name', 'LIKE', "%{$request->name}%")
->get();
}
return $this->successResponse($matchedSearchedRahdaran); return $this->successResponse($matchedSearchedRahdaran);
} }

View File

@@ -1,22 +1,23 @@
<?php <?php
namespace App\Http\Controllers\V3\Dashboard\RoadItem; namespace App\Http\Controllers\V3\WebServices;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use App\Http\Requests\V3\RoadItem\WebService\CheckRequest; use App\Http\Requests\V3\WebServices\RoadItem\IndexRequest;
use App\Http\Traits\ApiResponse; use App\Http\Traits\ApiResponse;
use App\Models\RoadItemsProject; use App\Models\RoadItemsProject;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
class WebServiceController extends Controller class RoadItemController extends Controller
{ {
use ApiResponse; use ApiResponse;
public function getRoadItem(CheckRequest $request): JsonResponse public function index(IndexRequest $request): JsonResponse
{ {
$fromDate = $request->from_date; $fromDate = $request->from_date;
$toDate = $request->to_date; $toDate = $request->to_date;
$roadItems = RoadItemsProject::query() $roadItems = RoadItemsProject::query()
->whereBetween('created_at', [$fromDate, $toDate]) ->where('is_new', '=', 1)
->whereBetween('activity_date_time', [$fromDate, $toDate])
->get(); ->get();
return $this->successResponse($roadItems); return $this->successResponse($roadItems);

View File

@@ -0,0 +1,33 @@
<?php
namespace App\Http\Controllers\V3\WebServices;
use App\Http\Controllers\Controller;
use App\Http\Requests\V3\WebServices\RoadMaintenanceStation\IndexRequest;
use App\Http\Traits\ApiResponse;
use App\Models\RahdariPoint;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class RoadMaintenanceStationController extends Controller
{
use ApiResponse;
public function index(IndexRequest $request): JsonResponse
{
$province = $request->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);
}
}

View File

@@ -5,6 +5,7 @@ namespace App\Http\Requests\V3\Mission\ControlUnit;
use App\Enums\MissionStates; use App\Enums\MissionStates;
use Illuminate\Contracts\Validation\ValidationRule; use Illuminate\Contracts\Validation\ValidationRule;
use Illuminate\Foundation\Http\FormRequest; use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Validator;
class StartRequest extends FormRequest class StartRequest extends FormRequest
{ {
@@ -13,7 +14,7 @@ class StartRequest extends FormRequest
*/ */
public function authorize(): bool 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', 'code' => 'required|string',
]; ];
} }
public function after(): array
{
return [
function (Validator $validator) {
if ($this->mission->code != $this->code){
$validator->errors()->add(
'code',
'کد وارد شده صحیح نمی باشد'
);
}
}
];
}
} }

View File

@@ -47,7 +47,7 @@ class StoreRequest extends FormRequest
{ {
return [ return [
function (Validator $validator) { function (Validator $validator) {
if ($this->type === 1){ if ($this->type == 1){
$start = Carbon::parse($this->start_date); $start = Carbon::parse($this->start_date);
$end = Carbon::parse($this->end_date); $end = Carbon::parse($this->end_date);

View File

@@ -1,29 +1,27 @@
<?php <?php
namespace App\Http\Requests\V3\RoadItem\WebService; namespace App\Http\Requests\V3\WebServices\RoadItem;
use App\Models\User; use Illuminate\Contracts\Validation\ValidationRule;
use Illuminate\Foundation\Http\FormRequest; use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash; use Illuminate\Support\Facades\Hash;
class CheckRequest extends FormRequest class IndexRequest extends FormRequest
{ {
/** /**
* Determine if the user is authorized to make this request. * Determine if the user is authorized to make this request.
*/ */
public function authorize(): bool public function authorize(): bool
{ {
$user = Auth::user(); return
return ( $this->username === 'service_user257' &&
$user->username === 'service_user257'&& Hash::check('S3rv1ce@123', $this->password);
Hash::check('S3rv1ce@123', $user->password) );
} }
/** /**
* Get the validation rules that apply to the request. * Get the validation rules that apply to the request.
* *
* @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array<mixed>|string> * @return array<string, ValidationRule|array|string>
*/ */
public function rules(): array public function rules(): array
{ {

View File

@@ -0,0 +1,34 @@
<?php
namespace App\Http\Requests\V3\WebServices\RoadMaintenanceStation;
use Illuminate\Contracts\Validation\ValidationRule;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Support\Facades\Hash;
class IndexRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*/
public function authorize(): bool
{
return
$this->username === 'service_user257' &&
Hash::check('S3rv1ce@123', $this->password);
}
/**
* Get the validation rules that apply to the request.
*
* @return array<string, ValidationRule|array|string>
*/
public function rules(): array
{
return [
'province' => 'exists:provinces,id',
'status' => 'in:0,1',
'type' => 'in:1,2,3',
];
}
}

View File

@@ -13,6 +13,7 @@ class Mission extends Model
use HasFactory; use HasFactory;
protected $guarded = []; protected $guarded = [];
protected $hidden = ['pivot'];
protected function requestedMachines(): Attribute protected function requestedMachines(): Attribute
{ {
@@ -70,11 +71,12 @@ class Mission extends Model
public function roadObserved(): MorphToMany public function roadObserved(): MorphToMany
{ {
return $this->morphToMany(RoadObserved::class, return $this->morphedByMany(
RoadObserved::class,
'missionable', 'missionable',
'missionables', 'missionables',
'mission_id', 'mission_id',
'missionable_id', 'missionable_id'
); );
} }
} }

View File

@@ -77,6 +77,7 @@ class RoadObserved extends Model
'rms_start_latlng' => 'array', 'rms_start_latlng' => 'array',
'rms_end_latlng' => 'array' 'rms_end_latlng' => 'array'
]; ];
protected $hidden = ['pivot'];
/** /**
* Get all of the project's files. * Get all of the project's files.

View File

@@ -20,7 +20,7 @@ class ControlUnitService
->whereIn('state_id', [ ->whereIn('state_id', [
MissionStates::PENDING_CONFIRMATION->value, MissionStates::START_MISSION->value 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( return DataTableFacade::run(
$query, $query,
@@ -30,7 +30,8 @@ class ControlUnitService
allowedSelects: [ allowedSelects: [
'id', 'user_id', 'username', 'state_name', 'province_name', 'edare_shahri_name', 'id', 'user_id', 'username', 'state_name', 'province_name', 'edare_shahri_name',
'description', 'requested_machines', 'type', 'type_fa', 'start_date', 'state_id', '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'
] ]
); );
} }

View File

@@ -15,7 +15,7 @@ class RequestPortalService
public function datatable(Request $request) public function datatable(Request $request)
{ {
$user = auth()->user(); $user = auth()->user();
$query = Mission::query(); $query = Mission::query()->with('roadObserved:id');
if ($user->hasPermissionTo('manage-request-portal-city')) { if ($user->hasPermissionTo('manage-request-portal-city')) {
$query->where('edare_shahri_id', '=', $user->edarate_shahri_id); $query->where('edare_shahri_id', '=', $user->edarate_shahri_id);

View File

@@ -14,7 +14,7 @@ class TransportationUnitService
{ {
$query = Mission::query() $query = Mission::query()
->where('state_id', '=', MissionStates::REQUEST_CREATED->value) ->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( return DataTableFacade::run(
$query, $query,
@@ -24,7 +24,8 @@ class TransportationUnitService
allowedSelects: [ allowedSelects: [
'id', 'user_id', 'username', 'state_name', 'province_name', 'edare_shahri_name', 'id', 'user_id', 'username', 'state_name', 'province_name', 'edare_shahri_name',
'description', 'requested_machines', 'type', 'type_fa', 'start_date', 'state_id', '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'
] ]
); );
} }

View File

@@ -13,7 +13,7 @@ return new class extends Migration
{ {
Schema::create('missionables', function (Blueprint $table) { Schema::create('missionables', function (Blueprint $table) {
$table->id(); $table->id();
$table->foreignId('mission_id')->constrained('missions')->noActionOnDelete(); $table->foreignId('mission_id')->constrained('missions')->cascadeOnDelete();
$table->morphs('missionable'); $table->morphs('missionable');
$table->timestamps(); $table->timestamps();
}); });

View File

@@ -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\Mission\TransportationUnitController;
use App\Http\Controllers\V3\Dashboard\ObservedItemController; use App\Http\Controllers\V3\Dashboard\ObservedItemController;
use App\Http\Controllers\V3\Dashboard\OtpManagementController; 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\RoadMaintenanceStationController;
use App\Http\Controllers\V3\Dashboard\RoadPatrol\ReportController; use App\Http\Controllers\V3\Dashboard\RoadPatrol\ReportController;
use App\Http\Controllers\V3\Dashboard\SafetyAndPrivacy\OperatorController; 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\PermissionManagementController;
use App\Http\Controllers\V3\ProfileController; use App\Http\Controllers\V3\ProfileController;
use App\Http\Controllers\V3\RahdaranController; use App\Http\Controllers\V3\RahdaranController;
use App\Http\Controllers\V3\WebServices\RoadItemController;
use Illuminate\Support\Facades\Route; use Illuminate\Support\Facades\Route;
Route::get('admin/permissions', function () { Route::get('admin/permissions', function () {
@@ -160,7 +160,7 @@ Route::prefix('road_items')
}); });
Route::prefix('webservice') Route::prefix('webservice')
->name('webservice.') ->name('webservice.')
->controller(WebServiceController::class) ->controller(RoadItemController::class)
->group(function () { ->group(function () {
Route::get('/', 'getRoadItems')->name('getRoadItem'); Route::get('/', 'getRoadItems')->name('getRoadItem');
}); });