diff --git a/app/Services/ServiceClient.php b/app/Services/ServiceClient.php index 3f82ac4..f209569 100644 --- a/app/Services/ServiceClient.php +++ b/app/Services/ServiceClient.php @@ -42,8 +42,14 @@ class ServiceClient } $response = $this->client->request($method, $this->baseUrl . $url, $options); + $responseBody = (string) $response->getBody(); - $resultResponse = json_decode($response->getBody(), true); + if (!str_contains($response->getHeaderLine('Content-Type'), 'application/json')) { + \Log::error('Unexpected response format: ' . $responseBody); + return $this->resError('API response is not JSON'); + } + + $resultResponse = json_decode($responseBody, true, 512, JSON_THROW_ON_ERROR); return $this->resSuccess($resultResponse); } catch (Exception $e) { \Log::error('error from client service'. $e->getMessage()); diff --git a/app/Services/ServiceSIMBG.php b/app/Services/ServiceSIMBG.php index 136adc5..11176e0 100644 --- a/app/Services/ServiceSIMBG.php +++ b/app/Services/ServiceSIMBG.php @@ -37,63 +37,66 @@ class ServiceSIMBG } public function getToken(){ - $url = "/api/user/v1/auth/login/"; - $body = [ - 'email' => $this->email, - 'password' => $this->password, - ]; - - $res = $this->service_client->post($url, $body); - if(!$res->original['success']){ - Log::error("Token not retrieved ", ['response' => $res]); - return null; + try{ + $url = "/api/user/v1/auth/login/"; + $body = [ + 'email' => $this->email, + 'password' => $this->password, + ]; + + $res = $this->service_client->post($url, $body); + if(!$res->original['success']){ + Log::error("Token not retrieved ", ['response' => $res]); + throw new Exception("Token not retrieved."); + } + return $res; + }catch(Exception $e){ + Log::error("Error on method get token ", ['response' => $e->getMessage()]); + throw $e; } - return $res; } public function syncIndexIntegration($uuid, $token) { - $url = "/api/pbg/v1/detail/" . $uuid . "/retribution/indeks-terintegrasi/"; - - $headers = [ - 'Authorization' => "Bearer " . $token, - ]; + try{ + $url = "/api/pbg/v1/detail/" . $uuid . "/retribution/indeks-terintegrasi/"; - $res = $this->service_client->get($url, $headers); - - if (empty($res->original['success']) || !$res->original['success']) { - // Log error - Log::error("API response indicates failure", ['url' => $url, 'uuid' => $uuid]); - return false; - } - - $data = $res->original['data']['data'] ?? null; - if (!$data) { - Log::error("No valid data returned from API", ['url' => $url, 'uuid' => $uuid]); - return false; - } - - $resultData = PbgTaskIndexIntegrations::updateOrCreate( - ['pbg_task_uid' => $uuid], - [ - 'indeks_fungsi_bangunan' => $data['indeks_fungsi_bangunan'] ?? null, - 'indeks_parameter_kompleksitas' => $data['indeks_parameter_kompleksitas'] ?? null, - 'indeks_parameter_permanensi' => $data['indeks_parameter_permanensi'] ?? null, - 'indeks_parameter_ketinggian' => $data['indeks_parameter_ketinggian'] ?? null, - 'faktor_kepemilikan' => $data['faktor_kepemilikan'] ?? null, - 'indeks_terintegrasi' => $data['indeks_terintegrasi'] ?? null, - 'total' => $data['total'] ?? null, - ] - ); - - // Log success - if ($resultData->wasRecentlyCreated) { - Log::info("integration created successfully", ['uuid' => $uuid]); - } else { - Log::info("integration updated successfully", ['uuid' => $uuid]); - } + $headers = [ + 'Authorization' => "Bearer " . $token, + ]; - return true; + $res = $this->service_client->get($url, $headers); + + if (empty($res->original['success']) || !$res->original['success']) { + // Log error + Log::error("API response indicates failure", ['url' => $url, 'uuid' => $uuid]); + return false; + } + + $data = $res->original['data']['data'] ?? null; + if (!$data) { + Log::error("No valid data returned from API", ['url' => $url, 'uuid' => $uuid]); + return false; + } + + $resultData = PbgTaskIndexIntegrations::updateOrCreate( + ['pbg_task_uid' => $uuid], + [ + 'indeks_fungsi_bangunan' => $data['indeks_fungsi_bangunan'] ?? null, + 'indeks_parameter_kompleksitas' => $data['indeks_parameter_kompleksitas'] ?? null, + 'indeks_parameter_permanensi' => $data['indeks_parameter_permanensi'] ?? null, + 'indeks_parameter_ketinggian' => $data['indeks_parameter_ketinggian'] ?? null, + 'faktor_kepemilikan' => $data['faktor_kepemilikan'] ?? null, + 'indeks_terintegrasi' => $data['indeks_terintegrasi'] ?? null, + 'total' => $data['total'] ?? null, + ] + ); + + return true; + }catch (Exception $e){ + Log::error('error when sync index integration ', ['index integration'=> $e->getMessage()]); + throw $e; + } } public function syncTaskList() @@ -182,22 +185,10 @@ class ServiceSIMBG 'created_at' => now(), ]; - $save_integration = $this->syncIndexIntegration($item['uid'], $token); - if (!$save_integration) { - $importDatasource->update([ - 'status' => ImportDatasourceStatus::Failed->value, - 'message' => "Successfully processed: $savedCount, Failed: $failedCount" - ]); - } - - $save_detail = $this->syncTaskDetailSubmit($item['uid'], $token); - if( !$save_detail ) { - $importDatasource->update([ - 'status' => ImportDatasourceStatus::Failed->value, - 'message' => "Successfully processed: $savedCount, Failed: $failedCount" - ]); - } + $this->syncIndexIntegration($item['uid'], $token); + $this->syncTaskDetailSubmit($item['uid'], $token); + $savedCount++; } catch (Exception $e) { $failedCount++; @@ -236,79 +227,83 @@ class ServiceSIMBG public function syncTaskDetailSubmit($uuid, $token) { - $url = "/api/pbg/v1/detail/" . $uuid . "/retribution/submit/"; - $headers = [ - 'Authorization' => "Bearer " . $token, - ]; - - $res = $this->service_client->get($url, $headers); - - if (empty($res->original['success']) || !$res->original['success']) { - // Log error - Log::error("API response indicates failure", ['url' => $url, 'uuid' => $uuid]); - return false; - } - - $data = $res->original['data']['data'] ?? []; - if (empty($data)) { - Log::error("No data returned from API", ['url' => $url, 'uuid' => $uuid]); - return false; - } - - $detailCreatedAt = isset($data['created_at']) - ? Carbon::parse($data['created_at'])->format('Y-m-d H:i:s') - : null; - - $detailUpdatedAt = isset($data['updated_at']) - ? Carbon::parse($data['updated_at'])->format('Y-m-d H:i:s') - : null; - - $pbg_task_retributions = PbgTaskRetributions::updateOrCreate( - ['detail_id' => $data['id']], - [ - 'detail_uid' => $data['uid'] ?? null, - 'detail_created_at' => $detailCreatedAt ?? null, - 'detail_updated_at' => $detailUpdatedAt ?? null, - 'luas_bangunan' => $data['luas_bangunan'] ?? null, - 'indeks_lokalitas' => $data['indeks_lokalitas'] ?? null, - 'wilayah_shst' => $data['wilayah_shst'] ?? null, - 'kegiatan_id' => $data['kegiatan']['id'] ?? null, - 'kegiatan_name' => $data['kegiatan']['name'] ?? null, - 'nilai_shst' => $data['nilai_shst'] ?? null, - 'indeks_terintegrasi' => $data['indeks_terintegrasi'] ?? null, - 'indeks_bg_terbangun' => $data['indeks_bg_terbangun'] ?? null, - 'nilai_retribusi_bangunan' => $data['nilai_retribusi_bangunan'] ?? null, - 'nilai_prasarana' => $data['nilai_prasarana'] ?? null, - 'created_by' => $data['created_by'] ?? null, - 'pbg_document' => $data['pbg_document'] ?? null, - 'underpayment' => $data['underpayment'] ?? null, - 'skrd_amount' => $data['skrd_amount'] ?? null, - 'pbg_task_uid' => $uuid, - ] - ); - - $pbg_task_retribution_id = $pbg_task_retributions->id; - - $prasaranaData = $data['prasarana'] ?? []; - if (!empty($prasaranaData)) { - $insertData = array_map(fn($item) => [ - 'pbg_task_uid' => $uuid, - 'pbg_task_retribution_id' => $pbg_task_retribution_id, - 'prasarana_id' => $item['id'] ?? null, - 'prasarana_type' => $item['prasarana_type'] ?? null, - 'building_type' => $item['building_type'] ?? null, - 'total' => $item['total'] ?? null, - 'quantity' => $item['quantity'] ?? null, - 'unit' => $item['unit'] ?? null, - 'index_prasarana' => $item['index_prasarana'] ?? null, - ], $prasaranaData); + try{ + $url = "/api/pbg/v1/detail/" . $uuid . "/retribution/submit/"; + $headers = [ + 'Authorization' => "Bearer " . $token, + ]; - // Use bulk insert or upsert for faster database operation - PbgTaskPrasarana::upsert($insertData, ['prasarana_id']); - } + $res = $this->service_client->get($url, $headers); + + if (empty($res->original['success']) || !$res->original['success']) { + // Log error + Log::error("API response indicates failure", ['url' => $url, 'uuid' => $uuid]); + return false; + } + + $data = $res->original['data']['data'] ?? []; + if (empty($data)) { + Log::error("No data returned from API", ['url' => $url, 'uuid' => $uuid]); + return false; + } + + $detailCreatedAt = isset($data['created_at']) + ? Carbon::parse($data['created_at'])->format('Y-m-d H:i:s') + : null; + + $detailUpdatedAt = isset($data['updated_at']) + ? Carbon::parse($data['updated_at'])->format('Y-m-d H:i:s') + : null; + + $pbg_task_retributions = PbgTaskRetributions::updateOrCreate( + ['detail_id' => $data['id']], + [ + 'detail_uid' => $data['uid'] ?? null, + 'detail_created_at' => $detailCreatedAt ?? null, + 'detail_updated_at' => $detailUpdatedAt ?? null, + 'luas_bangunan' => $data['luas_bangunan'] ?? null, + 'indeks_lokalitas' => $data['indeks_lokalitas'] ?? null, + 'wilayah_shst' => $data['wilayah_shst'] ?? null, + 'kegiatan_id' => $data['kegiatan']['id'] ?? null, + 'kegiatan_name' => $data['kegiatan']['name'] ?? null, + 'nilai_shst' => $data['nilai_shst'] ?? null, + 'indeks_terintegrasi' => $data['indeks_terintegrasi'] ?? null, + 'indeks_bg_terbangun' => $data['indeks_bg_terbangun'] ?? null, + 'nilai_retribusi_bangunan' => $data['nilai_retribusi_bangunan'] ?? null, + 'nilai_prasarana' => $data['nilai_prasarana'] ?? null, + 'created_by' => $data['created_by'] ?? null, + 'pbg_document' => $data['pbg_document'] ?? null, + 'underpayment' => $data['underpayment'] ?? null, + 'skrd_amount' => $data['skrd_amount'] ?? null, + 'pbg_task_uid' => $uuid, + ] + ); + + $pbg_task_retribution_id = $pbg_task_retributions->id; + + $prasaranaData = $data['prasarana'] ?? []; + if (!empty($prasaranaData)) { + $insertData = array_map(fn($item) => [ + 'pbg_task_uid' => $uuid, + 'pbg_task_retribution_id' => $pbg_task_retribution_id, + 'prasarana_id' => $item['id'] ?? null, + 'prasarana_type' => $item['prasarana_type'] ?? null, + 'building_type' => $item['building_type'] ?? null, + 'total' => $item['total'] ?? null, + 'quantity' => $item['quantity'] ?? null, + 'unit' => $item['unit'] ?? null, + 'index_prasarana' => $item['index_prasarana'] ?? null, + ], $prasaranaData); + + // Use bulk insert or upsert for faster database operation + PbgTaskPrasarana::upsert($insertData, ['prasarana_id']); + } + return true; - Log::info("retribution and prasarana successfully", ['uuid' => $uuid]); - return true; + }catch(Exception $e){ + Log::error("Failed to sync task detail submit", ['error' => $e->getMessage(), 'uuid' => $uuid]); + throw $e; + } } } diff --git a/resources/js/dashboards/bigdata.js b/resources/js/dashboards/bigdata.js index 1022297..e83c299 100644 --- a/resources/js/dashboards/bigdata.js +++ b/resources/js/dashboards/bigdata.js @@ -591,32 +591,55 @@ document.addEventListener("DOMContentLoaded", async function (e) { await new BigData().init(); }); +// function resizeDashboard() { +// //Target Width +// let targetElement = document.getElementById("dashboard-fixed-wrapper"); +// let targetWidth = targetElement.offsetWidth; +// //console.log("TARGET ",targetWidth); + +// //Real Object Width +// let dashboardElement = document.getElementById("dashboard-fixed-container"); +// let dashboardWidth = 1110; //dashboardElement.offsetWidth; +// //console.log("CURRENT ",dashboardWidth); + +// if (targetWidth > dashboardWidth) { +// targetWidth = dashboardWidth; +// } + +// dashboardElement.style.transformOrigin = "left top"; +// dashboardElement.style.transition = "transform 0.2s ease-in-out"; +// dashboardElement.style.transform = +// "scale(" + (targetWidth / dashboardWidth).toFixed(2) + ")"; +// //console.log("SCALE ", (targetWidth/dashboardWidth).toFixed(2)); +// } + +// window.addEventListener("load", function () { +// resizeDashboard(); +// }); + +// window.addEventListener("resize", function () { +// resizeDashboard(); +// }); + function resizeDashboard() { - //Target Width let targetElement = document.getElementById("dashboard-fixed-wrapper"); - let targetWidth = targetElement.offsetWidth; - //console.log("TARGET ",targetWidth); - - //Real Object Width let dashboardElement = document.getElementById("dashboard-fixed-container"); - let dashboardWidth = 1110; //dashboardElement.offsetWidth; - //console.log("CURRENT ",dashboardWidth); - if (targetWidth > dashboardWidth) { - targetWidth = dashboardWidth; - } + let targetWidth = targetElement.offsetWidth; + let dashboardWidth = 1110; + + let scaleFactor = (targetWidth / dashboardWidth).toFixed(2); + + // Prevent scaling beyond 1 (100%) to avoid overflow + scaleFactor = Math.min(scaleFactor, 1); dashboardElement.style.transformOrigin = "left top"; dashboardElement.style.transition = "transform 0.2s ease-in-out"; - dashboardElement.style.transform = - "scale(" + (targetWidth / dashboardWidth).toFixed(2) + ")"; - //console.log("SCALE ", (targetWidth/dashboardWidth).toFixed(2)); + dashboardElement.style.transform = `scale(${scaleFactor})`; + + // Ensure horizontal scrolling is allowed if necessary + document.body.style.overflowX = "auto"; } -window.addEventListener("load", function () { - resizeDashboard(); -}); - -window.addEventListener("resize", function () { - resizeDashboard(); -}); +window.addEventListener("load", resizeDashboard); +window.addEventListener("resize", resizeDashboard); diff --git a/resources/js/data-settings/index.js b/resources/js/data-settings/index.js index 0f3944e..39599eb 100644 --- a/resources/js/data-settings/index.js +++ b/resources/js/data-settings/index.js @@ -52,13 +52,16 @@ class DataSettings { name: "Actions", width: "120px", formatter: function (cell) { - console.log("cell data", cell); return gridjs.html(` -