diff --git a/app/Exports/V3/Mission/Report/Machine/machineDetailsReport.php b/app/Exports/V3/Mission/Report/Machine/machineDetailsReport.php new file mode 100644 index 00000000..d20226a3 --- /dev/null +++ b/app/Exports/V3/Mission/Report/Machine/machineDetailsReport.php @@ -0,0 +1,77 @@ +data as $r) { + $exportRows[] = [ + 'id' => $r->id, + 'province_name' => $r->province_name, + 'city_name' => $r->city_name, + 'station_name' => $r->station_name ?? 0, + 'driver_name' => $r->driver_name ?? '', + 'km' => $r->km ?? '', + 'end_km' => $r->end_km ?? '', + ]; + } + + return view('v3.Reports.Mission.Report.Machine.ActivityDetailsReport', [ + '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(+90); + $drawing2->setOffsetY(5); + $drawing2->setCoordinates('E1'); + + return [$drawing, $drawing2]; + } +} diff --git a/app/Exports/V3/Mission/Report/Machine/machineDriverDetailsReport.php b/app/Exports/V3/Mission/Report/Machine/machineDriverDetailsReport.php new file mode 100644 index 00000000..c983c023 --- /dev/null +++ b/app/Exports/V3/Mission/Report/Machine/machineDriverDetailsReport.php @@ -0,0 +1,78 @@ +data as $r) { + $exportRows[] = [ + 'id' => $r->id, + 'province_name' => $r->province_name, + 'city_name' => $r->city_name, + 'station_name' => $r->station_name ?? 0, + 'driver_name' => $r->driver_name ?? '', + 'km' => $r->km ?? '', + 'end_km' => $r->end_km ?? '', + + ]; + } + + return view('v3.Reports.Mission.Report.Machine.MachineDriverDetailsReport', [ + '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(+90); + $drawing2->setOffsetY(5); + $drawing2->setCoordinates('D1'); + + return [$drawing, $drawing2]; + } +} diff --git a/app/Exports/V3/Mission/Report/Machine/machineTypeDetailsReport.php b/app/Exports/V3/Mission/Report/Machine/machineTypeDetailsReport.php new file mode 100644 index 00000000..668d9491 --- /dev/null +++ b/app/Exports/V3/Mission/Report/Machine/machineTypeDetailsReport.php @@ -0,0 +1,77 @@ +data as $r) { + $exportRows[] = [ + 'id' => $r->id, + 'province_name' => $r->province_name, + 'city_name' => $r->city_name, + 'station_name' => $r->station_name ?? 0, + 'driver_name' => $r->driver_name ?? '', + 'km' => $r->km ?? '', + 'end_km' => $r->end_km ?? '', + ]; + } + + return view('v3.Reports.Mission.Report.Machine.MachineTypeDetailsReport', [ + '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(+90); + $drawing2->setOffsetY(5); + $drawing2->setCoordinates('C1'); + + return [$drawing, $drawing2]; + } +} diff --git a/app/Http/Controllers/V3/Dashboard/Mission/Report/ReportMachineController.php b/app/Http/Controllers/V3/Dashboard/Mission/Report/ReportMachineController.php index c6ecde5e..825a332d 100644 --- a/app/Http/Controllers/V3/Dashboard/Mission/Report/ReportMachineController.php +++ b/app/Http/Controllers/V3/Dashboard/Mission/Report/ReportMachineController.php @@ -2,20 +2,17 @@ namespace App\Http\Controllers\V3\Dashboard\Mission\Report; +use App\Exports\V3\Mission\Report\Machine\machineDetailsReport; +use App\Exports\V3\Mission\Report\Machine\machineDriverDetailsReport; use App\Exports\V3\Mission\Report\Machine\machineDriverReport; use App\Exports\V3\Mission\Report\Machine\machineReport; +use App\Exports\V3\Mission\Report\Machine\machineTypeDetailsReport; use App\Exports\V3\Mission\Report\Machine\machineTypeReport; -use App\Facades\DataTable\DataTableFacade; use App\Http\Controllers\Controller; use App\Http\Traits\ApiResponse; -use App\Models\City; -use App\Models\CMMSMachine; -use App\Models\Mission; -use App\Models\Province; use App\Services\Cartables\Mission\Report\ReportMachineService; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; -use Illuminate\Support\Facades\DB; use Maatwebsite\Excel\Facades\Excel; use PhpOffice\PhpSpreadsheet\Exception; use Symfony\Component\HttpFoundation\BinaryFileResponse; @@ -24,184 +21,114 @@ class ReportMachineController extends Controller { use ApiResponse; - public function countryMachinesActivity(Request $request, ReportMachineService $reportMachineService): JsonResponse + public function machineDetailsReport(Request $request, ReportMachineService $reportMachineService,int $machine_id): JsonResponse { - return $this->successResponse([ - 'activities' => $reportMachineService->countryMachinesActivity($request), -// 'provinces' => Province::all(['id', 'name_fa']), - ]); + $data = $reportMachineService->machineDetailActivity($request,$machine_id); + + return response()->json($data); } /** * @throws Exception * @throws \PhpOffice\PhpSpreadsheet\Writer\Exception */ - public function countryMachinesActivityExcel(Request $request, ReportMachineService $reportMachineService): BinaryFileResponse + public function machineDetailsReportExcel(Request $request, int $machine_id, ReportMachineService $reportMachineService): BinaryFileResponse { - $data = $reportMachineService->countryMachinesActivity($request); + $data = $reportMachineService->machineDetailActivity($request,$machine_id); + $name = 'گزارش عملکرد ماشین آلات'.verta()->now()->format('Y-m-d H-i').'.xlsx'; + + return Excel::download(new machineDetailsReport($data['data']), $name); + } + + public function machinesActivity(Request $request, ReportMachineService $reportMachineService): JsonResponse + { + return response()->json($reportMachineService->machinesActivity($request)); + } + + /** + * @throws Exception + * @throws \PhpOffice\PhpSpreadsheet\Writer\Exception + */ + + public function machinesActivityExcel(Request $request, ReportMachineService $reportMachineService): BinaryFileResponse + { + $data = $reportMachineService->machinesActivity($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 + + public function machineTypeDetailsReport(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']) - ]); + $data = $reportMachineService->machineTypeDetailActivity($request); + + return response()->json($data); } /** * @throws Exception * @throws \PhpOffice\PhpSpreadsheet\Writer\Exception */ - public function provinceMachinesActivityExcel(Request $request, ReportMachineService $reportMachineService): BinaryFileResponse + public function machineTypeDetailsReportExcel(Request $request, ReportMachineService $reportMachineService): BinaryFileResponse { - $data = $reportMachineService->provinceMachinesActivity($request); - $name = 'گزارش ماشین آلات'.verta()->now()->format('Y-m-d H-i').'.xlsx'; + $data = $reportMachineService->machineTypeDetailActivity($request); + $name = 'گزارش عملکردیک نوع ماشین'.verta()->now()->format('Y-m-d H-i').'.xlsx'; - return Excel::download(new machineReport($data), $name); + return Excel::download(new machineTypeDetailsReport($data['data']), $name); } - public function countryMachineTypesActivity(Request $request, ReportMachineService $reportMachineService): JsonResponse + public function machineTypesActivity(Request $request, ReportMachineService $reportMachineService): JsonResponse { - return $this->successResponse([ - 'activities' => $reportMachineService->countryMachineTypesActivity($request), -// 'provinces' => Province::all(['id', 'name_fa']), - ]); + return response()->json($reportMachineService->machineTypesActivity($request)); } /** * @throws Exception * @throws \PhpOffice\PhpSpreadsheet\Writer\Exception */ - public function countryMachineTypesActivityExcel(Request $request, ReportMachineService $reportMachineService): BinaryFileResponse + public function machineTypesActivityExcel(Request $request, ReportMachineService $reportMachineService): BinaryFileResponse { - $data = $reportMachineService->countryMachineTypesActivity($request); - $name = 'گزارش انوع ماشین'.verta()->now()->format('Y-m-d H-i').'.xlsx'; + $data = $reportMachineService->machineTypesActivity($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 + public function machineDriverDetailsReport(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']) - ]); - } + $data = $reportMachineService->machineDriverDetailActivity($request); - 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' - ] - ); + return response()->json($data); } /** * @throws Exception * @throws \PhpOffice\PhpSpreadsheet\Writer\Exception */ - public function provinceMachineTypesActivityExcel(Request $request, ReportMachineService $reportMachineService): BinaryFileResponse + public function machineDriverDetailsReportExcel(Request $request, ReportMachineService $reportMachineService): BinaryFileResponse { - $data = $reportMachineService->provinceMachineTypesActivity($request); - $name = 'گزارش انوع ماشین'.verta()->now()->format('Y-m-d H-i').'.xlsx'; + $data = $reportMachineService->machineDriverDetailActivity($request); + $name = 'گزارش عملکرد راننده'.verta()->now()->format('Y-m-d H-i').'.xlsx'; - return Excel::download(new machineTypeReport($data), $name); + return Excel::download( + new machineDriverDetailsReport($data['data']), $name); } - public function countryMachineDriversActivity(Request $request, ReportMachineService $reportMachineService) + public function machineDriversActivity(Request $request, ReportMachineService $reportMachineService): JsonResponse { - return $this->successResponse([ - 'activities' => $reportMachineService->countryMachineDriversActivity($request), -// 'provinces' => Province::all(['id', 'name_fa']), - ]); + return response()->json($reportMachineService->machineDriversActivity($request)); } /** * @throws Exception * @throws \PhpOffice\PhpSpreadsheet\Writer\Exception */ - public function countryMachineDriversActivityExcel(Request $request, ReportMachineService $reportMachineService): BinaryFileResponse + public function machineDriversActivityExcel(Request $request, ReportMachineService $reportMachineService): BinaryFileResponse { - $data = $reportMachineService->countryMachineDriversActivity($request); + $data = $reportMachineService->machineDriversActivity($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' - ] - ); - } -} +} \ No newline at end of file diff --git a/app/Http/Controllers/V3/NotificationController.php b/app/Http/Controllers/V3/NotificationController.php index cf00a3d9..dbbfec25 100644 --- a/app/Http/Controllers/V3/NotificationController.php +++ b/app/Http/Controllers/V3/NotificationController.php @@ -197,18 +197,67 @@ class NotificationController extends Controller 'control' => 0, ]; - if ($user->hasPermissionTo('manage-transportation-unit')) { + if ($user->hasPermissionTo('manage-transportation-unit-station')) { $missions['transportation'] = Mission::query()->where([ ['state_id', '=', MissionStates::REQUEST_CREATED->value], - ['edare_shahri_id', '=', $user->edarate_shahri_id], + ['station_id', '=', $user->station_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], + if ($user->hasPermissionTo('manage-transportation-unit-country')) { + $missions['transportation'] = Mission::query()->where([ + ['state_id', '=', MissionStates::REQUEST_CREATED->value], ])->count(); } + if ($user->hasPermissionTo('manage-transportation-unit-province')) { + $missions['transportation'] = Mission::query()->where([ + ['state_id', '=', MissionStates::REQUEST_CREATED->value], + ['province_id', '=', $user->province_id], + + ])->count(); + } + if ($user->hasPermissionTo('manage-transportation-unit-city')) { + $missions['transportation'] = Mission::query()->where([ + ['state_id', '=', MissionStates::REQUEST_CREATED->value], + ['city_id', '=', $user->city_id], + + ])->count(); + } + + + if ($user->hasPermissionTo('manage-control-unit-station')) { + $missions['control'] = Mission::query() + ->whereIn('state_id', [ + MissionStates::PENDING_CONFIRMATION->value, + MissionStates::START_MISSION->value, + ]) + ->where('station_id', $user->station_id) + ->count(); + } + if ($user->hasPermissionTo('manage-control-unit-country')) { + $missions['control'] = Mission::query() + ->whereIn('state_id', [ + MissionStates::PENDING_CONFIRMATION->value, + MissionStates::START_MISSION->value, + ])->count(); + } + if ($user->hasPermissionTo('manage-control-unit-province')) { + $missions['control'] = Mission::query() + ->whereIn('state_id', [ + MissionStates::PENDING_CONFIRMATION->value, + MissionStates::START_MISSION->value, + ]) + ->where('province_id', '=', $user->province_id) + ->count(); + } + if ($user->hasPermissionTo('manage-control-unit-city')) { + $missions['control'] = Mission::query() + ->whereIn('state_id', [ + MissionStates::PENDING_CONFIRMATION->value, + MissionStates::START_MISSION->value, + ]) + ->where('city_id', '=', $user->city_id + )->count(); + } $missions['total'] = $missions['request_portal'] + $missions['transportation'] + $missions['control']; diff --git a/app/Http/Requests/V3/Mission/ControlUnit/FinishRequest.php b/app/Http/Requests/V3/Mission/ControlUnit/FinishRequest.php index 87c55735..d8382435 100644 --- a/app/Http/Requests/V3/Mission/ControlUnit/FinishRequest.php +++ b/app/Http/Requests/V3/Mission/ControlUnit/FinishRequest.php @@ -3,6 +3,7 @@ namespace App\Http\Requests\V3\Mission\ControlUnit; use App\Enums\MissionStates; +use App\Models\CMMSMachine; use Illuminate\Contracts\Validation\ValidationRule; use Illuminate\Foundation\Http\FormRequest; use Illuminate\Validation\Validator; @@ -14,7 +15,7 @@ class FinishRequest extends FormRequest */ public function authorize(): bool { - return $this->mission->state_id == MissionStates::START_MISSION->value; + return $this->mission->state_id === MissionStates::START_MISSION->value; } /** @@ -34,6 +35,7 @@ class FinishRequest extends FormRequest { return [ function (Validator $validator) { + $mission = $this->mission; if (strtotime($this->time) < strtotime($mission->start_time)) { $validator->errors()->add( @@ -41,12 +43,25 @@ class FinishRequest extends FormRequest 'زمان پایان ماموریت باید بعد از زمان شروع ماموریت باشد.' ); } + if ($this->end_km <= $mission->km) { $validator->errors()->add( 'end_km', 'کیلومتر پایان باید بزرگتر از کیلومتر شروع باشد.' ); } + + $machine = CMMSMachine::find($mission->machine_id); + + $distance = $this->end_km - $mission->km; + + if ($distance > $machine->max_mission_duration) + { + $validator->errors()->add( + 'end_km', + 'کیلومتر /ساعت کار از حد نصاب بیشتر هست.' + ); + } } ]; } diff --git a/app/Http/Requests/V3/Mission/TransportaionUnit/AllocateRequest.php b/app/Http/Requests/V3/Mission/TransportaionUnit/AllocateRequest.php index af14fad9..3b89dca0 100644 --- a/app/Http/Requests/V3/Mission/TransportaionUnit/AllocateRequest.php +++ b/app/Http/Requests/V3/Mission/TransportaionUnit/AllocateRequest.php @@ -15,7 +15,7 @@ class AllocateRequest extends FormRequest */ public function authorize(): bool { - return $this->mission->station_id == auth()->user()->station_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/Services/Cartables/Mission/Report/ReportMachineService.php b/app/Services/Cartables/Mission/Report/ReportMachineService.php index 215c253c..21e6ea58 100644 --- a/app/Services/Cartables/Mission/Report/ReportMachineService.php +++ b/app/Services/Cartables/Mission/Report/ReportMachineService.php @@ -3,135 +3,130 @@ namespace App\Services\Cartables\Mission\Report; use App\Facades\DataTable\DataTableFacade; -use App\Models\MissionViolation; -use Carbon\Carbon; +use App\Models\CMMSMachine; +use App\Models\Mission; use Illuminate\Http\Request; -use Illuminate\Support\Facades\DB; class ReportMachineService { - public function countryMachinesActivity(Request $request): array + public function machineDetailActivity(Request $request, int $machine_id): array { - $from = $request->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 ORDER BY missions DESC;"; - - return DB::select($sql, [ - 'from' => $from, - 'to' => $to, - ]); + 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' + ] + ); } - public function provinceMachinesActivity(Request $request): array + public function machinesActivity(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; + $query = Mission::query() + ->join('cmms_machines as cm', 'cm.id', '=', 'missions.machine_id') + ->where('state_id', '=', 4) + ->when($request->province_id, function ($q) use ($request) { + $q->where('missions.province_id', '=', $request->province_id); + }) + ->selectRaw( + 'cm.car_name, + missions.machine_code, + missions.machine_id, + COUNT(*) as missions, + SUM(missions.end_km - missions.km) as func' + ) + ->groupBy('missions.machine_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 ORDER BY missions DESC;"; - - return DB::select($sql, [ - 'from' => $from, - 'to' => $to, - 'province_id' => $province, - ]); + $fields = ['machine_code','machine_id','cm.car_name','missions', 'func', 'start_time', 'finish_time', 'province_id']; + return DataTableFacade::run( + $query, + $request, + allowedFilters: $fields, + allowedSortings: $fields, + ); } - public function countryMachineTypesActivity(Request $request): array + public function machineTypeDetailActivity(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 ORDER BY missions DESC;"; - - return DB::select($sql, [ - 'from' => $from, - 'to' => $to, - ]); + $machineIds = CMMSMachine::query()->where('car_type', '=', $request->query('car_type'))->pluck('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 provinceMachineTypesActivity(Request $request): array + public function machineTypesActivity(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; + $query = Mission::query() + ->join('cmms_machines as cm', 'cm.id', '=', 'missions.machine_id') + ->where('missions.state_id','=', 4) + ->when($request->province_id, function ($q) use ($request) { + $q->where('missions.province_id', $request->province_id); + }) + ->selectRaw( + 'cm.car_type, + COUNT(*) as missions, + SUM(missions.end_km - missions.km) as func' + ) + ->groupBy('cm.car_type') + ->orderByRaw('COUNT(*) DESC'); - $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 ORDER BY missions DESC;"; + $fields = ['car_type','missions', 'func', 'start_time', 'finish_time', 'province_id']; - return DB::select($sql, [ - 'from' => $from, - 'to' => $to, - 'province_id' => $province, - ]); + return DataTableFacade::run( + $query, + $request, + allowedFilters: $fields, + allowedSortings: $fields, + ); } - public function countryMachineDriversActivity(Request $request): array + public function machineDriverDetailActivity(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 ORDER BY missions DESC;"; - - return DB::select($sql, [ - 'from' => $from, - 'to' => $to, - ]); + return DataTableFacade::run( + Mission::query()->where('driver_id', '=', $request->query('driver_id')), + $request, + allowedFilters: ['*'], + allowedSortings: ['*'], + allowedSelects: [ + 'id', 'province_id', 'province_name', 'city_id', 'city_name', + 'end_km', 'km', 'driver_name', 'state_id', 'station_name' + ] + ); } - public function provinceMachineDriversActivity(Request $request): array + public function machineDriversActivity(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; + $query = Mission::query() + ->selectRaw( + 'driver_id, + driver_name, + COUNT(*) as missions, + SUM(end_km - km) as func' + ) + ->where('state_id', '=', 4) + ->when($request->province_id, function ($query) use ($request) { + $query->where('province_id', '=', $request->province_id); + }) + ->groupBy('driver_id') + ->orderByRaw('COUNT(*) DESC'); - $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 ORDER BY missions DESC;"; + $fields = ['driver_id','driver_name','missions', 'func', 'start_time', 'finish_time', 'province_id']; - return DB::select($sql, [ - 'from' => $from, - 'to' => $to, - 'province_id' => $province, - ]); + return DataTableFacade::run( + $query, + $request, + allowedFilters: $fields, + allowedSortings: $fields, + ); } } diff --git a/database/migrations/2026_06_28_094747_add_distance_mission_to_cmms_machines_table.php b/database/migrations/2026_06_28_094747_add_distance_mission_to_cmms_machines_table.php new file mode 100644 index 00000000..e603e4cc --- /dev/null +++ b/database/migrations/2026_06_28_094747_add_distance_mission_to_cmms_machines_table.php @@ -0,0 +1,28 @@ +integer('max_mission_duration')->nullable(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('cmms_machines', function (Blueprint $table) { + $table->dropColumn('max_mission_duration'); + }); + } +}; diff --git a/resources/views/v3/Reports/Mission/Report/Machine/ActivityDetailsReport.blade.php b/resources/views/v3/Reports/Mission/Report/Machine/ActivityDetailsReport.blade.php new file mode 100644 index 00000000..1f187fb4 --- /dev/null +++ b/resources/views/v3/Reports/Mission/Report/Machine/ActivityDetailsReport.blade.php @@ -0,0 +1,94 @@ + + + + + + + + گزارش کل تردد های یک ماشین + + + + + +@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['id'] ?? '-' }}{{ $item['province_name'] ?? '-' }}{{ $item['city_name'] ?? '-' }}{{ $item['station_name'] ?? '-' }}{{ $item['driver_name'] ?? '-' }}{{ $item['km'] ?? '-' }}{{ $item['end_km'] ?? '-' }}
+ + diff --git a/resources/views/v3/Reports/Mission/Report/Machine/MachineDriverDetailsReport.blade.php b/resources/views/v3/Reports/Mission/Report/Machine/MachineDriverDetailsReport.blade.php new file mode 100644 index 00000000..49d0b218 --- /dev/null +++ b/resources/views/v3/Reports/Mission/Report/Machine/MachineDriverDetailsReport.blade.php @@ -0,0 +1,94 @@ + + + + + + + + گزارش کل تردد های راننده + + + + + +@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['id'] ?? '-' }}{{ $item['province_name'] ?? '-' }}{{ $item['city_name'] ?? '-' }}{{ $item['station_name'] ?? '-' }}{{ $item['driver_name'] ?? '-' }}{{ $item['km'] ?? '-' }}{{ $item['end_km'] ?? '-' }}
+ + diff --git a/resources/views/v3/Reports/Mission/Report/Machine/MachineTypeDetailsReport.blade.php b/resources/views/v3/Reports/Mission/Report/Machine/MachineTypeDetailsReport.blade.php new file mode 100644 index 00000000..9a1b549b --- /dev/null +++ b/resources/views/v3/Reports/Mission/Report/Machine/MachineTypeDetailsReport.blade.php @@ -0,0 +1,94 @@ + + + + + + + + گزارش ترددهای انواع ماشین ها + + + + + +@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['id'] ?? '-' }}{{ $item['province_name'] ?? '-' }}{{ $item['city_name'] ?? '-' }}{{ $item['station_name'] ?? '-' }}{{ $item['driver_name'] ?? '-' }}{{ $item['km'] ?? '-' }}{{ $item['end_km'] ?? '-' }}
+ + diff --git a/routes/v3.php b/routes/v3.php index 6c67a1d0..4dc6363a 100644 --- a/routes/v3.php +++ b/routes/v3.php @@ -566,21 +566,19 @@ Route::prefix('missions') ->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('/machines_activity', 'machinesActivity')->name('machinesActivity'); + Route::get('/machines_activity_excel', 'machinesActivityExcel')->name('machinesActivityExcel'); + + Route::get('/machine_types_activity', 'machineTypesActivity')->name('machineTypesActivity'); + Route::get('/machine_types_activity_excel', 'machineTypesActivityExcel')->name('machineTypesActivityExcel'); + Route::get('/machine_drivers_activity', 'machineDriversActivity')->name('machineDriversActivity'); + Route::get('/machine_drivers_activity_excel', 'machineDriversActivityExcel')->name('machineDriversActivityExcel'); 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::get('/machine_details_report_excel/{machine_id}', 'machineDetailsReportExcel')->name('machineDetailsReportExcel'); + Route::get('/machine_type_details_report', 'machineTypeDetailsReport')->name('machineTypeDetailsReport'); + Route::get('/machine_type_details_report_excel', 'machineTypeDetailsReportExcel')->name('machineTypeDetailsReportExcel'); + Route::get('/machine_driver_details_report', 'machineDriverDetailsReport')->name('machineDriverDetailsReport'); + Route::get('/machine_driver_details_report_excel', 'machineDriverDetailsReportExcel')->name('machineDriverDetailsReportExcel'); }); });