Merge branch 'develop' into 'main'

Develop

See merge request witelgroup/rms_v2!59
This commit is contained in:
2025-01-12 08:28:03 +00:00
20 changed files with 723 additions and 65 deletions

View File

@@ -17,7 +17,12 @@ class CampController extends Controller
public function index(Request $request)
{
$province = $request->province ?? null;
$blockageDate = $request->blockage_date ?? null;
$city = $request->city ?? null;
$blockageStartDate = $request->blockage_start_date ?? null;
$blockageEndDate = $request->blockage_end_date ?? null;
$blockageDate = $blockageStartDate && $blockageEndDate ?
[$blockageStartDate . ' 00:00:00', $blockageEndDate . ' 23:59:59'] :
null;
$axisType = $request->axis_type ?? null;
$blockageReason = $request->blockage ?? null;
@@ -28,8 +33,11 @@ class CampController extends Controller
->when($province, function ($query, $province) {
return $query->where('province_id', $province);
})
->when($city, function ($query, $city) {
return $query->where('city_id', $city);
})
->when($blockageDate, function ($query, $blockageDate) {
return $query->whereBetween('submited_at', [$blockageDate . ' 00:00:00', $blockageDate . ' 23:59:59']);
return $query->whereBetween('submited_at', $blockageDate);
})
->when($axisType, function ($query, $axisType) {
return $query->where('axis_type', $axisType);
@@ -48,6 +56,9 @@ class CampController extends Controller
->when($blockageDate, function ($query, $blockageDate) {
return $query->whereBetween('submited_at', [$blockageDate . ' 00:00:00', $blockageDate . ' 23:59:59']);
})
->when($city, function ($query, $city) {
return $query->where('city_id', $city);
})
->when($axisType, function ($query, $axisType) {
return $query->where('axis_type', $axisType);
})

View File

@@ -14,7 +14,7 @@ class CMMSMachinesController extends Controller
public function list(): JsonResponse
{
$machinesList = CMMSMachine::query()->get(['machine_code', 'id']);
$machinesList = CMMSMachine::query()->get(['machine_code', 'id', 'plak_number', 'car_name']);
return $this->successResponse($machinesList);
}
@@ -23,7 +23,7 @@ class CMMSMachinesController extends Controller
{
$matchedSearchedMachines = CMMSMachine::query()
->where('machine_code', 'LIKE', "%{$request->machine_code}%")
->get(['machine_code', 'id']);
->get(['machine_code', 'id', 'plak_number', 'car_name']);
return $this->successResponse($matchedSearchedMachines);
}

View File

@@ -1,9 +1,11 @@
<?php
namespace App\Http\Controllers\V3\Azmayesh;
namespace App\Http\Controllers\V3\Dashboard\Azmayesh;
use App\Facades\DataTable\DataTableFacade;
use App\Http\Controllers\Controller;
use App\Http\Requests\V3\Azmayesh\StoreRequest;
use App\Http\Requests\V3\Azmayesh\UpdateRequest;
use App\Http\Traits\ApiResponse;
use App\Models\Azmayesh;
use App\Models\AzmayeshType;
@@ -11,8 +13,6 @@ use App\Models\Province;
use Illuminate\Database\QueryException;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use App\Http\Requests\V3\Azmayesh\StoreRequest;
use App\Http\Requests\V3\Azmayesh\UpdateRequest;
class AzmayeshController extends Controller
{
@@ -84,6 +84,8 @@ class AzmayeshController extends Controller
'contract_subitem_id' => $request->contract_subitem_id
]);
$user->addActivityComplete(1158);
return $this->successResponse();
}
@@ -122,6 +124,8 @@ class AzmayeshController extends Controller
'contract_subitem_id' => $request->contract_subitem_id
]);
auth()->user()->addActivityComplete(1159);
return $this->successResponse();
}
@@ -133,6 +137,8 @@ class AzmayeshController extends Controller
try {
$azmayesh->delete();
auth()->user()->addActivityComplete(1160);
return $this->successResponse();
}
catch (QueryException $exception) {

View File

@@ -1,18 +1,16 @@
<?php
namespace App\Http\Controllers\V3\Azmayesh;
namespace App\Http\Controllers\V3\Dashboard\Azmayesh;
use App\Http\Controllers\Controller;
use App\Facades\DataTable\DataTableFacade;
use App\Http\Traits\ApiResponse;
use App\Models\Azmayesh;
use App\Models\AzmayeshType;
use App\Models\AzmayeshSample;
use App\Models\Province;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Http\Requests\V3\AzmayeshSample\StoreRequest;
use App\Http\Requests\V3\AzmayeshSample\UpdateRequest;
use App\Http\Traits\ApiResponse;
use App\Models\Azmayesh;
use App\Models\AzmayeshSample;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class AzmayeshSampleController extends Controller
{

View File

@@ -1,6 +1,6 @@
<?php
namespace App\Http\Controllers\V3\Azmayesh;
namespace App\Http\Controllers\V3\Dashboard\Azmayesh;
use App\Facades\DataTable\DataTableFacade;
use App\Http\Controllers\Controller;
@@ -67,6 +67,8 @@ class AzmayeshTypeController extends Controller
}
$azmayeshType->azmayeshFields()->attach($fieldsID);
auth()->user()->addActivityComplete(1162);
});
return $this->successResponse();
@@ -100,6 +102,8 @@ class AzmayeshTypeController extends Controller
}
$azmayeshType->azmayeshFields()->sync($fieldsID);
auth()->user()->addActivityComplete(1163);
});
return $this->successResponse();
@@ -113,6 +117,8 @@ class AzmayeshTypeController extends Controller
try {
$azmayeshType->delete();
auth()->user()->addActivityComplete(1164);
return $this->successResponse();
}
catch (QueryException $exception) {

View File

@@ -0,0 +1,40 @@
<?php
namespace App\Http\Controllers\V3\Dashboard;
use App\Facades\DataTable\DataTableFacade;
use App\Http\Controllers\Controller;
use App\Http\Traits\ApiResponse;
use App\Models\ObservedItem;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class ObservedItemController extends Controller
{
use ApiResponse;
public function show(ObservedItem $observedItem): JsonResponse
{
return $this->successResponse($observedItem);
}
public function filter(Request $request): JsonResponse
{
$columns = array(
'id', 'item_id', 'road_patrol_id', 'roadPatrol.start_time', 'roadPatrol.end_time',
);
$allowedFilters = $columns;
$allowedSortings = $columns;
$data = ObservedItem::query()->whereNull('road_item_id');
$dataTable = DataTableFacade::run(
$data,
$request,
allowedFilters: $allowedFilters,
allowedSortings: $allowedSortings
);
return response()->json($dataTable);
}
}

View File

@@ -0,0 +1,261 @@
<?php
namespace App\Http\Controllers\V3\Dashboard\Reports;
use App\Exports\Activities\One\AllSheets as OneSheet;
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 Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Maatwebsite\Excel\Facades\Excel;
use Symfony\Component\HttpFoundation\BinaryFileResponse;
class RoadItemsReportController extends Controller
{
use ApiResponse;
public function getSubItems(): JsonResponse
{
$data = InfoItem::all();
$items = InfoItem::query()->groupBy('item')->get();
return $this->successResponse([
'items' => $items,
'data' => $data,
]);
}
public function provinceActivityPerSubItem(Request $request): 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);
$provinces = Province::all(['id', 'name_fa']);
$subItems = InfoItem::query()
->where('item', $item)
->get(['id', 'item', 'item_str', 'sub_item_str', 'sub_item_unit', 'sub_item']);
return $this->successResponse([
'activities' => $activities,
'sub_items' => $subItems,
'provinces' => $provinces,
]);
}
public function cityActivityPerSubItem(Request $request): 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;
$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();
$edarateShahri = EdarateShahri::query()->where('province_id', '=', $province)->get(['id', 'name_fa']);
$activities = $cityRoadItemsPerSubItem->push(...$provinceRoadItemsPerSubItem);
$subItems = InfoItem::query()
->where('item', $item)
->get(['id', 'item', 'item_str', 'sub_item_str', 'sub_item_unit', 'sub_item']);
return $this->successResponse([
'activities' => $activities,
'edarateShahri' => $edarateShahri,
'sub_items' => $subItems,
]);
}
public function provinceActivityPerItem(Request $request): 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();
$provinces = Province::all(['id', 'name_fa']);
return $this->successResponse([
'activities' => $activities,
'provinces' => $provinces,
]);
}
public function cityActivityPerItem(Request $request): 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']);
return $this->successResponse([
'activities' => $activities,
'edarateShahri' => $edarateShahri,
]);
}
public function map(Request $request): JsonResponse
{
$provinceId = $request->province_id;
$cityId = $request->city_id;
$subId = $request->sub_id;
$item = $request->item;
$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])
->leftJoin('users', 'users.id', '=', 'road_items_projects.user_id')
->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
{
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),
};
}
}

