create excel files

This commit is contained in:
2025-01-21 10:31:25 +03:30
parent fae721a3f1
commit 03fd210671
6 changed files with 205 additions and 134 deletions

77
app/Enums/InfoItem.php Normal file
View File

@@ -0,0 +1,77 @@
<?php
namespace App\Enums;
enum InfoItem: int
{
case MAREMAT= 1;
case PAKSAZI = 2;
case ALAEM = 3;
case HEFAZ = 4;
case ROSHANAEI = 5;
case KHATKESHI = 6;
case RANGAMIZI = 7;
case SHOSTESHOO = 8;
case IMENSAZI = 9;
case HARIM_1 = 10;
case HARIM_2 = 17;
case POL= 11;
case TOONEL= 12;
case ZEMESTANI= 13;
case MASHINALAT= 14;
case RAHDARKHANE= 15;
case EZTERARI= 16;
case BAZRESI= 20;
public static function subItems(int $item): array
{
$subitems = [
1 => [1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13],
2 => [1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13],
3 => [1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13],
4 => [1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13],
5 => [1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13],
6 => [1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13],
7 => [1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13],
8 => [1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13],
9 => [1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13],
10 => [1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13],
11 => [1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13],
12 => [1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13],
13 => [1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13],
14 => [1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13],
15 => [1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13],
16 => [1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13],
17 => [1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13],
20 => [1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13],
];
return $subitems[$item];
}
public static function persianName(int $item): string
{
$persianName = [
1 => '',
2 => '',
3 => '',
4 => '',
5 => '',
6 => '',
7 => '',
8 => '',
9 => '',
10 => '',
11 => '',
12 => '',
13 => '',
14 => '',
15 => '',
16 => '',
17 => '',
20 => '',
];
return $persianName[$item];
}
}

View File

