Browse Source

Merge pull request 'staging' (#273) from staging into master

Reviewed-on: ordo/adw-backend#273
pull/1/head
ibnu 11 months ago
parent
commit
e6415495db
  1. 28
      app/Console/Commands/CalculateProgressGantt.php
  2. 3
      app/Console/Kernel.php
  3. 310
      app/Helpers/MasterFunctionsHelper.php
  4. 7
      app/Http/Controllers/ActivityController.php
  5. 73
      app/Http/Controllers/HierarchyFtthController.php
  6. 1
      routes/web.php

28
app/Console/Commands/CalculateProgressGantt.php

@ -0,0 +1,28 @@
<?php
namespace App\Console\Commands;
use App\Models\HierarchyFtth;
use Illuminate\Console\Command;
use App\Helpers\MasterFunctionsHelper;
use App\Models\Project;
class CalculateProgressGantt extends Command
{
protected $signature = 'calculate:progressgantt {hierarchy_id}';
protected $description = 'Calculate Progress Gantt';
public function handle()
{
$hierarchy_id = $this->argument('hierarchy_id');
$hierarchy = HierarchyFtth::findOrFail($hierarchy_id);
$project = Project::find($hierarchy->project_id);
$data = MasterFunctionsHelper::calculateSCurveForProgressTree($hierarchy_id);
$hierarchy->bobot_planning = 100;
$hierarchy->progress =((int) end($data[0]['data']['percentageReal']) / (int) end($data[0]['data']['percentagePlan'])) * 100;
$hierarchy->save();
}
}

3
app/Console/Kernel.php

@ -14,7 +14,8 @@ class Kernel extends ConsoleKernel
*/
protected $commands = [
Commands\syncHumanResourceIntegration::class,
Commands\CalculateSCurve::class
Commands\CalculateSCurve::class,
Commands\CalculateProgressGantt::class
];
/**

310
app/Helpers/MasterFunctionsHelper.php

@ -610,23 +610,7 @@ class MasterFunctionsHelper
}
}
if($keyActualM->status_activity == 'done'){
// if($keyActualM->count_report > 1){
// $progressActualWeek = $keyActualM->bobot_planning/$keyActualM->count_report;
// }else{
$progressActualWeek = $keyActualM->bobot_planning / $keyActualM->count_report;
// }
// if($progressActualWeek > $keyActualM->bobot_planning){
// $progressActualWeek = $keyActualM->bobot_planning;
// }else if($keyActualM->qty_actual == 0){
// $progressActualWeek = $keyActualM->bobot_planning;
// }else if($keyActualM->qty_plan == $keyActualM->sum_qty_actual){
// $progressActualWeek = $keyActualM->bobot_planning;
// }else {
// $progressActualWeek = $progressActualWeek;
// }
// $progressActualWeek = $progressActualWeek > $keyActualM->bobot_planning ? $keyActualM->bobot_planning : $progressActualWeek;
// jika report lebih dari 1 x, maka harusnya di bagi sabanyak jumlah report,
// contoh ada 3 report, report ke 1 adalah 5 maka 100/3 dan di looping
}
else{
$progressActualWeek = $progressActualWeek > ($keyActualM->bobot_planning*95)/100 ? ($keyActualM->bobot_planning*95)/100 : $progressActualWeek;
@ -1326,6 +1310,15 @@ class MasterFunctionsHelper
{
DB::enableQueryLog();
// $hierarchyGantts = [];
// if (isset($hierarchyId)) {
// $hierarchy = HierarchyFtth::findOrFail($hierarchyId);
// $projectId = $hierarchy->project_id;
// // if (isset($hierarchy)) {
// // $hierarchyGantts = VersionGantt::where('hierarchy_ftth_id', $hierarchyId)->get()->toArray();
// // }
// }
$dataFinal = [];
$dataPayload = [];
$dataPayload['period'] = 'week';
@ -1340,9 +1333,9 @@ class MasterFunctionsHelper
}
if ($dataHeader) {
$totalRencanaBudget = Activity::where('parent_id', $dataHeader->id)->where("proyek_id", $projectId)->sum("rencana_biaya");
// $totalRencanaBudget = Activity::where('parent_id', $dataHeader->id)->where("proyek_id", $projectId)->sum("rencana_biaya");
} else {
$totalRencanaBudget = Activity::whereNull('parent_id')->where("proyek_id", $projectId)->sum("rencana_biaya");
// $totalRencanaBudget = Activity::whereNull('parent_id')->where("proyek_id", $projectId)->sum("rencana_biaya");
}
$minDate = $dataProject->mulai_proyek;
@ -1387,6 +1380,32 @@ class MasterFunctionsHelper
//new \Datetime($dt->format("Y-m-d"));
// $minSevenDays = $minSevenDays->modify('-7 day')->format("Y-m-d");
$tempDate[] = array($dt->format("Y-m-d"));
$dataPlanM = [];
$dataActualM = [];
// if (count($hierarchyGantts) > 0) {
// foreach ($hierarchyGantts as $key => $gantt) {
// $dataPlanM[] = DB::table('m_activity')
// ->where('type_activity', 'task')
// ->where('bobot_planning', '>', 0)
// ->where('version_gantt_id', $gantt['id'])
// ->whereDate('planned_start', '<=', $loopDay)
// ->whereDate('planned_end', '>=', $loopDay)
// ->select('name', 'bobot_planning', 'biaya_actual', 'duration', 'persentase_progress', 'id', 'planned_start', 'planned_end')
// ->get()->toArray();
// $dataActualM[] = DB::table('report_activity_material as ram')
// ->join('m_activity as ma', 'ma.id', '=', 'ram.activity_id')
// ->select('ram.activity_id', 'ram.qty as qty_actual', 'ma.bobot_planning', 'ma.name',
// DB::raw('(SELECT SUM(amta.qty_planning) FROM assign_material_to_activity amta WHERE amta.activity_id = ram.activity_id) AS qty_plan'),
// DB::raw('(SELECT SUM(ram.qty) FROM report_activity_material ram WHERE ram.activity_id = ma.id) AS sum_qty_actual'),
// DB::raw('(SELECT DISTINCT status_activity FROM assign_material_to_activity amta WHERE amta.activity_id = ram.activity_id) AS status_activity'),
// DB::raw('(SELECT COUNT(id) FROM report_activity_material ram WHERE ram.activity_id = ma.id) AS count_report')
// )
// ->where('ram.report_date', $loopDay)
// ->where('ma.version_gantt_id', $gantt['id'])
// ->get()->toArray();
// }
// } else {
$dataPlanM = DB::table('m_activity')
->where('type_activity', 'task')
@ -1408,6 +1427,7 @@ class MasterFunctionsHelper
->where('ram.report_date', $loopDay)
->where('ma.proyek_id', $projectId)
->get();
// }
$dataActivityPlan = [];
$dataActivityActual = [];
@ -1422,6 +1442,7 @@ class MasterFunctionsHelper
$dateWeek[] = [$loopDay];
}
// $progressPlanKomulatifWeek[] += $tmpProgressPlanWeek;
// if (count($dataPlanM) > 0 && count($dataPlanM[0]) > 0) {
foreach ($dataPlanM as $keyPlanM) {
# hitung untuk persentase progress planning
// if($keyPlanM->duration == 0){
@ -1453,8 +1474,10 @@ class MasterFunctionsHelper
);
$tmpProgressPlanWeek += $progressPlanWeek;
}
// }
// hitung progress actual
// if (count($dataActualM) > 0 && count($dataActualM[0]) > 0) {
foreach ($dataActualM as $keyActualM) {
# hitung untuk persentase progress actual
// $progressActualWeek = ((((($keyActualM->qty_actual / $keyActualM->sum_qty_actual) * 100) / $keyActualM->qty_plan)*100)*$keyActualM->bobot_planning)/100;
@ -1502,6 +1525,257 @@ class MasterFunctionsHelper
$tmpProgressActualWeek += $progressActualWeek;
}
// }
$dataActivityPlanDate[] = array(
"date" => $loopDay,
"statusWeek" => new \DateTime($loopDay) == new \DateTime($loopDay . ' Friday') ? true : false,
"activity-plan" => $dataActivityPlan,
"activity-actual" => $dataActivityActual,
"tmpProgressActualWeek" => $tmpProgressActualWeek,
"progressPlanWeek" => $tmpProgressPlanWeek
);
}
$dataFinal[] = array(
// "date" => $dateWeek,
"proyek_name" => $dataProject->nama,
"data" => ["date" => $dateWeek,
"percentagePlan" => $progressPlanKomulatifWeek,
"percentageReal" => $progressActualKomulatifWeek
// "data_details" => $dataActivityPlanDate
]
);
return $dataFinal;
}
public function calculateSCurveForProgressTree($hierarchyId)
{
DB::enableQueryLog();
// $hierarchyGantts = [];
if (isset($hierarchyId)) {
$hierarchy = HierarchyFtth::findOrFail($hierarchyId);
$projectId = $hierarchy->project_id;
// if (isset($hierarchy)) {
// $hierarchyGantts = VersionGantt::where('hierarchy_ftth_id', $hierarchyId)->get()->toArray();
// }
}
$dataFinal = [];
$dataPayload = [];
$dataPayload['period'] = 'week';
$totalACWP = 0;
$totalBCWP = 0;
$tempPercentage = [];
$dataProject = Project::find($projectId);
$dataHeader = Activity::where('type_activity', 'header')->where("proyek_id", $projectId)->first();
if (isset($dataPayload['end_date']) && $dataPayload['end_date'] > $dataProject->akhir_proyek) {
$dataPayload['end_date'] = $dataProject->akhir_proyek;
}
if ($dataHeader) {
// $totalRencanaBudget = Activity::where('parent_id', $dataHeader->id)->where("proyek_id", $projectId)->sum("rencana_biaya");
} else {
// $totalRencanaBudget = Activity::whereNull('parent_id')->where("proyek_id", $projectId)->sum("rencana_biaya");
}
$minDate = $dataProject->mulai_proyek;
$begin = new \DateTime($minDate);
$begin = $begin->modify('-1 day');
if (isset($dataPayload['end_date'])) {
$maxDate = $dataPayload['end_date'];
$end = new \DateTime($maxDate . ' Friday');
// $end->modify('next Friday');
// $end->modify('next Friday');
/* $interval = \DateInterval::createFromDateString('1 day'); */// should be using this but its bugged
$interval = new \DateInterval('P1D');
} else {
$maxDate = $dataProject->akhir_proyek;
$end = new \DateTime($maxDate);
$end = new \DateTime($end->format('Y-m-d') . ' Friday');
// $end->modify('next Friday');
// $end->modify('next Friday');
$interval = new \DateInterval('P1D');
}
$period = new \DatePeriod($begin, $interval, $end);
// $arr_ActualM = [];
$tempDate = [];
// $tempPercentagePlan = [];
// $tempPercentagePlanWhr = [];
// $tempPercentageReal = [];
// $tempTtlPercentPlan = 0;
// $tempTtlPercentActual = 0;
// $currentACWP = 0;
// $currentBCWP = 0;
$dataActivityPlanDate = [];
$progressPlanKomulatifWeek = [];
$progressActualKomulatifWeek = [];
$dateWeek = [];
$tmpProgressPlanWeek = 0;
$tmpProgressActualWeek = 0;
foreach ($period as $dt) {
$loopDay = $dt->format("Y-m-d");
//new \Datetime($dt->format("Y-m-d"));
// $minSevenDays = $minSevenDays->modify('-7 day')->format("Y-m-d");
$tempDate[] = array($dt->format("Y-m-d"));
$dataPlanM = [];
$dataActualM = [];
// if (count($hierarchyGantts) > 0) {
// foreach ($hierarchyGantts as $key => $gantt) {
// $dataPlanM[] = DB::table('m_activity')
// ->where('type_activity', 'task')
// ->where('bobot_planning', '>', 0)
// ->where('version_gantt_id', $gantt['id'])
// ->whereDate('planned_start', '<=', $loopDay)
// ->whereDate('planned_end', '>=', $loopDay)
// ->select('name', 'bobot_planning', 'biaya_actual', 'duration', 'persentase_progress', 'id', 'planned_start', 'planned_end')
// ->get()->toArray();
// $dataActualM[] = DB::table('report_activity_material as ram')
// ->join('m_activity as ma', 'ma.id', '=', 'ram.activity_id')
// ->select('ram.activity_id', 'ram.qty as qty_actual', 'ma.bobot_planning', 'ma.name',
// DB::raw('(SELECT SUM(amta.qty_planning) FROM assign_material_to_activity amta WHERE amta.activity_id = ram.activity_id) AS qty_plan'),
// DB::raw('(SELECT SUM(ram.qty) FROM report_activity_material ram WHERE ram.activity_id = ma.id) AS sum_qty_actual'),
// DB::raw('(SELECT DISTINCT status_activity FROM assign_material_to_activity amta WHERE amta.activity_id = ram.activity_id) AS status_activity'),
// DB::raw('(SELECT COUNT(id) FROM report_activity_material ram WHERE ram.activity_id = ma.id) AS count_report')
// )
// ->where('ram.report_date', $loopDay)
// ->where('ma.version_gantt_id', $gantt['id'])
// ->get()->toArray();
// }
// } else {
$dataPlanM = DB::table('m_hierarchy_ftth as mhf')
->join('m_version_gantt as mvg', 'mvg.hierarchy_ftth_id', '=', 'mhf.id')
->join('m_activity as ma', 'ma.version_gantt_id', '=', 'mvg.id')
->where('ma.type_activity', 'task')
->where('ma.bobot_planning', '>', 0)
->where('mhf.project_id', $projectId)
->whereDate('planned_start', '<=', $loopDay)
->whereDate('planned_end', '>=', $loopDay)
->select('ma.name', 'ma.bobot_planning', 'ma.biaya_actual', 'ma.duration', 'ma.persentase_progress', 'ma.id', 'ma.planned_start', 'ma.planned_end')
->get();
$dataActualM = DB::table('m_hierarchy_ftth as mhf')
->join('m_version_gantt as mvg', 'mvg.hierarchy_ftth_id', '=', 'mhf.id')
->join('m_activity as ma', 'ma.version_gantt_id', '=', 'mvg.id')
->join('report_activity_material as ram', 'ram.activity_id', '=', 'ma.id')
->select('ram.activity_id', 'ram.qty as qty_actual', 'ma.bobot_planning', 'ma.name',
DB::raw('(SELECT SUM(amta.qty_planning) FROM assign_material_to_activity amta WHERE amta.activity_id = ram.activity_id) AS qty_plan'),
DB::raw('(SELECT SUM(ram.qty) FROM report_activity_material ram WHERE ram.activity_id = ma.id) AS sum_qty_actual'),
DB::raw('(SELECT DISTINCT status_activity FROM assign_material_to_activity amta WHERE amta.activity_id = ram.activity_id) AS status_activity'),
DB::raw('(SELECT COUNT(id) FROM report_activity_material ram WHERE ram.activity_id = ma.id) AS count_report')
)
->where('ram.report_date', $loopDay)
// ->where('ma.proyek_id', $projectId)
->where('mhf.project_id', $projectId)
->get();
// }
$dataActivityPlan = [];
$dataActivityActual = [];
$today = new DateTime();
if (new \DateTime($loopDay) == new \DateTime($loopDay . ' Friday')){
$progressPlanKomulatifWeek[] += round($tmpProgressPlanWeek,2);
if (new \DateTime($loopDay) < $today) {
// $tempPercentageReal[] = round($tempTtlPercentActual, 2);
$progressActualKomulatifWeek[] += round($tmpProgressActualWeek,2);
}
$dateWeek[] = [$loopDay];
}
// $progressPlanKomulatifWeek[] += $tmpProgressPlanWeek;
// if (count($dataPlanM) > 0 && count($dataPlanM[0]) > 0) {
foreach ($dataPlanM as $keyPlanM) {
# hitung untuk persentase progress planning
// if($keyPlanM->duration == 0){
// $duration = 2;
// Tanggal awal
$startDate = new DateTime($keyPlanM->planned_start);
// Tanggal akhir
$endDate = new DateTime($keyPlanM->planned_end);
// Menghitung selisih hari
$interval = $startDate->diff($endDate);
// Mengambil hasil selisih hari
$duration = (int) $interval->days+1;
// }else{
// $duration = $keyPlanM->duration + 2;
// }
// $startPlan = new DateTime($keyPlanM->planned_start);
// $endPlan = new DateTime($keyPlanM->planned_end);
// $interval = $startPlan->diff($endPlan);
// // Mengambil hasil selisih hari
// $duration = $interval->days;
// 2023-07-26
$progressPlanWeek = $keyPlanM->bobot_planning / $duration;
$dataActivityPlan[] = array(
'progressPlanDay' => $progressPlanWeek,
'name' => $keyPlanM->name,
'bobot_p' => $keyPlanM->bobot_planning,
'duration' => $keyPlanM->duration
);
$tmpProgressPlanWeek += $progressPlanWeek;
}
// }
// hitung progress actual
// if (count($dataActualM) > 0 && count($dataActualM[0]) > 0) {
foreach ($dataActualM as $keyActualM) {
# hitung untuk persentase progress actual
// $progressActualWeek = ((((($keyActualM->qty_actual / $keyActualM->sum_qty_actual) * 100) / $keyActualM->qty_plan)*100)*$keyActualM->bobot_planning)/100;
// jika total report > dari planning
if($keyActualM->sum_qty_actual > $keyActualM->qty_plan){
$progressActualWeek = (($keyActualM->qty_actual / $keyActualM->sum_qty_actual) * 100) *$keyActualM->bobot_planning/100;
}else{
// jika total report < dari planning
// $progressActualWeek = ((($keyActualM->qty_actual / $keyActualM->sum_qty_actual) * 100) / $keyActualM->qty_plan)*$keyActualM->bobot_planning;
if($keyActualM->qty_actual == 0){
$progressActualWeek = 0;
}else{
$progressActualWeek = ($keyActualM->qty_actual / $keyActualM->qty_plan) * $keyActualM->bobot_planning;
}
}
if($keyActualM->status_activity == 'done'){
// if($keyActualM->sum_qty_actual > $keyActualM->qty_plan){
// }
// if($progressActualWeek > $keyActualM->bobot_planning){
// $progressActualWeek = $keyActualM->bobot_planning;
// }else if($keyActualM->qty_actual == 0){
// $progressActualWeek = $keyActualM->bobot_planning;
// }else if($keyActualM->qty_plan == $keyActualM->sum_qty_actual){
$progressActualWeek = $keyActualM->bobot_planning / $keyActualM->count_report;
// }else {
// $progressActualWeek = $progressActualWeek;
// }
// $progressActualWeek = $progressActualWeek > $keyActualM->bobot_planning ? $keyActualM->bobot_planning : $progressActualWeek;
// jika report lebih dari 1 x, maka harusnya di bagi sabanyak jumlah report,
// contoh ada 3 report, report ke 1 adalah 5 maka 100/3 dan di looping
}
else{
$progressActualWeek = $progressActualWeek > ($keyActualM->bobot_planning*95)/100 ? ($keyActualM->bobot_planning*95)/100 : $progressActualWeek;
}
$dataActivityActual[] = array(
'progressActualDay' => $progressActualWeek,
'qty_act' => $keyActualM->qty_actual,
'bobot_p' => $keyActualM->bobot_planning,
'qty_plan' => $keyActualM->qty_plan,
'status_activity' => $keyActualM->status_activity,
'sum_qty_actual' => $keyActualM->sum_qty_actual,
'name' => $keyActualM->name
);
$tmpProgressActualWeek += $progressActualWeek;
}
// }
$dataActivityPlanDate[] = array(
"date" => $loopDay,

7
app/Http/Controllers/ActivityController.php

@ -322,7 +322,7 @@ class ActivityController extends Controller
$actualEndValues = array_column(array_filter($dataFinal, function($item) {
return isset($item['actual_end']);
}), 'actual_end');
$returnActualStartOrEnd = count($actualEndValues) == count($dataFinal) ? max($actualEndValues) : null;
$returnActualStartOrEnd = count($actualEndValues) == count($dataFinal) && count($actualEndValues) > 0 ? max($actualEndValues) : null;
if (isset($parent)) {
$parent->actual_end = $returnActualStartOrEnd;
$parent->save();
@ -1156,4 +1156,9 @@ class ActivityController extends Controller
}
return response()->json(['status' => 'success', 'data' => $request, 'message' => 'Update successful!', 'code' => 200], 200);
}
// public function recalculateProject($by, $id){
// // query get activity
// $cekActivity =
// }
}

