Files
gps-frontend/app/Http/Controllers/ZoneController.php
meusinfirmary bd78b881b5 upadate
2025-06-12 01:13:36 +07:00

1111 lines
45 KiB
PHP
Executable File

<?php
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Illuminate\Support\Facades\DB;
use Validator;
use App\Responses;
use App\Helper;
use App\Models\Zone;
use App\Models\Users;
use App\Models\Clients;
use App\Models\Region;
use App\Models\Orders;
use App\Models\OrdersDrops;
// use App\Models\OrdersPckDrop;
use App\Models\OrdersAItems;
class ZoneController extends Controller
{
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function view_zone()
{
return view("menu_v1.zone");
}
public function view_zone_add(Request $req)
{
$data = [
"types" => Zone::listTypes(),
"workflows" => Zone::listWorkflows(),
"boundarys" => Zone::listBoundarys(),
"provs" => Region::listProv(),
];
if ($req->auth->role == Users::ROLE_SUPERADMIN) {
$data["is_su"] = 1;
$data["clients"] = Clients::select2Client();
} elseif ($req->auth->role == Users::ROLE_ADMIN) {
$data["is_su"] = 1;
$data["clients"] = Clients::select2Client();
} else {
$data["clients"] = [];
$data["is_su"] = 0;
}
return view("menu_v1._addZone", $data);
}
public function view_zone_edit(Request $req, $zid)
{
$input = [
"zid" => $zid,
];
$rulesInput = [
"zid" => "required|integer|not_in:0",
];
// validasi input
$isValidInput = Validator::make($input, $rulesInput);
if (!$isValidInput->passes()) {
$apiResp = Responses::bad_input($isValidInput->messages()->first());
return new Response($apiResp, $apiResp["meta"]["code"]);
}
$zone = Zone::showZoneById($zid);
if (count($zone) < 1) {
$apiResp = Responses::not_found("zone not found");
return new Response($apiResp, $apiResp["meta"]["code"]);
}
if ($zone[0]->boundary_bounds) {
$zone[0]->boundary_bounds = json_decode($zone[0]->boundary_bounds);
}
if ($zone[0]->boundary_latlngs) {
$zone[0]->boundary_latlngs = json_decode($zone[0]->boundary_latlngs);
}
unset($zone[0]->boundary_points);
$data = [
"zone" => $zone[0],
"types" => Zone::listTypes(),
"workflows" => Zone::listWorkflows(),
"boundarys" => Zone::listBoundarys(),
"provs" => Region::listProv(),
];
if ($req->auth->role == Users::ROLE_SUPERADMIN) {
$data["is_su"] = 1;
$data["clients"] = Clients::select2Client();
} elseif ($req->auth->role == Users::ROLE_ADMIN) {
$data["is_su"] = 1;
$data["clients"] = Clients::select2Client();
} else {
$data["clients"] = [];
$data["is_su"] = 0;
}
$arr_zone = (array) $data["zone"];
$data["arr_zone"] = json_encode($arr_zone);
return view("menu_v1._edtZone", $data);
}
public function view_user_checker_zone_edit(Request $req)
{
$input = [
"zid" => $req->zid,
"ord_code" => $req->ord_code,
];
$rulesInput = [
"zid" => "required|integer|not_in:0",
"ord_code" => "required|string|max:12",
];
// validasi input
$isValidInput = Validator::make($input, $rulesInput);
if (!$isValidInput->passes()) {
$apiResp = Responses::bad_input($isValidInput->messages()->first());
return new Response($apiResp, $apiResp["meta"]["code"]);
}
$zone = Zone::showZoneById($req->zid);
if (count($zone) < 1) {
$apiResp = Responses::not_found("zone not found");
return new Response($apiResp, $apiResp["meta"]["code"]);
}
if ($zone[0]->boundary_bounds) {
$zone[0]->boundary_bounds = json_decode($zone[0]->boundary_bounds);
}
if ($zone[0]->boundary_latlngs) {
$zone[0]->boundary_latlngs = json_decode($zone[0]->boundary_latlngs);
}
unset($zone[0]->boundary_points);
$orders = Orders::showOrder([
"code" => $req->ord_code,
// 'get_stts_checker' => 1,
// 'get_prefer_type_truck' => 1,
// 'get_checker_data' => 1,
// 'get_client_pt' => 1,
// 'get_accidents' => 1,
"couple_pck_drop" => 1,
// 'get_user_aprv_pck' => 1,
// 'get_user_aprv_pck' => 1,
"group_by" => "ord.id",
]);
if (count($orders) < 1) {
return redirect(url()->previous());
}
$data = [
"zone" => $zone[0],
"order" => $orders[0],
"types" => Zone::listTypes(),
"workflows" => Zone::listWorkflows(),
"boundarys" => Zone::listBoundarys(),
"provs" => Region::listProv(),
];
$data["clients"] = Clients::select2Client();
$arr_zone = (array) $data["zone"];
$data["arr_zone"] = json_encode($arr_zone);
return view("menu_v2.Checker._edtZone", $data);
}
/**
* API
*/
public function api_list_zones(Request $req)
{
try {
$now = time();
$input = [];
$rulesInput = [];
// validasi input
// $isValidInput = Validator::make($input, $rulesInput);
// if (!$isValidInput->passes()) {
// $apiResp = Responses::bad_input($isValidInput->messages()->first());
// return new Response($apiResp, $apiResp['meta']['code']);
// }
$filter = [];
if ($req->cptid) {
$filter["company"] = $req->cptid;
}
if ($req->status) {
$filter["is_active"] = $req->status;
}
$list = Zone::listZones($req->auth, $filter);
foreach ($list as $key => $row) {
$list[$key]->DT_RowIndex = $key + 1;
$list[$key]->action = "-";
unset($list[$key]->boundary_points);
}
$apiResp = Responses::success("success list zones");
$apiResp["data"] = $list;
$apiResp["count"] = count($list);
return new Response($apiResp, $apiResp["meta"]["code"]);
} catch (\Exception $e) {
$apiResp = Responses::error($e->getMessage());
return new Response($apiResp, $apiResp["meta"]["code"]);
}
}
public function api_show_zone(Request $req, $zid)
{
try {
$now = time();
$input = [
"zid" => $zid,
];
$rulesInput = [
"zid" => "required|integer|not_in:0",
];
// validasi input
$isValidInput = Validator::make($input, $rulesInput);
if (!$isValidInput->passes()) {
$apiResp = Responses::bad_input($isValidInput->messages()->first());
return new Response($apiResp, $apiResp["meta"]["code"]);
}
$zone = Zone::showZoneById($zid);
if (count($zone) < 1) {
$apiResp = Responses::not_found("zone not found");
return new Response($apiResp, $apiResp["meta"]["code"]);
}
$apiResp = Responses::success("success get detail zone");
$apiResp["data"] = $zone[0];
return new Response($apiResp, $apiResp["meta"]["code"]);
} catch (\Exception $e) {
$apiResp = Responses::error($e->getMessage());
return new Response($apiResp, $apiResp["meta"]["code"]);
}
}
public function api_add_zone(Request $req)
{
try {
$now = time();
$input = [
"zone_name" => $req->zone_name,
"zone_client" => $req->zone_client,
"zone_type" => $req->zone_type,
"workflow_zone_type" => $req->workflow_zone_type,
// "shiptocode" => $req->shiptocode,
// "prid" => $req->prid,
// "ktid" => $req->ktid,
// "kcid" => $req->kcid,
// "klid" => $req->klid,
"fulladdress" => $req->fulladdress,
"status" => $req->status,
"boundary_hex_color" => $req->boundary_hex_color,
"boundary_type" => $req->boundary_type,
"boundary_latlngs" => $req->boundary_latlngs,
"boundary_bounds" => $req->boundary_bounds,
"boundary_radius" => $req->boundary_radius,
"boundary_diameter" => $req->boundary_diameter,
"boundary_area" => $req->boundary_area, // square meter
"boundary_ha" => $req->boundary_ha, // hectare
];
$rulesInput = [
"zone_name" => "required|string|max:255",
"zone_client" => "nullable|integer|not_in:0",
"zone_type" => "required|integer|not_in:0",
"workflow_zone_type" => "required|integer|not_in:0",
// "shiptocode" => "string|min:5|max:6",
// "prid" => "required|numeric",
// "ktid" => "required|numeric",
// "kcid" => "required|numeric",
// "klid" => "required|numeric",
"fulladdress" => "required|string|min:55",
"status" => "required|integer|not_in:0",
"boundary_hex_color" => "required|string|min:7|max:7",
"boundary_type" => "required|string|max:25",
"boundary_latlngs" => "required|array",
"boundary_latlngs.*.lat" => "required",
"boundary_latlngs.*.lng" => "required",
"boundary_bounds" => "nullable|array",
"boundary_radius" => "nullable|numeric",
"boundary_diameter" => "nullable|numeric",
"boundary_area" => "nullable|numeric",
"boundary_ha" => "nullable|numeric",
];
// validasi input
$isValidInput = Validator::make($input, $rulesInput);
if (!$isValidInput->passes()) {
$apiResp = Responses::bad_input($isValidInput->messages()->first());
return new Response($apiResp, $apiResp["meta"]["code"]);
}
$uniqName = Zone::getZoneByName($req->zone_name);
if (count($uniqName) > 0) {
$apiResp = Responses::bad_request("zone name has been used");
return new Response($apiResp, $apiResp["meta"]["code"]);
}
$user = Users::getUserById($req->auth->uid);
DB::beginTransaction();
$insZone = [
"name" => $req->zone_name,
"type" => $req->zone_type,
"workflow_type" => $req->workflow_zone_type,
"shiptocode" => "123456",
"prid" => "123456",
"ktid" => "123456",
"kcid" => "123456",
"klid" => "123456",
"fulladdress" => $req->fulladdress,
"boundary_type" => $req->boundary_type,
"boundary_hex_color" => strtoupper($req->boundary_hex_color),
"boundary_latlngs" => json_encode($req->boundary_latlngs),
"boundary_bounds" => $req->boundary_bounds ? json_encode($req->boundary_bounds) : null, // $req->boundary_bounds ?? null,
"boundary_radius" => $req->boundary_radius ?? 0,
"boundary_diameter" => $req->boundary_diameter ?? 0,
"boundary_area" => $req->boundary_area ?? 0,
"boundary_ha" => $req->boundary_ha ?? 0,
"status" => $req->status,
"client_group_id" => $req->zone_client ?? ($user[0]->client_group_id ?? null),
"crt" => $now,
"crt_by" => $req->auth->uid,
"updt" => $now,
"updt_by" => $req->auth->uid,
];
// $insZone['boundary_points'] = DB::raw("ST_GeomFromText('POINT($req->lng $req->lat)')");
$insZone["boundary_points"] = "ST_GeomFromText('MULTIPOINT(";
foreach ($req->boundary_latlngs as $key => $val) {
$insZone["boundary_points"] .= $val["lng"] . " " . $val["lat"] . ", ";
}
$insZone["boundary_points"] = substr($insZone["boundary_points"], 0, -2); // remove 2 last character
$insZone["boundary_points"] .= ")')";
$insZone["boundary_points"] = DB::raw($insZone["boundary_points"]);
$zoneId = Zone::addZone($insZone);
$apiResp = Responses::created("success add new zone");
DB::commit();
return new Response($apiResp, $apiResp["meta"]["code"]);
} catch (\Exception $e) {
DB::rollBack();
$apiResp = Responses::error($e->getMessage());
return new Response($apiResp, $apiResp["meta"]["code"]);
}
}
public function api_edit_zone(Request $req, $zid)
{
try {
$now = time();
$input = [
"zone_name" => $req->zone_name,
"zone_client" => $req->zone_client,
"zone_type" => $req->zone_type,
"workflow_zone_type" => $req->workflow_zone_type,
// "shiptocode" => $req->shiptocode,
// "prid" => $req->prid,
// "ktid" => $req->ktid,
// "kcid" => $req->kcid,
// "klid" => $req->klid,
"fulladdress" => $req->fulladdress,
"status" => $req->status,
"boundary_hex_color" => $req->boundary_hex_color,
"boundary_type" => $req->boundary_type,
"boundary_latlngs" => $req->boundary_latlngs,
"boundary_bounds" => $req->boundary_bounds,
"boundary_radius" => $req->boundary_radius,
"boundary_diameter" => $req->boundary_diameter,
"boundary_area" => $req->boundary_area, // square meter
"boundary_ha" => $req->boundary_ha, // hectare
];
$rulesInput = [
"zone_name" => "required|string|max:255",
"zone_client" => "nullable|integer|not_in:0",
"zone_type" => "required|integer|not_in:0",
"workflow_zone_type" => "required|integer|not_in:0",
// "shiptocode" => "required|string|min:5|max:6",
// "prid" => "required|numeric",
// "ktid" => "required|numeric",
// "kcid" => "required|numeric",
// "klid" => "required|numeric",
"fulladdress" => "required|string|min:55",
"status" => "required|integer|not_in:0",
"boundary_hex_color" => "required|string|min:7|max:7",
"boundary_type" => "required|string|max:25",
"boundary_latlngs" => "required|array",
"boundary_latlngs.*.lat" => "required",
"boundary_latlngs.*.lng" => "required",
"boundary_bounds" => "nullable|array",
"boundary_radius" => "nullable|numeric",
"boundary_diameter" => "nullable|numeric",
"boundary_area" => "nullable|numeric",
"boundary_ha" => "nullable|numeric",
];
// validasi input
$isValidInput = Validator::make($input, $rulesInput);
if (!$isValidInput->passes()) {
$apiResp = Responses::bad_input($isValidInput->messages()->first());
return new Response($apiResp, $apiResp["meta"]["code"]);
}
$zone = Zone::showZoneById($zid);
if (count($zone) < 1) {
$apiResp = Responses::not_found("zone not found");
return new Response($apiResp, $apiResp["meta"]["code"]);
}
$uniqName = Zone::getZoneByName($req->zone_name);
if (count($uniqName) > 0) {
$notSameUser = 1;
foreach ($uniqName as $key => $row) {
if ($row->id == $zid) {
$notSameUser = 0;
}
}
if ($notSameUser) {
$apiResp = Responses::bad_request("zone name has been used");
return new Response($apiResp, $apiResp["meta"]["code"]);
}
}
$user = Users::getUserById($req->auth->uid);
DB::beginTransaction();
$updtZone = [
"name" => $req->zone_name,
"type" => $req->zone_type,
"workflow_type" => $req->workflow_zone_type,
"shiptocode" => "123456",
"prid" => "123456",
"ktid" => "123456",
"kcid" => "123456",
"klid" => "123456",
"fulladdress" => $req->fulladdress,
"boundary_type" => $req->boundary_type,
"boundary_hex_color" => strtoupper($req->boundary_hex_color),
"boundary_latlngs" => json_encode($req->boundary_latlngs),
"boundary_bounds" => $req->boundary_bounds ? json_encode($req->boundary_bounds) : null, // $req->boundary_bounds ?? null,
"boundary_radius" => $req->boundary_radius ?? 0,
"boundary_diameter" => $req->boundary_diameter ?? 0,
"boundary_area" => $req->boundary_area ?? 0,
"boundary_ha" => $req->boundary_ha ?? 0,
"status" => $req->status,
"client_group_id" => $req->zone_client ?? ($user[0]->client_group_id ?? null),
"updt" => $now,
"updt_by" => $req->auth->uid,
];
// $updtZone['boundary_points'] = DB::raw("ST_GeomFromText('POINT($req->lng $req->lat)')");
$updtZone["boundary_points"] = "ST_GeomFromText('MULTIPOINT(";
foreach ($req->boundary_latlngs as $key => $val) {
$updtZone["boundary_points"] .= $val["lng"] . " " . $val["lat"] . ", ";
}
$updtZone["boundary_points"] = substr($updtZone["boundary_points"], 0, -2); // remove 2 last character
$updtZone["boundary_points"] .= ")')";
$updtZone["boundary_points"] = DB::raw($updtZone["boundary_points"]);
Zone::updateZone($zid, $updtZone);
DB::commit();
$apiResp = Responses::success("success update zone");
return new Response($apiResp, $apiResp["meta"]["code"]);
} catch (\Exception $e) {
DB::rollBack();
$apiResp = Responses::error($e->getMessage());
return new Response($apiResp, $apiResp["meta"]["code"]);
}
}
public function api_del_zone(Request $req, $zid)
{
try {
$now = time();
$input = [
"zid" => $zid,
];
$rulesInput = [
"zid" => "required|integer|not_in:0",
];
// validasi input
$isValidInput = Validator::make($input, $rulesInput);
if (!$isValidInput->passes()) {
$apiResp = Responses::bad_input($isValidInput->messages()->first());
return new Response($apiResp, $apiResp["meta"]["code"]);
}
$zone = Zone::showZoneById($zid);
if (count($zone) < 1) {
$apiResp = Responses::not_found("zone not found");
return new Response($apiResp, $apiResp["meta"]["code"]);
}
DB::beginTransaction();
Zone::updateZone($zid, [
"dlt" => $now,
"dlt_by" => $req->auth->uid,
]);
DB::commit();
$apiResp = Responses::success("success delete zone");
return new Response($apiResp, $apiResp["meta"]["code"]);
} catch (\Exception $e) {
DB::rollBack();
$apiResp = Responses::error($e->getMessage());
return new Response($apiResp, $apiResp["meta"]["code"]);
}
}
public function api_list_client_zones(Request $req)
{
try {
// cptid (client_group_id / client_pt_id / company_id)
$now = time();
$input = [
"cptid" => $req->cptid,
"workflow_type" => $req->workflow_type,
];
$rulesInput = [
"cptid" => "nullable|integer|not_in:0",
"workflow_type" => "required|integer|not_in:0",
];
// validasi input
$isValidInput = Validator::make($input, $rulesInput);
if (!$isValidInput->passes()) {
$apiResp = Responses::bad_input($isValidInput->messages()->first());
return new Response($apiResp, $apiResp["meta"]["code"]);
}
if ($req->cptid) {
$client = Clients::getClientById($req->cptid);
if (count($client) < 1) {
$apiResp = Responses::not_found("client not found");
return new Response($apiResp, $apiResp["meta"]["code"]);
}
}
// $zones = Zone::getActiveZones($req->cptid, Zone::ZONE_TYPE_WAREHOUSE, $req->workflow_type);
$zones = Zone::getActiveZones(
$req->cptid,
[Zone::ZONE_TYPE_WAREHOUSE, Zone::ZONE_TYPE_AREA],
$req->workflow_type
);
if (count($zones) < 1) {
$apiResp = Responses::not_found("no available zones for client " . $client[0]->c_name);
return new Response($apiResp, $apiResp["meta"]["code"]);
}
foreach ($zones as $key => $val) {
unset($zones[$key]->boundary_points);
}
$apiResp = Responses::success("success list client zone");
$apiResp["data"] = $zones;
return new Response($apiResp, $apiResp["meta"]["code"]);
} catch (\Exception $e) {
$apiResp = Responses::error($e->getMessage());
return new Response($apiResp, $apiResp["meta"]["code"]);
}
}
public function api_list_checkpoints(Request $req)
{
try {
$now = time();
$input = [
"cptid" => $req->cptid,
// 'type' => $req->type,
// 'workflow_type' => $req->workflow_type,
];
$rulesInput = [
"cptid" => "nullable|integer|not_in:0",
// 'type' => 'required|integer|not_in:0',
// 'workflow_type' => 'required|integer|not_in:0',
];
// validasi input
$isValidInput = Validator::make($input, $rulesInput);
if (!$isValidInput->passes()) {
$apiResp = Responses::bad_input($isValidInput->messages()->first());
return new Response($apiResp, $apiResp["meta"]["code"]);
}
$zones = Zone::listZones($req->auth, [
"is_active" => Zone::STATUS_ACTIVE,
]);
if (count($zones) < 1) {
$apiResp = Responses::not_found("no available checkpoints");
return new Response($apiResp, $apiResp["meta"]["code"]);
}
foreach ($zones as $key => $val) {
unset($zones[$key]->boundary_points);
}
$apiResp = Responses::success("success list checkpoints");
$apiResp["data"] = $zones;
return new Response($apiResp, $apiResp["meta"]["code"]);
} catch (\Exception $e) {
$apiResp = Responses::error($e->getMessage());
return new Response($apiResp, $apiResp["meta"]["code"]);
}
}
public function api_user_checker_change_zone(Request $req)
{
try {
$now = time();
$input = [
"ord_code" => $req->ord_code,
"zid" => $req->zid,
"zone_name" => $req->zone_name,
"zone_client" => $req->zone_client,
"zone_type" => $req->zone_type,
"workflow_zone_type" => $req->workflow_zone_type,
"shiptocode" => $req->shiptocode,
"prid" => $req->prid,
"ktid" => $req->ktid,
"kcid" => $req->kcid,
"klid" => $req->klid,
"fulladdress" => $req->fulladdress,
"status" => $req->status,
"boundary_hex_color" => $req->boundary_hex_color,
"boundary_type" => $req->boundary_type,
"boundary_latlngs" => $req->boundary_latlngs,
"boundary_bounds" => $req->boundary_bounds,
"boundary_radius" => $req->boundary_radius,
"boundary_diameter" => $req->boundary_diameter,
"boundary_area" => $req->boundary_area, // square meter
"boundary_ha" => $req->boundary_ha, // hectare
];
$rulesInput = [
"ord_code" => "required|string|max:12",
"zid" => "required|integer|not_in:0",
"zone_name" => "required|string|max:255",
"zone_client" => "nullable|integer|not_in:0",
"zone_type" => "required|integer|not_in:0",
"workflow_zone_type" => "required|integer|not_in:0",
"shiptocode" => "required|string|min:5|max:6",
"prid" => "required|numeric",
"ktid" => "required|numeric",
"kcid" => "required|numeric",
"klid" => "required|numeric",
"fulladdress" => "required|string|min:55",
"status" => "required|integer|not_in:0",
"boundary_hex_color" => "required|string|min:7|max:7",
"boundary_type" => "required|string|max:25",
"boundary_latlngs" => "required|array",
"boundary_latlngs.*.lat" => "required",
"boundary_latlngs.*.lng" => "required",
"boundary_bounds" => "nullable|array",
"boundary_radius" => "nullable|numeric",
"boundary_diameter" => "nullable|numeric",
"boundary_area" => "nullable|numeric",
"boundary_ha" => "nullable|numeric",
];
// validasi input
$isValidInput = Validator::make($input, $rulesInput);
if (!$isValidInput->passes()) {
$apiResp = Responses::bad_input($isValidInput->messages()->first());
return new Response($apiResp, $apiResp["meta"]["code"]);
}
$zone = Zone::showZoneById($req->zid);
if (count($zone) < 1) {
$apiResp = Responses::not_found("zone not found");
return new Response($apiResp, $apiResp["meta"]["code"]);
}
$uniqName = Zone::getZoneByName($req->zone_name);
if (count($uniqName) > 0) {
$notSameUser = 1;
foreach ($uniqName as $key => $row) {
if ($row->id == $req->zid) {
$notSameUser = 0;
}
}
if ($notSameUser) {
$apiResp = Responses::bad_request("zone name has been used");
return new Response($apiResp, $apiResp["meta"]["code"]);
}
}
$orders = Orders::showOrder([
"code" => $req->ord_code,
// 'get_stts_checker' => 1,
// 'get_prefer_type_truck' => 1,
// 'get_checker_data' => 1,
// 'get_client_pt' => 1,
// 'get_accidents' => 1,
"couple_pck_drop" => 1,
"get_pic_zone" => 1,
// 'get_user_aprv_pck' => 1,
// 'get_user_aprv_pck' => 1,
"group_by" => "ord.id",
]);
if (count($orders) < 1) {
$apiResp = Responses::not_found("order not found");
return new Response($apiResp, $apiResp["meta"]["code"]);
}
$order = $orders[0];
$user = Users::getUserById($req->auth->uid);
DB::beginTransaction();
$updtZone = [
"name" => $req->zone_name,
"type" => $req->zone_type,
"workflow_type" => $req->workflow_zone_type,
"shiptocode" => $req->shiptocode,
"prid" => $req->prid,
"ktid" => $req->ktid,
"kcid" => $req->kcid,
"klid" => $req->klid,
"fulladdress" => $req->fulladdress,
"boundary_type" => $req->boundary_type,
"boundary_hex_color" => strtoupper($req->boundary_hex_color),
"boundary_latlngs" => json_encode($req->boundary_latlngs),
"boundary_bounds" => $req->boundary_bounds ? json_encode($req->boundary_bounds) : null, // $req->boundary_bounds ?? null,
"boundary_radius" => $req->boundary_radius ?? 0,
"boundary_diameter" => $req->boundary_diameter ?? 0,
"boundary_area" => $req->boundary_area ?? 0,
"boundary_ha" => $req->boundary_ha ?? 0,
"status" => $req->status,
"client_group_id" => $req->zone_client ?? ($user[0]->client_group_id ?? null),
"updt" => $now,
"updt_by" => $req->auth->uid,
];
// $updtZone['boundary_points'] = DB::raw("ST_GeomFromText('POINT($req->lng $req->lat)')");
$updtZone["boundary_points"] = "ST_GeomFromText('MULTIPOINT(";
foreach ($req->boundary_latlngs as $key => $val) {
$updtZone["boundary_points"] .= $val["lng"] . " " . $val["lat"] . ", ";
}
$updtZone["boundary_points"] = substr($updtZone["boundary_points"], 0, -2); // remove 2 last character
$updtZone["boundary_points"] .= ")')";
$updtZone["boundary_points"] = DB::raw($updtZone["boundary_points"]);
Zone::updateZone($req->zid, $updtZone);
/**
* UPDATE ABOUT ZONE DROP N TRANSACTIONS
*/
$drops = Zone::getZoneById($req->zid, ["region_name" => 1]);
if (count($drops) < 1) {
$apiResp = Responses::not_found("Lokasi pengantaran tidak ditemukan");
return new Response($apiResp, $apiResp["meta"]["code"]);
}
if (empty($drops[0]->boundary_points)) {
$apiResp = Responses::bad_request("Lokasi pengantaran tidak valid");
return new Response($apiResp, $apiResp["meta"]["code"]);
}
foreach ($drops as $iDrop => $drop) {
if ($drop->prid == 0 || $drop->ktid == 0 || $drop->kcid == 0 || $drop->klid == 0) {
$apiResp = Responses::bad_request(
"Zonasi wilayah(provinsi, kecamatan, ...) lokasi pengantaran " .
$drop->name .
" belum lengkap"
);
return new Response($apiResp, $apiResp["meta"]["code"]);
}
$drops[$iDrop]->inpt_pic_name = $order->drop_pic_name;
$drops[$iDrop]->inpt_pic_phone_code = 62;
$drops[$iDrop]->inpt_pic_phone_val = (int) $order->drop_pic_phone_val;
$drops[$iDrop]->inpt_pic_mail = null;
$updtDrop = [
"ord_id" => $order->ord_id,
"ord_code" => $order->ord_code,
// 'stts_drop' => OrdersDrops::STTS_WAIT,
"drop_id" => $drop->id,
"drop_name" => $drop->name,
"drop_desc" => $drop->desc,
"drop_type" => $drop->type,
"drop_workflow" => $drop->workflow_type,
"drop_shiptocode" => $drop->shiptocode,
"drop_prid" => $drop->prid,
"drop_ktid" => $drop->ktid,
"drop_kcid" => $drop->kcid,
"drop_klid" => $drop->klid,
"drop_addr" => $drop->fulladdress,
"drop_cgroup_id" => $drop->client_group_id,
"drop_cdiv_id" => $drop->client_div_id,
"drop_cgp_id" => $drop->client_gp_id,
"drop_hex_color" => $drop->boundary_hex_color,
"drop_shape" => $drop->boundary_type,
"drop_radius" => $drop->boundary_radius,
"drop_diameter" => $drop->boundary_diameter,
"drop_area" => $drop->boundary_area,
"drop_ha" => $drop->boundary_ha,
"drop_bounds" => $drop->boundary_bounds,
"drop_latlngs" => $drop->boundary_latlngs,
"drop_points" => $drop->boundary_points,
"pic_name" => $drop->inpt_pic_name,
"pic_phone_code" => $drop->inpt_pic_phone_code,
"pic_phone_val" => $drop->inpt_pic_phone_val,
"pic_mail" => $drop->inpt_pic_mail,
];
OrdersDrops::updtByOrdId($order->ord_id, $updtDrop);
// $main_item_dec = "Pengantaran Logistik<br>" . ucwords(strtolower($pckPoints[0]->ktid_name)) . " - " . ucwords(strtolower($dropPoints[0]->ktid_name)) . "<br>" . ucwords(strtolower($dropPoints[0]->name)) . ", " . ucwords(strtolower($dropPoints[0]->prid_name)) . " - " . $dropPoints[0]->shiptocode . "<br>" . strftime('%d %m %Y', $insPck['set_pck_at']) . "<br>" . $req->note_tonase;
$ktid_name = ucwords(strtolower($drop->ktid_name));
$drop_name = ucwords(strtolower($drop->name));
$prid_name = ucwords(strtolower($drop->prid_name));
$shiptocode = $drop->shiptocode;
}
$a_items = OrdersAItems::showAItem([
"ord_id" => $order->ord_id,
"a_item_type" => OrdersAItems::A_TYPE_PRIMARY,
]);
foreach ($a_items as $a_item) {
// splitter
$desc_br = explode("<br>", $a_item->desc);
$nol = $desc_br[0]; // (string) Pengantaran Logistik
$satu = explode("-", $desc_br[1]); // (array) pickup->ktid_name - drop->ktid_name
$dua_0 = explode(",", $desc_br[2]); // (array) drop->name, drop->prid_name - drop->shiptocode
$dua_1 = explode("-", $dua_0[1]); // (array) drop->prid_name - drop->shiptocode
$tiga = $desc_br[3]; // (string) DD MM YYYY
$empat = $desc_br[4]; // (string) $req->note_tonase
// update string
$satu[1] = " " . $ktid_name;
$dua_0[0] = $drop_name;
$dua_1[0] = " " . $prid_name . " ";
$dua_1[1] = " " . $shiptocode;
// concatination
$dua_1 = implode("-", $dua_1);
$dua_0[1] = $dua_1;
$dua_0 = implode(",", $dua_0);
$satu = implode("-", $satu);
// concatination 2
$desc_br[0] = $nol;
$desc_br[1] = $satu;
$desc_br[2] = $dua_0;
$desc_br[3] = $tiga;
$desc_br[4] = $empat;
$main_item_desc = implode("<br>", $desc_br);
OrdersAItems::updt($a_item->ord_a_item_id, [
"desc" => $main_item_desc,
]);
}
DB::commit();
$apiResp = Responses::success("success update zone");
return new Response($apiResp, $apiResp["meta"]["code"]);
} catch (\Exception $e) {
DB::rollBack();
$apiResp = Responses::error($e->getMessage());
return new Response($apiResp, $apiResp["meta"]["code"]);
}
}
public function api_user_checker_change_zone_by_zid(Request $req)
{
try {
$now = time();
$input = [
"ord_id" => $req->ord_id,
"ord_code" => $req->ord_code,
"ord_drop_id" => $req->ord_drop_id,
"drop_zid" => $req->drop_zid,
];
$rulesInput = [
"ord_id" => "required|integer|not_in:0",
"ord_code" => "required|string|max:12",
"ord_drop_id" => "required|integer|not_in:0",
"drop_zid" => "required|integer|not_in:0",
];
// validasi input
$isValidInput = Validator::make($input, $rulesInput);
if (!$isValidInput->passes()) {
$apiResp = Responses::bad_input($isValidInput->messages()->first());
return new Response($apiResp, $apiResp["meta"]["code"]);
}
$zone = Zone::showZoneById($req->drop_zid);
if (count($zone) < 1) {
$apiResp = Responses::not_found("zone not found");
return new Response($apiResp, $apiResp["meta"]["code"]);
}
$orders = Orders::showOrder([
"code" => $req->ord_code,
// 'get_stts_checker' => 1,
// 'get_prefer_type_truck' => 1,
// 'get_checker_data' => 1,
// 'get_client_pt' => 1,
// 'get_accidents' => 1,
"couple_pck_drop" => 1,
"get_pic_zone" => 1,
// 'get_user_aprv_pck' => 1,
// 'get_user_aprv_pck' => 1,
"group_by" => "ord.id",
]);
if (count($orders) < 1) {
$apiResp = Responses::not_found("order not found");
return new Response($apiResp, $apiResp["meta"]["code"]);
}
$order = $orders[0];
$user = Users::getUserById($req->auth->uid);
DB::beginTransaction();
/**
* UPDATE ABOUT ZONE DROP N TRANSACTIONS
*/
$drops = Zone::getZoneById($req->drop_zid, ["region_name" => 1]);
if (count($drops) < 1) {
$apiResp = Responses::not_found("Lokasi pengantaran tidak ditemukan");
return new Response($apiResp, $apiResp["meta"]["code"]);
}
if (empty($drops[0]->boundary_points)) {
$apiResp = Responses::bad_request("Lokasi pengantaran tidak valid");
return new Response($apiResp, $apiResp["meta"]["code"]);
}
foreach ($drops as $iDrop => $drop) {
if ($drop->prid == 0 || $drop->ktid == 0 || $drop->kcid == 0 || $drop->klid == 0) {
$apiResp = Responses::bad_request(
"Zonasi wilayah(provinsi, kecamatan, ...) lokasi pengantaran " .
$drop->name .
" belum lengkap"
);
return new Response($apiResp, $apiResp["meta"]["code"]);
}
$drops[$iDrop]->inpt_pic_name = $order->drop_pic_name;
$drops[$iDrop]->inpt_pic_phone_code = 62;
$drops[$iDrop]->inpt_pic_phone_val = (int) $order->drop_pic_phone_val;
$drops[$iDrop]->inpt_pic_mail = null;
$updtDrop = [
"ord_id" => $order->ord_id,
"ord_code" => $order->ord_code,
// 'stts_drop' => OrdersDrops::STTS_WAIT,
"drop_id" => $drop->id,
"drop_name" => $drop->name,
"drop_desc" => $drop->desc,
"drop_type" => $drop->type,
"drop_workflow" => $drop->workflow_type,
"drop_shiptocode" => $drop->shiptocode,
"drop_prid" => $drop->prid,
"drop_ktid" => $drop->ktid,
"drop_kcid" => $drop->kcid,
"drop_klid" => $drop->klid,
"drop_addr" => $drop->fulladdress,
"drop_cgroup_id" => $drop->client_group_id,
"drop_cdiv_id" => $drop->client_div_id,
"drop_cgp_id" => $drop->client_gp_id,
"drop_hex_color" => $drop->boundary_hex_color,
"drop_shape" => $drop->boundary_type,
"drop_radius" => $drop->boundary_radius,
"drop_diameter" => $drop->boundary_diameter,
"drop_area" => $drop->boundary_area,
"drop_ha" => $drop->boundary_ha,
"drop_bounds" => $drop->boundary_bounds,
"drop_latlngs" => $drop->boundary_latlngs,
"drop_points" => $drop->boundary_points,
"pic_name" => $drop->inpt_pic_name,
"pic_phone_code" => $drop->inpt_pic_phone_code,
"pic_phone_val" => $drop->inpt_pic_phone_val,
"pic_mail" => $drop->inpt_pic_mail,
];
OrdersDrops::updt($order->ord_drop_id, $updtDrop);
// $main_item_dec = "Pengantaran Logistik<br>" . ucwords(strtolower($pckPoints[0]->ktid_name)) . " - " . ucwords(strtolower($dropPoints[0]->ktid_name)) . "<br>" . ucwords(strtolower($dropPoints[0]->name)) . ", " . ucwords(strtolower($dropPoints[0]->prid_name)) . " - " . $dropPoints[0]->shiptocode . "<br>" . strftime('%d %m %Y', $insPck['set_pck_at']) . "<br>" . $req->note_tonase;
$ktid_name = ucwords(strtolower($drop->ktid_name));
$drop_name = ucwords(strtolower($drop->name));
$prid_name = ucwords(strtolower($drop->prid_name));
$shiptocode = $drop->shiptocode;
}
$a_items = OrdersAItems::showAItem([
"ord_id" => $order->ord_id,
"a_item_type" => OrdersAItems::A_TYPE_PRIMARY,
]);
foreach ($a_items as $a_item) {
// splitter
$desc_br = explode("<br>", $a_item->desc);
$nol = $desc_br[0]; // (string) Pengantaran Logistik
$satu = explode("-", $desc_br[1]); // (array) pickup->ktid_name - drop->ktid_name
$dua_0 = explode(",", $desc_br[2]); // (array) drop->name, drop->prid_name - drop->shiptocode
$dua_1 = explode("-", $dua_0[1]); // (array) drop->prid_name - drop->shiptocode
$tiga = $desc_br[3]; // (string) DD MM YYYY
$empat = $desc_br[4]; // (string) $req->note_tonase
// update string
$satu[1] = " " . $ktid_name;
$dua_0[0] = $drop_name;
$dua_1[0] = " " . $prid_name . " ";
$dua_1[1] = " " . $shiptocode;
// concatination
$dua_1 = implode("-", $dua_1);
$dua_0[1] = $dua_1;
$dua_0 = implode(",", $dua_0);
$satu = implode("-", $satu);
// concatination 2
$desc_br[0] = $nol;
$desc_br[1] = $satu;
$desc_br[2] = $dua_0;
$desc_br[3] = $tiga;
$desc_br[4] = $empat;
$main_item_desc = implode("<br>", $desc_br);
OrdersAItems::updt($a_item->ord_a_item_id, [
"desc" => $main_item_desc,
]);
}
DB::commit();
$apiResp = Responses::success("success update zone");
return new Response($apiResp, $apiResp["meta"]["code"]);
} catch (\Exception $e) {
DB::rollBack();
$apiResp = Responses::error($e->getMessage());
return new Response($apiResp, $apiResp["meta"]["code"]);
}
}
public function api_universal_list_zones(Request $req)
{
try {
$now = time();
$input = [];
$rulesInput = [];
// validasi input
// $isValidInput = Validator::make($input, $rulesInput);
// if (!$isValidInput->passes()) {
// $apiResp = Responses::bad_input($isValidInput->messages()->first());
// return new Response($apiResp, $apiResp['meta']['code']);
// }
$filter = [];
if ($req->cptid) {
$filter["company"] = $req->cptid;
}
if ($req->status) {
$filter["is_active"] = $req->status;
}
if ($req->auth->role === Users::ROLE_SPECIAL_TRACKING) {
// $filter['vid'] = 0;
$filter["company"] = $req->auth->client_group_id;
}
$list = Zone::listZones($req->auth, $filter);
foreach ($list as $key => $row) {
$list[$key]->DT_RowIndex = $key + 1;
$list[$key]->action = "-";
unset($list[$key]->boundary_points);
}
$apiResp = Responses::success("success list zones");
$apiResp["data"] = $list;
$apiResp["count"] = count($list);
return new Response($apiResp, $apiResp["meta"]["code"]);
} catch (\Exception $e) {
$apiResp = Responses::error($e->getMessage());
return new Response($apiResp, $apiResp["meta"]["code"]);
}
}
}