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,
'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);
}
});

View File

@@ -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;
}
}

View File

@@ -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,

View File

@@ -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);
}

View File

@@ -1,22 +1,23 @@
<?php
namespace App\Http\Controllers\V3\Dashboard\RoadItem;
namespace App\Http\Controllers\V3\WebServices;
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\Models\RoadItemsProject;
use Illuminate\Http\JsonResponse;
class WebServiceController extends Controller
class RoadItemController extends Controller
{
use ApiResponse;
public function getRoadItem(CheckRequest $request): JsonResponse
public function index(IndexRequest $request): JsonResponse
{
$fromDate = $request->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);

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 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',
'کد وارد شده صحیح نمی باشد'
);
}
}
];
}
}

View File

@@ -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);

View File

@@ -1,29 +1,27 @@
<?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\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;
class CheckRequest extends FormRequest
class IndexRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*/
public function authorize(): bool
{
$user = Auth::user();
return (
$user->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, \Illuminate\Contracts\Validation\ValidationRule|array<mixed>|string>
* @return array<string, ValidationRule|array|string>
*/
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;
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'
);
}
}

View File

@@ -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.

View File

@@ -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'
]
);
}

View File

@@ -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);

View File

@@ -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'
]
);
}

View File

@@ -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();
});

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\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');
});