diff --git a/.env.example b/.env.example index 14720635..b8c978b3 100644 --- a/.env.example +++ b/.env.example @@ -78,7 +78,7 @@ FMS_ERROR_RATE_URL= FMS_ERROR_RATE_PASSWORD= FMS_ERROR_RATE_USERNAME= -HARIM_NEED_ACCESS_URL='https://zamin.gov.ir/ow/api/ow/esb/response', +HARIM_NEED_ACCESS_URL='https://zamin.gov.ir/ow/api/ow/esb/response' HARIM_NEED_ACCESS_PASSWORD= HARIM_NEED_ACCESS_USERNAME= @@ -106,7 +106,7 @@ BACKUP_PASSWORD=1qaz HARIM_ENCRYPTION_KEY="TestKey" HARIM_ENCRYPTION_IV="1111000011110101" -CHECKE_LIST_MACHINES_ACTIVITY_URL='fms.141.ir:7030/api/RMS/GetMovingVehicles', +CHECKE_LIST_MACHINES_ACTIVITY_URL='fms.141.ir:7030/api/RMS/GetMovingVehicles' CHECKE_LIST_MACHINES_ACTIVITY_PASSWORD= CHECKE_LIST_MACHINES_ACTIVITY_USERNAME= diff --git a/.gitignore b/.gitignore index 627e5bbd..3519487b 100644 --- a/.gitignore +++ b/.gitignore @@ -19,3 +19,10 @@ yarn-error.log /.idea /.vscode archive.tgz +storage/avatar/ +storage/cities-geojson.json +storage/compress.php +storage/images/ +storage/provinces-cities-geojson copy.js +storage/provinces-cities-geojson.js +storage/provinces-geojson.json \ No newline at end of file diff --git a/app/Console/Commands/EncodePolyLineCommand.php b/app/Console/Commands/EncodePolyLineCommand.php new file mode 100644 index 00000000..6b9565b3 --- /dev/null +++ b/app/Console/Commands/EncodePolyLineCommand.php @@ -0,0 +1,40 @@ +whereNotNull('area')->each(function ($mission) use ($polylineEncoder) { + $area = json_decode($mission->area, true); + $encodedValue = $polylineEncoder->encodePolyLine($area['coordinates'], lng_lat_format:true); + $mission->update([ + 'encoded_route' => $encodedValue, + ]); + }); + + $this->info("updated successfully"); + } +} diff --git a/app/Enums/CmmsMachineStatus.php b/app/Enums/CmmsMachineStatus.php index f8539109..e9f75a14 100644 --- a/app/Enums/CmmsMachineStatus.php +++ b/app/Enums/CmmsMachineStatus.php @@ -18,7 +18,7 @@ enum CmmsMachineStatus: int self::AMADE => 'آماده', self::RESERVE => 'رزرو', self::DAR_MAMORIAT => 'در ماموریت', - self::KHAREGE_AZ_RADE => 'خارج از محدوده', + self::KHAREGE_AZ_RADE => 'خارج از رده', self::DAR_TAMIR => 'در تعمیر', self::FOROKHTEH_SHODE => ' فروخته شده', self::NIZE_BE_TAMIR => 'نیاز به تعمیر', diff --git a/app/Enums/MissionStates.php b/app/Enums/MissionStates.php index 7abfdf04..943d544a 100644 --- a/app/Enums/MissionStates.php +++ b/app/Enums/MissionStates.php @@ -26,4 +26,17 @@ enum MissionStates: int return $mapArray[$state]; } + + public function label(): string + { + return match ($this) { + self::REQUEST_CREATED => 'درخواست ایجاد شد و در حال بررسی توسط واحد تایید کننده است', + self::PENDING_CONFIRMATION => 'خودرو اختصاص داده شد و درخواست توسط واحد کنترل در حال بررسی است', + self::START_MISSION => 'درخواست توسط واحد کنترل تایید شد و ماموریت آغاز می شود', + self::END_MISSION => 'اتمام ماموریت', + self::REJECT_BY_TRANSPORTATION => 'عدم تخصیص خودرو توسط واحد تایید کننده و بازگشت درخواست به کارتابل کاربر', + self::CANCELLED => 'ماموریت لغو شد', + self::CREATED_NO_PROCESS => 'ماموریت بدون فرایند ثبت شد', + }; + } } \ No newline at end of file diff --git a/app/Enums/MissionViolationStatus.php b/app/Enums/MissionViolationStatus.php index 68c75118..741af85f 100644 --- a/app/Enums/MissionViolationStatus.php +++ b/app/Enums/MissionViolationStatus.php @@ -2,16 +2,20 @@ namespace App\Enums; +use function Symfony\Component\String\s; + enum MissionViolationStatus: int { case BEDON_EGHDAM = 0; case EGHDAM_SHODE = 1; + case SABT_SHODE = 2; public function label(): string { return match ($this) { self::BEDON_EGHDAM => "بدون اقدام", self::EGHDAM_SHODE => "اقدام شده", + self::SABT_SHODE => "ثبت شده توسط حراست" }; } } \ No newline at end of file diff --git a/app/Exports/V3/Mission/Report/Machine/machineDriverReport.php b/app/Exports/V3/Mission/Report/Machine/machineDriverReport.php new file mode 100644 index 00000000..3bb74fdc --- /dev/null +++ b/app/Exports/V3/Mission/Report/Machine/machineDriverReport.php @@ -0,0 +1,74 @@ +data as $r) { + $exportRows[] = [ + 'driver_id' => $r->driver_id ?? '', + 'driver_name' => $r->driver_name ?? '', + 'missions' => $r->missions ?? 0, + 'func' => (int) ($r->func ?? 0), + ]; + } + + return view('v3.Reports.Mission.Report.Machine.MachineDriverReport', [ + 'rows' => $exportRows, + ]); + } + + public function registerEvents(): array + { + return [ + AfterSheet::class => function (AfterSheet $event) { + $event->sheet->getDelegate()->setRightToLeft(true); + }, + ]; + } + + /** + * @throws Exception + */ + public function drawings(): array + { + $drawing = new Drawing(); + $drawing->setName('Logo'); + $drawing->setDescription('This is my logo'); + $drawing->setPath(public_path('/dist/logo.png')); + $drawing->setWidth(50); + $drawing->setHeight(50); + $drawing->setOffsetX(5); + $drawing->setOffsetY(5); + $drawing->setCoordinates('A1'); + + $drawing2 = new Drawing(); + $drawing2->setName('Logo'); + $drawing2->setDescription('This is my logo'); + $drawing2->setPath(public_path('/dist/141icon.png')); + $drawing2->setWidth(50); + $drawing2->setHeight(50); + $drawing2->setOffsetX(5); + $drawing2->setOffsetY(5); + $drawing2->setCoordinates('D1'); + + return [$drawing, $drawing2]; + } +} diff --git a/app/Exports/V3/Mission/Report/Machine/machineReport.php b/app/Exports/V3/Mission/Report/Machine/machineReport.php new file mode 100644 index 00000000..538c294f --- /dev/null +++ b/app/Exports/V3/Mission/Report/Machine/machineReport.php @@ -0,0 +1,75 @@ +data as $r) { + $exportRows[] = [ + 'machine_id' => $r->machine_id ?? '', + 'machine_code' => $r->machine_code ?? '', + 'car_name' => $r->car_name ?? '', + 'missions' => $r->missions ?? 0, + 'func' => (int) ($r->func ?? 0), + ]; + } + + return view('v3.Reports.Mission.Report.Machine.ActivityReport', [ + 'rows' => $exportRows, + ]); + } + + public function registerEvents(): array + { + return [ + AfterSheet::class => function (AfterSheet $event) { + $event->sheet->getDelegate()->setRightToLeft(true); + }, + ]; + } + + /** + * @throws Exception + */ + public function drawings(): array + { + $drawing = new Drawing(); + $drawing->setName('Logo'); + $drawing->setDescription('This is my logo'); + $drawing->setPath(public_path('/dist/logo.png')); + $drawing->setWidth(50); + $drawing->setHeight(50); + $drawing->setOffsetX(5); + $drawing->setOffsetY(5); + $drawing->setCoordinates('A1'); + + $drawing2 = new Drawing(); + $drawing2->setName('Logo'); + $drawing2->setDescription('This is my logo'); + $drawing2->setPath(public_path('/dist/141icon.png')); + $drawing2->setWidth(50); + $drawing2->setHeight(50); + $drawing2->setOffsetX(5); + $drawing2->setOffsetY(5); + $drawing2->setCoordinates('E1'); + + return [$drawing, $drawing2]; + } +} diff --git a/app/Exports/V3/Mission/Report/Machine/machineTypeReport.php b/app/Exports/V3/Mission/Report/Machine/machineTypeReport.php new file mode 100644 index 00000000..d376871e --- /dev/null +++ b/app/Exports/V3/Mission/Report/Machine/machineTypeReport.php @@ -0,0 +1,73 @@ +data as $r) { + $exportRows[] = [ + 'car_type' => $r->car_type ?? '', + 'missions' => $r->missions ?? 0, + 'func' => (int) ($r->func ?? 0), + ]; + } + + return view('v3.Reports.Mission.Report.Machine.MachineTypeReport', [ + 'rows' => $exportRows, + ]); + } + + public function registerEvents(): array + { + return [ + AfterSheet::class => function (AfterSheet $event) { + $event->sheet->getDelegate()->setRightToLeft(true); + }, + ]; + } + + /** + * @throws Exception + */ + public function drawings(): array + { + $drawing = new Drawing(); + $drawing->setName('Logo'); + $drawing->setDescription('This is my logo'); + $drawing->setPath(public_path('/dist/logo.png')); + $drawing->setWidth(50); + $drawing->setHeight(50); + $drawing->setOffsetX(5); + $drawing->setOffsetY(5); + $drawing->setCoordinates('A1'); + + $drawing2 = new Drawing(); + $drawing2->setName('Logo'); + $drawing2->setDescription('This is my logo'); + $drawing2->setPath(public_path('/dist/141icon.png')); + $drawing2->setWidth(50); + $drawing2->setHeight(50); + $drawing2->setOffsetX(5); + $drawing2->setOffsetY(5); + $drawing2->setCoordinates('C1'); + + return [$drawing, $drawing2]; + } +} diff --git a/app/Exports/V3/Mission/Report/Tradod/CountryReport.php b/app/Exports/V3/Mission/Report/Tradod/CountryReport.php index 69e2b66d..b63d606a 100644 --- a/app/Exports/V3/Mission/Report/Tradod/CountryReport.php +++ b/app/Exports/V3/Mission/Report/Tradod/CountryReport.php @@ -29,9 +29,9 @@ class CountryReport implements FromView, ShouldAutoSize, WithDrawings, WithEvent $national = [ 'province_name' => $name, 'total' => (int) ($r->total ?? 0), - 'khareg_mahdode' => (int) ($r->khareg_mahdode ?? 0), 'gps' => (int) ($r->gps ?? 0), 'durations' => (int) ($r->durations ?? 0), + 'khareg_mahdode' => (int) ($r->khareg_mahdode ?? 0), 'bafarayand_saeti' => (int) ($r->far_h ?? 0), 'bafarayand_rozaneh' => (int) ($r->far_d ?? 0), 'bedon_bafarayand_saeti' => (int) ($r->un_far_h ?? 0), @@ -50,9 +50,9 @@ class CountryReport implements FromView, ShouldAutoSize, WithDrawings, WithEvent } $grid[$pid]['total'] = (int) ($r->total ?? 0); - $grid[$pid]['khareg_mahdode'] = ($r->khareg_mahdode ?? 0); $grid[$pid]['gps'] = (int) ($r->gps ?? 0); $grid[$pid]['durations'] = (int) ($r->durations ?? 0); + $grid[$pid]['khareg_mahdode'] = ($r->khareg_mahdode ?? 0); $grid[$pid]['bafarayand_saeti'] = (int) ($r->far_h ?? 0); $grid[$pid]['bafarayand_rozaneh'] = (int) ($r->far_d ?? 0); $grid[$pid]['bedon_bafarayand_saeti'] = (int) ($r->un_far_h ?? 0); diff --git a/app/Exports/V3/Mission/Report/Tradod/ProvinceReport.php b/app/Exports/V3/Mission/Report/Tradod/ProvinceReport.php index 28e31bd0..bf59db39 100644 --- a/app/Exports/V3/Mission/Report/Tradod/ProvinceReport.php +++ b/app/Exports/V3/Mission/Report/Tradod/ProvinceReport.php @@ -30,9 +30,9 @@ class ProvinceReport implements FromView, ShouldAutoSize, WithDrawings, WithEven $province = [ 'city_name' => $name, 'total' => (int) ($r->total ?? 0), - 'khareg_mahdode' => (int) ($r->khareg_mahdode ?? 0), 'gps' => (int) ($r->gps ?? 0), 'durations' => (int) ($r->durations ?? 0), + 'khareg_mahdode' => (int) ($r->khareg_mahdode ?? 0), 'bafarayand_saeti' => (int) ($r->far_h ?? 0), 'bafarayand_rozaneh' => (int) ($r->far_d ?? 0), 'bedon_bafarayand_saeti' => (int) ($r->un_far_h ?? 0), @@ -51,9 +51,9 @@ class ProvinceReport implements FromView, ShouldAutoSize, WithDrawings, WithEven } $grid[$cid]['total'] = (int) ($r->total ?? 0); - $grid[$cid]['khareg_mahdode'] = ($r->khareg_mahdode ?? 0); $grid[$cid]['gps'] = (int) ($r->gps ?? 0); $grid[$cid]['durations'] = (int) ($r->durations ?? 0); + $grid[$cid]['khareg_mahdode'] = ($r->khareg_mahdode ?? 0); $grid[$cid]['bafarayand_saeti'] = (int) ($r->far_h ?? 0); $grid[$cid]['bafarayand_rozaneh'] = (int) ($r->far_d ?? 0); $grid[$cid]['bedon_bafarayand_saeti'] = (int) ($r->un_far_h ?? 0); diff --git a/app/Http/Controllers/V3/CMMSMachinesController.php b/app/Http/Controllers/V3/CMMSMachinesController.php index d0819a1a..a5e18a34 100644 --- a/app/Http/Controllers/V3/CMMSMachinesController.php +++ b/app/Http/Controllers/V3/CMMSMachinesController.php @@ -4,6 +4,7 @@ namespace App\Http\Controllers\V3; use App\Facades\DataTable\DataTableFacade; use App\Http\Controllers\Controller; +use App\Http\Requests\V3\CMMSMachine\UpdateRequest; use App\Http\Traits\ApiResponse; use App\Models\CMMSMachine; use Illuminate\Http\JsonResponse; @@ -22,7 +23,8 @@ class CMMSMachinesController extends Controller $request, allowedFilters: ['*'], allowedSortings: ['*'], - allowedSelects: ['machine_code', 'id', 'plak_number', 'car_name', 'car_type', 'status'], + allowedSelects: ['machine_code', 'id', 'plak_number', 'car_name', 'car_type', 'status', + 'province_id', 'city_id', 'station_id', 'status','driver_name'], )); } @@ -48,4 +50,16 @@ class CMMSMachinesController extends Controller ->distinct() ->pluck('car_type'); } + + public function update(UpdateRequest $request , CMMSMachine $machine): JsonResponse + { + $machine->update([ + 'status' => $request->status, + 'province_id' => $request->province_id, + 'city_id' => $request->city_id, + 'station_id' => $request->station_id, + ]); + + return $this->successResponse(); + } } diff --git a/app/Http/Controllers/V3/CityController.php b/app/Http/Controllers/V3/CityController.php new file mode 100644 index 00000000..50d0d48f --- /dev/null +++ b/app/Http/Controllers/V3/CityController.php @@ -0,0 +1,19 @@ +successResponse(City::query()->where('cities.province_id', $request->query('province_id'))->get(['id', 'name_fa'])); + } +} \ No newline at end of file diff --git a/app/Http/Controllers/V3/Dashboard/Mission/ControlUnitController.php b/app/Http/Controllers/V3/Dashboard/Mission/ControlUnitController.php index bcc7e1d9..b32a1428 100644 --- a/app/Http/Controllers/V3/Dashboard/Mission/ControlUnitController.php +++ b/app/Http/Controllers/V3/Dashboard/Mission/ControlUnitController.php @@ -2,6 +2,7 @@ namespace App\Http\Controllers\V3\Dashboard\Mission; +use App\Enums\CmmsMachineStatus; use App\Enums\FMSResultCode; use App\Enums\MissionStates; use App\Events\V3\Dashboard\Mission\SendDataToFMSEvent; @@ -33,16 +34,19 @@ class ControlUnitController extends Controller public function start(StartRequest $request, Mission $mission): JsonResponse { DB::transaction(function () use ($mission, $request) { - $mission->histories()->create([ - 'user_id' => auth()->user()->id, - 'previous_state_id' => $mission->state_id, - 'previous_state_name' => $mission->state_name, +// $mission->histories()->create([ +// 'user_id' => auth()->user()->id, +// 'previous_state_id' => $mission->state_id, +// 'previous_state_name' => $mission->state_name, +// ]); + + $mission->machine()->update([ + 'status' => CmmsMachineStatus::DAR_MAMORIAT->value ]); - $state = MissionStates::START_MISSION->value; $mission->update([ - 'state_id' => $state, - 'state_name' => MissionStates::name($state), + 'state_id' => MissionStates::START_MISSION->value, + 'state_name' => MissionStates::START_MISSION->label(), 'start_time' => $request->time, 'km' => $request->km, ]); @@ -57,39 +61,38 @@ class ControlUnitController extends Controller public function finish(FinishRequest $request, Mission $mission, GetErrorRateService $getErrorRateService): JsonResponse { DB::transaction(function () use ($mission, $getErrorRateService, $request) { - $mission->histories()->create([ - 'user_id' => auth()->user()->id, - 'previous_state_id' => $mission->state_id, - 'previous_state_name' => $mission->state_name, - ]); +// $mission->histories()->create([ +// 'user_id' => auth()->user()->id, +// 'previous_state_id' => $mission->state_id, +// 'previous_state_name' => $mission->state_name, +// ]); - $state = MissionStates::END_MISSION->value; - - $mission->update([ - 'state_id' => $state, - 'state_name' => MissionStates::name($state), - 'finish_time' => $request->time, - 'mission_duration' => strtotime($request->time) - strtotime($mission->start_time), - 'end_km' => $request->end_km, + $mission->machine()->update([ + 'status' => CmmsMachineStatus::AMADE->value ]); // $getErrorRateService->setInputParameters($mission); // $responseData = $getErrorRateService->run(); -// -// $mission->update([ + + $mission->update([ // 'in_area_duration' => $responseData['timeInAreaSeconds'], // 'first_enter' => $responseData['firstEnter'], // 'last_exit' => $responseData['lastExit'], // 'point_number_sent' => $responseData['noOfPointsInMission'], // 'fms_result_code' => $responseData['resultCode'], // 'fms_result_message' => FMSResultCode::name($responseData['resultCode']), -// ]); + 'state_id' => MissionStates::END_MISSION->value, + 'state_name' => MissionStates::END_MISSION->label(), + 'finish_time' => $request->time, + 'mission_duration' => strtotime($request->time) - strtotime($mission->start_time), + 'end_km' => $request->end_km, + ]); }); - if ($mission->category_id == 2) { - $rpc = new OperatorController; - $rpc->store($mission); - } +// if ($mission->category_id == 2) { +// $rpc = new OperatorController; +// $rpc->store($mission); +// } // SendDataToFMSEvent::dispatch($mission); diff --git a/app/Http/Controllers/V3/Dashboard/Mission/Report/ReportMachineController.php b/app/Http/Controllers/V3/Dashboard/Mission/Report/ReportMachineController.php new file mode 100644 index 00000000..f39b46bf --- /dev/null +++ b/app/Http/Controllers/V3/Dashboard/Mission/Report/ReportMachineController.php @@ -0,0 +1,207 @@ +successResponse([ + 'activities' => $reportMachineService->countryMachinesActivity($request), +// 'provinces' => Province::all(['id', 'name_fa']), + ]); + } + + /** + * @throws Exception + * @throws \PhpOffice\PhpSpreadsheet\Writer\Exception + */ + public function countryMachinesActivityExcel(Request $request, ReportMachineService $reportMachineService): BinaryFileResponse + { + $data = $reportMachineService->countryMachinesActivity($request); + $name = 'گزارش ماشین آلات'.verta()->now()->format('Y-m-d H-i').'.xlsx'; + + return Excel::download(new machineReport($data), $name); + } + + public function provinceMachinesActivity(Request $request, ReportMachineService $reportMachineService): JsonResponse + { + return $this->successResponse([ + 'activities' => $reportMachineService->provinceMachinesActivity($request), +// 'city' => City::query() +// ->where('province_id', $request->province_id) +// ->where(function ($query) { +// $query->where('type_id', 1) +// ->orWhereIn('name_fa', ['اداره ماشين‌آلات', 'اداره نقلیه']); +// }) +// ->get(['id', 'name_fa']) + ]); + } + + /** + * @throws Exception + * @throws \PhpOffice\PhpSpreadsheet\Writer\Exception + */ + public function provinceMachinesActivityExcel(Request $request, ReportMachineService $reportMachineService): BinaryFileResponse + { + $data = $reportMachineService->provinceMachinesActivity($request); + $name = 'گزارش ماشین آلات'.verta()->now()->format('Y-m-d H-i').'.xlsx'; + + return Excel::download(new machineReport($data), $name); + } + + public function countryMachineTypesActivity(Request $request, ReportMachineService $reportMachineService): JsonResponse + { + return $this->successResponse([ + 'activities' => $reportMachineService->countryMachineTypesActivity($request), +// 'provinces' => Province::all(['id', 'name_fa']), + ]); + } + + /** + * @throws Exception + * @throws \PhpOffice\PhpSpreadsheet\Writer\Exception + */ + public function countryMachineTypesActivityExcel(Request $request, ReportMachineService $reportMachineService): BinaryFileResponse + { + $data = $reportMachineService->countryMachineTypesActivity($request); + $name = 'گزارش نوع ماشین آلات'.verta()->now()->format('Y-m-d H-i').'.xlsx'; + + return Excel::download(new machineTypeReport($data), $name); + } + + public function provinceMachineTypesActivity(Request $request, ReportMachineService $reportMachineService): JsonResponse + { + return $this->successResponse([ + 'activities' => $reportMachineService->provinceMachineTypesActivity($request), +// 'city' => City::query() +// ->where('province_id', $request->province_id) +// ->where(function ($query) { +// $query->where('type_id', 1) +// ->orWhereIn('name_fa', ['اداره ماشين‌آلات', 'اداره نقلیه']); +// }) +// ->get(['id', 'name_fa']) + ]); + } + + public function machineDetailsReport(Request $request, int $machine_id) + { + return DataTableFacade::run( + Mission::query()->where('machine_id', '=', $machine_id), + $request, + allowedFilters: ['*'], + allowedSortings: ['*'], + allowedSelects: [ + 'id', 'province_id', 'province_name', 'city_id', 'city_name', + 'end_km', 'km', 'driver_name', 'state_id', 'station_name' + ] + ); + } + + /** + * @throws Exception + * @throws \PhpOffice\PhpSpreadsheet\Writer\Exception + */ + public function provinceMachineTypesActivityExcel(Request $request, ReportMachineService $reportMachineService): BinaryFileResponse + { + $data = $reportMachineService->provinceMachineTypesActivity($request); + $name = 'گزارش نوع ماشین آلات'.verta()->now()->format('Y-m-d H-i').'.xlsx'; + + return Excel::download(new machineTypeReport($data), $name); + } + + public function countryMachineDriversActivity(Request $request, ReportMachineService $reportMachineService) + { + return $this->successResponse([ + 'activities' => $reportMachineService->countryMachineDriversActivity($request), +// 'provinces' => Province::all(['id', 'name_fa']), + ]); + } + + /** + * @throws Exception + * @throws \PhpOffice\PhpSpreadsheet\Writer\Exception + */ + public function countryMachineDriversActivityExcel(Request $request, ReportMachineService $reportMachineService): BinaryFileResponse + { + $data = $reportMachineService->countryMachineDriversActivity($request); + $name = 'گزارش نوع ماشین آلات'.verta()->now()->format('Y-m-d H-i').'.xlsx'; + + return Excel::download(new machineDriverReport($data), $name); + } + + public function provinceMachineDriversActivity(Request $request, ReportMachineService $reportMachineService) + { + return $this->successResponse([ + 'activities' => $reportMachineService->provinceMachineDriversActivity($request), +// 'city' => City::query() +// ->where('province_id', $request->province_id) +// ->where(function ($query) { +// $query->where('type_id', 1) +// ->orWhereIn('name_fa', ['اداره ماشين‌آلات', 'اداره نقلیه']); +// }) +// ->get(['id', 'name_fa']) + ]); + } + + /** + * @throws Exception + * @throws \PhpOffice\PhpSpreadsheet\Writer\Exception + */ + public function provinceMachineDriversActivityExcel(Request $request, ReportMachineService $reportMachineService): BinaryFileResponse + { + $data = $reportMachineService->provinceMachineDriversActivity($request); + $name = 'گزارش نوع ماشین آلات'.verta()->now()->format('Y-m-d H-i').'.xlsx'; + + return Excel::download(new machineDriverReport($data), $name); + } + + public function machineTypeDetailsReport(Request $request) + { + $machineIds = CMMSMachine::query()->where('car_type', '=', $request->query('car_type'))->pluck('machine_id'); + return DataTableFacade::run( + Mission::query()->whereIn('machine_id', $machineIds), + $request, + allowedFilters: ['*'], + allowedSortings: ['*'], + allowedSelects: [ + 'id', 'province_id', 'province_name', 'city_id', 'city_name', + 'end_km', 'km', 'driver_name', 'state_name', 'station_name' + ] + ); + } + + public function machineDriverDetailsReport(Request $request, int $driver_id) + { + return DataTableFacade::run( + Mission::query()->where('driver_id', '=', $driver_id), + $request, + allowedFilters: ['*'], + allowedSortings: ['*'], + allowedSelects: [ + 'id', 'province_id', 'province_name', 'city_id', 'city_name', + 'end_km', 'km', 'driver_name', 'state_id', 'station_name' + ] + ); + } +} diff --git a/app/Http/Controllers/V3/Dashboard/Mission/RequestPortalController.php b/app/Http/Controllers/V3/Dashboard/Mission/RequestPortalController.php index 9a3d5d50..61f539ea 100644 --- a/app/Http/Controllers/V3/Dashboard/Mission/RequestPortalController.php +++ b/app/Http/Controllers/V3/Dashboard/Mission/RequestPortalController.php @@ -6,9 +6,13 @@ use App\Enums\FMSResultCode; use App\Enums\MissionCategory; use App\Enums\MissionStates; use App\Enums\MissionTypes; +use App\Enums\MissionViolationStatus; use App\Enums\MissionZones; +use App\Facades\DataTable\DataTableFacade; use App\Http\Controllers\Controller; use App\Http\Controllers\V3\Dashboard\RoadPatrol\OperatorController; +use App\Http\Requests\V3\Mission\RequestPortal\ChangeStateRequest; +use App\Http\Requests\V3\Mission\RequestPortal\ClarifyUnauthorizedExitRequest; use App\Http\Requests\V3\Mission\RequestPortal\ContinueMissionRequest; use App\Http\Requests\V3\Mission\RequestPortal\NoProcessRequest; use App\Http\Requests\V3\Mission\RequestPortal\StoreRequest; @@ -16,6 +20,8 @@ use App\Http\Requests\V3\Mission\RequestPortal\UpdateRequest; use App\Http\Traits\ApiResponse; use App\Models\CMMSMachine; use App\Models\Mission; +use App\Models\MissionViolation; +use App\Models\Rahdaran; use App\Models\RahdariPoint; use App\Models\RoadObserved; use App\Services\Cartables\Mission\RequestPortalService; @@ -35,6 +41,21 @@ class RequestPortalController extends Controller return response()->json($requestPortalService->datatable($request)); } + public function violations(Request $request): array + { + $query = MissionViolation::query()->where([ + ['status', '=', MissionViolationStatus::BEDON_EGHDAM->value], + ['station_id', '=', auth()->user()->station_id] + ]); + + return DataTableFacade::run( + $query, + $request, + allowedFilters: ['*'], + allowedSortings: ['*'], + ); + } + /** * @throws Throwable */ @@ -43,9 +64,6 @@ class RequestPortalController extends Controller DB::transaction(function () use ($request) { $user = auth()->user(); - $state = MissionStates::REQUEST_CREATED->value; - $category = $request->category_id; - $mission = Mission::query()->create([ 'user_id' => $user->id, 'username' => $user->username, @@ -55,8 +73,8 @@ class RequestPortalController extends Controller 'city_name' => $user->city_fa ?? 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), + 'state_id' => MissionStates::REQUEST_CREATED->value, + 'state_name' => MissionStates::REQUEST_CREATED->label(), 'requested_machines' => json_encode($request->requested_machines), 'type' => $request->type, 'type_fa' => MissionTypes::name($request->type), @@ -67,13 +85,13 @@ class RequestPortalController extends Controller 'request_date' => now(), 'description' => $request->description, 'end_point' => $request->end_point, - 'area' => json_encode($request->area), - 'category_id' => $category, - 'category_name' => MissionCategory::name($category), + 'encoded_route' => $request->encoded_route, + 'category_id' => $request->category_id, + 'category_name' => MissionCategory::name($request->category_id), 'explanation' => $request->explanation, 'code' => rand(100000, 999999), 'station_id' => $user->station_id, - 'station_name' => RahdariPoint::query()->find( $user->station_id)->name, + 'station_name' => RahdariPoint::query()->find($user->station_id)->name, ]); $mission->rahdaran()->sync($request->rahdaran); @@ -95,22 +113,20 @@ class RequestPortalController extends Controller DB::transaction(function () use ($request, $mission, $getErrorRateService) { $user = auth()->user(); +// $getErrorRateService->setInputParameters($mission); +// $responseData = $getErrorRateService->run(); + $mission->update([ +// 'in_area_duration' => $responseData['timeInAreaSeconds'], +// 'first_enter' => $responseData['firstEnter'], +// 'last_exit' => $responseData['lastExit'], +// 'point_number_sent' => $responseData['noOfPointsInMission'], +// 'fms_result_code' => $responseData['resultCode'], +// 'fms_result_message' => FMSResultCode::name($responseData['resultCode']), 'finish_time' => now(), 'state_id' => MissionStates::END_MISSION->value, 'state_name' => MissionStates::name(MissionStates::END_MISSION->value), - ]); - - $getErrorRateService->setInputParameters($mission); - $responseData = $getErrorRateService->run(); - - $mission->update([ - 'in_area_duration' => $responseData['timeInAreaSeconds'], - 'first_enter' => $responseData['firstEnter'], - 'last_exit' => $responseData['lastExit'], - 'point_number_sent' => $responseData['noOfPointsInMission'], - 'fms_result_code' => $responseData['resultCode'], - 'fms_result_message' => FMSResultCode::name($responseData['resultCode']), + 'end_km' => $request->end_km, ]); // if ($mission->category_id == 2) { @@ -118,9 +134,7 @@ class RequestPortalController extends Controller // $rpc->store($mission); // } - $state = MissionStates::START_MISSION->value; - $category = $request->category_id; - $machine = CMMSMachine::query()->find($request->machine_id); + $machine = CMMSMachine::query()->find($request->machine_id, ['id', 'machine_code', 'car_type']); $newMission = Mission::query()->create([ 'user_id' => $user->id, @@ -131,8 +145,8 @@ class RequestPortalController extends Controller 'city_name' => $user->city_fa ?? 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), + 'state_id' => MissionStates::START_MISSION->value, + 'state_name' => MissionStates::START_MISSION->label(), 'type' => $request->type, 'type_fa' => MissionTypes::name($request->type), 'zone' => $request->zone, @@ -142,19 +156,22 @@ class RequestPortalController extends Controller 'request_date' => now(), 'description' => $request->description, 'end_point' => $request->end_point, - 'area' => json_encode($request->area), - 'category_id' => $category, - 'category_name' => MissionCategory::name($category), + 'encoded_route' => $request->encoded_route, + 'category_id' => $request->category_id, + 'category_name' => MissionCategory::name($request->category_id), 'explanation' => $request->explanation, 'start_time' => now(), 'machine_id' => $machine->id, 'machine_code' => $machine->machine_code, 'station_id' => $user->station_id, 'station_name' => RahdariPoint::query()->find( $user->station_id)->name, + 'driver_id' => $request->driver, + 'driver_name' => Rahdaran::query()->find($request->driver)->name, + 'km' => $request->end_km, + 'requested_machines' => json_encode($machine->car_type), ]); $newMission->rahdaran()->sync($request->rahdaran); - $newMission->rahdaran()->attach($request->driver, ['is_driver' => true]); }); return $this->successResponse(); @@ -179,7 +196,7 @@ class RequestPortalController extends Controller 'end_date' => $request->end_date, 'description' => $request->description, 'end_point' => $request->end_point, - 'area' => json_encode($request->area), + 'encoded_route' => $request->encoded_route, 'category_id' => $request->category_id, 'category_name' => MissionCategory::name($request->category_id), 'explanation' => $request->explanation, @@ -205,19 +222,29 @@ class RequestPortalController extends Controller return $this->successResponse(); } + public function changeState(ChangeStateRequest $request, Mission $mission): JsonResponse + { + $mission->update([ + 'state_id' => $request->state_id, + 'state_name' => MissionStates::name($request->state_id), + ]); + + return $this->successResponse($mission); + } + /** * @throws Throwable */ - public function noProcess(NoProcessRequest $request, GetErrorRateService $getErrorRateService): JsonResponse + public function clarifyUnauthorizedExit(ClarifyUnauthorizedExitRequest $request, MissionViolation $violation): JsonResponse { - DB::transaction(function () use ($request, $getErrorRateService) { - $start = Carbon::parse($request->start_date); - $end = Carbon::parse($request->end_date); + DB::transaction(function () use ($request, $violation) { + + $start = Carbon::parse($violation->exit_time); + $end = Carbon::parse($violation->enter_time); $type = $start->diffInMinutes($end) > 480 ? MissionTypes::NO_PROCESS_ROZANE->value : MissionTypes::NO_PROCESS_SAATY->value; $user = auth()->user(); $zone = $request->zone; - $state = MissionStates::END_MISSION->value; - $machine = CMMSMachine::query()->where('machine_code', '=', $request->machine_code)->first(['id', 'machine_code']); + $machine = CMMSMachine::query()->where('machine_code', '=', $violation->machine_code)->first(['id', 'machine_code', 'car_type']); $mission = Mission::query()->create([ 'user_id' => $user->id, @@ -230,40 +257,35 @@ class RequestPortalController extends Controller 'edare_shahri_name' => $user->edarate_shahri_name ?? null, 'zone' => $zone, 'zone_fa' => MissionZones::name($zone), + 'encoded_route' => $request->encoded_route, 'type' => $type, 'type_fa' => MissionTypes::name($type), - 'start_date' => $request->start_date, - 'area' => json_encode($request->area), - 'end_date' => $request->end_date, + 'start_date' => $violation->exit_time, + 'end_date' => $violation->enter_time, 'end_point' => $request->end_point, 'category_id' => $request->category_id, 'category_name' => MissionCategory::name($request->category_id), - 'start_time' => $request->start_date, - 'finish_time' => $request->end_date, - 'state_id' => $state, - 'state_name' => MissionStates::name($state), + 'start_time' => $violation->exit_time, + 'finish_time' => $violation->enter_time, + 'mission_duration' => strtotime($violation->enter_time) - strtotime($violation->exit_time), + 'state_id' => MissionStates::END_MISSION->value, + 'state_name' => MissionStates::END_MISSION->label(), 'explanation' => $request->explanation, 'request_date' => now(), 'machine_id' => $machine->id, 'machine_code' => $machine->machine_code, + 'requested_machines' => json_encode($machine->car_type), 'station_id' => $user->station_id, - 'station_name' => RahdariPoint::query()->find( $user->station_id)->name, + 'station_name' => RahdariPoint::query()->find($user->station_id)->name, + 'km' => $violation->km ?? null, + 'end_km' => $violation->end_km ?? null, + 'driver_id' => $request->driver, + 'driver_name' => Rahdaran::query()->find($request->driver)->name, ]); $mission->rahdaran()->sync($request->rahdaran); - $mission->rahdaran()->attach($request->driver, ['is_driver' => true]); - $getErrorRateService->setInputParameters($mission); - $responseData = $getErrorRateService->run(); - - $mission->update([ - 'in_area_duration' => $responseData['timeInAreaSeconds'], - 'first_enter' => $responseData['firstEnter'], - 'last_exit' => $responseData['lastExit'], - 'point_number_sent' => $responseData['noOfPointsInMission'], - 'fms_result_code' => $responseData['resultCode'], - 'fms_result_message' => FMSResultCode::name($responseData['resultCode']), - ]); + $violation->update(['status' => 1]); // if ($mission->category_id == 2) { // $rpc = new OperatorController; diff --git a/app/Http/Controllers/V3/Dashboard/Mission/TransportationUnitController.php b/app/Http/Controllers/V3/Dashboard/Mission/TransportationUnitController.php index bbffd853..c268b91b 100644 --- a/app/Http/Controllers/V3/Dashboard/Mission/TransportationUnitController.php +++ b/app/Http/Controllers/V3/Dashboard/Mission/TransportationUnitController.php @@ -10,6 +10,7 @@ use App\Http\Requests\V3\Mission\TransportaionUnit\DeallocateRequest; use App\Http\Traits\ApiResponse; use App\Models\CMMSMachine; use App\Models\Mission; +use App\Models\Rahdaran; use App\Services\Cartables\Mission\TransportationUnitService; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; @@ -31,13 +32,12 @@ class TransportationUnitController extends Controller public function allocate(AllocateRequest $request, Mission $mission): JsonResponse { DB::transaction(function () use ($request, $mission) { - $mission->rahdaran()->attach($request->driver, ['is_driver' => true]); - $mission->histories()->create([ - 'user_id' => auth()->user()->id, - 'previous_state_id' => $mission->state_id, - 'previous_state_name' => $mission->state_name, - ]); +// $mission->histories()->create([ +// 'user_id' => auth()->user()->id, +// 'previous_state_id' => $mission->state_id, +// 'previous_state_name' => $mission->state_name, +// ]); $state = MissionStates::PENDING_CONFIRMATION->value; $machine = CMMSMachine::query()->find($request->machine_id); @@ -47,6 +47,12 @@ class TransportationUnitController extends Controller 'state_name' => MissionStates::name($state), 'machine_id' => $machine->id, 'machine_code' => $machine->machine_code, + 'driver_id' => $request->driver, + 'driver_name' => Rahdaran::query()->find($request->driver)->name, + ]); + + $machine->update([ + 'status' => CmmsMachineStatus::RESERVE->value ]); }); @@ -59,23 +65,28 @@ class TransportationUnitController extends Controller public function deallocate(DeallocateRequest $request, Mission $mission): JsonResponse { DB::transaction(function () use ($request, $mission) { - $mission->rahdaran()->wherePivot('is_driver', '=', true)->detach(); - $mission->histories()->create([ - 'user_id' => auth()->user()->id, - 'previous_state_id' => $mission->state_id, - 'previous_state_name' => $mission->state_name, - 'user_description' => $request->description, - ]); +// $mission->histories()->create([ +// 'user_id' => auth()->user()->id, +// 'previous_state_id' => $mission->state_id, +// 'previous_state_name' => $mission->state_name, +// 'user_description' => $request->description, +// ]); $state = MissionStates::REJECT_BY_TRANSPORTATION->value; + $mission->machine()->update([ + 'status' => CmmsMachineStatus::AMADE->value + ]); + $mission->update([ 'state_id' => $state, 'state_name' => MissionStates::name($state), 'description' => $request->description, 'machine_id' => null, 'machine_code' => null, + 'driver_id' => null, + 'driver_name' => null, ]); }); diff --git a/app/Http/Controllers/V3/Dashboard/Mission/ViolationManagementController.php b/app/Http/Controllers/V3/Dashboard/Mission/ViolationManagementController.php index bb8b8365..5d73cefa 100644 --- a/app/Http/Controllers/V3/Dashboard/Mission/ViolationManagementController.php +++ b/app/Http/Controllers/V3/Dashboard/Mission/ViolationManagementController.php @@ -16,6 +16,7 @@ use App\Http\Traits\ApiResponse; use App\Models\CMMSMachine; use App\Models\Mission; use App\Models\MissionViolation; +use App\Models\Rahdaran; use App\Models\RahdariPoint; use App\Services\Cartables\Mission\DailyMoveMachineService; use Carbon\Carbon; @@ -35,65 +36,6 @@ class ViolationManagementController extends Controller return response()->json($data); } - /** - * @throws Throwable - */ - public function noProcess(NoProcessRequest $request, MissionViolation $violation): JsonResponse - { - DB::transaction(function () use ($request, $violation) { - - $start = Carbon::parse($request->start_date); - $end = Carbon::parse($request->end_date); - $type = $start->diffInMinutes($end) > 480 ? MissionTypes::NO_PROCESS_ROZANE->value : MissionTypes::NO_PROCESS_SAATY->value; - $user = auth()->user(); - $zone = $request->zone; - $state = MissionStates::END_MISSION->value; - $machine = CMMSMachine::query()->where('machine_code', '=', $violation->machine_code)->first(['id', 'machine_code']); - - $mission = Mission::query()->create([ - 'user_id' => $user->id, - 'username' => $user->username, - 'province_id' => $user->province_id, - 'province_name' => $user->province_fa, - 'city_id' => $user->city_id ?? null, - 'city_name' => $user->city_fa ?? null, - 'edare_shahri_id' => $user->edarate_shahri_id ?? null, - 'edare_shahri_name' => $user->edarate_shahri_name ?? null, - 'zone' => $zone, - 'zone_fa' => MissionZones::name($zone), - 'type' => $type, - 'type_fa' => MissionTypes::name($type), - 'start_date' => $request->start_date,// - 'end_date' => $request->end_date,// - 'end_point' => $request->end_point, - 'category_id' => $request->category_id, - 'category_name' => MissionCategory::name($request->category_id), - 'start_time' => $request->start_date,// - 'finish_time' => $request->end_date,// - 'state_id' => $state, - 'state_name' => MissionStates::name($state), - 'explanation' => $request->explanation, - 'request_date' => now(), - 'machine_id' => $machine->id,// - 'machine_code' => $machine->machine_code,// - 'station_id' => $user->station_id, - 'station_name' => RahdariPoint::query()->find( $user->station_id)->name, - 'km' => $violation->km ?? null, - ]); - - $mission->rahdaran()->sync($request->rahdaran); - $mission->rahdaran()->attach($request->driver, ['is_driver' => true]); - - $violation->update(['status' => 1]); - -// if ($mission->category_id == 2) { -// $rpc = new OperatorController; -// $rpc->store($mission); -// } - }); - - return $this->successResponse(); - } public function store(StoreRequest $request): JsonResponse { $user = auth()->user(); @@ -102,7 +44,7 @@ class ViolationManagementController extends Controller 'machine_id'=> CMMSMachine::query()->where('machine_code', '=', $request->machine_code)->value('id'), 'machine_code'=> $request->machine_code, 'type'=> MissionViolationType::KHOROJ_BEDONE_MOGAVEZ->value, - 'status' => MissionViolationStatus::BEDON_EGHDAM->value, + 'status' => MissionViolationStatus::SABT_SHODE->value, 'request_date' => now(), 'km' => $request->km, 'gps' => 0, @@ -110,6 +52,9 @@ class ViolationManagementController extends Controller 'province_name' => $user->province_fa, 'city_id' => $user->city_id, 'city_name' => $user->city_fa, + 'station_id' => $user->station_id, + 'station_name' => RahdariPoint::query()->find($user->station_id)->name, + 'exit_time' => $request->exit_time, ]); return $this->successResponse(); @@ -124,7 +69,8 @@ class ViolationManagementController extends Controller { $violation->update([ 'enter_time' => $request->enter_time, - 'exit_time' => $request->exit_time, + 'status' => MissionViolationStatus::BEDON_EGHDAM->value, + 'end_km' => $request->end_km, ]); return $this->successResponse(); @@ -135,5 +81,4 @@ class ViolationManagementController extends Controller $violation->delete(); return $this->successResponse(); } - } diff --git a/app/Http/Controllers/V3/Dashboard/RoadMaintenanceStationController.php b/app/Http/Controllers/V3/Dashboard/RoadMaintenanceStationController.php index ded93c8b..f01e9eaf 100644 --- a/app/Http/Controllers/V3/Dashboard/RoadMaintenanceStationController.php +++ b/app/Http/Controllers/V3/Dashboard/RoadMaintenanceStationController.php @@ -42,7 +42,7 @@ class RoadMaintenanceStationController extends Controller { $stations = RahdariPoint::query() ->where('city_id', $request->query('city_id')) - ->get(); + ->get(['id', 'name']); return $this->successResponse($stations); } diff --git a/app/Http/Controllers/V3/ProvinceController.php b/app/Http/Controllers/V3/ProvinceController.php new file mode 100644 index 00000000..e295370c --- /dev/null +++ b/app/Http/Controllers/V3/ProvinceController.php @@ -0,0 +1,19 @@ +successResponse(Province::all(['id', 'name_fa'])); + } +} \ No newline at end of file diff --git a/app/Http/Requests/V3/CMMSMachine/UpdateRequest.php b/app/Http/Requests/V3/CMMSMachine/UpdateRequest.php new file mode 100644 index 00000000..7e1d97ce --- /dev/null +++ b/app/Http/Requests/V3/CMMSMachine/UpdateRequest.php @@ -0,0 +1,33 @@ + + */ + public function rules(): array + { + return [ + 'status' => 'integer', + 'province_id' => 'integer|exists:provinces,id', + 'city_id' => 'integer|exists:cities,id', + 'station_id' => 'integer|exists:rahdari_points,id', + ]; + } +} diff --git a/app/Http/Requests/V3/Mission/ControlUnit/FinishRequest.php b/app/Http/Requests/V3/Mission/ControlUnit/FinishRequest.php index bbc1d5b0..b62c5124 100644 --- a/app/Http/Requests/V3/Mission/ControlUnit/FinishRequest.php +++ b/app/Http/Requests/V3/Mission/ControlUnit/FinishRequest.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 FinishRequest extends FormRequest { @@ -28,4 +29,25 @@ class FinishRequest extends FormRequest 'end_km' => 'required', ]; } + + public function after(): array + { + return [ + function (Validator $validator) { + $mission = $this->mission; + if (strtotime($this->time) < strtotime($mission->start_time)) { + $validator->errors()->add( + 'time', + 'زمان پایان ماموریت باید بعد از زمان شروع ماموریت باشد.' + ); + } + if ($this->end_km < $mission->km) { + $validator->errors()->add( + 'end_km', + 'کیلومتر پایان باید بزرگتر از کیلومتر شروع باشد.' + ); + } + } + ]; + } } diff --git a/app/Http/Requests/V3/Mission/RequestPortal/ChangeStateRequest.php b/app/Http/Requests/V3/Mission/RequestPortal/ChangeStateRequest.php new file mode 100644 index 00000000..1bd06690 --- /dev/null +++ b/app/Http/Requests/V3/Mission/RequestPortal/ChangeStateRequest.php @@ -0,0 +1,30 @@ + + */ + public function rules(): array + { + return [ + 'state_id' => 'required', + ]; + } +} diff --git a/app/Http/Requests/V3/Mission/RequestPortal/NoProcessRequest.php b/app/Http/Requests/V3/Mission/RequestPortal/ClarifyUnauthorizedExitRequest.php similarity index 59% rename from app/Http/Requests/V3/Mission/RequestPortal/NoProcessRequest.php rename to app/Http/Requests/V3/Mission/RequestPortal/ClarifyUnauthorizedExitRequest.php index d30aa42d..a0129c2c 100644 --- a/app/Http/Requests/V3/Mission/RequestPortal/NoProcessRequest.php +++ b/app/Http/Requests/V3/Mission/RequestPortal/ClarifyUnauthorizedExitRequest.php @@ -2,17 +2,19 @@ namespace App\Http\Requests\V3\Mission\RequestPortal; +use Carbon\Carbon; use Illuminate\Contracts\Validation\ValidationRule; use Illuminate\Foundation\Http\FormRequest; +use Illuminate\Validation\Validator; -class NoProcessRequest extends FormRequest +class ClarifyUnauthorizedExitRequest extends FormRequest { /** * Determine if the user is authorized to make this request. */ public function authorize(): bool { - return true; + return $this->violation->status === 0 && $this->violation->type === 1; } /** @@ -27,22 +29,10 @@ class NoProcessRequest extends FormRequest 'rahdaran.*' => 'exists:rahdaran,id', 'driver' => 'required|integer|exists:rahdaran,id', 'zone' => 'required|in:1,2,3', - 'start_date' => 'required|date', - 'end_date' => 'required|date|after:start_date|before:now', 'end_point' => 'required|string', - 'area' => 'array', - 'area.type' => 'string', - 'area.coordinates' => 'array', + 'encoded_route' => 'required|string', 'category_id' => 'required|in:1,2,3', 'explanation' => 'required|string', ]; } - - public function messages(): array - { - return [ - 'end_date.before' => 'تاریخ پایان باید قبل از زمان فعلی باشد.', - 'end_date.after' => 'تاریخ پایان نباید قبل از تاریخ شروع باشد.', - ]; - } } diff --git a/app/Http/Requests/V3/Mission/RequestPortal/ContinueMissionRequest.php b/app/Http/Requests/V3/Mission/RequestPortal/ContinueMissionRequest.php index bff88565..46fc0cea 100644 --- a/app/Http/Requests/V3/Mission/RequestPortal/ContinueMissionRequest.php +++ b/app/Http/Requests/V3/Mission/RequestPortal/ContinueMissionRequest.php @@ -35,12 +35,10 @@ class ContinueMissionRequest extends FormRequest 'end_date' => 'required|date', 'description' => 'string', 'end_point' => 'required|string', - 'area' => 'required|array', - 'area.type' => 'required|string', - 'area.coordinates' => 'required|array', + 'encoded_route' => 'required|string', 'explanation' => 'required|string', 'category_id' => 'required|in:1,2,3', - 'road_observed_id' => 'required_if:category_id,3|exists:road_observeds,id', + 'end_km'=> 'required|string', ]; } @@ -59,6 +57,18 @@ class ContinueMissionRequest extends FormRequest ); } } + if ($this->end_km < $this->mission->km) { + $validator->errors()->add( + 'end_km', + 'کیلومتر پایان باید بزرگتر از کیلومتر شروع باشد.' + ); + } + if (strtotime($this->end_date) < strtotime($this->mission->start_time)) { + $validator->errors()->add( + 'time', + 'زمان پایان ماموریت باید بعد از زمان شروع ماموریت باشد.' + ); + } }, ]; } diff --git a/app/Http/Requests/V3/Mission/RequestPortal/StoreRequest.php b/app/Http/Requests/V3/Mission/RequestPortal/StoreRequest.php index c9233d40..0e787c12 100644 --- a/app/Http/Requests/V3/Mission/RequestPortal/StoreRequest.php +++ b/app/Http/Requests/V3/Mission/RequestPortal/StoreRequest.php @@ -34,12 +34,9 @@ class StoreRequest extends FormRequest 'end_date' => 'required|date', 'description' => 'string', 'end_point' => 'required|string', - 'area' => 'required|array', - 'area.type' => 'required|string', - 'area.coordinates' => 'required|array', + 'encoded_route' => 'required|string', 'explanation' => 'required|string', 'category_id' => 'required|in:1,2,3', - 'road_observed_id' => 'required_if:category_id,3|exists:road_observeds,id', ]; } @@ -58,6 +55,12 @@ class StoreRequest extends FormRequest ); } } + if (strtotime($this->end_date) < strtotime($this->start_date)) { + $validator->errors()->add( + 'time', + 'زمان پایان ماموریت باید بعد از زمان شروع ماموریت باشد.' + ); + } }, ]; } diff --git a/app/Http/Requests/V3/Mission/RequestPortal/UpdateRequest.php b/app/Http/Requests/V3/Mission/RequestPortal/UpdateRequest.php index fb80a7f6..ce8858fa 100644 --- a/app/Http/Requests/V3/Mission/RequestPortal/UpdateRequest.php +++ b/app/Http/Requests/V3/Mission/RequestPortal/UpdateRequest.php @@ -35,12 +35,9 @@ class UpdateRequest extends FormRequest 'end_date' => 'required|date', 'description' => 'string', 'end_point' => 'required|string', - 'area' => 'required|array', - 'area.type' => 'required|string', - 'area.coordinates' => 'required|array', + 'encoded_route' => 'required|string', 'explanation' => 'required|string', 'category_id' => 'required|in:1,2,3', - 'road_observed_id' => 'required_if:category_id,3|exists:road_observeds,id', ]; } @@ -59,6 +56,12 @@ class UpdateRequest extends FormRequest ); } } + if (strtotime($this->end_date) < strtotime($this->start_date)) { + $validator->errors()->add( + 'time', + 'زمان پایان ماموریت باید بعد از زمان شروع ماموریت باشد.' + ); + } }, ]; } diff --git a/app/Http/Requests/V3/Mission/TransportaionUnit/AllocateRequest.php b/app/Http/Requests/V3/Mission/TransportaionUnit/AllocateRequest.php index de093022..af14fad9 100644 --- a/app/Http/Requests/V3/Mission/TransportaionUnit/AllocateRequest.php +++ b/app/Http/Requests/V3/Mission/TransportaionUnit/AllocateRequest.php @@ -15,7 +15,8 @@ class AllocateRequest extends FormRequest */ public function authorize(): bool { - return $this->mission->edare_shahri_id == auth()->user()->edarate_shahri_id && $this->mission->state_id == MissionStates::REQUEST_CREATED->value; + return $this->mission->station_id == auth()->user()->station_id && $this->mission->state_id == MissionStates::REQUEST_CREATED->value + || auth()->user()->username === 'witel'; } /** diff --git a/app/Http/Requests/V3/Mission/TransportaionUnit/DeallocateRequest.php b/app/Http/Requests/V3/Mission/TransportaionUnit/DeallocateRequest.php index e2d94deb..c5d763d2 100644 --- a/app/Http/Requests/V3/Mission/TransportaionUnit/DeallocateRequest.php +++ b/app/Http/Requests/V3/Mission/TransportaionUnit/DeallocateRequest.php @@ -13,8 +13,9 @@ class DeallocateRequest extends FormRequest */ public function authorize(): bool { - return $this->mission->edare_shahri_id == auth()->user()->edarate_shahri_id && - in_array($this->mission->state_id, [MissionStates::REQUEST_CREATED->value, MissionStates::PENDING_CONFIRMATION->value]); + return $this->mission->station_id == auth()->user()->station_id && + in_array($this->mission->state_id, [MissionStates::REQUEST_CREATED->value, MissionStates::PENDING_CONFIRMATION->value]) + || auth()->user()->username === 'witel'; } /** diff --git a/app/Http/Requests/V3/Mission/Violation/NoProcessRequest.php b/app/Http/Requests/V3/Mission/Violation/NoProcessRequest.php index 6f223b4c..43ddd096 100644 --- a/app/Http/Requests/V3/Mission/Violation/NoProcessRequest.php +++ b/app/Http/Requests/V3/Mission/Violation/NoProcessRequest.php @@ -2,8 +2,10 @@ namespace App\Http\Requests\V3\Mission\Violation; +use Carbon\Carbon; use Illuminate\Contracts\Validation\ValidationRule; use Illuminate\Foundation\Http\FormRequest; +use Illuminate\Validation\Validator; class NoProcessRequest extends FormRequest { @@ -27,22 +29,10 @@ class NoProcessRequest extends FormRequest 'rahdaran.*' => 'exists:rahdaran,id', 'driver' => 'required|integer|exists:rahdaran,id', 'zone' => 'required|in:1,2,3', - 'start_date' => 'required|date', - 'end_date' => 'required|date|after:start_date|before:now', 'end_point' => 'required|string', - 'area' => 'array', - 'area.type' => 'string', - 'area.coordinates' => 'array', +// 'encoded_route' => 'required|string', 'category_id' => 'required|in:1,2,3', 'explanation' => 'required|string', ]; } - - public function messages(): array - { - return [ - 'end_date.before' => 'تاریخ پایان باید قبل از زمان فعلی باشد.', - 'end_date.after' => 'تاریخ پایان نباید قبل از تاریخ شروع باشد.', - ]; - } } diff --git a/app/Http/Requests/V3/Mission/Violation/StoreRequest.php b/app/Http/Requests/V3/Mission/Violation/StoreRequest.php index 07e5b36f..16ea27bc 100644 --- a/app/Http/Requests/V3/Mission/Violation/StoreRequest.php +++ b/app/Http/Requests/V3/Mission/Violation/StoreRequest.php @@ -25,7 +25,8 @@ class StoreRequest extends FormRequest public function rules(): array { return [ - 'machine_code' => 'required', + 'exit_time' => 'required|date', + 'machine_code' => 'required', 'km'=> 'string', ]; } diff --git a/app/Http/Requests/V3/Mission/Violation/UpdateRequest.php b/app/Http/Requests/V3/Mission/Violation/UpdateRequest.php index d2f8e22a..561e2188 100644 --- a/app/Http/Requests/V3/Mission/Violation/UpdateRequest.php +++ b/app/Http/Requests/V3/Mission/Violation/UpdateRequest.php @@ -26,8 +26,28 @@ class UpdateRequest extends FormRequest public function rules(): array { return [ - 'exit_time' => 'date', - 'enter_time' => 'date', + 'enter_time' => 'required|date', + 'end_km'=> 'required|string', + ]; + } + + public function after(): array + { + return [ + function (Validator $validator) { + if (strtotime($this->enter_time) < strtotime($this->violation->exit_time)) { + $validator->errors()->add( + 'time', + 'زمان پایان ماموریت باید بعد از زمان شروع ماموریت باشد.' + ); + } + if ($this->end_km < $this->violation->km) { + $validator->errors()->add( + 'end_km', + 'کیلومتر پایان باید بزرگتر از کیلومتر شروع باشد.' + ); + } + } ]; } } diff --git a/app/Models/City.php b/app/Models/City.php index 614cc699..4a312930 100644 --- a/app/Models/City.php +++ b/app/Models/City.php @@ -14,6 +14,7 @@ class City extends Model * * @var array */ + protected $guarded = ['id']; protected $hidden = [ 'name_en', 'feature_id', diff --git a/app/Models/Mission.php b/app/Models/Mission.php index fbce2451..a277162a 100644 --- a/app/Models/Mission.php +++ b/app/Models/Mission.php @@ -28,13 +28,6 @@ class Mission extends Model ); } - protected function area(): Attribute - { - return Attribute::make( - get: fn($value) => json_decode($value, true) - ); - } - public function histories(): HasMany { return $this->hasMany(MissionHistory::class); @@ -50,21 +43,6 @@ class Mission extends Model return $this->hasMany(RoadItemsProject::class); } - public function roadObserveds(): MorphToMany - { - return $this->morphedByMany(RoadObserved::class, 'missionable'); - } - - public function machines(): MorphToMany - { - return $this->morphToMany(CMMSMachine::class, - 'machinable', - 'machinables', - 'machinable_id', - 'machine_id' - ); - } - public function rahdaran(): MorphToMany { return $this->morphToMany(Rahdaran::class, @@ -75,17 +53,6 @@ class Mission extends Model )->withPivot('is_driver'); } - public function roadObserved(): MorphToMany - { - return $this->morphedByMany( - RoadObserved::class, - 'missionable', - 'missionables', - 'mission_id', - 'missionable_id' - ); - } - public function machine(): BelongsTo { return $this->belongsTo(CMMSMachine::class, 'machine_id'); diff --git a/app/Models/Province.php b/app/Models/Province.php index 0c803401..3254540e 100644 --- a/app/Models/Province.php +++ b/app/Models/Province.php @@ -13,6 +13,7 @@ class Province extends Model * * @var array */ + protected $guarded = ['id']; protected $hidden = [ 'feature_id', //'center_lat', diff --git a/app/Services/Cartables/Mission/ControlUnitService.php b/app/Services/Cartables/Mission/ControlUnitService.php index 6b234a3c..c27d60e0 100644 --- a/app/Services/Cartables/Mission/ControlUnitService.php +++ b/app/Services/Cartables/Mission/ControlUnitService.php @@ -37,7 +37,7 @@ 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', 'encoded_route', 'zone', 'zone_fa', 'start_time', 'finish_time', 'code', 'category_id', 'category_name', 'explanation', 'city_id', 'city_name', 'province_id', 'station_name', ] ); diff --git a/app/Services/Cartables/Mission/DailyMoveMachineService.php b/app/Services/Cartables/Mission/DailyMoveMachineService.php index 1dbefe1b..bc7dcb47 100644 --- a/app/Services/Cartables/Mission/DailyMoveMachineService.php +++ b/app/Services/Cartables/Mission/DailyMoveMachineService.php @@ -2,6 +2,7 @@ namespace App\Services\Cartables\Mission; +use App\Enums\MissionViolationStatus; use App\Facades\DataTable\DataTableFacade; use App\Models\MissionViolation; use Illuminate\Http\Request; @@ -13,7 +14,8 @@ class DailyMoveMachineService { $user = Auth::user(); - $query = MissionViolation::query()->with('machine:id,car_name'); + $query = MissionViolation::query()->with('machine:id,car_name') + ->where('mission_violations.status', '=', MissionViolationStatus::SABT_SHODE->value); if ($user->hasPermissionTo('manage-violation-station')) { $query->whereRelation('machine', 'station_id', '=', $user->station_id); diff --git a/app/Services/Cartables/Mission/Report/ReportMachineService.php b/app/Services/Cartables/Mission/Report/ReportMachineService.php new file mode 100644 index 00000000..38bb4996 --- /dev/null +++ b/app/Services/Cartables/Mission/Report/ReportMachineService.php @@ -0,0 +1,137 @@ +from_date ?? today()->startOfDay(); + $to = $request->date_to ? Carbon::parse($request->date_to)->endOfDay() : today()->endOfDay(); + + $sql = "SELECT + m.machine_id, + m.machine_code, + cm.car_name, + COUNT(*) AS missions, + SUM(m.end_km - m.km) AS func + FROM missions m + JOIN cmms_machines cm ON cm.id = m.machine_id + WHERE m.state_id = 4 AND m.start_time >= :from AND m.finish_time <= :to + GROUP BY machine_id;"; + + return DB::select($sql, [ + 'from' => $from, + 'to' => $to, + ]); + } + + public function provinceMachinesActivity(Request $request): array + { + $from = $request->from_date ?? today()->startOfDay(); + $to = $request->date_to ? Carbon::parse($request->date_to)->endOfDay() : today()->endOfDay(); + $province = $request->province_id; + + $sql = "SELECT m.machine_id, m.machine_code, cm.car_name, COUNT(*) AS missions, SUM(m.end_km - m.km) AS func + FROM missions m + JOIN cmms_machines cm ON cm.id = m.machine_id + WHERE m.state_id = 4 AND start_time >= :from AND finish_time <= :to AND m.province_id = :province_id + GROUP BY machine_id;"; + + return DB::select($sql, [ + 'from' => $from, + 'to' => $to, + 'province_id' => $province, + ]); + } + + public function countryMachineTypesActivity(Request $request): array + { + $from = $request->from_date ?? today()->startOfDay(); + $to = $request->date_to ? Carbon::parse($request->date_to)->endOfDay() : today()->endOfDay(); + + $sql = "SELECT + cm.car_type, + COUNT(*) AS missions, + SUM(m.end_km - m.km) AS func + FROM missions m + JOIN cmms_machines cm ON cm.id = m.machine_id + WHERE m.state_id = 4 AND m.start_time >= :from AND m.finish_time <= :to + GROUP BY cm.car_type;"; + + return DB::select($sql, [ + 'from' => $from, + 'to' => $to, + ]); + } + + public function provinceMachineTypesActivity(Request $request): array + { + $from = $request->from_date ?? today()->startOfDay(); + $to = $request->date_to ? Carbon::parse($request->date_to)->endOfDay() : today()->endOfDay(); + $province = $request->province_id; + + $sql = "SELECT + cm.car_type, + COUNT(*) AS missions, + SUM(m.end_km - m.km) AS func + FROM missions m + JOIN cmms_machines cm ON cm.id = m.machine_id + WHERE m.state_id = 4 AND m.start_time >= :from AND m.finish_time <= :to AND m.province_id = :province_id + GROUP BY cm.car_type;"; + + return DB::select($sql, [ + 'from' => $from, + 'to' => $to, + 'province_id' => $province, + ]); + } + + public function countryMachineDriversActivity(Request $request): array + { + $from = $request->from_date ?? today()->startOfDay(); + $to = $request->date_to ? Carbon::parse($request->date_to)->endOfDay() : today()->endOfDay(); + + $sql = "SELECT + m.driver_id, + m.driver_name, + COUNT(*) AS missions, + SUM(m.end_km - m.km) AS func + FROM missions m + WHERE m.state_id = 4 AND m.start_time >= :from AND m.finish_time <= :to + GROUP BY m.driver_id;"; + + return DB::select($sql, [ + 'from' => $from, + 'to' => $to, + ]); + } + + public function provinceMachineDriversActivity(Request $request): array + { + $from = $request->from_date ?? today()->startOfDay(); + $to = $request->date_to ? Carbon::parse($request->date_to)->endOfDay() : today()->endOfDay(); + $province = $request->province_id; + + $sql = "SELECT + m.driver_id, + m.driver_name, + COUNT(*) AS missions, + SUM(m.end_km - m.km) AS func + FROM missions m + WHERE m.state_id = 4 AND m.start_time >= :from AND m.finish_time <= :to AND province_id = :province_id + GROUP BY m.driver_id;"; + + return DB::select($sql, [ + 'from' => $from, + 'to' => $to, + 'province_id' => $province, + ]); + } +} diff --git a/app/Services/Cartables/Mission/RequestPortalService.php b/app/Services/Cartables/Mission/RequestPortalService.php index 5be57872..2c17793c 100644 --- a/app/Services/Cartables/Mission/RequestPortalService.php +++ b/app/Services/Cartables/Mission/RequestPortalService.php @@ -32,8 +32,9 @@ class RequestPortalService 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', 'encoded_route', 'zone', 'zone_fa', 'start_time', 'finish_time', 'code', 'category_id', 'category_name', 'explanation', 'city_id', 'city_name', 'province_id', 'station_name', + 'driver_id', 'driver_name' ] ); } diff --git a/app/Services/Cartables/Mission/TransportationUnitService.php b/app/Services/Cartables/Mission/TransportationUnitService.php index d4e3be54..f8fc4ff5 100644 --- a/app/Services/Cartables/Mission/TransportationUnitService.php +++ b/app/Services/Cartables/Mission/TransportationUnitService.php @@ -32,7 +32,7 @@ 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', 'encoded_route', 'zone', 'zone_fa', 'start_time', 'finish_time', 'code', 'category_id', 'category_name', 'explanation', 'km', 'city_id', 'city_name', 'province_id', 'station_name', ] ); diff --git a/app/Services/PolylineEncoder.php b/app/Services/PolylineEncoder.php new file mode 100644 index 00000000..3f4dda19 --- /dev/null +++ b/app/Services/PolylineEncoder.php @@ -0,0 +1,88 @@ +encodeValue((int)round($lat * $factor) - $prevLat); + $output .= $this->encodeValue((int)round($lng * $factor) - $prevLng); + + $prevLat = (int)round($lat * $factor); + $prevLng = (int)round($lng * $factor); + } + + return $output; + } + + /** + * Encodes a single integer value using Google's polyline encoding algorithm. + * + * Steps: + * - Left shift the value + * - Invert bits if negative + * - Split into 5-bit chunks + * - Convert to ASCII characters + * + * @param int $value Signed integer delta to encode + * + * @return string Encoded character sequence + */ + public function encodeValue(int $value): string + { + $value = $value < 0 ? ~($value << 1) : ($value << 1); + $result = ''; + + while ($value >= 0x20) { + $result .= chr((0x20 | ($value & 0x1f)) + 63); + $value >>= 5; + } + + return $result . chr($value + 63); + } +} diff --git a/database/migrations/2025_05_17_103927_create_missions_table.php b/database/migrations/2025_05_17_103927_create_missions_table.php index 25a60291..ab821ba9 100644 --- a/database/migrations/2025_05_17_103927_create_missions_table.php +++ b/database/migrations/2025_05_17_103927_create_missions_table.php @@ -24,7 +24,7 @@ return new class extends Migration $table->unsignedBigInteger('edare_shahri_id')->nullable(); $table->foreign('edare_shahri_id')->references('id')->on('edarate_shahri')->noActionOnDelete(); $table->string('edare_shahri_name')->nullable(); - $table->json('requested_machines'); + $table->json('requested_machines')->nullable(); $table->string('type'); $table->dateTime('start_date'); $table->dateTime('end_date'); diff --git a/database/migrations/2025_06_10_093806_add_area_to_missions_table.php b/database/migrations/2025_06_10_093806_add_area_to_missions_table.php index bee98cf6..dbd95723 100644 --- a/database/migrations/2025_06_10_093806_add_area_to_missions_table.php +++ b/database/migrations/2025_06_10_093806_add_area_to_missions_table.php @@ -12,7 +12,7 @@ return new class extends Migration public function up(): void { Schema::table('missions', function (Blueprint $table) { - $table->json('area'); + $table->json('area')->nullable(); $table->integer('zone'); $table->string('zone_fa'); $table->string('type_fa'); diff --git a/database/migrations/2026_05_30_093222_add_driver_to_missions_table.php b/database/migrations/2026_05_30_093222_add_driver_to_missions_table.php new file mode 100644 index 00000000..a58af0a7 --- /dev/null +++ b/database/migrations/2026_05_30_093222_add_driver_to_missions_table.php @@ -0,0 +1,29 @@ +integer('driver_id')->nullable(); + $table->string('driver_name')->nullable(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('missions', function (Blueprint $table) { + $table->dropColumn('driver_name','driver_id'); + }); + } +}; diff --git a/database/migrations/2026_06_10_144529_add_column_to_mission_violations_table.php b/database/migrations/2026_06_10_144529_add_column_to_mission_violations_table.php new file mode 100644 index 00000000..46c68d01 --- /dev/null +++ b/database/migrations/2026_06_10_144529_add_column_to_mission_violations_table.php @@ -0,0 +1,29 @@ +unsignedInteger('station_id')->nullable(); + $table->string('station_name')->nullable(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('mission_violations', function (Blueprint $table) { + $table->dropColumn(['station_id', 'station_name']); + }); + } +}; diff --git a/database/migrations/2026_06_10_150953_add_column_to_missions_table.php b/database/migrations/2026_06_10_150953_add_column_to_missions_table.php new file mode 100644 index 00000000..c8ae17ee --- /dev/null +++ b/database/migrations/2026_06_10_150953_add_column_to_missions_table.php @@ -0,0 +1,28 @@ +longText('encoded_route')->nullable(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('missions', function (Blueprint $table) { + $table->dropColumn('encoded_route'); + }); + } +}; diff --git a/database/migrations/2026_06_15_095947_add_column_to_mission_violations_table.php b/database/migrations/2026_06_15_095947_add_column_to_mission_violations_table.php new file mode 100644 index 00000000..164da569 --- /dev/null +++ b/database/migrations/2026_06_15_095947_add_column_to_mission_violations_table.php @@ -0,0 +1,28 @@ +string('end_km')->nullable(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('mission_violations', function (Blueprint $table) { + $table->dropColumn('end_km'); + }); + } +}; diff --git a/resources/views/v3/Reports/Mission/Report/Machine/ActivityReport.blade.php b/resources/views/v3/Reports/Mission/Report/Machine/ActivityReport.blade.php new file mode 100644 index 00000000..c25c0dd2 --- /dev/null +++ b/resources/views/v3/Reports/Mission/Report/Machine/ActivityReport.blade.php @@ -0,0 +1,83 @@ + + + + + + + + گزارش کل تردد های یک ماشین + + + + + +@php + // show a dot if key missing or value is 0/empty + function cell($row, $key) { + return array_key_exists($key, $row) ? ($row[$key] ?: '0') : '0'; + } +@endphp + + + + + + + + + + + + + + + + + + + + + + + + + @foreach ($rows as $item) + + + + + + + + @endforeach + +
+ تاریخ دریافت گزارش: {{ verta()->now()->format('Y/m/d H:i') }} +
+
+ گزارش ماشین های ماموریت رفته +
+ کدیکتا + + مدل ماشین + کد ماشین + + کارکرد + + تعداد ماموریت
{{ $item['machine_id'] ?? '-' }}{{ $item['car_name'] ?? '-' }}{{ $item['machine_code'] ?? '-' }}{{ $item['func'] ?? '-' }}{{ $item['missions'] ?? '-' }}
+ + diff --git a/resources/views/v3/Reports/Mission/Report/Machine/MachineDriverReport.blade.php b/resources/views/v3/Reports/Mission/Report/Machine/MachineDriverReport.blade.php new file mode 100644 index 00000000..787bd624 --- /dev/null +++ b/resources/views/v3/Reports/Mission/Report/Machine/MachineDriverReport.blade.php @@ -0,0 +1,79 @@ + + + + + + + + گزارش کل تردد های راننده + + + + + +@php + // show a dot if key missing or value is 0/empty + function cell($row, $key) { + return array_key_exists($key, $row) ? ($row[$key] ?: '0') : '0'; + } +@endphp + + + + + + + + + + + + + + + + + + + + + + + + @foreach ($rows as $item) + + + + + + + @endforeach + +
+ تاریخ دریافت گزارش: {{ verta()->now()->format('Y/m/d H:i') }} +
+
+ گزارش راندده ها در ماموریت +
+ کد یکتا + + نام راننده + + کارکرد + + تعداد ماموریت
{{ $item['driver_id'] ?? '-' }}{{ $item['driver_name'] ?? '-' }}{{ $item['func'] ?? '-' }}{{ $item['missions'] ?? '-' }}
+ + diff --git a/resources/views/v3/Reports/Mission/Report/Machine/MachineTypeReport.blade.php b/resources/views/v3/Reports/Mission/Report/Machine/MachineTypeReport.blade.php new file mode 100644 index 00000000..74e25d00 --- /dev/null +++ b/resources/views/v3/Reports/Mission/Report/Machine/MachineTypeReport.blade.php @@ -0,0 +1,75 @@ + + + + + + + + گزارش کل تردد های انواع ماشین ها + + + + + +@php + // show a dot if key missing or value is 0/empty + function cell($row, $key) { + return array_key_exists($key, $row) ? ($row[$key] ?: '0') : '0'; + } +@endphp + + + + + + + + + + + + + + + + + + + + + + + + + @foreach ($rows as $item) + + + + + + @endforeach + +
+ تاریخ دریافت گزارش: {{ verta()->now()->format('Y/m/d H:i') }} +
+
+ گزارش نوع ماشین های ماموریت رفته +
+ نوع ماشین + کارکرد + + تعداد ماموریت
{{ $item['car_type'] ?? '-' }}{{ $item['func'] ?? '-' }}{{ $item['missions'] ?? '-' }}
+ + diff --git a/resources/views/v3/Reports/Mission/Report/Tradod /CountryActivityReport.blade.php b/resources/views/v3/Reports/Mission/Report/Tradod /CountryActivityReport.blade.php index 15edd38a..0fae970f 100644 --- a/resources/views/v3/Reports/Mission/Report/Tradod /CountryActivityReport.blade.php +++ b/resources/views/v3/Reports/Mission/Report/Tradod /CountryActivityReport.blade.php @@ -93,9 +93,9 @@ {{ $item['province_name'] ?? '-' }} {{ $item['total'] ?? '-' }} - {{ $item['khareg_mahdode'] ?? '-' }} {{ $item['gps'] ?? '-' }} {{ $item['durations'] ?? '-' }} + {{ $item['khareg_mahdode'] ?? '-' }} {{ $item['bafarayand_saeti'] ?? '-' }} {{ $item['bafarayand_rozaneh'] ?? '-' }} {{ $item['bedon_bafarayand_saeti'] ?? '-' }} diff --git a/resources/views/v3/Reports/Mission/Report/Tradod /ProvinceActivityReport.blade.php b/resources/views/v3/Reports/Mission/Report/Tradod /ProvinceActivityReport.blade.php index 8d46c155..04c29850 100644 --- a/resources/views/v3/Reports/Mission/Report/Tradod /ProvinceActivityReport.blade.php +++ b/resources/views/v3/Reports/Mission/Report/Tradod /ProvinceActivityReport.blade.php @@ -93,9 +93,9 @@ {{ $item['city_name'] ?? '-' }} {{ $item['total'] ?? '-' }} - {{ $item['khareg_mahdode'] ?? '-' }} {{ $item['gps'] ?? '-' }} {{ $item['durations'] ?? '-' }} + {{ $item['khareg_mahdode'] ?? '-' }} {{ $item['bafarayand_saeti'] ?? '-' }} {{ $item['bafarayand_rozaneh'] ?? '-' }} {{ $item['bedon_bafarayand_saeti'] ?? '-' }} diff --git a/routes/v3.php b/routes/v3.php index 0ed1219e..6c67a1d0 100644 --- a/routes/v3.php +++ b/routes/v3.php @@ -1,6 +1,7 @@ name('list'); Route::get('/search', 'search')->name('search'); Route::get('/car_types', 'carTypes')->name('carTypes'); + Route::post('/{machine}', 'update')->name('update')->middleware('permission:update-machine'); }); Route::prefix('rahdaran') @@ -491,12 +495,14 @@ Route::prefix('missions') ->controller(RequestPortalController::class) ->group(function () { Route::get('/', 'index')->name('index'); + Route::get('/violations', 'violations')->name('violations'); Route::post('/', 'store')->name('store'); - Route::post('/no_process','noProcess')->name('noProcess'); + Route::post('/clarify_unauthorized_exit/{violation}','clarifyUnauthorizedExit')->name('clarifyUnauthorizedExit'); Route::post('/continue/{mission}','continueMission')->name('continueMission'); Route::get('/{mission}', 'show')->name('show'); Route::post('/{mission}', 'update')->name('update'); Route::delete('/{mission}', 'destroy')->name('destroy'); + Route::post('/change_state/{mission}', 'changeState')->name('changeState')->middleware('permission:mission-change-state'); }); Route::name('transportationUnit.') ->prefix('transportation_unit') @@ -531,14 +537,13 @@ Route::prefix('missions') ->group(function () { Route::get('/', 'index')->name('index'); Route::post('/', 'store')->name('store'); - Route::post('/no_process/{violation}','noProcess')->name('noProcess'); Route::get('/{violation}', 'show')->name('show'); Route::post('/{violation}', 'update')->name('update'); Route::delete('/{violation}', 'destroy')->name('destroy'); }); Route::prefix('report_violation') ->name('reportsViolation.') - ->middleware(['permission:mission-report-province|permission:mission-report-country']) + ->middleware(['permission:mission-report-province|mission-report-country']) ->controller(ReportViolationController::class) ->group(function () { Route::get('/country_activity', 'countryActivity')->name('countryActivity'); @@ -548,7 +553,7 @@ Route::prefix('missions') }); Route::prefix('report_taradod') ->name('reportsTaradod.') - ->middleware(['permission:mission-report-province|permission:mission-report-country']) + ->middleware(['permission:mission-report-province|mission-report-country']) ->controller(ReportTradodController::class) ->group(function () { Route::get('/country_activity', 'countryActivity')->name('countryActivity'); @@ -556,6 +561,27 @@ Route::prefix('missions') Route::get('/country_excel_activity', 'countryExcelActivity')->name('countryExcelActivity'); Route::get('/province_excel_activity', 'provinceExcelActivity')->name('provinceExcelActivity'); }); + Route::prefix('report_machine') + ->name('reportsMachine.') + ->middleware(['permission:mission-report-province|mission-report-country']) + ->controller(ReportMachineController::class) + ->group(function () { + Route::get('/country_machines_activity', 'countryMachinesActivity')->name('countryMachinesActivity'); + Route::get('/country_machines_activity_excel', 'countryMachinesActivityExcel')->name('countryMachinesActivityExcel'); + Route::get('/province_machines_activity', 'provinceMachinesActivity')->name('provinceMachinesActivity'); + Route::get('/province_machines_activity_excel', 'provinceMachinesActivityExcel')->name('provinceMachinesActivityExcel'); + Route::get('/country_machine_types_activity', 'countryMachineTypesActivity')->name('countryMachineTypesActivity'); + Route::get('/country_machine_types_activity_excel', 'countryMachineTypesActivityExcel')->name('countryMachineTypesActivityExcel'); + Route::get('/province_machine_types_activity', 'provinceMachineTypesActivity')->name('provinceMachineTypesActivity'); + Route::get('/province_machine_types_activity_excel', 'provinceMachineTypesActivityExcel')->name('provinceMachineTypesActivityExcel'); + Route::get('/country_machine_drivers_activity', 'countryMachineDriversActivity')->name('countryMachineDriversActivity'); + Route::get('/country_machine_drivers_activity_excel', 'countryMachineDriversActivityExcel')->name('countryMachineDriversActivityExcel'); + Route::get('/province_machine_drivers_activity', 'provinceMachineDriversActivity')->name('provinceMachineDriversActivity'); + Route::get('/province_machine_drivers_activity_excel', 'provinceMachineDriversActivityExcel')->name('provinceMachineDriversActivityExcel'); + Route::get('/machine_details_report/{machine_id}', 'machineDetailsReport')->name('machineDetailsReport'); + Route::get('/machine_driver_details_report/{driver_id}', 'machineDriverDetailsReport')->name('machineDriverDetailsReport'); + Route::get('/machine_type_details_report', ' machineTypeDetailsReport')->name('machineTypeDetailsReport'); + }); }); Route::prefix('harim') @@ -667,4 +693,18 @@ Route::prefix('role') Route::get('/test', function () { $csvExporter = new \Laracsv\Export(); $csvExporter->build(\App\Models\User::all(), ['id' => 'کد یکتا', 'username' => 'نام کاربری'])->download(); -}); \ No newline at end of file +}); + +Route::prefix('provinces') + ->name('provinces.') + ->controller(ProvinceController::class) + ->group(function () { + Route::get('/list', 'list')->name('list'); + }); + +Route::prefix('cities') + ->name('cities.') + ->controller(CityController::class) + ->group(function () { + Route::get('/list', 'list')->name('list'); + }); \ No newline at end of file