View File

@@ -0,0 +1,154 @@
<?php
namespace App\Http\Controllers\V3\Dashboard\Reports;
use App\Exports\V2\RoadPatrol\RoadPatrolTable\AllSheets as RoadPatrolTable;
use App\Http\Controllers\Controller;
use App\Http\Traits\ApiResponse;
use App\Models\EdarateShahri;
use App\Models\Province;
use App\Models\RoadPatrolProject;
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
{
$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'
);
$provinces = Province::all(['id', 'name_fa']);
return $this->successResponse([
'activities' => $activities,
'provinces' => $provinces
]);
}
public function cityPatrolActivity(Request $request): 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
'
);
$edarateShahri = EdarateShahri::query()->where('province_id', '=', $provinceId)->get(['id', 'name_fa']);
return $this->successResponse([
'activities' => $activities,
'edarateShahri' => $edarateShahri,
]);
}
public function excel(Request $request): BinaryFileResponse
{
$name = 'گزارش از گشت راهداری و ترابری ' . verta()->now()->format('Y-m-d H-i') . '.xlsx';
return Excel::download(
new RoadPatrolTable($request->from_date, $request->date_to), $name
);
}
}

View File

@@ -1,6 +1,6 @@
<?php
namespace App\Http\Controllers\V3;
namespace App\Http\Controllers\V3\Dashboard;
use App\Exports\V2\RoadItems\OperatorCartableExport;
use App\Exports\V2\RoadItems\SupervisorCartableExport;
@@ -10,18 +10,14 @@ use App\Http\Requests\V3\RoadItemsProject\StoreRequest;
use App\Http\Requests\V3\RoadItemsProject\UpdateRequest;
use App\Http\Requests\V3\RoadItemsProject\VerifyBySupervisorRequest;
use App\Http\Traits\ApiResponse;
use App\Models\CMMSMachine;
use App\Models\EdarateShahri;
use App\Models\InfoItem;
use App\Models\Rahdaran;
use App\Models\RoadItemsProject;
use App\Services\NominatimService;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Gate;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\ValidationException;
use Maatwebsite\Excel\Facades\Excel;
use Symfony\Component\HttpFoundation\BinaryFileResponse;
@@ -36,7 +32,7 @@ class RoadItemsProjectController extends Controller
{
$columns = array(
'id', 'user_id', 'start_lat', 'start_lng', 'end_lat',
'end_lng', 'project_distance', 'item', 'item_fa', 'sub_item_fa',
'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'
@@ -143,7 +139,7 @@ class RoadItemsProjectController extends Controller
{
$columns = array(
'id', 'user_id', 'start_lat', 'start_lng', 'end_lat',
'end_lng', 'project_distance', 'item', 'item_fa', 'sub_item_fa',
'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'

View File

@@ -1,6 +1,6 @@
<?php
namespace App\Http\Controllers\V3;
namespace App\Http\Controllers\V3\Dashboard;
use App\Exports\V2\RoadPatrol\OperatorCartableExport;
use App\Exports\V2\RoadPatrol\SupervisorCartableExport;
@@ -37,7 +37,7 @@ class RoadPatrolProjectController extends Controller
'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'
'start_time', 'end_time','description', 'cmmsMachines.machine_code'
);
$allowedFilters = $columns;
@@ -47,13 +47,16 @@ class RoadPatrolProjectController extends Controller
$query = null;
if ($user->hasPermissionTo('show-road-patrol-supervise-cartable')) {
$query = RoadPatrol::query();
$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()->where('province_id', '=', $user->province_id);
$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(
@@ -123,13 +126,15 @@ class RoadPatrolProjectController extends Controller
$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'
'supervisor_name', 'status', 'status_fa', 'distance', 'start_time', 'end_time', 'cmmsMachines.machine_code'
);
$allowedFilters = $columns;
$allowedSortings = $columns;
$query = RoadPatrol::query()->where('operator_id', '=', auth()->user()->id);
$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,
@@ -140,7 +145,7 @@ class RoadPatrolProjectController extends Controller
return response()->json($data);
}
public function store(StoreRequest $request, NominatimService $nominatimService)
public function store(StoreRequest $request, NominatimService $nominatimService): JsonResponse
{
$user = auth()->user();
@@ -156,24 +161,13 @@ class RoadPatrolProjectController extends Controller
], 400);
}
$start_coordinates = explode(',', $request->start_point);
$end_coordinates = explode(',', $request->end_point);
$edare_id = $user->edarate_shahri_id ?? $user->edarate_ostani_id;
$edare_name = $user->edarate_shahri_id ? $user->edarate_shahri_name : $user->edarate_ostani_name;
$road_patrol = DB::transaction(function () use ($request, $start_coordinates,
$end_coordinates, $edare_id,
$road_patrol = DB::transaction(function () use ($request, $edare_id,
$edare_name, $nominatimService, $user) {
$road_patrol = RoadPatrol::query()->create([
'start_lat' => $start_coordinates[0],
'start_lon' => $start_coordinates[1],
'end_lat' => $end_coordinates[0],
'end_lon' => $end_coordinates[1],
'officer_name' => $request->officer_name,
'officer_phone_number' => $request->officer_phone_number,
'officer_plaque' => $request->officer_plaque,
'operator_id' => $user->id,
'operator_name' => $user->name,
'province_id' => $user->province_id,
@@ -182,16 +176,20 @@ class RoadPatrolProjectController extends Controller
'city_fa' => $user->city_fa,
'edare_id' => $edare_id,
'edare_name' => $edare_name,
'start_way_id' => $nominatimService->get_way_id_from_nominatim($start_coordinates[0], $start_coordinates[1]),
'end_way_id' => $nominatimService->get_way_id_from_nominatim($end_coordinates[0], $end_coordinates[1]),
'status' => 0,
'status_fa' => 'در حال بررسی',
'distance' => $request->distance,
'start_time' => $request->start_time,
'end_time' => $request->end_time,
'description' => $request->description ?? null,
'fuel_consumption' => $request->fuel_consumption,
'vehicle_runtime' => $request->vehicle_runtime,
'stop_points' => json_encode($request->stop_points),
]);
$road_patrol->rahdaran()->attach($request->road_patrol_rahdaran_id);
$road_patrol->cmmsMachines()->attach($request->road_patrol_machines_id);
if ($request->observed_items) {
foreach ($request->observed_items as $index => $item) {
$info_item = InfoItem::where('item', $item['item_id'])
@@ -285,6 +283,9 @@ class RoadPatrolProjectController extends Controller
'message' => 'اقدام مربوطه قبلا رسیدگی شده است.'
], 400);
}
$road_item->rahdaran()->attach($item['road_item_rahdaran_id']);
$road_item->cmmsMachines()->attach($item['road_item_machines_id']);
}
}
}
@@ -297,10 +298,7 @@ class RoadPatrolProjectController extends Controller
return $road_patrol;
});
return response()->json([
'road_patrol_id' => $road_patrol->id,
'message' => 'succussful'
]);
return $this->successResponse();
}
public function getReport(RoadPatrol $roadPatrol): JsonResponse