@@ -6,6 +6,7 @@ use App\Models\Province;
use App\Models\RoadItemsProject;
use Carbon\Carbon;
use Illuminate\Contracts\View\View;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\DB;
use Maatwebsite\Excel\Concerns\FromView;
use Maatwebsite\Excel\Concerns\ShouldAutoSize;
@@ -17,65 +18,16 @@ use PhpOffice\PhpSpreadsheet\Worksheet\Drawing;
class CountryActivityPerSubItemReport implements FromView, WithEvents, ShouldAutoSize, WithDrawings
{
public function __construct(private ?string $fromDate, private ?string $toDate){}
public function __construct(private Collection $activities){}
public function view(): View
{
$fromDate = $this->fromDate ?? '2021-03-21';
$toDate = $this->toDate ?? Carbon::now();
$query = "SELECT
COUNT(CASE WHEN sub_item = 1 THEN 1 END) as LabeAsphaltCount,
SUM(CASE WHEN sub_item = 1 THEN sub_item_data END) as LabeAsphaltSum,
COUNT(CASE WHEN sub_item = 2 THEN 1 END) as ShaneSaziCount,
SUM(CASE WHEN sub_item = 2 THEN sub_item_data END) as ShaneSaziSum,
COUNT(CASE WHEN sub_item = 3 THEN 1 END) as GodOftadegiCount,
SUM(CASE WHEN sub_item = 3 THEN sub_item_data END) as GodOftadegiSum,
COUNT(CASE WHEN sub_item = 4 THEN 1 END) as LakegiriCount,
SUM(CASE WHEN sub_item = 4 THEN sub_item_data END) as LakegiriSum,
COUNT(CASE WHEN sub_item = 5 THEN 1 END) as MarematCount,
SUM(CASE WHEN sub_item = 5 THEN sub_item_data END) as MarematSum,
COUNT(CASE WHEN sub_item = 6 THEN 1 END) as BastarHarimCount,
SUM(CASE WHEN sub_item = 6 THEN sub_item_data END) as BastarHarimSum,
COUNT(CASE WHEN sub_item = 8 THEN 1 END) as DarzgiriCount,
SUM(CASE WHEN sub_item = 8 THEN sub_item_data END) as DarzgiriSum,
COUNT(CASE WHEN sub_item = 9 THEN 1 END) as MozresCount,
SUM(CASE WHEN sub_item = 9 THEN sub_item_data END) as MozresSum,
COUNT(CASE WHEN sub_item = 10 THEN 1 END) as TarashRooyeCount,
SUM(CASE WHEN sub_item = 10 THEN sub_item_data END) as TarashRooyeSum,
COUNT(CASE WHEN sub_item = 11 THEN 1 END) as TighzaniCount,
SUM(CASE WHEN sub_item = 11 THEN sub_item_data END) as TighzaniSum,
COUNT(CASE WHEN sub_item = 12 THEN 1 END) as ShenriziCount,
SUM(CASE WHEN sub_item = 12 THEN sub_item_data END) as ShenriziSum,
COUNT(CASE WHEN sub_item = 13 THEN 1 END) as KhakbardariCount,
SUM(CASE WHEN sub_item = 13 THEN sub_item_data END) as KhakbardariSum,
province_id,
province_fa
FROM road_items_projects
WHERE item = 1 and status = 1
AND activity_date_time BETWEEN '{$fromDate} 00:00:00' and '{$toDate} 23:59:59'
GROUP BY province_id, province_fa
ORDER BY province_id ASC;";
$countryActivities = DB::select($query);
$activities = $this->activities;
return view('', [
'activities' => $countryActivities,
'fromDate' => $fromDate,
'toDate' => $toDate
'activities' => $activities->data,
'fromDate' => $activities->fromDate,
'toDate' => $activities->toDate
]);
}

View File

@@ -6,6 +6,7 @@ use App\Models\Province;
use App\Models\RoadItemsProject;
use Carbon\Carbon;
use Illuminate\Contracts\View\View;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\DB;
use Maatwebsite\Excel\Concerns\FromView;
use Maatwebsite\Excel\Concerns\ShouldAutoSize;
@@ -17,63 +18,16 @@ use PhpOffice\PhpSpreadsheet\Worksheet\Drawing;
class ProvinceActivityPerSubItemReport implements FromView, WithEvents, ShouldAutoSize, WithDrawings
{
public function __construct(private ?string $fromDate, private ?string $toDate, private string $provinceId,){}
public function __construct(private Collection $activities){}
public function view(): View
{
$fromDate = $this->fromDate ?? '2021-03-21';
$toDate = $this->toDate ?? Carbon::now();
$query = "SELECT
COUNT(CASE WHEN sub_item = 1 THEN 1 END) as LabeAsphaltCount,
SUM(CASE WHEN sub_item = 1 THEN sub_item_data END) as LabeAsphaltSum,
COUNT(CASE WHEN sub_item = 2 THEN 1 END) as ShaneSaziCount,
SUM(CASE WHEN sub_item = 2 THEN sub_item_data END) as ShaneSaziSum,
COUNT(CASE WHEN sub_item = 3 THEN 1 END) as GodOftadegiCount,
SUM(CASE WHEN sub_item = 3 THEN sub_item_data END) as GodOftadegiSum,
COUNT(CASE WHEN sub_item = 4 THEN 1 END) as LakegiriCount,
SUM(CASE WHEN sub_item = 4 THEN sub_item_data END) as LakegiriSum,
COUNT(CASE WHEN sub_item = 5 THEN 1 END) as MarematCount,
SUM(CASE WHEN sub_item = 5 THEN sub_item_data END) as MarematSum,
COUNT(CASE WHEN sub_item = 6 THEN 1 END) as BastarHarimCount,
SUM(CASE WHEN sub_item = 6 THEN sub_item_data END) as BastarHarimSum,
COUNT(CASE WHEN sub_item = 8 THEN 1 END) as DarzgiriCount,
SUM(CASE WHEN sub_item = 8 THEN sub_item_data END) as DarzgiriSum,
COUNT(CASE WHEN sub_item = 9 THEN 1 END) as MozresCount,
SUM(CASE WHEN sub_item = 9 THEN sub_item_data END) as MozresSum,
COUNT(CASE WHEN sub_item = 10 THEN 1 END) as TarashRooyeCount,
SUM(CASE WHEN sub_item = 10 THEN sub_item_data END) as TarashRooyeSum,
COUNT(CASE WHEN sub_item = 11 THEN 1 END) as TighzaniCount,
SUM(CASE WHEN sub_item = 11 THEN sub_item_data END) as TighzaniSum,
COUNT(CASE WHEN sub_item = 12 THEN 1 END) as ShenriziCount,
SUM(CASE WHEN sub_item = 12 THEN sub_item_data END) as ShenriziSum,
COUNT(CASE WHEN sub_item = 13 THEN 1 END) as KhakbardariCount,
SUM(CASE WHEN sub_item = 13 THEN sub_item_data END) as KhakbardariSum,
province_id, province_fa, city_id, user_name as city_fa
FROM road_items_projects
WHERE item =1 AND status = 1
AND province_id = {$this->provinceId}
AND activity_date_time BETWEEN '{$fromDate}' AND '{$toDate}' GROUP BY city_id ORDER BY province_id ASC;";
$provinceActivities = DB::select($query);
$activities = $this->activities;
return view('', [
'activities' => $provinceActivities,
'fromDate' => $fromDate,
'toDate' => $toDate
'activities' => $activities->data,
'fromDate' => $activities->fromDate,
'toDate' => $activities->toDate
]);
}

View File

@@ -2,13 +2,17 @@
namespace App\Http\Controllers\V3\Dashboard\Reports;
use App\Exports\Activities\One\AllSheets as OneSheet;
use App\Exports\V3\RoadItemsProjects\CountryActivityPerItemReport;
use App\Exports\V3\RoadItemsProjects\CountryActivityPerSubItemReport;
use App\Exports\V3\RoadItemsProjects\ProvinceActivityPerItemReport;
use App\Exports\V3\RoadItemsProjects\ProvinceActivityPerSubItemReport;
use App\Http\Controllers\Controller;
use App\Http\Traits\ApiResponse;
use App\Models\EdarateShahri;
use App\Models\InfoItem;
use App\Models\Province;
use App\Models\RoadItemsProject;
use App\Services\Reports\RoadItemReportService;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Maatwebsite\Excel\Facades\Excel;
@@ -224,38 +228,48 @@ class RoadItemsReportController extends Controller
return $this->successResponse($data);
}
public function activityExcelPerItem(Request $request): BinaryFileResponse
public function countryActivityExcelPerItem(Request $request): BinaryFileResponse
{
auth()->user()->addActivityComplete(1034);
$name = 'گزارش از فعالیت روزانه و جاری - جدول 1 ' . verta()->now()->format('Y-m-d H-i') . '.xlsx';
return Excel::download(new OneSheet($request->fromDate, $request->toDate, $request->province), $name);
$name = 'گزارش کشوری از فعالیت روزانه و جاری - جدول 1 ' . verta()->now()->format('Y-m-d H-i') . '.xlsx';
return Excel::download(new CountryActivityPerItemReport($request->fromDate, $request->toDate), $name);
}
public function activityExcelPerSubItem(Request $request)
public function provinceActivityExcelPerItem(Request $request): BinaryFileResponse
{
$url_correction = $request->province ? "&province={$request->province}" : "";
auth()->user()->addActivityComplete(1034);
$name = 'گزارش استانی از فعالیت روزانه و جاری - جدول 1 ' . verta()->now()->format('Y-m-d H-i') . '.xlsx';
return Excel::download(new ProvinceActivityPerItemReport($request->fromDate, $request->toDate, $request->province), $name);
}
return match ($request->type) {
1 => redirect("/reports/two/maremat?fromDate={$request->fromDate}&toDate={$request->toDate}" . $url_correction),
2 => redirect("/reports/two/paksazi?fromDate={$request->fromDate}&toDate={$request->toDate}" . $url_correction),
3 => redirect("/reports/two/alaem?fromDate={$request->fromDate}&toDate={$request->toDate}" . $url_correction),
4 => redirect("/reports/two/hefaz?fromDate={$request->fromDate}&toDate={$request->toDate}" . $url_correction),
5 => redirect("/reports/two/roshanaei?fromDate={$request->fromDate}&toDate={$request->toDate}" . $url_correction),
6 => redirect("/reports/two/khatkeshi?fromDate={$request->fromDate}&toDate={$request->toDate}" . $url_correction),
7 => redirect("/reports/two/rangamizi?fromDate={$request->fromDate}&toDate={$request->toDate}" . $url_correction),
8 => redirect("/reports/two/shosteshoo?fromDate={$request->fromDate}&toDate={$request->toDate}" . $url_correction),
9 => redirect("/reports/two/imensazi?fromDate={$request->fromDate}&toDate={$request->toDate}" . $url_correction),
10 => redirect("/reports/two/harim?fromDate={$request->fromDate}&toDate={$request->toDate}" . $url_correction),
11 => redirect("/reports/two/pol?fromDate={$request->fromDate}&toDate={$request->toDate}" . $url_correction),
12 => redirect("/reports/two/toonel?fromDate={$request->fromDate}&toDate={$request->toDate}" . $url_correction),
13 => redirect("/reports/two/zemestani?fromDate={$request->fromDate}&toDate={$request->toDate}" . $url_correction),
14 => redirect("/reports/two/mashinalat?fromDate={$request->fromDate}&toDate={$request->toDate}" . $url_correction),
15 => redirect("/reports/two/rahdar?fromDate={$request->fromDate}&toDate={$request->toDate}" . $url_correction),
16 => redirect("/reports/two/ezterari?fromDate={$request->fromDate}&toDate={$request->toDate}" . $url_correction),
20 => redirect("/reports/two/bazrasi?fromDate={$request->fromDate}&toDate={$request->toDate}" . $url_correction),
default => response()->json([
'error' => '404'
], 404),
};
public function countryActivityExcelPerSubItem(Request $request, RoadItemReportService $roadItemReportService): BinaryFileResponse
{
auth()->user()->addActivityComplete(1034);
$activities = $roadItemReportService->countryActivityPerSubItem(
$request->item,
$request->fromDate,
$request->toDate,
);
$name = "گزارش کشوری از فعالیت روزانه و جاری({}) - جدول 2 " . verta()->now()->format('Y-m-d H-i') . '.xlsx';
return Excel::download(new CountryActivityPerSubItemReport($activities), $name);
}
public function provinceActivityExcelPerSubItem(Request $request, RoadItemReportService $roadItemReportService): BinaryFileResponse
{
auth()->user()->addActivityComplete(1034);
$activities = $roadItemReportService->provinceActivityPerSubItem(
$request->item,
$request->fromDate,
$request->toDate,
$request->province_id
);
$name = "گزارش استانی از فعالیت روزانه و جاری({}) - جدول 2 " . verta()->now()->format('Y-m-d H-i') . '.xlsx';
return Excel::download(new ProvinceActivityPerSubItemReport($activities), $name);
}
}

