From e6930f2dfec70a46290eb461fab75dbd5e66dbed Mon Sep 17 00:00:00 2001 From: amirghasempoor Date: Sat, 22 Feb 2025 15:31:12 +0330 Subject: [PATCH] create receipt report logic --- app/Exports/V3/AccidentReceipt/CityReport.php | 79 +++++++++++++ .../V3/AccidentReceipt/DataTableReport.php | 75 +++++++++++++ .../V3/AccidentReceipt/ProvinceReport.php | 78 +++++++++++++ .../Dashboard/AccidentReceiptController.php | 67 +++++------ .../AccidentReceiptReportController.php | 44 ++++++++ .../Reports/RoadItemsReportController.php | 34 +++--- .../Reports/RoadPatrolReportController.php | 18 +-- .../Dashboard/RoadItemsProjectController.php | 18 +-- .../Dashboard/RoadPatrolProjectController.php | 18 +-- .../V3/AccidentReceipt/StoreRequest.php | 47 ++++++++ .../V3/AccidentReceipt/UpdateRequest.php | 45 ++++++++ .../Cartables/AccidentReceiptTableService.php | 106 ++++++++++++++++++ .../RoadItemTableService.php} | 4 +- .../RoadPatrolTableService.php} | 4 +- routes/v3.php | 14 ++- 15 files changed, 565 insertions(+), 86 deletions(-) create mode 100644 app/Exports/V3/AccidentReceipt/CityReport.php create mode 100644 app/Exports/V3/AccidentReceipt/DataTableReport.php create mode 100644 app/Exports/V3/AccidentReceipt/ProvinceReport.php create mode 100644 app/Http/Controllers/V3/Dashboard/Reports/AccidentReceiptReportController.php create mode 100644 app/Http/Requests/V3/AccidentReceipt/StoreRequest.php create mode 100644 app/Http/Requests/V3/AccidentReceipt/UpdateRequest.php create mode 100644 app/Services/Cartables/AccidentReceiptTableService.php rename app/Services/{Reports/RoadItemReportService.php => Cartables/RoadItemTableService.php} (99%) rename app/Services/{Reports/RoadPatrolReportService.php => Cartables/RoadPatrolTableService.php} (99%) diff --git a/app/Exports/V3/AccidentReceipt/CityReport.php b/app/Exports/V3/AccidentReceipt/CityReport.php new file mode 100644 index 00000000..db40c177 --- /dev/null +++ b/app/Exports/V3/AccidentReceipt/CityReport.php @@ -0,0 +1,79 @@ +data; + + return view('v3.AccidentReceipt.CityReport', [ + 'data' => $data['data'], + 'fromDate' => $data['fromDate'], + 'ToDate' => $data['ToDate'], + ]); + } + + /** + * @return array + */ + public function registerEvents(): array + { + return [ + AfterSheet::class => function (AfterSheet $event) { + $event->sheet->getDelegate()->setRightToLeft(true); + }, + ]; + } + + public function drawings() + { + $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('B1'); + return [$drawing, $drawing2]; + } + + public function styles(Worksheet $sheet) + { + return [ + // Style the first row as bold text. + 'A:BA' => [ + 'font' => [ + 'name' => 'B Nazanin' + ] + ], + ]; + } +} diff --git a/app/Exports/V3/AccidentReceipt/DataTableReport.php b/app/Exports/V3/AccidentReceipt/DataTableReport.php new file mode 100644 index 00000000..ba9bed37 --- /dev/null +++ b/app/Exports/V3/AccidentReceipt/DataTableReport.php @@ -0,0 +1,75 @@ + $this->data, + ]); + } + + /** + * @return array + */ + public function registerEvents(): array + { + return [ + AfterSheet::class => function (AfterSheet $event) { + $event->sheet->getDelegate()->setRightToLeft(true); + }, + ]; + } + + public function drawings() + { + $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('B1'); + return [$drawing, $drawing2]; + } + + public function styles(Worksheet $sheet) + { + return [ + // Style the first row as bold text. + 'A:BA' => [ + 'font' => [ + 'name' => 'B Nazanin' + ] + ], + ]; + } +} diff --git a/app/Exports/V3/AccidentReceipt/ProvinceReport.php b/app/Exports/V3/AccidentReceipt/ProvinceReport.php new file mode 100644 index 00000000..9eee4900 --- /dev/null +++ b/app/Exports/V3/AccidentReceipt/ProvinceReport.php @@ -0,0 +1,78 @@ +data; + return view('v3.AccidentReceipt.ProvinceReport', [ + 'data' => $data['data'], + 'fromDate' => $data['fromDate'], + 'ToDate' => $data['ToDate'], + ]); + } + + /** + * @return array + */ + public function registerEvents(): array + { + return [ + AfterSheet::class => function (AfterSheet $event) { + $event->sheet->getDelegate()->setRightToLeft(true); + }, + ]; + } + + public function drawings() + { + $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('B1'); + return [$drawing, $drawing2]; + } + + public function styles(Worksheet $sheet) + { + return [ + // Style the first row as bold text. + 'A:BA' => [ + 'font' => [ + 'name' => 'B Nazanin' + ] + ], + ]; + } +} diff --git a/app/Http/Controllers/V3/Dashboard/AccidentReceiptController.php b/app/Http/Controllers/V3/Dashboard/AccidentReceiptController.php index 518d2816..6bbe9280 100644 --- a/app/Http/Controllers/V3/Dashboard/AccidentReceiptController.php +++ b/app/Http/Controllers/V3/Dashboard/AccidentReceiptController.php @@ -3,66 +3,57 @@ namespace App\Http\Controllers\V3\Dashboard; use App\Enums\AccidentStates; +use App\Exports\V3\AccidentReceipt\DataTableReport; use App\Facades\DataTable\DataTableFacade; use App\Facades\File\FileFacade; use App\Facades\Sms\Sms; use App\Http\Controllers\Controller; use App\Http\Requests\V3\AccidentReceipt\ConfirmPaymentInfoRequest; +use App\Http\Requests\V3\AccidentReceipt\StoreRequest; +use App\Http\Requests\V3\AccidentReceipt\UpdateRequest; use App\Http\Traits\ApiResponse; use App\Models\Accident; use App\Models\City; use App\Models\DailyAccidentSettings; use App\Models\Damage; use App\Models\Province; +use App\Services\Cartables\AccidentReceiptTableService; use App\Services\NominatimService; use App\Services\PaymentService; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\DB; +use Maatwebsite\Excel\Facades\Excel; +use Symfony\Component\HttpFoundation\BinaryFileResponse; class AccidentReceiptController extends Controller { use ApiResponse; - public function index(Request $request): JsonResponse + public function index(Request $request, AccidentReceiptTableService $accidentReceiptTableService): JsonResponse { - $allowedFilters = ['*']; - $allowedSortings = ['*']; + $data = $accidentReceiptTableService->dataTable($request); - $user = auth()->user(); - $query = null; - - if ($user->hasPermissionTo('show-receipt')) { - $query = Accident::query(); - } - else { - if (is_null($user->province_id)) { - return $this->errorResponse('استانی برای شما در سامانه ثبت نشده است!'); - } - - $query = Accident::query()->where('province_id', '=', $user->province_id); - } - - $data = DataTableFacade::run( - $query, - $request, - allowedFilters: $allowedFilters, - allowedSortings: $allowedSortings - ); - - - $user->addActivityComplete(1122); + auth()->user()->addActivityComplete(1122); return response()->json($data); } + public function excelReport(Request $request, AccidentReceiptTableService $accidentReceiptTableService): BinaryFileResponse + { + auth()->user()->addActivityComplete(1126); + $name = 'گزارش از خسارات وارده به ابنیه فنی و تاسیسات راه ' . verta()->now()->format('Y-m-d H-i') . '.xlsx'; + $data = $accidentReceiptTableService->dataTable($request); + return Excel::download(new DataTableReport($data), $name); + } + public function accidentDamage(Accident $accident): JsonResponse { return $this->successResponse($accident->damages()->get(['unit', 'amount', 'value'])); } - public function store(Request $request, NominatimService $nominatimService): JsonResponse + public function store(StoreRequest $request, NominatimService $nominatimService): JsonResponse { DB::transaction(function () use ($request, $nominatimService) { @@ -150,7 +141,7 @@ class AccidentReceiptController extends Controller return $this->successResponse($accident->load('damages')); } - public function update(Accident $accident, Request $request, NominatimService $nominatimService): JsonResponse + public function update(Accident $accident, UpdateRequest $request, NominatimService $nominatimService): JsonResponse { DB::transaction(function () use ($request, $accident, $nominatimService) { @@ -213,7 +204,6 @@ class AccidentReceiptController extends Controller $sum += $item->amount; } - $ojrate_nasb = $sum/100*20; $sum += $ojrate_nasb; @@ -267,10 +257,10 @@ class AccidentReceiptController extends Controller DB::transaction(function () use ($request, $accident) { if ($request->has('deposit_insurance_status')) { if ($request->has('deposit_insurance_image')) { - $accident->deposit_insurance_image = $request->file('deposit_insurance_image')->storeAs('receipts_files/'.$accident->id, 'deposit_insurance_image_'.$accident->id.'_'.time().'.'.$request->file('deposit_insurance_image')->extension(), 'public'); + $deposit_insurance_image = $request->file('deposit_insurance_image')->storeAs('receipts_files/'.$accident->id, 'deposit_insurance_image_'.$accident->id.'_'.time().'.'.$request->file('deposit_insurance_image')->extension(), 'public'); } - $accident->deposit_insurance_amount = $request->deposit_insurance_amount; + $deposit_insurance_amount = $request->deposit_insurance_amount; } else { $accident->deposit_insurance_image = null; $accident->deposit_insurance_amount = null; @@ -278,16 +268,20 @@ class AccidentReceiptController extends Controller if ($request->has('deposit_daghi_status')) { if ($request->has('deposit_daghi_image')) { - $accident->deposit_daghi_image = $request->file('deposit_daghi_image')->storeAs('receipts_files/'.$accident->id, 'deposit_daghi_image_'.$accident->id.'_'.time().'.'.$request->file('deposit_daghi_image')->extension(), 'public'); + $deposit_daghi_image = $request->file('deposit_daghi_image')->storeAs('receipts_files/'.$accident->id, 'deposit_daghi_image_'.$accident->id.'_'.time().'.'.$request->file('deposit_daghi_image')->extension(), 'public'); } - $accident->deposit_daghi_amount = $request->deposit_daghi_amount; + $deposit_daghi_amount = $request->deposit_daghi_amount; } else { $accident->deposit_daghi_image = null; $accident->deposit_daghi_amount = null; } $accident->update([ + 'deposit_insurance_image' => $deposit_insurance_image, + 'deposit_insurance_amount' => $deposit_insurance_amount, + 'deposit_daghi_image' => $deposit_daghi_image, + 'deposit_daghi_amount' => $deposit_daghi_amount, 'status' => AccidentStates::SABT_FISH->value, 'status_fa' => AccidentStates::name(AccidentStates::SABT_FISH->value), ]); @@ -308,11 +302,11 @@ class AccidentReceiptController extends Controller return $this->errorResponse('error'); } - $accident->final_amount = $final_amount; - - $accident->bill_code = $paymentService->invoiceBillApi($accident->driver_national_code, $final_amount); + $bill_code = $paymentService->invoiceBillApi($accident->driver_national_code, $final_amount); $accident->update([ + 'final_amount' => $final_amount, + 'bill_code' => $bill_code, 'status' => AccidentStates::SODOR_FACTOR->value, 'status_fa' => AccidentStates::name(AccidentStates::SODOR_FACTOR->value), ]); @@ -367,7 +361,6 @@ class AccidentReceiptController extends Controller auth()->user()->addActivityComplete(1131); }); - return $this->successResponse(); } } diff --git a/app/Http/Controllers/V3/Dashboard/Reports/AccidentReceiptReportController.php b/app/Http/Controllers/V3/Dashboard/Reports/AccidentReceiptReportController.php new file mode 100644 index 00000000..3f07d6f9 --- /dev/null +++ b/app/Http/Controllers/V3/Dashboard/Reports/AccidentReceiptReportController.php @@ -0,0 +1,44 @@ +provinceReport($request); + return $this->successResponse($data['data']); + } + + public function cityReport(Request $request, AccidentReceiptTableService $accidentReceiptTableService): JsonResponse + { + $data = $accidentReceiptTableService->cityReport($request); + return $this->successResponse($data['data']); + } + + public function provinceExcelReport(Request $request, AccidentReceiptTableService $accidentReceiptTableService): BinaryFileResponse + { + $data = $accidentReceiptTableService->provinceReport($request); + $name = 'گزارش از خسارات وارده به ابنیه فنی و تاسیسات راه ' . verta()->now()->format('Y-m-d H-i') . '.xlsx'; + return Excel::download(new ProvinceReport($data), $name); + } + + public function cityExcelReport(Request $request, AccidentReceiptTableService $accidentReceiptTableService): BinaryFileResponse + { + $data = $accidentReceiptTableService->cityReport($request); + $name = 'گزارش از خسارات وارده به ابنیه فنی و تاسیسات راه ' . verta()->now()->format('Y-m-d H-i') . '.xlsx'; + return Excel::download(new CityReport($data), $name); + } +} diff --git a/app/Http/Controllers/V3/Dashboard/Reports/RoadItemsReportController.php b/app/Http/Controllers/V3/Dashboard/Reports/RoadItemsReportController.php index 70d15be0..46b47699 100644 --- a/app/Http/Controllers/V3/Dashboard/Reports/RoadItemsReportController.php +++ b/app/Http/Controllers/V3/Dashboard/Reports/RoadItemsReportController.php @@ -12,7 +12,7 @@ use App\Models\EdarateShahri; use App\Models\InfoItem; use App\Models\Province; use App\Models\RoadItemsProject; -use App\Services\Reports\RoadItemReportService; +use App\Services\Cartables\RoadItemTableService; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; use Maatwebsite\Excel\Facades\Excel; @@ -32,9 +32,9 @@ class RoadItemsReportController extends Controller ]); } - public function countryActivityPerSubItem(Request $request, RoadItemReportService $roadItemReportService): JsonResponse + public function countryActivityPerSubItem(Request $request, RoadItemTableService $roadItemTableService): JsonResponse { - $activities = $roadItemReportService->countryActivityPerSubItem($request); + $activities = $roadItemTableService->countryActivityPerSubItem($request); $provinces = Province::all(['id', 'name_fa']); $subItems = InfoItem::query() ->where('item', $request->item) @@ -47,9 +47,9 @@ class RoadItemsReportController extends Controller ]); } - public function provinceActivityPerSubItem(Request $request, RoadItemReportService $roadItemReportService): JsonResponse + public function provinceActivityPerSubItem(Request $request, RoadItemTableService $roadItemTableService): JsonResponse { - $activities = $roadItemReportService->provinceActivityPerSubItem($request); + $activities = $roadItemTableService->provinceActivityPerSubItem($request); $edarateShahri = EdarateShahri::query()->where('province_id', '=', $request->province_id)->get(['id', 'name_fa']); @@ -64,13 +64,13 @@ class RoadItemsReportController extends Controller ]); } - public function countryActivityPerItem(Request $request, RoadItemReportService $roadItemReportService): JsonResponse + public function countryActivityPerItem(Request $request, RoadItemTableService $roadItemTableService): JsonResponse { if (auth()->check()) { auth()->user()->addActivityComplete(1033); } - $activities = $roadItemReportService->countryActivityPerItem($request); + $activities = $roadItemTableService->countryActivityPerItem($request); $provinces = Province::all(['id', 'name_fa']); return $this->successResponse([ @@ -79,9 +79,9 @@ class RoadItemsReportController extends Controller ]); } - public function provinceActivityPerItem(Request $request, RoadItemReportService $roadItemReportService): JsonResponse + public function provinceActivityPerItem(Request $request, RoadItemTableService $roadItemTableService): JsonResponse { - $activities = $roadItemReportService->provinceActivityPerItem($request); + $activities = $roadItemTableService->provinceActivityPerItem($request); $edarateShahri = EdarateShahri::query()->where('province_id', '=', $request->province_id)->get(['id', 'name_fa']); return $this->successResponse([ @@ -90,11 +90,11 @@ class RoadItemsReportController extends Controller ]); } - public function countryActivityExcelPerItem(Request $request, RoadItemReportService $roadItemReportService): BinaryFileResponse + public function countryActivityExcelPerItem(Request $request, RoadItemTableService $roadItemTableService): BinaryFileResponse { auth()->user()->addActivityComplete(1034); $name = 'گزارش کشوری از فعالیت روزانه و جاری - جدول 1 ' . verta()->now()->format('Y-m-d H-i') . '.xlsx'; - $activities = $roadItemReportService->countryActivityPerItem($request); + $activities = $roadItemTableService->countryActivityPerItem($request); return Excel::download(new CountryActivityPerItemReport([ 'activities' => $activities, 'provinces' => Province::all(['id', 'name_fa']), @@ -102,11 +102,11 @@ class RoadItemsReportController extends Controller ]), $name); } - public function provinceActivityExcelPerItem(Request $request, RoadItemReportService $roadItemReportService): BinaryFileResponse + public function provinceActivityExcelPerItem(Request $request, RoadItemTableService $roadItemTableService): BinaryFileResponse { auth()->user()->addActivityComplete(1034); $name = 'گزارش استانی از فعالیت روزانه و جاری - جدول 1 ' . verta()->now()->format('Y-m-d H-i') . '.xlsx'; - $activities = $roadItemReportService->provinceActivityPerItem($request); + $activities = $roadItemTableService->provinceActivityPerItem($request); return Excel::download(new ProvinceActivityPerItemReport([ 'activities' => $activities, 'edarateShahri' => EdarateShahri::query()->where('province_id', '=', $request->province_id)->get(['id', 'name_fa']), @@ -114,11 +114,11 @@ class RoadItemsReportController extends Controller ]), $name); } - public function countryActivityExcelPerSubItem(Request $request, RoadItemReportService $roadItemReportService): BinaryFileResponse + public function countryActivityExcelPerSubItem(Request $request, RoadItemTableService $roadItemTableService): BinaryFileResponse { auth()->user()->addActivityComplete(1034); $name = "گزارش کشوری از فعالیت روزانه و جاری - جدول 2 " . verta()->now()->format('Y-m-d H-i') . '.xlsx'; - $activities = $roadItemReportService->countryActivityPerSubItem($request); + $activities = $roadItemTableService->countryActivityPerSubItem($request); $subItems = InfoItem::query() ->where('item', $request->item) ->get(['id', 'item', 'item_str', 'sub_item_str', 'sub_item_unit', 'sub_item']); @@ -130,10 +130,10 @@ class RoadItemsReportController extends Controller ]), $name); } - public function provinceActivityExcelPerSubItem(Request $request, RoadItemReportService $roadItemReportService): BinaryFileResponse + public function provinceActivityExcelPerSubItem(Request $request, RoadItemTableService $roadItemTableService): BinaryFileResponse { auth()->user()->addActivityComplete(1034); - $activities = $roadItemReportService->provinceActivityPerSubItem($request); + $activities = $roadItemTableService->provinceActivityPerSubItem($request); $name = "گزارش استانی از فعالیت روزانه و جاری - جدول 2 " . verta()->now()->format('Y-m-d H-i') . '.xlsx'; $subItems = InfoItem::query() ->where('item', $request->item) diff --git a/app/Http/Controllers/V3/Dashboard/Reports/RoadPatrolReportController.php b/app/Http/Controllers/V3/Dashboard/Reports/RoadPatrolReportController.php index 9f485e05..d4382427 100644 --- a/app/Http/Controllers/V3/Dashboard/Reports/RoadPatrolReportController.php +++ b/app/Http/Controllers/V3/Dashboard/Reports/RoadPatrolReportController.php @@ -10,7 +10,7 @@ use App\Models\EdarateShahri; use App\Models\Province; use App\Models\RoadObserved; use App\Models\RoadPatrol; -use App\Services\Reports\RoadPatrolReportService; +use App\Services\Cartables\RoadPatrolTableService; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; use Maatwebsite\Excel\Facades\Excel; @@ -19,9 +19,9 @@ use Symfony\Component\HttpFoundation\BinaryFileResponse; class RoadPatrolReportController extends Controller { use ApiResponse; - public function countryPatrolActivity(Request $request, RoadPatrolReportService $roadPatrolReportService): JsonResponse + public function countryPatrolActivity(Request $request, RoadPatrolTableService $roadPatrolTableService): JsonResponse { - $activities = $roadPatrolReportService->countryActivity($request); + $activities = $roadPatrolTableService->countryActivity($request); $provinces = Province::all(['id', 'name_fa']); @@ -31,11 +31,11 @@ class RoadPatrolReportController extends Controller ]); } - public function provincePatrolActivity(Request $request, RoadPatrolReportService $roadPatrolReportService): JsonResponse + public function provincePatrolActivity(Request $request, RoadPatrolTableService $roadPatrolTableService): JsonResponse { $request->validate(["province_id" => "required",]); - $activities = $roadPatrolReportService->provinceActivity($request); + $activities = $roadPatrolTableService->provinceActivity($request); $edarateShahri = EdarateShahri::query()->where('province_id', '=', $request->province_id)->get(['id', 'name_fa']); @@ -45,9 +45,9 @@ class RoadPatrolReportController extends Controller ]); } - public function countryActivityExcel(Request $request, RoadPatrolReportService $roadPatrolReportService): BinaryFileResponse + public function countryActivityExcel(Request $request, RoadPatrolTableService $roadPatrolTableService): BinaryFileResponse { - $activities = $roadPatrolReportService->countryActivity($request); + $activities = $roadPatrolTableService->countryActivity($request); $provinces = Province::all(['id', 'name_fa']); $name = 'گزارش از گشت راهداری و ترابری ' . verta()->now()->format('Y-m-d H-i') . '.xlsx'; @@ -58,9 +58,9 @@ class RoadPatrolReportController extends Controller ]), $name); } - public function provinceActivityExcel(Request $request, RoadPatrolReportService $roadPatrolReportService): BinaryFileResponse + public function provinceActivityExcel(Request $request, RoadPatrolTableService $roadPatrolTableService): BinaryFileResponse { - $activities = $roadPatrolReportService->provinceActivity($request); + $activities = $roadPatrolTableService->provinceActivity($request); $edarateShahri = EdarateShahri::query()->where('province_id', '=', $request->province_id)->get(['id', 'name_fa']); $name = 'گزارش از گشت راهداری و ترابری ' . verta()->now()->format('Y-m-d H-i') . '.xlsx'; diff --git a/app/Http/Controllers/V3/Dashboard/RoadItemsProjectController.php b/app/Http/Controllers/V3/Dashboard/RoadItemsProjectController.php index 0cf834d3..bcb9e6fb 100644 --- a/app/Http/Controllers/V3/Dashboard/RoadItemsProjectController.php +++ b/app/Http/Controllers/V3/Dashboard/RoadItemsProjectController.php @@ -13,7 +13,7 @@ use App\Models\EdarateShahri; use App\Models\InfoItem; use App\Models\RoadItemsProject; use App\Services\NominatimService; -use App\Services\Reports\RoadItemReportService; +use App\Services\Cartables\RoadItemTableService; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; use Illuminate\Support\Facades\Gate; @@ -28,9 +28,9 @@ class RoadItemsProjectController extends Controller /** * Display a listing of the resource. */ - public function supervisorIndex(Request $request, RoadItemReportService $roadItemReportService): JsonResponse + public function supervisorIndex(Request $request, RoadItemTableService $roadItemTableService): JsonResponse { - $data = $roadItemReportService->supervisorCartableReport($request); + $data = $roadItemTableService->supervisorCartableReport($request); foreach ($data['data'] as $road_item) { if (Gate::allows('gate-supervise-road-item', $road_item)) { @@ -96,16 +96,16 @@ class RoadItemsProjectController extends Controller } - public function supervisorCartableReport(Request $request, RoadItemReportService $roadItemReportService): BinaryFileResponse + public function supervisorCartableReport(Request $request, RoadItemTableService $roadItemTableService): BinaryFileResponse { $name = 'گزارش از کارتابل ارزیابی فعالیت روزانه ' . verta()->now()->format('Y-m-d H:i') . '.xlsx'; - $data = $roadItemReportService->supervisorCartableReport($request, true); + $data = $roadItemTableService->supervisorCartableReport($request, true); return Excel::download(new SupervisorCartableReport($data['data']), $name); } - public function operatorIndex(Request $request, RoadItemReportService $roadItemReportService): JsonResponse + public function operatorIndex(Request $request, RoadItemTableService $roadItemTableService): JsonResponse { - $data = $roadItemReportService->operatorCartableReport($request); + $data = $roadItemTableService->operatorCartableReport($request); return response()->json($data); } @@ -264,10 +264,10 @@ class RoadItemsProjectController extends Controller return $this->successResponse(); } - public function operatorCartableReport(Request $request, RoadItemReportService $roadItemReportService): BinaryFileResponse + public function operatorCartableReport(Request $request, RoadItemTableService $roadItemTableService): BinaryFileResponse { $name = 'گزارش از کارتابل عملیات فعالیت روزانه ' . verta()->now()->format('Y-m-d H:i') . '.xlsx'; - $data = $roadItemReportService->operatorCartableReport($request, true); + $data = $roadItemTableService->operatorCartableReport($request, true); return Excel::download(new OperatorCartableReport($data['data']), $name); } diff --git a/app/Http/Controllers/V3/Dashboard/RoadPatrolProjectController.php b/app/Http/Controllers/V3/Dashboard/RoadPatrolProjectController.php index dd1f9f32..98550c02 100644 --- a/app/Http/Controllers/V3/Dashboard/RoadPatrolProjectController.php +++ b/app/Http/Controllers/V3/Dashboard/RoadPatrolProjectController.php @@ -15,7 +15,7 @@ use App\Models\RoadItemsProject; use App\Models\RoadObserved; use App\Models\RoadPatrol; use App\Services\NominatimService; -use App\Services\Reports\RoadPatrolReportService; +use App\Services\Cartables\RoadPatrolTableService; use Carbon\Carbon; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; @@ -30,9 +30,9 @@ class RoadPatrolProjectController extends Controller { use ApiResponse; - public function supervisorIndex(Request $request, RoadPatrolReportService $roadPatrolReportService): JsonResponse + public function supervisorIndex(Request $request, RoadPatrolTableService $roadPatrolTableService): JsonResponse { - $data = $roadPatrolReportService->supervisorCartableReport($request); + $data = $roadPatrolTableService->supervisorCartableReport($request); foreach ($data['data'] as $road_patrol) { if (Gate::allows('gate-supervise-road-item', $road_patrol)) { @@ -80,16 +80,16 @@ class RoadPatrolProjectController extends Controller return $this->successResponse(); } - public function supervisorCartableReport(Request $request, RoadPatrolReportService $roadPatrolReportService): BinaryFileResponse + public function supervisorCartableReport(Request $request, RoadPatrolTableService $roadPatrolTableService): BinaryFileResponse { $name = 'گزارش از کارتابل ارزیابی گشت راهداری ' . verta()->now()->format('Y-m-d H:i') . '.xlsx'; - $data = $roadPatrolReportService->supervisorCartableReport($request, true); + $data = $roadPatrolTableService->supervisorCartableReport($request, true); return Excel::download(new SupervisorCartableReport($data['data']), $name); } - public function operatorIndex(Request $request, RoadPatrolReportService $roadPatrolReportService): JsonResponse + public function operatorIndex(Request $request, RoadPatrolTableService $roadPatrolTableService): JsonResponse { - $data = $roadPatrolReportService->operatorCartableReport($request); + $data = $roadPatrolTableService->operatorCartableReport($request); return response()->json($data); } @@ -322,10 +322,10 @@ class RoadPatrolProjectController extends Controller return $this->successResponse($roadPatrol); } - public function operatorCartableReport(Request $request, RoadPatrolReportService $roadPatrolReportService): BinaryFileResponse + public function operatorCartableReport(Request $request, RoadPatrolTableService $roadPatrolTableService): BinaryFileResponse { $name = 'گزارش از کارتابل عملیات گشت راهداری ' . verta()->now()->format('Y-m-d H:i') . '.xlsx'; - $data = $roadPatrolReportService->operatorCartableReport($request, true); + $data = $roadPatrolTableService->operatorCartableReport($request, true); return Excel::download(new OperatorCartableReport($data['data']), $name); } diff --git a/app/Http/Requests/V3/AccidentReceipt/StoreRequest.php b/app/Http/Requests/V3/AccidentReceipt/StoreRequest.php new file mode 100644 index 00000000..b5b5627f --- /dev/null +++ b/app/Http/Requests/V3/AccidentReceipt/StoreRequest.php @@ -0,0 +1,47 @@ +|string> + */ + public function rules(): array + { + return [ + 'province_id' => 'required|integer|exists:provinces,id', + 'city_id' => 'required|integer|exists:cities,id', + 'axis_name' => 'required|string', + 'driver_name' => 'required|string', + 'plaque' => 'required|string', + 'driver_national_code' => 'required|string', + 'driver_phone_number' => 'required|string', + 'lat' => 'required|numeric', + 'lng' => 'required|numeric', + 'accident_type' => 'required|integer', + 'accident_date' => 'required|date', + 'accident_time' => 'required|string', + 'report_base' => 'required|in:0,1', + 'police_file' => 'required_if:report_base,0|file|mimes:pdf,jpg,jpeg,png', + 'police_serial' => 'required_if:report_base,0|string', + 'police_file_date' => 'required_if:report_base,0|date', + 'damage_picture1' => 'required|file|mimes:pdf,jpg,jpeg,png', + 'damage_picture2' => 'required|file|mimes:pdf,jpg,jpeg,png', + ]; + } +} diff --git a/app/Http/Requests/V3/AccidentReceipt/UpdateRequest.php b/app/Http/Requests/V3/AccidentReceipt/UpdateRequest.php new file mode 100644 index 00000000..c5219237 --- /dev/null +++ b/app/Http/Requests/V3/AccidentReceipt/UpdateRequest.php @@ -0,0 +1,45 @@ +|string> + */ + public function rules(): array + { + return [ + 'province_id' => 'required|integer|exists:provinces,id', + 'city_id' => 'required|integer|exists:cities,id', + 'axis_name' => 'required|string', + 'driver_name' => 'required|string', + 'plaque' => 'required|string', + 'driver_national_code' => 'required|string', + 'driver_phone_number' => 'required|string', + 'lat' => 'required|numeric', + 'lng' => 'required|numeric', + 'accident_type' => 'required|integer', + 'accident_date' => 'required|date', + 'accident_time' => 'required|string', + 'report_base' => 'required|in:0,1', + 'police_file' => 'required_if:report_base,0|file|mimes:pdf,jpg,jpeg,png', + 'police_serial' => 'required_if:report_base,0|string', + 'police_file_date' => 'required_if:report_base,0|date', + 'damage_picture1' => 'required|file|mimes:pdf,jpg,jpeg,png', + 'damage_picture2' => 'required|file|mimes:pdf,jpg,jpeg,png', + ]; + } +} diff --git a/app/Services/Cartables/AccidentReceiptTableService.php b/app/Services/Cartables/AccidentReceiptTableService.php new file mode 100644 index 00000000..6831f918 --- /dev/null +++ b/app/Services/Cartables/AccidentReceiptTableService.php @@ -0,0 +1,106 @@ +user(); + $query = null; + + if ($user->hasPermissionTo('show-receipt')) { + $query = Accident::query(); + } + else { + if (is_null($user->province_id)) { + return $this->errorResponse('استانی برای شما در سامانه ثبت نشده است!'); + } + + $query = Accident::query()->where('province_id', '=', $user->province_id); + } + + return DataTableFacade::run( + $query, + $request, + allowedFilters: ['*'], + allowedSortings: ['*'] + ); + } + + public function provinceReport(Request $request): array + { + $data = DB::select( + 'SELECT + "کشوری" as province_fa, + -1 as province_id, + COUNT(id) AS tedade, + COUNT(CASE WHEN report_base = 0 THEN 1 END) AS police_rah, + COUNT(CASE WHEN report_base = 1 THEN 1 END) AS gozaresh_gasht, + SUM(`sum`) AS kol_sabt_shode, + SUM(CASE WHEN STATUS > 3 THEN `sum` END) AS vasel_shode, + SUM(CASE WHEN STATUS > 3 THEN `deposit_insurance_amount` END) AS vasel_shode_bimeh, + SUM(CASE WHEN STATUS > 3 THEN `deposit_daghi_amount` END) AS vasel_shode_daghi, + SUM(CASE WHEN STATUS > 3 THEN `final_amount` END) AS vasel_shode_final + FROM `accidents` + where created_at BETWEEN "'.$request->from_date.'" AND "'.$request->date_to.'" + union + SELECT + province_fa, + province_id, + COUNT(id) AS tedade, + COUNT(CASE WHEN report_base = 0 THEN 1 END) AS police_rah, + COUNT(CASE WHEN report_base = 1 THEN 1 END) AS gozaresh_gasht, + SUM(`sum`) AS kol_sabt_shode, + SUM(CASE WHEN STATUS > 3 THEN `sum` END) AS vasel_shode, + SUM(CASE WHEN STATUS > 3 THEN `deposit_insurance_amount` END) AS vasel_shode_bimeh, + SUM(CASE WHEN STATUS > 3 THEN `deposit_daghi_amount` END) AS vasel_shode_daghi, + SUM(CASE WHEN STATUS > 3 THEN `final_amount` END) AS vasel_shode_final + FROM `accidents` + where created_at BETWEEN "'.$request->from_date.'" AND "'.$request->date_to.'" + GROUP BY province_id + ' + ); + + return [ + 'data' => collect($data), + 'fromDate' => $request->from_date, + 'toDate' => $request->date_to, + ]; + } + + public function cityReport(Request $request): array + { + $data = DB::select( + 'SELECT + city_fa, + city_id, + COUNT(id) AS tedade, + COUNT(CASE WHEN report_base = 0 THEN 1 END) AS police_rah, + COUNT(CASE WHEN report_base = 1 THEN 1 END) AS gozaresh_gasht, + SUM(`sum`) AS kol_sabt_shode, + SUM(CASE WHEN STATUS > 3 THEN `sum` END) AS vasel_shode, + SUM(CASE WHEN STATUS > 3 THEN `deposit_insurance_amount` END) AS vasel_shode_bimeh, + SUM(CASE WHEN STATUS > 3 THEN `deposit_daghi_amount` END) AS vasel_shode_daghi, + SUM(CASE WHEN STATUS > 3 THEN `final_amount` END) AS vasel_shode_final + FROM `accidents` + where created_at BETWEEN "'.$request->from_date.'" AND "'.$request->date_to.'" AND province_id ='.$request->province_id.' + GROUP BY city_id + ' + ); + + return [ + 'data' => collect($data), + 'fromDate' => $request->from_date, + 'toDate' => $request->date_to, + ]; + } +} diff --git a/app/Services/Reports/RoadItemReportService.php b/app/Services/Cartables/RoadItemTableService.php similarity index 99% rename from app/Services/Reports/RoadItemReportService.php rename to app/Services/Cartables/RoadItemTableService.php index 6f8551ed..c0a929fd 100644 --- a/app/Services/Reports/RoadItemReportService.php +++ b/app/Services/Cartables/RoadItemTableService.php @@ -1,6 +1,6 @@ name('receipts.') ->controller(AccidentReceiptController::class) ->group(function () { - Route::get('/', 'index')->name('index'); + Route::get('/', 'index')->name('index'); + Route::get('/excel_report', 'excelReport')->name('excelReport'); Route::post('/', 'store')->name('store'); Route::get('/{accident}', 'show')->name('show'); Route::post('/{accident}', 'update')->name('update'); @@ -252,3 +254,13 @@ Route::prefix('receipts') Route::get('/check_payment_status/{accident}', 'checkPaymentStatus')->name('checkPaymentStatus'); Route::get('/generate_police_document/{accident}', 'generatePoliceDocument')->name('generatePoliceDocument'); }); + +Route::prefix('receipt_reports') + ->name('receiptReports.') + ->controller(ReceiptReportController::class) + ->group(function () { + Route::get('/province_report', 'provinceReport')->name('provinceReport'); + Route::get('/city_report', 'cityReport')->name('cityReport'); + Route::get('/province_excel_report', 'provinceExcelReport')->name('provinceExcelReport'); + Route::get('/city_excel_report', 'cityExcelReport')->name('cityExcelReport'); + });