View File

@@ -0,0 +1,30 @@
<?php
namespace App\Http\Controllers\V3;
use App\Http\Controllers\Controller;
use App\Http\Traits\ApiResponse;
use App\Services\FMS\GetVehicleActivityService;
use Exception;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class FMSVehicleManagementController extends Controller
{
use ApiResponse;
/**
* @throws Exception
*/
public function getActivity(Request $request, GetVehicleActivityService $getVehicleActivityService): JsonResponse
{
$getVehicleActivityService->setInputParameters([
"machineCode" => $request->machineCode,
"startDT" => $request->startDT,
"endDT" => $request->endDT,
]);
$data = $getVehicleActivityService->run();
return $this->successResponse($data);
}
}

View File

@@ -30,6 +30,7 @@ class ProfileController extends Controller
'major' => $user->major,
'degree' => $user->degree,
'mobile' => $user->mobile,
'province_id' => $user->province_id,
'avatar' => $user->avatarUrl()
]);
}
@@ -81,7 +82,7 @@ class ProfileController extends Controller
public function addActivity(Request $request): JsonResponse
{
auth()->user()->addActivityComplete($request->query('activityCode'));
auth()->user()->addActivityComplete($request->activityCode);
return $this->successResponse();
}
}

View File

@@ -2,6 +2,7 @@
namespace App\Http\Requests\V3\RoadPatrolProject;
use App\Rules\VerificationCode;
use Illuminate\Foundation\Http\FormRequest;
class StoreRequest extends FormRequest
@@ -11,7 +12,7 @@ class StoreRequest extends FormRequest
*/
public function authorize(): bool
{
return false;
return true;
}
/**
@@ -22,14 +23,17 @@ class StoreRequest extends FormRequest
public function rules(): array
{
return [
'start_point' => 'required',
'end_point' => 'required',
'verification_code' => ['required', 'string', new VerificationCode($this->phone_number)],
'distance' => 'numeric',
'officer_name' => 'required',
'officer_plaque' => 'required',
'officer_phone_number' => 'required|digits:11',
'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',
'vehicle_runtime' => 'required|integer',
'stop_points' => 'required|array',
'road_patrol_machines_id' => 'required|array',
'road_patrol_machines_id.*' => 'required|exists:cmms_machines,id',
'road_patrol_rahdaran_id' => 'required|array',
'road_patrol_rahdaran_id.*' => 'required|exists:rahdaran,id',
'observed_items' => 'array',
'observed_items.*.item_id' => 'required|integer',
@@ -41,13 +45,23 @@ class StoreRequest extends FormRequest
// road item projects fields
'observed_items.*.start_point' => 'required',
'observed_items.*.end_point' => '',
'observed_items.*.amount' => 'numeric|required_if:instant_action,1',
'observed_items.*.amount' => 'numeric|required_if:observed_items.*.instant_action,1',
'observed_items.*.before_image' => 'image|max:4096',
'observed_items.*.after_image' => 'image|max:4096',
'observed_items.*.priority' => 'integer|in:1,2,3|required_if:instant_action,0',
'observed_items.*.priority_fa' => 'string|required_if:instant_action,0',
'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',
'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',
'observed_items.*.road_item_rahdaran_id' => 'required_if:observed_items.*.instant_action,1|array',
'observed_items.*.road_item_rahdaran_id.*' => 'required_if:observed_items.*.instant_action,1|exists:rahdaran,id',
];
}
public function attributes(): array
{
return [
'start_time' => 'ساعت شروع گشت',
'end_time' => 'ساعت پایان گشت',
];

View File

@@ -4,6 +4,8 @@ namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\Relations\MorphToMany;
class RoadPatrol extends Model
{
@@ -11,8 +13,28 @@ class RoadPatrol extends Model
protected $guarded = ['id'];
public function observedItems()
public function observedItems(): HasMany
{
return $this->hasMany(ObservedItem::class);
}
public function cmmsMachines(): MorphToMany
{
return $this->morphToMany(CMMSMachine::class,
'machinable',
'machinables',
'machinable_id',
'machine_id'
);
}
public function rahdaran(): MorphToMany
{
return $this->morphToMany(Rahdaran::class,
'rahdarable',
'rahdarables',
'rahdarable_id',
'rahdar_id',
);
}
}

View File

@@ -0,0 +1,27 @@
<?php
namespace App\Rules;
use App\Facades\Otp\Otp;
use Closure;
use Illuminate\Contracts\Validation\ValidationRule;
use Illuminate\Translation\PotentiallyTranslatedString;
class VerificationCode implements ValidationRule
{
public function __construct(protected string $phone_number){}
/**
* Run the validation rule.
*
* @param \Closure(string): PotentiallyTranslatedString $fail
*/
public function validate(string $attribute, mixed $value, Closure $fail): void
{
$verified = Otp::verifyOtpToken($this->phone_number, $value);
if (!$verified) {
$fail('The :attribute is not valid.')->translate();
}
}
}

