Compare commits
4 Commits
fix/merge-
...
fix/handle
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
625d182d81 | ||
|
|
4d32d4a110 | ||
|
|
ac2f37d549 | ||
|
|
a9afb47f08 |
@@ -242,7 +242,7 @@ class PbgTaskController extends Controller
|
||||
$total_data = count($mapToUpsert);
|
||||
|
||||
$import_datasource->update([
|
||||
"message" => "Successfully imported {$total_data}",
|
||||
"message" => "Successfully processed: {$total_data}",
|
||||
"status" => ImportDatasourceStatus::Success->value,
|
||||
]);
|
||||
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Http\Requests\MenuRequest;
|
||||
use App\Models\Menu;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
@@ -28,24 +29,12 @@ class MenusController extends Controller
|
||||
/**
|
||||
* Store a newly created resource in storage.
|
||||
*/
|
||||
public function store(Request $request)
|
||||
public function store(MenuRequest $request)
|
||||
{
|
||||
try{
|
||||
$request->validate([
|
||||
'name' => 'required|string|max:255',
|
||||
'url' => 'nullable|string|max:255',
|
||||
'icon' => 'nullable|string|max:255',
|
||||
'parent_id' => 'nullable|exists:menus,id', // Ensures it's either null or a valid menu ID
|
||||
'sort_order' => 'required|integer',
|
||||
]);
|
||||
$validated_menu = $request->validated();
|
||||
DB::beginTransaction();
|
||||
Menu::create([
|
||||
'name' => $request->name,
|
||||
'url' => $request->url,
|
||||
'icon' => $request->icon,
|
||||
'parent_id' => $request->parent_id ?? null,
|
||||
'sort_order' => $request->sort_order,
|
||||
]);
|
||||
Menu::create($validated_menu);
|
||||
DB::commit();
|
||||
return response()->json(['message' => 'Successfully created'], 200);
|
||||
}catch(\Exception $e){
|
||||
@@ -77,21 +66,13 @@ class MenusController extends Controller
|
||||
/**
|
||||
* Update the specified resource in storage.
|
||||
*/
|
||||
public function update(Request $request, string $id)
|
||||
public function update(MenuRequest $request, string $id)
|
||||
{
|
||||
try{
|
||||
$validateData = $request->validate([
|
||||
'name' => 'required',
|
||||
'url'=> 'required',
|
||||
'icon'=> 'nullable',
|
||||
'parent_id' => 'nullable',
|
||||
'sort_order' => 'required',
|
||||
]);
|
||||
|
||||
$validate_menu = $request->validated();
|
||||
$menu = Menu::findOrFail($id);
|
||||
|
||||
DB::beginTransaction();
|
||||
$menu->update($validateData);
|
||||
$menu->update($validate_menu);
|
||||
DB::commit();
|
||||
return response()->json(['message' => 'Successfully updated'], 200);
|
||||
}catch(\Exception $e){
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Http\Requests\RoleRequest;
|
||||
use App\Models\Menu;
|
||||
use App\Models\Role;
|
||||
use App\Models\RoleMenu;
|
||||
@@ -31,16 +32,13 @@ class RolesController extends Controller
|
||||
/**
|
||||
* Store a newly created resource in storage.
|
||||
*/
|
||||
public function store(Request $request)
|
||||
public function store(RoleRequest $request)
|
||||
{
|
||||
try{
|
||||
$request->validate([
|
||||
"name" => "required|unique:roles,name",
|
||||
"description" => "nullable",
|
||||
]);
|
||||
$validate_role = $request->validated();
|
||||
|
||||
DB::beginTransaction();
|
||||
Role::create($request->all());
|
||||
Role::create($validate_role);
|
||||
DB::commit();
|
||||
return response()->json(['message' => 'Role created successfully'], 201);
|
||||
}
|
||||
@@ -70,18 +68,14 @@ class RolesController extends Controller
|
||||
/**
|
||||
* Update the specified resource in storage.
|
||||
*/
|
||||
public function update(Request $request, string $id)
|
||||
public function update(RoleRequest $request, string $id)
|
||||
{
|
||||
try{
|
||||
$validate_role = $request->validated();
|
||||
$role = Role::findOrFail($id);
|
||||
// Validate request data
|
||||
$validatedData = $request->validate([
|
||||
'name' => 'required|string|max:255|unique:roles,name,' . $id, // Ensure name is unique except for the current role
|
||||
'description' => 'nullable|string|max:500',
|
||||
]);
|
||||
|
||||
DB::beginTransaction();
|
||||
$role->update($validatedData);
|
||||
$role->update($validate_role);
|
||||
DB::commit();
|
||||
return response()->json(['message' => 'Role updated successfully'], 200);
|
||||
}catch(\Exception $e){
|
||||
@@ -97,7 +91,7 @@ class RolesController extends Controller
|
||||
{
|
||||
try{
|
||||
DB::beginTransaction();
|
||||
$deleted = Role::findOrFail($id)->delete();
|
||||
Role::findOrFail($id)->delete();
|
||||
DB::commit();
|
||||
return response()->json(['success' => true, "message" => "Successfully deleted"]);
|
||||
}catch(\Exception $e){
|
||||
|
||||
32
app/Http/Requests/MenuRequest.php
Normal file
32
app/Http/Requests/MenuRequest.php
Normal file
@@ -0,0 +1,32 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Requests;
|
||||
|
||||
use Illuminate\Foundation\Http\FormRequest;
|
||||
|
||||
class MenuRequest extends FormRequest
|
||||
{
|
||||
/**
|
||||
* Determine if the user is authorized to make this request.
|
||||
*/
|
||||
public function authorize(): bool
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the validation rules that apply to the request.
|
||||
*
|
||||
* @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array<mixed>|string>
|
||||
*/
|
||||
public function rules(): array
|
||||
{
|
||||
return [
|
||||
'name' => ['required','string','max:255'],
|
||||
'url' => ['nullable','string','max:255'],
|
||||
'icon' => ['nullable','string','max:255'],
|
||||
'parent_id' => ['nullable','exists:menus,id'],
|
||||
'sort_order' => ['required','integer'],
|
||||
];
|
||||
}
|
||||
}
|
||||
30
app/Http/Requests/RoleRequest.php
Normal file
30
app/Http/Requests/RoleRequest.php
Normal file
@@ -0,0 +1,30 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Requests;
|
||||
|
||||
use Illuminate\Foundation\Http\FormRequest;
|
||||
|
||||
class RoleRequest extends FormRequest
|
||||
{
|
||||
/**
|
||||
* Determine if the user is authorized to make this request.
|
||||
*/
|
||||
public function authorize(): bool
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the validation rules that apply to the request.
|
||||
*
|
||||
* @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array<mixed>|string>
|
||||
*/
|
||||
public function rules(): array
|
||||
{
|
||||
$roleId = $this->route('role');
|
||||
return [
|
||||
'name' => 'required|string|max:255|unique:roles,name,' . ($roleId ?? 'NULL') . ',id',
|
||||
'description' => 'nullable|string',
|
||||
];
|
||||
}
|
||||
}
|
||||
@@ -34,51 +34,59 @@ class GoogleSheetService
|
||||
|
||||
public function getLastRowByColumn($column = "A")
|
||||
{
|
||||
// Ambil spreadsheet
|
||||
$spreadsheet = $this->service->spreadsheets->get($this->spreadsheetID);
|
||||
$sheets = $spreadsheet->getSheets();
|
||||
|
||||
if (!empty($sheets)) {
|
||||
// Ambil nama sheet pertama dengan benar
|
||||
$firstSheetTitle = $sheets[0]->getProperties()->getTitle();
|
||||
|
||||
// ✅ Format range harus benar!
|
||||
$range = "{$firstSheetTitle}!{$column}:{$column}";
|
||||
|
||||
// Ambil data dari kolom yang diminta
|
||||
$response = $this->service->spreadsheets_values->get($this->spreadsheetID, $range);
|
||||
$values = $response->getValues();
|
||||
|
||||
// Cek nilai terakhir yang tidak kosong
|
||||
$lastRow = 0;
|
||||
if (!empty($values)) {
|
||||
foreach ($values as $index => $row) {
|
||||
if (!empty($row[0])) { // Jika ada data, update lastRow
|
||||
$lastRow = $index + 1;
|
||||
try{
|
||||
// Ambil spreadsheet
|
||||
$spreadsheet = $this->service->spreadsheets->get($this->spreadsheetID);
|
||||
$sheets = $spreadsheet->getSheets();
|
||||
|
||||
if (!empty($sheets)) {
|
||||
// Ambil nama sheet pertama dengan benar
|
||||
$firstSheetTitle = $sheets[0]->getProperties()->getTitle();
|
||||
|
||||
// ✅ Format range harus benar!
|
||||
$range = "{$firstSheetTitle}!{$column}:{$column}";
|
||||
|
||||
// Ambil data dari kolom yang diminta
|
||||
$response = $this->service->spreadsheets_values->get($this->spreadsheetID, $range);
|
||||
$values = $response->getValues();
|
||||
|
||||
// Cek nilai terakhir yang tidak kosong
|
||||
$lastRow = 0;
|
||||
if (!empty($values)) {
|
||||
foreach ($values as $index => $row) {
|
||||
if (!empty($row[0])) { // Jika ada data, update lastRow
|
||||
$lastRow = $index + 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $lastRow;
|
||||
}
|
||||
|
||||
return $lastRow;
|
||||
|
||||
return 0;
|
||||
}catch(\Exception $e){
|
||||
throw $e;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
public function getHeader()
|
||||
{
|
||||
$spreadsheet = $this->service->spreadsheets->get($this->spreadsheetID);
|
||||
$sheets = $spreadsheet->getSheets();
|
||||
|
||||
// Ambil nama sheet pertama
|
||||
$firstSheetTitle = $sheets[0]->getProperties()->getTitle();
|
||||
|
||||
// Ambil data dari baris pertama (header)
|
||||
$range = "{$firstSheetTitle}!1:1";
|
||||
$response = $this->service->spreadsheets_values->get($this->spreadsheetID, $range);
|
||||
$values = $response->getValues();
|
||||
|
||||
// Kembalikan header (baris pertama)
|
||||
return !empty($values) ? $values[0] : [];
|
||||
try{
|
||||
$spreadsheet = $this->service->spreadsheets->get($this->spreadsheetID);
|
||||
$sheets = $spreadsheet->getSheets();
|
||||
|
||||
// Ambil nama sheet pertama
|
||||
$firstSheetTitle = $sheets[0]->getProperties()->getTitle();
|
||||
|
||||
// Ambil data dari baris pertama (header)
|
||||
$range = "{$firstSheetTitle}!1:1";
|
||||
$response = $this->service->spreadsheets_values->get($this->spreadsheetID, $range);
|
||||
$values = $response->getValues();
|
||||
|
||||
// Kembalikan header (baris pertama)
|
||||
return !empty($values) ? $values[0] : [];
|
||||
}catch(\Exception $e){
|
||||
throw $e;
|
||||
}
|
||||
}
|
||||
|
||||
public function getLastColumn()
|
||||
@@ -99,33 +107,37 @@ class GoogleSheetService
|
||||
}
|
||||
|
||||
public function getSheetDataCollection($totalRow = 10){
|
||||
$spreadsheet = $this->service->spreadsheets->get($this->spreadsheetID);
|
||||
$sheets = $spreadsheet->getSheets();
|
||||
$firstSheetTitle = $sheets[0]->getProperties()->getTitle();
|
||||
|
||||
$header = $this->getHeader();
|
||||
$header = array_map(function($columnHeader) {
|
||||
// Trim spaces first, then replace non-alphanumeric characters with underscores
|
||||
$columnHeader = trim($columnHeader);
|
||||
return strtolower(preg_replace('/[^A-Za-z0-9_]/', '_', $columnHeader));
|
||||
}, $header);
|
||||
$range = "{$firstSheetTitle}!2:{$totalRow}";
|
||||
|
||||
$response = $this->service->spreadsheets_values->get($this->spreadsheetID, $range);
|
||||
$values = $response->getValues();
|
||||
|
||||
$mappedData = [];
|
||||
if (!empty($values)) {
|
||||
foreach ($values as $row) {
|
||||
$rowData = [];
|
||||
foreach ($header as $index => $columnHeader) {
|
||||
// Map header to the corresponding value from the row
|
||||
$rowData[$columnHeader] = isset($row[$index]) ? $row[$index] : null;
|
||||
try{
|
||||
$spreadsheet = $this->service->spreadsheets->get($this->spreadsheetID);
|
||||
$sheets = $spreadsheet->getSheets();
|
||||
$firstSheetTitle = $sheets[0]->getProperties()->getTitle();
|
||||
|
||||
$header = $this->getHeader();
|
||||
$header = array_map(function($columnHeader) {
|
||||
// Trim spaces first, then replace non-alphanumeric characters with underscores
|
||||
$columnHeader = trim($columnHeader);
|
||||
return strtolower(preg_replace('/[^A-Za-z0-9_]/', '_', $columnHeader));
|
||||
}, $header);
|
||||
$range = "{$firstSheetTitle}!2:{$totalRow}";
|
||||
|
||||
$response = $this->service->spreadsheets_values->get($this->spreadsheetID, $range);
|
||||
$values = $response->getValues();
|
||||
|
||||
$mappedData = [];
|
||||
if (!empty($values)) {
|
||||
foreach ($values as $row) {
|
||||
$rowData = [];
|
||||
foreach ($header as $index => $columnHeader) {
|
||||
// Map header to the corresponding value from the row
|
||||
$rowData[$columnHeader] = isset($row[$index]) ? $row[$index] : null;
|
||||
}
|
||||
$mappedData[] = $rowData;
|
||||
}
|
||||
$mappedData[] = $rowData;
|
||||
}
|
||||
|
||||
return $mappedData;
|
||||
}catch(\Exception $e){
|
||||
throw $e;
|
||||
}
|
||||
|
||||
return $mappedData;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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());
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -10,6 +10,10 @@
|
||||
"__commonjsHelpers-C4iS2aBk.js"
|
||||
]
|
||||
},
|
||||
"_dropzone-B5tMhgFp.js": {
|
||||
"file": "assets/dropzone-B5tMhgFp.js",
|
||||
"name": "dropzone"
|
||||
},
|
||||
"_global-config-9uDKFQ8j.js": {
|
||||
"file": "assets/global-config-9uDKFQ8j.js",
|
||||
"name": "global-config"
|
||||
@@ -58,6 +62,10 @@
|
||||
"src": "node_modules/quill/dist/quill.snow.css",
|
||||
"isEntry": true
|
||||
},
|
||||
"public/images/bg-dashboard.jpg": {
|
||||
"file": "assets/bg-dashboard-CUwt8_jP.jpg",
|
||||
"src": "public/images/bg-dashboard.jpg"
|
||||
},
|
||||
"resources/fonts/boxicons.eot": {
|
||||
"file": "assets/boxicons-0t2gX1vj.eot",
|
||||
"src": "resources/fonts/boxicons.eot"
|
||||
@@ -94,7 +102,7 @@
|
||||
"isEntry": true
|
||||
},
|
||||
"resources/js/dashboards/bigdata.js": {
|
||||
"file": "assets/bigdata-DBp18hcY.js",
|
||||
"file": "assets/bigdata-DYDUaCEC.js",
|
||||
"name": "bigdata",
|
||||
"src": "resources/js/dashboards/bigdata.js",
|
||||
"isEntry": true,
|
||||
@@ -112,7 +120,7 @@
|
||||
"isEntry": true
|
||||
},
|
||||
"resources/js/data-settings/index.js": {
|
||||
"file": "assets/index-Bm5aE3Il.js",
|
||||
"file": "assets/index-BOfsbw53.js",
|
||||
"name": "index",
|
||||
"src": "resources/js/data-settings/index.js",
|
||||
"isEntry": true,
|
||||
@@ -148,6 +156,15 @@
|
||||
"_global-config-9uDKFQ8j.js"
|
||||
]
|
||||
},
|
||||
"resources/js/data/advertisements/form-upload.js": {
|
||||
"file": "assets/form-upload-Ci7Kyzc7.js",
|
||||
"name": "form-upload",
|
||||
"src": "resources/js/data/advertisements/form-upload.js",
|
||||
"isEntry": true,
|
||||
"imports": [
|
||||
"_dropzone-B5tMhgFp.js"
|
||||
]
|
||||
},
|
||||
"resources/js/master/users/create.js": {
|
||||
"file": "assets/create-RO4xgm-f.js",
|
||||
"name": "create",
|
||||
@@ -161,7 +178,7 @@
|
||||
"isEntry": true
|
||||
},
|
||||
"resources/js/master/users/users.js": {
|
||||
"file": "assets/users-uzXjZCws.js",
|
||||
"file": "assets/users-jfWUOWyP.js",
|
||||
"name": "users",
|
||||
"src": "resources/js/master/users/users.js",
|
||||
"isEntry": true,
|
||||
@@ -178,7 +195,7 @@
|
||||
"isEntry": true
|
||||
},
|
||||
"resources/js/menus/index.js": {
|
||||
"file": "assets/index-qw4Wj-LG.js",
|
||||
"file": "assets/index-C4xA1kYa.js",
|
||||
"name": "index",
|
||||
"src": "resources/js/menus/index.js",
|
||||
"isEntry": true,
|
||||
@@ -216,10 +233,13 @@
|
||||
]
|
||||
},
|
||||
"resources/js/pages/form-fileupload.js": {
|
||||
"file": "assets/form-fileupload-mrxZaoHv.js",
|
||||
"file": "assets/form-fileupload-DGbdX8GT.js",
|
||||
"name": "form-fileupload",
|
||||
"src": "resources/js/pages/form-fileupload.js",
|
||||
"isEntry": true
|
||||
"isEntry": true,
|
||||
"imports": [
|
||||
"_dropzone-B5tMhgFp.js"
|
||||
]
|
||||
},
|
||||
"resources/js/pages/form-flatepicker.js": {
|
||||
"file": "assets/form-flatepicker-ChSlk6xC.js",
|
||||
@@ -293,7 +313,7 @@
|
||||
]
|
||||
},
|
||||
"resources/js/pbg-task/index.js": {
|
||||
"file": "assets/index-BW29TEbh.js",
|
||||
"file": "assets/index-CqcfkvSL.js",
|
||||
"name": "index",
|
||||
"src": "resources/js/pbg-task/index.js",
|
||||
"isEntry": true,
|
||||
@@ -310,7 +330,7 @@
|
||||
"isEntry": true
|
||||
},
|
||||
"resources/js/roles/index.js": {
|
||||
"file": "assets/index-B9clkWIC.js",
|
||||
"file": "assets/index-C_kI_q7O.js",
|
||||
"name": "index",
|
||||
"src": "resources/js/roles/index.js",
|
||||
"isEntry": true,
|
||||
@@ -366,17 +386,22 @@
|
||||
]
|
||||
},
|
||||
"resources/scss/components/_circle.scss": {
|
||||
"file": "assets/_circle-ByHaR-XI.css",
|
||||
"file": "assets/_circle-DgPqpfJw.css",
|
||||
"src": "resources/scss/components/_circle.scss",
|
||||
"isEntry": true
|
||||
},
|
||||
"resources/scss/dashboards/_bigdata.scss": {
|
||||
"file": "assets/_bigdata-0hCjAhYp.css",
|
||||
"src": "resources/scss/dashboards/_bigdata.scss",
|
||||
"isEntry": true
|
||||
},
|
||||
"resources/scss/icons.scss": {
|
||||
"file": "assets/icons-CHxf0fE3.css",
|
||||
"src": "resources/scss/icons.scss",
|
||||
"isEntry": true
|
||||
},
|
||||
"resources/scss/style.scss": {
|
||||
"file": "assets/style-DF7fxh2D.css",
|
||||
"file": "assets/style-DUYVmgAM.css",
|
||||
"src": "resources/scss/style.scss",
|
||||
"isEntry": true
|
||||
}
|
||||
|
||||
File diff suppressed because one or more lines are too long
643
pupr_app.sql
643
pupr_app.sql
File diff suppressed because one or more lines are too long
@@ -8,10 +8,10 @@ class BigData {
|
||||
try {
|
||||
this.filterYear = new Date().getFullYear(); // Set initial year
|
||||
|
||||
let yearInput = document.querySelector("#yearPicker");
|
||||
let yearSelect = document.querySelector("#yearPicker");
|
||||
let filterButton = document.querySelector("#btnFilterYear");
|
||||
|
||||
if (!yearInput || !filterButton) {
|
||||
if (!yearSelect || !filterButton) {
|
||||
console.error(
|
||||
"Element #yearPicker or #btnFilterYear not found."
|
||||
);
|
||||
@@ -19,18 +19,15 @@ class BigData {
|
||||
}
|
||||
|
||||
// Set default value for input
|
||||
yearInput.value = this.filterYear;
|
||||
yearSelect.value = this.filterYear;
|
||||
|
||||
// Handle manual input (pressing Enter)
|
||||
yearInput.addEventListener("keypress", (event) => {
|
||||
if (event.key === "Enter") {
|
||||
this.updateYear(yearInput.value);
|
||||
}
|
||||
yearSelect.addEventListener("change", () => {
|
||||
this.updateYear(yearSelect.value);
|
||||
});
|
||||
|
||||
// Handle button click
|
||||
filterButton.addEventListener("click", () => {
|
||||
this.updateYear(yearInput.value);
|
||||
this.updateYear(yearSelect.value);
|
||||
});
|
||||
|
||||
console.log("init filter this year", this.filterYear);
|
||||
@@ -594,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);
|
||||
|
||||
@@ -52,13 +52,16 @@ class DataSettings {
|
||||
name: "Actions",
|
||||
width: "120px",
|
||||
formatter: function (cell) {
|
||||
console.log("cell data", cell);
|
||||
return gridjs.html(`
|
||||
<div class="d-flex justify-items-end gap-10">
|
||||
<a href="/data-settings/${cell}/edit" class="btn btn-yellow me-2">Update</a>
|
||||
<button class="btn btn-red btn-delete btn-delete-data-settings" data-id="${cell}">Delete</button>
|
||||
</div>
|
||||
`);
|
||||
<div class="d-flex justify-content-center gap-2">
|
||||
<a href="/data-settings/${cell}/edit" class="btn btn-yellow btn-sm d-inline-flex align-items-center justify-content-center">
|
||||
<i class='bx bx-edit'></i>
|
||||
</a>
|
||||
<button class="btn btn-sm btn-red d-inline-flex align-items-center justify-content-centerbtn-delete-data-settings" data-id="${cell}">
|
||||
<i class='bx bxs-trash' ></i>
|
||||
</button>
|
||||
</div>
|
||||
`);
|
||||
},
|
||||
},
|
||||
],
|
||||
|
||||
@@ -22,9 +22,12 @@ class UsersTable {
|
||||
name: "Action",
|
||||
formatter: (cell) =>
|
||||
gridjs.html(`
|
||||
<div class="d-flex justify-content-end gap-x-2">
|
||||
<a href="/master/users/${cell}/edit" class="btn btn-yellow me-2">Update</a>
|
||||
`),
|
||||
<div class="d-flex justify-content-center">
|
||||
<a href="/master/users/${cell}/edit" class="btn btn-yellow btn-sm d-inline-flex align-items-center justify-content-center">
|
||||
<i class='bx bx-edit'></i>
|
||||
</a>
|
||||
</div>
|
||||
`),
|
||||
},
|
||||
],
|
||||
pagination: {
|
||||
|
||||
@@ -56,9 +56,14 @@ class Menus {
|
||||
name: "Action",
|
||||
formatter: (cell) =>
|
||||
gridjs.html(`
|
||||
<div class="d-flex justify-content-end gap-x-2">
|
||||
<a href="/menus/${cell}/edit" class="btn btn-yellow me-2">Update</a>
|
||||
<button class="btn btn-red btn-delete btn-delete-menu" data-id="${cell}">Delete</button>
|
||||
<div class="d-flex justify-content-center align-items-center gap-2">
|
||||
<a href="/menus/${cell}/edit" class="btn btn-yellow btn-sm d-inline-flex align-items-center justify-content-center">
|
||||
<i class='bx bx-edit'></i>
|
||||
</a>
|
||||
<button data-id="${cell}" class="btn btn-red btn-sm btn-delete-menu d-inline-flex align-items-center justify-content-center">
|
||||
<i class='bx bxs-trash' ></i>
|
||||
</button>
|
||||
</div>
|
||||
`),
|
||||
},
|
||||
],
|
||||
|
||||
@@ -25,8 +25,8 @@ class PbgTasks {
|
||||
name: "Action",
|
||||
formatter: function (cell) {
|
||||
return gridjs.html(`
|
||||
<div class="d-flex justify-items-end gap-10">
|
||||
<a href="/pbg-task/${cell}" class="btn btn-yellow">Detail</a
|
||||
<div class="d-flex justify-content-center align-items-center gap-2">
|
||||
<a href="/pbg-task/${cell}" class="btn btn-yellow btn-sm d-inline-flex align-items-center justify-content-center">Detail</a
|
||||
</div>
|
||||
`);
|
||||
},
|
||||
|
||||
@@ -52,10 +52,16 @@ class Roles {
|
||||
name: "Action",
|
||||
formatter: (cell) =>
|
||||
gridjs.html(`
|
||||
<div class="d-flex justify-content-end gap-x-2">
|
||||
<a href="/roles/${cell}/edit" class="btn btn-yellow me-2">Update</a>
|
||||
<a href="/roles/role-menu/${cell}" class="btn btn-yellow me-2">Role Menu</a>
|
||||
<button class="btn btn-red btn-delete-role" data-id="${cell}">Delete</button>
|
||||
<div class="d-flex justify-content-center gap-2">
|
||||
<a href="/roles/${cell}/edit" class="btn btn-yellow btn-sm d-inline-flex align-items-center justify-content-center">
|
||||
<i class='bx bx-edit'></i>
|
||||
</a>
|
||||
<a href="/roles/role-menu/${cell}" class="btn btn-primary btn-sm d-inline-flex align-items-center justify-content-center">
|
||||
Role Menu
|
||||
</a>
|
||||
<button data-id="${cell}" class="btn btn-sm btn-red btn-delete-role d-inline-flex align-items-center justify-content-center">
|
||||
<i class='bx bxs-trash' ></i>
|
||||
</button>
|
||||
</div>
|
||||
`),
|
||||
},
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
width: 200px; /* Ukuran lingkaran */
|
||||
height: 200px;
|
||||
display: flex;
|
||||
text-align: center;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
background-color: var(--circle-color); /* Warna lingkaran utama */
|
||||
@@ -17,6 +18,7 @@
|
||||
border: 6px solid white; /* Border putih */
|
||||
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); /* Efek bayangan */
|
||||
position: absolute;
|
||||
// overflow: hidden;
|
||||
|
||||
.circle-content {
|
||||
width: 180px; /* Ukuran lingkaran dalam */
|
||||
@@ -39,6 +41,12 @@
|
||||
font-weight: bold;
|
||||
margin: 0 5px;
|
||||
line-height: 1.5;
|
||||
word-wrap: break-word; /* Break words if too long */
|
||||
white-space: normal; /* Allow multi-line text */
|
||||
text-align: center; /* Center text inside the circle */
|
||||
overflow-wrap: break-word; /* Ensures breaking in modern browsers */
|
||||
display: block; /* Ensures it respects container size */
|
||||
max-width: 100%; /* Prevents exceeding the circle size */
|
||||
}
|
||||
|
||||
.circle-content .document-total {
|
||||
@@ -64,8 +72,8 @@
|
||||
|
||||
.small-circle-container {
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
right: 0;
|
||||
bottom: -10px;
|
||||
right: -10px;
|
||||
width: 50px; /* Ukuran lingkaran kecil */
|
||||
height: 50px;
|
||||
background-color: #2d4f90; /* Warna lingkaran kecil */
|
||||
@@ -75,6 +83,7 @@
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); /* Efek bayangan */
|
||||
z-index: 10;
|
||||
|
||||
.small-circle-content {
|
||||
width: 45px;
|
||||
|
||||
78
resources/scss/dashboards/_bigdata.scss
Normal file
78
resources/scss/dashboards/_bigdata.scss
Normal file
@@ -0,0 +1,78 @@
|
||||
//
|
||||
// bigdata.scss
|
||||
//
|
||||
|
||||
.square {
|
||||
height: 100px;
|
||||
width: 100px;
|
||||
position: absolute;
|
||||
z-index: -1;
|
||||
}
|
||||
|
||||
.dia-top-left-bottom-right:after {
|
||||
content: "";
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
position: absolute;
|
||||
|
||||
top: 0;
|
||||
left: 0;
|
||||
background: linear-gradient(
|
||||
to top right,
|
||||
transparent calc(50% - 2px),
|
||||
black,
|
||||
transparent calc(50% + 2px)
|
||||
);
|
||||
}
|
||||
|
||||
.dia-top-right-bottom-left:after {
|
||||
content: "";
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
background: linear-gradient(
|
||||
to top left,
|
||||
transparent calc(50% - 2px),
|
||||
black,
|
||||
transparent calc(50% + 2px)
|
||||
);
|
||||
}
|
||||
|
||||
#dashboard-fixed-wrapper {
|
||||
background-image: url("../../../public/images/bg-dashboard.jpg");
|
||||
background-size: cover;
|
||||
background-position: center;
|
||||
}
|
||||
|
||||
#dashboard-fixed-wrapper::before {
|
||||
content: "";
|
||||
position: absolute;
|
||||
pointer-events: none; /* Prevents the overlay from blocking interaction */
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background-color: rgba(
|
||||
255,
|
||||
255,
|
||||
255,
|
||||
0.7
|
||||
); /* Black overlay with 50% opacity */
|
||||
}
|
||||
|
||||
#dashboard-fixed-wrapper {
|
||||
max-width: 100vw; /* Ensures it doesn't exceed viewport */
|
||||
}
|
||||
|
||||
#dashboard-fixed-container {
|
||||
min-width: 1110px;
|
||||
max-width: unset; /* Allow it to grow if needed */
|
||||
}
|
||||
|
||||
@media (max-width: 768px) {
|
||||
#dashboard-fixed-container {
|
||||
transform: scale(0.8); /* Adjust the scale as needed */
|
||||
}
|
||||
}
|
||||
@@ -59,3 +59,5 @@
|
||||
// Pages
|
||||
@import "pages/icon-demo";
|
||||
@import "pages/authentication";
|
||||
|
||||
@import "dashboards/bigdata";
|
||||
|
||||
@@ -21,7 +21,7 @@ class="authentication-bg"
|
||||
<img src="/images/dputr-kab-bandung.png" height="auto" width="100%" alt="logo light">
|
||||
</a>
|
||||
</div>
|
||||
<h4 class="fw-bold text-dark mb-2">Welcome Back!</h3>
|
||||
<h4 class="fw-bold text-dark mb-2">Welcome Back!</h4>
|
||||
<p class="text-muted">Sign in to your account to continue</p>
|
||||
</div>
|
||||
<form method="POST" action="{{ route('login') }}" class="mt-4">
|
||||
@@ -39,25 +39,14 @@ class="authentication-bg"
|
||||
<input type="email" class="form-control" id="email" name="email" value="user@demo.com" placeholder="Enter your email">
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
{{-- <div class="d-flex justify-content-between align-items-center">
|
||||
<label for="password" class="form-label">Password</label>
|
||||
<a href="{{ route ('password.request') }}" class="text-decoration-none small text-muted">Forgot password?</a>
|
||||
</div> --}}
|
||||
<input type="password" class="form-control" id="password" name="password" value="password" placeholder="Enter your password">
|
||||
</div>
|
||||
{{-- <div class="form-check mb-3">
|
||||
<input type="checkbox" class="form-check-input" id="remember-me">
|
||||
<label class="form-check-label" for="remember-me">Remember me</label>
|
||||
</div> --}}
|
||||
<div class="d-grid">
|
||||
<button class="btn btn-dark btn-lg fw-medium" type="submit">Sign In</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
{{-- <p class="text-center mt-4 text-white text-opacity-50">Don't have an account?
|
||||
<a href="{{ route ('register') }}" class="text-decoration-none text-white fw-bold">Sign Up</a>
|
||||
</p> --}}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
@props(['buttonText' => 'Confirm', 'confirmationMessage' => 'Are you sure?'])
|
||||
|
||||
<div class="modal fade" id="modalConfirmation" tabindex="-1"
|
||||
aria-labelledby="modalConfirmationTitle" aria-hidden="true">
|
||||
<div class="modal fade" id="modalConfirmation" tabindex="-1" aria-labelledby="modalConfirmationTitle">
|
||||
<div class="modal-dialog modal-dialog-centered">
|
||||
<div class="modal-content">
|
||||
<div class="modal-body">
|
||||
|
||||
@@ -1,66 +1,36 @@
|
||||
@extends('layouts.vertical', ['subtitle' => 'Dashboards'])
|
||||
|
||||
@section('css')
|
||||
@vite(['resources/scss/dashboards/_bigdata.scss'])
|
||||
@endsection
|
||||
|
||||
@section('content')
|
||||
|
||||
@include('layouts.partials/page-title', ['title' => 'Dashboards', 'subtitle' => 'Dashboard Pimpinan'])
|
||||
|
||||
<style>
|
||||
.square{
|
||||
height: 100px;
|
||||
width: 100px;
|
||||
position: absolute;
|
||||
z-index:-1;
|
||||
}
|
||||
|
||||
.dia-top-left-bottom-right:after {
|
||||
content: "";
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
position: absolute;
|
||||
|
||||
top: 0;
|
||||
left: 0;
|
||||
background: linear-gradient(to top right, transparent calc(50% - 2px), black, transparent calc(50% + 2px));
|
||||
}
|
||||
|
||||
.dia-top-right-bottom-left:after {
|
||||
content: "";
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
background: linear-gradient(to top left, transparent calc(50% - 2px), black, transparent calc(50% + 2px));
|
||||
}
|
||||
|
||||
#dashboard-fixed-wrapper {
|
||||
background-image:url('/images/bg-dashboard.jpg');background-size: cover;background-position: center;
|
||||
}
|
||||
|
||||
#dashboard-fixed-wrapper::before {
|
||||
content: "";
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background-color: rgba(255, 255, 255, 0.7); /* Black overlay with 50% opacity */
|
||||
}
|
||||
</style>
|
||||
|
||||
<div id="dashboard-fixed-wrapper" class="row">
|
||||
<h2 style="margin-top:30px;margin-left:15px;color:#911701">
|
||||
<span style="float:right;font-size:14px;margin-right:25px;color:black">Terakhir di update - {{$latest_created}}</span>
|
||||
ANALISA BIG DATA PROSES PBG <br>
|
||||
MELALUI APLIKASI SIBEDAS PBG
|
||||
|
||||
</h2>
|
||||
|
||||
<div class="d-flex justify-content-end">
|
||||
<input type="number" class="me-3" id="yearPicker" name="year">
|
||||
<button class="btn btn-sm btn-primary" id="btnFilterYear">filter</button>
|
||||
<div class="col-12">
|
||||
<h2 class="mt-3 ms-2 text-danger">
|
||||
<span class="float-end fs-6 me-3 text-black d-block d-sm-inline text-end">Terakhir di update - {{$latest_created}}</span>
|
||||
ANALISA BIG DATA PROSES PBG <br>
|
||||
MELALUI APLIKASI SIBEDAS PBG
|
||||
|
||||
</h2>
|
||||
</div>
|
||||
<div id="dashboard-fixed-container" style="width:1110px;height:770px;position:relative;margin:auto;">
|
||||
|
||||
<div class="row d-flex justify-content-end">
|
||||
<div class="col-12 col-sm-6 col-md-3">
|
||||
<div class="d-flex flex-sm-nowrap flex-wrap justify-content-end gap-2">
|
||||
<select class="form-select w-auto" id="yearPicker" name="year" style="min-width: 100px;">
|
||||
@for ($i = date('Y'); $i > date('Y') - 5; $i--)
|
||||
<option value="{{ $i }}" {{ $i == date('Y') ? 'selected' : '' }}>{{ $i }}</option>
|
||||
@endfor
|
||||
</select>
|
||||
<button class="btn btn-sm btn-primary" id="btnFilterYear">Filter</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="dashboard-fixed-container" class="row" style="width:1110px;height:770px;position:relative;margin:auto;">
|
||||
@component('components.circle', [
|
||||
'document_title' => 'Kekurangan Potensi',
|
||||
'document_color' => '#911701',
|
||||
|
||||
@@ -10,13 +10,16 @@
|
||||
|
||||
<x-toast-notification />
|
||||
<x-modal-confirmation buttonText="Delete" confirmationMessage="Are you sure you want to delete this?" />
|
||||
|
||||
<div class="row">
|
||||
<div class="card w-full">
|
||||
<div class="card-body">
|
||||
<div class="d-flex justify-content-end pb-3">
|
||||
<a href="{{ route('data-settings.create')}}" class="btn btn-success width-lg">Create</a>
|
||||
<div class="col-12">
|
||||
<div class="card w-100">
|
||||
<div class="card-body">
|
||||
<div class="d-flex flex-wrap justify-content-end align-items-center mb-2">
|
||||
<a href="{{ route('data-settings.create')}}" class="btn btn-success btn-sm d-block d-sm-inline w-auto">Create</a>
|
||||
</div>
|
||||
<div id="table-data-settings"></div>
|
||||
</div>
|
||||
<div id="table-data-settings"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -154,7 +154,7 @@
|
||||
</a>
|
||||
<div class="dropdown-menu dropdown-menu-end">
|
||||
<!-- item-->
|
||||
<h6 class="dropdown-header">Welcome!</h6>
|
||||
<h6 class="dropdown-header">{{ Auth::user()->email }}</h6>
|
||||
|
||||
<!-- <a class="dropdown-item" href="#">
|
||||
<iconify-icon icon="solar:user-outline"
|
||||
|
||||
@@ -9,12 +9,16 @@
|
||||
@include('layouts.partials/page-title', ['title' => 'Master', 'subtitle' => 'Users'])
|
||||
|
||||
<div class="row">
|
||||
<div class="card w-full">
|
||||
<div class="card-body">
|
||||
<div class="d-flex justify-content-end pb-3">
|
||||
<a href="{{ route('users.create')}}" class="btn btn-success width-lg">Create</a>
|
||||
<div class="col-12">
|
||||
<div class="card w-100">
|
||||
<div class="card-body">
|
||||
<div class="d-flex flex-wrap justify-content-end align-items-center mb-2">
|
||||
<a href="{{ route('users.create') }}" class="btn btn-success btn-sm d-block d-sm-inline w-auto">
|
||||
Create
|
||||
</a>
|
||||
</div>
|
||||
<div id="table-users"></div>
|
||||
</div>
|
||||
<div id="table-users"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -10,14 +10,17 @@
|
||||
|
||||
<x-toast-notification />
|
||||
<x-modal-confirmation buttonText="Delete" confirmationMessage="Are you sure you want to delete this?" />
|
||||
|
||||
<div class="row">
|
||||
<div class="card w-full">
|
||||
<div class="card-body">
|
||||
<div class="d-flex justify-content-end pb-3">
|
||||
<a href="{{ route('menus.create')}}" class="btn btn-success width-lg">Create</a>
|
||||
</div>
|
||||
<div>
|
||||
<div id="table-menus"></div>
|
||||
<div class="col-12">
|
||||
<div class="card w-100">
|
||||
<div class="card-body">
|
||||
<div class="d-flex flex-wrap justify-content-end align-items-center mb-2">
|
||||
<a href="{{ route('menus.create')}}" class="btn btn-success btn-sm d-block d-sm-inline w-auto">Create</a>
|
||||
</div>
|
||||
<div>
|
||||
<div id="table-menus"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -9,12 +9,14 @@
|
||||
@include('layouts.partials/page-title', ['title' => 'Data', 'subtitle' => 'PBG'])
|
||||
|
||||
<div class="row">
|
||||
<div class="card w-full">
|
||||
<div class="card-body">
|
||||
<div class="d-flex justify-content-end pb-3">
|
||||
<a href="{{ route('pbg-task.create')}}" class="btn btn-success width-lg">Create</a>
|
||||
<div class="col-12">
|
||||
<div class="card w-100">
|
||||
<div class="card-body">
|
||||
<div class="d-flex flex-wrap justify-content-end">
|
||||
<a href="{{ route('pbg-task.create')}}" class="btn btn-success btn-sm d-block d-sm-inline w-auto">Create</a>
|
||||
</div>
|
||||
<div id="table-pbg-tasks"></div>
|
||||
</div>
|
||||
<div id="table-pbg-tasks"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -8,235 +8,150 @@
|
||||
@include('layouts.partials/page-title', ['title' => 'Data', 'subtitle' => 'PBG'])
|
||||
|
||||
<div class="row">
|
||||
<div class="card">
|
||||
<div class="card-header">
|
||||
<ul class="nav nav-tabs nav-justified">
|
||||
<li class="nav-item">
|
||||
<a href="#pbgTask" data-bs-toggle="tab" aria-expanded="true" class="nav-link active">
|
||||
<span class="d-none d-sm-block">PBG Task</span>
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a href="#pbgTaskRetributions" data-bs-toggle="tab" aria-expanded="false"
|
||||
class="nav-link">
|
||||
<span class="d-none d-sm-block">PBG Task Retributions</span>
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a href="#pbgTaskIntegration" data-bs-toggle="tab" aria-expanded="false" class="nav-link">
|
||||
<span class="d-none d-sm-block">PBG Task Index Integrations</span>
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a href="#pbgTaskPrasarana" data-bs-toggle="tab" aria-expanded="false" class="nav-link">
|
||||
<span class="d-none d-sm-block">PBG Task Prasarana</span>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="tab-content">
|
||||
<div class="tab-pane active" id="pbgTask">
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
<div class="mb-3">
|
||||
<dt>Name</dt>
|
||||
<dd>{{$data->name}}</dd>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<dt>Owner Name</dt>
|
||||
<dd>{{$data->owner_name}}</dd>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<dt>Aplication Type Name</dt>
|
||||
<dd>{{$data->application_type_name}}</dd>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<dt>Condition</dt>
|
||||
<dd>{{$data->condition}}</dd>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<dt>Registration Number</dt>
|
||||
<dd>{{$data->registration_number}}</dd>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<dt>Document Number</dt>
|
||||
<dd>{{$data->document_number}}</dd>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<dt>Address</dt>
|
||||
<dd>{{$data->address}}</dd>
|
||||
</div>
|
||||
<div class="col-12">
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
<div class="mb-3">
|
||||
<dt>Name</dt>
|
||||
<dd>{{$data->name}}</dd>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<div class="mb-3">
|
||||
<dt>Status Name</dt>
|
||||
<dd>{{$data->status_name}}</dd>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<dt>SLF Status Name</dt>
|
||||
<dd>{{$data->slf_status_name}}</dd>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<dt>Function Type</dt>
|
||||
<dd>{{$data->function_type}}</dd>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<dt>Consultation Type</dt>
|
||||
<dd>{{$data->consultation_type}}</dd>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<dt>Due Date</dt>
|
||||
<dd>{{$data->due_date}}</dd>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<dt>Task Created At</dt>
|
||||
<dd>{{$data->task_created_at}}</dd>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<dt>Owner Name</dt>
|
||||
<dd>{{$data->owner_name}}</dd>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<dt>Aplication Type Name</dt>
|
||||
<dd>{{$data->application_type_name}}</dd>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<dt>Condition</dt>
|
||||
<dd>{{$data->condition}}</dd>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<dt>Registration Number</dt>
|
||||
<dd>{{$data->registration_number}}</dd>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<dt>Document Number</dt>
|
||||
<dd>{{$data->document_number}}</dd>
|
||||
</div>
|
||||
<div>
|
||||
<dt>Status Name</dt>
|
||||
<dd>{{$data->status_name}}</dd>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<div class="mb-3">
|
||||
<dt>Address</dt>
|
||||
<dd>{{$data->address}}</dd>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<dt>SLF Status Name</dt>
|
||||
<dd>{{$data->slf_status_name}}</dd>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<dt>Function Type</dt>
|
||||
<dd>{{$data->function_type}}</dd>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<dt>Consultation Type</dt>
|
||||
<dd>{{$data->consultation_type}}</dd>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<dt>Due Date</dt>
|
||||
<dd>{{$data->due_date}}</dd>
|
||||
</div>
|
||||
<div>
|
||||
<dt>Task Created At</dt>
|
||||
<dd>{{$data->task_created_at}}</dd>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="tab-pane" id="pbgTaskRetributions">
|
||||
@if ($data->pbg_task_retributions)
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
<div class="mb-3">
|
||||
<dt>Luas Bangunan</dt>
|
||||
<dd>{{$data->pbg_task_retributions->luas_bangunan}}</dd>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-12">
|
||||
<div class="card">
|
||||
<div class="card-header">
|
||||
<ul class="nav nav-tabs nav-justified">
|
||||
<li class="nav-item">
|
||||
<a href="#pbgTaskRetributions" data-bs-toggle="tab" aria-expanded="false"
|
||||
class="nav-link active">
|
||||
<span class="d-none d-sm-block">PBG Task Retributions</span>
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a href="#pbgTaskIntegration" data-bs-toggle="tab" aria-expanded="false" class="nav-link">
|
||||
<span class="d-none d-sm-block">PBG Task Index Integrations</span>
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a href="#pbgTaskPrasarana" data-bs-toggle="tab" aria-expanded="false" class="nav-link">
|
||||
<span class="d-none d-sm-block">PBG Task Prasarana</span>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="tab-content">
|
||||
<div class="tab-pane active" id="pbgTaskRetributions">
|
||||
@if ($data->pbg_task_retributions)
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
<div class="mb-3">
|
||||
<dt>Luas Bangunan</dt>
|
||||
<dd>{{$data->pbg_task_retributions->luas_bangunan}}</dd>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<dt>Indeks Lokalitas</dt>
|
||||
<dd>{{$data->pbg_task_retributions->indeks_lokalitas}}</dd>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<dt>Wilayah SHST</dt>
|
||||
<dd>{{$data->pbg_task_retributions->wilayah_shst}}</dd>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<dt>Kegiatan Name</dt>
|
||||
<dd>{{$data->pbg_task_retributions->kegiatan_name}}</dd>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<dt>Nilai SHST</dt>
|
||||
<dd>{{$data->pbg_task_retributions->nilai_shst}}</dd>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<dt>Indeks Integrasi</dt>
|
||||
<dd>{{$data->pbg_task_retributions->indeks_terintegrasi}}</dd>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<dt>Indeks Bg Terbangun</dt>
|
||||
<dd>{{$data->pbg_task_retributions->indeks_bg_terbangun}}</dd>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<dt>Indeks Lokalitas</dt>
|
||||
<dd>{{$data->pbg_task_retributions->indeks_lokalitas}}</dd>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<dt>Wilayah SHST</dt>
|
||||
<dd>{{$data->pbg_task_retributions->wilayah_shst}}</dd>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<dt>Kegiatan Name</dt>
|
||||
<dd>{{$data->pbg_task_retributions->kegiatan_name}}</dd>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<dt>Nilai SHST</dt>
|
||||
<dd>{{$data->pbg_task_retributions->nilai_shst}}</dd>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<dt>Indeks Integrasi</dt>
|
||||
<dd>{{$data->pbg_task_retributions->indeks_terintegrasi}}</dd>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<dt>Indeks Bg Terbangun</dt>
|
||||
<dd>{{$data->pbg_task_retributions->indeks_bg_terbangun}}</dd>
|
||||
<div class="col-md-6">
|
||||
<div class="mb-3">
|
||||
<dt>Nilai Retribusi Bangunan</dt>
|
||||
<dd>{{$data->pbg_task_retributions->nilai_retribusi_bangunan}}</dd>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<dt>Nilai Prasarana</dt>
|
||||
<dd>{{$data->pbg_task_retributions->nilai_prasarana}}</dd>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<dt>PBG Dokumen</dt>
|
||||
<dd>{{$data->pbg_task_retributions->pbg_document}}</dd>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<dt>Underpayment</dt>
|
||||
<dd>{{$data->pbg_task_retributions->underpayment}}</dd>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<dt>SKRD Amount</dt>
|
||||
<dd>{{$data->pbg_task_retributions->skrd_amount}}</dd>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<div class="mb-3">
|
||||
<dt>Nilai Retribusi Bangunan</dt>
|
||||
<dd>{{$data->pbg_task_retributions->nilai_retribusi_bangunan}}</dd>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<dt>Nilai Prasarana</dt>
|
||||
<dd>{{$data->pbg_task_retributions->nilai_prasarana}}</dd>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<dt>PBG Dokumen</dt>
|
||||
<dd>{{$data->pbg_task_retributions->pbg_document}}</dd>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<dt>Underpayment</dt>
|
||||
<dd>{{$data->pbg_task_retributions->underpayment}}</dd>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<dt>SKRD Amount</dt>
|
||||
<dd>{{$data->pbg_task_retributions->skrd_amount}}</dd>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@else
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
Data Not Available
|
||||
</div>
|
||||
</div>
|
||||
@endif
|
||||
</div>
|
||||
<div class="tab-pane" id="pbgTaskIntegration">
|
||||
@if ($data->pbg_task_index_integrations)
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
<div class="mb-3">
|
||||
<dt>Indeks Fungsi Bangunan</dt>
|
||||
<dd>{{$data->pbg_task_index_integrations->indeks_fungsi_bangunan}}</dd>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<dt>Indeks Parameter Kompleksitas</dt>
|
||||
<dd>{{$data->pbg_task_index_integrations->indeks_parameter_kompleksitas}}</dd>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<dt>Indeks Parameter Permanensi</dt>
|
||||
<dd>{{$data->pbg_task_index_integrations->indeks_parameter_permanensi}}</dd>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<dt>Indeks Paramter Ketinggian</dt>
|
||||
<dd>{{$data->pbg_task_index_integrations->indeks_parameter_ketinggian}}</dd>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<dt>Faktor Kepemilikan</dt>
|
||||
<dd>{{$data->pbg_task_index_integrations->faktor_kepemilikan}}</dd>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<dt>Indeks Terintegrasi</dt>
|
||||
<dd>{{$data->pbg_task_index_integrations->indeks_terintegrasi}}</dd>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<dt>Total</dt>
|
||||
<dd>{{$data->pbg_task_index_integrations->total}}</dd>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@else
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
Data Not Available
|
||||
</div>
|
||||
</div>
|
||||
@endif
|
||||
</div>
|
||||
<div class="tab-pane" id="pbgTaskPrasarana">
|
||||
<div class="row d-flex flex-warp gap-3 justify-content-center">
|
||||
@if ($data->pbg_task_retributions && $data->pbg_task_retributions->pbg_task_prasarana)
|
||||
@foreach ($data->pbg_task_retributions->pbg_task_prasarana as $prasarana)
|
||||
<div class="border p-3 rounded shadow-sm col-md-4">
|
||||
<div class="mb-3">
|
||||
<dt>Prasarana Type</dt>
|
||||
<dd>{{$prasarana->prasarana_type}}</dd>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<dt>Building Type</dt>
|
||||
<dd>{{$prasarana->building_type}}</dd>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<dt>Total</dt>
|
||||
<dd>{{$prasarana->total}}</dd>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<dt>Quantity</dt>
|
||||
<dd>{{$prasarana->quantity}}</dd>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<dt>Unit</dt>
|
||||
<dd>{{$prasarana->unit}}</dd>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<dt>Index Prasarana</dt>
|
||||
<dd>{{$prasarana->index_prasarana}}</dd>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<dt>Created At</dt>
|
||||
<dd>{{$prasarana->created_at}}</dd>
|
||||
</div>
|
||||
</div>
|
||||
@endforeach
|
||||
@else
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
@@ -245,6 +160,92 @@
|
||||
</div>
|
||||
@endif
|
||||
</div>
|
||||
<div class="tab-pane" id="pbgTaskIntegration">
|
||||
@if ($data->pbg_task_index_integrations)
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
<div class="mb-3">
|
||||
<dt>Indeks Fungsi Bangunan</dt>
|
||||
<dd>{{$data->pbg_task_index_integrations->indeks_fungsi_bangunan}}</dd>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<dt>Indeks Parameter Kompleksitas</dt>
|
||||
<dd>{{$data->pbg_task_index_integrations->indeks_parameter_kompleksitas}}</dd>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<dt>Indeks Parameter Permanensi</dt>
|
||||
<dd>{{$data->pbg_task_index_integrations->indeks_parameter_permanensi}}</dd>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<dt>Indeks Paramter Ketinggian</dt>
|
||||
<dd>{{$data->pbg_task_index_integrations->indeks_parameter_ketinggian}}</dd>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<dt>Faktor Kepemilikan</dt>
|
||||
<dd>{{$data->pbg_task_index_integrations->faktor_kepemilikan}}</dd>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<dt>Indeks Terintegrasi</dt>
|
||||
<dd>{{$data->pbg_task_index_integrations->indeks_terintegrasi}}</dd>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<dt>Total</dt>
|
||||
<dd>{{$data->pbg_task_index_integrations->total}}</dd>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@else
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
Data Not Available
|
||||
</div>
|
||||
</div>
|
||||
@endif
|
||||
</div>
|
||||
<div class="tab-pane" id="pbgTaskPrasarana">
|
||||
<div class="row d-flex flex-warp gap-3 justify-content-center">
|
||||
@if ($data->pbg_task_retributions && $data->pbg_task_retributions->pbg_task_prasarana)
|
||||
@foreach ($data->pbg_task_retributions->pbg_task_prasarana as $prasarana)
|
||||
<div class="border p-3 rounded shadow-sm col-md-4">
|
||||
<div class="mb-3">
|
||||
<dt>Prasarana Type</dt>
|
||||
<dd>{{$prasarana->prasarana_type}}</dd>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<dt>Building Type</dt>
|
||||
<dd>{{$prasarana->building_type}}</dd>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<dt>Total</dt>
|
||||
<dd>{{$prasarana->total}}</dd>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<dt>Quantity</dt>
|
||||
<dd>{{$prasarana->quantity}}</dd>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<dt>Unit</dt>
|
||||
<dd>{{$prasarana->unit}}</dd>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<dt>Index Prasarana</dt>
|
||||
<dd>{{$prasarana->index_prasarana}}</dd>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<dt>Created At</dt>
|
||||
<dd>{{$prasarana->created_at}}</dd>
|
||||
</div>
|
||||
</div>
|
||||
@endforeach
|
||||
@else
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
Data Not Available
|
||||
</div>
|
||||
</div>
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -12,12 +12,14 @@
|
||||
<x-modal-confirmation buttonText="Delete" confirmationMessage="Are you sure you want to delete this?" />
|
||||
|
||||
<div class="row">
|
||||
<div class="card w-full">
|
||||
<div class="card-body">
|
||||
<div class="d-flex justify-content-end pb-3">
|
||||
<a href="{{ route('roles.create')}}" class="btn btn-success width-lg">Create</a>
|
||||
<div class="col-12">
|
||||
<div class="card w-100">
|
||||
<div class="card-body">
|
||||
<div class="d-flex flex-wrap justify-content-end align-items-center mb-2">
|
||||
<a href="{{ route('roles.create')}}" class="btn btn-success btn-sm d-block d-sm-inline w-auto">Create</a>
|
||||
</div>
|
||||
<div id="table-roles"></div>
|
||||
</div>
|
||||
<div id="table-roles"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -9,14 +9,16 @@
|
||||
@include('layouts.partials/page-title', ['title' => 'Settings', 'subtitle' => 'Syncronize'])
|
||||
|
||||
<div class="row">
|
||||
<div class="card w-full">
|
||||
<div class="card-body">
|
||||
<div class="col-md-12 col-xl-12 d-flex justify-content-end">
|
||||
<button type="button" class="btn btn-success" style="margin-right: 20px;" id="btn-sync-submit-google-sheet">Sync Google Sheet</button>
|
||||
<button type="button" class="btn btn-success" id="btn-sync-submit">Sync SIMBG</button>
|
||||
</div>
|
||||
<div>
|
||||
<div id="table-import-datasources"></div>
|
||||
<div class="col-12">
|
||||
<div class="card w-100">
|
||||
<div class="card-body">
|
||||
<div class="d-flex flex-wrap justify-content-end gap-2">
|
||||
<button type="button" class="btn btn-success btn-sm d-block d-sm-inline w-auto" id="btn-sync-submit-google-sheet">Sync Google Sheet</button>
|
||||
<button type="button" class="btn btn-success btn-sm d-block d-sm-inline w-auto" id="btn-sync-submit">Sync SIMBG</button>
|
||||
</div>
|
||||
<div>
|
||||
<div id="table-import-datasources"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
966
sibedas.sql
Normal file
966
sibedas.sql
Normal file
File diff suppressed because one or more lines are too long
@@ -19,6 +19,7 @@ export default defineConfig({
|
||||
"resources/scss/icons.scss",
|
||||
"resources/scss/style.scss",
|
||||
"resources/scss/components/_circle.scss",
|
||||
"resources/scss/dashboards/_bigdata.scss",
|
||||
|
||||
"node_modules/quill/dist/quill.snow.css",
|
||||
"node_modules/quill/dist/quill.bubble.css",
|
||||
@@ -45,6 +46,7 @@ export default defineConfig({
|
||||
"resources/js/pages/maps-canada.js",
|
||||
"resources/js/data/advertisements/data-advertisements.js",
|
||||
"resources/js/data/advertisements/form-create-update.js",
|
||||
"resources/js/data/advertisements/form-upload.js",
|
||||
|
||||
//js-additional
|
||||
"resources/js/dashboards/bigdata.js",
|
||||
|
||||
Reference in New Issue
Block a user