diff --git a/app/Console/Commands/SendRoadObservationToNikarayanCommand.php b/app/Console/Commands/SendRoadObservationToNikarayanCommand.php
new file mode 100644
index 00000000..224c0acd
--- /dev/null
+++ b/app/Console/Commands/SendRoadObservationToNikarayanCommand.php
@@ -0,0 +1,54 @@
+info("Dispatching jobs with a delay between each...");
+
+ DB::transaction(function () use ($count) {
+ $delay = 0;
+ RoadObserved::query()
+ ->whereBetween('StartTime_DateTime_fa', ['1403-01-01 00:00:00', '1403-07-13 23:59:59'])
+ ->where('rms_status', '=', 0)
+ ->chunkById(50, function ($roads) use ($delay, $count) {
+ foreach ($roads as $road) {
+ $road->update(['rms_status' => 1]);
+ SendRoadObservationToNikarayan::dispatch($road)->delay(now()->addMinutes(10)->addSeconds($delay));
+ Log::channel('road_observation_problem')->info("Job for Road Observed ID {$road->id} scheduled with a {$delay} seconds delay.");
+ $this->info("Scheduled job for Road ID: {$road->id} {$delay}s");
+ $delay += 3;
+ $count +=1;
+ }
+ });
+ });
+
+ $this->info("{$count} item's sent successfully");
+ }
+}
diff --git a/app/Exports/V3/RoadItemsProjects/CountryActivityPerItemReport.php b/app/Exports/V3/RoadItemsProjects/CountryActivityPerItemReport.php
new file mode 100644
index 00000000..60261c20
--- /dev/null
+++ b/app/Exports/V3/RoadItemsProjects/CountryActivityPerItemReport.php
@@ -0,0 +1,75 @@
+data;
+
+ return view('v3.Reports.RoadItems.CountryActivityPerItem', [
+ 'data' => $data['activities']['data'],
+ 'provinces' => $data['provinces'],
+ 'items' => $data['items'],
+ 'fromDate' => $data['activities']['fromDate'],
+ 'toDate' => $data['activities']['toDate']
+ ]);
+ }
+
+ 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('q1');
+ return [$drawing, $drawing2];
+ }
+}
\ No newline at end of file
diff --git a/app/Exports/V3/RoadItemsProjects/CountryActivityPerSubItemReport.php b/app/Exports/V3/RoadItemsProjects/CountryActivityPerSubItemReport.php
new file mode 100644
index 00000000..7e383bdf
--- /dev/null
+++ b/app/Exports/V3/RoadItemsProjects/CountryActivityPerSubItemReport.php
@@ -0,0 +1,71 @@
+data;
+
+ return view('v3.Reports.RoadItems.CountryActivityPerSubItem', [
+ 'data' => $data['activities']['data'],
+ 'provinces' => $data['provinces'],
+ 'subItems' => $data['subItems'],
+ 'fromDate' => $data['activities']['fromDate'],
+ 'toDate' => $data['activities']['toDate']
+ ]);
+ }
+
+ 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('q1');
+ return [$drawing, $drawing2];
+ }
+}
\ No newline at end of file
diff --git a/app/Exports/V3/RoadItemsProjects/OperatorCartableReport.php b/app/Exports/V3/RoadItemsProjects/OperatorCartableReport.php
new file mode 100644
index 00000000..ea736dd2
--- /dev/null
+++ b/app/Exports/V3/RoadItemsProjects/OperatorCartableReport.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('q1');
+ return [$drawing, $drawing2];
+ }
+}
\ No newline at end of file
diff --git a/app/Exports/V3/RoadItemsProjects/ProvinceActivityPerItemReport.php b/app/Exports/V3/RoadItemsProjects/ProvinceActivityPerItemReport.php
new file mode 100644
index 00000000..9b7b33d0
--- /dev/null
+++ b/app/Exports/V3/RoadItemsProjects/ProvinceActivityPerItemReport.php
@@ -0,0 +1,75 @@
+data;
+
+ return view('v3.Reports.RoadItems.ProvinceActivityPerItem', [
+ 'data' => $data['activities']['data'],
+ 'edarateShahri' => $data['edarateShahri'],
+ 'items' => $data['items'],
+ 'fromDate' => $data['activities']['fromDate'],
+ 'toDate' => $data['activities']['toDate']
+ ]);
+ }
+
+ 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('q1');
+ return [$drawing, $drawing2];
+ }
+}
\ No newline at end of file
diff --git a/app/Exports/V3/RoadItemsProjects/ProvinceActivityPerSubItemReport.php b/app/Exports/V3/RoadItemsProjects/ProvinceActivityPerSubItemReport.php
new file mode 100644
index 00000000..32faa0de
--- /dev/null
+++ b/app/Exports/V3/RoadItemsProjects/ProvinceActivityPerSubItemReport.php
@@ -0,0 +1,76 @@
+data;
+
+ return view('v3.Reports.RoadItems.ProvinceActivityPerSubItem', [
+ 'data' => $data['activities']['data'],
+ 'edarateShahri' => $data['edarateShahri'],
+ 'subItems' => $data['subItems'],
+ 'fromDate' => $data['activities']['fromDate'],
+ 'toDate' => $data['activities']['toDate']
+ ]);
+ }
+
+ 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('q1');
+ return [$drawing, $drawing2];
+ }
+}
\ No newline at end of file
diff --git a/app/Exports/V3/RoadItemsProjects/SupervisorCartableReport.php b/app/Exports/V3/RoadItemsProjects/SupervisorCartableReport.php
new file mode 100644
index 00000000..d559cf50
--- /dev/null
+++ b/app/Exports/V3/RoadItemsProjects/SupervisorCartableReport.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('q1');
+ return [$drawing, $drawing2];
+ }
+}
\ No newline at end of file
diff --git a/app/Exports/V3/RoadPatrols/CountryActivity.php b/app/Exports/V3/RoadPatrols/CountryActivity.php
new file mode 100644
index 00000000..dd328cc1
--- /dev/null
+++ b/app/Exports/V3/RoadPatrols/CountryActivity.php
@@ -0,0 +1,71 @@
+activities;
+
+ return view('v3.Reports.RoadPatrols.CountryActivity', [
+ 'activities' => $activities["activities"]['data'],
+ 'provinces' => $activities["provinces"],
+ 'fromDate' => $activities["activities"]["fromDate"],
+ 'toDate' => $activities["activities"]["toDate"]
+ ]);
+ }
+
+ 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('q1');
+ return [$drawing, $drawing2];
+ }
+}
\ No newline at end of file
diff --git a/app/Exports/V3/RoadPatrols/OperatorCartableReport.php b/app/Exports/V3/RoadPatrols/OperatorCartableReport.php
new file mode 100644
index 00000000..769044e3
--- /dev/null
+++ b/app/Exports/V3/RoadPatrols/OperatorCartableReport.php
@@ -0,0 +1,69 @@
+data;
+
+ return view('v3.Reports.RoadPatrols.OperatorCartableReport', [
+ 'data' => $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('i1');
+ return [$drawing, $drawing2];
+ }
+}
\ No newline at end of file
diff --git a/app/Exports/V3/RoadPatrols/ProvinceActivity.php b/app/Exports/V3/RoadPatrols/ProvinceActivity.php
new file mode 100644
index 00000000..4118fd19
--- /dev/null
+++ b/app/Exports/V3/RoadPatrols/ProvinceActivity.php
@@ -0,0 +1,71 @@
+activities;
+
+ return view('v3.Reports.RoadPatrols.ProvinceActivity', [
+ 'activities' => $activities["activities"]['data'],
+ 'edarateShahri' => $activities["edarateShahri"],
+ 'fromDate' => $activities["activities"]["fromDate"],
+ 'toDate' => $activities["activities"]["toDate"]
+ ]);
+ }
+
+ 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('q1');
+ return [$drawing, $drawing2];
+ }
+}
\ No newline at end of file
diff --git a/app/Exports/V3/RoadPatrols/SupervisorCartableReport.php b/app/Exports/V3/RoadPatrols/SupervisorCartableReport.php
new file mode 100644
index 00000000..b4e67b7a
--- /dev/null
+++ b/app/Exports/V3/RoadPatrols/SupervisorCartableReport.php
@@ -0,0 +1,69 @@
+data;
+
+ return view('v3.Reports.RoadPatrols.SupervisorCartableReport', [
+ 'data' => $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('i1');
+ return [$drawing, $drawing2];
+ }
+}
\ No newline at end of file
diff --git a/app/Http/Controllers/DevelopController.php b/app/Http/Controllers/DevelopController.php
index 9fa55bde..d7eaec3e 100644
--- a/app/Http/Controllers/DevelopController.php
+++ b/app/Http/Controllers/DevelopController.php
@@ -658,7 +658,7 @@ class DevelopController extends Controller
$save = $file->move(storage_path('images'), $fileName);
- \App\Helpers\Compress::resize($save);
+// \App\Helpers\Compress::resize($save);
return response()->json(['msg' => 'ok']);
}
diff --git a/app/Http/Controllers/RoadItemsProjectController.php b/app/Http/Controllers/RoadItemsProjectController.php
index ff774208..502f8ad1 100644
--- a/app/Http/Controllers/RoadItemsProjectController.php
+++ b/app/Http/Controllers/RoadItemsProjectController.php
@@ -154,13 +154,13 @@ class RoadItemsProjectController extends Controller
$after = $request->file('after_image')->store('road_items_projects_new/after', 'public');
$roadItems->files()->create(['path' => $after]);
$urlAfter = "/var/www/rms/public/storage/{$after}";
- \App\Helpers\Compress::resize($urlAfter);
+// \App\Helpers\Compress::resize($urlAfter);
}
if ($request->has('before_image')) {
$before = $request->file('before_image')->store('/road_items_projects_new/before', 'public');
$roadItems->files()->create(['path' => $before]);
$urlBefore = "/var/www/rms/public/storage/{$before}";
- \App\Helpers\Compress::resize($urlBefore);
+// \App\Helpers\Compress::resize($urlBefore);
}
if (auth()->user()) {
diff --git a/app/Http/Controllers/V2/Dashboard/RoadItemsProjectController.php b/app/Http/Controllers/V2/Dashboard/RoadItemsProjectController.php
index 445db4ad..e6e8e907 100644
--- a/app/Http/Controllers/V2/Dashboard/RoadItemsProjectController.php
+++ b/app/Http/Controllers/V2/Dashboard/RoadItemsProjectController.php
@@ -372,7 +372,7 @@ class RoadItemsProjectController extends Controller
]);
// $road_item->files()->create(['path' => $after]);
$urlAfter = "/var/www/rms/public/storage/{$after}";
- \App\Helpers\Compress::resize($urlAfter);
+// \App\Helpers\Compress::resize($urlAfter);
}
if ($request->has('before_image')) {
Storage::delete('public/'. $road_item->files[1]->path);
@@ -383,7 +383,7 @@ class RoadItemsProjectController extends Controller
]);
// $road_item->files()->create(['path' => $before]);
$urlBefore = "/var/www/rms/public/storage/{$before}";
- \App\Helpers\Compress::resize($urlBefore);
+// \App\Helpers\Compress::resize($urlBefore);
}
}
diff --git a/app/Http/Controllers/V3/Dashboard/ReceiptController.php b/app/Http/Controllers/V3/Dashboard/ReceiptController.php
new file mode 100644
index 00000000..0e9ad4dd
--- /dev/null
+++ b/app/Http/Controllers/V3/Dashboard/ReceiptController.php
@@ -0,0 +1,131 @@
+user();
+ $query = null;
+
+ if ($user->hasPermissionTo('show-receipt')) {
+ $query = Accident::with('damages');
+ } else {
+ if (is_null($user->province_id)) {
+ return $this->errorResponse('استانی برای شما در سامانه ثبت نشده است!');
+ }
+
+ $query = Accident::with('damages')->where('province_id', '=', $user->province_id);
+ }
+
+ $data = DataTableFacade::run(
+ $query,
+ $request,
+ allowedFilters: $allowedFilters,
+ allowedSortings: $allowedSortings
+ );
+
+
+ $user->addActivityComplete(1122);
+
+ return $this->successResponse($data);
+ }
+
+ public function store(Request $request, NominatimService $nominatimService)
+ {
+ DB::transaction(function () use ($request, $nominatimService) {
+
+ $province = Province::query()->where('id', '=', $request->province_id)->first();
+ $city = City::query()->where('id', '=', $request->city_id)->first();
+
+ $accident = [
+ 'province_id' => $province->id,
+ 'province_fa' => $province->name_fa,
+ 'city_id' => $city->id,
+ 'city_fa' => $city->name_fa,
+ 'axis_name' => $request->axis_name,
+ 'driver_name' => $request->driver_name,
+ 'plaque' => $request->plaque,
+ 'driver_national_code' => $request->driver_national_code,
+ 'driver_phone_number' => $request->driver_phone_number,
+ 'user_id' => auth()->user()->id,
+ 'lat' => $request->lat,
+ 'lng' => $request->lng,
+ 'accident_type' => $request->accident_type,
+ 'accident_date' => $request->accident_date,
+ 'accident_time' => $request->accident_time,
+ 'accident_type_fa' => DailyAccidentSettings::where('type', 'accident_type')->where('name', $request->accident_type)->first()->value,
+ 'way_id' => $nominatimService->get_way_id_from_nominatim($request->lat, $request->lng),
+ ];
+
+ if ($request->report_base) {
+ $accident['report_base'] = 1;
+ } else {
+ $accident['police_file'] = $request->file('police_file')->storeAs('receipts_files/'.$accident->id, 'police_file_'.$accident->id.'_'.time().'.'.$request->file('police_file')->extension(), 'public');
+ $accident['police_serial'] = $request->police_serial;
+ $accident['police_file_date'] = $request->police_file_date;
+ $accident['report_base'] = 0;
+ }
+
+ if ($request->has('damage_picture1')) {
+ $new_accident->damage_picture1 = $request->file('damage_picture1')->storeAs('receipts_files/'.$new_accident->id, 'damage_picture1_'.$new_accident->id.'_'.time().'.'.$request->file('damage_picture1')->extension(), 'public');
+ }
+
+ if ($request->has('damage_picture2')) {
+ $new_accident->damage_picture2 = $request->file('damage_picture2')->storeAs('receipts_files/'.$new_accident->id, 'damage_picture2_'.$new_accident->id.'_'.time().'.'.$request->file('damage_picture2')->extension(), 'public');
+ }
+
+ $new_accident->save();
+ $sum = 0;
+ foreach (json_decode($request->items_damge) as $key => $item) {
+ $damage = Damage::find($item->id);
+ $new_accident->damages()->attach($item->id, [
+ 'value' => $item->value,
+ 'unit' => $damage->unit,
+ 'amount' => $item->amount,
+ ]);
+ $sum += $item->amount;
+ }
+
+ $ojrate_nasb = $sum/100*20;
+ $new_accident->ojrate_nasb = $ojrate_nasb;
+
+ $sum += $ojrate_nasb;
+ $new_accident->sum = $sum;
+ $new_accident->withoutAction();
+ $new_accident->save();
+ $msg = "درخواست شما بابت پرداخت خسارت وارده به ابنیه فنی و تاسیسات راه با کد یکتا ".$new_accident->id." ثبت شد.\n".verta()->now()->format('Y/m/d H:i') ;
+ Sms::sendSms($request->phone_number, $msg);
+ auth()->user()->addActivityComplete(1123);
+ });
+ }
+}
diff --git a/app/Http/Controllers/V3/Dashboard/Reports/RoadItemsReportController.php b/app/Http/Controllers/V3/Dashboard/Reports/RoadItemsReportController.php
index 5c0d789c..70d15be0 100644
--- a/app/Http/Controllers/V3/Dashboard/Reports/RoadItemsReportController.php
+++ b/app/Http/Controllers/V3/Dashboard/Reports/RoadItemsReportController.php
@@ -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;
@@ -28,234 +32,147 @@ class RoadItemsReportController extends Controller
]);
}
- public function provinceActivityPerSubItem(Request $request): JsonResponse
+ public function countryActivityPerSubItem(Request $request, RoadItemReportService $roadItemReportService): JsonResponse
{
- $fromDate = $request->from_date ? $request->from_date . ' 00:00:00' : now()->startOfDay()->toDateTimeString();
- $toDate = $request->date_to ? $request->date_to . ' 23:59:59' : now()->endOfDay()->toDateTimeString();
- $item = $request->item;
-
- $provinceRoadItemsPerSubItem = RoadItemsProject::query()->selectRaw('
- sub_item AS t,
- COUNT(*) AS c,
- CAST(SUM(CASE WHEN sub_item_data > 0 THEN sub_item_data ELSE ABS(sub_item_data) END) AS UNSIGNED) AS s,
- province_id AS p')
- ->where('item', '=', $item)
- ->whereBetween('activity_date_time', [$fromDate, $toDate])
- ->where('status', '=', 1)
- ->groupBy('province_id', 'sub_item')
- ->get();
-
- $countryRoadItemsPerSubItem = RoadItemsProject::query()->selectRaw('
- sub_item AS t,
- COUNT(*) AS c,
- CAST(SUM(CASE WHEN sub_item_data > 0 THEN sub_item_data ELSE ABS(sub_item_data) END) AS UNSIGNED) AS s,
- -1 AS p')
- ->where('item', '=', $item)
- ->whereBetween('activity_date_time', [$fromDate, $toDate])
- ->where('status', '=', 1)
- ->groupBy('sub_item')
- ->get();
-
-
- $activities = $provinceRoadItemsPerSubItem->push(...$countryRoadItemsPerSubItem);
+ $activities = $roadItemReportService->countryActivityPerSubItem($request);
$provinces = Province::all(['id', 'name_fa']);
$subItems = InfoItem::query()
- ->where('item', $item)
+ ->where('item', $request->item)
->get(['id', 'item', 'item_str', 'sub_item_str', 'sub_item_unit', 'sub_item']);
return $this->successResponse([
- 'activities' => $activities,
+ 'activities' => $activities['data'],
'sub_items' => $subItems,
'provinces' => $provinces,
]);
}
- public function cityActivityPerSubItem(Request $request): JsonResponse
+ public function provinceActivityPerSubItem(Request $request, RoadItemReportService $roadItemReportService): JsonResponse
{
- $fromDate = $request->from_date ? $request->from_date . ' 00:00:00' : now()->startOfDay()->toDateTimeString();
- $toDate = $request->date_to ? $request->date_to . ' 23:59:59' : now()->endOfDay()->toDateTimeString();
- $item = $request->item;
- $province = $request->province_id;
+ $activities = $roadItemReportService->provinceActivityPerSubItem($request);
- $cityRoadItemsPerSubItem = RoadItemsProject::query()->selectRaw('
- sub_item AS t,
- COUNT(*) AS c,
- CAST(SUM(CASE WHEN sub_item_data > 0 THEN sub_item_data ELSE ABS(sub_item_data) END) AS UNSIGNED) AS s,
- province_id AS p,
- edarat_id AS ci
- ')
- ->where('item', '=', $item)
- ->where('province_id', '=', $province)
- ->whereBetween('activity_date_time', [$fromDate, $toDate])
- ->where('status', '=', 1)
- ->groupBy('edarat_id', 'sub_item')
- ->get();
+ $edarateShahri = EdarateShahri::query()->where('province_id', '=', $request->province_id)->get(['id', 'name_fa']);
- $provinceRoadItemsPerSubItem = RoadItemsProject::query()->selectRaw('
- sub_item AS t,
- COUNT(*) AS c,
- CAST(SUM(CASE WHEN sub_item_data > 0 THEN sub_item_data ELSE ABS(sub_item_data) END) AS UNSIGNED) AS s,
- province_id AS p,
- -1 AS ci
- ')
- ->where('item', '=', $item)
- ->where('province_id', '=', $province)
- ->whereBetween('activity_date_time', [$fromDate, $toDate])
- ->where('status', '=', 1)
- ->groupBy('sub_item')
- ->get();
-
-
- $edarateShahri = EdarateShahri::query()->where('province_id', '=', $province)->get(['id', 'name_fa']);
- $activities = $cityRoadItemsPerSubItem->push(...$provinceRoadItemsPerSubItem);
$subItems = InfoItem::query()
- ->where('item', $item)
+ ->where('item', $request->item)
->get(['id', 'item', 'item_str', 'sub_item_str', 'sub_item_unit', 'sub_item']);
return $this->successResponse([
- 'activities' => $activities,
+ 'activities' => $activities['data'],
'edarateShahri' => $edarateShahri,
'sub_items' => $subItems,
]);
}
- public function provinceActivityPerItem(Request $request): JsonResponse
+ public function countryActivityPerItem(Request $request, RoadItemReportService $roadItemReportService): JsonResponse
{
if (auth()->check()) {
auth()->user()->addActivityComplete(1033);
}
- $fromDate = $request->from_date ? $request->from_date . ' 00:00:00' : now()->startOfDay()->toDateTimeString();
- $toDate = $request->date_to ? $request->date_to . ' 23:59:59' : now()->endOfDay()->toDateTimeString();
- $user = auth()->user();
-// $isSpecialUser = in_array($user->username, ['witel', 'drdanesh']);
- $isSpecialUser = $user->hasPermissionTo("show-road-item-supervise-cartable");
- $provinceId = $isSpecialUser ? null : $user->province_id;
-
- $provinceActivity = RoadItemsProject::query()
- ->selectRaw('COUNT(*) AS s, province_id AS p, item AS i')
- ->where('status', 1)
- ->whereBetween('activity_date_time', [$fromDate, $toDate])
- ->when(!$isSpecialUser, function ($query) use ($provinceId) {
- $query->where('province_id', $provinceId);
- })
- ->groupBy('province_id', 'item');
-
- $countryActivity = RoadItemsProject::query()
- ->selectRaw('COUNT(*) AS s, -1 AS p, item AS i')
- ->where('status', 1)
- ->whereBetween('activity_date_time', [$fromDate, $toDate])
- ->when(!$isSpecialUser, function ($query) use ($provinceId) {
- $query->where('province_id', $provinceId);
- })
- ->groupBy('item');
-
- $activities = $provinceActivity
- ->unionAll($countryActivity)
- ->get();
-
+ $activities = $roadItemReportService->countryActivityPerItem($request);
$provinces = Province::all(['id', 'name_fa']);
return $this->successResponse([
- 'activities' => $activities,
+ 'activities' => $activities['data'],
'provinces' => $provinces,
]);
}
- public function cityActivityPerItem(Request $request): JsonResponse
+ public function provinceActivityPerItem(Request $request, RoadItemReportService $roadItemReportService): JsonResponse
{
- $provinceId = $request->province_id;
- $fromDate = $request->from_date ? $request->from_date . ' 00:00:00' : now()->startOfDay()->toDateTimeString();
- $toDate = $request->date_to ? $request->date_to . ' 23:59:59' : now()->endOfDay()->toDateTimeString();
-
- $edarehActivity = RoadItemsProject::query()
- ->selectRaw('
- COUNT(*) AS s,
- edarat_id AS c,
- item AS i')
- ->where('status', '=', 1)
- ->whereBetween('activity_date_time', [$fromDate, $toDate])
- ->where('province_id', $provinceId)
- ->groupBy('item', 'edarat_id');
-
- $cityActivity = RoadItemsProject::query()
- ->selectRaw('
- COUNT(*) AS s,
- -1 AS c,
- item AS i')
- ->where('status', '=', 1)
- ->whereBetween('activity_date_time', [$fromDate, $toDate])
- ->where('province_id', $provinceId)
- ->groupBy('item');
-
- $activities = $edarehActivity
- ->unionAll($cityActivity)
- ->get();
-
- $edarateShahri = EdarateShahri::query()->where('province_id', '=', $provinceId)->get(['id', 'name_fa']);
+ $activities = $roadItemReportService->provinceActivityPerItem($request);
+ $edarateShahri = EdarateShahri::query()->where('province_id', '=', $request->province_id)->get(['id', 'name_fa']);
return $this->successResponse([
- 'activities' => $activities,
+ 'activities' => $activities['data'],
'edarateShahri' => $edarateShahri,
]);
}
- public function map(Request $request): JsonResponse
+ public function countryActivityExcelPerItem(Request $request, RoadItemReportService $roadItemReportService): BinaryFileResponse
+ {
+ auth()->user()->addActivityComplete(1034);
+ $name = 'گزارش کشوری از فعالیت روزانه و جاری - جدول 1 ' . verta()->now()->format('Y-m-d H-i') . '.xlsx';
+ $activities = $roadItemReportService->countryActivityPerItem($request);
+ return Excel::download(new CountryActivityPerItemReport([
+ 'activities' => $activities,
+ 'provinces' => Province::all(['id', 'name_fa']),
+ 'items' => InfoItem::query()->distinct()->get(['item', 'item_str']),
+ ]), $name);
+ }
+
+ public function provinceActivityExcelPerItem(Request $request, RoadItemReportService $roadItemReportService): BinaryFileResponse
+ {
+ auth()->user()->addActivityComplete(1034);
+ $name = 'گزارش استانی از فعالیت روزانه و جاری - جدول 1 ' . verta()->now()->format('Y-m-d H-i') . '.xlsx';
+ $activities = $roadItemReportService->provinceActivityPerItem($request);
+ return Excel::download(new ProvinceActivityPerItemReport([
+ 'activities' => $activities,
+ 'edarateShahri' => EdarateShahri::query()->where('province_id', '=', $request->province_id)->get(['id', 'name_fa']),
+ 'items' => InfoItem::query()->distinct()->get(['item', 'item_str']),
+ ]), $name);
+ }
+
+ public function countryActivityExcelPerSubItem(Request $request, RoadItemReportService $roadItemReportService): BinaryFileResponse
+ {
+ auth()->user()->addActivityComplete(1034);
+ $name = "گزارش کشوری از فعالیت روزانه و جاری - جدول 2 " . verta()->now()->format('Y-m-d H-i') . '.xlsx';
+ $activities = $roadItemReportService->countryActivityPerSubItem($request);
+ $subItems = InfoItem::query()
+ ->where('item', $request->item)
+ ->get(['id', 'item', 'item_str', 'sub_item_str', 'sub_item_unit', 'sub_item']);
+
+ return Excel::download(new CountryActivityPerSubItemReport([
+ 'activities' => $activities,
+ 'provinces' => Province::all(['id', 'name_fa']),
+ 'subItems' => $subItems
+ ]), $name);
+ }
+
+ public function provinceActivityExcelPerSubItem(Request $request, RoadItemReportService $roadItemReportService): BinaryFileResponse
+ {
+ auth()->user()->addActivityComplete(1034);
+ $activities = $roadItemReportService->provinceActivityPerSubItem($request);
+ $name = "گزارش استانی از فعالیت روزانه و جاری - جدول 2 " . verta()->now()->format('Y-m-d H-i') . '.xlsx';
+ $subItems = InfoItem::query()
+ ->where('item', $request->item)
+ ->get(['id', 'item', 'item_str', 'sub_item_str', 'sub_item_unit', 'sub_item']);
+
+ return Excel::download(new ProvinceActivityPerSubItemReport([
+ 'activities' => $activities,
+ 'subItems' => $subItems,
+ 'edarateShahri' => EdarateShahri::query()->where('province_id', '=', $request->province_id)->get(['id', 'name_fa']),
+ ]), $name);
+ }
+
+ public function activitiesOnMap(Request $request): JsonResponse
{
$provinceId = $request->province_id;
$cityId = $request->city_id;
$subId = $request->sub_id;
$item = $request->item;
+ $status = $request->status;
$dateFrom = $request->date_from ? $request->date_from . ' 00:00:00' : now()->startOfDay()->toDateTimeString();
$dateTo = $request->date_to ? $request->date_to . ' 23:59:59' : now()->addDay()->startOfDay()->toDateTimeString();
$data = RoadItemsProject::query()
->where('is_new', '=', 1)
- ->when($provinceId, fn($query) => $query->where('province_id', '=', $provinceId))
- ->when($cityId, fn($query) => $query->where('city_id', '=', $cityId))
- ->when($subId, fn($query) => $query->where('sub_items', 'like', '%' . $subId . '%'))
- ->when($item, fn($query) => $query->where('item', '=', $item))
- ->when(!is_null($request->status), fn($query) => $query->where('status', '=', $request->status))
- ->whereBetween('activity_date', [$dateFrom, $dateTo])
+ ->when($provinceId, fn($query, $provinceId) => $query->where('road_items_projects.province_id', '=', $provinceId))
+ ->when($cityId, fn($query, $cityId) => $query->where('road_items_projects.city_id', '=', $cityId))
+ ->when($subId, fn($query, $subId) => $query->where('sub_items', 'like', '%' . $subId . '%'))
+ ->when($item, fn($query, $item) => $query->where('item', '=', $item))
+ ->when(!is_null($status), fn($query, $status) => $query->where('status', '=', $status))
->leftJoin('users', 'users.id', '=', 'road_items_projects.user_id')
+ ->whereBetween('road_items_projects.activity_date', [$dateFrom, $dateTo])
->select('road_items_projects.id as i', 'start_lat as l', 'start_lng as g', 'status')
->get();
return $this->successResponse($data);
}
- public function activityExcelPerItem(Request $request): BinaryFileResponse
+ public function showOnMap(RoadItemsProject $roadItemsProject): JsonResponse
{
- 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);
- }
-
- public function activityExcelPerSubItem(Request $request)
- {
- $url_correction = $request->province ? "&province={$request->province}" : "";
-
- 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),
- };
+ return $this->successResponse($roadItemsProject->load(['files', 'rahdaran:id,name,code', 'cmmsMachines:id,machine_code,car_name,plak_number']));
}
}
diff --git a/app/Http/Controllers/V3/Dashboard/Reports/RoadPatrolReportController.php b/app/Http/Controllers/V3/Dashboard/Reports/RoadPatrolReportController.php
index 26e218ba..9f485e05 100644
--- a/app/Http/Controllers/V3/Dashboard/Reports/RoadPatrolReportController.php
+++ b/app/Http/Controllers/V3/Dashboard/Reports/RoadPatrolReportController.php
@@ -2,153 +2,94 @@
namespace App\Http\Controllers\V3\Dashboard\Reports;
-use App\Exports\V2\RoadPatrol\RoadPatrolTable\AllSheets as RoadPatrolTable;
+use App\Exports\V3\RoadPatrols\CountryActivity;
+use App\Exports\V3\RoadPatrols\ProvinceActivity;
use App\Http\Controllers\Controller;
use App\Http\Traits\ApiResponse;
use App\Models\EdarateShahri;
use App\Models\Province;
-use App\Models\RoadPatrolProject;
+use App\Models\RoadObserved;
+use App\Models\RoadPatrol;
+use App\Services\Reports\RoadPatrolReportService;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
-use Illuminate\Support\Facades\DB;
use Maatwebsite\Excel\Facades\Excel;
use Symfony\Component\HttpFoundation\BinaryFileResponse;
class RoadPatrolReportController extends Controller
{
use ApiResponse;
- public function provincePatrolActivity(Request $request): JsonResponse
+ public function countryPatrolActivity(Request $request, RoadPatrolReportService $roadPatrolReportService): JsonResponse
{
- $fromDate = $request->from_date ? $request->from_date . ' 00:00:00' : now()->startOfDay()->toDateTimeString();
- $dateTo = $request->date_to ? $request->date_to . ' 23:59:59' : now()->endOfDay()->toDateTimeString();
-
- $activities = DB::select('SELECT
- "کشوری" as province_fa,
- -1 as province_id,
- COUNT(*) tedade,
- SUM(tedad_mavarede_moshede_shode_adi) as tedad_mavarede_moshede_shode_adi,
- SUM(tedad_mavarede_moshede_shode_fori) as tedad_mavarede_moshede_shode_fori,
- SUM(tedad_mavarede_moshede_shode_ani) as tedad_mavarede_moshede_shode_ani,
- SUM(tedad_mavarede_peygiri_shode) as tedad_mavarede_peygiri_shode,
- SUM(tedad_faliyat_sabt_shode) as tedad_faliyat_sabt_shode,
- ROUND(SUM(distance)) as masafat_tey_shode
- FROM (SELECT
- province_id,
- province_fa,
- distance,
- (SELECT COUNT(*) FROM `observed_items` oi WHERE rp.`id`= oi.road_patrol_id AND priority = 1) AS tedad_mavarede_moshede_shode_adi,
- (SELECT COUNT(*) FROM `observed_items` oi WHERE rp.`id`= oi.road_patrol_id AND priority = 2) AS tedad_mavarede_moshede_shode_fori,
- (SELECT COUNT(*) FROM `observed_items` oi WHERE rp.`id`= oi.road_patrol_id AND priority = 3) AS tedad_mavarede_moshede_shode_ani,
- (SELECT COUNT(*) FROM `observed_items` oii WHERE rp.`id`= oii.road_patrol_id AND oii.road_item_id IS NOT NULL AND priority IS NOT NULL) AS tedad_mavarede_peygiri_shode,
- (SELECT COUNT(*) FROM `observed_items` oii WHERE rp.`id`= oii.road_patrol_id AND oii.road_item_id IS NOT NULL AND priority IS NULL) AS tedad_faliyat_sabt_shode
- FROM `road_patrols` rp where rp.start_time BETWEEN "'.$fromDate.'" AND "'.$dateTo.'") temp
- union
- SELECT
- province_fa,
- province_id,
- COUNT(*) tedade,
- SUM(tedad_mavarede_moshede_shode_adi) as tedad_mavarede_moshede_shode_adi,
- SUM(tedad_mavarede_moshede_shode_fori) as tedad_mavarede_moshede_shode_fori,
- SUM(tedad_mavarede_moshede_shode_ani) as tedad_mavarede_moshede_shode_ani,
- SUM(tedad_mavarede_peygiri_shode) as tedad_mavarede_peygiri_shode,
- SUM(tedad_faliyat_sabt_shode) as tedad_faliyat_sabt_shode,
- ROUND(SUM(distance)) as masafat_tey_shode
- FROM (SELECT
- province_id,
- province_fa,
- distance,
- (SELECT COUNT(*) FROM `observed_items` oi WHERE rp.`id`= oi.road_patrol_id AND priority = 1) AS tedad_mavarede_moshede_shode_adi,
- (SELECT COUNT(*) FROM `observed_items` oi WHERE rp.`id`= oi.road_patrol_id AND priority = 2) AS tedad_mavarede_moshede_shode_fori,
- (SELECT COUNT(*) FROM `observed_items` oi WHERE rp.`id`= oi.road_patrol_id AND priority = 3) AS tedad_mavarede_moshede_shode_ani,
- (SELECT COUNT(*) FROM `observed_items` oii WHERE rp.`id`= oii.road_patrol_id AND oii.road_item_id IS NOT NULL AND priority IS NOT NULL) AS tedad_mavarede_peygiri_shode,
- (SELECT COUNT(*) FROM `observed_items` oii WHERE rp.`id`= oii.road_patrol_id AND oii.road_item_id IS NOT NULL AND priority IS NULL) AS tedad_faliyat_sabt_shode
- FROM `road_patrols` rp where rp.start_time BETWEEN "'.$fromDate.'" AND "'.$dateTo.'") temp
- GROUP BY province_id'
- );
+ $activities = $roadPatrolReportService->countryActivity($request);
$provinces = Province::all(['id', 'name_fa']);
return $this->successResponse([
- 'activities' => $activities,
+ 'activities' => $activities['data'],
'provinces' => $provinces
]);
}
- public function cityPatrolActivity(Request $request): JsonResponse
+ public function provincePatrolActivity(Request $request, RoadPatrolReportService $roadPatrolReportService): JsonResponse
{
$request->validate(["province_id" => "required",]);
- $fromDate = $request->from_date ? $request->from_date . ' 00:00:00' : now()->startOfDay()->toDateTimeString();
- $dateTo = $request->date_to ? $request->date_to . ' 23:59:59' : now()->endOfDay()->toDateTimeString();
- $provinceId = $request->province_id;
- $activities = DB::select(
- 'SELECT
- province_fa,
- province_id,
- -1 AS edare_id,
- "استانی" AS edare_name,
- COUNT(*) tedade,
- SUM(tedad_mavarede_moshede_shode_adi) as tedad_mavarede_moshede_shode_adi,
- SUM(tedad_mavarede_moshede_shode_fori) as tedad_mavarede_moshede_shode_fori,
- SUM(tedad_mavarede_moshede_shode_ani) as tedad_mavarede_moshede_shode_ani,
- SUM(tedad_mavarede_peygiri_shode) as tedad_mavarede_peygiri_shode,
- SUM(tedad_faliyat_sabt_shode) as tedad_faliyat_sabt_shode,
- ROUND(SUM(distance)) as masafat_tey_shode
- FROM (SELECT
- province_id,
- province_fa,
- edare_id,
- edare_name,
- distance,
- (SELECT COUNT(*) FROM `observed_items` oi WHERE rp.`id`= oi.road_patrol_id AND priority = 1) AS tedad_mavarede_moshede_shode_adi,
- (SELECT COUNT(*) FROM `observed_items` oi WHERE rp.`id`= oi.road_patrol_id AND priority = 2) AS tedad_mavarede_moshede_shode_fori,
- (SELECT COUNT(*) FROM `observed_items` oi WHERE rp.`id`= oi.road_patrol_id AND priority = 3) AS tedad_mavarede_moshede_shode_ani,
- (SELECT COUNT(*) FROM `observed_items` oii WHERE rp.`id`= oii.road_patrol_id AND oii.road_item_id IS NOT NULL AND priority IS NOT NULL) AS tedad_mavarede_peygiri_shode,
- (SELECT COUNT(*) FROM `observed_items` oii WHERE rp.`id`= oii.road_patrol_id AND oii.road_item_id IS NOT NULL AND priority IS NULL) AS tedad_faliyat_sabt_shode
- FROM `road_patrols` rp where rp.province_id = "'.$provinceId.'" AND rp.start_time BETWEEN "'.$fromDate.'" AND "'.$dateTo.'") temp
- UNION
- SELECT
- province_fa,
- province_id,
- edare_id,
- edare_name,
- COUNT(*) tedade,
- SUM(tedad_mavarede_moshede_shode_adi) as tedad_mavarede_moshede_shode_adi,
- SUM(tedad_mavarede_moshede_shode_fori) as tedad_mavarede_moshede_shode_fori,
- SUM(tedad_mavarede_moshede_shode_ani) as tedad_mavarede_moshede_shode_ani,
- SUM(tedad_mavarede_peygiri_shode) as tedad_mavarede_peygiri_shode,
- SUM(tedad_faliyat_sabt_shode) as tedad_faliyat_sabt_shode,
- ROUND(SUM(distance)) as masafat_tey_shode
- FROM (SELECT
- province_id,
- province_fa,
- edare_id,
- edare_name,
- distance,
- (SELECT COUNT(*) FROM `observed_items` oi WHERE rp.`id`= oi.road_patrol_id AND priority = 1) AS tedad_mavarede_moshede_shode_adi,
- (SELECT COUNT(*) FROM `observed_items` oi WHERE rp.`id`= oi.road_patrol_id AND priority = 2) AS tedad_mavarede_moshede_shode_fori,
- (SELECT COUNT(*) FROM `observed_items` oi WHERE rp.`id`= oi.road_patrol_id AND priority = 3) AS tedad_mavarede_moshede_shode_ani,
- (SELECT COUNT(*) FROM `observed_items` oii WHERE rp.`id`= oii.road_patrol_id AND oii.road_item_id IS NOT NULL AND priority IS NOT NULL) AS tedad_mavarede_peygiri_shode,
- (SELECT COUNT(*) FROM `observed_items` oii WHERE rp.`id`= oii.road_patrol_id AND oii.road_item_id IS NOT NULL AND priority IS NULL) AS tedad_faliyat_sabt_shode
- FROM `road_patrols` rp where rp.province_id = "'.$provinceId.'" AND rp.start_time BETWEEN "'.$fromDate.'" AND "'.$dateTo.'") temp
- GROUP BY edare_id
- '
- );
+ $activities = $roadPatrolReportService->provinceActivity($request);
- $edarateShahri = EdarateShahri::query()->where('province_id', '=', $provinceId)->get(['id', 'name_fa']);
+ $edarateShahri = EdarateShahri::query()->where('province_id', '=', $request->province_id)->get(['id', 'name_fa']);
return $this->successResponse([
- 'activities' => $activities,
+ 'activities' => $activities['data'],
'edarateShahri' => $edarateShahri,
]);
}
- public function excel(Request $request): BinaryFileResponse
+ public function countryActivityExcel(Request $request, RoadPatrolReportService $roadPatrolReportService): BinaryFileResponse
{
+ $activities = $roadPatrolReportService->countryActivity($request);
+ $provinces = Province::all(['id', 'name_fa']);
+
$name = 'گزارش از گشت راهداری و ترابری ' . verta()->now()->format('Y-m-d H-i') . '.xlsx';
- return Excel::download(
- new RoadPatrolTable($request->from_date, $request->date_to), $name
- );
+ return Excel::download(new CountryActivity([
+ 'activities' => $activities,
+ 'provinces' => $provinces,
+ ]), $name);
+ }
+
+ public function provinceActivityExcel(Request $request, RoadPatrolReportService $roadPatrolReportService): BinaryFileResponse
+ {
+ $activities = $roadPatrolReportService->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';
+
+ return Excel::download(new ProvinceActivity([
+ 'activities' => $activities,
+ 'edarateShahri' => $edarateShahri,
+ ]), $name);
+ }
+
+ public function activitiesOnMap(Request $request): JsonResponse
+ {
+ $date_from = $request->from_date ? $request->from_date .' 00:00:00' : now()->startOfDay()->toDateTimeString();
+ $date_to = $request->date_to ? $request->date_to.' 23:59:59' : now()->addDay()->startOfDay()->toDateTimeString();
+ $provinceId = $request->province_id;
+ $edareId = $request->edare_id;
+
+ $data = RoadPatrol::query()
+ ->when($provinceId, fn($query, $provinceId) => $query->where('province_id', '=', $provinceId))
+ ->when($edareId, fn($query, $edareId) => $query->where('edare_id', '=', $edareId))
+ ->whereBetween('created_at', [$date_from, $date_to])
+ ->select('id', 'start_lat', 'start_lon')
+ ->get();
+
+ return $this->successResponse($data);
+ }
+
+ public function showOnMap(RoadPatrol $roadPatrol): JsonResponse
+ {
+ return $this->successResponse($roadPatrol->load(['rahdaran:id,name,code', 'cmmsMachines:id,machine_code,car_name,plak_number']));
}
}
diff --git a/app/Http/Controllers/V3/Dashboard/RoadItemsProjectController.php b/app/Http/Controllers/V3/Dashboard/RoadItemsProjectController.php
index 0d9ecc5e..00295fb7 100644
--- a/app/Http/Controllers/V3/Dashboard/RoadItemsProjectController.php
+++ b/app/Http/Controllers/V3/Dashboard/RoadItemsProjectController.php
@@ -2,9 +2,8 @@
namespace App\Http\Controllers\V3\Dashboard;
-use App\Exports\V2\RoadItems\OperatorCartableExport;
-use App\Exports\V2\RoadItems\SupervisorCartableExport;
-use App\Facades\DataTable\DataTableFacade;
+use App\Exports\V3\RoadItemsProjects\OperatorCartableReport;
+use App\Exports\V3\RoadItemsProjects\SupervisorCartableReport;
use App\Http\Controllers\Controller;
use App\Http\Requests\V3\RoadItemsProject\StoreRequest;
use App\Http\Requests\V3\RoadItemsProject\UpdateRequest;
@@ -14,6 +13,7 @@ use App\Models\EdarateShahri;
use App\Models\InfoItem;
use App\Models\RoadItemsProject;
use App\Services\NominatimService;
+use App\Services\Reports\RoadItemReportService;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Gate;
@@ -28,39 +28,9 @@ class RoadItemsProjectController extends Controller
/**
* Display a listing of the resource.
*/
- public function supervisorIndex(Request $request): JsonResponse
+ public function supervisorIndex(Request $request, RoadItemReportService $roadItemReportService): JsonResponse
{
- $columns = array(
- 'id', 'user_id', 'start_lat', 'start_lng', 'end_lat',
- 'end_lng', 'project_distance', 'item', 'item_fa', 'sub_item_fa', 'sub_item',
- 'sub_item_data', 'created_at', 'updated_at', 'province_id', 'province_fa',
- 'unit_fa', 'status', 'status_fa', 'supervisor_description', 'supervising_time',
- 'supervisor_name', 'edarat_id', 'edarat_name', 'activity_date_time','cmmsMachines.machine_code'
- );
-
- $allowedFilters = $columns;
- $allowedSortings = $columns;
-
- $user = auth()->user();
- $query = null;
-
- if ($user->hasPermissionTo('show-road-item-supervise-cartable')) {
- $query = RoadItemsProject::query()->where('is_new', 1)->with(['files', 'rahdaran:id,name,code', 'cmmsMachines:id,machine_code,car_name,plak_number']);
- }
- elseif ($user->hasPermissionTo('show-road-item-supervise-cartable-province')) {
- if (is_null($user->province_id)) {
- return $this->errorResponse('استانی برای شما در سامانه ثبت نشده است!');
- }
- $query = RoadItemsProject::query()->where('is_new', 1)
- ->with(['files', 'rahdaran:id,name,code', 'cmmsMachines:id,machine_code,car_name,plak_number'])->where('province_id', auth()->user()->province_id);
- }
-
- $data = DataTableFacade::run(
- $query,
- $request,
- allowedFilters: $allowedFilters,
- allowedSortings: $allowedSortings);
-
+ $data = $roadItemReportService->supervisorCartableReport($request);
foreach ($data['data'] as $road_item) {
if (Gate::allows('gate-supervise-road-item', $road_item)) {
@@ -95,9 +65,7 @@ class RoadItemsProjectController extends Controller
public function restore(RoadItemsProject $roadItemsProject): JsonResponse
{
if ($roadItemsProject->status == 0) {
- return response()->json([
- 'message' => 'امکان بازگردانی وضعیت این فعالیت وجود ندارد!'
- ], 400);
+ return $this->errorResponse('امکان بازگردانی وضعیت این فعالیت وجود ندارد!');
}
$roadItemsProject->update([
@@ -128,36 +96,16 @@ class RoadItemsProjectController extends Controller
}
- public function supervisorCartableReport(Request $request): BinaryFileResponse
+ public function supervisorCartableReport(Request $request, RoadItemReportService $roadItemReportService): BinaryFileResponse
{
$name = 'گزارش از کارتابل ارزیابی فعالیت روزانه ' . verta()->now()->format('Y-m-d H:i') . '.xlsx';
- return Excel::download(new SupervisorCartableExport($request->id, $request->item, $request->status,
- $request->fromDate, $request->toDate, $request->province_id, $request->edarat_id), $name);
+ $data = $roadItemReportService->supervisorCartableReport($request);
+ return Excel::download(new SupervisorCartableReport($data['data']), $name);
}
- public function operatorIndex(Request $request): JsonResponse
+ public function operatorIndex(Request $request, RoadItemReportService $roadItemReportService): JsonResponse
{
- $columns = array(
- 'id', 'user_id', 'start_lat', 'start_lng', 'end_lat',
- 'end_lng', 'project_distance', 'item', 'item_fa', 'sub_item_fa', 'sub_item',
- 'sub_item_data', 'created_at', 'updated_at', 'province_id', 'province_fa',
- 'unit_fa', 'status', 'status_fa', 'supervisor_description', 'supervising_time',
- 'supervisor_name', 'edarat_id', 'edarat_name', 'activity_date_time', 'cmmsMachines.machine_code'
- );
-
- $allowedFilters = $columns;
- $allowedSortings = $columns;
-
- $query = RoadItemsProject::with(['files', 'rahdaran:id,name,code', 'cmmsMachines:id,machine_code,car_name,plak_number'])
- ->where('is_new', 1)
- ->where('user_id', auth()->user()->id);
-
- $data = DataTableFacade::run(
- $query,
- $request,
- allowedFilters: $allowedFilters,
- allowedSortings: $allowedSortings);
-
+ $data = $roadItemReportService->operatorCartableReport($request);
return response()->json($data);
}
@@ -170,15 +118,11 @@ class RoadItemsProjectController extends Controller
$user = auth()->user();
if ($user->edarate_ostani_id || is_null($user->city_id)) {
- return response()->json([
- 'message' => 'امکان ثبت فعالیت برای ادارات استانی و ستادی وجود ندارد!'
- ], 400);
+ return $this->errorResponse('امکان ثبت فعالیت برای ادارات استانی و ستادی وجود ندارد!');
}
if (is_null($user->edarate_shahri_id)) {
- return response()->json([
- 'message' => 'اداره شهری برای شما در سامانه ثبت نشده است!'
- ], 400);
+ return $this->errorResponse('اداره شهری برای شما در سامانه ثبت نشده است!');
}
$info_item = InfoItem::query()->where('item', $request->item_id)
@@ -241,9 +185,7 @@ class RoadItemsProjectController extends Controller
$road_item = RoadItemsProject::store($user, $attributes, $before_image, $after_image, $request->observed_item_id);
if ($road_item === -1) {
- return response()->json([
- 'message' => 'اقدام مربوطه قبلا رسیدگی شده است.'
- ], 400);
+ return $this->errorResponse('اقدام مربوطه قبلا رسیدگی شده است.');
}
$road_item->rahdaran()->attach($request->rahdaran_id);
@@ -322,12 +264,10 @@ class RoadItemsProjectController extends Controller
return $this->successResponse();
}
- public function operatorCartableReport(Request $request): BinaryFileResponse
+ public function operatorCartableReport(Request $request, RoadItemReportService $roadItemReportService): BinaryFileResponse
{
$name = 'گزارش از کارتابل عملیات فعالیت روزانه ' . verta()->now()->format('Y-m-d H:i') . '.xlsx';
- return Excel::download(
- new OperatorCartableExport($request->id, $request->item, $request->status, $request->fromDate, $request->toDate),
- $name
- );
+ $data = $roadItemReportService->operatorCartableReport($request);
+ 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 dfac13c0..6056a563 100644
--- a/app/Http/Controllers/V3/Dashboard/RoadPatrolProjectController.php
+++ b/app/Http/Controllers/V3/Dashboard/RoadPatrolProjectController.php
@@ -2,9 +2,8 @@
namespace App\Http\Controllers\V3\Dashboard;
-use App\Exports\V2\RoadPatrol\OperatorCartableExport;
-use App\Exports\V2\RoadPatrol\SupervisorCartableExport;
-use App\Facades\DataTable\DataTableFacade;
+use App\Exports\V3\RoadPatrols\OperatorCartableReport;
+use App\Exports\V3\RoadPatrols\SupervisorCartableReport;
use App\Facades\Sms\Sms;
use App\Http\Controllers\Controller;
use App\Http\Requests\V3\RoadPatrolProject\DeleteRequest;
@@ -16,6 +15,7 @@ use App\Models\RoadItemsProject;
use App\Models\RoadObserved;
use App\Models\RoadPatrol;
use App\Services\NominatimService;
+use App\Services\Reports\RoadPatrolReportService;
use Carbon\Carbon;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
@@ -30,40 +30,9 @@ class RoadPatrolProjectController extends Controller
{
use ApiResponse;
- public function supervisorIndex(Request $request): JsonResponse
+ public function supervisorIndex(Request $request, RoadPatrolReportService $roadPatrolReportService): JsonResponse
{
- $columns = array(
- 'id', 'start_lat', 'start_lon', 'end_lat', 'end_lon', 'operator_id',
- 'operator_name', 'officer_plaque', 'officer_phone_number', 'officer_name',
- 'supervisor_description', 'supervising_time', 'supervisor_name', 'status',
- 'status_fa', 'distance', 'province_id', 'province_fa', 'edare_id', 'edare_name',
- 'start_time', 'end_time','description', 'cmmsMachines.machine_code'
- );
-
- $allowedFilters = $columns;
- $allowedSortings = $columns;
-
- $user = auth()->user();
- $query = null;
-
- if ($user->hasPermissionTo('show-road-patrol-supervise-cartable')) {
- $query = RoadPatrol::query()
- ->with(['rahdaran:id,name,code', 'cmmsMachines:id,machine_code,car_name,plak_number']);
- }
- elseif ($user->hasPermissionTo('show-road-patrol-supervise-cartable-province')) {
- if (is_null($user->province_id)) {
- return $this->errorResponse('استانی برای شما در سامانه ثبت نشده است!');
- }
- $query = RoadPatrol::query()
- ->with(['rahdaran:id,name,code', 'cmmsMachines:id,machine_code,car_name,plak_number'])
- ->where('province_id', '=', $user->province_id);
- }
-
- $data = DataTableFacade::run(
- $query,
- $request,
- allowedFilters: $allowedFilters,
- allowedSortings: $allowedSortings);
+ $data = $roadPatrolReportService->supervisorCartableReport($request);
foreach ($data['data'] as $road_patrol) {
if (Gate::allows('gate-supervise-road-item', $road_patrol)) {
@@ -111,37 +80,16 @@ class RoadPatrolProjectController extends Controller
return $this->successResponse();
}
- public function supervisorCartableReport(Request $request): BinaryFileResponse
+ public function supervisorCartableReport(Request $request, RoadPatrolReportService $roadPatrolReportService): BinaryFileResponse
{
$name = 'گزارش از کارتابل ارزیابی گشت راهداری ' . verta()->now()->format('Y-m-d H:i') . '.xlsx';
- return Excel::download(
- new SupervisorCartableExport($request->id, $request->fromDate,
- $request->toDate, $request->province_id, $request->edare_id
- ), $name
- );
+ $data = $roadPatrolReportService->supervisorCartableReport($request);
+ return Excel::download(new SupervisorCartableReport($data['data']), $name);
}
- public function operatorIndex(Request $request): JsonResponse
+ public function operatorIndex(Request $request, RoadPatrolReportService $roadPatrolReportService): JsonResponse
{
- $columns = array(
- 'id', 'start_lat', 'start_lon', 'end_lat', 'end_lon', 'officer_plaque',
- 'officer_phone_number', 'officer_name', 'supervisor_description', 'supervising_time',
- 'supervisor_name', 'status', 'status_fa', 'distance', 'start_time', 'end_time', 'cmmsMachines.machine_code'
- );
-
- $allowedFilters = $columns;
- $allowedSortings = $columns;
-
- $query = RoadPatrol::query()
- ->with(['rahdaran:id,name,code', 'cmmsMachines:id,machine_code,car_name,plak_number'])
- ->where('operator_id', '=', auth()->user()->id);
-
- $data = DataTableFacade::run(
- $query,
- $request,
- allowedFilters: $allowedFilters,
- allowedSortings: $allowedSortings);
-
+ $data = $roadPatrolReportService->operatorCartableReport($request);
return response()->json($data);
}
@@ -150,15 +98,11 @@ class RoadPatrolProjectController extends Controller
$user = auth()->user();
if ($user->edarate_ostani_id || is_null($user->city_id)) {
- return response()->json([
- 'message' => 'امکان ثبت فعالیت برای ادارات استانی وجود ندارد!'
- ], 400);
+ return $this->errorResponse('امکان ثبت فعالیت برای ادارات استانی وجود ندارد!');
}
if (is_null($user->edarate_shahri_id)) {
- return response()->json([
- 'message' => 'اداره شهری برای شما در سامانه ثبت نشده است!'
- ], 400);
+ return $this->errorResponse('اداره شهری برای شما در سامانه ثبت نشده است!');
}
$edare_id = $user->edarate_shahri_id ?? $user->edarate_ostani_id;
@@ -211,8 +155,13 @@ class RoadPatrolProjectController extends Controller
$item_end_coordinates = null;
if ($item['instant_action'] == 0) {
+ $priority = [
+ 1 => 'عادی',
+ 2 => 'فوری',
+ 3 => 'آنی',
+ ];
$observed_item->priority = $item['priority'];
- $observed_item->priority_fa = $item['priority_fa'];
+ $observed_item->priority_fa = $priority[$item['priority']];
$observed_item->save();
} elseif ($item['instant_action'] == 1) {
if ($info_item->needs_end_point) {
@@ -279,9 +228,7 @@ class RoadPatrolProjectController extends Controller
$road_item = RoadItemsProject::store($user, $attributes, $before_image, $after_image, $observed_item->id);
if ($road_item === -1) {
- return response()->json([
- 'message' => 'اقدام مربوطه قبلا رسیدگی شده است.'
- ], 400);
+ return $this->errorResponse('اقدام مربوطه قبلا رسیدگی شده است.');
}
$road_item->rahdaran()->attach($item['road_item_rahdaran_id']);
@@ -332,27 +279,6 @@ class RoadPatrolProjectController extends Controller
return $this->successResponse($data);
}
- public function getAllDataToMap(Request $request): JsonResponse
- {
- $date_from = $request->date_from ? $request->date_from .' 00:00:00' : Date('Y-m-d') .' 00:00:00';
- $date_to = $request->date_to ? $request->date_to.' 23:59:59' : (new \DateTime('tomorrow'))->format('Y-m-d').' 23:59:59';
-
- $data = RoadPatrol::query()->when($request->province_id, function ($query, $province) {
- return $query->where('province_id', '=', $province);
- })
- ->when($request->edare_id, function ($query, $edare_id) {
- return $query->where('edare_id', '=', $edare_id);
- })
- ->whereBetween('created_at', [
- $date_from,
- $date_to,
- ])
- ->select('id', 'start_lat', 'start_lon')
- ->get();
-
- return $this->successResponse($data);
- }
-
public function map(Request $request): JsonResponse
{
$province = $request->province_id;
@@ -360,8 +286,8 @@ class RoadPatrolProjectController extends Controller
$status = $request->status;
$rms_status = $request->rms_status;
- if ($request->date_from && $request->date_to) {
- $date_from = $request->date_from.' 00:00:00';
+ if ($request->from_date && $request->date_to) {
+ $date_from = $request->from_date.' 00:00:00';
$date_to = $request->date_to.' 23:59:59';
} else {
$date_from = Date('Y-m-d');
@@ -396,12 +322,10 @@ class RoadPatrolProjectController extends Controller
return $this->successResponse($roadPatrol);
}
- public function operatorCartableReport(Request $request): BinaryFileResponse
+ public function operatorCartableReport(Request $request, RoadPatrolReportService $roadPatrolReportService): BinaryFileResponse
{
$name = 'گزارش از کارتابل عملیات گشت راهداری ' . verta()->now()->format('Y-m-d H:i') . '.xlsx';
- return Excel::download(
- new OperatorCartableExport($request->id, $request->status, $request->officer_name, $request->fromDate, $request->toDate),
- $name
- );
+ $data = $roadPatrolReportService->operatorCartableReport($request);
+ return Excel::download(new OperatorCartableReport($data['data']), $name);
}
}
diff --git a/app/Http/Requests/V3/RoadPatrolProject/StoreRequest.php b/app/Http/Requests/V3/RoadPatrolProject/StoreRequest.php
index b0986e4b..5b82d689 100644
--- a/app/Http/Requests/V3/RoadPatrolProject/StoreRequest.php
+++ b/app/Http/Requests/V3/RoadPatrolProject/StoreRequest.php
@@ -27,7 +27,7 @@ class StoreRequest extends FormRequest
'distance' => 'numeric',
'start_time' => 'required|date_format:Y-m-d H:i',
'end_time' => 'required|date_format:Y-m-d H:i|after:start_time',
- 'fuel_consumption' => 'required|integer',
+ 'fuel_consumption' => 'required|numeric',
'vehicle_runtime' => 'required|integer',
'stop_points' => 'required|array',
'road_patrol_machines_id' => 'required|array',
@@ -38,9 +38,9 @@ class StoreRequest extends FormRequest
'observed_items' => 'array',
'observed_items.*.item_id' => 'required|integer',
'observed_items.*.sub_item_id' => 'required|integer',
- 'observed_items.*.local_name' => 'required',
'observed_items.*.description' => '',
'observed_items.*.instant_action' => 'required|in:0,1',
+ 'observed_items.*.local_name' => 'required_if:observed_items.*.instant_action,0',
// road item projects fields
'observed_items.*.start_point' => 'required',
@@ -49,8 +49,7 @@ class StoreRequest extends FormRequest
'observed_items.*.before_image' => 'image|max:4096',
'observed_items.*.after_image' => 'image|max:4096',
'observed_items.*.priority' => 'integer|in:1,2,3|required_if:observed_items.*.instant_action,0',
- 'observed_items.*.priority_fa' => 'string|required_if:observed_items.*.instant_action,0',
- 'description' => 'string|required_with:observed_items',
+ 'description' => 'string',
'observed_items.*.road_item_machines_id' => 'required_if:observed_items.*.instant_action,1|array',
'observed_items.*.road_item_machines_id.*' => 'required_if:observed_items.*.instant_action,1|exists:cmms_machines,id',
diff --git a/app/Jobs/SendRoadObservationToNikarayan.php b/app/Jobs/SendRoadObservationToNikarayan.php
new file mode 100644
index 00000000..ffb21eab
--- /dev/null
+++ b/app/Jobs/SendRoadObservationToNikarayan.php
@@ -0,0 +1,50 @@
+ 'vaytelrop',
+ 'strPassword' => 'VaYtelROP*2024',
+ 'strAutoID' => $this->roadObserved->fk_RegisteredEventMessage,
+ 'strStateID' => '2',
+ 'strDescription' => 'گزارشات تایید شده از تاریخ 1 فروردین 1403 تا 14 مهر 1403',
+ 'strRMSDateAndTime' => $this->roadObserved->updated_at
+ );
+
+ $soapClient = new SoapClient($url);
+
+ $soapClient->UpdateInfo_RoadObservedProblems($array);
+ }
+ catch (\Exception $exception){
+ Log::channel('road_observation_problem')->error($exception->getMessage(), [
+ 'roadObserved' => $this->roadObserved,
+ ]);
+ }
+ }
+}
diff --git a/app/Models/RoadPatrol.php b/app/Models/RoadPatrol.php
index c39af8c2..19ff01bd 100644
--- a/app/Models/RoadPatrol.php
+++ b/app/Models/RoadPatrol.php
@@ -6,6 +6,7 @@ use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\Relations\MorphToMany;
+use Illuminate\Database\Eloquent\Casts\Attribute;
class RoadPatrol extends Model
{
@@ -13,6 +14,13 @@ class RoadPatrol extends Model
protected $guarded = ['id'];
+ protected function stopPoints(): Attribute
+ {
+ return Attribute::make(
+ get: fn ($value) => $value ? json_decode($value) : null,
+ );
+ }
+
public function observedItems(): HasMany
{
return $this->hasMany(ObservedItem::class);
diff --git a/app/Providers/AuthServiceProvider.php b/app/Providers/AuthServiceProvider.php
index d8a5337b..434ee1ab 100644
--- a/app/Providers/AuthServiceProvider.php
+++ b/app/Providers/AuthServiceProvider.php
@@ -2,6 +2,7 @@
namespace App\Providers;
+use App\Models\User;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
use Illuminate\Support\Facades\Gate;
use App\Models\EdarateOstani;
@@ -50,5 +51,9 @@ class AuthServiceProvider extends ServiceProvider
return $user->can('supervise-fast-react') ||
($user->can('supervise-fast-react-province') && $road_observed->province_id == $user->province_id);
});
+
+ Gate::define('viewPulse', function (User $user) {
+ return $user->username == 'witel';
+ });
}
}
diff --git a/app/Services/DataTable/DataTableInput.php b/app/Services/DataTable/DataTableInput.php
index 18e7ea10..8464e878 100644
--- a/app/Services/DataTable/DataTableInput.php
+++ b/app/Services/DataTable/DataTableInput.php
@@ -15,10 +15,10 @@ class DataTableInput
* @param array $rels
*/
public function __construct(
- private int $start,
+ private ?int $start,
private ?int $size,
private array $filters,
- private array $sorting,
+ private ?array $sorting,
private array $rels,
private array $allowedFilters,
private array $allowedSortings,
@@ -26,7 +26,7 @@ class DataTableInput
{
}
- public function getStart(): int
+ public function getStart(): ?int
{
return $this->start;
}
@@ -74,6 +74,4 @@ class DataTableInput
{
return $this->rels;
}
-
-
}
diff --git a/app/Services/DataTable/DataTableService.php b/app/Services/DataTable/DataTableService.php
index af0d0451..647f6e44 100644
--- a/app/Services/DataTable/DataTableService.php
+++ b/app/Services/DataTable/DataTableService.php
@@ -76,7 +76,9 @@ class DataTableService
$this->totalRowCount = $query->count();
- $query->offset($this->dataTableInput->getStart());
+ if (!is_null($this->dataTableInput->getStart())) {
+ $query->offset($this->dataTableInput->getStart());
+ }
if(!is_null($this->dataTableInput->getSize())){
$query->limit($this->dataTableInput->getSize());
diff --git a/app/Services/DataTable/Filter/SearchFunctions/FilterBetween.php b/app/Services/DataTable/Filter/SearchFunctions/FilterBetween.php
index 7b91d5e6..7a6292da 100644
--- a/app/Services/DataTable/Filter/SearchFunctions/FilterBetween.php
+++ b/app/Services/DataTable/Filter/SearchFunctions/FilterBetween.php
@@ -13,11 +13,17 @@ class FilterBetween extends SearchFilter
[$minVal, $maxVal] = $this->filter->getValue();
if ($minVal) {
+ if ($this->filter->getDatatype() == "date") {
+ $minVal = $minVal . " 00:00:00";
+ }
$this->filter->setValue($minVal);
$query = (new FilterGreaterThanOrEqual($this->query, $this->filter))->apply();
}
if ($maxVal) {
+ if ($this->filter->getDatatype() == "date") {
+ $maxVal = $maxVal . " 23:59:59";
+ }
$this->filter->setValue($maxVal);
$query = (new FilterLessThanOrEqual($this->query, $this->filter))->apply();
}
diff --git a/app/Services/DataTable/Validators/FilterValidator.php b/app/Services/DataTable/Validators/FilterValidator.php
index cc45813e..ea837f9e 100644
--- a/app/Services/DataTable/Validators/FilterValidator.php
+++ b/app/Services/DataTable/Validators/FilterValidator.php
@@ -50,7 +50,7 @@ class FilterValidator
protected function isAllowed(Filter $filter, array $allowedFilters): bool
{
- return in_array($filter->getId(), $allowedFilters);
+ return $allowedFilters == ['*'] || in_array($filter->getId(), $allowedFilters);
}
protected function isValidSearchFunction(Filter $filter): bool
diff --git a/app/Services/DataTable/Validators/SortingValidator.php b/app/Services/DataTable/Validators/SortingValidator.php
index a494ef6a..4409bfba 100644
--- a/app/Services/DataTable/Validators/SortingValidator.php
+++ b/app/Services/DataTable/Validators/SortingValidator.php
@@ -34,6 +34,6 @@ class SortingValidator
protected function isAllowed(Sort $sorting, array $allowedSortings): bool
{
- return in_array($sorting->getId(), $allowedSortings);
+ return $allowedSortings == ['*'] || in_array($sorting->getId(), $allowedSortings);
}
}
diff --git a/app/Services/Reports/RoadItemReportService.php b/app/Services/Reports/RoadItemReportService.php
new file mode 100644
index 00000000..4751cda3
--- /dev/null
+++ b/app/Services/Reports/RoadItemReportService.php
@@ -0,0 +1,233 @@
+user();
+ $query = null;
+
+ if ($user->hasPermissionTo('show-road-item-supervise-cartable')) {
+ $query = RoadItemsProject::query()->where('is_new', 1)->with(['files', 'rahdaran:id,name,code', 'cmmsMachines:id,machine_code,car_name,plak_number']);
+ }
+ elseif ($user->hasPermissionTo('show-road-item-supervise-cartable-province')) {
+ if (is_null($user->province_id)) {
+ return $this->errorResponse('استانی برای شما در سامانه ثبت نشده است!');
+ }
+ $query = RoadItemsProject::query()->where('is_new', 1)
+ ->with(['files', 'rahdaran:id,name,code', 'cmmsMachines:id,machine_code,car_name,plak_number'])->where('province_id', auth()->user()->province_id);
+ }
+
+ $data = DataTableFacade::run(
+ $query,
+ $request,
+ allowedFilters: $allowedFilters,
+ allowedSortings: $allowedSortings);
+
+ return $data;
+ }
+
+ public function operatorCartableReport(Request $request)
+ {
+ $columns = array(
+ 'id', 'user_id', 'start_lat', 'start_lng', 'end_lat',
+ 'end_lng', 'project_distance', 'item', 'item_fa', 'sub_item_fa', 'sub_item',
+ 'sub_item_data', 'created_at', 'updated_at', 'province_id', 'province_fa',
+ 'unit_fa', 'status', 'status_fa', 'supervisor_description', 'supervising_time',
+ 'supervisor_name', 'edarat_id', 'edarat_name', 'activity_date_time', 'cmmsMachines.machine_code', 'rahdaran.code',
+ );
+
+ $allowedFilters = $columns;
+ $allowedSortings = $columns;
+
+ $query = RoadItemsProject::with(['files', 'rahdaran:id,name,code', 'cmmsMachines:id,machine_code,car_name,plak_number'])
+ ->where('is_new', 1)
+ ->where('user_id', auth()->user()->id);
+
+ $data = DataTableFacade::run(
+ $query,
+ $request,
+ allowedFilters: $allowedFilters,
+ allowedSortings: $allowedSortings);
+
+ return $data;
+ }
+
+ public function countryActivityPerSubItem(Request $request): array
+ {
+ $fromDate = $request->from_date ? $request->from_date . ' 00:00:00' : now()->startOfDay()->toDateTimeString();
+ $toDate = $request->date_to ? $request->date_to . ' 23:59:59' : now()->endOfDay()->toDateTimeString();
+ $item = $request->item;
+
+ $provinceRoadItemsPerSubItem = RoadItemsProject::query()->selectRaw('
+ sub_item AS t,
+ COUNT(*) AS c,
+ CAST(SUM(CASE WHEN sub_item_data > 0 THEN sub_item_data ELSE ABS(sub_item_data) END) AS UNSIGNED) AS s,
+ province_id AS p')
+ ->where('item', '=', $item)
+ ->whereBetween('activity_date_time', [$fromDate, $toDate])
+ ->where('status', '=', 1)
+ ->groupBy('province_id', 'sub_item')
+ ->get();
+
+ $countryRoadItemsPerSubItem = RoadItemsProject::query()->selectRaw('
+ sub_item AS t,
+ COUNT(*) AS c,
+ CAST(SUM(CASE WHEN sub_item_data > 0 THEN sub_item_data ELSE ABS(sub_item_data) END) AS UNSIGNED) AS s,
+ -1 AS p')
+ ->where('item', '=', $item)
+ ->whereBetween('activity_date_time', [$fromDate, $toDate])
+ ->where('status', '=', 1)
+ ->groupBy('sub_item')
+ ->get();
+
+
+ $activities = $provinceRoadItemsPerSubItem->push(...$countryRoadItemsPerSubItem);
+
+ return [
+ 'data' => $activities,
+ 'fromDate' => $fromDate,
+ 'toDate' => $toDate,
+ ];
+ }
+
+ public function provinceActivityPerSubItem(Request $request): array
+ {
+ $fromDate = $request->from_date ? $request->from_date . ' 00:00:00' : now()->startOfDay()->toDateTimeString();
+ $toDate = $request->date_to ? $request->date_to . ' 23:59:59' : now()->endOfDay()->toDateTimeString();
+ $item = $request->item;
+ $province = $request->province_id;
+
+ $cityRoadItemsPerSubItem = RoadItemsProject::query()->selectRaw('
+ sub_item AS t,
+ COUNT(*) AS c,
+ CAST(SUM(CASE WHEN sub_item_data > 0 THEN sub_item_data ELSE ABS(sub_item_data) END) AS UNSIGNED) AS s,
+ province_id AS p,
+ edarat_id AS ci
+ ')
+ ->where('item', '=', $item)
+ ->where('province_id', '=', $province)
+ ->whereBetween('activity_date_time', [$fromDate, $toDate])
+ ->where('status', '=', 1)
+ ->groupBy('edarat_id', 'sub_item')
+ ->get();
+
+ $provinceRoadItemsPerSubItem = RoadItemsProject::query()->selectRaw('
+ sub_item AS t,
+ COUNT(*) AS c,
+ CAST(SUM(CASE WHEN sub_item_data > 0 THEN sub_item_data ELSE ABS(sub_item_data) END) AS UNSIGNED) AS s,
+ province_id AS p,
+ -1 AS ci
+ ')
+ ->where('item', '=', $item)
+ ->where('province_id', '=', $province)
+ ->whereBetween('activity_date_time', [$fromDate, $toDate])
+ ->where('status', '=', 1)
+ ->groupBy('sub_item')
+ ->get();
+
+
+ $activities = $cityRoadItemsPerSubItem->push(...$provinceRoadItemsPerSubItem);
+
+ return [
+ 'data' => $activities,
+ 'fromDate' => $fromDate,
+ 'toDate' => $toDate,
+ ];
+ }
+
+ public function countryActivityPerItem(Request $request): array
+ {
+ $fromDate = $request->from_date ? $request->from_date . ' 00:00:00' : now()->startOfDay()->toDateTimeString();
+ $toDate = $request->date_to ? $request->date_to . ' 23:59:59' : now()->endOfDay()->toDateTimeString();
+ $user = auth()->user();
+// $isSpecialUser = in_array($user->username, ['witel', 'drdanesh']);
+ $isSpecialUser = $user->hasPermissionTo("show-road-item-supervise-cartable");
+ $provinceId = $isSpecialUser ? null : $user->province_id;
+
+ $provinceActivity = RoadItemsProject::query()
+ ->selectRaw('COUNT(*) AS s, province_id AS p, item AS i')
+ ->where('status', 1)
+ ->whereBetween('activity_date_time', [$fromDate, $toDate])
+ ->when(!$isSpecialUser, function ($query) use ($provinceId) {
+ $query->where('province_id', $provinceId);
+ })
+ ->groupBy('province_id', 'item');
+
+ $countryActivity = RoadItemsProject::query()
+ ->selectRaw('COUNT(*) AS s, -1 AS p, item AS i')
+ ->where('status', 1)
+ ->whereBetween('activity_date_time', [$fromDate, $toDate])
+ ->when(!$isSpecialUser, function ($query) use ($provinceId) {
+ $query->where('province_id', $provinceId);
+ })
+ ->groupBy('item');
+
+ $activities = $provinceActivity
+ ->unionAll($countryActivity)
+ ->get();
+
+ return [
+ 'data' => $activities,
+ 'fromDate' => $fromDate,
+ 'toDate' => $toDate,
+ ];
+ }
+
+ public function provinceActivityPerItem(Request $request): array
+ {
+ $provinceId = $request->province_id;
+ $fromDate = $request->from_date ? $request->from_date . ' 00:00:00' : now()->startOfDay()->toDateTimeString();
+ $toDate = $request->date_to ? $request->date_to . ' 23:59:59' : now()->endOfDay()->toDateTimeString();
+
+ $edarehActivity = RoadItemsProject::query()
+ ->selectRaw('
+ COUNT(*) AS s,
+ edarat_id AS c,
+ item AS i')
+ ->where('status', '=', 1)
+ ->whereBetween('activity_date_time', [$fromDate, $toDate])
+ ->where('province_id', $provinceId)
+ ->groupBy('item', 'edarat_id');
+
+ $cityActivity = RoadItemsProject::query()
+ ->selectRaw('
+ COUNT(*) AS s,
+ -1 AS c,
+ item AS i')
+ ->where('status', '=', 1)
+ ->whereBetween('activity_date_time', [$fromDate, $toDate])
+ ->where('province_id', $provinceId)
+ ->groupBy('item');
+
+ $activities = $edarehActivity
+ ->unionAll($cityActivity)
+ ->get();
+
+ return [
+ 'data' => $activities,
+ 'fromDate' => $fromDate,
+ 'toDate' => $toDate,
+ ];
+ }
+}
\ No newline at end of file
diff --git a/app/Services/Reports/RoadPatrolReportService.php b/app/Services/Reports/RoadPatrolReportService.php
new file mode 100644
index 00000000..38559505
--- /dev/null
+++ b/app/Services/Reports/RoadPatrolReportService.php
@@ -0,0 +1,196 @@
+user();
+ $query = null;
+
+ if ($user->hasPermissionTo('show-road-patrol-supervise-cartable')) {
+ $query = RoadPatrol::query()
+ ->with(['rahdaran:id,name,code', 'cmmsMachines:id,machine_code,car_name,plak_number']);
+ }
+ elseif ($user->hasPermissionTo('show-road-patrol-supervise-cartable-province')) {
+ if (is_null($user->province_id)) {
+ return $this->errorResponse('استانی برای شما در سامانه ثبت نشده است!');
+ }
+ $query = RoadPatrol::query()
+ ->with(['rahdaran:id,name,code', 'cmmsMachines:id,machine_code,car_name,plak_number'])
+ ->where('province_id', '=', $user->province_id);
+ }
+
+ $data = DataTableFacade::run(
+ $query,
+ $request,
+ allowedFilters: $allowedFilters,
+ allowedSortings: $allowedSortings);
+
+ return $data;
+ }
+
+ public function operatorCartableReport(Request $request)
+ {
+ $columns = array(
+ 'id', 'start_lat', 'start_lon', 'end_lat', 'end_lon', 'officer_plaque', 'created_at',
+ 'officer_phone_number', 'officer_name', 'supervisor_description', 'supervising_time',
+ 'supervisor_name', 'status', 'status_fa', 'distance', 'start_time', 'end_time', 'cmmsMachines.machine_code', 'rahdaran.code',
+ );
+
+ $allowedFilters = $columns;
+ $allowedSortings = $columns;
+
+ $query = RoadPatrol::query()
+ ->with(['rahdaran:id,name,code', 'cmmsMachines:id,machine_code,car_name,plak_number'])
+ ->where('operator_id', '=', auth()->user()->id);
+
+ $data = DataTableFacade::run(
+ $query,
+ $request,
+ allowedFilters: $allowedFilters,
+ allowedSortings: $allowedSortings);
+
+ return $data;
+ }
+
+ public function countryActivity(Request $request): array
+ {
+ $fromDate = $request->from_date ? $request->from_date . ' 00:00:00' : now()->startOfDay()->toDateTimeString();
+ $toDate = $request->date_to ? $request->date_to . ' 23:59:59' : now()->endOfDay()->toDateTimeString();
+
+ $activities = DB::select('SELECT
+ "کشوری" as province_fa,
+ -1 as province_id,
+ COUNT(*) tedade,
+ SUM(tedad_mavarede_moshede_shode_adi) as tedad_mavarede_moshede_shode_adi,
+ SUM(tedad_mavarede_moshede_shode_fori) as tedad_mavarede_moshede_shode_fori,
+ SUM(tedad_mavarede_moshede_shode_ani) as tedad_mavarede_moshede_shode_ani,
+ SUM(tedad_mavarede_peygiri_shode) as tedad_mavarede_peygiri_shode,
+ SUM(tedad_faliyat_sabt_shode) as tedad_faliyat_sabt_shode,
+ ROUND(SUM(distance)) as masafat_tey_shode
+ FROM (SELECT
+ province_id,
+ province_fa,
+ distance,
+ (SELECT COUNT(*) FROM `observed_items` oi WHERE rp.`id`= oi.road_patrol_id AND priority = 1) AS tedad_mavarede_moshede_shode_adi,
+ (SELECT COUNT(*) FROM `observed_items` oi WHERE rp.`id`= oi.road_patrol_id AND priority = 2) AS tedad_mavarede_moshede_shode_fori,
+ (SELECT COUNT(*) FROM `observed_items` oi WHERE rp.`id`= oi.road_patrol_id AND priority = 3) AS tedad_mavarede_moshede_shode_ani,
+ (SELECT COUNT(*) FROM `observed_items` oii WHERE rp.`id`= oii.road_patrol_id AND oii.road_item_id IS NOT NULL AND priority IS NOT NULL) AS tedad_mavarede_peygiri_shode,
+ (SELECT COUNT(*) FROM `observed_items` oii WHERE rp.`id`= oii.road_patrol_id AND oii.road_item_id IS NOT NULL AND priority IS NULL) AS tedad_faliyat_sabt_shode
+ FROM `road_patrols` rp where rp.start_time BETWEEN "'.$fromDate.'" AND "'.$toDate.'") temp
+ union
+ SELECT
+ province_fa,
+ province_id,
+ COUNT(*) tedade,
+ SUM(tedad_mavarede_moshede_shode_adi) as tedad_mavarede_moshede_shode_adi,
+ SUM(tedad_mavarede_moshede_shode_fori) as tedad_mavarede_moshede_shode_fori,
+ SUM(tedad_mavarede_moshede_shode_ani) as tedad_mavarede_moshede_shode_ani,
+ SUM(tedad_mavarede_peygiri_shode) as tedad_mavarede_peygiri_shode,
+ SUM(tedad_faliyat_sabt_shode) as tedad_faliyat_sabt_shode,
+ ROUND(SUM(distance)) as masafat_tey_shode
+ FROM (SELECT
+ province_id,
+ province_fa,
+ distance,
+ (SELECT COUNT(*) FROM `observed_items` oi WHERE rp.`id`= oi.road_patrol_id AND priority = 1) AS tedad_mavarede_moshede_shode_adi,
+ (SELECT COUNT(*) FROM `observed_items` oi WHERE rp.`id`= oi.road_patrol_id AND priority = 2) AS tedad_mavarede_moshede_shode_fori,
+ (SELECT COUNT(*) FROM `observed_items` oi WHERE rp.`id`= oi.road_patrol_id AND priority = 3) AS tedad_mavarede_moshede_shode_ani,
+ (SELECT COUNT(*) FROM `observed_items` oii WHERE rp.`id`= oii.road_patrol_id AND oii.road_item_id IS NOT NULL AND priority IS NOT NULL) AS tedad_mavarede_peygiri_shode,
+ (SELECT COUNT(*) FROM `observed_items` oii WHERE rp.`id`= oii.road_patrol_id AND oii.road_item_id IS NOT NULL AND priority IS NULL) AS tedad_faliyat_sabt_shode
+ FROM `road_patrols` rp where rp.start_time BETWEEN "'.$fromDate.'" AND "'.$toDate.'") temp
+ GROUP BY province_id'
+ );
+
+ return [
+ 'data' => $activities,
+ 'fromDate' => $fromDate,
+ 'toDate' => $toDate
+ ];
+ }
+
+ public function provinceActivity(Request $request): array
+ {
+ $fromDate = $request->from_date ? $request->from_date . ' 00:00:00' : now()->startOfDay()->toDateTimeString();
+ $toDate = $request->date_to ? $request->date_to . ' 23:59:59' : now()->endOfDay()->toDateTimeString();
+ $provinceId = $request->province_id;
+
+ $activities = DB::select(
+ 'SELECT
+ province_fa,
+ province_id,
+ -1 AS edare_id,
+ "استانی" AS edare_name,
+ COUNT(*) tedade,
+ SUM(tedad_mavarede_moshede_shode_adi) as tedad_mavarede_moshede_shode_adi,
+ SUM(tedad_mavarede_moshede_shode_fori) as tedad_mavarede_moshede_shode_fori,
+ SUM(tedad_mavarede_moshede_shode_ani) as tedad_mavarede_moshede_shode_ani,
+ SUM(tedad_mavarede_peygiri_shode) as tedad_mavarede_peygiri_shode,
+ SUM(tedad_faliyat_sabt_shode) as tedad_faliyat_sabt_shode,
+ ROUND(SUM(distance)) as masafat_tey_shode
+ FROM (SELECT
+ province_id,
+ province_fa,
+ edare_id,
+ edare_name,
+ distance,
+ (SELECT COUNT(*) FROM `observed_items` oi WHERE rp.`id`= oi.road_patrol_id AND priority = 1) AS tedad_mavarede_moshede_shode_adi,
+ (SELECT COUNT(*) FROM `observed_items` oi WHERE rp.`id`= oi.road_patrol_id AND priority = 2) AS tedad_mavarede_moshede_shode_fori,
+ (SELECT COUNT(*) FROM `observed_items` oi WHERE rp.`id`= oi.road_patrol_id AND priority = 3) AS tedad_mavarede_moshede_shode_ani,
+ (SELECT COUNT(*) FROM `observed_items` oii WHERE rp.`id`= oii.road_patrol_id AND oii.road_item_id IS NOT NULL AND priority IS NOT NULL) AS tedad_mavarede_peygiri_shode,
+ (SELECT COUNT(*) FROM `observed_items` oii WHERE rp.`id`= oii.road_patrol_id AND oii.road_item_id IS NOT NULL AND priority IS NULL) AS tedad_faliyat_sabt_shode
+ FROM `road_patrols` rp where rp.province_id = "'.$provinceId.'" AND rp.start_time BETWEEN "'.$fromDate.'" AND "'.$toDate.'") temp
+ UNION
+ SELECT
+ province_fa,
+ province_id,
+ edare_id,
+ edare_name,
+ COUNT(*) tedade,
+ SUM(tedad_mavarede_moshede_shode_adi) as tedad_mavarede_moshede_shode_adi,
+ SUM(tedad_mavarede_moshede_shode_fori) as tedad_mavarede_moshede_shode_fori,
+ SUM(tedad_mavarede_moshede_shode_ani) as tedad_mavarede_moshede_shode_ani,
+ SUM(tedad_mavarede_peygiri_shode) as tedad_mavarede_peygiri_shode,
+ SUM(tedad_faliyat_sabt_shode) as tedad_faliyat_sabt_shode,
+ ROUND(SUM(distance)) as masafat_tey_shode
+ FROM (SELECT
+ province_id,
+ province_fa,
+ edare_id,
+ edare_name,
+ distance,
+ (SELECT COUNT(*) FROM `observed_items` oi WHERE rp.`id`= oi.road_patrol_id AND priority = 1) AS tedad_mavarede_moshede_shode_adi,
+ (SELECT COUNT(*) FROM `observed_items` oi WHERE rp.`id`= oi.road_patrol_id AND priority = 2) AS tedad_mavarede_moshede_shode_fori,
+ (SELECT COUNT(*) FROM `observed_items` oi WHERE rp.`id`= oi.road_patrol_id AND priority = 3) AS tedad_mavarede_moshede_shode_ani,
+ (SELECT COUNT(*) FROM `observed_items` oii WHERE rp.`id`= oii.road_patrol_id AND oii.road_item_id IS NOT NULL AND priority IS NOT NULL) AS tedad_mavarede_peygiri_shode,
+ (SELECT COUNT(*) FROM `observed_items` oii WHERE rp.`id`= oii.road_patrol_id AND oii.road_item_id IS NOT NULL AND priority IS NULL) AS tedad_faliyat_sabt_shode
+ FROM `road_patrols` rp where rp.province_id = "'.$provinceId.'" AND rp.start_time BETWEEN "'.$fromDate.'" AND "'.$toDate.'") temp
+ GROUP BY edare_id
+ '
+ );
+
+ return [
+ 'data' => $activities,
+ 'fromDate' => $fromDate,
+ 'toDate' => $toDate
+ ];
+ }
+}
\ No newline at end of file
diff --git a/bootstrap/cache/packages.php b/bootstrap/cache/packages.php
index 9ba8eb78..58a2a104 100755
--- a/bootstrap/cache/packages.php
+++ b/bootstrap/cache/packages.php
@@ -28,6 +28,17 @@
0 => 'KitLoong\\MigrationsGenerator\\MigrationsGeneratorServiceProvider',
),
),
+ 'laravel/pulse' =>
+ array (
+ 'aliases' =>
+ array (
+ 'Pulse' => 'Laravel\\Pulse\\Facades\\Pulse',
+ ),
+ 'providers' =>
+ array (
+ 0 => 'Laravel\\Pulse\\PulseServiceProvider',
+ ),
+ ),
'laravel/sail' =>
array (
'providers' =>
@@ -63,6 +74,17 @@
0 => 'Laravel\\Ui\\UiServiceProvider',
),
),
+ 'livewire/livewire' =>
+ array (
+ 'aliases' =>
+ array (
+ 'Livewire' => 'Livewire\\Livewire',
+ ),
+ 'providers' =>
+ array (
+ 0 => 'Livewire\\LivewireServiceProvider',
+ ),
+ ),
'maatwebsite/excel' =>
array (
'providers' =>
diff --git a/bootstrap/cache/services.php b/bootstrap/cache/services.php
index 13560d20..da457a76 100755
--- a/bootstrap/cache/services.php
+++ b/bootstrap/cache/services.php
@@ -26,26 +26,28 @@
22 => 'Barryvdh\\Debugbar\\ServiceProvider',
23 => 'Hekmatinasser\\Verta\\Laravel\\VertaServiceProvider',
24 => 'KitLoong\\MigrationsGenerator\\MigrationsGeneratorServiceProvider',
- 25 => 'Laravel\\Sail\\SailServiceProvider',
- 26 => 'Laravel\\Sanctum\\SanctumServiceProvider',
- 27 => 'Laravel\\Telescope\\TelescopeServiceProvider',
- 28 => 'Laravel\\Tinker\\TinkerServiceProvider',
- 29 => 'Laravel\\Ui\\UiServiceProvider',
- 30 => 'Maatwebsite\\Excel\\ExcelServiceProvider',
- 31 => 'Carbon\\Laravel\\ServiceProvider',
- 32 => 'NunoMaduro\\Collision\\Adapters\\Laravel\\CollisionServiceProvider',
- 33 => 'Termwind\\Laravel\\TermwindServiceProvider',
- 34 => 'Spatie\\LaravelIgnition\\IgnitionServiceProvider',
- 35 => 'Spatie\\Permission\\PermissionServiceProvider',
- 36 => 'Spatie\\Permission\\PermissionServiceProvider',
- 37 => 'App\\Providers\\AppServiceProvider',
- 38 => 'App\\Providers\\AuthServiceProvider',
- 39 => 'App\\Providers\\EventServiceProvider',
- 40 => 'App\\Providers\\RouteServiceProvider',
- 41 => 'App\\Providers\\TelescopeServiceProvider',
- 42 => 'Barryvdh\\Debugbar\\ServiceProvider',
- 43 => 'App\\Providers\\DataTableServiceProvider',
- 44 => 'App\\Providers\\FileServiceProvider',
+ 25 => 'Laravel\\Pulse\\PulseServiceProvider',
+ 26 => 'Laravel\\Sail\\SailServiceProvider',
+ 27 => 'Laravel\\Sanctum\\SanctumServiceProvider',
+ 28 => 'Laravel\\Telescope\\TelescopeServiceProvider',
+ 29 => 'Laravel\\Tinker\\TinkerServiceProvider',
+ 30 => 'Laravel\\Ui\\UiServiceProvider',
+ 31 => 'Livewire\\LivewireServiceProvider',
+ 32 => 'Maatwebsite\\Excel\\ExcelServiceProvider',
+ 33 => 'Carbon\\Laravel\\ServiceProvider',
+ 34 => 'NunoMaduro\\Collision\\Adapters\\Laravel\\CollisionServiceProvider',
+ 35 => 'Termwind\\Laravel\\TermwindServiceProvider',
+ 36 => 'Spatie\\LaravelIgnition\\IgnitionServiceProvider',
+ 37 => 'Spatie\\Permission\\PermissionServiceProvider',
+ 38 => 'Spatie\\Permission\\PermissionServiceProvider',
+ 39 => 'App\\Providers\\AppServiceProvider',
+ 40 => 'App\\Providers\\AuthServiceProvider',
+ 41 => 'App\\Providers\\EventServiceProvider',
+ 42 => 'App\\Providers\\RouteServiceProvider',
+ 43 => 'App\\Providers\\TelescopeServiceProvider',
+ 44 => 'Barryvdh\\Debugbar\\ServiceProvider',
+ 45 => 'App\\Providers\\DataTableServiceProvider',
+ 46 => 'App\\Providers\\FileServiceProvider',
),
'eager' =>
array (
@@ -62,24 +64,26 @@
10 => 'Barryvdh\\Debugbar\\ServiceProvider',
11 => 'Hekmatinasser\\Verta\\Laravel\\VertaServiceProvider',
12 => 'KitLoong\\MigrationsGenerator\\MigrationsGeneratorServiceProvider',
- 13 => 'Laravel\\Sanctum\\SanctumServiceProvider',
- 14 => 'Laravel\\Telescope\\TelescopeServiceProvider',
- 15 => 'Laravel\\Ui\\UiServiceProvider',
- 16 => 'Maatwebsite\\Excel\\ExcelServiceProvider',
- 17 => 'Carbon\\Laravel\\ServiceProvider',
- 18 => 'NunoMaduro\\Collision\\Adapters\\Laravel\\CollisionServiceProvider',
- 19 => 'Termwind\\Laravel\\TermwindServiceProvider',
- 20 => 'Spatie\\LaravelIgnition\\IgnitionServiceProvider',
- 21 => 'Spatie\\Permission\\PermissionServiceProvider',
- 22 => 'Spatie\\Permission\\PermissionServiceProvider',
- 23 => 'App\\Providers\\AppServiceProvider',
- 24 => 'App\\Providers\\AuthServiceProvider',
- 25 => 'App\\Providers\\EventServiceProvider',
- 26 => 'App\\Providers\\RouteServiceProvider',
- 27 => 'App\\Providers\\TelescopeServiceProvider',
- 28 => 'Barryvdh\\Debugbar\\ServiceProvider',
- 29 => 'App\\Providers\\DataTableServiceProvider',
- 30 => 'App\\Providers\\FileServiceProvider',
+ 13 => 'Laravel\\Pulse\\PulseServiceProvider',
+ 14 => 'Laravel\\Sanctum\\SanctumServiceProvider',
+ 15 => 'Laravel\\Telescope\\TelescopeServiceProvider',
+ 16 => 'Laravel\\Ui\\UiServiceProvider',
+ 17 => 'Livewire\\LivewireServiceProvider',
+ 18 => 'Maatwebsite\\Excel\\ExcelServiceProvider',
+ 19 => 'Carbon\\Laravel\\ServiceProvider',
+ 20 => 'NunoMaduro\\Collision\\Adapters\\Laravel\\CollisionServiceProvider',
+ 21 => 'Termwind\\Laravel\\TermwindServiceProvider',
+ 22 => 'Spatie\\LaravelIgnition\\IgnitionServiceProvider',
+ 23 => 'Spatie\\Permission\\PermissionServiceProvider',
+ 24 => 'Spatie\\Permission\\PermissionServiceProvider',
+ 25 => 'App\\Providers\\AppServiceProvider',
+ 26 => 'App\\Providers\\AuthServiceProvider',
+ 27 => 'App\\Providers\\EventServiceProvider',
+ 28 => 'App\\Providers\\RouteServiceProvider',
+ 29 => 'App\\Providers\\TelescopeServiceProvider',
+ 30 => 'Barryvdh\\Debugbar\\ServiceProvider',
+ 31 => 'App\\Providers\\DataTableServiceProvider',
+ 32 => 'App\\Providers\\FileServiceProvider',
),
'deferred' =>
array (
diff --git a/composer.json b/composer.json
index 05a8958e..825d349e 100644
--- a/composer.json
+++ b/composer.json
@@ -11,6 +11,7 @@
"guzzlehttp/guzzle": "^7.2",
"hekmatinasser/verta": "^8.3",
"laravel/framework": "^10.10",
+ "laravel/pulse": "^1.0@beta",
"laravel/sanctum": "^3.2",
"laravel/telescope": "^4.17",
"laravel/tinker": "^2.8",
@@ -76,6 +77,6 @@
"php-http/discovery": true
}
},
- "minimum-stability": "stable",
+ "minimum-stability": "beta",
"prefer-stable": true
}
diff --git a/composer.lock b/composer.lock
index 7c8ba57f..406835fc 100644
--- a/composer.lock
+++ b/composer.lock
@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
- "content-hash": "f354c54643bedde32669099052baa40c",
+ "content-hash": "fb6adbe1f5e02aaf3de31c514710f0b6",
"packages": [
{
"name": "beberlei/assert",
@@ -865,6 +865,61 @@
],
"time": "2022-12-15T16:57:16+00:00"
},
+ {
+ "name": "doctrine/sql-formatter",
+ "version": "1.5.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/sql-formatter.git",
+ "reference": "d6d00aba6fd2957fe5216fe2b7673e9985db20c8"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/doctrine/sql-formatter/zipball/d6d00aba6fd2957fe5216fe2b7673e9985db20c8",
+ "reference": "d6d00aba6fd2957fe5216fe2b7673e9985db20c8",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^8.1"
+ },
+ "require-dev": {
+ "doctrine/coding-standard": "^12",
+ "ergebnis/phpunit-slow-test-detector": "^2.14",
+ "phpstan/phpstan": "^1.10",
+ "phpunit/phpunit": "^10.5"
+ },
+ "bin": [
+ "bin/sql-formatter"
+ ],
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Doctrine\\SqlFormatter\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jeremy Dorn",
+ "email": "jeremy@jeremydorn.com",
+ "homepage": "https://jeremydorn.com/"
+ }
+ ],
+ "description": "a PHP SQL highlighting library",
+ "homepage": "https://github.com/doctrine/sql-formatter/",
+ "keywords": [
+ "highlight",
+ "sql"
+ ],
+ "support": {
+ "issues": "https://github.com/doctrine/sql-formatter/issues",
+ "source": "https://github.com/doctrine/sql-formatter/tree/1.5.2"
+ },
+ "time": "2025-01-24T11:45:48+00:00"
+ },
{
"name": "dragonmantank/cron-expression",
"version": "v3.3.3",
@@ -2043,6 +2098,92 @@
},
"time": "2023-12-29T22:37:42+00:00"
},
+ {
+ "name": "laravel/pulse",
+ "version": "v1.0.0-beta15",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/laravel/pulse.git",
+ "reference": "6fc88b3ead77fd1c67428f0c0fa6ac2ec5302e2b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/laravel/pulse/zipball/6fc88b3ead77fd1c67428f0c0fa6ac2ec5302e2b",
+ "reference": "6fc88b3ead77fd1c67428f0c0fa6ac2ec5302e2b",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/sql-formatter": "^1.1",
+ "guzzlehttp/promises": "^1.0|^2.0",
+ "illuminate/auth": "^10.34|^11.0",
+ "illuminate/cache": "^10.34|^11.0",
+ "illuminate/config": "^10.34|^11.0",
+ "illuminate/console": "^10.34|^11.0",
+ "illuminate/contracts": "^10.34|^11.0",
+ "illuminate/database": "^10.34|^11.0",
+ "illuminate/events": "^10.34|^11.0",
+ "illuminate/http": "^10.34|^11.0",
+ "illuminate/queue": "^10.34|^11.0",
+ "illuminate/redis": "^10.34|^11.0",
+ "illuminate/routing": "^10.34|^11.0",
+ "illuminate/support": "^10.34|^11.0",
+ "illuminate/view": "^10.34|^11.0",
+ "livewire/livewire": "^3.2",
+ "nesbot/carbon": "^2.67|^3.0",
+ "php": "^8.1"
+ },
+ "conflict": {
+ "nunomaduro/collision": "<7.7.0"
+ },
+ "require-dev": {
+ "guzzlehttp/guzzle": "^7.7",
+ "mockery/mockery": "^1.0",
+ "orchestra/testbench": "^8.16|^9.0",
+ "pestphp/pest": "^2.0",
+ "pestphp/pest-plugin-laravel": "^2.2",
+ "phpstan/phpstan": "^1.11",
+ "predis/predis": "^1.0|^2.0"
+ },
+ "type": "library",
+ "extra": {
+ "laravel": {
+ "aliases": {
+ "Pulse": "Laravel\\Pulse\\Facades\\Pulse"
+ },
+ "providers": [
+ "Laravel\\Pulse\\PulseServiceProvider"
+ ]
+ },
+ "branch-alias": {
+ "dev-master": "1.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Laravel\\Pulse\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Taylor Otwell",
+ "email": "taylor@laravel.com"
+ }
+ ],
+ "description": "Laravel Pulse is a real-time application performance monitoring tool and dashboard for your Laravel application.",
+ "homepage": "https://github.com/laravel/pulse",
+ "keywords": [
+ "laravel"
+ ],
+ "support": {
+ "issues": "https://github.com/laravel/pulse/issues",
+ "source": "https://github.com/laravel/pulse"
+ },
+ "time": "2024-03-11T13:19:11+00:00"
+ },
{
"name": "laravel/sanctum",
"version": "v3.3.3",
@@ -2762,6 +2903,82 @@
],
"time": "2024-01-28T23:22:08+00:00"
},
+ {
+ "name": "livewire/livewire",
+ "version": "v3.5.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/livewire/livewire.git",
+ "reference": "b158c6386a892efc6c5e4682e682829baac1f933"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/livewire/livewire/zipball/b158c6386a892efc6c5e4682e682829baac1f933",
+ "reference": "b158c6386a892efc6c5e4682e682829baac1f933",
+ "shasum": ""
+ },
+ "require": {
+ "illuminate/database": "^10.0|^11.0",
+ "illuminate/routing": "^10.0|^11.0",
+ "illuminate/support": "^10.0|^11.0",
+ "illuminate/validation": "^10.0|^11.0",
+ "league/mime-type-detection": "^1.9",
+ "php": "^8.1",
+ "symfony/console": "^6.0|^7.0",
+ "symfony/http-kernel": "^6.2|^7.0"
+ },
+ "require-dev": {
+ "calebporzio/sushi": "^2.1",
+ "laravel/framework": "^10.15.0|^11.0",
+ "laravel/prompts": "^0.1.6",
+ "mockery/mockery": "^1.3.1",
+ "orchestra/testbench": "^8.21.0|^9.0",
+ "orchestra/testbench-dusk": "^8.24|^9.1",
+ "phpunit/phpunit": "^10.4",
+ "psy/psysh": "^0.11.22|^0.12"
+ },
+ "type": "library",
+ "extra": {
+ "laravel": {
+ "aliases": {
+ "Livewire": "Livewire\\Livewire"
+ },
+ "providers": [
+ "Livewire\\LivewireServiceProvider"
+ ]
+ }
+ },
+ "autoload": {
+ "files": [
+ "src/helpers.php"
+ ],
+ "psr-4": {
+ "Livewire\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Caleb Porzio",
+ "email": "calebporzio@gmail.com"
+ }
+ ],
+ "description": "A front-end framework for Laravel.",
+ "support": {
+ "issues": "https://github.com/livewire/livewire/issues",
+ "source": "https://github.com/livewire/livewire/tree/v3.5.4"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/livewire",
+ "type": "github"
+ }
+ ],
+ "time": "2024-07-15T18:27:32+00:00"
+ },
{
"name": "maatwebsite/excel",
"version": "3.1.52",
@@ -9807,14 +10024,16 @@
}
],
"aliases": [],
- "minimum-stability": "stable",
- "stability-flags": [],
+ "minimum-stability": "beta",
+ "stability-flags": {
+ "laravel/pulse": 10
+ },
"prefer-stable": true,
"prefer-lowest": false,
"platform": {
"php": "^8.1",
"ext-zip": "*"
},
- "platform-dev": [],
+ "platform-dev": {},
"plugin-api-version": "2.6.0"
}
diff --git a/config/logging.php b/config/logging.php
index 4dd0cf49..72cb7076 100644
--- a/config/logging.php
+++ b/config/logging.php
@@ -111,6 +111,12 @@ return [
'path' => storage_path('logs/fms/vehicle_activity_service.log'),
'level' => 'info',
],
+
+ 'road_observation_problem' => [
+ 'driver' => 'single',
+ 'path' => storage_path('logs/road_observation_problem.log'),
+ 'level' => 'info',
+ ],
],
];
diff --git a/config/pulse.php b/config/pulse.php
new file mode 100644
index 00000000..2eb95ccc
--- /dev/null
+++ b/config/pulse.php
@@ -0,0 +1,233 @@
+ env('PULSE_DOMAIN'),
+
+ /*
+ |--------------------------------------------------------------------------
+ | Pulse Path
+ |--------------------------------------------------------------------------
+ |
+ | This is the path which the Pulse dashboard will be accessible from. Feel
+ | free to change this path to anything you'd like. Note that this won't
+ | affect the path of the internal API that is never exposed to users.
+ |
+ */
+
+ 'path' => env('PULSE_PATH', 'pulse'),
+
+ /*
+ |--------------------------------------------------------------------------
+ | Pulse Master Switch
+ |--------------------------------------------------------------------------
+ |
+ | This configuration option may be used to completely disable all Pulse
+ | data recorders regardless of their individual configurations. This
+ | provides a single option to quickly disable all Pulse recording.
+ |
+ */
+
+ 'enabled' => env('PULSE_ENABLED', true),
+
+ /*
+ |--------------------------------------------------------------------------
+ | Pulse Storage Driver
+ |--------------------------------------------------------------------------
+ |
+ | This configuration option determines which storage driver will be used
+ | while storing entries from Pulse's recorders. In addition, you also
+ | may provide any options to configure the selected storage driver.
+ |
+ */
+
+ 'storage' => [
+ 'driver' => env('PULSE_STORAGE_DRIVER', 'database'),
+
+ 'database' => [
+ 'connection' => env('PULSE_DB_CONNECTION', null),
+ 'chunk' => 1000,
+ ],
+ ],
+
+ /*
+ |--------------------------------------------------------------------------
+ | Pulse Ingest Driver
+ |--------------------------------------------------------------------------
+ |
+ | This configuration options determines the ingest driver that will be used
+ | to capture entries from Pulse's recorders. Ingest drivers are great to
+ | free up your request workers quickly by offloading the data storage.
+ |
+ */
+
+ 'ingest' => [
+ 'driver' => env('PULSE_INGEST_DRIVER', 'storage'),
+
+ 'buffer' => env('PULSE_INGEST_BUFFER', 5_000),
+
+ 'trim' => [
+ 'lottery' => [1, 1_000],
+ 'keep' => '7 days',
+ ],
+
+ 'redis' => [
+ 'connection' => env('PULSE_REDIS_CONNECTION'),
+ 'chunk' => 1000,
+ ],
+ ],
+
+ /*
+ |--------------------------------------------------------------------------
+ | Pulse Cache Driver
+ |--------------------------------------------------------------------------
+ |
+ | This configuration option determines the cache driver that will be used
+ | for various tasks, including caching dashboard results, establishing
+ | locks for events that should only occur on one server and signals.
+ |
+ */
+
+ 'cache' => env('PULSE_CACHE_DRIVER'),
+
+ /*
+ |--------------------------------------------------------------------------
+ | Pulse Route Middleware
+ |--------------------------------------------------------------------------
+ |
+ | These middleware will be assigned to every Pulse route, giving you the
+ | chance to add your own middleware to this list or change any of the
+ | existing middleware. Of course, reasonable defaults are provided.
+ |
+ */
+
+ 'middleware' => [
+ 'web',
+ Authorize::class,
+ ],
+
+ /*
+ |--------------------------------------------------------------------------
+ | Pulse Recorders
+ |--------------------------------------------------------------------------
+ |
+ | The following array lists the "recorders" that will be registered with
+ | Pulse, along with their configuration. Recorders gather application
+ | event data from requests and tasks to pass to your ingest driver.
+ |
+ */
+
+ 'recorders' => [
+ Recorders\CacheInteractions::class => [
+ 'enabled' => env('PULSE_CACHE_INTERACTIONS_ENABLED', true),
+ 'sample_rate' => env('PULSE_CACHE_INTERACTIONS_SAMPLE_RATE', 1),
+ 'ignore' => [
+ ...Pulse::defaultVendorCacheKeys(),
+ ],
+ 'groups' => [
+ '/^job-exceptions:.*/' => 'job-exceptions:*',
+ // '/:\d+/' => ':*',
+ ],
+ ],
+
+ Recorders\Exceptions::class => [
+ 'enabled' => env('PULSE_EXCEPTIONS_ENABLED', true),
+ 'sample_rate' => env('PULSE_EXCEPTIONS_SAMPLE_RATE', 1),
+ 'location' => env('PULSE_EXCEPTIONS_LOCATION', true),
+ 'ignore' => [
+ // '/^Package\\\\Exceptions\\\\/',
+ ],
+ ],
+
+ Recorders\Queues::class => [
+ 'enabled' => env('PULSE_QUEUES_ENABLED', true),
+ 'sample_rate' => env('PULSE_QUEUES_SAMPLE_RATE', 1),
+ 'ignore' => [
+ // '/^Package\\\\Jobs\\\\/',
+ ],
+ ],
+
+ Recorders\Servers::class => [
+ 'server_name' => env('PULSE_SERVER_NAME', gethostname()),
+ 'directories' => explode(':', env('PULSE_SERVER_DIRECTORIES', '/')),
+ ],
+
+ Recorders\SlowJobs::class => [
+ 'enabled' => env('PULSE_SLOW_JOBS_ENABLED', true),
+ 'sample_rate' => env('PULSE_SLOW_JOBS_SAMPLE_RATE', 1),
+ 'threshold' => env('PULSE_SLOW_JOBS_THRESHOLD', 1000),
+ 'ignore' => [
+ // '/^Package\\\\Jobs\\\\/',
+ ],
+ ],
+
+ Recorders\SlowOutgoingRequests::class => [
+ 'enabled' => env('PULSE_SLOW_OUTGOING_REQUESTS_ENABLED', true),
+ 'sample_rate' => env('PULSE_SLOW_OUTGOING_REQUESTS_SAMPLE_RATE', 1),
+ 'threshold' => env('PULSE_SLOW_OUTGOING_REQUESTS_THRESHOLD', 1000),
+ 'ignore' => [
+ // '#^http://127\.0\.0\.1:13714#', // Inertia SSR...
+ ],
+ 'groups' => [
+ // '#^https://api\.github\.com/repos/.*$#' => 'api.github.com/repos/*',
+ // '#^https?://([^/]*).*$#' => '\1',
+ // '#/\d+#' => '/*',
+ ],
+ ],
+
+ Recorders\SlowQueries::class => [
+ 'enabled' => env('PULSE_SLOW_QUERIES_ENABLED', true),
+ 'sample_rate' => env('PULSE_SLOW_QUERIES_SAMPLE_RATE', 1),
+ 'threshold' => env('PULSE_SLOW_QUERIES_THRESHOLD', 1000),
+ 'location' => env('PULSE_SLOW_QUERIES_LOCATION', true),
+ 'highlighting' => env('PULSE_SLOW_QUERIES_HIGHLIGHTING', true),
+ 'max_query_length' => env('PULSE_SLOW_QUERIES_MAX_QUERY_LENGTH', null),
+ 'ignore' => [
+ '/(["`])pulse_[\w]+?\1/', // Pulse tables...
+ '/(["`])telescope_[\w]+?\1/', // Telescope tables...
+ ],
+ ],
+
+ Recorders\SlowRequests::class => [
+ 'enabled' => env('PULSE_SLOW_REQUESTS_ENABLED', true),
+ 'sample_rate' => env('PULSE_SLOW_REQUESTS_SAMPLE_RATE', 1),
+ 'threshold' => env('PULSE_SLOW_REQUESTS_THRESHOLD', 1000),
+ 'ignore' => [
+ '#^/pulse$#', // Pulse dashboard...
+ '#^/telescope#', // Telescope dashboard...
+ ],
+ ],
+
+ Recorders\UserJobs::class => [
+ 'enabled' => env('PULSE_USER_JOBS_ENABLED', true),
+ 'sample_rate' => env('PULSE_USER_JOBS_SAMPLE_RATE', 1),
+ 'ignore' => [
+ // '/^Package\\\\Jobs\\\\/',
+ ],
+ ],
+
+ Recorders\UserRequests::class => [
+ 'enabled' => env('PULSE_USER_REQUESTS_ENABLED', true),
+ 'sample_rate' => env('PULSE_USER_REQUESTS_SAMPLE_RATE', 1),
+ 'ignore' => [
+ '#^/pulse$#', // Pulse dashboard...
+ '#^/telescope#', // Telescope dashboard...
+ ],
+ ],
+ ],
+];
diff --git a/database/migrations/2023_06_07_000001_create_pulse_tables.php b/database/migrations/2023_06_07_000001_create_pulse_tables.php
new file mode 100644
index 00000000..f75b51e4
--- /dev/null
+++ b/database/migrations/2023_06_07_000001_create_pulse_tables.php
@@ -0,0 +1,84 @@
+shouldRun()) {
+ return;
+ }
+
+ Schema::create('pulse_values', function (Blueprint $table) {
+ $table->id();
+ $table->unsignedInteger('timestamp');
+ $table->string('type');
+ $table->mediumText('key');
+ match ($this->driver()) {
+ 'mysql' => $table->char('key_hash', 16)->charset('binary')->virtualAs('unhex(md5(`key`))'),
+ 'pgsql' => $table->uuid('key_hash')->storedAs('md5("key")::uuid'),
+ 'sqlite' => $table->string('key_hash'),
+ };
+ $table->mediumText('value');
+
+ $table->index('timestamp'); // For trimming...
+ $table->index('type'); // For fast lookups and purging...
+ $table->unique(['type', 'key_hash']); // For data integrity and upserts...
+ });
+
+ Schema::create('pulse_entries', function (Blueprint $table) {
+ $table->id();
+ $table->unsignedInteger('timestamp');
+ $table->string('type');
+ $table->mediumText('key');
+ match ($this->driver()) {
+ 'mysql' => $table->char('key_hash', 16)->charset('binary')->virtualAs('unhex(md5(`key`))'),
+ 'pgsql' => $table->uuid('key_hash')->storedAs('md5("key")::uuid'),
+ 'sqlite' => $table->string('key_hash'),
+ };
+ $table->bigInteger('value')->nullable();
+
+ $table->index('timestamp'); // For trimming...
+ $table->index('type'); // For purging...
+ $table->index('key_hash'); // For mapping...
+ $table->index(['timestamp', 'type', 'key_hash', 'value']); // For aggregate queries...
+ });
+
+ Schema::create('pulse_aggregates', function (Blueprint $table) {
+ $table->id();
+ $table->unsignedInteger('bucket');
+ $table->unsignedMediumInteger('period');
+ $table->string('type');
+ $table->mediumText('key');
+ match ($this->driver()) {
+ 'mysql' => $table->char('key_hash', 16)->charset('binary')->virtualAs('unhex(md5(`key`))'),
+ 'pgsql' => $table->uuid('key_hash')->storedAs('md5("key")::uuid'),
+ 'sqlite' => $table->string('key_hash'),
+ };
+ $table->string('aggregate');
+ $table->decimal('value', 20, 2);
+ $table->unsignedInteger('count')->nullable();
+
+ $table->unique(['bucket', 'period', 'type', 'aggregate', 'key_hash']); // Force "on duplicate update"...
+ $table->index(['period', 'bucket']); // For trimming...
+ $table->index('type'); // For purging...
+ $table->index(['period', 'type', 'aggregate', 'bucket']); // For aggregate queries...
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down(): void
+ {
+ Schema::dropIfExists('pulse_values');
+ Schema::dropIfExists('pulse_entries');
+ Schema::dropIfExists('pulse_aggregates');
+ }
+};
diff --git a/database/migrations/2025_01_27_085125_change_column_type_in_road_patrols_table.php b/database/migrations/2025_01_27_085125_change_column_type_in_road_patrols_table.php
new file mode 100644
index 00000000..2c20efba
--- /dev/null
+++ b/database/migrations/2025_01_27_085125_change_column_type_in_road_patrols_table.php
@@ -0,0 +1,28 @@
+string('fuel_consumption')->change();
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down(): void
+ {
+ Schema::table('road_patrols', function (Blueprint $table) {
+ $table->integer('fuel_consumption')->change();
+ });
+ }
+};
diff --git a/database/migrations/2025_02_16_111413_create_jobs_table.php b/database/migrations/2025_02_16_111413_create_jobs_table.php
new file mode 100644
index 00000000..6098d9b1
--- /dev/null
+++ b/database/migrations/2025_02_16_111413_create_jobs_table.php
@@ -0,0 +1,32 @@
+bigIncrements('id');
+ $table->string('queue')->index();
+ $table->longText('payload');
+ $table->unsignedTinyInteger('attempts');
+ $table->unsignedInteger('reserved_at')->nullable();
+ $table->unsignedInteger('available_at');
+ $table->unsignedInteger('created_at');
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down(): void
+ {
+ Schema::dropIfExists('jobs');
+ }
+};
diff --git a/database/migrations/2025_02_16_152632_add_column_to_edarate_ostani_table.php b/database/migrations/2025_02_16_152632_add_column_to_edarate_ostani_table.php
new file mode 100644
index 00000000..f7e6bc91
--- /dev/null
+++ b/database/migrations/2025_02_16_152632_add_column_to_edarate_ostani_table.php
@@ -0,0 +1,28 @@
+text('sub_items_for_confirm')->nullable();
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down(): void
+ {
+ Schema::table('edarate_ostani', function (Blueprint $table) {
+ $table->dropColumn('sub_items_for_confirm');
+ });
+ }
+};
diff --git a/database/migrations/2025_02_16_161240_create_failed_jobs_table.php b/database/migrations/2025_02_16_161240_create_failed_jobs_table.php
new file mode 100644
index 00000000..249da817
--- /dev/null
+++ b/database/migrations/2025_02_16_161240_create_failed_jobs_table.php
@@ -0,0 +1,32 @@
+id();
+ $table->string('uuid')->unique();
+ $table->text('connection');
+ $table->text('queue');
+ $table->longText('payload');
+ $table->longText('exception');
+ $table->timestamp('failed_at')->useCurrent();
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down(): void
+ {
+ Schema::dropIfExists('failed_jobs');
+ }
+};
diff --git a/resources/.gitignore b/resources/.gitignore
index 9db1b5b1..a50fbbe5 100644
--- a/resources/.gitignore
+++ b/resources/.gitignore
@@ -1 +1,3 @@
-views
+/views/*
+!/views/v3/
+!/views/v3/*
\ No newline at end of file
diff --git a/resources/views/v3/Reports/RoadItems/CountryActivityPerItem.blade.php b/resources/views/v3/Reports/RoadItems/CountryActivityPerItem.blade.php
new file mode 100644
index 00000000..8185757e
--- /dev/null
+++ b/resources/views/v3/Reports/RoadItems/CountryActivityPerItem.blade.php
@@ -0,0 +1,97 @@
+
+
+
+
+
+
+
+ کشوری
+
+
+
+
+
+
+
+
+ |
+ تاریخ دریافت گزارش: {{ verta()->now()->format('Y/m/d H:i') }}
+ |
+
+
+
+ |
+ |
+
+
+ |
+ گزارش فعالیت روزانه و جاری راهداری از تاریخ
+ {{ verta($fromDate)->format('Y/n/j') }}
+ تا
+ تاریخ
+ {{ verta($toDate)->format('Y/n/j') }}
+
+ |
+
+
+
+ | اداره |
+ مجموع |
+ ایتم های فعالیت روزانه |
+
+
+
+ @foreach($items as $item)
+ | {{ $item['item_str'] }} |
+ @endforeach
+
+
+
+
+ @php
+ // محاسبه مجموع مقدار s برای کل کشور
+ $totalForCountry = collect($data)->where('p', -1)->sum('s');
+
+ // محاسبه مجموع مقدار s برای هر آیتم در کل کشور
+ $itemTotalsForCountry = [];
+ foreach ($items as $item) {
+ $itemTotalsForCountry[$item['item']] = collect($data)->where('p', -1)->where('i', $item['item'])->sum('s');
+ }
+ @endphp
+
+ {{-- ردیف کل کشور --}}
+
+ | کل کشور |
+ {{ $totalForCountry }} |
+ @foreach($items as $item)
+ {{ $itemTotalsForCountry[$item['item']] ?? '-' }} |
+ @endforeach
+
+
+ {{-- ردیفهای مربوط به هر استان --}}
+ @foreach($provinces as $province)
+ @php
+ // محاسبه مجموع مقدار s برای این استان
+ $totalForProvince = collect($data)->where('p', $province['id'])->sum('s');
+
+ // محاسبه مجموع مقدار s برای هر آیتم در این استان
+ $itemTotalsForProvince = [];
+ foreach ($items as $item) {
+ $itemTotalsForProvince[$item['item']] = collect($data)->where('p', $province['id'])->where('i', $item['item'])->sum('s');
+ }
+ @endphp
+
+ | {{ $province['name_fa'] }} |
+ {{ $totalForProvince }} |
+ @foreach($items as $item)
+ {{ $itemTotalsForProvince[$item['item']] ?? '-' }} |
+ @endforeach
+
+ @endforeach
+
+
+
+
diff --git a/resources/views/v3/Reports/RoadItems/CountryActivityPerSubItem.blade.php b/resources/views/v3/Reports/RoadItems/CountryActivityPerSubItem.blade.php
new file mode 100644
index 00000000..7f669bca
--- /dev/null
+++ b/resources/views/v3/Reports/RoadItems/CountryActivityPerSubItem.blade.php
@@ -0,0 +1,96 @@
+
+
+
+
+
+
+ کشوری
+
+
+
+
+
+
+
+
+ |
+ تاریخ دریافت گزارش: {{verta()->now()->format('Y/m/d H:i')}}
+ |
+
+
+
+ |
+
+
+ |
+ تعداد و مجموع فعالیت های روزانه و جاری راهداری ثبت شده از تاریخ
+ {{verta($fromDate)->format('Y/n/j')}}
+ تا
+ تاریخ
+ {{verta($toDate)->format('Y/n/j')}}
+ |
+
+
+
+ | اداره کل |
+ فعالیت های انجام شده |
+
+
+
+ @foreach($subItems as $subItem)
+ | {{ $subItem->sub_item_str }} |
+ @endforeach
+
+
+
+ @foreach($subItems as $subItem)
+ | تعداد |
+ مجموع ({{ $subItem->sub_item_unit }}) |
+ @endforeach
+
+
+
+
+
+ @php
+ // محاسبه مقدار c و s برای هر سابآیتم در کل کشور
+ $countTotalsForCountry = [];
+ $sumTotalsForCountry = [];
+
+ foreach ($subItems as $subItem) {
+ $countTotalsForCountry[$subItem['sub_item']] = collect($data)->where('p', -1)->where('t', $subItem['sub_item'])->sum('c');
+ $sumTotalsForCountry[$subItem['sub_item']] = collect($data)->where('p', -1)->where('t', $subItem['sub_item'])->sum('s');
+ }
+ @endphp
+
+ {{-- ردیف کل کشور --}}
+
+ | کل کشور |
+ @foreach($subItems as $subItem)
+ {{ $countTotalsForCountry[$subItem['sub_item']] ?? '-' }} |
+ {{ $sumTotalsForCountry[$subItem['sub_item']] ?? '-' }} |
+ @endforeach
+
+
+ {{-- ردیفهای مربوط به هر استان --}}
+ @foreach($provinces as $province)
+ @php
+ $countTotalsForProvince = [];
+ $sumTotalsForProvince = [];
+ foreach ($subItems as $subItem) {
+ $countTotalsForProvince[$subItem['sub_item']] = collect($data)->where('p', $province['id'])->where('t', $subItem['sub_item'])->sum('c');
+ $sumTotalsForProvince[$subItem['sub_item']] = collect($data)->where('p', $province['id'])->where('t', $subItem['sub_item'])->sum('s');
+ }
+ @endphp
+
+ | {{ $province['name_fa'] }} |
+ @foreach($subItems as $subItem)
+ {{ $countTotalsForProvince[$subItem['sub_item']] ?? '-' }} |
+ {{ $sumTotalsForProvince[$subItem['sub_item']] ?? '-' }} |
+ @endforeach
+
+ @endforeach
+
+
+
+
\ No newline at end of file
diff --git a/resources/views/v3/Reports/RoadItems/OperatorCartableReport.blade.php b/resources/views/v3/Reports/RoadItems/OperatorCartableReport.blade.php
new file mode 100644
index 00000000..3894defd
--- /dev/null
+++ b/resources/views/v3/Reports/RoadItems/OperatorCartableReport.blade.php
@@ -0,0 +1,118 @@
+
+
+
+
+
+
+
+ گزارش فعالیت های روزانه و جاری
+
+
+
+
+
+
+
+
+
+ |
+ تاریخ دریافت گزارش: {{ verta()->now()->format('Y/m/d H:i') }}
+ |
+
+
+ |
+ |
+
+
+ |
+ گزارش کارتابل عملیات فعالیت های روزانه و جاری
+ |
+
+
+ | کد
+ یکتا |
+
+
+ استان |
+
+ اداره |
+
+ آیتم
+ فعالیت |
+
+ اقدام انجام شده |
+
+ مقدار |
+
+ کد خودرو(ها) |
+
+ کد راهدار(ها) |
+
+ نقطه شروع |
+
+ نقطه پایان |
+
+ تاریخ فعالیت |
+
+ تاریخ ثبت |
+
+ وضعیت نظارت |
+
+ توضیحات ناظر |
+
+
+
+
+ @foreach ($data as $item)
+
+ | {{ $item['id'] ?? '-' }} |
+ {{ $item['province_fa'] ?? '-' }} |
+ {{ $item['edarat_name'] ?? '-' }} |
+
+ {{ $item['item_fa'] ?? '-' }} |
+ {{ $item['sub_item_fa'] ?? '-' }} |
+
+ {{ $item['sub_item_data'] ? ($item['unit_fa'] ? $item['sub_item_data'] . '(' . $item['unit_fa'] . ')' : $item['sub_item_data'] . '(-)') : '-' }}
+ |
+ {{ $item['cmms_machines'] != null ? $item['cmms_machines']->pluck('machine_code')->implode(', ') : '-' }} |
+ {{ $item['rahdaran'] != null ? $item['rahdaran']->pluck('code')->implode(', ') : '-' }} |
+
+ {{ isset($item['start_lat']) && isset($item['start_lng']) ? $item['start_lat'] . ' ' . $item['start_lng'] : '-' }}
+ |
+
+ {{ isset($item['end_lat']) && isset($item['end_lng']) ? $item['end_lat'] . ' ' . $item['end_lng'] : '-' }}
+ |
+ {{ $item['activity_date_time'] ? verta($item['activity_date_time'])->format('Y/n/j H:i:s') : '-' }}
+ | {{ $item['created_at'] ? verta($item['created_at'])->format('Y/n/j H:i:s') : '-' }} |
+ {{ $item['status_fa'] ?? '-' }} |
+ {{ $item['supervisor_description'] ?? '-' }} |
+
+ @endforeach
+
+
+
+
+
diff --git a/resources/views/v3/Reports/RoadItems/ProvinceActivityPerItem.blade.php b/resources/views/v3/Reports/RoadItems/ProvinceActivityPerItem.blade.php
new file mode 100644
index 00000000..5b621aa5
--- /dev/null
+++ b/resources/views/v3/Reports/RoadItems/ProvinceActivityPerItem.blade.php
@@ -0,0 +1,94 @@
+
+
+
+
+
+
+
+ استانی
+
+
+
+
+
+
+
+
+ |
+ تاریخ دریافت گزارش: {{ verta()->now()->format('Y/m/d H:i') }}
+ |
+
+
+
+ |
+ |
+
+
+ |
+ گزارش فعالیت روزانه و جاری راهداری از تاریخ
+ {{ verta($fromDate)->format('Y/n/j') }}
+ تا
+ تاریخ
+ {{ verta($toDate)->format('Y/n/j') }}
+
+ |
+
+
+
+ | اداره |
+ مجموع |
+ ایتم های فعالیت روزانه |
+
+
+
+ @foreach($items as $item)
+ | {{ $item['item_str'] }} |
+ @endforeach
+
+
+
+
+ @php
+ $totalForProvince = collect($data)->where('c', -1)->sum('s');
+
+ $itemTotalsForProvince = [];
+ foreach ($items as $item) {
+ $itemTotalsForProvince[$item['item']] = collect($data)->where('c', -1)->where('i', $item['item'])->sum('s');
+ }
+ @endphp
+
+
+ | کل استان |
+ {{ $totalForProvince }} |
+ @foreach($items as $item)
+ {{ $itemTotalsForProvince[$item['item']] ?? '-' }} |
+ @endforeach
+
+
+ {{-- ردیفهای مربوط به هر استان --}}
+ @foreach($edarateShahri as $edareShahri)
+ @php
+ // محاسبه مجموع مقدار s برای این استان
+ $totalForProvince = collect($data)->where('c', $edareShahri['id'])->sum('s');
+
+ // محاسبه مجموع مقدار s برای هر آیتم در این استان
+ $itemTotalsForProvince = [];
+ foreach ($items as $item) {
+ $itemTotalsForProvince[$item['item']] = collect($data)->where('c', $edareShahri['id'])->where('i', $item['item'])->sum('s');
+ }
+ @endphp
+
+ | {{ $edareShahri['name_fa'] }} |
+ {{ $totalForProvince }} |
+ @foreach($items as $item)
+ {{ $itemTotalsForProvince[$item['item']] ?? '-' }} |
+ @endforeach
+
+ @endforeach
+
+
+
+
diff --git a/resources/views/v3/Reports/RoadItems/ProvinceActivityPerSubItem.blade.php b/resources/views/v3/Reports/RoadItems/ProvinceActivityPerSubItem.blade.php
new file mode 100644
index 00000000..2b552d68
--- /dev/null
+++ b/resources/views/v3/Reports/RoadItems/ProvinceActivityPerSubItem.blade.php
@@ -0,0 +1,96 @@
+
+
+
+
+
+
+ استانی
+
+
+
+
+
+
+
+
+ |
+ تاریخ دریافت گزارش: {{verta()->now()->format('Y/m/d H:i')}}
+ |
+
+
+
+ |
+
+
+ |
+ تعداد و مجموع فعالیت های روزانه و جاری راهداری ثبت شده از تاریخ
+ {{verta($fromDate)->format('Y/n/j')}}
+ تا
+ تاریخ
+ {{verta($toDate)->format('Y/n/j')}}
+ |
+
+
+
+ | اداره کل |
+ فعالیت های انجام شده |
+
+
+
+ @foreach($subItems as $subItem)
+ | {{ $subItem->sub_item_str }} |
+ @endforeach
+
+
+
+ @foreach($subItems as $subItem)
+ | تعداد |
+ مجموع ({{ $subItem->sub_item_unit }}) |
+ @endforeach
+
+
+
+
+
+ @php
+ // محاسبه مقدار c و s برای هر سابآیتم در کل کشور
+ $countTotalsForProvince = [];
+ $sumTotalsForProvince = [];
+
+ foreach ($subItems as $subItem) {
+ $countTotalsForProvince[$subItem['sub_item']] = collect($data)->where('ci', -1)->where('t', $subItem['sub_item'])->sum('c');
+ $sumTotalsForProvince[$subItem['sub_item']] = collect($data)->where('ci', -1)->where('t', $subItem['sub_item'])->sum('s');
+ }
+ @endphp
+
+ {{-- ردیف کل کشور --}}
+
+ | کل کشور |
+ @foreach($subItems as $subItem)
+ {{ $countTotalsForProvince[$subItem['sub_item']] ?? '-' }} |
+ {{ $sumTotalsForProvince[$subItem['sub_item']] ?? '-' }} |
+ @endforeach
+
+
+ {{-- ردیفهای مربوط به هر استان --}}
+ @foreach($edarateShahri as $edareShahri)
+ @php
+ $countTotalsForProvince = [];
+ $sumTotalsForProvince = [];
+ foreach ($subItems as $subItem) {
+ $countTotalsForProvince[$subItem['sub_item']] = collect($data)->where('ci', $edareShahri['id'])->where('t', $subItem['sub_item'])->sum('c');
+ $sumTotalsForProvince[$subItem['sub_item']] = collect($data)->where('ci', $edareShahri['id'])->where('t', $subItem['sub_item'])->sum('s');
+ }
+ @endphp
+
+ | {{ $edareShahri['name_fa'] }} |
+ @foreach($subItems as $subItem)
+ {{ $countTotalsForProvince[$subItem['sub_item']] ?? '-' }} |
+ {{ $sumTotalsForProvince[$subItem['sub_item']] ?? '-' }} |
+ @endforeach
+
+ @endforeach
+
+
+
+
\ No newline at end of file
diff --git a/resources/views/v3/Reports/RoadItems/SupervisorCartableReport.blade.php b/resources/views/v3/Reports/RoadItems/SupervisorCartableReport.blade.php
new file mode 100644
index 00000000..6203dbbc
--- /dev/null
+++ b/resources/views/v3/Reports/RoadItems/SupervisorCartableReport.blade.php
@@ -0,0 +1,118 @@
+
+
+
+
+
+
+
+ گزارش فعالیت های روزانه و جاری
+
+
+
+
+
+
+
+
+
+ |
+ تاریخ دریافت گزارش: {{ verta()->now()->format('Y/m/d H:i') }}
+ |
+
+
+ |
+ |
+
+
+ |
+ گزارش کارتابل ارزیابی فعالیت های روزانه و جاری
+ |
+
+
+ | کد
+ یکتا |
+
+
+ استان |
+
+ اداره |
+
+ آیتم
+ فعالیت |
+
+ اقدام انجام شده |
+
+ مقدار |
+
+ کد خودرو(ها) |
+
+ کد راهدار(ها) |
+
+ نقطه شروع |
+
+ نقطه پایان |
+
+ تاریخ فعالیت |
+
+ تاریخ ثبت |
+
+ وضعیت نظارت |
+
+ توضیحات ناظر |
+
+
+
+
+ @foreach ($data as $item)
+
+ | {{ $item['id'] ?? '-' }} |
+ {{ $item['province_fa'] ?? '-' }} |
+ {{ $item['edarat_name'] ?? '-' }} |
+
+ {{ $item['item_fa'] ?? '-' }} |
+ {{ $item['sub_item_fa'] ?? '-' }} |
+
+ {{ $item['sub_item_data'] ? ($item['unit_fa'] ? $item['sub_item_data'] . '(' . $item['unit_fa'] . ')' : $item['sub_item_data'] . '(-)') : '-' }}
+ |
+ {{ $item['cmms_machines'] != null ? $item['cmms_machines']->pluck('machine_code')->implode(', ') : '-' }} |
+ {{ $item['rahdaran'] != null ? $item['rahdaran']->pluck('code')->implode(', ') : '-' }} |
+
+ {{ isset($item['start_lat']) && isset($item['start_lng']) ? $item['start_lat'] . ' ' . $item['start_lng'] : '-' }}
+ |
+
+ {{ isset($item['end_lat']) && isset($item['end_lng']) ? $item['end_lat'] . ' ' . $item['end_lng'] : '-' }}
+ |
+ {{ $item['activity_date_time'] ? verta($item['activity_date_time'])->format('Y/n/j H:i:s') : '-' }}
+ | {{ $item['created_at'] ? verta($item['created_at'])->format('Y/n/j H:i:s') : '-' }} |
+ {{ $item['status_fa'] ?? '-' }} |
+ {{ $item['supervisor_description'] ?? '-' }} |
+
+ @endforeach
+
+
+
+
+
diff --git a/resources/views/v3/Reports/RoadPatrols/CountryActivity.blade.php b/resources/views/v3/Reports/RoadPatrols/CountryActivity.blade.php
new file mode 100644
index 00000000..bba1555a
--- /dev/null
+++ b/resources/views/v3/Reports/RoadPatrols/CountryActivity.blade.php
@@ -0,0 +1,131 @@
+
+
+
+
+
+
+
+ کشوری
+
+
+
+
+
+
+
+
+ |
+ تاریخ دریافت گزارش: {{ verta()->now()->format('Y/m/d H:i') }}
+ |
+
+
+
+ |
+ |
+
+
+ |
+ گزارش گشت راهداری و ترابری از تاریخ
+ {{ verta($fromDate)->format('Y/n/j') }}
+ تا
+ تاریخ
+ {{ verta($toDate)->format('Y/n/j') }}
+
+ |
+
+
+
+
+
+ |
+ تعداد کل
+ |
+
+
+ اقدامات لازم جهت رسیدگی آتی
+ |
+
+ اقدامات رسیدگی شده
+ |
+
+ مجموع مسافت پیمایش شده(کیلومتر)
+ |
+
+ تعداد فعالیت صورت گرفته حین گشت زنی
+ |
+
+
+ |
+ عادی
+ |
+
+ فوری
+ |
+
+ آنی
+ |
+
+
+
+
+
+ @php
+ // محاسبه مجموع مقدار s برای کل کشور
+ $totalForCountry = collect($activities)->where('province_id', -1)->first();
+ @endphp
+
+ {{-- ردیف کل کشور --}}
+
+ | کل کشور |
+ {{ $totalForCountry->tedade }} |
+ {{ $totalForCountry->tedad_mavarede_moshede_shode_adi }} |
+ {{ $totalForCountry->tedad_mavarede_moshede_shode_fori }} |
+ {{ $totalForCountry->tedad_mavarede_moshede_shode_ani }} |
+ {{ $totalForCountry->tedad_mavarede_peygiri_shode }} |
+ {{ $totalForCountry->masafat_tey_shode }} |
+ {{ $totalForCountry->tedad_faliyat_sabt_shode }} |
+
+
+ @foreach ($provinces as $province)
+ @php
+ $totalForProvince = collect($activities)->where('province_id', $province->id)->first();
+ @endphp
+ @if($totalForProvince)
+
+ | {{ $totalForProvince->province_fa }} |
+ {{ $totalForProvince->tedade }} |
+ {{ $totalForProvince->tedad_mavarede_moshede_shode_adi }} |
+ {{ $totalForProvince->tedad_mavarede_moshede_shode_fori }} |
+ {{ $totalForProvince->tedad_mavarede_moshede_shode_ani }} |
+ {{ $totalForProvince->tedad_mavarede_peygiri_shode }} |
+ {{ $totalForProvince->masafat_tey_shode }} |
+ {{ $totalForProvince->tedad_faliyat_sabt_shode }} |
+
+ @else
+
+ | {{ $province->name_fa }} |
+ 0 |
+ 0 |
+ 0 |
+ 0 |
+ 0 |
+ 0 |
+ 0 |
+
+ @endif
+ @endforeach
+
+
+
+
diff --git a/resources/views/v3/Reports/RoadPatrols/OperatorCartableReport.blade.php b/resources/views/v3/Reports/RoadPatrols/OperatorCartableReport.blade.php
new file mode 100644
index 00000000..c90cb1da
--- /dev/null
+++ b/resources/views/v3/Reports/RoadPatrols/OperatorCartableReport.blade.php
@@ -0,0 +1,89 @@
+
+
+
+
+
+
+
+ گزارش گشت راهداری
+
+
+
+
+
+
+
+
+
+ |
+ تاریخ دریافت گزارش: {{ verta()->now()->format('Y/m/d H:i') }}
+ |
+
+
+ |
+ |
+
+
+ |
+ گزارش کارتابل عملیات گشت راهداری
+ |
+
+
+ | کد
+ یکتا |
+
+ استان |
+
+ اداره |
+
+ کد خودرو(ها) |
+
+ کد راهدار(ها) |
+
+ تاریخ شروع |
+
+ تاریخ پایان |
+
+ تاریخ ثبت |
+
+ توضیحات مامور |
+
+
+
+
+ @foreach ($data as $item)
+
+ | {{ $item['id'] ?? '-' }} |
+ {{ $item['province_fa'] ?? '-' }} |
+ {{ $item['edare_name'] ?? '-' }} |
+ {{ $item['cmms_machines'] != null ? $item['cmms_machines']->pluck('machine_code')->implode(', ') : '-' }} |
+ {{ $item['rahdaran'] != null ? $item['rahdaran']->pluck('code')->implode(', ') : '-' }} |
+ {{ $item['start_time'] ? verta($item['start_time'])->format('Y/n/j H:i:s') : '-' }}
+ | {{ $item['end_time'] ? verta($item['end_time'])->format('Y/n/j H:i:s') : '-' }}
+ | {{ $item['created_at'] ? verta($item['created_at'])->format('Y/n/j H:i:s') : '-' }} |
+ {{ $item['description'] ?? '-' }} |
+
+ @endforeach
+
+
+
+
+
diff --git a/resources/views/v3/Reports/RoadPatrols/ProvinceActivity.blade.php b/resources/views/v3/Reports/RoadPatrols/ProvinceActivity.blade.php
new file mode 100644
index 00000000..5ab14deb
--- /dev/null
+++ b/resources/views/v3/Reports/RoadPatrols/ProvinceActivity.blade.php
@@ -0,0 +1,131 @@
+
+
+
+
+
+
+
+ استانی
+
+
+
+
+
+
+
+
+ |
+ تاریخ دریافت گزارش: {{ verta()->now()->format('Y/m/d H:i') }}
+ |
+
+
+
+ |
+ |
+
+
+ |
+ گزارش گشت راهداری و ترابری از تاریخ
+ {{ verta($fromDate)->format('Y/n/j') }}
+ تا
+ تاریخ
+ {{ verta($toDate)->format('Y/n/j') }}
+
+ |
+
+
+
+
+
+ |
+ تعداد کل
+ |
+
+
+ اقدامات لازم جهت رسیدگی آتی
+ |
+
+ اقدامات رسیدگی شده
+ |
+
+ مجموع مسافت پیمایش شده(کیلومتر)
+ |
+
+ تعداد فعالیت صورت گرفته حین گشت زنی
+ |
+
+
+ |
+ عادی
+ |
+
+ فوری
+ |
+
+ آنی
+ |
+
+
+
+
+
+ @php
+ // محاسبه مجموع مقدار s برای کل کشور
+ $totalForProvince = collect($activities)->where('edare_id', -1)->first();
+ @endphp
+
+ {{-- ردیف کل کشور --}}
+
+ | کل استان |
+ {{ $totalForProvince->tedade ?? 0 }} |
+ {{ $totalForProvince->tedad_mavarede_moshede_shode_adi ?? 0 }} |
+ {{ $totalForProvince->tedad_mavarede_moshede_shode_fori ?? 0 }} |
+ {{ $totalForProvince->tedad_mavarede_moshede_shode_ani ?? 0 }} |
+ {{ $totalForProvince->tedad_mavarede_peygiri_shode ?? 0 }} |
+ {{ $totalForProvince->masafat_tey_shode ?? 0 }} |
+ {{ $totalForProvince->tedad_faliyat_sabt_shode ?? 0 }} |
+
+
+ @foreach ($edarateShahri as $edareShahri)
+ @php
+ $totalForEdare = collect($activities)->where('edare_id', $edareShahri->id)->first();
+ @endphp
+ @if($totalForEdare)
+
+ | {{ $totalForEdare->edare_name }} |
+ {{ $totalForEdare->tedade }} |
+ {{ $totalForEdare->tedad_mavarede_moshede_shode_adi }} |
+ {{ $totalForEdare->tedad_mavarede_moshede_shode_fori }} |
+ {{ $totalForEdare->tedad_mavarede_moshede_shode_ani }} |
+ {{ $totalForEdare->tedad_mavarede_peygiri_shode }} |
+ {{ $totalForEdare->masafat_tey_shode }} |
+ {{ $totalForEdare->tedad_faliyat_sabt_shode }} |
+
+ @else
+
+ | {{ $edareShahri->name_fa }} |
+ 0 |
+ 0 |
+ 0 |
+ 0 |
+ 0 |
+ 0 |
+ 0 |
+
+ @endif
+ @endforeach
+
+
+
+
diff --git a/resources/views/v3/Reports/RoadPatrols/SupervisorCartableReport.blade.php b/resources/views/v3/Reports/RoadPatrols/SupervisorCartableReport.blade.php
new file mode 100644
index 00000000..0fb2a3d1
--- /dev/null
+++ b/resources/views/v3/Reports/RoadPatrols/SupervisorCartableReport.blade.php
@@ -0,0 +1,89 @@
+
+
+
+
+
+
+
+ گزارش گشت راهداری
+
+
+
+
+
+
+
+
+
+ |
+ تاریخ دریافت گزارش: {{ verta()->now()->format('Y/m/d H:i') }}
+ |
+
+
+ |
+ |
+
+
+ |
+ گزارش کارتابل ارزیابی گشت راهداری
+ |
+
+
+ | کد
+ یکتا |
+
+ استان |
+
+ اداره |
+
+ کد خودرو(ها) |
+
+ کد راهدار(ها) |
+
+ تاریخ شروع |
+
+ تاریخ پایان |
+
+ تاریخ ثبت |
+
+ توضیحات مامور |
+
+
+
+
+ @foreach ($data as $item)
+
+ | {{ $item['id'] ?? '-' }} |
+ {{ $item['province_fa'] ?? '-' }} |
+ {{ $item['edare_name'] ?? '-' }} |
+ {{ $item['cmms_machines'] != null ? $item['cmms_machines']->pluck('machine_code')->implode(', ') : '-' }} |
+ {{ $item['rahdaran'] != null ? $item['rahdaran']->pluck('code')->implode(', ') : '-' }} |
+ {{ $item['start_time'] ? verta($item['start_time'])->format('Y/n/j H:i:s') : '-' }}
+ | {{ $item['end_time'] ? verta($item['end_time'])->format('Y/n/j H:i:s') : '-' }}
+ | {{ $item['created_at'] ? verta($item['created_at'])->format('Y/n/j H:i:s') : '-' }} |
+ {{ $item['description'] ?? '-' }} |
+
+ @endforeach
+
+
+
+
+
diff --git a/routes/v3.php b/routes/v3.php
index 78e8be34..a0fa2ed7 100644
--- a/routes/v3.php
+++ b/routes/v3.php
@@ -152,9 +152,6 @@ Route::prefix('road_patrols')
Route::get('/operator/report/{roadPatrol}', 'getReport')
->name('getReport');
- Route::get('/operator/map_data', 'getAllDataToMap')
- ->name('getAllDataToMap');
-
Route::get('/detail/{roadPatrol}', 'show')
->name('show');
});
@@ -195,18 +192,26 @@ Route::prefix('road_item_reports')
->controller(RoadItemsReportController::class)
->group(function () {
Route::get('/get_sub_items', 'getSubItems')->name('getSubItems');
+ Route::get('/country_activity_per_sub_item', 'countryActivityPerSubItem')->name('countryActivityPerSubItem');
Route::get('/province_activity_per_sub_item', 'provinceActivityPerSubItem')->name('provinceActivityPerSubItem');
- Route::get('/city_activity_per_sub_item', 'cityActivityPerSubItem')->name('cityActivityPerSubItem');
+ Route::get('/country_activity_per_item', 'countryActivityPerItem')->name('countryActivityPerItem');
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::get('/activities_on_map', 'activitiesOnMap')->name('activitiesOnMap');
+ Route::get('/show_on_map/{roadItemsProject}', 'showOnMap')->name('showOnMap');
});
Route::prefix('road_patrol_reports')
->name('roadPatrolReports.')
->controller(RoadPatrolReportController::class)
->group(function () {
+ Route::get('/country_activity', 'countryPatrolActivity')->name('countryPatrolActivity');
Route::get('/province_activity', 'provincePatrolActivity')->name('provincePatrolActivity');
- Route::get('/city_activity', 'cityPatrolActivity')->name('cityPatrolActivity');
- Route::get('/excel', 'excel')->name('excel');
+ Route::get('/country_activity_excel', 'countryActivityExcel')->name('countryActivityExcel');
+ Route::get('/province_activity_excel', 'provinceActivityExcel')->name('provinceActivityExcel');
+ Route::get('/activities_on_map', 'activitiesOnMap')->name('activitiesOnMap');
+ Route::get('/show_on_map/{roadPatrol}', 'showOnMap')->name('showOnMap');
});
diff --git a/storage/sql-files/edarate_shahri.sql b/storage/sql-files/edarate_shahri.sql
index 85a2b042..83b4b022 100644
--- a/storage/sql-files/edarate_shahri.sql
+++ b/storage/sql-files/edarate_shahri.sql
@@ -518,6 +518,6 @@ INSERT INTO edarate_shahri (name_fa,province_id,created_at,updated_at) VALUES
('اداره آق قلا',27,'2023-03-13 14:12:25','2023-03-13 14:12:25');
INSERT INTO edarate_shahri (name_fa,province_id,created_at,updated_at) VALUES
('اداره خمام',28,'2023-06-17 08:43:14','2023-06-17 08:43:14'),
- ('اداره اصلاندوز',3,'2023-08-15 09:33:55','2023-08-15 09:33:55');
- ('اداره گالیکش',27,'2024-11-16 14:33:55','2024-11-16 14:33:55');
+ ('اداره اصلاندوز',3,'2023-08-15 09:33:55','2023-08-15 09:33:55'),
+ ('اداره گالیکش',27,'2024-11-16 14:33:55','2024-11-16 14:33:55'),
('آزادراه ساوه-تهران',32,'2025-01-06 14:33:55','2025-01-06 14:33:55');
diff --git a/storage/sql-files/log_lists.sql b/storage/sql-files/log_lists.sql
index 914b9823..4cef3f6e 100644
--- a/storage/sql-files/log_lists.sql
+++ b/storage/sql-files/log_lists.sql
@@ -160,4 +160,4 @@ INSERT INTO log_lists (description,log_unique_code,action_type,is_done) VALUES
('حذف نوع آزمایش','1164','action',0),
('ثبت نمونه آزمایش','1165','action',0),
('ویرایش نمونه آزمایش','1166','action',0),
- ('حذف نمونه آزمایش','1167','action',0),
+ ('حذف نمونه آزمایش','1167','action',0);
diff --git a/storage/sql-files/permissions.sql b/storage/sql-files/permissions.sql
index a03a7003..d6515554 100644
--- a/storage/sql-files/permissions.sql
+++ b/storage/sql-files/permissions.sql
@@ -132,6 +132,6 @@ INSERT INTO permissions (name,guard_name,name_fa,description,created_at,updated_
('delete-safety-and-privacy','web','حذف نگهداری و حریم','کاربر امکان حذف یک فعالیت نگهداری حریم راه را دارد',NULL,NULL,NULL,NULL,'safety-and-privacy','نگهداری حریم راه',0,0),
('show-receipt','web','نمایش خسارت (کشوری)','نمایش خسارات کشوری',NULL,NULL,NULL,NULL,'receipt','خسارات وارد بر ابنیه فنی راه',0,0),
('show-receipt-province','web','نمایش خسارت (استانی)','نمایش خسارات استانی',NULL,NULL,NULL,NULL,'receipt','خسارات وارد بر ابنیه فنی راه',1,0),
- ('supervise-road-item-by-edareostani','web','نظارت بر ثبت فعالیت روزانه و جاری(ادارات استانی)',NULL,'2023-07-09 09:48:35','2023-07-09 09:48:37',NULL,NULL,'road-item','فعالیت روزانه',0,0);
- ('azmayesh-management','web','مدیریت آزمایشات',NULL,'2024-11-18 09:48:35','2024-11-18 09:48:35',NULL,NULL,'azmayesh','آزمایشات',0,0);
+ ('supervise-road-item-by-edareostani','web','نظارت بر ثبت فعالیت روزانه و جاری(ادارات استانی)',NULL,'2023-07-09 09:48:35','2023-07-09 09:48:37',NULL,NULL,'road-item','فعالیت روزانه',0,0),
+ ('azmayesh-management','web','مدیریت آزمایشات',NULL,'2024-11-18 09:48:35','2024-11-18 09:48:35',NULL,NULL,'azmayesh','آزمایشات',0,0),
('azmayesh-type-management','web','مدیریت نوع آزمایشات',NULL,'2024-11-18 09:48:35','2024-11-18 09:48:35',NULL,NULL,'azmayesh','آزمایشات',0,0);