From 79a5d56315a2380c6be7d4746f9432555cbead5b Mon Sep 17 00:00:00 2001 From: faezehzafarbakhsh Date: Wed, 31 Dec 2025 20:07:07 +0330 Subject: [PATCH] crate excel for volation mission --- .../V3/Mission/Violation/CountryReport.php | 90 +++++++++++++++++ .../V3/Mission/Violation/ProvinceReport.php | 99 +++++++++++++++++++ .../V3/Dashboard/Mission/ReportController.php | 45 ++++++--- .../Violation/CountryActivityReport.blade.php | 73 ++++++++++++++ .../ProvinceActivityReport.blade.php | 75 ++++++++++++++ 5 files changed, 366 insertions(+), 16 deletions(-) create mode 100644 app/Exports/V3/Mission/Violation/CountryReport.php create mode 100644 app/Exports/V3/Mission/Violation/ProvinceReport.php create mode 100644 resources/views/v3/Reports/Mission/Violation/CountryActivityReport.blade.php create mode 100644 resources/views/v3/Reports/Mission/Violation/ProvinceActivityReport.blade.php diff --git a/app/Exports/V3/Mission/Violation/CountryReport.php b/app/Exports/V3/Mission/Violation/CountryReport.php new file mode 100644 index 00000000..78604002 --- /dev/null +++ b/app/Exports/V3/Mission/Violation/CountryReport.php @@ -0,0 +1,90 @@ +data as $r) { + $pid = (int) $r->province_id; + $name = $r->province_name; + + if ($pid === -1) { + $national = [ + 'province_name' => $name, + 'no_mission_count' => (int) ($r->no_mission_count ?? 0), + 'out_of_area_count' => (int) ($r->out_of_area_count ?? 0), + ]; + continue; + } + + + if (!isset($grid[$pid])) { + $grid[$pid] = [ + 'province_name' => $name, + ]; + } + + $grid[$pid]['no_mission_count'] = (int) ($r->no_mission_count ?? 0); + $grid[$pid]['out_of_area_count'] = (int) ($r->out_of_area_count ?? 0); + + } + + $exportRows = []; + if ($national) $exportRows[] = $national; + foreach ($grid as $row) { + $exportRows[] = $row; + } + + return view('v3.Reports.Mission.Violation.CountryActivityReport', [ + 'rows' => $exportRows, + ]); + } + + public function registerEvents(): array + { + return [ + AfterSheet::class => function (AfterSheet $event) { + $event->sheet->getDelegate()->setRightToLeft(true); + }, + ]; + } + + public function drawings(): array + { + $drawing = new Drawing(); + $drawing->setName('Logo'); + $drawing->setDescription('This is my logo'); + $drawing->setPath(public_path('/dist/logo.png')); + $drawing->setWidth(50); + $drawing->setHeight(50); + $drawing->setOffsetX(5); + $drawing->setOffsetY(5); + $drawing->setCoordinates('A1'); + + $drawing2 = new Drawing(); + $drawing2->setName('Logo'); + $drawing2->setDescription('This is my logo'); + $drawing2->setPath(public_path('/dist/141icon.png')); + $drawing2->setWidth(50); + $drawing2->setHeight(50); + $drawing2->setOffsetX(5); + $drawing2->setOffsetY(5); + $drawing2->setCoordinates('E1'); + return [$drawing, $drawing2]; + } +} diff --git a/app/Exports/V3/Mission/Violation/ProvinceReport.php b/app/Exports/V3/Mission/Violation/ProvinceReport.php new file mode 100644 index 00000000..7b26540a --- /dev/null +++ b/app/Exports/V3/Mission/Violation/ProvinceReport.php @@ -0,0 +1,99 @@ +data as $r) { + $pid = (int) $r->province_id; + $name = $r->city_name; + + if ($pid === -1) { + $province = [ + 'city_name' => $name, + 'no_mission_count' => (int) ($r->no_mission_count ?? 0), + 'out_of_area_count' => (int) ($r->out_of_area_count ?? 0), + ]; + continue; + } + + + if (!isset($grid[$pid])) { + $grid[$pid] = [ + 'city_name' => $name, + ]; + } + + $grid[$pid]['no_mission_count'] = (int) ($r->no_mission_count ?? 0); + $grid[$pid]['out_of_area_count'] = (int) ($r->out_of_area_count ?? 0); + + } + + $exportRows = []; + if ($province) $exportRows[] = $province; + foreach ($grid as $row) { + $exportRows[] = $row; + } + + + return view('v3.Reports.Mission.Violation.ProvinceActivityReport', [ + 'rows' => $exportRows, + ]); + } + + public function registerEvents(): array + { + return [ + AfterSheet::class => function (AfterSheet $event) { + $event->sheet->getDelegate()->setRightToLeft(true); + }, + ]; + } + + /** + * @throws Exception + */ + public function drawings(): array + { + $drawing = new Drawing(); + $drawing->setName('Logo'); + $drawing->setDescription('This is my logo'); + $drawing->setPath(public_path('/dist/logo.png')); + $drawing->setWidth(50); + $drawing->setHeight(50); + $drawing->setOffsetX(5); + $drawing->setOffsetY(5); + $drawing->setCoordinates('A1'); + + $drawing2 = new Drawing(); + $drawing2->setName('Logo'); + $drawing2->setDescription('This is my logo'); + $drawing2->setPath(public_path('/dist/141icon.png')); + $drawing2->setWidth(50); + $drawing2->setHeight(50); + $drawing2->setOffsetX(5); + $drawing2->setOffsetY(5); + $drawing2->setCoordinates('E1'); + return [$drawing, $drawing2]; + } +} \ No newline at end of file diff --git a/app/Http/Controllers/V3/Dashboard/Mission/ReportController.php b/app/Http/Controllers/V3/Dashboard/Mission/ReportController.php index 8b3e6dc4..c59f4022 100644 --- a/app/Http/Controllers/V3/Dashboard/Mission/ReportController.php +++ b/app/Http/Controllers/V3/Dashboard/Mission/ReportController.php @@ -2,6 +2,8 @@ namespace App\Http\Controllers\V3\Dashboard\Mission; +use App\Exports\V3\Mission\Violation\CountryReport; +use App\Exports\V3\Mission\Violation\ProvinceReport; use App\Http\Controllers\Controller; use App\Http\Traits\ApiResponse; use App\Models\City; @@ -9,6 +11,9 @@ use App\Models\Province; use App\Services\Cartables\Mission\ReportService; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; +use Maatwebsite\Excel\Facades\Excel; +use PhpOffice\PhpSpreadsheet\Exception; +use Symfony\Component\HttpFoundation\BinaryFileResponse; class ReportController extends Controller { @@ -29,20 +34,28 @@ class ReportController extends Controller 'city' => City::query()->where('province_id', $request->province_id)->get(['id', 'name_fa']), ]); } -// -// public function countryExcelActivity(Request $request, OperatorService $operatorService): BinaryFileResponse -// { -// $data = $operatorService->countryActivity($request); -// $name = 'گزارش تخلفات ماموریت ها '.verta()->now()->format('Y-m-d H-i').'.xlsx'; -// -// return Excel::download(new ExcelReport($data), $name); -// } -// -// public function provinceExcelActivity(Request $request, OperatorService $operatorService): BinaryFileResponse -// { -// $data = $operatorService->provinceActivity($request); -// $name = 'گزارش تخلفات ماموریت ها '.verta()->now()->format('Y-m-d H-i').'.xlsx'; -// -// return Excel::download(new ProvinceExcelReport($data, $request), $name); -// } + + /** + * @throws Exception + * @throws \PhpOffice\PhpSpreadsheet\Writer\Exception + */ + public function countryExcelActivity(Request $request, ReportService $reportService): BinaryFileResponse + { + $data = $reportService->countryActivity($request); + $name = 'گزارش تخلفات ماموریت ها '.verta()->now()->format('Y-m-d H-i').'.xlsx'; + + return Excel::download(new CountryReport($data), $name); + } + + /** + * @throws Exception + * @throws \PhpOffice\PhpSpreadsheet\Writer\Exception + */ + public function provinceExcelActivity(Request $request, ReportService $reportService): BinaryFileResponse + { + $data = $reportService->provinceActivity($request); + $name = 'گزارش تخلفات ماموریت ها '.verta()->now()->format('Y-m-d H-i').'.xlsx'; + + return Excel::download(new ProvinceReport($data), $name); + } } diff --git a/resources/views/v3/Reports/Mission/Violation/CountryActivityReport.blade.php b/resources/views/v3/Reports/Mission/Violation/CountryActivityReport.blade.php new file mode 100644 index 00000000..57103985 --- /dev/null +++ b/resources/views/v3/Reports/Mission/Violation/CountryActivityReport.blade.php @@ -0,0 +1,73 @@ + + + + + + + + گزارش کل کشور + + + + + +@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 ($data as $item) + + + + + + @endforeach + +
+ تاریخ دریافت گزارش: {{ verta()->now()->format('Y/m/d H:i') }} +
+
+ گزارش نخلف های صورت گرفته +
+ کد یکتا + +خروج بدون ماموریت + خارج از محدوده +
{{ $item['id'] ?? '-' }}{{ $item['no_mission_count'] ?? '-' }}{{ $item['out_of_area_count'] ?? '-' }}
+ + diff --git a/resources/views/v3/Reports/Mission/Violation/ProvinceActivityReport.blade.php b/resources/views/v3/Reports/Mission/Violation/ProvinceActivityReport.blade.php new file mode 100644 index 00000000..78910a8c --- /dev/null +++ b/resources/views/v3/Reports/Mission/Violation/ProvinceActivityReport.blade.php @@ -0,0 +1,75 @@ + + + + + + + + گزارش ادارات شهرستان + + + + + +@php + // show a dot if key missing or value is 0/empty + function cell($row, $key) { + return array_key_exists($key, $row) ? ($row[$key] ?: '0') : '0'; + } +@endphp + + + + + + + + + + + + + + + + + + + + + + + + @foreach ($data as $item) + + + + + + @endforeach + +
+ تاریخ دریافت گزارش: {{ verta()->now()->format('Y/m/d H:i') }} +
+
+ گزارش نخلف های صورت گرفته +
+ کد یکتا + +خروج بدون ماموریت + خارج از محدوده +
{{ $item['id'] ?? '-' }}{{ $item['no_mission_count'] ?? '-' }}{{ $item['out_of_area_count'] ?? '-' }}
+ +