diff --git a/app/Http/Controllers/V3/Dashboard/Mission/Report/ReportMachineController.php b/app/Http/Controllers/V3/Dashboard/Mission/Report/ReportMachineController.php index f39b46bf..55600232 100644 --- a/app/Http/Controllers/V3/Dashboard/Mission/Report/ReportMachineController.php +++ b/app/Http/Controllers/V3/Dashboard/Mission/Report/ReportMachineController.php @@ -8,14 +8,11 @@ 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,87 +21,7 @@ class ReportMachineController extends Controller { use ApiResponse; - public function countryMachinesActivity(Request $request, ReportMachineService $reportMachineService): JsonResponse - { - return $this->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) + public function machineDetailsReport(Request $request, int $machine_id): array { return DataTableFacade::run( Mission::query()->where('machine_id', '=', $machine_id), @@ -117,23 +34,10 @@ class ReportMachineController extends Controller ] ); } - - /** - * @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) + public function machinesActivity(Request $request, ReportMachineService $reportMachineService): JsonResponse { return $this->successResponse([ - 'activities' => $reportMachineService->countryMachineDriversActivity($request), + 'activities' => $reportMachineService->machinesActivity($request), // 'provinces' => Province::all(['id', 'name_fa']), ]); } @@ -142,25 +46,36 @@ class ReportMachineController extends Controller * @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 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 provinceMachineDriversActivity(Request $request, ReportMachineService $reportMachineService) + + public function machineTypeDetailsReport(Request $request): array + { + $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 machineTypesActivity(Request $request, ReportMachineService $reportMachineService): JsonResponse { 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']) + 'activities' => $reportMachineService->machineTypesActivity($request), +// 'provinces' => Province::all(['id', 'name_fa']), ]); } @@ -168,30 +83,15 @@ class ReportMachineController extends Controller * @throws Exception * @throws \PhpOffice\PhpSpreadsheet\Writer\Exception */ - public function provinceMachineDriversActivityExcel(Request $request, ReportMachineService $reportMachineService): BinaryFileResponse + public function machineTypesActivityExcel(Request $request, ReportMachineService $reportMachineService): BinaryFileResponse { - $data = $reportMachineService->provinceMachineDriversActivity($request); + $data = $reportMachineService->machineTypesActivity($request); $name = 'گزارش نوع ماشین آلات'.verta()->now()->format('Y-m-d H-i').'.xlsx'; - return Excel::download(new machineDriverReport($data), $name); + return Excel::download(new machineTypeReport($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) + public function machineDriverDetailsReport(Request $request, int $driver_id): array { return DataTableFacade::run( Mission::query()->where('driver_id', '=', $driver_id), @@ -204,4 +104,23 @@ class ReportMachineController extends Controller ] ); } + public function machineDriversActivity(Request $request, ReportMachineService $reportMachineService): JsonResponse + { + return $this->successResponse([ + 'activities' => $reportMachineService->machineDriversActivity($request), +// 'provinces' => Province::all(['id', 'name_fa']), + ]); + } + + /** + * @throws Exception + * @throws \PhpOffice\PhpSpreadsheet\Writer\Exception + */ + public function machineDriversActivityExcel(Request $request, ReportMachineService $reportMachineService): BinaryFileResponse + { + $data = $reportMachineService->machineDriversActivity($request); + $name = 'گزارش نوع ماشین آلات'.verta()->now()->format('Y-m-d H-i').'.xlsx'; + + return Excel::download(new machineDriverReport($data), $name); + } } diff --git a/app/Http/Requests/V3/Mission/ControlUnit/FinishRequest.php b/app/Http/Requests/V3/Mission/ControlUnit/FinishRequest.php index b62c5124..c992a817 100644 --- a/app/Http/Requests/V3/Mission/ControlUnit/FinishRequest.php +++ b/app/Http/Requests/V3/Mission/ControlUnit/FinishRequest.php @@ -41,12 +41,18 @@ class FinishRequest extends FormRequest 'زمان پایان ماموریت باید بعد از زمان شروع ماموریت باشد.' ); } - if ($this->end_km < $mission->km) { + if ($this->end_km <= $mission->km) { $validator->errors()->add( 'end_km', 'کیلومتر پایان باید بزرگتر از کیلومتر شروع باشد.' ); } + if (($this->end_km - $mission->km ) < 100) { + $validator->errors()->add( + 'end_km', + 'اختلاف کلیلومتر شروع و پایان نباید بیشتر از 100 کیلومتر باشد' + ); + } } ]; } diff --git a/app/Http/Requests/V3/Mission/RequestPortal/ContinueMissionRequest.php b/app/Http/Requests/V3/Mission/RequestPortal/ContinueMissionRequest.php index 46fc0cea..a606f30c 100644 --- a/app/Http/Requests/V3/Mission/RequestPortal/ContinueMissionRequest.php +++ b/app/Http/Requests/V3/Mission/RequestPortal/ContinueMissionRequest.php @@ -57,7 +57,7 @@ class ContinueMissionRequest extends FormRequest ); } } - if ($this->end_km < $this->mission->km) { + if ($this->end_km <= $this->mission->km) { $validator->errors()->add( 'end_km', 'کیلومتر پایان باید بزرگتر از کیلومتر شروع باشد.' @@ -69,6 +69,12 @@ class ContinueMissionRequest extends FormRequest 'زمان پایان ماموریت باید بعد از زمان شروع ماموریت باشد.' ); } + if (($this->end_km - $this->mission->km ) < 100) { + $validator->errors()->add( + 'end_km', + 'اختلاف کلیلومتر شروع و پایان نباید بیشتر از 100 کیلومتر باشد' + ); + } }, ]; } diff --git a/app/Http/Requests/V3/Mission/Violation/UpdateRequest.php b/app/Http/Requests/V3/Mission/Violation/UpdateRequest.php index 561e2188..b2a66821 100644 --- a/app/Http/Requests/V3/Mission/Violation/UpdateRequest.php +++ b/app/Http/Requests/V3/Mission/Violation/UpdateRequest.php @@ -41,12 +41,18 @@ class UpdateRequest extends FormRequest 'زمان پایان ماموریت باید بعد از زمان شروع ماموریت باشد.' ); } - if ($this->end_km < $this->violation->km) { + if ($this->end_km <= $this->violation->km) { $validator->errors()->add( 'end_km', 'کیلومتر پایان باید بزرگتر از کیلومتر شروع باشد.' ); } + if (($this->end_km - $this->violation->km ) < 100) { + $validator->errors()->add( + 'end_km', + 'اختلاف کلیلومتر شروع و پایان نباید بیشتر از 100 کیلومتر باشد' + ); + } } ]; } diff --git a/app/Services/Cartables/Mission/Report/ReportMachineService.php b/app/Services/Cartables/Mission/Report/ReportMachineService.php index 38bb4996..e1b83712 100644 --- a/app/Services/Cartables/Mission/Report/ReportMachineService.php +++ b/app/Services/Cartables/Mission/Report/ReportMachineService.php @@ -3,135 +3,88 @@ namespace App\Services\Cartables\Mission\Report; use App\Facades\DataTable\DataTableFacade; -use App\Models\MissionViolation; -use Carbon\Carbon; +use App\Models\Mission; use Illuminate\Http\Request; -use Illuminate\Support\Facades\DB; class ReportMachineService { - public function countryMachinesActivity(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(); + $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') + ->orderByRaw('COUNT(*) DESC'); - $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;"; + $fields = ['machine_code','machine_id','cm.car_name','missions', 'func']; - return DB::select($sql, [ - 'from' => $from, - 'to' => $to, - ]); + return DataTableFacade::run( + $query, + $request, + allowedFilters: $fields, + allowedSortings: $fields, + ); } - public function provinceMachinesActivity(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 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;"; + $fields = ['car_type','missions', 'func']; - return DB::select($sql, [ - 'from' => $from, - 'to' => $to, - 'province_id' => $province, - ]); + return DataTableFacade::run( + $query, + $request, + allowedFilters: $fields, + allowedSortings: $fields, + ); } - public function countryMachineTypesActivity(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(); + $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') + ->orderBy('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 - GROUP BY cm.car_type;"; + $fields = ['driver_id','driver_name','missions', 'func']; - 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, - ]); + return DataTableFacade::run( + $query, + $request, + allowedFilters: $fields, + allowedSortings: $fields, + ); } } diff --git a/routes/v3.php b/routes/v3.php index 6c67a1d0..3bca0def 100644 --- a/routes/v3.php +++ b/routes/v3.php @@ -566,18 +566,12 @@ 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');