diff --git a/app/Exports/V3/Damage/DamageCartableReport.php b/app/Exports/V3/Damage/DamageCartableReport.php
new file mode 100644
index 00000000..dac30525
--- /dev/null
+++ b/app/Exports/V3/Damage/DamageCartableReport.php
@@ -0,0 +1,67 @@
+ $this->data
+ ]);
+ }
+
+ public function registerEvents(): array
+ {
+ return [
+ AfterSheet::class => function (AfterSheet $event) {
+ $event->sheet->getDelegate()->setRightToLeft(true);
+ $event->sheet->getDelegate()->getStyle('A:U')->getFont()->setName('Arial');
+ $event->sheet->getDelegate()->getStyle('A:U')
+ ->getAlignment()
+ ->setHorizontal(Alignment::HORIZONTAL_CENTER);
+
+ $event->sheet->getDelegate()->getStyle('A:U')
+ ->getAlignment()
+ ->setVertical(Alignment::VERTICAL_CENTER);
+ }
+ ];
+ }
+
+ 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('f1');
+ return [$drawing, $drawing2];
+ }
+}
\ No newline at end of file
diff --git a/app/Exports/V3/RoadObservation/CountryCartableReport.php b/app/Exports/V3/RoadObservation/CountryCartableReport.php
new file mode 100644
index 00000000..e46a48ac
--- /dev/null
+++ b/app/Exports/V3/RoadObservation/CountryCartableReport.php
@@ -0,0 +1,70 @@
+ $this->data,
+ ]);
+ }
+
+ public function registerEvents(): array
+ {
+ return [
+ AfterSheet::class => function (AfterSheet $event) {
+ $event->sheet->getDelegate()->setRightToLeft(true);
+ $event->sheet->getDelegate()->getStyle('A:U')->getFont()->setName('Arial');
+ $event->sheet->getDelegate()->getStyle('A:U')
+ ->getAlignment()
+ ->setHorizontal(Alignment::HORIZONTAL_CENTER);
+
+ $event->sheet->getDelegate()->getStyle('A:U')
+ ->getAlignment()
+ ->setVertical(Alignment::VERTICAL_CENTER);
+ }
+ ];
+ }
+
+ 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('j1');
+ return [$drawing, $drawing2];
+ }
+
+}
diff --git a/app/Exports/V3/RoadObservation/ProvinceCartableReport.php b/app/Exports/V3/RoadObservation/ProvinceCartableReport.php
new file mode 100644
index 00000000..57daad87
--- /dev/null
+++ b/app/Exports/V3/RoadObservation/ProvinceCartableReport.php
@@ -0,0 +1,70 @@
+ $this->data,
+ ]);
+ }
+
+ public function registerEvents(): array
+ {
+ return [
+ AfterSheet::class => function (AfterSheet $event) {
+ $event->sheet->getDelegate()->setRightToLeft(true);
+ $event->sheet->getDelegate()->getStyle('A:U')->getFont()->setName('Arial');
+ $event->sheet->getDelegate()->getStyle('A:U')
+ ->getAlignment()
+ ->setHorizontal(Alignment::HORIZONTAL_CENTER);
+
+ $event->sheet->getDelegate()->getStyle('A:U')
+ ->getAlignment()
+ ->setVertical(Alignment::VERTICAL_CENTER);
+ }
+ ];
+ }
+
+ 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('j1');
+ return [$drawing, $drawing2];
+ }
+
+}
diff --git a/app/Http/Controllers/V3/DamageManagementController.php b/app/Http/Controllers/V3/DamageManagementController.php
index 53047e18..fe8a1b4e 100644
--- a/app/Http/Controllers/V3/DamageManagementController.php
+++ b/app/Http/Controllers/V3/DamageManagementController.php
@@ -2,14 +2,19 @@
namespace App\Http\Controllers\V3;
+use App\Exports\V3\Damage\DamageCartableReport;
use App\Facades\DataTable\DataTableFacade;
use App\Http\Controllers\Controller;
use App\Http\Requests\V3\Damage\StoreRequest;
use App\Http\Requests\V3\Damage\UpdateRequest;
use App\Http\Traits\ApiResponse;
use App\Models\Damage;
+use App\Services\Cartables\Damage\DamageService;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
+use Maatwebsite\Excel\Excel;
+use PhpOffice\PhpSpreadsheet\Exception;
+use Symfony\Component\HttpFoundation\BinaryFileResponse;
class DamageManagementController extends Controller
{
@@ -17,20 +22,9 @@ class DamageManagementController extends Controller
/**
* Display a listing of the resource.
*/
- public function index(Request $request): JsonResponse
+ public function index(Request $request ,DamageService $damageService): JsonResponse
{
- $allowedFilters = ['*'];
- $allowedSortings = ['*'];
-
- $query = Damage::query();
-
- $data = DataTableFacade::run(
- $query,
- $request,
- allowedFilters: $allowedFilters,
- allowedSortings: $allowedSortings);
-
-
+ $data = $damageService->dataTable($request);
return response()->json($data);
}
@@ -71,7 +65,6 @@ class DamageManagementController extends Controller
*/
public function update(UpdateRequest $request, Damage $damage): JsonResponse
-
{
$damage->update([
'title' => $request->title,
@@ -92,4 +85,15 @@ class DamageManagementController extends Controller
return $this->successResponse();
}
+
+ /**
+ * @throws Exception
+ * @throws \PhpOffice\PhpSpreadsheet\Writer\Exception
+ */
+ public function excel(Request $request, DamageService $damageService): BinaryFileResponse
+ {
+ $name = 'آیتم خسارات وارده بر ابنیه فنی' . verta()->now()->format('Y-m-d H-i') . '.xlsx';
+ $data = $damageService->datatable($request);
+ return Excel::download(new DamageCartableReport($data['data']), $name);
+ }
}
diff --git a/app/Http/Controllers/V3/Dashboard/RoadObservation/ReportController.php b/app/Http/Controllers/V3/Dashboard/RoadObservation/ReportController.php
index db11136c..bd401ecf 100644
--- a/app/Http/Controllers/V3/Dashboard/RoadObservation/ReportController.php
+++ b/app/Http/Controllers/V3/Dashboard/RoadObservation/ReportController.php
@@ -3,10 +3,14 @@
namespace App\Http\Controllers\V3\Dashboard\RoadObservation;
use App\Exports\V2\RoadObservation\ReportComplaintsExport;
+use App\Exports\V3\RoadObservation\CountryCartableReport;
+use App\Exports\V3\RoadObservation\ProvinceCartableReport;
use App\Facades\DataTable\DataTableFacade;
use App\Http\Traits\ApiResponse;
+use App\Models\EdarateShahri;
use App\Models\RoadObserved;
use App\Services\Cartables\RoadObservation\ReportService;
+use App\Services\Cartables\SafetyAndPrivacy\OperatorService;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Maatwebsite\Excel\Facades\Excel;
@@ -39,4 +43,39 @@ class ReportController
allowedSelects: ['id', 'lat', 'lng', 'status']
));
}
-}
\ No newline at end of file
+
+ public function countryActivity(Request $request, ReportService $reportService): JsonResponse
+ {
+
+ $data = $reportService->countryActivity($request);
+ return response()->json($data['data']);
+ }
+
+ public function provinceActivity(Request $request, ReportService $reportService): JsonResponse
+ {
+
+ $data = $reportService->provinceActivity(
+ province_id: $request->input('province_id')
+ );
+
+ return $this->successResponse([
+ 'activities' => $data,
+ 'edarateShahri' => EdarateShahri::where('province_id', $request->province_id)->get(['id', 'name_fa']),
+ ]);
+ }
+ public function countryActivityExcel(Request $request, OperatorService $operatorService): BinaryFileResponse
+ {
+ $data = $operatorService->countryActivity();
+ $name = 'گزارش رسیدگی به شکایات واکنش سریع' . verta()->now()->format('Y-m-d H-i') . '.xlsx';
+ return Excel::download(new CountryCartableReport($data), $name);
+ }
+
+ public function provinceActivityExcel(Request $request, OperatorService $operatorService): BinaryFileResponse
+ {
+ $data = $operatorService->provinceActivity(
+ province_id: $request->input('province_id')
+ );
+ $name = 'گزارش رسیدگی به شکایات واکنش سریع' . verta()->now()->format('Y-m-d H-i') . '.xlsx';
+ return Excel::download(new ProvinceCartableReport($data, $request), $name);
+ }
+}
diff --git a/app/Services/Cartables/Damage/DamageService.php b/app/Services/Cartables/Damage/DamageService.php
new file mode 100644
index 00000000..64578a38
--- /dev/null
+++ b/app/Services/Cartables/Damage/DamageService.php
@@ -0,0 +1,24 @@
+ $toDate,
];
}
+ public function countryActivity(Request $request): array
+ {
+ return DB::select("
+ SELECT
+ p.id AS province_id,
+ p.name_fa AS province_name,
+ SUM(t.rms_status = 0 ) AS residegiShode,
+ SUM(t.rms_status = 1 ) AS egdamshode,
+ SUM(t.rms_status = 2) AS egdamnashodeh,
+ SUM(t.status = 0 ) AS darhalbarasi,
+ SUM(t.status = 1 ) AS taayidshode,
+ SUM(t.status = 2 ) AS adamtaayid,
+ SUM(t.rms_status = 0 ) + SUM(t.rms_status = 1) + SUM(t.rms_status = 2) AS total
+ FROM
+ provinces p
+ LEFT JOIN
+
+ road_observeds t ON t.province_id = p.id
+ GROUP BY
+ p.id, p.name_fa
+
+ UNION ALL
+
+ SELECT
+ -1 AS province_id,
+ 'کل کشور' AS province_name,
+ SUM(t.rms_status = 0 ) AS residegiShode,
+ SUM(t.rms_status = 1 ) AS egdamshode,
+ SUM(t.rms_status = 2) AS egdamnashodeh,
+ SUM(t.status = 0 ) AS darhalbarasi,
+ SUM(t.status = 1 ) AS taayidshode,
+ SUM(t.status = 2 ) AS adamtaayid,
+ SUM(t.rms_status = 0 ) + SUM(t.rms_status = 1) + SUM(t.rms_status = 2) AS total
+ FROM
+ provinces p
+ LEFT JOIN
+
+ road_observeds t ON t.province_id = p.id
+ ORDER BY
+ province_id
+ ");
+ }
+
+ public function provinceActivity(int $province_id): array
+ {
+ return DB::select("
+ SELECT
+ e.id AS edare_id,
+ e.name_fa AS edare_name,
+ COALESCE(SUM(t.rms_status = 0 ),0) AS residegiShode,
+ COALESCE(SUM(t.rms_status = 1),0) AS egdamshode,
+ COALESCE(SUM(t.rms_status = 2),0) AS egdamnashodeh,
+ COALESCE(SUM(t.status = 0 ),0) AS darhalbarasi,
+ COALESCE(SUM(t.status = 1 ),0) AS taayidshode,
+ COALESCE(SUM(t.status = 2 ),0) AS adamtaayid,
+ COALESCE(SUM(t.rms_status = 0 ) + SUM(t.rms_status = 1) + SUM(t.rms_status = 2),0)AS total
+ FROM
+ edarate_shahri e
+ LEFT JOIN
+ road_observeds t ON t.edarate_shahri_id = e.id AND t.province_id = e.province_id
+ WHERE
+ e.province_id = :provinceId
+ GROUP BY
+ e.id, e.name_fa
+
+ UNION ALL
+
+ SELECT
+ -1 AS edare_id,
+ 'کل استان' AS edare_name,
+ COALESCE(SUM(t.rms_status = 0 ),0) AS residegiShode,
+ COALESCE(SUM(t.rms_status = 1),0) AS egdamshode,
+ COALESCE(SUM(t.rms_status = 2),0) AS egdamnashodeh,
+ COALESCE(SUM(t.status = 0 ),0) AS darhalbarasi,
+ COALESCE(SUM(t.status = 1 ),0) AS taayidshode,
+ COALESCE(SUM(t.status = 2 ),0) AS adamtaayid,
+ COALESCE(SUM(t.rms_status = 0 ) + SUM(t.rms_status = 1) + SUM(t.rms_status = 2),0)AS total
+ FROM
+ edarate_shahri e
+ LEFT JOIN
+ road_observeds t ON t.edarate_shahri_id = e.id AND t.province_id = e.province_id
+ WHERE
+ e.province_id = :provinceId
+ ORDER BY
+ edare_id
+ ", [
+ 'provinceId' => $province_id,
+ ]);
+ }
+
}
\ No newline at end of file
diff --git a/database/migrations/2025_09_08_104123_add_mission_id_to_road_items_projects_table.php b/database/migrations/2025_09_08_104123_add_mission_id_to_road_items_projects_table.php
index 62d511c4..e874b73e 100644
--- a/database/migrations/2025_09_08_104123_add_mission_id_to_road_items_projects_table.php
+++ b/database/migrations/2025_09_08_104123_add_mission_id_to_road_items_projects_table.php
@@ -12,7 +12,7 @@ return new class extends Migration
public function up(): void
{
Schema::table('road_items_projects', function (Blueprint $table) {
- $table->foreignId('mission_id')->nullable()->constrained('missions');
+ $table->unsignedBigInteger('mission_id')->nullable();
});
}
@@ -22,7 +22,6 @@ return new class extends Migration
public function down(): void
{
Schema::table('road_items_projects', function (Blueprint $table) {
- $table->dropForeign('road_items_projects_mission_id_foreign');
$table->dropColumn('mission_id');
});
}
diff --git a/resources/views/v3/Reports/Damage/DamageCartableReport.blade.php b/resources/views/v3/Reports/Damage/DamageCartableReport.blade.php
new file mode 100644
index 00000000..0219c627
--- /dev/null
+++ b/resources/views/v3/Reports/Damage/DamageCartableReport.blade.php
@@ -0,0 +1,77 @@
+
+
+
+
+
+
+
+ مدریت سامانه
+
+
+
+
+
+
+
+
+
+ |
+ تاریخ دریافت گزارش: {{ verta()->now()->format('Y/m/d H:i') }}
+ |
+
+
+ |
+ |
+
+
+ |
+ آیتم خسارت وارده بر ابنیه فنی
+ |
+
+
+ | کد
+ یکتا |
+
+ عنوان |
+
+ واحد |
+
+ فی(ریال) |
+
+ وضعیت |
+
+ بروزرسانی |
+
+
+
+
+ @foreach ($data as $item)
+
+ | {{ $item['id'] ?? '-' }} |
+ {{ $item['title'] ?? '-' }} |
+ {{ $item['unit'] ?? '-' }} |
+ {{ $item['base_price'] ?? '-' }} |
+ {{ $item['status'] ?? '-' }} |
+ {{ $item['update_time'] ?? '-' }} |
+
+ @endforeach
+
+
+
+
+
diff --git a/resources/views/v3/Reports/RoadObservation/CountryReport.blade.php b/resources/views/v3/Reports/RoadObservation/CountryReport.blade.php
new file mode 100644
index 00000000..55ee1ea9
--- /dev/null
+++ b/resources/views/v3/Reports/RoadObservation/CountryReport.blade.php
@@ -0,0 +1,68 @@
+
+
+
+
+
+
+
+ گزارش واکنش سریع
+
+
+
+
+
+
+
+
+
+ |
+ تاریخ دریافت گزارش: {{ verta()->now()->format('Y/m/d H:i') }}
+ |
+
+
+ |
+ |
+
+
+ |
+ گزارش رسیدگی به شکایات واکنش سریع
+ |
+
+
+ | کد یکتا |
+ جمع کل |
+ رسیدگی نشده |
+ اقدام شده |
+ اقدام نشده |
+ درحال بررسی |
+ تائید شده |
+ عدم تائید |
+
+
+
+
+ @foreach ($data as $item)
+
+ | {{ $item['id'] ?? '-' }} |
+ {{ $item['total'] ?? '-' }} |
+ {{ $item['resideginaShode'] ?? '-' }} |
+ {{ $item['egdamshode'] ?? '-' }} |
+ {{ $item['egdamnashodeh'] ?? '-' }} |
+ {{ $item['darhalbarasi'] ?? '-' }} |
+ {{ $item['taayidshode'] ?? '-' }} |
+ {{ $item['adamtaayid'] ?? '-' }} |
+
+ @endforeach
+
+
+
+
diff --git a/resources/views/v3/Reports/RoadObservation/ProvinceReport.blade.php b/resources/views/v3/Reports/RoadObservation/ProvinceReport.blade.php
new file mode 100644
index 00000000..a8eb7e03
--- /dev/null
+++ b/resources/views/v3/Reports/RoadObservation/ProvinceReport.blade.php
@@ -0,0 +1,68 @@
+
+
+
+
+
+
+
+ گزارش واکنش سریع
+
+
+
+
+
+
+
+
+
+ |
+ تاریخ دریافت گزارش: {{ verta()->now()->format('Y/m/d H:i') }}
+ |
+
+
+ |
+ |
+
+
+ |
+ گزارش رسیدگی به شکایات واکنش سریع
+ |
+
+
+ | کد یکتا |
+ جمع کل |
+ رسیدگی نشده |
+ اقدام شده |
+ اقدام نشده |
+ درحال بررسی |
+ تائید شده |
+ عدم تائید |
+
+
+
+
+ @foreach ($data as $item)
+
+ | {{ $item['id'] ?? '-' }} |
+ {{ $item['total'] ?? '-' }} |
+ {{ $item['resideginaShode'] ?? '-' }} |
+ {{ $item['egdamshode'] ?? '-' }} |
+ {{ $item['egdamnashodeh'] ?? '-' }} |
+ {{ $item['darhalbarasi'] ?? '-' }} |
+ {{ $item['taayidshode'] ?? '-' }} |
+ {{ $item['adamtaayid'] ?? '-' }} |
+
+ @endforeach
+
+
+
+
diff --git a/routes/v3.php b/routes/v3.php
index 8a0bebed..9e753f83 100644
--- a/routes/v3.php
+++ b/routes/v3.php
@@ -273,6 +273,7 @@ Route::prefix('damages')
Route::get('/{damage}', 'show')->name('show');
Route::post('/{damage}', 'update')->name('update');
Route::post('/activate/{damage}', 'activate')->name('activate');
+ Route::get('/excel', 'excel')->name('excel');
});
Route::prefix('receipts')
@@ -350,6 +351,10 @@ Route::prefix('road_observations')
Route::get('/index', 'index')->name('index')->middleware('permission:show-fast-react-province|show-fast-react');
Route::get('/excel', 'excel')->name('excel')->middleware('permission:show-fast-react-province|show-fast-react');
Route::get('/map', 'map')->name('map');
+ Route::get('/country_activity', 'countryActivity')->name('countryActivity');
+ Route::get('/province_activity', 'provinceActivity')->name('provinceActivity');
+ Route::get('/country_activity_excels', 'countryActivityExcel')->name('countryExcelActivity');
+ Route::get('/province_activity_excel', 'provinceActivityExcel')->name('provinceExcelActivity');
});
});