View File

@@ -0,0 +1,70 @@
<?php
namespace App\Services\Reports;
use App\Enums\InfoItem;
use Illuminate\Http\Request;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\DB;
class RoadItemReportService
{
public function countryActivityPerSubItem(int $item, string $fromDate, string $toDate): Collection
{
$subItems = InfoItem::subItems($item);
$query = DB::table('road_items_projects')
->selectRaw('province_id, province_fa');
foreach ($subItems as $key => $name) {
$query->selectRaw("
COUNT(CASE WHEN sub_item = {$key} THEN 1 END) as {$name}Count,
SUM(CASE WHEN sub_item = {$key} THEN sub_item_data END) as {$name}Sum
");
}
$query->where('item', '=', $item)
->where('status', '=', 1)
->whereBetween('activity_date_time', [$fromDate, $toDate])
->groupBy('province_id', 'province_fa')
->orderBy('province_id');
$activities = $query->get();
return collect([
'data' => $activities,
'fromDate' => $fromDate,
'toDate' => $toDate,
]);
}
public function provinceActivityPerSubItem(int $item, string $fromDate, string $toDate, int $provinceId): Collection
{
$subItems = InfoItem::subItems($item);
$query = DB::table('road_items_projects')
->selectRaw('province_id, province_fa, user_name as city_fa, city_id');
foreach ($subItems as $key => $name) {
$query->selectRaw("
COUNT(CASE WHEN sub_item = {$key} THEN 1 END) as {$name}Count,
SUM(CASE WHEN sub_item = {$key} THEN sub_item_data END) as {$name}Sum
");
}
$query->where('item', '=', $item)
->where('status', '=', 1)
->where('province_id', '=', $provinceId)
->whereBetween('activity_date_time', [$fromDate, $toDate])
->groupBy('city_id')
->orderBy('province_id');
$activities = $query->get();
return collect([
'data' => $activities,
'fromDate' => $fromDate,
'toDate' => $toDate,
]);
}
}

View File

@@ -200,6 +200,10 @@ Route::prefix('road_item_reports')
Route::get('/province_activity_per_item', 'provinceActivityPerItem')->name('provinceActivityPerItem');
Route::get('/city_activity_per_item', 'cityActivityPerItem')->name('cityActivityPerItem');
Route::get('/map', 'map')->name('map');
Route::get('/country_activity_excel_per_item', 'countryActivityExcelPerItem')->name('countryActivityExcelPerItem');
Route::get('/province_activity_excel_per_item', 'provinceActivityExcelPerItem')->name('provinceActivityExcelPerItem');
Route::get('/country_activity_excel_per_sub_item', 'countryActivityExcelPerSubItem')->name('countryActivityExcelPerSubItem');
Route::get('/province_activity_excel_per_sub_item', 'provinceActivityExcelPerSubItem')->name('provinceActivityExcelPerSubItem');
});
Route::prefix('road_patrol_reports')