73
app/Http/Controllers/HierarchyFtthController.php

@ -6,6 +6,7 @@ use Illuminate\Http\Request;
use App\Models\HierarchyFtth;
use App\Models\VersionGantt;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Artisan;
class HierarchyFtthController extends Controller
{
@ -102,36 +103,41 @@ class HierarchyFtthController extends Controller
}
}
public function countProgress($project_id) {
$ftthIds = VersionGantt::select('hierarchy_ftth_id')
->where('proyek_id', $project_id)
->groupBy('hierarchy_ftth_id')
->get();
if($ftthIds){
foreach ($ftthIds as $ftthId) {
$gantts = VersionGantt::where('hierarchy_ftth_id', $ftthId->hierarchy_ftth_id)->sum('progress');
$bobot_planning = VersionGantt::where('hierarchy_ftth_id', $ftthId->hierarchy_ftth_id)->sum('bobot');
$ganttCount = VersionGantt::where('hierarchy_ftth_id', $ftthId->hierarchy_ftth_id)->count();
$ftth = HierarchyFtth::find($ftthId->hierarchy_ftth_id);
if($ftth){
$round = $gantts/$ganttCount;
$round_bobot = $bobot_planning/$ganttCount;
$ftth->progress = round($round, 2);
$ftth->bobot_planning = round($round_bobot, 2);
try {
$ftth->save();
} catch (\Exception $e) {
// Log the error or handle it in some other way
Log::error($e->getMessage());
}
public function countProgress($hierarchy_id) {
// $ftthIds = VersionGantt::select('hierarchy_ftth_id')
// ->where('proyek_id', $project_id)
// ->groupBy('hierarchy_ftth_id')
// ->get();
// if($ftthIds){
// foreach ($ftthIds as $ftthId) {
// $gantts = VersionGantt::where('hierarchy_ftth_id', $ftthId->hierarchy_ftth_id)->sum('progress');
// $bobot_planning = VersionGantt::where('hierarchy_ftth_id', $ftthId->hierarchy_ftth_id)->sum('bobot');
// $ganttCount = VersionGantt::where('hierarchy_ftth_id', $ftthId->hierarchy_ftth_id)->count();
if($ftth->parent_id){
$this->countParent($ftth);
}
}
}
}
// $ftth = HierarchyFtth::find($ftthId->hierarchy_ftth_id);
// if($ftth){
// $round = $gantts/$ganttCount;
// $round_bobot = $bobot_planning/$ganttCount;
// $ftth->progress = round($round, 2);
// $ftth->bobot_planning = round($round_bobot, 2);
// try {
// $ftth->save();
// } catch (\Exception $e) {
// // Log the error or handle it in some other way
// Log::error($e->getMessage());
// }
// if($ftth->parent_id){
// $this->countParent($ftth);
// }
// }
// }
// }
// calculate ke curva berdasarkan site
Artisan::call('calculate:progressgantt', [
'hierarchy_id' => $hierarchy_id
]);
}
public function countParent($ftth){
@ -179,7 +185,6 @@ class HierarchyFtthController extends Controller
public function getTreeByProject($project_id)
{
$this->countProgress(intval($project_id));
$data = HierarchyFtth::where('project_id', $project_id)->whereNull('parent_id')->orderByRaw('id ASC')->get();
$finalData = [];
foreach($data as $objRow){
@ -204,7 +209,13 @@ class HierarchyFtthController extends Controller
return response()->json(['status'=>'success','data'=>$finalData,'code'=>200], 200);
}
public function countProgressTree($hierarchy_id)
{
Artisan::call('calculate:progressgantt', [
'hierarchy_id' => $hierarchy_id
]);
return response()->json(['status'=>'success','code'=>200], 200);
}
private function getChildren($project_id, $parent_id)
{
$finalData = [];

1
routes/web.php

@ -491,6 +491,7 @@ $router->group(['prefix'=>'api', 'middleware' => 'cors'], function () use ($rout
$router->put('/hierarchy-ftths/{id}', 'HierarchyFtthController@update');
$router->delete('/hierarchy-ftths/{id}', 'HierarchyFtthController@destroy');
$router->get('/hierarchy-ftths/tree/{project_id}', 'HierarchyFtthController@getTreeByProject');
$router->get('/hierarchy-ftths/count-tree/{hierarchy_id}', 'HierarchyFtthController@countProgressTree');
$router->get('/hierarchy-ftths/tree-gantt/{gantt_id}', 'HierarchyFtthController@getTreeByGantt');
$router->post('/map-monitoring/search', 'MapMonitoringController@search');

Loading…
Cancel
Save