View File

@@ -63,6 +63,7 @@ class GetVehicleActivityService
$inputData = $this->inputParameters + array(
"username" => $this->username,
"password" => $this->password,
"minStopDuration" => 1,
);
return json_encode($inputData);

View File

@@ -0,0 +1,40 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::table('road_patrols', function (Blueprint $table) {
$table->double('start_lat', null, 0)->nullable()->change();
$table->double('start_lon', null, 0)->nullable()->change();
$table->double('end_lat', null, 0)->nullable()->change();
$table->double('end_lon', null, 0)->nullable()->change();
$table->integer('fuel_consumption')->nullable();
$table->integer('vehicle_runtime')->nullable();
$table->json('stop_points')->nullable();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::table('road_patrols', function (Blueprint $table) {
$table->double('start_lat', null, 0)->change();
$table->double('start_lon', null, 0)->change();
$table->double('end_lat', null, 0)->change();
$table->double('end_lon', null, 0)->change();
$table->dropColumn('fuel_consumption');
$table->dropColumn('vehicle_runtime');
$table->dropColumn('stop_points');
});
}
};

View File

@@ -1,15 +1,19 @@
<?php
use App\Http\Controllers\V3\Auth\LogoutController;
use App\Http\Controllers\V3\Azmayesh\AzmayeshController;
use App\Http\Controllers\V3\Azmayesh\AzmayeshSampleController;
use App\Http\Controllers\V3\Azmayesh\AzmayeshTypeController;
use App\Http\Controllers\V3\CMMSMachinesController;
use App\Http\Controllers\V3\Dashboard\Azmayesh\AzmayeshController;
use App\Http\Controllers\V3\Dashboard\Azmayesh\AzmayeshSampleController;
use App\Http\Controllers\V3\Dashboard\Azmayesh\AzmayeshTypeController;
use App\Http\Controllers\V3\Dashboard\ObservedItemController;
use App\Http\Controllers\V3\Dashboard\Reports\RoadItemsReportController;
use App\Http\Controllers\V3\Dashboard\Reports\RoadPatrolReportController;
use App\Http\Controllers\V3\Dashboard\RoadItemsProjectController;
use App\Http\Controllers\V3\Dashboard\RoadPatrolProjectController;
use App\Http\Controllers\V3\FMSVehicleManagementController;
use App\Http\Controllers\V3\Harim\DivarkeshiController;
use App\Http\Controllers\V3\ProfileController;
use App\Http\Controllers\V3\RahdaranController;
use App\Http\Controllers\V3\RoadItemsProjectController;
use App\Http\Controllers\V3\RoadPatrolProjectController;
use Illuminate\Support\Facades\Route;
Route::prefix('harim')->name('harim')->group(function () {
@@ -170,3 +174,39 @@ Route::prefix('rahdaran')
Route::get('/list', 'list')->name('list');
Route::get('/search', 'search')->name('search');
});
Route::prefix('fms_vehicle')
->name('fmsVehicle.')
->controller(FMSVehicleManagementController::class)
->group(function () {
Route::post('/get_activity', 'getActivity')->name('getActivity');
});
Route::prefix('observed_items')
->name('observedItem.')
->controller(ObservedItemController::class)
->group(function () {
Route::get('/filter', 'filter')->name('filter');
Route::get('/{observedItem}', 'show')->name('show');
});
Route::prefix('road_item_reports')
->name('roadItemReports.')
->controller(RoadItemsReportController::class)
->group(function () {
Route::get('/get_sub_items', 'getSubItems')->name('getSubItems');
Route::get('/province_activity_per_sub_item', 'provinceActivityPerSubItem')->name('provinceActivityPerSubItem');
Route::get('/city_activity_per_sub_item', 'cityActivityPerSubItem')->name('cityActivityPerSubItem');
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::prefix('road_patrol_reports')
->name('roadPatrolReports.')
->controller(RoadPatrolReportController::class)
->group(function () {
Route::get('/province_activity', 'provincePatrolActivity')->name('provincePatrolActivity');
Route::get('/city_activity', 'cityPatrolActivity')->name('cityPatrolActivity');
Route::get('/excel', 'excel')->name('excel');
});

View File

@@ -520,3 +520,4 @@ 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');
('آزادراه ساوه-تهران',32,'2025-01-06 14:33:55','2025-01-06 14:33:55');

View File

@@ -149,3 +149,15 @@ INSERT INTO log_lists (description,log_unique_code,action_type,is_done) VALUES
('ثبت فعالیت روزانه','1154','action',0),
('حذف نگهداری و حریم','1155','action',0),
('ورود به نقشه نگهداری حریم','1156','show',1);
INSERT INTO log_lists (description,log_unique_code,action_type,is_done) VALUES
('ورود به کارتابل آزمایشات','1157','action',0),
('ثبت آزمایش','1158','action',0),
('ویرایش آزمایش','1159','action',0),
('حذف آزمایش','1160','action',0),
('ورود به کارتابل نوع آزمایشات','1161','action',0),
('ثبت نوع آزمایش','1162','action',0),
('ویرایش نوع آزمایش','1163','action',0),
('حذف نوع آزمایش','1164','action',0),
('ثبت نمونه آزمایش','1165','action',0),
('ویرایش نمونه آزمایش','1166','action',0),
('حذف نمونه آزمایش','1167','action',0),