Compare commits

..

7 Commits

Author SHA1 Message Date
arifal
d54edb7783 update 2025-06-02 2025-02-06 04:55:30 +07:00
arifal
4eac6ab83d Merge remote-tracking branch 'origin/dev' into feat/data-settings 2025-02-05 13:40:13 +07:00
arifal
604e0d8479 partial updates create service google sheet 2025-02-05 13:38:21 +07:00
Firman Herdiansyah
99e99fa2e6 Update Dashboard Layout 2025-02-05 13:36:33 +07:00
arifal
ff324014f6 partial update create crud pbg 2025-02-05 02:40:14 +07:00
arifal
7d06e12de8 create crud data settings 2025-02-04 21:49:10 +07:00
Firman Herdiansyah
f38d518f96 Init Dev 2025-02-04 19:53:59 +07:00
209 changed files with 5736 additions and 14307 deletions

View File

@@ -65,6 +65,5 @@ AWS_USE_PATH_STYLE_ENDPOINT=false
VITE_APP_NAME="${APP_NAME}"
SIMBG_HOST="xxxxxx"
SIMBG_EMAIL="xxxxxx"
SIMBG_PASSWORD="xxxxx"
API_KEY_GOOGLE="xxxxx"
SPREAD_SHEET_ID="xxxxx"

View File

@@ -1,212 +0,0 @@
<?php
namespace App\Http\Controllers\Api;
use App\Models\Advertisement;
use Illuminate\Http\Request;
use App\Http\Requests\AdvertisementRequest;
use Illuminate\Http\Response;
use App\Http\Controllers\Controller;
use App\Http\Resources\AdvertisementResource;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Validator;
use Maatwebsite\Excel\Facades\Excel;
use App\Imports\AdvertisementImport;
class AdvertisementController extends Controller
{
/**
* Display a listing of the resource.
*/
public function index(Request $request)
{
$perPage = $request->input('per_page', 15); // Default 15 jika tidak dikirim oleh client
$search = $request->input('search', ''); // Ambil parameter 'search' jika ada
// Query dasar untuk mengambil iklan
$query = Advertisement::query();
// Jika ada pencarian, filter berdasarkan kolom yang diinginkan
if ($search) {
$query->where(function ($q) use ($search) {
$q->where('business_name', 'like', "%$search%")
->orWhere('npwpd', 'like', "%$search%")
->orWhere('advertisement_content', 'like', "%$search%")
->orWhere('business_address', 'like', "%$search%")
->orWhere('advertisement_location', 'like', "%$search%")
->orWhereIn('village_code', function ($subQuery) use ($search) {
$subQuery->select('village_code')
->from('villages')
->where('village_name', 'like', "%$search%");
})
->orWhereIn('district_code', function ($subQuery) use ($search) {
$subQuery->select('district_code')
->from('districts')
->where('district_name', 'like', "%$search%");
});
});
}
$advertisements = $query->paginate($perPage);
$advertisements->getCollection()->transform(function ($advertisement) {
$village = DB::table('villages')->where('village_code', $advertisement->village_code)->first();
$advertisement->village_name = $village ? $village->village_name : null;
$district = DB::table('districts')->where('district_code', $advertisement->district_code)->first();
$advertisement->district_name = $district ? $district->district_name : null;
return $advertisement;
});
return response()->json([
'data' => AdvertisementResource::collection($advertisements),
'meta' => [
'total' => $advertisements->total(),
'per_page' => $advertisements->perPage(),
'current_page' => $advertisements->currentPage(),
'last_page' => $advertisements->lastPage(),
]
]);
}
/**
* Store a newly created resource in storage.
*/
public function store(AdvertisementRequest $request): Advertisement
{
$data = $request->validated();
// Cari district_code berdasarkan district_name
$district_code = DB::table('districts')->where('district_name', $data['district_name'])->value('district_code');
// Cari village_code berdasarkan village_name
$village_code = DB::table('villages')->where('village_name', $data['village_name'])->where('district_code', $district_code)->value('village_code');
// Tambahkan village_code dan district_code ke data
$data['village_code'] = $village_code;
$data['district_code'] = $district_code;
// Log data setelah transformasi
info($data);
return Advertisement::create($data);
}
/**
* Import advertisements from Excel or CSV.
*/
public function importFromFile(Request $request)
{
// Validasi file
info($request);
$validator = Validator::make($request->all(), [
'file' => 'required|mimes:xlsx,xls|max:10240', // Max 10MB
]);
if ($validator->fails()) {
return response()->json([
'message' => 'File validation failed.',
'errors' => $validator->errors()
], 400);
}
try {
// Ambil file dari request
$file = $request->file('file');
// Menggunakan Laravel Excel untuk mengimpor file
Excel::import(new AdvertisementImport, $file);
// Jika sukses, kembalikan respons sukses
return response()->json([
'message' => 'File uploaded and imported successfully!'
], 200);
} catch (\Exception $e) {
// Jika ada error, kembalikan error response
return response()->json([
'message' => 'Error during file import.',
'error' => $e->getMessage()
], 500);
}
}
/**
* Display the specified resource.
*/
public function show(Advertisement $advertisement): Advertisement
{
return $advertisement;
}
/**
* Update the specified resource in storage.
*/
public function update(AdvertisementRequest $request, Advertisement $advertisement): Advertisement
{
$data = $request->validated();
// Cari district_code berdasarkan district_name
$district_code = DB::table('districts')->where('district_name', $data['district_name'])->value('district_code');
// Cari village_code berdasarkan village_name
$village_code = DB::table('villages')->where('village_name', $data['village_name'])->where('district_code', $district_code)->value('village_code');
// Tambahkan village_code dan district_code ke data
$data['village_code'] = $village_code;
$data['district_code'] = $district_code;
// Log data setelah transformasi
info($data);
$advertisement->update($data);
return $advertisement;
}
public function destroy(Advertisement $advertisement): Response
{
$advertisement->delete();
return response()->noContent();
}
public function searchOptionsInAdvertisements(Request $request)
{
$query = $request->input('query');
$field = $request->input('field');
$district = $request->input('district'); // Ambil kecamatan jika ada
info("Query: $query, Field: $field, District: $district");
if ($field === 'district_name') {
$results = DB::table('districts')
->where('district_name', 'like', '%' . $query . '%')
->limit(10)
->get(['district_name AS name', 'district_code AS code']);
} elseif ($field === 'village_name' && $district) {
$results = DB::table('villages')
->where('village_name', 'like', '%' . $query . '%')
->whereExists(function ($query) use ($district) {
$query->select(DB::raw(1))
->from('districts')
->whereColumn('villages.district_code', 'districts.district_code')
->where('districts.district_name', $district);
})
->limit(10)
->get(['village_name AS name', 'village_code AS code']);
} else {
$results = collect();
}
return response()->json($results);
}
public function downloadExcelAdvertisement()
{
$filePath = storage_path('app/public/templateFile/template_reklame.xlsx');
// Cek apakah file ada
if (!file_exists($filePath)) {
return response()-> json(['message' => 'File tidak ditemukan!'], Response::HTTP_NOT_FOUND);
}
// Return file to download
return response()->download($filePath);
}
}

View File

@@ -12,42 +12,47 @@ class DashboardController extends Controller
use GlobalApiResponse;
public function businnessDocument(Request $request){
$businessData = DB::table('pbg_task')
->leftJoin('pbg_task_retributions', 'pbg_task.uuid', '=', 'pbg_task_retributions.pbg_task_uid')
->select(
DB::raw('COUNT(DISTINCT pbg_task.id) as task_count'),
DB::raw('SUM(pbg_task_retributions.nilai_retribusi_bangunan) as total_retribution')
)
$query = DB::table('pbg_task AS pt')
->leftJoin('pbg_task_google_sheet AS ptgs', 'pt.registration_number', '=', 'ptgs.no_registrasi')
->leftJoin('pbg_task_retributions AS ptr', 'pt.uuid', '=', 'ptr.pbg_task_uid') // Join ke pbg_task_retributions
->where(function ($query) {
$query->where("pbg_task.function_type", "LIKE", "sebagai tempat usaha%");
$query->whereRaw('LOWER(TRIM(ptgs.status_verifikasi)) != ?', [strtolower(trim('Selesai Verifikasi'))])
->orWhereNull('ptgs.status_verifikasi');
})
->where(function ($query) {
$query->whereRaw('LOWER(TRIM(pt.function_type)) = ?', [strtolower(trim('Sebagai Tempat Usaha'))]);
})
->selectRaw('COUNT(pt.id) AS total_data,
SUM(ptr.nilai_retribusi_bangunan) AS total_retribution') // Menambahkan SUM dari pbg_task_retributions
->first();
$taskCount = $businessData->task_count;
$taskTotal = $businessData->total_retribution;
$taskCount = $query->total_data;
$taskTotal = $query->total_retribution ?? 0;
$result = [
"count" => $taskCount,
"series" => [$taskCount],
"total" => $taskTotal
];
return $this->resSuccess($result);
}
public function nonBusinnessDocument(Request $request){
$businessData = DB::table('pbg_task')
->leftJoin('pbg_task_retributions', 'pbg_task.uuid', '=', 'pbg_task_retributions.pbg_task_uid')
->select(
DB::raw('COUNT(DISTINCT pbg_task.id) as task_count'),
DB::raw('SUM(pbg_task_retributions.nilai_retribusi_bangunan) as total_retribution')
)
$query = DB::table('pbg_task AS pt')
->leftJoin('pbg_task_google_sheet AS ptgs', 'pt.registration_number', '=', 'ptgs.no_registrasi')
->leftJoin('pbg_task_retributions AS ptr', 'pt.uuid', '=', 'ptr.pbg_task_uid') // Join ke pbg_task_retributions
->where(function ($query) {
$query->where("pbg_task.function_type", "NOT LIKE", "sebagai tempat usaha%")
->orWhereNull("pbg_task.function_type");
$query->whereRaw('LOWER(TRIM(ptgs.status_verifikasi)) != ?', [strtolower(trim('Selesai Verifikasi'))])
->orWhereNull('ptgs.status_verifikasi'); // Include NULL values
})
->where(function ($query) {
$query->whereRaw('LOWER(TRIM(pt.function_type)) != ?', [strtolower(trim('Sebagai Tempat Usaha'))])
->orWhereNull('pt.function_type'); // Include NULL values
})
->selectRaw('COUNT(pt.id) AS total_data,
SUM(ptr.nilai_retribusi_bangunan) AS total_retribution') // Menambahkan SUM dari pbg_task_retributions
->first();
$taskCount = $businessData->task_count;
$taskTotal = $businessData->total_retribution;
$taskCount = $query->total_data;
$taskTotal = $query->total_retribution ?? 0;
$result = [
"count" => $taskCount,
"series" => [$taskCount],
"total" => $taskTotal
];
return $this->resSuccess($result);
@@ -64,12 +69,54 @@ class DashboardController extends Controller
$taskTotal = $query->total_retribution;
$result = [
"count" => $taskCount,
"series" => [$taskCount],
"total" => $taskTotal
];
return $this->resSuccess($result);
}
public function verificationDocuments(){
$query = DB::table('pbg_task AS pt')
->leftJoin('pbg_task_google_sheet AS ptgs', 'pt.registration_number', '=', 'ptgs.no_registrasi')
->leftJoin('pbg_task_retributions AS ptr', 'pt.uuid', '=', 'ptr.pbg_task_uid') // Menambahkan join ke pbg_task_retributions
->whereRaw('LOWER(TRIM(ptgs.status_verifikasi)) = ?', [strtolower(trim('Selesai Verifikasi'))])
->selectRaw('COUNT(pt.id) AS total_data,
SUM(ptr.nilai_retribusi_bangunan) AS total_retribution')
->first();
$taskCount = $query->total_data;
$taskTotal = $query->total_retribution;
$result = [
"count"=> $taskCount,
"total"=> $taskTotal
];
return $this->resSuccess($result);
}
public function nonVerificationDocuments(){
$query = DB::table('pbg_task AS pt')
->leftJoin('pbg_task_google_sheet AS ptgs', 'pt.registration_number', '=', 'ptgs.no_registrasi')
->leftJoin('pbg_task_retributions AS ptr', 'pt.uuid', '=', 'ptr.pbg_task_uid') // Join tabel pbg_task_retributions
->where(function ($query) {
$query->whereRaw('LOWER(TRIM(ptgs.status_verifikasi)) != ?', [strtolower(trim('Selesai Verifikasi'))])
->orWhereNull('ptgs.status_verifikasi'); // Include NULL values
})
->selectRaw('COUNT(pt.id) AS total_data,
SUM(ptr.nilai_retribusi_bangunan) AS total_retribution') // Menambahkan SUM dari pbg_task_retributions
->first();
$taskCount = $query->total_data;
$taskTotal = $query->total_retribution ?? 0;
$result = [
"count"=> $taskCount,
"total"=> $taskTotal
];
return $this->resSuccess($result);
}
public function pbgTaskDocuments(Request $request){
$request->validate([
'status' => 'required|string'

View File

@@ -0,0 +1,104 @@
<?php
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use App\Http\Requests\DataSettingRequest;
use App\Http\Resources\DataSettingResource;
use App\Models\DataSetting;
use App\Traits\GlobalApiResponse;
use Exception;
use Illuminate\Http\Request;
class DataSettingController extends Controller
{
use GlobalApiResponse;
/**
* Display a listing of the resource.
*/
public function index(Request $request)
{
try {
$query = DataSetting::query()->orderBy('id', 'desc');
if ($request->has("search") && !empty($request->get("search"))) {
$query = $query->where("key", $request->get("search"));
}
return DataSettingResource::collection($query->paginate());
} catch (Exception $e) {
return $this->resError($e->getMessage(), $e->getTrace());
}
}
/**
* Store a newly created resource in storage.
*/
public function store(DataSettingRequest $request)
{
try {
$data = DataSetting::create($request->validated());
$result = [
"success" => true,
"message" => "Data Setting created successfully",
"data" => new DataSettingResource($data)
];
return $this->resSuccess($result);
} catch (Exception $e) {
return $this->resError($e->getMessage(), $e);
}
}
/**
* Display the specified resource.
*/
public function show(string $id)
{
try {
$setting = DataSetting::findOrFail($id);
$result = [
"setting" => true,
"message" => "Data setting successfully",
"data" => new DataSettingResource($setting)
];
return $this->resSuccess($result);
} catch (Exception $e) {
return $this->resError($e->getMessage());
}
}
/**
* Update the specified resource in storage.
*/
public function update(DataSettingRequest $request, string $id)
{
try {
$data = DataSetting::findOrFail($id);
$data->update($request->validated());
$result = [
"success" => true,
"message" => "Data Setting updated successfully"
];
return $this->resSuccess($result);
} catch (Exception $e) {
return $this->resError($e->getMessage());
}
}
/**
* Remove the specified resource from storage.
*/
public function destroy(string $id)
{
try {
$setting = DataSetting::findOrFail($id);
$setting->delete();
$result = [
"success" => true,
"message" => "Data Setting deleted successfully"
];
return $this->resSuccess($result);
} catch (Exception $e) {
return $this->resError($e->getMessage());
}
}
}

View File

@@ -0,0 +1,61 @@
<?php
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use App\Services\GoogleSheetService;
use Illuminate\Http\Request;
class GoogleSheetController extends Controller
{
protected $googleSheetService;
public function __construct(GoogleSheetService $googleSheetService){
$this->googleSheetService = $googleSheetService;
}
/**
* Display a listing of the resource.
*/
public function index()
{
$dataCollection = $this->googleSheetService->getSheetDataCollection();
$result = [
"last_row" => $this->googleSheetService->getLastRowByColumn("C"),
"last_column" => $this->googleSheetService->getLastColumn(),
"header" => $this->googleSheetService->getHeader(),
"data_collection" => $dataCollection
];
return response()->json($result);
}
/**
* Store a newly created resource in storage.
*/
public function store(Request $request)
{
//
}
/**
* Display the specified resource.
*/
public function show(string $id)
{
//
}
/**
* Update the specified resource in storage.
*/
public function update(Request $request, string $id)
{
//
}
/**
* Remove the specified resource from storage.
*/
public function destroy(string $id)
{
//
}
}

View File

@@ -0,0 +1,291 @@
<?php
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use App\Http\Requests\PbgTaskMultiStepRequest;
use App\Models\PbgTask;
use App\Models\PbgTaskGoogleSheet;
use App\Services\GoogleSheetService;
use Carbon\Carbon;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
class PbgTaskController extends Controller
{
protected $googleSheetService;
public function __construct(GoogleSheetService $googleSheetService){
$this->googleSheetService = $googleSheetService;
}
public function index()
{
//
}
/**
* Store a newly created resource in storage.
*/
public function store(PbgTaskMultiStepRequest $request)
{
try {
$data = PbgTask::create([
"uuid" => $request->input("step1Form.uuid"),
"name" => $request->input("step1Form.name"),
"owner_name" => $request->input("step1Form.owner_name"),
"application_type" => $request->input("step1Form.application_type"),
"application_type_name" => $request->input("step1Form.application_type_name"),
"condition" => $request->input("step1Form.condition"),
"registration_number" => $request->input("step1Form.registration_number"),
"document_number" => $request->input("step1Form.document_number"),
"address" => $request->input("step1Form.address"),
"status" => $request->input("step1Form.status"),
"status_name" => $request->input("step1Form.status_name"),
"slf_status" => $request->input("step1Form.slf_status"),
"slf_status_name" => $request->input("step1Form.slf_status_name"),
"function_type" => $request->input("step1Form.function_type"),
"consultation_type" => $request->input("step1Form.consultation_type"),
"due_date" => $request->input("step1Form.due_date"),
"land_certificate_phase" => $request->input("step1Form.land_certificate_phase"),
"task_created_at" => $request->input("step1Form.task_created_at"),
]);
return response()->json([
"success" => true,
"message" => "Step 1 berhasil disimpan!",
"data" => $data
], 201);
} catch (\Exception $e) {
return response()->json([
"success" => false,
"message" => "Gagal menyimpan data",
"error" => $e->getMessage()
], 500);
}
}
/**
* Display the specified resource.
*/
public function show(string $id)
{
//
}
/**
* Update the specified resource in storage.
*/
public function update(Request $request, string $id)
{
//
}
/**
* Remove the specified resource from storage.
*/
public function destroy(string $id)
{
//
}
protected function validatePbgTask(Request $request){
return $request->validate([
"uuid" => $request->input("step1Form.uuid"),
]);
}
public function syncPbgFromGoogleSheet(){
try{
$totalRowCount = $this->googleSheetService->getLastRowByColumn("C");
$sheetData = $this->googleSheetService->getSheetDataCollection($totalRowCount);
$mapToUpsert = [];
$count = 0;
foreach($sheetData as $data){
$mapToUpsert[] =
[
'no_registrasi' => $data['no__registrasi'] ?? null,
'jenis_konsultasi' => $data['jenis_konsultasi'] ?? null,
'fungsi_bg' => $data['fungsi_bg'] ?? null,
'tgl_permohonan' => $this->convertToDate($data['tgl_permohonan']),
'status_verifikasi' => $data['status_verifikasi'] ?? null,
'status_permohonan' => $this->convertToDate($data['status_permohonan']),
'alamat_pemilik' => $data['alamat_pemilik'] ?? null,
'no_hp' => $data['no__hp'] ?? null,
'email' => $data['e_mail'] ?? null,
'tanggal_catatan' => $this->convertToDate($data['tanggal_catatan']),
'catatan_kekurangan_dokumen' => $data['catatan_kekurangan_dokumen'] ?? null,
'gambar' => $data['gambar'] ?? null,
'krk_kkpr' => $data['krk_kkpr'] ?? null,
'no_krk' => $data['no__krk'] ?? null,
'lh' => $data['lh'] ?? null,
'ska' => $data['ska'] ?? null,
'keterangan' => $data['keterangan'] ?? null,
'helpdesk' => $data['helpdesk'] ?? null,
'pj' => $data['pj'] ?? null,
'kepemilikan' => $data['kepemilikan'] ?? null,
'potensi_taru' => $data['potensi_taru'] ?? null,
'validasi_dinas' => $data['validasi_dinas'] ?? null,
'kategori_retribusi' => $data['kategori_retribusi'] ?? null,
'no_urut_ba_tpt' => $data['no__urut_ba_tpt__2024_0001_'] ?? null,
'tanggal_ba_tpt' => $this->convertToDate($data['tanggal_ba_tpt']),
'no_urut_ba_tpa' => $data['no__urut_ba_tpa'] ?? null,
'tanggal_ba_tpa' => $this->convertToDate($data['tanggal_ba_tpa']),
'no_urut_skrd' => $data['no__urut_skrd__2024_0001_'] ?? null,
'tanggal_skrd' => $this->convertToDate($data['tanggal_skrd']),
'ptsp' => $data['ptsp'] ?? null,
'selesai_terbit' => $data['selesai_terbit'] ?? null,
'tanggal_pembayaran' => $this->convertToDate($data['tanggal_pembayaran__yyyy_mm_dd_']),
'format_sts' => $data['format_sts'] ?? null,
'tahun_terbit' => (int) $data['tahun_terbit'] ?? null,
'tahun_berjalan' => (int) $data['tahun_berjalan'] ?? null,
'kelurahan' => $data['kelurahan'] ?? null,
'kecamatan' => $data['kecamatan'] ?? null,
'lb' => $this->convertToDecimal($data['lb']) ?? null,
'tb' => $this->convertToDecimal($data['tb']) ?? null,
'jlb' => (int) $data['jlb'] ?? null,
'unit' => (int) $data['unit'] ?? null,
'usulan_retribusi' => (int) $data['usulan_retribusi'] ?? null,
'nilai_retribusi_keseluruhan_simbg' => $this->convertToDecimal($data['nilai_retribusi_keseluruhan__simbg_']) ?? null,
'nilai_retribusi_keseluruhan_pad' => $this->convertToDecimal($data['nilai_retribusi_keseluruhan__pad_']) ?? null,
'denda' => $this->convertToDecimal($data['denda']) ?? null,
'latitude' => $data['latitude'] ?? null,
'longitude' => $data['longitude'] ?? null,
'nik_nib' => $data['nik_nib'] ?? null,
'dok_tanah' => $data['dok__tanah'] ?? null,
'temuan' => $data['temuan'] ?? null,
];
}
DB::beginTransaction();
$batchSize = 1000;
$chunks = array_chunk($mapToUpsert, $batchSize);
foreach($chunks as $chunk){
PbgTaskGoogleSheet::upsert($chunk, ["no_registrasi"],[
'jenis_konsultasi',
'nama_pemilik',
'lokasi_bg',
'fungsi_bg',
'nama_bangunan',
'tgl_permohonan',
'status_verifikasi',
'status_permohonan',
'alamat_pemilik',
'no_hp',
'email',
'tanggal_catatan',
'catatan_kekurangan_dokumen',
'gambar',
'krk_kkpr',
'no_krk',
'lh',
'ska',
'keterangan',
'helpdesk',
'pj',
'kepemilikan',
'potensi_taru',
'validasi_dinas',
'kategori_retribusi',
'no_urut_ba_tpt',
'tanggal_ba_tpt',
'no_urut_ba_tpa',
'tanggal_ba_tpa',
'no_urut_skrd',
'tanggal_skrd',
'ptsp',
'selesai_terbit',
'tanggal_pembayaran',
'format_sts',
'tahun_terbit',
'tahun_berjalan',
'kelurahan',
'kecamatan',
'lb',
'tb',
'jlb',
'unit',
'usulan_retribusi',
'nilai_retribusi_keseluruhan_simbg',
'nilai_retribusi_keseluruhan_pad',
'denda',
'latitude',
'longitude',
'nik_nib',
'dok_tanah',
'temuan',
]);
}
DB::commit();
return response()->json([
"success" => true,
"message" => "Data berhasil disimpan ke database"
], 200);
}catch(\Exception $ex){
DB::rollBack();
return response()->json([
"success" => false,
"message" => "Gagal menyimpan data",
"error" => $ex->getMessage()
], 500);
}
}
protected function convertToDecimal(?string $value): ?float
{
if (empty($value)) {
return null; // Return null if the input is empty
}
// Remove all non-numeric characters except comma and dot
$value = preg_replace('/[^0-9,\.]/', '', $value);
// If the number contains both dot (.) and comma (,)
if (strpos($value, '.') !== false && strpos($value, ',') !== false) {
$value = str_replace('.', '', $value); // Remove thousands separator
$value = str_replace(',', '.', $value); // Convert decimal separator to dot
}
// If only a dot is present (assumed as thousands separator)
elseif (strpos($value, '.') !== false) {
$value = str_replace('.', '', $value); // Remove all dots (treat as thousands separators)
}
// If only a comma is present (assumed as decimal separator)
elseif (strpos($value, ',') !== false) {
$value = str_replace(',', '.', $value); // Convert comma to dot (decimal separator)
}
// Ensure the value is numeric before returning
return is_numeric($value) ? (float) number_format((float) $value, 2, '.', '') : null;
}
protected function convertToInteger($value) {
// Check if the value is an empty string, and return null if true
if (trim($value) === "") {
return null;
}
// Otherwise, cast to integer
return (int) $value;
}
protected function convertToDate($dateString)
{
try {
// Check if the string is empty
if (empty($dateString)) {
return null;
}
// Try to parse the date string
$date = Carbon::parse($dateString);
// Return the Carbon instance
return $date->format('Y-m-d');
} catch (\Exception $e) {
// Return null if an error occurs during parsing
return null;
}
}
}

View File

@@ -14,9 +14,10 @@ class RequestAssignmentController extends Controller
*/
public function index(Request $request)
{
$query = PbgTask::query();
$query = PbgTask::query()->orderBy('id', 'desc');
if($request->has('search') && !empty($request->get("search"))){
$query->where('name', 'LIKE', '%'.$request->get('search').'%');
$query->where('name', 'LIKE', '%'.$request->get('search').'%')
->orWhere('registration_number', 'LIKE', '%'.$request->get('search').'%');
}
return RequestAssignmentResouce::collection($query->paginate());
}

View File

@@ -1,117 +0,0 @@
<?php
namespace App\Http\Controllers\Api;
use App\Models\Tourism;
use Illuminate\Http\Request;
use App\Http\Requests\TourismRequest;
use Illuminate\Http\Response;
use App\Http\Controllers\Controller;
use App\Http\Resources\TourismResource;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Validator;
use Maatwebsite\Excel\Facades\Excel;
use App\Imports\TourismImport;
use Illuminate\Support\Facades\Storage;
class TourismController extends Controller
{
/**
* Display a listing of the resource.
*/
public function index(Request $request)
{
info($request);
$perPage = $request->input('per_page', 15);
$search = $request->input('search', '');
$query = Tourism::query();
$tourisms = $query->paginate($perPage);
$tourisms->getCollection()->transform(function ($tourisms) {
$village = DB::table('villages')->where('village_code', $tourisms->village_code)->first();
$tourisms->village_name = $village ? $village->village_name : null;
$district = DB::table('districts')->where('district_code', $tourisms->district_code)->first();
$tourisms->district_name = $district ? $district->district_name : null;
$business_type = DB::table('business_type')->where('id', $tourisms->business_type_id)->first();
$tourisms->business_type = $business_type ? $business_type->business_type : null;
return $tourisms;
});
return response()->json([
'data' => TourismResource::collection($tourisms),
'meta' => [
'total' => $tourisms->total(),
'per_page' => $tourisms->perPage(),
'current_page' => $tourisms->currentPage(),
'last_page' => $tourisms->lastPage(),
]
]);
}
/**
* Store a newly created resource in storage.
*/
public function store(TourismRequest $request): Tourism
{
return Tourism::create($request->validated());
}
/**
* Import advertisements from Excel or CSV
*/
public function importFromFile(Request $request)
{
//Validasi file
$validator = Validator::make($request->all(), [
'file' => 'required|mimes:xlsx, xls|max:10240'
]);
if ($validator->fails()) {
return response()->json([
'message' => 'File validation failed.',
'errors' => $validator->errors()
], 400);
}
try {
$file = $request->file('file');
Excel::import(new TourismImport, $file);
return response()->json([
'message' => 'File uploaded and imported successfully!'
], 200);
} catch (\Exception $e) {
return response()->json([
'message' => 'Error during file import.',
'error' => $e->getMessage()
], 500);
}
}
/**
* Display the specified resource.
*/
public function show(Tourism $tourism): Tourism
{
return $tourism;
}
/**
* Update the specified resource in storage.
*/
public function update(TourismRequest $request, Tourism $tourism): Tourism
{
$tourism->update($request->validated());
return $tourism;
}
public function destroy(Tourism $tourism): Response
{
$tourism->delete();
return response()->noContent();
}
}

View File

@@ -1,189 +0,0 @@
<?php
namespace App\Http\Controllers\Api;
use App\Models\Umkm;
use Illuminate\Http\Request;
use App\Http\Requests\UmkmRequest;
use Illuminate\Http\Response;
use App\Http\Controllers\Controller;
use App\Http\Resources\UmkmResource;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Validator;
use Maatwebsite\Excel\Facades\Excel;
use App\Imports\UmkmImport;
use Illuminate\Support\Facades\Storage;
class UmkmController extends Controller
{
/**
* Display a listing of the resource.
*/
public function index(Request $request)
{
info($request);
$perPage = $request->input('per_page', 15);
$search = $request->input('search', '');
$query = Umkm::query();
$umkm = $query->paginate($perPage);
$umkm->getCollection()->transform(function ($umkm) {
$village = DB::table('villages')->where('village_code', $umkm->village_code)->first();
$umkm->village_name = $village ? $village->village_name : null;
$district = DB::table('districts')->where('district_code', $umkm->district_code)->first();
$umkm->district_name = $district ? $district->district_name : null;
$business_scale = DB::table('business_scale')->where('id', $umkm->business_scale_id)->first();
$umkm->business_scale = $business_scale ? $business_scale->business_scale : null;
$permit_status = DB::table('permit_status')->where('id', $umkm->permit_status_id)->first();
$umkm->permit_status = $permit_status ? $permit_status->permit_status : null;
$business_form = DB::table('business_form')->where('id', $umkm->business_form_id)->first();
$umkm->business_form = $business_form ? $business_form->business_form : null;
return $umkm;
});
return response()->json([
'data' => UmkmResource::collection($umkm),
'meta' => [
'total' => $umkm->total(),
'per_page' => $umkm->perPage(),
'current_page' => $umkm->currentPage(),
'last_page' => $umkm->lastPage(),
]
]);
}
/**
* Store a newly created resource in storage.
*/
public function store(UmkmRequest $request): Umkm
{
info($request);
$data = $request->validated();
// Cari kode berdasarkan nama
$district_code = DB::table('districts')->where('district_name', $data['district_name'])->value('district_code');
$village_code = DB::table('villages')->where('village_name', $data['village_name'])->where('district_code', $district_code)->value('village_code');
$business_scale_id = DB::table('business_scale')->where('id', $data['business_scale'])->value('id');
$permit_status_id = DB::table('permit_status')->where('id', $data['permit_status'])->value('id');
$business_form_id = DB::table('business_form')->where('id', $data['business_form'])->value('id');
info($business_scale_id);
// Update data dengan kode yang ditemukan
$data['village_code'] = $village_code;
$data['district_code'] = $district_code;
$data['land_area'] = (double) $request['land_area'];
$data['business_scale_id'] = (int) $business_scale_id;
$data['permit_status_id'] = (int) $permit_status_id;
$data['business_form_id'] = (int) $business_form_id;
info($data);
// Simpan ke database
return Umkm::create($data);
}
/**
* Import advertisements from Excel or CSV.
*/
public function importFromFile(Request $request)
{
// Validasi file
$validator = Validator::make($request->all(), [
'file' => 'required|mimes:xlsx, xls|max:10240',
]);
if ($validator->fails()) {
return response()->json([
'message' => 'File validation failed.',
'errors' => $validator->errors()
], 400);
}
try {
// Ambil file dari request
$file = $request->file('file');
// Menggunakan Laravel Excel untuk mengimpor file
Excel::import(new UmkmImport, $file);
// Jika sukses, kembalikan response sukses
return response()->json([
'message' => 'File uploaded and imported successfully!'
], 200);
} catch (\Exception $e) {
return response()->json([
'message' => 'Error during file import.',
'error' => $e->getMessage()
], 500);
}
}
/**
* Display the specified resource.
*/
public function show(Umkm $umkm): Umkm
{
return $umkm;
}
/**
* Update the specified resource in storage.
*/
public function update(UmkmRequest $request, Umkm $umkm): Umkm
{
info($request);
$data = $request->validated();
// Cari district_code berdasarkan district_name
$district_code = DB::table('districts')->where('district_name', $data['district_name'])->value('district_code');
// Cari village_code berdasarkan village_name
$village_code = DB::table('villages')->where('village_name', $data['village_name'])->where('district_code', $district_code)->value('village_code');
$business_scale_id = DB::table('business_scale')->where('id', $data['business_scale_id'])->value('id');
$permit_status_id = DB::table('permit_status')->where('id', $data['permit_status_id'])->value('id');
$business_form_id = DB::table('business_form')->where('id', $data['business_form_id'])->value('id');
// Tambahkan village_code dan district_code ke data
$data['village_code'] = $village_code;
$data['district_code'] = $district_code;
$data['land_area'] = (double) $request['land_area'];
$data['business_scale_id'] = (int) $business_scale_id;
$data['permit_status_id'] = (int) $permit_status_id;
$data['business_form_id'] = (int) $business_form_id;
// Log data setelah transformasi
info($data);
$umkm->update($data);
return $umkm;
}
public function destroy(Umkm $umkm): Response
{
$umkm->delete();
return response()->noContent();
}
public function downloadExcelUmkm()
{
$filePath = storage_path('app/public/templateFile/template_umkm.xlsx');
// Cek apakah file ada
if (!file_exists($filePath)) {
return response()-> json(['message' => 'File tidak ditemukan!'], Response::HTTP_NOT_FOUND);
}
// Return file to download
return response()->download($filePath);
}
}

View File

@@ -1,135 +0,0 @@
<?php
namespace App\Http\Controllers\Data;
use App\Http\Controllers\Controller;
use App\Models\Advertisement;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
class AdvertisementController extends Controller
{
/**
* Display a listing of the resource.
*/
public function index()
{
return view('data.advertisements.index');
}
/**
* Show the form for uploading a file.
*/
public function bulkCreate()
{
// Mengembalikan view form-upload
return view('data.advertisements.form-upload');
}
/**
* Show the form for creating a new resource.
*/
public function create()
{
$title = 'Advertisement';
$subtitle = 'Create Data';
// Mengambil data untuk dropdown
$dropdownOptions = [
'village_name' => DB::table('villages')->orderBy('village_name')->pluck('village_name', 'village_code'),
'district_name' => DB::table('districts')->orderBy('district_name')->pluck('district_name', 'district_code'),
];
$fields = $this->getFields();
$fieldTypes = $this->getFieldTypes();
$apiUrl = url('/api/advertisements');
// $route = 'advertisements.create';
// info("AdvertisementController@edit diakses dengan ID: $title");
return view('data.advertisements.form', compact('title', 'subtitle', 'fields', 'fieldTypes', 'apiUrl', 'dropdownOptions'));
}
/**
* Show the form for editing the specified resource.
*/
public function edit($id)
{
info("AdvertisementController@edit diakses dengan ID: $id");
$title = 'Advertisement';
$subtitle = 'Update Data';
$modelInstance = Advertisement::find($id);
// Pastikan model ditemukan
if (!$modelInstance) {
info("AdvertisementController@edit: Model tidak ditemukan.");
return redirect()->route('advertisements.index')->with('error', 'Advertisement not found');
}
// Mengambil dan memetakan village_name dan district_name
$village = DB::table('villages')->where('village_code', $modelInstance->village_code)->first();
$modelInstance->village_name = $village ? $village->village_name : null;
$district = DB::table('districts')->where('district_code', $modelInstance->district_code)->first();
$modelInstance->district_name = $district ? $district->district_name : null;
// Mengambil data untuk dropdown
$dropdownOptions = [
'village_name' => DB::table('villages')->orderBy('village_name')->pluck('village_name', 'village_code'),
'district_name' => DB::table('districts')->orderBy('district_name')->pluck('district_name', 'district_code'),
];
info("AdvertisementController@edit diakses dengan Model Instance: $modelInstance");
$fields = $this->getFields();
$fieldTypes = $this->getFieldTypes();
$apiUrl = url('/api/advertisements');
// $route = 'advertisements.update'; // Menggunakan route update untuk form edit
// info("AdvertisementController@edit diakses dengan route: $route");
return view('data.advertisements.form', compact('title', 'subtitle', 'modelInstance', 'fields', 'fieldTypes', 'apiUrl', 'dropdownOptions'));
}
private function getFields()
{
return [
"no" => "No",
"business_name" => "Nama Wajib Pajak",
"npwpd" => "NPWPD",
"advertisement_type" => "Jenis Reklame",
"advertisement_content" => "Isi Reklame",
"business_address" => "Alamat Wajib Pajak",
"advertisement_location" => "Lokasi Reklame",
"district_name" => "Kecamatan",
"village_name" => "Desa",
"length" => "Panjang",
"width" => "Lebar",
"viewing_angle" => "Sudut Pandang",
"face" => "Muka",
"area" => "Luas",
"angle" => "Sudut",
"contact" => "Kontak",
];
}
private function getFieldTypes()
{
return [
"no" => "text",
"business_name" => "text",
"npwpd" => "text",
"advertisement_type" => "text",
"advertisement_content" => "textarea",
"business_address" => "text",
"advertisement_location" => "text",
"village_name" => "combobox",
"district_name" => "combobox",
"length" => "text",
"width" => "text",
"viewing_angle" => "text",
"face" => "text",
"area" => "text",
"angle" => "text",
"contact" => "text",
];
}
}

View File

@@ -1,118 +0,0 @@
<?php
namespace App\Http\Controllers\Data;
use App\Http\Controllers\Controller;
use App\Models\Tourism;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
class TourismController extends Controller
{
/**
* Display a listing of the resource
*/
public function index()
{
return view('data.tourisms.index');
}
/**
* show the form for creating a new rsource.
*/
public function bulkCreate()
{
return view('data.tourisms.form-upload');
}
/**
* Show th form for creating a new resource
*/
public function create()
{
$title = 'Pariwisata';
$subtitle = 'Create Data';
// Mengambil data untuk dropdown
$dropdownOptions = [
'village_name' => DB::table('villages')->orderBy('village_name')->pluck('village_name', 'village_code'),
'district_name' => DB::table('districts')->orderBy('district_name')->pluck('district_name', 'district_code'),
'business_type_id' => DB::table('business_type')->orderBy('business_type')->pluck('business_type', 'id'),
];
$fields = $this->getFields();
$fieldTypes = $this->getFieldTypes();
$apiUrl = url('/api/tourisms');
return view('data.tourisms.form', compact('title', 'subtitle', 'fields', 'fieldTypes', 'apiUrl', 'dropdownOptions'));
}
/**
* show the form for editing the specified resource.
*/
public function edit($id)
{
$title = 'Pariwisata';
$subtitle = 'Create Data';
$modelInstance = Tourism::find($id);
// Pastikan model ditemukan
if (!$modelInstance) {
return redirect()->route('tourisms.index') ->with('error', 'Pariwisata tidak ditemukan');
}
// Mengambil dan memetakan village_name dan district_name
$village = DB::table('villages')->where('village_code', $modelInstance->village_code)->first();
$modelInstance->village_name = $village ? $village->village_name : null;
$district = DB::table('districts')->where('district_code', $modelInstance->district_code)->first();
$modelInstance->district_name = $district ? $district->district_name : null;
$business_type = DB::table('business_type')->where('id', $modelInstance->business_type_id)->first();
$modelInstance->business_scale_id = $business_type ? $business_type->id : null;
$dropdownOptions = [
'village_name' => DB::table('villages')->orderBy('village_name')->pluck('village_name', 'village_code'),
'district_name' => DB::table('districts')->orderBy('district_name')->pluck('district_name', 'district_code'),
'business_type_id' => DB::table('business_type')->orderBy('business_type')->pluck('business_type', 'id'),
];
$fields = $this->getFields();
$fieldTypes = $this->getFieldTypes();
$apiUrl = url('/api/tourisms');
return view('data.tourisms.form', compact('title', 'subtitle', 'modelInstance', 'fields', 'fieldTypes', 'apiUrl', 'dropdownOptions'));
}
private function getFields()
{
return [
"business_name" => "Nama Usaha",
"project_name" => "Nama Project",
"business_address" => "Alamat Usaha",
"district_name" => "Kecamatan",
"village_name" => "Desa",
"land_area" => "Luas Tanah",
"investment_amount" => "Jumlah Investasi",
"number_of_employee" => "TKI",
"business_type_id" => "Jenis Usaha",
];
}
private function getFieldTypes()
{
return [
"business_name" => "text",
"project_name" => "text",
"business_address" => "textarea",
"district_name" => "combobox",
"village_name" => "combobox",
"land_area" => "text",
"investment_amount" => "text",
"number_of_employee" => "text",
"business_type_id" => "select",
];
}
}

View File

@@ -1,149 +0,0 @@
<?php
namespace App\Http\Controllers\Data;
use App\Http\Controllers\Controller;
use App\Models\Umkm;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
class UmkmController extends Controller
{
/**
* Display a listing of the resource.
*/
public function index()
{
return view('data.umkm.index');
}
/**
* Show the form for creating a new resource.
*/
public function bulkCreate()
{
return view('data.umkm.form-upload');
}
/**
* Show the form for creating a new resource.
*/
public function create()
{
$title = 'UMKM';
$subtitle = 'Create Data';
// Mengambil data untuk dropdown
$dropdownOptions = [
'village_name' => DB::table('villages')->orderBy('village_name')->pluck('village_name', 'village_code'),
'district_name' => DB::table('districts')->orderBy('district_name')->pluck('district_name', 'district_code'),
'business_scale_id' => DB::table('business_scale')->orderBy('business_scale')->pluck('business_scale', 'id'),
'permit_status_id' => DB::table('permit_status')->orderBy('permit_status')->pluck('permit_status', 'id'),
'business_form_id' => DB::table('business_form')->orderBy('business_form')->pluck('business_form', 'id')
];
$fields = $this->getFields();
$fieldTypes = $this->getFieldTypes();
$apiUrl = url('/api/umkm');
return view('data.umkm.form', compact('title', 'subtitle', 'fields', 'fieldTypes', 'apiUrl', 'dropdownOptions'));
}
/**
* Show the form for editing the specified resource.
*/
public function edit($id)
{
$title = 'UMKM';
$subtitle = 'Update Data';
$modelInstance = Umkm::find($id);
// Pastikan model ditemukan
if (!$modelInstance) {
return redirect()->route('umkm.index')->with('error', 'Umkm not found');
}
// Mengambil dan memetakan village_name dan district_name
$village = DB::table('villages')->where('village_code', $modelInstance->village_code)->first();
$modelInstance->village_name = $village ? $village->village_name : null;
$district = DB::table('districts')->where('district_code', $modelInstance->district_code)->first();
$modelInstance->district_name = $district ? $district->district_name : null;
$business_scale = DB::table('business_scale')->where('id', $modelInstance->business_scale_id)->first();
$modelInstance->business_scale_id = $business_scale ? $business_scale->id : null;
$permit_status = DB::table('permit_status')->where('id', $modelInstance->permit_status_id)->first();
$modelInstance->permit_status_id = $permit_status ? $permit_status->id : null;
$business_form = DB::table('business_form')->where('id', $modelInstance->business_form_id)->first();
$modelInstance->business_form_id = $business_form ? $business_form->id : null;
// dd($modelInstance['business_form_id']);
// Mengambil data untuk dropdown
$dropdownOptions = [
'village_name' => DB::table('villages')->orderBy('village_name')->pluck('village_name', 'village_code'),
'district_name' => DB::table('districts')->orderBy('district_name')->pluck('district_name', 'district_code'),
'business_scale_id' => DB::table('business_scale')->orderBy('business_scale')->pluck('business_scale', 'id'),
'permit_status_id' => DB::table('permit_status')->orderBy('permit_status')->pluck('permit_status', 'id'),
'business_form_id' => DB::table('business_form')->orderBy('business_form')->pluck('business_form', 'id')
];
info("AdvertisementController@edit diakses dengan Model Instance: $modelInstance");
$fields = $this->getFields();
$fieldTypes = $this->getFieldTypes();
$apiUrl = url('/api/umkm');
// dd($modelInstance->business_form_id, $dropdownOptions['business_form']);
return view('data.umkm.form', compact('title', 'subtitle', 'modelInstance', 'fields', 'fieldTypes', 'apiUrl', 'dropdownOptions'));
}
private function getFields()
{
return [
"business_name" => "Nama Usaha",
"business_address" => "Alamat Usaha",
"business_desc" => "Deskripsi Usaha",
"business_contact" => "Kontak Usaha",
"business_id_number" => "NIB",
"business_scale_id" => "Skala Usaha",
"owner_id" => "NIK",
"owner_name" => "Nama Pemilik",
"owner_address" => "Alamat Pemilik",
"owner_contact" => "Kontak Pemilik",
"business_type" => "Jenis Usaha",
"district_name" => "Kecamatan",
"village_name" => "Desa",
"number_of_employee" => "Jumlah Karyawan",
"land_area" => "Luas Tanah",
"permit_status_id" => "Ijin Status",
"business_form_id" => "Bisnis Form",
"revenue" => "Omset"
];
}
private function getFieldTypes()
{
return [
"business_name" => "text",
"business_address" => "text",
"business_desc" => "textarea",
"business_contact" => "text",
"business_id_number" => "text",
"business_scale_id" => "select",
"owner_id" => "text",
"owner_name" => "text",
"owner_address" => "text",
"owner_contact" => "text",
"business_type" => "text",
"district_name" => "combobox",
"village_name" => "combobox",
"number_of_employee" => "text",
"land_area" => "text",
"permit_status_id" => "select",
"business_form_id" => "select",
"revenue" => "text"
];
}
}

View File

@@ -0,0 +1,120 @@
<?php
namespace App\Http\Controllers;
use App\Http\Requests\DataSettingRequest;
use App\Models\DataSetting;
use Exception;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Request;
class DataSettingController extends Controller
{
/**
* Display a listing of the resource.
*/
public function index()
{
return view("data-settings.index");
}
/**
* Show the form for creating a new resource.
*/
public function create()
{
return view("data-settings.create");
}
/**
* Store a newly created resource in storage.
*/
public function store(DataSettingRequest $request)
{
try{
DB::beginTransaction();
DataSetting::create($request->validated());
DB::commit();
return redirect()->route("data-settings.index")->with("success","Successfully created");
}catch(Exception $ex){
DB::rollBack();
return redirect()->back()
->withInput()
->with('error', 'Something went wrong while saving data. ' . $ex->getMessage());
}
}
/**
* Display the specified resource.
*/
public function show(DataSetting $dataSetting)
{
//
}
/**
* Show the form for editing the specified resource.
*/
public function edit(string $id)
{
try{
$data = DataSetting::findOrFail($id);
if(empty($data)){
return redirect()->route('data-settings.index')->with('error', 'Invalid id');
}
return view("data-settings.edit", compact("data"));
}catch(Exception $ex){
return redirect()->route("data-settings.index")->with("error", "Invalid id");
}
}
/**
* Update the specified resource in storage.
*/
public function update(DataSettingRequest $request,string $id)
{
try{
DB::beginTransaction();
$data = DataSetting::findOrFail($id);
$data->update($request->validated());
DB::commit();
return redirect()->route("data-settings.index")->with("success","Successfully updated");
}catch(Exception $ex){
DB::rollBack();
return redirect()->back()
->withInput()
->with('error', 'Something went wrong while saving data. ' . $ex->getMessage());
}
}
/**
* Remove the specified resource from storage.
*/
public function destroy(string $id)
{
try{
DB::beginTransaction();
DataSetting::findOrFail($id)->delete();
DB::commit();
return response()->json(['success' => true, 'message' => 'Item deleted successfully.']);
}catch(Exception $e){
DB::rollBack();
Log::error($e->getMessage());
return response()->json(['success' => false, 'message' => 'Failed to delete item.'], 500);
}
}
public function getValueSetting(Request $request){
try{
$data = DataSetting::where('key', $request->key_name)->first();
return response()->json([
'success' => true,
'message' => "Successfully retrieved data",
"data"=> $data
]);
}catch(Exception $e){
return response()->json(['success' => false, 'message' => $e->getMessage()], 500);
}
}
}

View File

@@ -1,21 +0,0 @@
<?php
namespace App\Http\Controllers\Report;
use App\Http\Controllers\Controller;
use App\Models\BusinessTypeCount;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
class ReportTourismController extends Controller
{
/**
* Display a listring of the resource
*/
public function index()
{
$businessTypeCounts = BusinessTypeCount::all();
info($businessTypeCounts);
return view('report.tourisms.index', compact('businessTypeCounts'));
}
}

View File

@@ -12,7 +12,7 @@ class PbgTaskController extends Controller
*/
public function index()
{
return view('request-assignment.index');
return view('pbg_task.index');
}
/**
@@ -20,7 +20,7 @@ class PbgTaskController extends Controller
*/
public function create()
{
//
return view("pbg_task.create");
}
/**
@@ -28,7 +28,7 @@ class PbgTaskController extends Controller
*/
public function store(Request $request)
{
//
}
/**
@@ -36,7 +36,7 @@ class PbgTaskController extends Controller
*/
public function show(string $id)
{
//
return view("pbg_task.show");
}
/**
@@ -44,7 +44,7 @@ class PbgTaskController extends Controller
*/
public function edit(string $id)
{
//
return view("pbg_task.edit");
}
/**

View File

@@ -15,30 +15,4 @@ class RoutingController extends Controller
return redirect('auth.signin');
}
}
/**
* Display a view based on first route param
*
* @return \Illuminate\Http\Response
*/
public function root(Request $request, $first)
{
return view($first);
}
/**
* second level route
*/
public function secondLevel(Request $request, $first, $second)
{
return view($first . '.' . $second);
}
/**
* third level route
*/
public function thirdLevel(Request $request, $first, $second, $third)
{
return view($first . '.' . $second . '.' . $third);
}
}

View File

@@ -1,43 +0,0 @@
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class AdvertisementRequest 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 [
'no' => 'required',
'business_name' => 'required|string',
'npwpd' => 'required|string',
'advertisement_type' => 'required|string',
'advertisement_content' => 'required|string',
'business_address' => 'required|string',
'advertisement_location' => 'required|string',
'village_name' => 'required',
'district_name' => 'required',
'length' => 'required',
'width' => 'required',
'viewing_angle' => 'required|string',
'face' => 'required|string',
'area' => 'required|string',
'angle' => 'required|string',
'contact' => 'required|string',
];
}
}

View File

@@ -0,0 +1,31 @@
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class DataSettingRequest 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
{
$id = $this->route('data_setting');
return [
"key" => "required|unique:data_settings,key," . $id,
"value" => "required",
"type" => "nullable",
];
}
}

View File

@@ -0,0 +1,62 @@
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class PbgTaskMultiStepRequest 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()
{
return [
// rules step 1
"step1Form.uuid" => "required",
"step1Form.name" => "nullable|string|max:255",
"step1Form.owner_name" => "nullable|string|max:255",
"step1Form.application_type" => "nullable|string|max:255",
"step1Form.application_type_name" => "nullable|string|max:255",
"step1Form.condition" => "nullable|string|max:255",
"step1Form.registration_number" => "nullable|string|max:255",
"step1Form.document_number" => "nullable|string|max:255",
"step1Form.address" => "nullable|string|max:255",
"step1Form.status" => "nullable|integer",
"step1Form.status_name" => "nullable|string|max:255",
"step1Form.slf_status" => "nullable|string|max:255",
"step1Form.slf_status_name" => "nullable|string|max:255",
"step1Form.function_type" => "nullable|string|max:255",
"step1Form.consultation_type" => "nullable|string|max:255",
"step1Form.due_date" => "nullable|date",
"step1Form.land_certificate_phase" => "nullable|boolean",
"step1Form.task_created_at" => "nullable|date",
];
}
public function messages()
{
return [
// message step 1
"step1Form.uuid.required" => "UUID wajib diisi.",
"step1Form.uuid.uuid" => "Format UUID tidak valid.",
"step1Form.name.max" => "Nama tidak boleh lebih dari 255 karakter.",
"step1Form.owner_name.max" => "Nama pemilik tidak boleh lebih dari 255 karakter.",
"step1Form.registration_number.max" => "Nomor registrasi tidak boleh lebih dari 255 karakter.",
"step1Form.document_number.max" => "Nomor dokumen tidak boleh lebih dari 255 karakter.",
"step1Form.status.integer" => "Status harus berupa angka.",
"step1Form.due_date.date" => "Tanggal jatuh tempo tidak valid.",
"step1Form.land_certificate_phase.boolean" => "Fase sertifikat tanah harus berupa true/false.",
];
}
}

View File

@@ -1,41 +0,0 @@
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class TourismRequest 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 [
'jenis_proyek' => 'string',
'nib' => 'string',
'business_name' => 'required|string',
'status_penanaman_modal' => 'string',
'business_form' => 'string',
'uraian_resiko_proyek' => 'string',
'project_name' => 'required|string',
'business_address' => 'required|string',
'district_code' => 'required|string',
'village_code' => 'required|string',
'land_area' => 'required|string',
'investment_amount' => 'required|string',
'number_of_employee' => 'required|string',
'business_type_id' => 'required|string',
];
}
}

View File

@@ -1,106 +0,0 @@
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class UmkmRequest 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 [
'business_name' => 'required|string',
'business_address' => 'required|string',
'business_desc' => 'required|string',
'business_contact' => 'required|string',
'business_id_number' => 'string',
'business_scale_id' => 'required',
'owner_id' => 'required|string',
'owner_name' => 'required|string',
'owner_address' => 'required|string',
'owner_contact' => 'required|string',
'business_type' => 'required|string',
'business_form_id' => 'required|string',
'revenue' => 'required|numeric|between:0,999999999999999999.99',
'village_name' => 'required|string',
'district_name' => 'required',
'number_of_employee' => 'required',
'permit_status_id' => 'required',
'land_area' => 'required|integer|between:0,99999999999',
];
}
/**
* Get the validation messages for the request.
*
* @return array<string, string>
*/
public function messages(): array
{
return [
'business_name.required' => 'Nama usaha wajib diisi.',
'business_name.string' => 'Nama usaha harus berupa teks.',
'business_address.required' => 'Alamat usaha wajib diisi.',
'business_address.string' => 'Alamat usaha harus berupa teks.',
'business_desc.required' => 'Deskripsi usaha wajib diisi.',
'business_desc.string' => 'Deskripsi usaha harus berupa teks.',
'business_contact.required' => 'Kontak usaha wajib diisi.',
'business_contact.string' => 'Kontak usaha harus berupa teks.',
'business_id_number.string' => 'Nomor ID usaha harus berupa teks.',
'business_scale.required' => 'Skala usaha wajib diisi.',
'owner_id.required' => 'ID pemilik wajib diisi.',
'owner_id.string' => 'ID pemilik harus berupa teks.',
'owner_name.required' => 'Nama pemilik wajib diisi.',
'owner_name.string' => 'Nama pemilik harus berupa teks.',
'owner_address.required' => 'Alamat pemilik wajib diisi.',
'owner_address.string' => 'Alamat pemilik harus berupa teks.',
'owner_contact.required' => 'Kontak pemilik wajib diisi.',
'owner_contact.string' => 'Kontak pemilik harus berupa teks.',
'business_type.required' => 'Jenis usaha wajib diisi.',
'business_type.string' => 'Jenis usaha harus berupa teks.',
'business_form.required' => 'Bentuk usaha wajib diisi.',
'business_form.string' => 'Bentuk usaha harus berupa teks.',
'revenue.required' => 'Omset wajib diisi.',
'revenue.numeric' => 'Omset harus berupa angka yang valid.',
'revenue.between' => 'Omset harus berada di antara 0 dan 9.999.999.999,99.',
'village_name.required' => 'Nama desa wajib diisi.',
'village_name.string' => 'Nama desa harus berupa teks.',
'district_name.required' => 'Nama distrik wajib diisi.',
'number_of_employee.required' => 'Jumlah karyawan wajib diisi.',
'permit_status.required' => 'Status izin wajib diisi.',
'land_area.required' => 'Luas lahan wajib diisi.',
'land_area.integer' => 'Luas lahan harus berupa angka bulat.',
'land_area.between' => 'Luas lahan harus berada di antara 0 dan 99.999.999.999.',
];
}
}

View File

@@ -1,19 +0,0 @@
<?php
namespace App\Http\Resources;
use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;
class AdvertisementResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @return array<string, mixed>
*/
public function toArray(Request $request): array
{
return parent::toArray($request);
}
}

View File

@@ -0,0 +1,26 @@
<?php
namespace App\Http\Resources;
use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;
class DataSettingResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @return array<string, mixed>
*/
public function toArray(Request $request): array
{
return [
'id' => $this->id,
'key' => $this->key,
'value' => $this->value,
'type' => $this->type,
'created_at' => $this->created_at->toDateTimeString(),
'updated_at' => $this->updated_at->toDateTimeString(),
];
}
}

View File

@@ -1,19 +0,0 @@
<?php
namespace App\Http\Resources;
use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;
class TourismResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @return array<string, mixed>
*/
public function toArray(Request $request): array
{
return parent::toArray($request);
}
}

View File

@@ -1,19 +0,0 @@
<?php
namespace App\Http\Resources;
use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;
class UmkmResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @return array<string, mixed>
*/
public function toArray(Request $request): array
{
return parent::toArray($request);
}
}

View File

@@ -1,92 +0,0 @@
<?php
namespace App\Imports;
use App\Models\Advertisement;
use Illuminate\Support\Collection;
use Maatwebsite\Excel\Concerns\ToCollection;
use Illuminate\Support\Facades\DB;
class AdvertisementImport implements ToCollection
{
/**
* Process each row in the file.
*/
public function collection(Collection $rows)
{
if ($rows->isEmpty())
{
return;
}
// Ambil data districts dengan normalisasi nama
$districts = DB::table('districts')
->get()
->mapWithKeys(function ($item) {
return [strtolower(trim($item->district_name)) => $item->district_code];
})
->toArray();
// Cari header secara otomatis
$header = $rows->first();
$headerIndex = collect($header)->search(fn($value) => !empty($value));
// Pastikan header ditemukan
if ($headerIndex === false) {
return;
}
$dataToInsert = [];
foreach ($rows->skip(1) as $row) {
// Normalisasi nama kecamatan dan desa
$districtName = strtolower(trim(str_replace('Kecamatan ', '', $row[8])));
$villageName = strtolower(trim($row[7]));
// Cari district_code dari tabel districts
$districtCode = $districts[$districtName] ?? null;
$listTrueVillage = DB::table('villages')
->where('district_code', $districtCode)
->get()
->mapWithKeys(function ($item) {
return [strtolower(trim($item->village_name)) => [
'village_code' => $item->village_code,
'district_code' => $item->district_code
]];
})
->toArray();
// ambil village code yang village_name sama dengan $villageName
$villageCode = $listTrueVillage[$villageName]['village_code'] ?? '0000';
$dataToInsert[] = [
'no' => $row[0],
'business_name' => $row[1],
'npwpd' => $row[2],
'advertisement_type' => $row[3],
'advertisement_content' => $row[4],
'business_address' => $row[5],
'advertisement_location' => $row[6],
'village_code' => $villageCode,
'district_code' => $districtCode,
'length' => $row[9],
'width' => $row[10],
'viewing_angle' => $row[11],
'face' => $row[12],
'area' => $row[13],
'angle' => $row[14],
'contact' => $row[15] ?? "-",
'created_at' => now(),
'updated_at' => now()
];
}
// Bulk insert untuk efisiensi
if (!empty($dataToInsert)) {
Advertisement::insert($dataToInsert);
} else {
return;
}
}
}

View File

@@ -1,96 +0,0 @@
<?php
namespace App\Imports;
use App\Models\Tourism;
use Illuminate\Support\Collection;
use Maatwebsite\Excel\Concerns\ToCollection;
use Illuminate\Support\Facades\DB;
use DateTime;
class TourismImport implements ToCollection
{
protected static $processed = false;
/**
* Process each row in the file.
*/
public function collection(Collection $rows)
{
if (self::$processed) {
return;
}
self::$processed = true;
if ($rows->isEmpty())
{
return;
}
// Ambil data districts dengan normalisasi nama
$districts = DB::table('districts')
->get()
->mapWithKeys(function ($item) {
return [strtolower(trim($item->district_name)) => $item->district_code];
})
->toArray();
// Cari header secara otomatis
$header = $rows->first();
$headerIndex = collect($header)->search(fn($value) => !empty($value));
// Pastikan header ditemukan
if ($headerIndex === false) {
return;
}
info($rows);
foreach ($rows->skip(1) as $row) {
// Normalisasi nama kecamatan dan desa
$districtName = strtolower(trim(str_replace('Kecamatan', '', $row[13])));
$villageName = strtolower(trim($row[14]));
// Cari distric_code dari table districts
$districtCode = $districts[$districtName] ?? null;
$listTrueVillage = DB::table('villages')
->where('district_code', $districtCode)
->get()
->mapWithKeys(function ($item) {
return [strtolower(trim($item->village_name)) => [
'village_code' => $item->village_code,
'district_code' => $item->district_code
]];
})
->toArray();
// ambill village code yang village_name sama dengan $villageName
$villageCode = $listTrueVillage[$villageName]['village_code'] ?? '000000';
$dataToInsert[] = [
'project_id' => $row[1],
'jenis_proyek' => $row[2],
'nib' => $row[3],
'business_name' => $row[4],
'terbit_oss' => DateTime::createFromFormat('d/m/Y', $row[5])->format('Y-m-d'),
'status_penanaman_modal' => $row[6],
'business_form' => $row[7],
'uraian_resiko_proyek' => $row[8],
'project_name' => $row[9],
'business_type_id' => $row[10],
'business_scale_id' => (int) $row[11],
'business_address' => $row[12],
'district_code' => $districtCode,
'village_code' => $villageCode,
'land_area' => $row[15],
'investment_amount' => (string) $row[16],
'number_of_employee' => (string) $row[17],
];
}
if(!empty($dataToInsert)) {
Tourism::insert($dataToInsert);
} else {
return;
}
}
}

View File

@@ -1,98 +0,0 @@
<?php
namespace App\Imports;
use App\Models\Umkm;
use Illuminate\Support\Collection;
use Maatwebsite\Excel\Concerns\ToCollection;
use Illuminate\Support\Facades\DB;
class UmkmImport implements ToCollection
{
protected static $processed = false;
/**
* Process each row in the file.
*/
public function collection(Collection $rows)
{
if (self::$processed) {
return;
}
self::$processed = true;
if ($rows->isEmpty())
{
return;
}
// Ambil data districts dengan normalisasi nama
$districts = DB::table('districts')
->get()
->mapWithKeys(function ($item) {
return [strtolower(trim($item->district_name)) => $item->district_code];
})
->toArray();
// Cari header secara otomatis
$header = $rows->first();
$headerIndex = collect($header)->search(fn($value) => !empty($value));
// Pastikan header ditemukan
if ($headerIndex === false) {
return;
}
info($rows);
foreach ($rows->skip(1) as $row) {
// Normalisasi nama kecamatan dan desa
$districtName = strtolower(trim(str_replace('Kecamatan', '', $row[14])));
$villageName = strtolower(trim($row[13]));
// Cari distric_code dari table districts
$districtCode = $districts[$districtName] ?? null;
$listTrueVillage = DB::table('villages')
->where('district_code', $districtCode)
->get()
->mapWithKeys(function ($item) {
return [strtolower(trim($item->village_name)) => [
'village_code' => $item->village_code,
'district_code' => $item->district_code
]];
})
->toArray();
// ambil village code yang village_name sama dengan $villageName
$villageCode = $listTrueVillage[$villageName]['village_code'] ?? '0000';
$dataToInsert[] = [
'business_name' => $row[0],
'business_address' => $row[1],
'business_desc' => $row[2],
'business_contact' => $row[3],
'business_id_number' => $row[4],
'business_scale_id' => $row[5],
'owner_id' => $row[6],
'owner_name' => $row[7],
'owner_address' => $row[8],
'owner_contact' => $row[9],
'business_type' => $row[10],
'business_form_id' => $row[11],
'revenue' => $row[12],
'village_code' => $villageCode,
'district_code' => $districtCode,
'number_of_employee' => $row[15],
'land_area' => $row[16],
'permit_status_id' => $row[17],
];
}
info($dataToInsert);
if (!empty($dataToInsert)) {
Umkm::insert($dataToInsert);
} else {
return;
}
}
}

View File

@@ -1,46 +0,0 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
/**
* Class Advertisement
*
* @property $id
* @property $created_at
* @property $updated_at
* @property $no
* @property $business_name
* @property $npwpd
* @property $advertisement_type
* @property $advertisement_content
* @property $business_address
* @property $advertisement_location
* @property $village_code
* @property $district_code
* @property $length
* @property $width
* @property $viewing_angle
* @property $face
* @property $area
* @property $angle
* @property $contact
*
* @package App
* @mixin \Illuminate\Database\Eloquent\Builder
*/
class Advertisement extends Model
{
protected $perPage = 20;
/**
* The attributes that are mass assignable.
*
* @var array<int, string>
*/
protected $fillable = ['no', 'business_name', 'npwpd', 'advertisement_type', 'advertisement_content', 'business_address', 'advertisement_location', 'village_code', 'district_code', 'length', 'width', 'viewing_angle', 'face', 'area', 'angle', 'contact'];
}

View File

@@ -1,14 +0,0 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class BusinessTypeCount extends Model
{
protected $table = 'business_type_counts';
protected $primaryKey = null;
public $timestamps = false;
protected $fillable = ['business_type', 'count'];
}

View File

@@ -0,0 +1,15 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class DataSetting extends Model
{
protected $table = "data_settings";
protected $fillable = [
"key",
"value",
"type"
];
}

View File

@@ -0,0 +1,68 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class PbgTaskGoogleSheet extends Model
{
protected $table = "pbg_task_google_sheet";
protected $fillable = [
'jenis_konsultasi',
'no_registrasi',
'nama_pemilik',
'lokasi_bg',
'fungsi_bg',
'nama_bangunan',
'tgl_permohonan',
'status_verifikasi',
'status_permohonan',
'alamat_pemilik',
'no_hp',
'email',
'tanggal_catatan',
'catatan_kekurangan_dokumen',
'gambar',
'krk_kkpr',
'no_krk',
'lh',
'ska',
'keterangan',
'helpdesk',
'pj',
'kepemilikan',
'potensi_taru',
'validasi_dinas',
'kategori_retribusi',
'no_urut_ba_tpt',
'tanggal_ba_tpt',
'no_urut_ba_tpa',
'tanggal_ba_tpa',
'no_urut_skrd',
'tanggal_skrd',
'ptsp',
'selesai_terbit',
'tanggal_pembayaran',
'format_sts',
'tahun_terbit',
'tahun_berjalan',
'kelurahan',
'kecamatan',
'lb',
'tb',
'jlb',
'unit',
'usulan_retribusi',
'nilai_retribusi_keseluruhan_simbg',
'nilai_retribusi_keseluruhan_pad',
'denda',
'latitude',
'longitude',
'nik_nib',
'dok_tanah',
'temuan',
];
}

View File

@@ -1,47 +0,0 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
/**
* Class Tourism
*
* @property $id
* @property $project_id
* @property $jenis_proyek
* @property $nib
* @property $created_at
* @property $updated_at
* @property $business_name
* @property $terbit_oss
* @property $status_penanaman_modal
* @property $business_form
* @property $uraian_resiko_proyek
* @property $project_name
* @property $business_scale_id
* @property $business_address
* @property $district_code
* @property $village_code
* @property $land_area
* @property $investment_amount
* @property $number_of_employee
* @property $business_type_id
*
* @package App
* @mixin \Illuminate\Database\Eloquent\Builder
*/
class Tourism extends Model
{
protected $perPage = 20;
/**
* The attributes that are mass assignable.
*
* @var array<int, string>
*/
protected $fillable = ['project_id', 'jenis_proyek', 'nib', 'business_name', 'terbit_oss', 'status_penanaman_modal', 'business_form', 'uraian_resiko_proyek', 'project_name', 'business_scale_id', 'business_address', 'district_code', 'village_code', 'land_area', 'investment_amount', 'number_of_employee', 'business_type_id'];
}

View File

@@ -1,48 +0,0 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
/**
* Class Umkm
*
* @property $id
* @property $created_at
* @property $updated_at
* @property $business_name
* @property $business_address
* @property $business_desc
* @property $business_contact
* @property $business_id_number
* @property $business_scale_id
* @property $owner_id
* @property $owner_name
* @property $owner_address
* @property $owner_contact
* @property $business_type
* @property $business_form_id
* @property $revenue
* @property $village_code
* @property $distric_code
* @property $number_of_employee
* @property $land_area
* @property $permit_status_id
*
* @package App
* @mixin \Illuminate\Database\Eloquent\Builder
*/
class Umkm extends Model
{
protected $perPage = 20;
/**
* The attributes that are mass assignable.
*
* @var array<int, string>
*/
protected $fillable = ['business_name', 'business_address', 'business_desc', 'business_contact', 'business_id_number', 'business_scale_id', 'owner_id', 'owner_name', 'owner_address', 'owner_contact', 'business_type', 'business_form_id', 'revenue', 'village_code', 'district_code', 'number_of_employee', 'land_area', 'permit_status_id'];
}

View File

@@ -26,7 +26,7 @@ class ServiceClient
);
}
public function makeRequest($url, $method = 'GET', $body = null, $headers = [], $timeout = 300){
public function makeRequest($url, $method = 'GET', $body = null, $headers = [], $timeout = 14400){
try {
$headers = array_merge($this->headers, $headers);

View File

@@ -58,6 +58,8 @@ class ServiceSIMBG
];
$res = $clientHelper->get($url, $headers);
Log::info("response index integration", ['res' => $res]);
if (empty($res->original['success']) || !$res->original['success']) {
// Log error
@@ -128,9 +130,10 @@ class ServiceSIMBG
$savedCount = $failedCount = 0;
for ($currentPage = 1; $currentPage <= $totalPage; $currentPage++) {
for ($currentPage = 50; $currentPage <= $totalPage; $currentPage++) {
$pageUrl = "/api/pbg/v1/list/?page={$currentPage}&size={$this->fetch_per_page}&sort=ASC";
$getToken = $this->getToken();
Log::info("response index integration", ['currentPage' => $currentPage]);
if (empty($getToken->original['data']['token']['access'])) {
$importDatasource->update([
'status' => ImportDatasourceStatus::Failed->value,
@@ -227,6 +230,8 @@ class ServiceSIMBG
$res = $clientHelper->get($url, $headers);
Log::info("response task detail submit", ['res' => $res]);
if (empty($res->original['success']) || !$res->original['success']) {
// Log error
Log::error("API response indicates failure", ['url' => $url, 'uuid' => $uuid]);

View File

@@ -0,0 +1,131 @@
<?php
namespace App\Services;
use Google_Client;
use Google_Service_Sheets;
class GoogleSheetService
{
/**
* Create a new class instance.
*/
protected $client;
protected $service;
protected $spreadsheetID;
public function __construct()
{
$this->client = new Google_Client();
$this->client->setApplicationName("Sibedas Google Sheets API");
$this->client->setScopes([Google_Service_Sheets::SPREADSHEETS_READONLY]);
$this->client->setAuthConfig(storage_path("app/teak-banner-450003-s8-ea05661d9db0.json"));
$this->client->setAccessType("offline");
$this->service = new Google_Service_Sheets($this->client);
$this->spreadsheetID = env("SPREAD_SHEET_ID");
$this->service_sheets = new Google_Service_Sheets($this->client);
}
public function getSheetData($range){
$response = $this->service->spreadsheets_values->get($this->spreadsheetID, $range);
return $response->getValues();
}
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;
}
}
}
return $lastRow;
}
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] : [];
}
public function getLastColumn()
{
$spreadsheet = $this->service->spreadsheets->get($this->spreadsheetID);
$sheets = $spreadsheet->getSheets();
// Ambil nama sheet pertama
$firstSheetTitle = $sheets[0]->getProperties()->getTitle();
// Ambil baris pertama untuk mendapatkan jumlah kolom yang terisi
$range = "{$firstSheetTitle}!1:1";
$response = $this->service->spreadsheets_values->get($this->spreadsheetID, $range);
$values = $response->getValues();
// Hitung jumlah kolom yang memiliki nilai
return !empty($values) ? count(array_filter($values[0], fn($value) => $value !== "")) : 0;
}
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;
}
$mappedData[] = $rowData;
}
}
return $mappedData;
}
}

View File

@@ -7,15 +7,14 @@
"license": "MIT",
"require": {
"php": "^8.2",
"google/apiclient": "^2.12",
"guzzlehttp/guzzle": "^7.9",
"laravel/framework": "^11.31",
"laravel/sanctum": "^4.0",
"laravel/tinker": "^2.9",
"maatwebsite/excel": "^3.1"
"laravel/tinker": "^2.9"
},
"require-dev": {
"fakerphp/faker": "^1.23",
"ibex/crud-generator": "^2.1",
"laravel/pail": "^1.1",
"laravel/pint": "^1.13",
"laravel/sail": "^1.26",
@@ -71,5 +70,11 @@
}
},
"minimum-stability": "stable",
"prefer-stable": true
"prefer-stable": true,
"repositories": {
"grocery-crud": {
"type": "composer",
"url": "https://composer.grocerycrud.com/"
}
}
}

1748
composer.lock generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,81 +0,0 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Stubs Path
|--------------------------------------------------------------------------
|
| The stubs path directory to generate crud. You may configure your
| stubs paths here, allowing you to customize the own stubs of the
| model,controller or view. Or, you may simply stick with the CrudGenerator defaults!
|
| Example: 'stub_path' => resource_path('stubs/')
| Default: "default"
| Files:
| Controller.stub
| Model.stub
| Request.stub
| views/
| bootstrap/
| create.stub
| edit.stub
| form.stub
| form-field.stub
| index.stub
| show.stub
| view-field.stub
*/
'stub_path' => 'default',
/*
|--------------------------------------------------------------------------
| Application Layout
|--------------------------------------------------------------------------
|
| This value is the name of your application layout. This value is used when creating
| views for crud. Default will be the "layouts.app".
|
| layout = false or layout = null will not create the layout files.
*/
'layout' => 'layouts.app',
'model' => [
'namespace' => 'App\Models',
/*
* Do not make these columns $fillable in Model or views
*/
'unwantedColumns' => [
'id',
'uuid',
'ulid',
'password',
'email_verified_at',
'remember_token',
'created_at',
'updated_at',
'deleted_at',
],
],
'controller' => [
'namespace' => 'App\Http\Controllers',
'apiNamespace' => 'App\Http\Controllers\Api',
],
'resources' => [
'namespace' => 'App\Http\Resources',
],
'livewire' => [
'namespace' => 'App\Livewire',
],
'request' => [
'namespace' => 'App\Http\Requests',
],
];

View File

@@ -1,380 +0,0 @@
<?php
use Maatwebsite\Excel\Excel;
use PhpOffice\PhpSpreadsheet\Reader\Csv;
return [
'exports' => [
/*
|--------------------------------------------------------------------------
| Chunk size
|--------------------------------------------------------------------------
|
| When using FromQuery, the query is automatically chunked.
| Here you can specify how big the chunk should be.
|
*/
'chunk_size' => 1000,
/*
|--------------------------------------------------------------------------
| Pre-calculate formulas during export
|--------------------------------------------------------------------------
*/
'pre_calculate_formulas' => false,
/*
|--------------------------------------------------------------------------
| Enable strict null comparison
|--------------------------------------------------------------------------
|
| When enabling strict null comparison empty cells ('') will
| be added to the sheet.
*/
'strict_null_comparison' => false,
/*
|--------------------------------------------------------------------------
| CSV Settings
|--------------------------------------------------------------------------
|
| Configure e.g. delimiter, enclosure and line ending for CSV exports.
|
*/
'csv' => [
'delimiter' => ',',
'enclosure' => '"',
'line_ending' => PHP_EOL,
'use_bom' => false,
'include_separator_line' => false,
'excel_compatibility' => false,
'output_encoding' => '',
'test_auto_detect' => true,
],
/*
|--------------------------------------------------------------------------
| Worksheet properties
|--------------------------------------------------------------------------
|
| Configure e.g. default title, creator, subject,...
|
*/
'properties' => [
'creator' => '',
'lastModifiedBy' => '',
'title' => '',
'description' => '',
'subject' => '',
'keywords' => '',
'category' => '',
'manager' => '',
'company' => '',
],
],
'imports' => [
/*
|--------------------------------------------------------------------------
| Read Only
|--------------------------------------------------------------------------
|
| When dealing with imports, you might only be interested in the
| data that the sheet exists. By default we ignore all styles,
| however if you want to do some logic based on style data
| you can enable it by setting read_only to false.
|
*/
'read_only' => true,
/*
|--------------------------------------------------------------------------
| Ignore Empty
|--------------------------------------------------------------------------
|
| When dealing with imports, you might be interested in ignoring
| rows that have null values or empty strings. By default rows
| containing empty strings or empty values are not ignored but can be
| ignored by enabling the setting ignore_empty to true.
|
*/
'ignore_empty' => false,
/*
|--------------------------------------------------------------------------
| Heading Row Formatter
|--------------------------------------------------------------------------
|
| Configure the heading row formatter.
| Available options: none|slug|custom
|
*/
'heading_row' => [
'formatter' => 'slug',
],
/*
|--------------------------------------------------------------------------
| CSV Settings
|--------------------------------------------------------------------------
|
| Configure e.g. delimiter, enclosure and line ending for CSV imports.
|
*/
'csv' => [
'delimiter' => null,
'enclosure' => '"',
'escape_character' => '\\',
'contiguous' => false,
'input_encoding' => Csv::GUESS_ENCODING,
],
/*
|--------------------------------------------------------------------------
| Worksheet properties
|--------------------------------------------------------------------------
|
| Configure e.g. default title, creator, subject,...
|
*/
'properties' => [
'creator' => '',
'lastModifiedBy' => '',
'title' => '',
'description' => '',
'subject' => '',
'keywords' => '',
'category' => '',
'manager' => '',
'company' => '',
],
/*
|--------------------------------------------------------------------------
| Cell Middleware
|--------------------------------------------------------------------------
|
| Configure middleware that is executed on getting a cell value
|
*/
'cells' => [
'middleware' => [
//\Maatwebsite\Excel\Middleware\TrimCellValue::class,
//\Maatwebsite\Excel\Middleware\ConvertEmptyCellValuesToNull::class,
],
],
],
/*
|--------------------------------------------------------------------------
| Extension detector
|--------------------------------------------------------------------------
|
| Configure here which writer/reader type should be used when the package
| needs to guess the correct type based on the extension alone.
|
*/
'extension_detector' => [
'xlsx' => Excel::XLSX,
'xlsm' => Excel::XLSX,
'xltx' => Excel::XLSX,
'xltm' => Excel::XLSX,
'xls' => Excel::XLS,
'xlt' => Excel::XLS,
'ods' => Excel::ODS,
'ots' => Excel::ODS,
'slk' => Excel::SLK,
'xml' => Excel::XML,
'gnumeric' => Excel::GNUMERIC,
'htm' => Excel::HTML,
'html' => Excel::HTML,
'csv' => Excel::CSV,
'tsv' => Excel::TSV,
/*
|--------------------------------------------------------------------------
| PDF Extension
|--------------------------------------------------------------------------
|
| Configure here which Pdf driver should be used by default.
| Available options: Excel::MPDF | Excel::TCPDF | Excel::DOMPDF
|
*/
'pdf' => Excel::DOMPDF,
],
/*
|--------------------------------------------------------------------------
| Value Binder
|--------------------------------------------------------------------------
|
| PhpSpreadsheet offers a way to hook into the process of a value being
| written to a cell. In there some assumptions are made on how the
| value should be formatted. If you want to change those defaults,
| you can implement your own default value binder.
|
| Possible value binders:
|
| [x] Maatwebsite\Excel\DefaultValueBinder::class
| [x] PhpOffice\PhpSpreadsheet\Cell\StringValueBinder::class
| [x] PhpOffice\PhpSpreadsheet\Cell\AdvancedValueBinder::class
|
*/
'value_binder' => [
'default' => Maatwebsite\Excel\DefaultValueBinder::class,
],
'cache' => [
/*
|--------------------------------------------------------------------------
| Default cell caching driver
|--------------------------------------------------------------------------
|
| By default PhpSpreadsheet keeps all cell values in memory, however when
| dealing with large files, this might result into memory issues. If you
| want to mitigate that, you can configure a cell caching driver here.
| When using the illuminate driver, it will store each value in the
| cache store. This can slow down the process, because it needs to
| store each value. You can use the "batch" store if you want to
| only persist to the store when the memory limit is reached.
|
| Drivers: memory|illuminate|batch
|
*/
'driver' => 'memory',
/*
|--------------------------------------------------------------------------
| Batch memory caching
|--------------------------------------------------------------------------
|
| When dealing with the "batch" caching driver, it will only
| persist to the store when the memory limit is reached.
| Here you can tweak the memory limit to your liking.
|
*/
'batch' => [
'memory_limit' => 60000,
],
/*
|--------------------------------------------------------------------------
| Illuminate cache
|--------------------------------------------------------------------------
|
| When using the "illuminate" caching driver, it will automatically use
| your default cache store. However if you prefer to have the cell
| cache on a separate store, you can configure the store name here.
| You can use any store defined in your cache config. When leaving
| at "null" it will use the default store.
|
*/
'illuminate' => [
'store' => null,
],
/*
|--------------------------------------------------------------------------
| Cache Time-to-live (TTL)
|--------------------------------------------------------------------------
|
| The TTL of items written to cache. If you want to keep the items cached
| indefinitely, set this to null. Otherwise, set a number of seconds,
| a \DateInterval, or a callable.
|
| Allowable types: callable|\DateInterval|int|null
|
*/
'default_ttl' => 10800,
],
/*
|--------------------------------------------------------------------------
| Transaction Handler
|--------------------------------------------------------------------------
|
| By default the import is wrapped in a transaction. This is useful
| for when an import may fail and you want to retry it. With the
| transactions, the previous import gets rolled-back.
|
| You can disable the transaction handler by setting this to null.
| Or you can choose a custom made transaction handler here.
|
| Supported handlers: null|db
|
*/
'transactions' => [
'handler' => 'db',
'db' => [
'connection' => null,
],
],
'temporary_files' => [
/*
|--------------------------------------------------------------------------
| Local Temporary Path
|--------------------------------------------------------------------------
|
| When exporting and importing files, we use a temporary file, before
| storing reading or downloading. Here you can customize that path.
| permissions is an array with the permission flags for the directory (dir)
| and the create file (file).
|
*/
'local_path' => storage_path('framework/cache/laravel-excel'),
/*
|--------------------------------------------------------------------------
| Local Temporary Path Permissions
|--------------------------------------------------------------------------
|
| Permissions is an array with the permission flags for the directory (dir)
| and the create file (file).
| If omitted the default permissions of the filesystem will be used.
|
*/
'local_permissions' => [
// 'dir' => 0755,
// 'file' => 0644,
],
/*
|--------------------------------------------------------------------------
| Remote Temporary Disk
|--------------------------------------------------------------------------
|
| When dealing with a multi server setup with queues in which you
| cannot rely on having a shared local temporary path, you might
| want to store the temporary file on a shared disk. During the
| queue executing, we'll retrieve the temporary file from that
| location instead. When left to null, it will always use
| the local path. This setting only has effect when using
| in conjunction with queued imports and exports.
|
*/
'remote_disk' => null,
'remote_prefix' => null,
/*
|--------------------------------------------------------------------------
| Force Resync
|--------------------------------------------------------------------------
|
| When dealing with a multi server setup as above, it's possible
| for the clean up that occurs after entire queue has been run to only
| cleanup the server that the last AfterImportJob runs on. The rest of the server
| would still have the local temporary file stored on it. In this case your
| local storage limits can be exceeded and future imports won't be processed.
| To mitigate this you can set this config value to be true, so that after every
| queued chunk is processed the local temporary file is deleted on the server that
| processed it.
|
*/
'force_resync_remote' => null,
],
];

View File

@@ -0,0 +1,52 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| CodeGenerator config overrides
|--------------------------------------------------------------------------
|
| It is a good idea to separate your configuration form the code-generator's
| own configuration. This way you won't lose any settings/preference
| you have when upgrading to a new version of the package.
|
| Additionally, you will always know any the configuration difference between
| the default config than your own.
|
| To override the setting that is found in the 'config/default.php' file, you'll
| need to create identical key here with a different value
|
| IMPORTANT: When overriding an option that is an array, the configurations
| are merged together using php's array_merge() function. This means that
| any option that you list here will take presence during a conflict in keys.
|
| EXAMPLE: The following addition to this file, will add another entry in
| the common_definitions collection
|
| 'common_definitions' =>
| [
| [
| 'match' => '*_at',
| 'set' => [
| 'css-class' => 'datetime-picker',
| ],
| ],
| ],
|
*/
/*
|--------------------------------------------------------------------------
| The default path of where the uploaded files live.
|--------------------------------------------------------------------------
|
| You can use Laravel Storage filesystem. By default, the code-generator
| uses the default file system.
| For more info about Laravel's file system visit
| https://laravel.com/docs/5.5/filesystem
|
*/
'files_upload_path' => 'uploads',
];

View File

@@ -11,11 +11,12 @@ return new class extends Migration
*/
public function up(): void
{
Schema::create('business_form', function (Blueprint $table) {
Schema::create('data_settings', function (Blueprint $table) {
$table->id();
$table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP'));
$table->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'));
$table->string('business_form');
$table->string('key')->unique();
$table->string('value');
$table->string('type')->nullable()->default('integer');
$table->timestamps();
});
}
@@ -24,6 +25,6 @@ return new class extends Migration
*/
public function down(): void
{
Schema::dropIfExists('business_form');
Schema::dropIfExists('data_settings');
}
};

View File

@@ -1,30 +0,0 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('provincies', function (Blueprint $table) {
$table->id();
$table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP'));
$table->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'));
$table->integer('province_code');
$table->string('province_name');
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('provincies');
}
};

View File

@@ -1,31 +0,0 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('regencies', function (Blueprint $table) {
$table->id();
$table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP'));
$table->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'));
$table->integer('province_code');
$table->integer('regency_code');
$table->string('regency_name');
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('regencies');
}
};

View File

@@ -1,31 +0,0 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('districts', function (Blueprint $table) {
$table->id();
$table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP'));
$table->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'));
$table->integer('regency_code');
$table->integer('district_code');
$table->string('district_name');
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('districts');
}
};

View File

@@ -0,0 +1,80 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('pbg_task_google_sheet', function (Blueprint $table) {
$table->id();
$table->string('jenis_konsultasi')->nullable();
$table->string('no_registrasi')->nullable()->unique();
$table->string('nama_pemilik')->nullable();
$table->text('lokasi_bg')->nullable();
$table->string('fungsi_bg')->nullable();
$table->string('nama_bangunan')->nullable();
$table->date('tgl_permohonan')->nullable();
$table->string('status_verifikasi')->nullable();
$table->string('status_permohonan')->nullable();
$table->text('alamat_pemilik')->nullable();
$table->string('no_hp')->nullable();
$table->string('email')->nullable();
$table->date('tanggal_catatan')->nullable();
$table->text('catatan_kekurangan_dokumen')->nullable();
$table->string('gambar')->nullable();
$table->string('krk_kkpr')->nullable();
$table->string('no_krk')->nullable();
$table->string('lh')->nullable();
$table->string('ska')->nullable();
$table->text('keterangan')->nullable();
$table->string('helpdesk')->nullable();
$table->string('pj')->nullable();
$table->string('kepemilikan')->nullable();
$table->string('potensi_taru')->nullable();
$table->string('validasi_dinas')->nullable();
$table->string('kategori_retribusi')->nullable();
$table->string('no_urut_ba_tpt')->nullable();
$table->date('tanggal_ba_tpt')->nullable();
$table->string('no_urut_ba_tpa')->nullable();
$table->date('tanggal_ba_tpa')->nullable();
$table->string('no_urut_skrd')->nullable();
$table->date('tanggal_skrd')->nullable();
$table->string('ptsp')->nullable();
$table->string('selesai_terbit')->nullable();
$table->date('tanggal_pembayaran')->nullable();
$table->string('format_sts')->nullable();
$table->integer('tahun_terbit')->nullable();
$table->integer('tahun_berjalan')->nullable();
$table->string('kelurahan')->nullable();
$table->string('kecamatan')->nullable();
$table->decimal('lb', 20,2)->nullable();
$table->decimal('tb', 20, 2)->nullable();
$table->integer('jlb')->nullable();
$table->integer('unit')->nullable();
$table->integer('usulan_retribusi')->nullable();
$table->decimal('nilai_retribusi_keseluruhan_simbg', 20, 2)->nullable();
$table->decimal('nilai_retribusi_keseluruhan_pad', 20, 2)->nullable();
$table->decimal('denda', 20, 2)->nullable();
$table->string('latitude')->nullable();
$table->string('longitude')->nullable();
$table->string('nik_nib')->nullable();
$table->string('dok_tanah')->nullable();
$table->text('temuan')->nullable();
$table->timestamps();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('pbg_task_google_sheet');
}
};

View File

@@ -11,8 +11,8 @@ return new class extends Migration
*/
public function up(): void
{
Schema::table('umkm', function (Blueprint $table) {
Schema::rename('umkm', 'umkms');
Schema::table('pbg_task', function (Blueprint $table) {
$table->string('uuid')->nullable()->unique()->change();
});
}
@@ -21,8 +21,8 @@ return new class extends Migration
*/
public function down(): void
{
Schema::table('umkm', function (Blueprint $table) {
Schema::rename('umkm', 'umkms');
Schema::table('pbg_task', function (Blueprint $table) {
$table->string('uuid')->nullable()->change();
});
}
};

View File

@@ -11,8 +11,8 @@ return new class extends Migration
*/
public function up(): void
{
Schema::table('umkm', function (Blueprint $table) {
$table->renameColumn('distric_code', 'district_code');
Schema::table('pbg_task_index_integrations', function (Blueprint $table) {
$table->string('pbg_task_uid')->unique()->change();
});
}
@@ -21,8 +21,8 @@ return new class extends Migration
*/
public function down(): void
{
Schema::table('umkm', function (Blueprint $table) {
$table->renameColumn('district_code', 'distric_code');
Schema::table('pbg_task_index_integrations', function (Blueprint $table) {
$table->string('pbg_task_uid')->unique()->change();
});
}
};

View File

@@ -11,8 +11,8 @@ return new class extends Migration
*/
public function up(): void
{
Schema::table('tourism', function (Blueprint $table) {
$table->string('district_code')->after('business_address');
Schema::table('pbg_task_retributions', function (Blueprint $table) {
$table->string('detail_id')->unique()->change();
});
}
@@ -21,8 +21,8 @@ return new class extends Migration
*/
public function down(): void
{
Schema::table('tourism', function (Blueprint $table) {
$table->dropColumn('district_code');
Schema::table('pbg_task_retributions', function (Blueprint $table) {
$table->string('detail_id')->unique()->change();
});
}
};

View File

@@ -1,43 +0,0 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('advertisements', function (Blueprint $table) {
$table->id();
$table->timestamps();
$table->integer('no');
$table->string('business_name');
$table->string('npwpd');
$table->string('advertisement_type');
$table->string('advertisement_content');
$table->string('business_address');
$table->string('advertisement_location');
$table->integer('village_code');
$table->integer('district_code');
$table->float('length');
$table->float('width');
$table->string('viewing_angle');
$table->string('face');
$table->string('area');
$table->string('angle');
$table->string('contact');
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('advertisements');
}
};

View File

@@ -1,31 +0,0 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('villages', function (Blueprint $table) {
$table->id();
$table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP'));
$table->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'));
$table->integer('district_code');
$table->string('village_code');
$table->string('village_name');
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('villages');
}
};

View File

@@ -1,32 +0,0 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
//
Schema::table('advertisements', function (Blueprint $table) {
// Mengubah tipe data kolom 'village_code' menjadi BIGINT
$table->string('village_code')->change();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
//
Schema::table('advertisements', function (Blueprint $table) {
// Mengubah kembali tipe data kolom 'village_code' ke tipe sebelumnya (misalnya INT)
$table->integer('village_code')->change();
});
}
};

View File

@@ -1,46 +0,0 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('umkm', function (Blueprint $table) {
$table->id();
$table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP'));
$table->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'));
$table->string('business_name');
$table->string('business_address');
$table->string('business_desc');
$table->string('business_contact');
$table->string('business_id_number')->nullable();
$table->integer('business_scale_id');
$table->string('owner_id');
$table->string('owner_name');
$table->string('owner_address');
$table->string('owner_contact');
$table->string('business_type');
$table->string('business_form');
$table->decimal('revenue');
$table->string('village_code');
$table->integer('distric_code');
$table->integer('number_of_employee');
$table->float('land_area')->nullable();
$table->integer('permit_status_id');
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('umkm');
}
};

View File

@@ -1,29 +0,0 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('business_scale', function (Blueprint $table) {
$table->id();
$table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP'));
$table->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'));
$table->string('business_scale');
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('business_scale');
}
};

View File

@@ -1,29 +0,0 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('permit_status', function (Blueprint $table) {
$table->id();
$table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP'));
$table->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'));
$table->string('permit_status');
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('permit_status');
}
};

View File

@@ -1,30 +0,0 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::table('umkm', function (Blueprint $table) {
$table->dropColumn('business_form');
$table->integer('business_form_id')->nullable();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::table('umkm', function (Blueprint $table) {
$table->dropColumn('business_form_id');
$table->string('business_form')->nullable();
});
}
};

View File

@@ -1,36 +0,0 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::table('umkms', function (Blueprint $table) {
// Mengubah kolom 'revenue' menjadi decimal(20, 2)
$table->decimal('revenue', 20, 2)->change();
// Mengubah kolom 'land_area' menjadi decimal(20, 2)
$table->integer('land_area')->nullable()->change();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::table('umkm', function (Blueprint $table) {
// Mengembalikan kolom 'revenue' ke decimal default (jika ada)
$table->decimal('revenue')->change();
// Mengembalikan kolom 'land_area' ke tipe sebelumnya (float atau lainnya)
$table->float('land_area')->nullable()->change();
});
}
};

View File

@@ -1,36 +0,0 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('tourism', function (Blueprint $table) {
$table->id();
$table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP'));
$table->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'));
$table->string('business_name');
$table->string('project_name');
$table->string('business_address');
$table->string('village_code');
$table->string('land_area');
$table->string('investment_amount');
$table->string('number_of_employee');
$table->string('business_type_id');
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('tourism');
}
};

View File

@@ -1,29 +0,0 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('business_type', function (Blueprint $table) {
$table->id();
$table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP'));
$table->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'));
$table->string('business_type');
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('business_type');
}
};

View File

@@ -1,24 +0,0 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::rename('tourism', 'tourisms');
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::rename('tourisms', 'tourism');
}
};

View File

@@ -1,36 +0,0 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::table('tourisms', function (Blueprint $table) {
$table->integer('project_id')->nullable()->after('id');
$table->string('jenis_proyek')->nullable()->after('project_id');
$table->string('nib')->nullable()->after('jenis_proyek');
$table->integer('business_scale_id')->nullable()->after('project_name');
$table->date('terbit_oss')->nullable()->after('business_name');
$table->string('status_penanaman_modal')->nullable()->after('terbit_oss');
$table->string('business_form')->nullable()->after('status_penanaman_modal');
$table->string('uraian_resiko_proyek')->nullable()->after('business_form');
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::table('tourisms', function (Blueprint $table) {
$table->dropColumn(['project_id', 'jenis_proyek', 'nib', 'business_scale_id', 'terbit_oss',
'status_penanaman_modal', 'business_form', 'uraian_resiko_proyek']);
});
}
};

View File

@@ -1,32 +0,0 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::table('tourisms', function (Blueprint $table) {
$table->string('project_id')->change();
$table->integer('district_code')->change();
$table->integer('business_type_id')->change();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::table('tourisms', function (Blueprint $table) {
$table->integer('project_id')->change();
$table->string('district_code')->change();
$table->string('business_type_id')->change();
});
}
};

View File

@@ -1,26 +0,0 @@
<?php
namespace Database\Seeders;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
class BusinessFormSeeder extends Seeder
{
/**
* Run the database seeds.
*/
public function run(): void
{
DB::table('business_form')->insert([
['business_form' => 'Perseorangan'],
['business_form' => 'Persekutuan'],
['business_form' => 'Koperasi'],
['business_form' => 'CV'],
['business_form' => 'PT'],
['business_form' => 'PTTB'],
['business_form' => 'Perseroan'],
]);
}
}

View File

@@ -1,22 +0,0 @@
<?php
namespace Database\Seeders;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
class BusinessScaleSeeder extends Seeder
{
/**
* Run the database seeds.
*/
public function run(): void
{
DB::table('business_scale')->insert([
['business_scale' => 'Micro'],
['business_scale' => 'Kecil'],
['business_scale' => 'Menengah'],
]);
}
}

View File

@@ -1,28 +0,0 @@
<?php
namespace Database\Seeders;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
class BusinessTypeSeeder extends Seeder
{
/**
* Run the database seeds.
*/
public function run(): void
{
DB::table('business_type')->insert([
['business_type' => 'Villas'],
['business_type' => 'Hotels'],
['business_type' => 'Restaurants / Food Stores'],
['business_type' => 'Cafes'],
['business_type' => 'Adventure / Outdoor Activities'],
['business_type' => 'Event Organizers'],
['business_type' => 'Travel & Tours'],
['business_type' => 'Miscellaneous'],
['business_type' => 'Others'],
]);
}
}

View File

@@ -0,0 +1,35 @@
<?php
namespace Database\Seeders;
use App\Models\DataSetting;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
class DataSettingSeeder extends Seeder
{
/**
* Run the database seeds.
*/
public function run(): void
{
$data_settings = [
[
"key" => "TARGET_PAD",
"value" => "33.200.000.000",
"type" => "integer"
]
];
foreach ($data_settings as $setting) {
DataSetting::updateOrCreate([
"key" => $setting["key"],
],[
"value" => $setting["value"],
"type" => $setting["type"],
"created_at" => now(),
"updated_at" => now(),
]);
}
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -1,22 +0,0 @@
<?php
namespace Database\Seeders;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
class PermitStatusSeeder extends Seeder
{
/**
* Run the database seeds.
*/
public function run(): void
{
DB::table('permit_status')->insert([
['permit_status' => 'Not Registered'],
['permit_status' => 'Registered'],
['permit_status' => 'Application Process'],
]);
}
}

View File

@@ -1,56 +0,0 @@
<?php
namespace Database\Seeders;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
class ProvinceSeeder extends Seeder
{
/**
* Run the database seeds.
*/
public function run(): void
{
DB::table('provincies')->insert([
['province_code' => 11, 'province_name' => 'ACEH'],
['province_code' => 12, 'province_name' => 'SUMATERA UTARA'],
['province_code' => 13, 'province_name' => 'SUMATERA BARAT'],
['province_code' => 14, 'province_name' => 'RIAU'],
['province_code' => 15, 'province_name' => 'JAMBI'],
['province_code' => 16, 'province_name' => 'SUMATERA SELATAN'],
['province_code' => 17, 'province_name' => 'BENGKULU'],
['province_code' => 18, 'province_name' => 'LAMPUNG'],
['province_code' => 19, 'province_name' => 'KEPULAUAN BANGKA BELITUNG'],
['province_code' => 21, 'province_name' => 'KEPULAUAN RIAU'],
['province_code' => 31, 'province_name' => 'DKI JAKARTA'],
['province_code' => 32, 'province_name' => 'JAWA BARAT'],
['province_code' => 33, 'province_name' => 'JAWA TENGAH'],
['province_code' => 34, 'province_name' => 'DAERAH ISTIMEWA YOGYAKARTA'],
['province_code' => 35, 'province_name' => 'JAWA TIMUR'],
['province_code' => 36, 'province_name' => 'BANTEN'],
['province_code' => 51, 'province_name' => 'BALI'],
['province_code' => 52, 'province_name' => 'NUSA TENGGARA BARAT'],
['province_code' => 53, 'province_name' => 'NUSA TENGGARA TIMUR'],
['province_code' => 61, 'province_name' => 'KALIMANTAN BARAT'],
['province_code' => 62, 'province_name' => 'KALIMANTAN TENGAH'],
['province_code' => 63, 'province_name' => 'KALIMANTAN SELATAN'],
['province_code' => 64, 'province_name' => 'KALIMANTAN TIMUR'],
['province_code' => 65, 'province_name' => 'KALIMANTAN UTARA'],
['province_code' => 71, 'province_name' => 'SULAWESI UTARA'],
['province_code' => 72, 'province_name' => 'SULAWESI TENGAH'],
['province_code' => 73, 'province_name' => 'SULAWESI SELATAN'],
['province_code' => 74, 'province_name' => 'SULAWESI TENGGARA'],
['province_code' => 75, 'province_name' => 'GORONTALO'],
['province_code' => 76, 'province_name' => 'SULAWESI BARAT'],
['province_code' => 81, 'province_name' => 'MALUKU'],
['province_code' => 82, 'province_name' => 'MALUKU UTARA'],
['province_code' => 91, 'province_name' => 'PAPUA'],
['province_code' => 92, 'province_name' => 'PAPUA BARAT'],
['province_code' => 93, 'province_name' => 'PAPUA SELATAN'],
['province_code' => 94, 'province_name' => 'PAPUA TENGAH'],
['province_code' => 95, 'province_name' => 'PAPUA PEGUNUNGAN'],
]);
}
}

View File

@@ -1,533 +0,0 @@
<?php
namespace Database\Seeders;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
class RegenciesSeeder extends Seeder
{
/**
* Run the database seeds.
*/
public function run(): void
{
DB::table('regencies')->insert([
['regency_code' => '1101', 'province_code' => '11', 'regency_name' => 'KAB. ACEH SELATAN'],
['regency_code' => '1102', 'province_code' => '11', 'regency_name' => 'KAB. ACEH TENGGARA'],
['regency_code' => '1103', 'province_code' => '11', 'regency_name' => 'KAB. ACEH TIMUR'],
['regency_code' => '1104', 'province_code' => '11', 'regency_name' => 'KAB. ACEH TENGAH'],
['regency_code' => '1105', 'province_code' => '11', 'regency_name' => 'KAB. ACEH BARAT'],
['regency_code' => '1106', 'province_code' => '11', 'regency_name' => 'KAB. ACEH BESAR'],
['regency_code' => '1107', 'province_code' => '11', 'regency_name' => 'KAB. PIDIE'],
['regency_code' => '1108', 'province_code' => '11', 'regency_name' => 'KAB. ACEH UTARA'],
['regency_code' => '1109', 'province_code' => '11', 'regency_name' => 'KAB. SIMEULUE'],
['regency_code' => '1110', 'province_code' => '11', 'regency_name' => 'KAB. ACEH SINGKIL'],
['regency_code' => '1111', 'province_code' => '11', 'regency_name' => 'KAB. BIREUEN'],
['regency_code' => '1112', 'province_code' => '11', 'regency_name' => 'KAB. ACEH BARAT DAYA'],
['regency_code' => '1113', 'province_code' => '11', 'regency_name' => 'KAB. GAYO LUES'],
['regency_code' => '1114', 'province_code' => '11', 'regency_name' => 'KAB. ACEH JAYA'],
['regency_code' => '1115', 'province_code' => '11', 'regency_name' => 'KAB. NAGAN RAYA'],
['regency_code' => '1116', 'province_code' => '11', 'regency_name' => 'KAB. ACEH TAMIANG'],
['regency_code' => '1117', 'province_code' => '11', 'regency_name' => 'KAB. BENER MERIAH'],
['regency_code' => '1118', 'province_code' => '11', 'regency_name' => 'KAB. PIDIE JAYA'],
['regency_code' => '1171', 'province_code' => '11', 'regency_name' => 'KOTA BANDA ACEH'],
['regency_code' => '1172', 'province_code' => '11', 'regency_name' => 'KOTA SABANG'],
['regency_code' => '1173', 'province_code' => '11', 'regency_name' => 'KOTA LHOKSEUMAWE'],
['regency_code' => '1174', 'province_code' => '11', 'regency_name' => 'KOTA LANGSA'],
['regency_code' => '1175', 'province_code' => '11', 'regency_name' => 'KOTA SUBULUSSALAM'],
['regency_code' => '1201', 'province_code' => '12', 'regency_name' => 'KAB. TAPANULI TENGAH'],
['regency_code' => '1202', 'province_code' => '12', 'regency_name' => 'KAB. TAPANULI UTARA'],
['regency_code' => '1203', 'province_code' => '12', 'regency_name' => 'KAB. TAPANULI SELATAN'],
['regency_code' => '1204', 'province_code' => '12', 'regency_name' => 'KAB. NIAS'],
['regency_code' => '1205', 'province_code' => '12', 'regency_name' => 'KAB. LANGKAT'],
['regency_code' => '1206', 'province_code' => '12', 'regency_name' => 'KAB. KARO'],
['regency_code' => '1207', 'province_code' => '12', 'regency_name' => 'KAB. DELI SERDANG'],
['regency_code' => '1208', 'province_code' => '12', 'regency_name' => 'KAB. SIMALUNGUN'],
['regency_code' => '1209', 'province_code' => '12', 'regency_name' => 'KAB. ASAHAN'],
['regency_code' => '1210', 'province_code' => '12', 'regency_name' => 'KAB. LABUHANBATU'],
['regency_code' => '1211', 'province_code' => '12', 'regency_name' => 'KAB. DAIRI'],
['regency_code' => '1212', 'province_code' => '12', 'regency_name' => 'KAB. TOBA'],
['regency_code' => '1213', 'province_code' => '12', 'regency_name' => 'KAB. MANDAILING NATAL'],
['regency_code' => '1214', 'province_code' => '12', 'regency_name' => 'KAB. NIAS SELATAN'],
['regency_code' => '1215', 'province_code' => '12', 'regency_name' => 'KAB. PAKPAK BHARAT'],
['regency_code' => '1216', 'province_code' => '12', 'regency_name' => 'KAB. HUMBANG HASUNDUTAN'],
['regency_code' => '1217', 'province_code' => '12', 'regency_name' => 'KAB. SAMOSIR'],
['regency_code' => '1218', 'province_code' => '12', 'regency_name' => 'KAB. SERDANG BEDAGAI'],
['regency_code' => '1219', 'province_code' => '12', 'regency_name' => 'KAB. BATU BARA'],
['regency_code' => '1220', 'province_code' => '12', 'regency_name' => 'KAB. PADANG LAWAS UTARA'],
['regency_code' => '1221', 'province_code' => '12', 'regency_name' => 'KAB. PADANG LAWAS'],
['regency_code' => '1222', 'province_code' => '12', 'regency_name' => 'KAB. LABUHANBATU SELATAN'],
['regency_code' => '1223', 'province_code' => '12', 'regency_name' => 'KAB. LABUHANBATU UTARA'],
['regency_code' => '1224', 'province_code' => '12', 'regency_name' => 'KAB. NIAS UTARA'],
['regency_code' => '1225', 'province_code' => '12', 'regency_name' => 'KAB. NIAS BARAT'],
['regency_code' => '1271', 'province_code' => '12', 'regency_name' => 'KOTA MEDAN'],
['regency_code' => '1272', 'province_code' => '12', 'regency_name' => 'KOTA PEMATANGSIANTAR'],
['regency_code' => '1273', 'province_code' => '12', 'regency_name' => 'KOTA SIBOLGA'],
['regency_code' => '1274', 'province_code' => '12', 'regency_name' => 'KOTA TANJUNG BALAI'],
['regency_code' => '1275', 'province_code' => '12', 'regency_name' => 'KOTA BINJAI'],
['regency_code' => '1276', 'province_code' => '12', 'regency_name' => 'KOTA TEBING TINGGI'],
['regency_code' => '1277', 'province_code' => '12', 'regency_name' => 'KOTA PADANGSIDIMPUAN'],
['regency_code' => '1278', 'province_code' => '12', 'regency_name' => 'KOTA GUNUNGSITOLI'],
['regency_code' => '1301', 'province_code' => '13', 'regency_name' => 'KAB. PESISIR SELATAN'],
['regency_code' => '1302', 'province_code' => '13', 'regency_name' => 'KAB. SOLOK'],
['regency_code' => '1303', 'province_code' => '13', 'regency_name' => 'KAB. SIJUNJUNG'],
['regency_code' => '1304', 'province_code' => '13', 'regency_name' => 'KAB. TANAH DATAR'],
['regency_code' => '1305', 'province_code' => '13', 'regency_name' => 'KAB. PADANG PARIAMAN'],
['regency_code' => '1306', 'province_code' => '13', 'regency_name' => 'KAB. AGAM'],
['regency_code' => '1307', 'province_code' => '13', 'regency_name' => 'KAB. LIMA PULUH KOTA'],
['regency_code' => '1308', 'province_code' => '13', 'regency_name' => 'KAB. PASAMAN'],
['regency_code' => '1309', 'province_code' => '13', 'regency_name' => 'KAB. KEPULAUAN MENTAWAI'],
['regency_code' => '1310', 'province_code' => '13', 'regency_name' => 'KAB. DHARMASRAYA'],
['regency_code' => '1311', 'province_code' => '13', 'regency_name' => 'KAB. SOLOK SELATAN'],
['regency_code' => '1312', 'province_code' => '13', 'regency_name' => 'KAB. PASAMAN BARAT'],
['regency_code' => '1371', 'province_code' => '13', 'regency_name' => 'KOTA PADANG'],
['regency_code' => '1372', 'province_code' => '13', 'regency_name' => 'KOTA SOLOK'],
['regency_code' => '1373', 'province_code' => '13', 'regency_name' => 'KOTA SAWAHLUNTO'],
['regency_code' => '1374', 'province_code' => '13', 'regency_name' => 'KOTA PADANG PANJANG'],
['regency_code' => '1375', 'province_code' => '13', 'regency_name' => 'KOTA BUKITTINGGI'],
['regency_code' => '1376', 'province_code' => '13', 'regency_name' => 'KOTA PAYAKUMBUH'],
['regency_code' => '1377', 'province_code' => '13', 'regency_name' => 'KOTA PARIAMAN'],
['regency_code' => '1401', 'province_code' => '14', 'regency_name' => 'KAB. KAMPAR'],
['regency_code' => '1402', 'province_code' => '14', 'regency_name' => 'KAB. INDRAGIRI HULU'],
['regency_code' => '1403', 'province_code' => '14', 'regency_name' => 'KAB. BENGKALIS'],
['regency_code' => '1404', 'province_code' => '14', 'regency_name' => 'KAB. INDRAGIRI HILIR'],
['regency_code' => '1405', 'province_code' => '14', 'regency_name' => 'KAB. PELALAWAN'],
['regency_code' => '1406', 'province_code' => '14', 'regency_name' => 'KAB. ROKAN HULU'],
['regency_code' => '1407', 'province_code' => '14', 'regency_name' => 'KAB. ROKAN HILIR'],
['regency_code' => '1408', 'province_code' => '14', 'regency_name' => 'KAB. SIAK'],
['regency_code' => '1409', 'province_code' => '14', 'regency_name' => 'KAB. KUANTAN SINGINGI'],
['regency_code' => '1410', 'province_code' => '14', 'regency_name' => 'KAB. KEPULAUAN MERANTI'],
['regency_code' => '1471', 'province_code' => '14', 'regency_name' => 'KOTA PEKANBARU'],
['regency_code' => '1472', 'province_code' => '14', 'regency_name' => 'KOTA DUMAI'],
['regency_code' => '1501', 'province_code' => '15', 'regency_name' => 'KAB. KERINCI'],
['regency_code' => '1502', 'province_code' => '15', 'regency_name' => 'KAB. MERANGIN'],
['regency_code' => '1503', 'province_code' => '15', 'regency_name' => 'KAB. SAROLANGUN'],
['regency_code' => '1504', 'province_code' => '15', 'regency_name' => 'KAB. BATANGHARI'],
['regency_code' => '1505', 'province_code' => '15', 'regency_name' => 'KAB. MUARO JAMBI'],
['regency_code' => '1506', 'province_code' => '15', 'regency_name' => 'KAB. TANJUNG JABUNG BARAT'],
['regency_code' => '1507', 'province_code' => '15', 'regency_name' => 'KAB. TANJUNG JABUNG TIMUR'],
['regency_code' => '1508', 'province_code' => '15', 'regency_name' => 'KAB. BUNGO'],
['regency_code' => '1509', 'province_code' => '15', 'regency_name' => 'KAB. TEBO'],
['regency_code' => '1571', 'province_code' => '15', 'regency_name' => 'KOTA JAMBI'],
['regency_code' => '1572', 'province_code' => '15', 'regency_name' => 'KOTA SUNGAI PENUH'],
['regency_code' => '1601', 'province_code' => '16', 'regency_name' => 'KAB. OGAN KOMERING ULU'],
['regency_code' => '1602', 'province_code' => '16', 'regency_name' => 'KAB. OGAN KOMERING ILIR'],
['regency_code' => '1603', 'province_code' => '16', 'regency_name' => 'KAB. MUARA ENIM'],
['regency_code' => '1604', 'province_code' => '16', 'regency_name' => 'KAB. LAHAT'],
['regency_code' => '1605', 'province_code' => '16', 'regency_name' => 'KAB. MUSI RAWAS'],
['regency_code' => '1606', 'province_code' => '16', 'regency_name' => 'KAB. MUSI BANYUASIN'],
['regency_code' => '1607', 'province_code' => '16', 'regency_name' => 'KAB. BANYUASIN'],
['regency_code' => '1608', 'province_code' => '16', 'regency_name' => 'KAB. OGAN KOMERING ULU TIMUR'],
['regency_code' => '1609', 'province_code' => '16', 'regency_name' => 'KAB. OGAN KOMERING ULU SELATAN'],
['regency_code' => '1610', 'province_code' => '16', 'regency_name' => 'KAB. OGAN ILIR'],
['regency_code' => '1611', 'province_code' => '16', 'regency_name' => 'KAB. EMPAT LAWANG'],
['regency_code' => '1612', 'province_code' => '16', 'regency_name' => 'KAB. PENUKAL ABAB LEMATANG ILIR'],
['regency_code' => '1613', 'province_code' => '16', 'regency_name' => 'KAB. MUSI RAWAS UTARA'],
['regency_code' => '1671', 'province_code' => '16', 'regency_name' => 'KOTA PALEMBANG'],
['regency_code' => '1672', 'province_code' => '16', 'regency_name' => 'KOTA PAGAR ALAM'],
['regency_code' => '1673', 'province_code' => '16', 'regency_name' => 'KOTA LUBUK LINGGAU'],
['regency_code' => '1674', 'province_code' => '16', 'regency_name' => 'KOTA PRABUMULIH'],
['regency_code' => '1701', 'province_code' => '17', 'regency_name' => 'KAB. BENGKULU SELATAN'],
['regency_code' => '1702', 'province_code' => '17', 'regency_name' => 'KAB. REJANG LEBONG'],
['regency_code' => '1703', 'province_code' => '17', 'regency_name' => 'KAB. BENGKULU UTARA'],
['regency_code' => '1704', 'province_code' => '17', 'regency_name' => 'KAB. KAUR'],
['regency_code' => '1705', 'province_code' => '17', 'regency_name' => 'KAB. SELUMA'],
['regency_code' => '1706', 'province_code' => '17', 'regency_name' => 'KAB. MUKO MUKO'],
['regency_code' => '1707', 'province_code' => '17', 'regency_name' => 'KAB. LEBONG'],
['regency_code' => '1708', 'province_code' => '17', 'regency_name' => 'KAB. KEPAHIANG'],
['regency_code' => '1709', 'province_code' => '17', 'regency_name' => 'KAB. BENGKULU TENGAH'],
['regency_code' => '1771', 'province_code' => '17', 'regency_name' => 'KOTA BENGKULU'],
['regency_code' => '1801', 'province_code' => '18', 'regency_name' => 'KAB. LAMPUNG SELATAN'],
['regency_code' => '1802', 'province_code' => '18', 'regency_name' => 'KAB. LAMPUNG TENGAH'],
['regency_code' => '1803', 'province_code' => '18', 'regency_name' => 'KAB. LAMPUNG UTARA'],
['regency_code' => '1804', 'province_code' => '18', 'regency_name' => 'KAB. LAMPUNG BARAT'],
['regency_code' => '1805', 'province_code' => '18', 'regency_name' => 'KAB. TULANG BAWANG'],
['regency_code' => '1806', 'province_code' => '18', 'regency_name' => 'KAB. TANGGAMUS'],
['regency_code' => '1807', 'province_code' => '18', 'regency_name' => 'KAB. LAMPUNG TIMUR'],
['regency_code' => '1808', 'province_code' => '18', 'regency_name' => 'KAB. WAY KANAN'],
['regency_code' => '1809', 'province_code' => '18', 'regency_name' => 'KAB. PESAWARAN'],
['regency_code' => '1810', 'province_code' => '18', 'regency_name' => 'KAB. PRINGSEWU'],
['regency_code' => '1811', 'province_code' => '18', 'regency_name' => 'KAB. MESUJI'],
['regency_code' => '1812', 'province_code' => '18', 'regency_name' => 'KAB. TULANG BAWANG BARAT'],
['regency_code' => '1813', 'province_code' => '18', 'regency_name' => 'KAB. PESISIR BARAT'],
['regency_code' => '1871', 'province_code' => '18', 'regency_name' => 'KOTA BANDAR LAMPUNG'],
['regency_code' => '1872', 'province_code' => '18', 'regency_name' => 'KOTA METRO'],
['regency_code' => '1901', 'province_code' => '19', 'regency_name' => 'KAB. BANGKA'],
['regency_code' => '1902', 'province_code' => '19', 'regency_name' => 'KAB. BELITUNG'],
['regency_code' => '1903', 'province_code' => '19', 'regency_name' => 'KAB. BANGKA SELATAN'],
['regency_code' => '1904', 'province_code' => '19', 'regency_name' => 'KAB. BANGKA TENGAH'],
['regency_code' => '1905', 'province_code' => '19', 'regency_name' => 'KAB. BANGKA BARAT'],
['regency_code' => '1906', 'province_code' => '19', 'regency_name' => 'KAB. BELITUNG TIMUR'],
['regency_code' => '1971', 'province_code' => '19', 'regency_name' => 'KOTA PANGKAL PINANG'],
['regency_code' => '2101', 'province_code' => '21', 'regency_name' => 'KAB. BINTAN'],
['regency_code' => '2102', 'province_code' => '21', 'regency_name' => 'KAB. KARIMUN'],
['regency_code' => '2103', 'province_code' => '21', 'regency_name' => 'KAB. NATUNA'],
['regency_code' => '2104', 'province_code' => '21', 'regency_name' => 'KAB. LINGGA'],
['regency_code' => '2105', 'province_code' => '21', 'regency_name' => 'KAB. KEPULAUAN ANAMBAS'],
['regency_code' => '2171', 'province_code' => '21', 'regency_name' => 'KOTA BATAM'],
['regency_code' => '2172', 'province_code' => '21', 'regency_name' => 'KOTA TANJUNG PINANG'],
['regency_code' => '3101', 'province_code' => '31', 'regency_name' => 'KAB. ADM. KEP. SERIBU'],
['regency_code' => '3171', 'province_code' => '31', 'regency_name' => 'KOTA ADM. JAKARTA PUSAT'],
['regency_code' => '3172', 'province_code' => '31', 'regency_name' => 'KOTA ADM. JAKARTA UTARA'],
['regency_code' => '3173', 'province_code' => '31', 'regency_name' => 'KOTA ADM. JAKARTA BARAT'],
['regency_code' => '3174', 'province_code' => '31', 'regency_name' => 'KOTA ADM. JAKARTA SELATAN'],
['regency_code' => '3175', 'province_code' => '31', 'regency_name' => 'KOTA ADM. JAKARTA TIMUR'],
['regency_code' => '3201', 'province_code' => '32', 'regency_name' => 'KAB. BOGOR'],
['regency_code' => '3202', 'province_code' => '32', 'regency_name' => 'KAB. SUKABUMI'],
['regency_code' => '3203', 'province_code' => '32', 'regency_name' => 'KAB. CIANJUR'],
['regency_code' => '3204', 'province_code' => '32', 'regency_name' => 'KAB. BANDUNG'],
['regency_code' => '3205', 'province_code' => '32', 'regency_name' => 'KAB. GARUT'],
['regency_code' => '3206', 'province_code' => '32', 'regency_name' => 'KAB. TASIKMALAYA'],
['regency_code' => '3207', 'province_code' => '32', 'regency_name' => 'KAB. CIAMIS'],
['regency_code' => '3208', 'province_code' => '32', 'regency_name' => 'KAB. KUNINGAN'],
['regency_code' => '3209', 'province_code' => '32', 'regency_name' => 'KAB. CIREBON'],
['regency_code' => '3210', 'province_code' => '32', 'regency_name' => 'KAB. MAJALENGKA'],
['regency_code' => '3211', 'province_code' => '32', 'regency_name' => 'KAB. SUMEDANG'],
['regency_code' => '3212', 'province_code' => '32', 'regency_name' => 'KAB. INDRAMAYU'],
['regency_code' => '3213', 'province_code' => '32', 'regency_name' => 'KAB. SUBANG'],
['regency_code' => '3214', 'province_code' => '32', 'regency_name' => 'KAB. PURWAKARTA'],
['regency_code' => '3215', 'province_code' => '32', 'regency_name' => 'KAB. KARAWANG'],
['regency_code' => '3216', 'province_code' => '32', 'regency_name' => 'KAB. BEKASI'],
['regency_code' => '3217', 'province_code' => '32', 'regency_name' => 'KAB. BANDUNG BARAT'],
['regency_code' => '3218', 'province_code' => '32', 'regency_name' => 'KAB. PANGANDARAN'],
['regency_code' => '3271', 'province_code' => '32', 'regency_name' => 'KOTA BOGOR'],
['regency_code' => '3272', 'province_code' => '32', 'regency_name' => 'KOTA SUKABUMI'],
['regency_code' => '3273', 'province_code' => '32', 'regency_name' => 'KOTA BANDUNG'],
['regency_code' => '3274', 'province_code' => '32', 'regency_name' => 'KOTA CIREBON'],
['regency_code' => '3275', 'province_code' => '32', 'regency_name' => 'KOTA BEKASI'],
['regency_code' => '3276', 'province_code' => '32', 'regency_name' => 'KOTA DEPOK'],
['regency_code' => '3277', 'province_code' => '32', 'regency_name' => 'KOTA CIMAHI'],
['regency_code' => '3278', 'province_code' => '32', 'regency_name' => 'KOTA TASIKMALAYA'],
['regency_code' => '3279', 'province_code' => '32', 'regency_name' => 'KOTA BANJAR'],
['regency_code' => '3301', 'province_code' => '33', 'regency_name' => 'KAB. CILACAP'],
['regency_code' => '3302', 'province_code' => '33', 'regency_name' => 'KAB. BANYUMAS'],
['regency_code' => '3303', 'province_code' => '33', 'regency_name' => 'KAB. PURBALINGGA'],
['regency_code' => '3304', 'province_code' => '33', 'regency_name' => 'KAB. BANJARNEGARA'],
['regency_code' => '3305', 'province_code' => '33', 'regency_name' => 'KAB. KEBUMEN'],
['regency_code' => '3306', 'province_code' => '33', 'regency_name' => 'KAB. PURWOREJO'],
['regency_code' => '3307', 'province_code' => '33', 'regency_name' => 'KAB. WONOSOBO'],
['regency_code' => '3308', 'province_code' => '33', 'regency_name' => 'KAB. MAGELANG'],
['regency_code' => '3309', 'province_code' => '33', 'regency_name' => 'KAB. BOYOLALI'],
['regency_code' => '3310', 'province_code' => '33', 'regency_name' => 'KAB. KLATEN'],
['regency_code' => '3311', 'province_code' => '33', 'regency_name' => 'KAB. SUKOHARJO'],
['regency_code' => '3312', 'province_code' => '33', 'regency_name' => 'KAB. WONOGIRI'],
['regency_code' => '3313', 'province_code' => '33', 'regency_name' => 'KAB. KARANGANYAR'],
['regency_code' => '3314', 'province_code' => '33', 'regency_name' => 'KAB. SRAGEN'],
['regency_code' => '3315', 'province_code' => '33', 'regency_name' => 'KAB. GROBOGAN'],
['regency_code' => '3316', 'province_code' => '33', 'regency_name' => 'KAB. BLORA'],
['regency_code' => '3317', 'province_code' => '33', 'regency_name' => 'KAB. REMBANG'],
['regency_code' => '3318', 'province_code' => '33', 'regency_name' => 'KAB. PATI'],
['regency_code' => '3319', 'province_code' => '33', 'regency_name' => 'KAB. KUDUS'],
['regency_code' => '3320', 'province_code' => '33', 'regency_name' => 'KAB. JEPARA'],
['regency_code' => '3321', 'province_code' => '33', 'regency_name' => 'KAB. DEMAK'],
['regency_code' => '3322', 'province_code' => '33', 'regency_name' => 'KAB. SEMARANG'],
['regency_code' => '3323', 'province_code' => '33', 'regency_name' => 'KAB. TEMANGGUNG'],
['regency_code' => '3324', 'province_code' => '33', 'regency_name' => 'KAB. KENDAL'],
['regency_code' => '3325', 'province_code' => '33', 'regency_name' => 'KAB. BATANG'],
['regency_code' => '3326', 'province_code' => '33', 'regency_name' => 'KAB. PEKALONGAN'],
['regency_code' => '3327', 'province_code' => '33', 'regency_name' => 'KAB. PEMALANG'],
['regency_code' => '3328', 'province_code' => '33', 'regency_name' => 'KAB. TEGAL'],
['regency_code' => '3329', 'province_code' => '33', 'regency_name' => 'KAB. BREBES'],
['regency_code' => '3371', 'province_code' => '33', 'regency_name' => 'KOTA MAGELANG'],
['regency_code' => '3372', 'province_code' => '33', 'regency_name' => 'KOTA SURAKARTA'],
['regency_code' => '3373', 'province_code' => '33', 'regency_name' => 'KOTA SALATIGA'],
['regency_code' => '3374', 'province_code' => '33', 'regency_name' => 'KOTA SEMARANG'],
['regency_code' => '3375', 'province_code' => '33', 'regency_name' => 'KOTA PEKALONGAN'],
['regency_code' => '3376', 'province_code' => '33', 'regency_name' => 'KOTA TEGAL'],
['regency_code' => '3401', 'province_code' => '34', 'regency_name' => 'KAB. KULON PROGO'],
['regency_code' => '3402', 'province_code' => '34', 'regency_name' => 'KAB. BANTUL'],
['regency_code' => '3403', 'province_code' => '34', 'regency_name' => 'KAB. GUNUNGKIDUL'],
['regency_code' => '3404', 'province_code' => '34', 'regency_name' => 'KAB. SLEMAN'],
['regency_code' => '3471', 'province_code' => '34', 'regency_name' => 'KOTA YOGYAKARTA'],
['regency_code' => '3501', 'province_code' => '35', 'regency_name' => 'KAB. PACITAN'],
['regency_code' => '3502', 'province_code' => '35', 'regency_name' => 'KAB. PONOROGO'],
['regency_code' => '3503', 'province_code' => '35', 'regency_name' => 'KAB. TRENGGALEK'],
['regency_code' => '3504', 'province_code' => '35', 'regency_name' => 'KAB. TULUNGAGUNG'],
['regency_code' => '3505', 'province_code' => '35', 'regency_name' => 'KAB. BLITAR'],
['regency_code' => '3506', 'province_code' => '35', 'regency_name' => 'KAB. KEDIRI'],
['regency_code' => '3507', 'province_code' => '35', 'regency_name' => 'KAB. MALANG'],
['regency_code' => '3508', 'province_code' => '35', 'regency_name' => 'KAB. LUMAJANG'],
['regency_code' => '3509', 'province_code' => '35', 'regency_name' => 'KAB. JEMBER'],
['regency_code' => '3510', 'province_code' => '35', 'regency_name' => 'KAB. BANYUWANGI'],
['regency_code' => '3511', 'province_code' => '35', 'regency_name' => 'KAB. BONDOWOSO'],
['regency_code' => '3512', 'province_code' => '35', 'regency_name' => 'KAB. SITUBONDO'],
['regency_code' => '3513', 'province_code' => '35', 'regency_name' => 'KAB. PROBOLINGGO'],
['regency_code' => '3514', 'province_code' => '35', 'regency_name' => 'KAB. PASURUAN'],
['regency_code' => '3515', 'province_code' => '35', 'regency_name' => 'KAB. SIDOARJO'],
['regency_code' => '3516', 'province_code' => '35', 'regency_name' => 'KAB. MOJOKERTO'],
['regency_code' => '3517', 'province_code' => '35', 'regency_name' => 'KAB. JOMBANG'],
['regency_code' => '3518', 'province_code' => '35', 'regency_name' => 'KAB. NGANJUK'],
['regency_code' => '3519', 'province_code' => '35', 'regency_name' => 'KAB. MADIUN'],
['regency_code' => '3520', 'province_code' => '35', 'regency_name' => 'KAB. MAGETAN'],
['regency_code' => '3521', 'province_code' => '35', 'regency_name' => 'KAB. NGAWI'],
['regency_code' => '3522', 'province_code' => '35', 'regency_name' => 'KAB. BOJONEGORO'],
['regency_code' => '3523', 'province_code' => '35', 'regency_name' => 'KAB. TUBAN'],
['regency_code' => '3524', 'province_code' => '35', 'regency_name' => 'KAB. LAMONGAN'],
['regency_code' => '3525', 'province_code' => '35', 'regency_name' => 'KAB. GRESIK'],
['regency_code' => '3526', 'province_code' => '35', 'regency_name' => 'KAB. BANGKALAN'],
['regency_code' => '3527', 'province_code' => '35', 'regency_name' => 'KAB. SAMPANG'],
['regency_code' => '3528', 'province_code' => '35', 'regency_name' => 'KAB. PAMEKASAN'],
['regency_code' => '3529', 'province_code' => '35', 'regency_name' => 'KAB. SUMENEP'],
['regency_code' => '3571', 'province_code' => '35', 'regency_name' => 'KOTA KEDIRI'],
['regency_code' => '3572', 'province_code' => '35', 'regency_name' => 'KOTA BLITAR'],
['regency_code' => '3573', 'province_code' => '35', 'regency_name' => 'KOTA MALANG'],
['regency_code' => '3574', 'province_code' => '35', 'regency_name' => 'KOTA PROBOLINGGO'],
['regency_code' => '3575', 'province_code' => '35', 'regency_name' => 'KOTA PASURUAN'],
['regency_code' => '3576', 'province_code' => '35', 'regency_name' => 'KOTA MOJOKERTO'],
['regency_code' => '3577', 'province_code' => '35', 'regency_name' => 'KOTA MADIUN'],
['regency_code' => '3578', 'province_code' => '35', 'regency_name' => 'KOTA SURABAYA'],
['regency_code' => '3579', 'province_code' => '35', 'regency_name' => 'KOTA BATU'],
['regency_code' => '3601', 'province_code' => '36', 'regency_name' => 'KAB. PANDEGLANG'],
['regency_code' => '3602', 'province_code' => '36', 'regency_name' => 'KAB. LEBAK'],
['regency_code' => '3603', 'province_code' => '36', 'regency_name' => 'KAB. TANGERANG'],
['regency_code' => '3604', 'province_code' => '36', 'regency_name' => 'KAB. SERANG'],
['regency_code' => '3671', 'province_code' => '36', 'regency_name' => 'KOTA TANGERANG'],
['regency_code' => '3672', 'province_code' => '36', 'regency_name' => 'KOTA CILEGON'],
['regency_code' => '3673', 'province_code' => '36', 'regency_name' => 'KOTA SERANG'],
['regency_code' => '3674', 'province_code' => '36', 'regency_name' => 'KOTA TANGERANG SELATAN'],
['regency_code' => '5101', 'province_code' => '51', 'regency_name' => 'KAB. JEMBRANA'],
['regency_code' => '5102', 'province_code' => '51', 'regency_name' => 'KAB. TABANAN'],
['regency_code' => '5103', 'province_code' => '51', 'regency_name' => 'KAB. BADUNG'],
['regency_code' => '5104', 'province_code' => '51', 'regency_name' => 'KAB. GIANYAR'],
['regency_code' => '5105', 'province_code' => '51', 'regency_name' => 'KAB. KLUNGKUNG'],
['regency_code' => '5106', 'province_code' => '51', 'regency_name' => 'KAB. BANGLI'],
['regency_code' => '5107', 'province_code' => '51', 'regency_name' => 'KAB. KARANGASEM'],
['regency_code' => '5108', 'province_code' => '51', 'regency_name' => 'KAB. BULELENG'],
['regency_code' => '5171', 'province_code' => '51', 'regency_name' => 'KOTA DENPASAR'],
['regency_code' => '5201', 'province_code' => '52', 'regency_name' => 'KAB. LOMBOK BARAT'],
['regency_code' => '5202', 'province_code' => '52', 'regency_name' => 'KAB. LOMBOK TENGAH'],
['regency_code' => '5203', 'province_code' => '52', 'regency_name' => 'KAB. LOMBOK TIMUR'],
['regency_code' => '5204', 'province_code' => '52', 'regency_name' => 'KAB. SUMBAWA'],
['regency_code' => '5205', 'province_code' => '52', 'regency_name' => 'KAB. DOMPU'],
['regency_code' => '5206', 'province_code' => '52', 'regency_name' => 'KAB. BIMA'],
['regency_code' => '5207', 'province_code' => '52', 'regency_name' => 'KAB. SUMBAWA BARAT'],
['regency_code' => '5208', 'province_code' => '52', 'regency_name' => 'KAB. LOMBOK UTARA'],
['regency_code' => '5271', 'province_code' => '52', 'regency_name' => 'KOTA MATARAM'],
['regency_code' => '5272', 'province_code' => '52', 'regency_name' => 'KOTA BIMA'],
['regency_code' => '5301', 'province_code' => '53', 'regency_name' => 'KAB. KUPANG'],
['regency_code' => '5302', 'province_code' => '53', 'regency_name' => 'KAB TIMOR TENGAH SELATAN'],
['regency_code' => '5303', 'province_code' => '53', 'regency_name' => 'KAB. TIMOR TENGAH UTARA'],
['regency_code' => '5304', 'province_code' => '53', 'regency_name' => 'KAB. BELU'],
['regency_code' => '5305', 'province_code' => '53', 'regency_name' => 'KAB. ALOR'],
['regency_code' => '5306', 'province_code' => '53', 'regency_name' => 'KAB. FLORES TIMUR'],
['regency_code' => '5307', 'province_code' => '53', 'regency_name' => 'KAB. SIKKA'],
['regency_code' => '5308', 'province_code' => '53', 'regency_name' => 'KAB. ENDE'],
['regency_code' => '5309', 'province_code' => '53', 'regency_name' => 'KAB. NGADA'],
['regency_code' => '5310', 'province_code' => '53', 'regency_name' => 'KAB. MANGGARAI'],
['regency_code' => '5311', 'province_code' => '53', 'regency_name' => 'KAB. SUMBA TIMUR'],
['regency_code' => '5312', 'province_code' => '53', 'regency_name' => 'KAB. SUMBA BARAT'],
['regency_code' => '5313', 'province_code' => '53', 'regency_name' => 'KAB. LEMBATA'],
['regency_code' => '5314', 'province_code' => '53', 'regency_name' => 'KAB. ROTE NDAO'],
['regency_code' => '5315', 'province_code' => '53', 'regency_name' => 'KAB. MANGGARAI BARAT'],
['regency_code' => '5316', 'province_code' => '53', 'regency_name' => 'KAB. NAGEKEO'],
['regency_code' => '5317', 'province_code' => '53', 'regency_name' => 'KAB. SUMBA TENGAH'],
['regency_code' => '5318', 'province_code' => '53', 'regency_name' => 'KAB. SUMBA BARAT DAYA'],
['regency_code' => '5319', 'province_code' => '53', 'regency_name' => 'KAB. MANGGARAI TIMUR'],
['regency_code' => '5320', 'province_code' => '53', 'regency_name' => 'KAB. SABU RAIJUA'],
['regency_code' => '5321', 'province_code' => '53', 'regency_name' => 'KAB. MALAKA'],
['regency_code' => '5371', 'province_code' => '53', 'regency_name' => 'KOTA KUPANG'],
['regency_code' => '6101', 'province_code' => '61', 'regency_name' => 'KAB. SAMBAS'],
['regency_code' => '6102', 'province_code' => '61', 'regency_name' => 'KAB. MEMPAWAH'],
['regency_code' => '6103', 'province_code' => '61', 'regency_name' => 'KAB. SANGGAU'],
['regency_code' => '6104', 'province_code' => '61', 'regency_name' => 'KAB. KETAPANG'],
['regency_code' => '6105', 'province_code' => '61', 'regency_name' => 'KAB. SINTANG'],
['regency_code' => '6106', 'province_code' => '61', 'regency_name' => 'KAB. KAPUAS HULU'],
['regency_code' => '6107', 'province_code' => '61', 'regency_name' => 'KAB. BENGKAYANG'],
['regency_code' => '6108', 'province_code' => '61', 'regency_name' => 'KAB. LANDAK'],
['regency_code' => '6109', 'province_code' => '61', 'regency_name' => 'KAB. SEKADAU'],
['regency_code' => '6110', 'province_code' => '61', 'regency_name' => 'KAB. MELAWI'],
['regency_code' => '6111', 'province_code' => '61', 'regency_name' => 'KAB. KAYONG UTARA'],
['regency_code' => '6112', 'province_code' => '61', 'regency_name' => 'KAB. KUBU RAYA'],
['regency_code' => '6171', 'province_code' => '61', 'regency_name' => 'KOTA PONTIANAK'],
['regency_code' => '6172', 'province_code' => '61', 'regency_name' => 'KOTA SINGKAWANG'],
['regency_code' => '6201', 'province_code' => '62', 'regency_name' => 'KAB. KOTAWARINGIN BARAT'],
['regency_code' => '6202', 'province_code' => '62', 'regency_name' => 'KAB. KOTAWARINGIN TIMUR'],
['regency_code' => '6203', 'province_code' => '62', 'regency_name' => 'KAB. KAPUAS'],
['regency_code' => '6204', 'province_code' => '62', 'regency_name' => 'KAB. BARITO SELATAN'],
['regency_code' => '6205', 'province_code' => '62', 'regency_name' => 'KAB. BARITO UTARA'],
['regency_code' => '6206', 'province_code' => '62', 'regency_name' => 'KAB. KATINGAN'],
['regency_code' => '6207', 'province_code' => '62', 'regency_name' => 'KAB. SERUYAN'],
['regency_code' => '6208', 'province_code' => '62', 'regency_name' => 'KAB. SUKAMARA'],
['regency_code' => '6209', 'province_code' => '62', 'regency_name' => 'KAB. LAMANDAU'],
['regency_code' => '6210', 'province_code' => '62', 'regency_name' => 'KAB. GUNUNG MAS'],
['regency_code' => '6211', 'province_code' => '62', 'regency_name' => 'KAB. PULANG PISAU'],
['regency_code' => '6212', 'province_code' => '62', 'regency_name' => 'KAB. MURUNG RAYA'],
['regency_code' => '6213', 'province_code' => '62', 'regency_name' => 'KAB. BARITO TIMUR'],
['regency_code' => '6271', 'province_code' => '62', 'regency_name' => 'KOTA PALANGKARAYA'],
['regency_code' => '6301', 'province_code' => '63', 'regency_name' => 'KAB. TANAH LAUT'],
['regency_code' => '6302', 'province_code' => '63', 'regency_name' => 'KAB. KOTABARU'],
['regency_code' => '6303', 'province_code' => '63', 'regency_name' => 'KAB. BANJAR'],
['regency_code' => '6304', 'province_code' => '63', 'regency_name' => 'KAB. BARITO KUALA'],
['regency_code' => '6305', 'province_code' => '63', 'regency_name' => 'KAB. TAPIN'],
['regency_code' => '6306', 'province_code' => '63', 'regency_name' => 'KAB. HULU SUNGAI SELATAN'],
['regency_code' => '6307', 'province_code' => '63', 'regency_name' => 'KAB. HULU SUNGAI TENGAH'],
['regency_code' => '6308', 'province_code' => '63', 'regency_name' => 'KAB. HULU SUNGAI UTARA'],
['regency_code' => '6309', 'province_code' => '63', 'regency_name' => 'KAB. TABALONG'],
['regency_code' => '6310', 'province_code' => '63', 'regency_name' => 'KAB. TANAH BUMBU'],
['regency_code' => '6311', 'province_code' => '63', 'regency_name' => 'KAB. BALANGAN'],
['regency_code' => '6371', 'province_code' => '63', 'regency_name' => 'KOTA BANJARMASIN'],
['regency_code' => '6372', 'province_code' => '63', 'regency_name' => 'KOTA BANJARBARU'],
['regency_code' => '6401', 'province_code' => '64', 'regency_name' => 'KAB. PASER'],
['regency_code' => '6402', 'province_code' => '64', 'regency_name' => 'KAB. KUTAI KARTANEGARA'],
['regency_code' => '6403', 'province_code' => '64', 'regency_name' => 'KAB. BERAU'],
['regency_code' => '6407', 'province_code' => '64', 'regency_name' => 'KAB. KUTAI BARAT'],
['regency_code' => '6408', 'province_code' => '64', 'regency_name' => 'KAB. KUTAI TIMUR'],
['regency_code' => '6409', 'province_code' => '64', 'regency_name' => 'KAB. PENAJAM PASER UTARA'],
['regency_code' => '6411', 'province_code' => '64', 'regency_name' => 'KAB. MAHAKAM ULU'],
['regency_code' => '6471', 'province_code' => '64', 'regency_name' => 'KOTA BALIKPAPAN'],
['regency_code' => '6472', 'province_code' => '64', 'regency_name' => 'KOTA SAMARINDA'],
['regency_code' => '6474', 'province_code' => '64', 'regency_name' => 'KOTA BONTANG'],
['regency_code' => '6501', 'province_code' => '65', 'regency_name' => 'KAB. BULUNGAN'],
['regency_code' => '6502', 'province_code' => '65', 'regency_name' => 'KAB. MALINAU'],
['regency_code' => '6503', 'province_code' => '65', 'regency_name' => 'KAB. NUNUKAN'],
['regency_code' => '6504', 'province_code' => '65', 'regency_name' => 'KAB. TANA TIDUNG'],
['regency_code' => '6571', 'province_code' => '65', 'regency_name' => 'KOTA TARAKAN'],
['regency_code' => '7101', 'province_code' => '71', 'regency_name' => 'KAB. BOLAANG MONGONDOW'],
['regency_code' => '7102', 'province_code' => '71', 'regency_name' => 'KAB. MINAHASA'],
['regency_code' => '7103', 'province_code' => '71', 'regency_name' => 'KAB. KEPULAUAN SANGIHE'],
['regency_code' => '7104', 'province_code' => '71', 'regency_name' => 'KAB. KEPULAUAN TALAUD'],
['regency_code' => '7105', 'province_code' => '71', 'regency_name' => 'KAB. MINAHASA SELATAN'],
['regency_code' => '7106', 'province_code' => '71', 'regency_name' => 'KAB. MINAHASA UTARA'],
['regency_code' => '7107', 'province_code' => '71', 'regency_name' => 'KAB. MINAHASA TENGGARA'],
['regency_code' => '7108', 'province_code' => '71', 'regency_name' => 'KAB. BOLAANG MONGONDOW UTARA'],
['regency_code' => '7109', 'province_code' => '71', 'regency_name' => 'KAB. KEP. SIAU TAGULANDANG BIARO'],
['regency_code' => '7110', 'province_code' => '71', 'regency_name' => 'KAB. BOLAANG MONGONDOW TIMUR'],
['regency_code' => '7111', 'province_code' => '71', 'regency_name' => 'KAB. BOLAANG MONGONDOW SELATAN'],
['regency_code' => '7171', 'province_code' => '71', 'regency_name' => 'KOTA MANADO'],
['regency_code' => '7172', 'province_code' => '71', 'regency_name' => 'KOTA BITUNG'],
['regency_code' => '7173', 'province_code' => '71', 'regency_name' => 'KOTA TOMOHON'],
['regency_code' => '7174', 'province_code' => '71', 'regency_name' => 'KOTA KOTAMOBAGU'],
['regency_code' => '7201', 'province_code' => '72', 'regency_name' => 'KAB. BANGGAI'],
['regency_code' => '7202', 'province_code' => '72', 'regency_name' => 'KAB. POSO'],
['regency_code' => '7203', 'province_code' => '72', 'regency_name' => 'KAB. DONGGALA'],
['regency_code' => '7204', 'province_code' => '72', 'regency_name' => 'KAB. TOLI TOLI'],
['regency_code' => '7205', 'province_code' => '72', 'regency_name' => 'KAB. BUOL'],
['regency_code' => '7206', 'province_code' => '72', 'regency_name' => 'KAB. MOROWALI'],
['regency_code' => '7207', 'province_code' => '72', 'regency_name' => 'KAB. BANGGAI KEPULAUAN'],
['regency_code' => '7208', 'province_code' => '72', 'regency_name' => 'KAB. PARIGI MOUTONG'],
['regency_code' => '7209', 'province_code' => '72', 'regency_name' => 'KAB. TOJO UNA UNA'],
['regency_code' => '7210', 'province_code' => '72', 'regency_name' => 'KAB. SIGI'],
['regency_code' => '7211', 'province_code' => '72', 'regency_name' => 'KAB. BANGGAI LAUT'],
['regency_code' => '7212', 'province_code' => '72', 'regency_name' => 'KAB. MOROWALI UTARA'],
['regency_code' => '7271', 'province_code' => '72', 'regency_name' => 'KOTA PALU'],
['regency_code' => '7301', 'province_code' => '73', 'regency_name' => 'KAB. KEPULAUAN SELAYAR'],
['regency_code' => '7302', 'province_code' => '73', 'regency_name' => 'KAB. BULUKUMBA'],
['regency_code' => '7303', 'province_code' => '73', 'regency_name' => 'KAB. BANTAENG'],
['regency_code' => '7304', 'province_code' => '73', 'regency_name' => 'KAB. JENEPONTO'],
['regency_code' => '7305', 'province_code' => '73', 'regency_name' => 'KAB. TAKALAR'],
['regency_code' => '7306', 'province_code' => '73', 'regency_name' => 'KAB. GOWA'],
['regency_code' => '7307', 'province_code' => '73', 'regency_name' => 'KAB. SINJAI'],
['regency_code' => '7308', 'province_code' => '73', 'regency_name' => 'KAB. BONE'],
['regency_code' => '7309', 'province_code' => '73', 'regency_name' => 'KAB. MAROS'],
['regency_code' => '7310', 'province_code' => '73', 'regency_name' => 'KAB. PANGKAJENE KEPULAUAN'],
['regency_code' => '7311', 'province_code' => '73', 'regency_name' => 'KAB. BARRU'],
['regency_code' => '7312', 'province_code' => '73', 'regency_name' => 'KAB. SOPPENG'],
['regency_code' => '7313', 'province_code' => '73', 'regency_name' => 'KAB. WAJO'],
['regency_code' => '7314', 'province_code' => '73', 'regency_name' => 'KAB. SIDENRENG RAPPANG'],
['regency_code' => '7315', 'province_code' => '73', 'regency_name' => 'KAB. PINRANG'],
['regency_code' => '7316', 'province_code' => '73', 'regency_name' => 'KAB. ENREKANG'],
['regency_code' => '7317', 'province_code' => '73', 'regency_name' => 'KAB. LUWU'],
['regency_code' => '7318', 'province_code' => '73', 'regency_name' => 'KAB. TANA TORAJA'],
['regency_code' => '7322', 'province_code' => '73', 'regency_name' => 'KAB. LUWU UTARA'],
['regency_code' => '7324', 'province_code' => '73', 'regency_name' => 'KAB. LUWU TIMUR'],
['regency_code' => '7326', 'province_code' => '73', 'regency_name' => 'KAB. TORAJA UTARA'],
['regency_code' => '7371', 'province_code' => '73', 'regency_name' => 'KOTA MAKASSAR'],
['regency_code' => '7372', 'province_code' => '73', 'regency_name' => 'KOTA PARE PARE'],
['regency_code' => '7373', 'province_code' => '73', 'regency_name' => 'KOTA PALOPO'],
['regency_code' => '7401', 'province_code' => '74', 'regency_name' => 'KAB. KOLAKA'],
['regency_code' => '7402', 'province_code' => '74', 'regency_name' => 'KAB. KONAWE'],
['regency_code' => '7403', 'province_code' => '74', 'regency_name' => 'KAB. MUNA'],
['regency_code' => '7404', 'province_code' => '74', 'regency_name' => 'KAB. BUTON'],
['regency_code' => '7405', 'province_code' => '74', 'regency_name' => 'KAB. KONAWE SELATAN'],
['regency_code' => '7406', 'province_code' => '74', 'regency_name' => 'KAB. BOMBANA'],
['regency_code' => '7407', 'province_code' => '74', 'regency_name' => 'KAB. WAKATOBI'],
['regency_code' => '7408', 'province_code' => '74', 'regency_name' => 'KAB. KOLAKA UTARA'],
['regency_code' => '7409', 'province_code' => '74', 'regency_name' => 'KAB. KONAWE UTARA'],
['regency_code' => '7410', 'province_code' => '74', 'regency_name' => 'KAB. BUTON UTARA'],
['regency_code' => '7411', 'province_code' => '74', 'regency_name' => 'KAB. KOLAKA TIMUR'],
['regency_code' => '7412', 'province_code' => '74', 'regency_name' => 'KAB. KONAWE KEPULAUAN'],
['regency_code' => '7413', 'province_code' => '74', 'regency_name' => 'KAB. MUNA BARAT'],
['regency_code' => '7414', 'province_code' => '74', 'regency_name' => 'KAB. BUTON TENGAH'],
['regency_code' => '7415', 'province_code' => '74', 'regency_name' => 'KAB. BUTON SELATAN'],
['regency_code' => '7471', 'province_code' => '74', 'regency_name' => 'KOTA KENDARI'],
['regency_code' => '7472', 'province_code' => '74', 'regency_name' => 'KOTA BAU BAU'],
['regency_code' => '7501', 'province_code' => '75', 'regency_name' => 'KAB. GORONTALO'],
['regency_code' => '7502', 'province_code' => '75', 'regency_name' => 'KAB. BOALEMO'],
['regency_code' => '7503', 'province_code' => '75', 'regency_name' => 'KAB. BONE BOLANGO'],
['regency_code' => '7504', 'province_code' => '75', 'regency_name' => 'KAB. POHUWATO'],
['regency_code' => '7505', 'province_code' => '75', 'regency_name' => 'KAB. GORONTALO UTARA'],
['regency_code' => '7571', 'province_code' => '75', 'regency_name' => 'KOTA GORONTALO'],
['regency_code' => '7601', 'province_code' => '76', 'regency_name' => 'KAB. PASANGKAYU'],
['regency_code' => '7602', 'province_code' => '76', 'regency_name' => 'KAB. MAMUJU'],
['regency_code' => '7603', 'province_code' => '76', 'regency_name' => 'KAB. MAMASA'],
['regency_code' => '7604', 'province_code' => '76', 'regency_name' => 'KAB. POLEWALI MANDAR'],
['regency_code' => '7605', 'province_code' => '76', 'regency_name' => 'KAB. MAJENE'],
['regency_code' => '7606', 'province_code' => '76', 'regency_name' => 'KAB. MAMUJU TENGAH'],
['regency_code' => '8101', 'province_code' => '81', 'regency_name' => 'KAB. MALUKU TENGAH'],
['regency_code' => '8102', 'province_code' => '81', 'regency_name' => 'KAB. MALUKU TENGGARA'],
['regency_code' => '8103', 'province_code' => '81', 'regency_name' => 'KAB. KEPULAUAN TANIMBAR'],
['regency_code' => '8104', 'province_code' => '81', 'regency_name' => 'KAB. BURU'],
['regency_code' => '8105', 'province_code' => '81', 'regency_name' => 'KAB. SERAM BAGIAN TIMUR'],
['regency_code' => '8106', 'province_code' => '81', 'regency_name' => 'KAB. SERAM BAGIAN BARAT'],
['regency_code' => '8107', 'province_code' => '81', 'regency_name' => 'KAB. KEPULAUAN ARU'],
['regency_code' => '8108', 'province_code' => '81', 'regency_name' => 'KAB. MALUKU BARAT DAYA'],
['regency_code' => '8109', 'province_code' => '81', 'regency_name' => 'KAB. BURU SELATAN'],
['regency_code' => '8171', 'province_code' => '81', 'regency_name' => 'KOTA AMBON'],
['regency_code' => '8172', 'province_code' => '81', 'regency_name' => 'KOTA TUAL'],
['regency_code' => '8201', 'province_code' => '82', 'regency_name' => 'KAB. HALMAHERA BARAT'],
['regency_code' => '8202', 'province_code' => '82', 'regency_name' => 'KAB. HALMAHERA TENGAH'],
['regency_code' => '8203', 'province_code' => '82', 'regency_name' => 'KAB. HALMAHERA UTARA'],
['regency_code' => '8204', 'province_code' => '82', 'regency_name' => 'KAB. HALMAHERA SELATAN'],
['regency_code' => '8205', 'province_code' => '82', 'regency_name' => 'KAB. KEPULAUAN SULA'],
['regency_code' => '8206', 'province_code' => '82', 'regency_name' => 'KAB. HALMAHERA TIMUR'],
['regency_code' => '8207', 'province_code' => '82', 'regency_name' => 'KAB. PULAU MOROTAI'],
['regency_code' => '8208', 'province_code' => '82', 'regency_name' => 'KAB. PULAU TALIABU'],
['regency_code' => '8271', 'province_code' => '82', 'regency_name' => 'KOTA TERNATE'],
['regency_code' => '8272', 'province_code' => '82', 'regency_name' => 'KOTA TIDORE KEPULAUAN'],
['regency_code' => '9103', 'province_code' => '91', 'regency_name' => 'KAB. JAYAPURA'],
['regency_code' => '9105', 'province_code' => '91', 'regency_name' => 'KAB. KEPULAUAN YAPEN'],
['regency_code' => '9106', 'province_code' => '91', 'regency_name' => 'KAB. BIAK NUMFOR'],
['regency_code' => '9110', 'province_code' => '91', 'regency_name' => 'KAB. SARMI'],
['regency_code' => '9111', 'province_code' => '91', 'regency_name' => 'KAB. KEEROM'],
['regency_code' => '9115', 'province_code' => '91', 'regency_name' => 'KAB. WAROPEN'],
['regency_code' => '9119', 'province_code' => '91', 'regency_name' => 'KAB. SUPIORI'],
['regency_code' => '9120', 'province_code' => '91', 'regency_name' => 'KAB. MAMBERAMO RAYA'],
['regency_code' => '9171', 'province_code' => '91', 'regency_name' => 'KOTA JAYAPURA'],
['regency_code' => '9201', 'province_code' => '92', 'regency_name' => 'KAB. SORONG'],
['regency_code' => '9202', 'province_code' => '92', 'regency_name' => 'KAB. MANOKWARI'],
['regency_code' => '9203', 'province_code' => '92', 'regency_name' => 'KAB. FAK FAK'],
['regency_code' => '9204', 'province_code' => '92', 'regency_name' => 'KAB. SORONG SELATAN'],
['regency_code' => '9205', 'province_code' => '92', 'regency_name' => 'KAB. RAJA AMPAT'],
['regency_code' => '9206', 'province_code' => '92', 'regency_name' => 'KAB. TELUK BINTUNI'],
['regency_code' => '9207', 'province_code' => '92', 'regency_name' => 'KAB. TELUK WONDAMA'],
['regency_code' => '9208', 'province_code' => '92', 'regency_name' => 'KAB. KAIMANA'],
['regency_code' => '9209', 'province_code' => '92', 'regency_name' => 'KAB. TAMBRAUW'],
['regency_code' => '9210', 'province_code' => '92', 'regency_name' => 'KAB. MAYBRAT'],
['regency_code' => '9211', 'province_code' => '92', 'regency_name' => 'KAB. MANOKWARI SELATAN'],
['regency_code' => '9212', 'province_code' => '92', 'regency_name' => 'KAB. PEGUNUNGAN ARFAK'],
['regency_code' => '9271', 'province_code' => '92', 'regency_name' => 'KOTA SORONG'],
['regency_code' => '9301', 'province_code' => '93', 'regency_name' => 'KAB. MERAUKE'],
['regency_code' => '9302', 'province_code' => '93', 'regency_name' => 'KAB. BOVEN DIGOEL'],
['regency_code' => '9303', 'province_code' => '93', 'regency_name' => 'KAB. MAPPI'],
['regency_code' => '9304', 'province_code' => '93', 'regency_name' => 'KAB. ASMAT'],
['regency_code' => '9401', 'province_code' => '94', 'regency_name' => 'KAB. NABIRE'],
['regency_code' => '9402', 'province_code' => '94', 'regency_name' => 'KAB. PUNCAK JAYA'],
['regency_code' => '9403', 'province_code' => '94', 'regency_name' => 'KAB. PANIAI'],
['regency_code' => '9404', 'province_code' => '94', 'regency_name' => 'KAB. MIMIKA'],
['regency_code' => '9405', 'province_code' => '94', 'regency_name' => 'KAB. PUNCAK'],
['regency_code' => '9406', 'province_code' => '94', 'regency_name' => 'KAB. DOGIYAI'],
['regency_code' => '9407', 'province_code' => '94', 'regency_name' => 'KAB. INTAN JAYA'],
['regency_code' => '9408', 'province_code' => '94', 'regency_name' => 'KAB. DEIYAI'],
['regency_code' => '9501', 'province_code' => '95', 'regency_name' => 'KAB. JAYAWIJAYA'],
['regency_code' => '9502', 'province_code' => '95', 'regency_name' => 'KAB. PEGUNUNGAN BINTANG'],
['regency_code' => '9503', 'province_code' => '95', 'regency_name' => 'KAB. YAHUKIMO'],
['regency_code' => '9504', 'province_code' => '95', 'regency_name' => 'KAB. TOLIKARA'],
['regency_code' => '9505', 'province_code' => '95', 'regency_name' => 'KAB. MAMBERAMO TENGAH'],
['regency_code' => '9506', 'province_code' => '95', 'regency_name' => 'KAB. YALIMO'],
['regency_code' => '9507', 'province_code' => '95', 'regency_name' => 'KAB. LANNY JAYA'],
['regency_code' => '9508', 'province_code' => '95', 'regency_name' => 'KAB. NDUGA'],
]);
}
}

View File

@@ -1,5 +0,0 @@
CREATE VIEW business_type_counts AS
SELECT b.business_type, COUNT(t.id) AS count
FROM tourisms t
JOIN business_type b ON t.business_type_id = b.id
GROUP BY b.business_type;

25
package-lock.json generated
View File

@@ -6,6 +6,7 @@
"": {
"dependencies": {
"apexcharts": "^3.44.2",
"big.js": "^6.2.2",
"bootstrap": "^5.3.3",
"countup.js": "^2.3.2",
"dropzone": "^5.9.0",
@@ -18,7 +19,6 @@
"node-waves": "^0.7.6",
"quill": "^1.3.7",
"simplebar": "^5.3.9",
"sweetalert2": "^11.16.0",
"wnumb": "^1.2.0"
},
"devDependencies": {
@@ -478,6 +478,19 @@
"integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
"dev": true
},
"node_modules/big.js": {
"version": "6.2.2",
"resolved": "https://registry.npmjs.org/big.js/-/big.js-6.2.2.tgz",
"integrity": "sha512-y/ie+Faknx7sZA5MfGA2xKlu0GDv8RWrXGsmlteyJQ2lvoKv9GBK/fpRMc2qlSoBAgNxrixICFCBefIq8WCQpQ==",
"license": "MIT",
"engines": {
"node": "*"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/bigjs"
}
},
"node_modules/binary-extensions": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
@@ -2508,16 +2521,6 @@
"node": ">= 0.8.0"
}
},
"node_modules/sweetalert2": {
"version": "11.16.0",
"resolved": "https://registry.npmjs.org/sweetalert2/-/sweetalert2-11.16.0.tgz",
"integrity": "sha512-4CGgNMpQHcwV+Gov0j4u3lDc/5lyl04NBsa1vW0Se9cqsrQoUimD6/Z5UyZiRP4kMbwQGyb7wsp0x3ytybti6w==",
"license": "MIT",
"funding": {
"type": "individual",
"url": "https://github.com/sponsors/limonte"
}
},
"node_modules/tailwindcss": {
"version": "3.4.15",
"resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.15.tgz",

View File

@@ -17,6 +17,7 @@
},
"dependencies": {
"apexcharts": "^3.44.2",
"big.js": "^6.2.2",
"bootstrap": "^5.3.3",
"countup.js": "^2.3.2",
"dropzone": "^5.9.0",
@@ -29,7 +30,6 @@
"node-waves": "^0.7.6",
"quill": "^1.3.7",
"simplebar": "^5.3.9",
"sweetalert2": "^11.16.0",
"wnumb": "^1.2.0"
}
}

View File

@@ -4,6 +4,8 @@ use Illuminate\Http\Request;
define('LARAVEL_START', microtime(true));
ini_set('max_execution_time',14400);
// Determine if the application is in maintenance mode...
if (file_exists($maintenance = __DIR__.'/../storage/framework/maintenance.php')) {
require $maintenance;

View File

@@ -1,13 +1,83 @@
import ApexCharts from "apexcharts";
import Big from "big.js";
import GlobalConfig, { addThousandSeparators } from "../global-config.js";
class BigData {
async init() {
try{
this.resultDataTotal = await this.getTotalAllTask();
try {
this.totalTargetPAD = await this.getTargetPAD();
this.resultDataTotal = await this.getDataTotalPotensi();
this.dataVerification = await this.getDataVerfication();
this.dataNonVerification = await this.getDataNonVerfication();
this.dataBusiness = await this.getDataBusiness();
this.dataNonBusiness = await this.getDataNonBusiness();
if (!this.resultDataTotal) {
// total potensi
this.bigTargetPAD = new Big(this.totalTargetPAD ?? 0);
this.bigTotalPotensi = new Big(this.resultDataTotal.totalData ?? 0);
this.resultPercentage = 0;
if (this.bigTotalPotensi > 0 && this.bigTargetPAD > 0) {
this.resultPercentage = this.bigTotalPotensi
.div(this.bigTargetPAD)
.times(100)
.toFixed(2);
if (this.resultPercentage > 100) {
this.resultPercentage = 100;
}
}
// kekurangan potensi
this.totalKekuranganPotensi = new Big(
this.totalTargetPAD - this.bigTotalPotensi
);
this.percentageKekuranganPotensi =
this.totalKekuranganPotensi <= 0 || this.totalTargetPAD <= 0
? 0
: this.totalKekuranganPotensi
.div(this.bigTargetPAD)
.times(100)
.toFixed(2);
// non-verification documents
this.bigTotalNonVerification = new Big(
this.dataNonVerification.total
);
this.percentageResultNonVerification = this.bigTotalNonVerification
.div(this.bigTotalPotensi)
.times(100)
.toFixed(2);
// verification documents
this.bigTotalVerification = new Big(this.dataVerification.total);
this.percetageResultVerification =
this.bigTotalVerification <= 0 || this.bigTotalPotensi <= 0
? 0
: this.bigTotalVerification
.div(this.bigTargetPAD)
.times(100)
.toFixed(2);
// business documents
this.bigTotalBusiness = new Big(this.dataBusiness.total);
this.percentageResultBusiness =
this.bigTotalNonVerification <= 0
? 0
: this.bigTotalBusiness
.div(this.bigTotalNonVerification)
.times(100)
.toFixed(2);
// non-business documents
this.bigTotalNonBusiness = new Big(this.dataNonBusiness.total);
this.percentageResultNonBusiness =
this.bigTotalNonBusiness <= 0
? 0
: this.bigTotalNonBusiness
.div(this.bigTotalNonVerification)
.times(100)
.toFixed(2);
if (!this.totalTargetPAD) {
console.error("Failed to load chart data");
return;
}
@@ -15,424 +85,469 @@ class BigData {
this.initChartTargetPAD();
this.initChartUsaha();
this.initChartNonUsaha();
this.initChartStatus1();
this.initChartStatus2();
this.initChartStatus3();
this.initChartStatus4();
this.initChartStatus5();
this.initChartStatus6();
this.initChartStatus7();
this.initChartStatus20();
this.initChartStatus24();
}catch(e){
this.initChartTotalPotensi();
this.initChartVerificationDocuments();
this.initChartNonVerificationDocuments();
this.initChartKekuranganPotensi();
this.initChartRealisasiTerbitPBG();
this.initChartMenungguKlikDPMPTSP();
this.initChartProsesDinasTeknis();
this.initChartPotensiTataRuang();
} catch (e) {
console.error(e);
}
}
async getTotalAllTask() {
async getDataTotalPotensi() {
try {
const response = await fetch(`${GlobalConfig.apiHost}/api/all-task-documents`, {
credentials: "include",
headers: {
Authorization: `Bearer ${document.querySelector("meta[name='api-token']").content}`,
"Content-Type": "application/json",
},
});
const response = await fetch(
`${GlobalConfig.apiHost}/api/all-task-documents`,
{
credentials: "include",
headers: {
Authorization: `Bearer ${
document.querySelector("meta[name='api-token']")
.content
}`,
"Content-Type": "application/json",
},
}
);
if (!response.ok) {
console.error("Network response was not ok", response);
}
const data = await response.json();
return {
seriesData: data.data.series,
countData: data.data.count,
totalData: data.data.total
totalData: data.data.total,
};
} catch (error) {
console.error("Error fetching chart data:", error);
return null; // Mengembalikan null jika terjadi error
return null;
}
}
async getTargetPAD() {
try {
const response = await fetch(
`${GlobalConfig.apiHost}/api/api-data-settings?search=target_pad`,
{
credentials: "include",
headers: {
Authorization: `Bearer ${
document.querySelector("meta[name='api-token']")
.content
}`,
"Content-Type": "application/json",
},
}
);
if (!response.ok) {
console.error("Network response was not ok", response);
}
const data = await response.json();
return data.data[0].value;
} catch (error) {
console.error("Error fetching chart data:", error);
return null;
}
}
async getDataVerfication() {
try {
const response = await fetch(
`${GlobalConfig.apiHost}/api/verification-documents`,
{
credentials: "include",
headers: {
Authorization: `Bearer ${
document.querySelector("meta[name='api-token']")
.content
}`,
"Content-Type": "application/json",
},
}
);
if (!response.ok) {
console.error("Network response was not ok", response);
}
const data = await response.json();
return {
count: data.data.count,
total: data.data.total,
};
} catch (error) {
console.error("Error fetching chart data:", error);
return null;
}
}
async getDataNonVerfication() {
try {
const response = await fetch(
`${GlobalConfig.apiHost}/api/non-verification-documents`,
{
credentials: "include",
headers: {
Authorization: `Bearer ${
document.querySelector("meta[name='api-token']")
.content
}`,
"Content-Type": "application/json",
},
}
);
if (!response.ok) {
console.error("Network response was not ok", response);
}
const data = await response.json();
return {
count: data.data.count,
total: data.data.total,
};
} catch (error) {
console.error("Error fetching chart data:", error);
return null;
}
}
async getDataBusiness() {
try {
const response = await fetch(
`${GlobalConfig.apiHost}/api/business-documents`,
{
credentials: "include",
headers: {
Authorization: `Bearer ${
document.querySelector("meta[name='api-token']")
.content
}`,
"Content-Type": "application/json",
},
}
);
if (!response.ok) {
console.error("Network response was not ok", response);
}
const data = await response.json();
return {
count: data.data.count,
total: data.data.total,
};
} catch (error) {
console.error("Error fetching chart data:", error);
return null;
}
}
async getDataNonBusiness() {
try {
const response = await fetch(
`${GlobalConfig.apiHost}/api/non-business-documents`,
{
credentials: "include",
headers: {
Authorization: `Bearer ${
document.querySelector("meta[name='api-token']")
.content
}`,
"Content-Type": "application/json",
},
}
);
if (!response.ok) {
console.error("Network response was not ok", response);
}
const data = await response.json();
return {
count: data.data.count,
total: data.data.total,
};
} catch (error) {
console.error("Error fetching chart data:", error);
return null;
}
}
initChartTargetPAD() {
const total = this.resultDataTotal.totalData;
const count = this.resultDataTotal.countData;
document.querySelectorAll('.document-count.chart-all-task').forEach((element) => {
element.innerText = `${count}`;
});
document.querySelectorAll('.document-total.chart-all-task').forEach((element) => {
element.innerText = `Rp.${addThousandSeparators(total)}`;
});
document.querySelectorAll('.small-percentage.chart-all-task').forEach((element) => {
element.innerText = `${100}%`;
});
let totalPad = 0;
fetch(
`${GlobalConfig.apiHost}/api/api-data-settings?search=target_pad`,
{
credentials: "include",
headers: {
Authorization: `Bearer ${
document.querySelector("meta[name='api-token']").content
}`,
"Content-Type": "application/json",
},
}
)
.then((response) => {
if (!response.ok) {
throw new Error("Network response was not ok");
}
return response.json();
})
.then((data) => {
totalPad = data.data[0].value;
document
.querySelectorAll(".document-count.chart-target-pad")
.forEach((element) => {
element.innerText = ``;
});
document
.querySelectorAll(".document-total.chart-target-pad")
.forEach((element) => {
element.innerText = `Rp.${addThousandSeparators(
totalPad
)}`;
});
document
.querySelectorAll(".small-percentage.chart-target-pad")
.forEach((element) => {
element.innerText = `${100}%`;
});
})
.catch((error) => {
console.error("Error fetching target_pad:", error);
});
}
initChartTotalPotensi() {
const countAll = this.resultDataTotal.countData ?? 0;
document
.querySelectorAll(".document-count.chart-total-potensi")
.forEach((element) => {
element.innerText = `${countAll}`;
});
document
.querySelectorAll(".document-total.chart-total-potensi")
.forEach((element) => {
element.innerText = `Rp.${addThousandSeparators(
this.bigTotalPotensi.toString()
)}`;
});
document
.querySelectorAll(".small-percentage.chart-total-potensi")
.forEach((element) => {
element.innerText = `${this.resultPercentage}%`;
});
}
initChartVerificationDocuments() {
document
.querySelectorAll(".document-count.chart-berkas-terverifikasi")
.forEach((element) => {
element.innerText = `${this.dataVerification.count}`;
});
document
.querySelectorAll(".document-total.chart-berkas-terverifikasi")
.forEach((element) => {
element.innerText = `Rp.${addThousandSeparators(
this.bigTotalVerification.toString()
)}`;
});
document
.querySelectorAll(".small-percentage.chart-berkas-terverifikasi")
.forEach((element) => {
element.innerText = `${this.percetageResultVerification}%`;
});
}
initChartNonVerificationDocuments() {
document
.querySelectorAll(
".document-count.chart-berkas-belum-terverifikasi"
)
.forEach((element) => {
element.innerText = `${this.dataNonVerification.count}`;
});
document
.querySelectorAll(
".document-total.chart-berkas-belum-terverifikasi"
)
.forEach((element) => {
element.innerText = `Rp.${addThousandSeparators(
this.bigTotalNonVerification.toString()
)}`;
});
document
.querySelectorAll(
".small-percentage.chart-berkas-belum-terverifikasi"
)
.forEach((element) => {
element.innerText = `${this.percentageResultNonVerification}%`;
});
}
initChartUsaha() {
fetch(`${GlobalConfig.apiHost}/api/business-documents`,{
credentials: "include",
headers: {
Authorization: `Bearer ${document.querySelector("meta[name='api-token']").content}`,
"Content-Type": "application/json",
},
})
.then((response) => {
if (!response.ok) {
throw new Error("Network response was not ok");
}
return response.json();
})
.then((data) => {
// Pastikan this.resultDataTotal sudah ada
if (!this.resultDataTotal) {
console.error("Error: resultDataTotal is undefined");
return;
}
const totalAll = this.resultDataTotal.totalData ?? 0;
const countAll = this.resultDataTotal.countData ?? 0;
const countUsaha = data?.data?.count ?? 0;
const totalUsaha = data?.data?.total ?? 0;
// Perbaikan perhitungan persentase
let resultPercentage = 0;
if (countUsaha > 0) {
resultPercentage = (countUsaha / countAll) * 100;
if (resultPercentage > 100) {
resultPercentage = 100; // Batasi maksimum 100%
}
}
document.querySelectorAll('.document-count.chart-business').forEach((element) => {
element.innerText = `${countUsaha}`;
document
.querySelectorAll(".document-count.chart-business")
.forEach((element) => {
element.innerText = `${this.dataBusiness.count}`;
});
document.querySelectorAll('.document-total.chart-business').forEach((element) => {
element.innerText = `Rp.${addThousandSeparators(totalUsaha)}`;
document
.querySelectorAll(".document-total.chart-business")
.forEach((element) => {
element.innerText = `Rp.${addThousandSeparators(
this.bigTotalBusiness.toString()
)}`;
});
document.querySelectorAll('.small-percentage.chart-business').forEach((element) => {
element.innerText = `${resultPercentage.toFixed(2)}%`;
document
.querySelectorAll(".small-percentage.chart-business")
.forEach((element) => {
element.innerText = `${this.percentageResultBusiness}%`;
});
})
.catch((error) => {
console.error("error fetching chart dara : ", error);
});
}
initChartNonUsaha() {
fetch(`${GlobalConfig.apiHost}/api/non-business-documents`, {
credentials: "include",
headers: {
Authorization: `Bearer ${document.querySelector("meta[name='api-token']").content}`,
"Content-Type": "application/json",
},
})
.then((response) => {
if (!response.ok) {
throw new Error("Network response was not ok");
}
return response.json();
})
.then((data) => {
// Pastikan this.resultDataTotal sudah ada
if (!this.resultDataTotal) {
console.error("Error: resultDataTotal is undefined");
return;
}
const totalAll = this.resultDataTotal.totalData ?? 0;
const countAll = this.resultDataTotal.countData ?? 0;
const countUsaha = data?.data?.count ?? 0;
const totalUsaha = data?.data?.total ?? 0;
// Perbaikan perhitungan persentase
let resultPercentage = 0;
if (countUsaha > 0) {
resultPercentage = (countUsaha / countAll) * 100;
if (resultPercentage > 100) {
resultPercentage = 100; // Batasi maksimum 100%
}
}
document.querySelectorAll('.document-count.chart-non-business').forEach((element) => {
element.innerText = `${data.data.count}`;
document
.querySelectorAll(".document-count.chart-non-business")
.forEach((element) => {
element.innerText = `${this.dataNonBusiness.count}`;
});
document.querySelectorAll('.document-total.chart-non-business').forEach((element) => {
element.innerText = `Rp.${addThousandSeparators(data.data.total)}`;
document
.querySelectorAll(".document-total.chart-non-business")
.forEach((element) => {
element.innerText = `Rp.${addThousandSeparators(
this.bigTotalNonBusiness.toString()
)}`;
});
document.querySelectorAll('.small-percentage.chart-non-business').forEach((element) => {
element.innerText = `${resultPercentage.toFixed(2)}%`;
document
.querySelectorAll(".small-percentage.chart-non-business")
.forEach((element) => {
element.innerText = `${this.percentageResultNonBusiness}%`;
});
})
.catch((error) => {
console.error("error fetching chart dara : ", error);
});
}
initChartStatus1(){
fetch(`${GlobalConfig.apiHost}/api/pbg-task-documents?status=1`, {
credentials: "include",
headers: {
Authorization: `Bearer ${document.querySelector("meta[name='api-token']").content}`,
"Content-Type": "application/json",
}
})
.then((response) => {
if (!response.ok) {
throw new Error("Network response was not ok");
}
return response.json();
})
.then((data) => {
const seriesData = data.data.series;
// document.getElementById(
// "countStatus1"
// ).innerText = `${data.data.count} Berkas`;
// document.getElementById(
// "totalStatus1"
// ).innerText = `Rp.${addThousandSeparators(data.data.total)}`;
})
.catch((error) => {
console.error("error fetching chart dara : ", error);
});
initChartKekuranganPotensi() {
document
.querySelectorAll(".document-count.chart-kekurangan-potensi")
.forEach((element) => {
element.innerText = ``;
});
document
.querySelectorAll(".document-total.chart-kekurangan-potensi")
.forEach((element) => {
element.innerText = `Rp.${addThousandSeparators(
this.totalKekuranganPotensi.toString()
)}`;
});
document
.querySelectorAll(".small-percentage.chart-kekurangan-potensi")
.forEach((element) => {
element.innerText = `${this.percentageKekuranganPotensi}%`;
});
}
initChartStatus2(){
fetch(`${GlobalConfig.apiHost}/api/pbg-task-documents?status=2`, {
credentials: "include",
headers: {
Authorization: `Bearer ${document.querySelector("meta[name='api-token']").content}`,
"Content-Type": "application/json",
}
})
.then((response) => {
if (!response.ok) {
throw new Error("Network response was not ok");
}
return response.json();
})
.then((data) => {
const seriesData = data.data.series;
// document.getElementById(
// "countStatus2"
// ).innerText = `${data.data.count} Berkas`;
// document.getElementById(
// "totalStatus2"
// ).innerText = `Rp.${addThousandSeparators(data.data.total)}`;
})
.catch((error) => {
console.error("error fetching chart dara : ", error);
});
initChartRealisasiTerbitPBG() {
document
.querySelectorAll(".document-count.chart-realisasi-tebit-pbg")
.forEach((element) => {
element.innerText = `0`;
});
document
.querySelectorAll(".document-total.chart-realisasi-tebit-pbg")
.forEach((element) => {
element.innerText = `Rp.${addThousandSeparators("0.00")}`;
});
document
.querySelectorAll(".small-percentage.chart-realisasi-tebit-pbg")
.forEach((element) => {
element.innerText = `0.00%`;
});
}
initChartStatus3(){
fetch(`${GlobalConfig.apiHost}/api/pbg-task-documents?status=3`, {
credentials: "include",
headers: {
Authorization: `Bearer ${document.querySelector("meta[name='api-token']").content}`,
"Content-Type": "application/json",
}
})
.then((response) => {
if (!response.ok) {
throw new Error("Network response was not ok");
}
return response.json();
})
.then((data) => {
const seriesData = data.data.series;
// document.getElementById(
// "countStatus3"
// ).innerText = `${data.data.count} Berkas`;
// document.getElementById(
// "totalStatus3"
// ).innerText = `Rp.${addThousandSeparators(data.data.total)}`;
})
.catch((error) => {
console.error("error fetching chart dara : ", error);
});
initChartMenungguKlikDPMPTSP() {
document
.querySelectorAll(".document-count.chart-menunggu-klik-dpmptsp")
.forEach((element) => {
element.innerText = `${0}`;
});
document
.querySelectorAll(".document-total.chart-menunggu-klik-dpmptsp")
.forEach((element) => {
element.innerText = `Rp.${addThousandSeparators("0.00")}`;
});
document
.querySelectorAll(".small-percentage.chart-menunggu-klik-dpmptsp")
.forEach((element) => {
element.innerText = `0.00%`;
});
}
initChartStatus4(){
fetch(`${GlobalConfig.apiHost}/api/pbg-task-documents?status=4`, {
credentials: "include",
headers: {
Authorization: `Bearer ${document.querySelector("meta[name='api-token']").content}`,
"Content-Type": "application/json",
}
})
.then((response) => {
if (!response.ok) {
throw new Error("Network response was not ok");
}
return response.json();
})
.then((data) => {
const seriesData = data.data.series;
// document.getElementById(
// "countStatus4"
// ).innerText = `${data.data.count} Berkas`;
// document.getElementById(
// "totalStatus4"
// ).innerText = `Rp.${addThousandSeparators(data.data.total)}`;
})
.catch((error) => {
console.error("error fetching chart dara : ", error);
});
initChartProsesDinasTeknis() {
document
.querySelectorAll(".document-count.chart-proses-dinas-teknis")
.forEach((element) => {
element.innerText = `${0}`;
});
document
.querySelectorAll(".document-total.chart-proses-dinas-teknis")
.forEach((element) => {
element.innerText = `Rp.${addThousandSeparators("0.00")}`;
});
document
.querySelectorAll(".small-percentage.chart-proses-dinas-teknis")
.forEach((element) => {
element.innerText = `0.00%`;
});
}
initChartStatus5(){
fetch(`${GlobalConfig.apiHost}/api/pbg-task-documents?status=5`, {
credentials: "include",
headers: {
Authorization: `Bearer ${document.querySelector("meta[name='api-token']").content}`,
"Content-Type": "application/json",
}
})
.then((response) => {
if (!response.ok) {
throw new Error("Network response was not ok");
}
return response.json();
})
.then((data) => {
const seriesData = data.data.series;
// document.getElementById(
// "countStatus5"
// ).innerText = `${data.data.count} Berkas`;
// document.getElementById(
// "totalStatus5"
// ).innerText = `Rp.${addThousandSeparators(data.data.total)}`;
})
.catch((error) => {
console.error("error fetching chart dara : ", error);
});
}
initChartStatus6(){
fetch(`${GlobalConfig.apiHost}/api/pbg-task-documents?status=6`, {
credentials: "include",
headers: {
Authorization: `Bearer ${document.querySelector("meta[name='api-token']").content}`,
"Content-Type": "application/json",
}
})
.then((response) => {
if (!response.ok) {
throw new Error("Network response was not ok");
}
return response.json();
})
.then((data) => {
const seriesData = data.data.series;
// document.getElementById(
// "countStatus6"
// ).innerText = `${data.data.count} Berkas`;
// document.getElementById(
// "totalStatus6"
// ).innerText = `Rp.${addThousandSeparators(data.data.total)}`;
})
.catch((error) => {
console.error("error fetching chart dara : ", error);
});
}
initChartStatus7(){
fetch(`${GlobalConfig.apiHost}/api/pbg-task-documents?status=7`, {
credentials: "include",
headers: {
Authorization: `Bearer ${document.querySelector("meta[name='api-token']").content}`,
"Content-Type": "application/json",
}
})
.then((response) => {
if (!response.ok) {
throw new Error("Network response was not ok");
}
return response.json();
})
.then((data) => {
const seriesData = data.data.series;
// document.getElementById(
// "countStatus7"
// ).innerText = `${data.data.count} Berkas`;
// document.getElementById(
// "totalStatus7"
// ).innerText = `Rp.${addThousandSeparators(data.data.total)}`;
})
.catch((error) => {
console.error("error fetching chart dara : ", error);
});
}
initChartStatus20(){
fetch(`${GlobalConfig.apiHost}/api/pbg-task-documents?status=20`, {
credentials: "include",
headers: {
Authorization: `Bearer ${document.querySelector("meta[name='api-token']").content}`,
"Content-Type": "application/json",
}
})
.then((response) => {
if (!response.ok) {
throw new Error("Network response was not ok");
}
return response.json();
})
.then((data) => {
const seriesData = data.data.series;
// document.getElementById(
// "countStatus20"
// ).innerText = `${data.data.count} Berkas`;
// document.getElementById(
// "totalStatus20"
// ).innerText = `Rp.${addThousandSeparators(data.data.total)}`;
})
.catch((error) => {
console.error("error fetching chart dara : ", error);
});
}
initChartStatus24(){
fetch(`${GlobalConfig.apiHost}/api/pbg-task-documents?status=24`, {
credentials: "include",
headers: {
Authorization: `Bearer ${document.querySelector("meta[name='api-token']").content}`,
"Content-Type": "application/json",
}
})
.then((response) => {
if (!response.ok) {
throw new Error("Network response was not ok");
}
return response.json();
})
.then((data) => {
const seriesData = data.data.series;
// document.getElementById(
// "countStatus24"
// ).innerText = `${data.data.count} Berkas`;
// document.getElementById(
// "totalStatus24"
// ).innerText = `Rp.${addThousandSeparators(data.data.total)}`;
})
.catch((error) => {
console.error("error fetching chart dara : ", error);
});
}
}
class ArrowConnectorCircles {
init(){
// Memanggil fungsi saat halaman dimuat dan ketika layar diubah ukurannya
document.addEventListener("resize", this.updateLine());
document.addEventListener("load", this.updateLine());
}
updateLine() {
const circle1 = document.getElementById("chart-all-task-1").getBoundingClientRect();
const circle2 = document.getElementById("chart-all-task-2").getBoundingClientRect();
const line = document.getElementById("connector-line");
console.log(circle1);
console.log(circle2);
line.setAttribute("x1", circle1.left + circle1.width / 2);
line.setAttribute("y1", circle1.top + circle1.height / 2);
line.setAttribute("x2", circle2.left + circle2.width / 2);
line.setAttribute("y2", circle2.top + circle2.height / 2);
initChartPotensiTataRuang() {
document
.querySelectorAll(".document-count.chart-potensi-tata-ruang")
.forEach((element) => {
element.innerText = `${0}`;
});
document
.querySelectorAll(".document-total.chart-potensi-tata-ruang")
.forEach((element) => {
element.innerText = `Rp.${addThousandSeparators("0.00")}`;
});
document
.querySelectorAll(".small-percentage.chart-potensi-tata-ruang")
.forEach((element) => {
element.innerText = `0.00%`;
});
}
}
document.addEventListener("DOMContentLoaded", async function (e) {
await new BigData().init();
// new ArrowConnectorCircles().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();
});

View File

@@ -0,0 +1,107 @@
import { Grid } from "gridjs/dist/gridjs.umd.js";
import gridjs from "gridjs/dist/gridjs.umd.js";
import "gridjs/dist/gridjs.umd.js";
import GlobalConfig from "../global-config.js";
class DataSettings {
init() {
this.getFetchApiData();
}
getFetchApiData() {
const table = new Grid({
columns: [
"ID",
"Key",
"Value",
"Created",
{
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>
`);
},
},
],
search: {
server: {
url: (prev, keyword) => `${prev}?search=${keyword}`,
},
},
pagination: {
limit: 15,
server: {
url: (prev, page) =>
`${prev}${prev.includes("?") ? "&" : "?"}page=${
page + 1
}`,
},
},
sort: true,
server: {
url: `${GlobalConfig.apiHost}/api/api-data-settings`,
headers: {
Authorization: `Bearer ${document
.querySelector('meta[name="api-token"]')
.getAttribute("content")}`,
"Content-Type": "application/json",
},
then: (data) =>
data.data.map((item) => [
item.id,
item.key,
item.value,
item.created_at,
item.id,
]),
total: (data) => data.meta.total,
},
});
table.render(document.getElementById("table-data-settings"));
document.addEventListener("click", this.handleDelete);
}
handleDelete(event) {
if (event.target.classList.contains("btn-delete-data-settings")) {
event.preventDefault();
const id = event.target.getAttribute("data-id");
if (confirm("Are you sure you want to delete this item?")) {
fetch(`/data-settings/${id}`, {
method: "DELETE",
headers: {
"X-CSRF-TOKEN": document
.querySelector('meta[name="csrf-token"]')
.getAttribute("content"),
"Content-Type": "application/json",
},
})
.then((response) => {
if (response.ok) {
alert("Item deleted successfully!");
window.location.reload();
} else {
return response.json().then((error) => {
throw new Error(
error.message || "Failed to delete item."
);
});
}
})
.catch((error) => {
console.error("Error deleting item:", error);
alert("Something went wrong. Please try again.");
});
}
}
}
}
document.addEventListener("DOMContentLoaded", function (e) {
new DataSettings().init();
});

View File

@@ -1,66 +0,0 @@
import { Grid } from "gridjs/dist/gridjs.umd.js";
import gridjs from "gridjs/dist/gridjs.umd.js";
import "gridjs/dist/gridjs.umd.js";
import GlobalConfig from "../../global-config.js";
import GeneralTable from "../../table-generator.js";
const dataAdvertisementsColumns = [
"No",
"Nama Wajib Pajak",
"NPWPD",
"Jenis Reklame",
"Isi Reklame",
"Alamat Wajib Pajak",
"Lokasi Reklame",
"Desa",
"Kecamatan",
"Kontak",
{
name: "Actions",
widht: "120px",
formatter: function(cell, row) {
const id = row.cells[10].data;
const model = "data/advertisements";
return gridjs.html(`
<div class="d-flex justify-items-end gap-10">
<button class="btn btn-warning me-2 btn-edit"
data-id="${id}"
data-model="${model}">
<i class='bx bx-edit' ></i></button>
<button class="btn btn-red btn-delete"
data-id="${id}">
<i class='bx bxs-trash' ></i></button>
</div>
`);
}
}
];
document.addEventListener("DOMContentLoaded", () => {
const table = new GeneralTable(
"reklame-data-table",
`${GlobalConfig.apiHost}/api/advertisements`,
`${GlobalConfig.apiHost}`,
dataAdvertisementsColumns
);
table.processData = function (data) {
return data.data.map((item) => {
return [
item.no,
item.business_name,
item.npwpd,
item.advertisement_type,
item.advertisement_content,
item.business_address,
item.advertisement_location,
item.village_name,
item.district_name,
item.contact,
item.id,
];
});
};
table.init();
});

View File

@@ -1,185 +0,0 @@
import GlobalConfig from "../../global-config";
document.addEventListener("DOMContentLoaded", function () {
const saveButton = document.querySelector(".modal-footer .btn-primary");
const modalButton = document.querySelector(".btn-modal");
const form = document.querySelector("form#create-update-form");
var authLogo = document.querySelector(".auth-logo");
if (!saveButton || !form) return;
saveButton.addEventListener("click", function () {
// Disable tombol dan tampilkan spinner
modalButton.disabled = true;
modalButton.innerHTML = `
<span class="spinner-border spinner-border-sm me-1" role="status" aria-hidden="true"></span>
Loading...
`;
const isEdit = saveButton.classList.contains("btn-edit");
const formData = new FormData(form)
const toast = document.getElementById('toastEditUpdate');
const toastBody = toast.querySelector('.toast-body');
const toastHeader = toast.querySelector('.toast-header small');
const data = {};
// Mengonversi FormData ke dalam JSON
formData.forEach((value, key) => {
data[key] = value;
});
// Log semua data dalam FormData
for (let pair of formData.entries()) {
console.log(pair[0] + ": " + pair[1]);
}
const url = form.getAttribute("action");
console.log("Ini adalah url dari form action", url);
const method = isEdit ? "PUT" : "POST";
fetch(url, {
method: method,
body: JSON.stringify(data),
headers: {
Authorization: `Bearer ${document
.querySelector('meta[name="api-token"]')
.getAttribute("content")}`,
"Content-Type": "application/json",
}
})
.then(response => response.json())
.then(data => {
console.log("Response data:", data);
if (!data.errors) {
// Remove existing icon (if any) before adding the new one
if (authLogo) {
// Hapus ikon yang sudah ada jika ada
const existingIcon = authLogo.querySelector('.bx');
if (existingIcon) {
authLogo.removeChild(existingIcon);
}
// Buat ikon baru
const icon = document.createElement('i');
icon.classList.add('bx', 'bxs-check-square');
icon.style.fontSize = '25px';
icon.style.color = 'green'; // Pastikan 'green' dalam bentuk string
// Tambahkan ikon ke dalam auth-logo
authLogo.appendChild(icon);
}
// Set success message for the toast
toastBody.textContent = isEdit ? "Data updated successfully!" : "Data created successfully!";
toast.classList.add('show'); // Show the toast
setTimeout(() => {
toast.classList.remove('show'); // Hide the toast after 3 seconds
}, 3000);
setTimeout(() => {
window.location.href = '/data/advertisements';
}, 3000);
} else {
if (authLogo) {
// Hapus ikon yang sudah ada jika ada
const existingIcon = authLogo.querySelector('.bx');
if (existingIcon) {
authLogo.removeChild(existingIcon);
}
// Buat ikon baru
const icon = document.createElement('i');
icon.classList.add('bx', 'bxs-error-alt');
icon.style.fontSize = '25px';
icon.style.color = 'red'; // Pastikan 'green' dalam bentuk string
// Tambahkan ikon ke dalam auth-logo
authLogo.appendChild(icon);
}
// Set error message for the toast
toastBody.textContent = "Error: " + (responseData.message || "Something went wrong");
toast.classList.add('show'); // Show the toast
// Enable button and reset its text on error
modalButton.disabled = false;
modalButton.innerHTML = isEdit ? "Update" : "Create";
setTimeout(() => {
toast.classList.remove('show'); // Hide the toast after 3 seconds
}, 3000);
}
})
.catch(error => {
console.error("Error:", error);
if (authLogo) {
// Hapus ikon yang sudah ada jika ada
const existingIcon = authLogo.querySelector('.bx');
if (existingIcon) {
authLogo.removeChild(existingIcon);
}
// Buat ikon baru
const icon = document.createElement('i');
icon.classList.add('bx', 'bxs-error-alt');
icon.style.fontSize = '25px';
icon.style.color = 'red'; // Pastikan 'green' dalam bentuk string
// Tambahkan ikon ke dalam auth-logo
authLogo.appendChild(icon);
}
// Set error message for the toast
toastBody.textContent = "An error occurred while processing your request.";
toast.classList.add('show'); // Show the toast
// Enable button and reset its text on error
modalButton.disabled = false;
modalButton.innerHTML = isEdit ? "Update" : "Create";
setTimeout(() => {
toast.classList.remove('show'); // Hide the toast after 3 seconds
}, 3000);
});
});
// Fungsi fetchOptions untuk autocomplete server-side
window.fetchOptions = function (field) {
let inputValue = document.getElementById(field).value;
console.log("Query Value:", inputValue); // Debugging log
if (inputValue.length < 2) return;
let districtValue = document.getElementById("district_name").value; // Ambil kecamatan terpilih
let url = `${GlobalConfig.apiHost}/api/combobox/search-options?query=${encodeURIComponent(inputValue)}&field=${field}`;
// Jika field desa, tambahkan kecamatan sebagai filter
if (field === "village_name") {
url += `&district=${encodeURIComponent(districtValue)}`;
}
fetch(url, {
method: 'GET',
headers: {
Authorization: `Bearer ${document
.querySelector('meta[name="api-token"]')
.getAttribute("content")}`,
"Content-Type": "application/json",
}
})
.then(response => response.json())
.then(data => {
let dataList = document.getElementById(field + "Options");
dataList.innerHTML = "";
data.forEach(item => {
let option = document.createElement("option");
option.value = item.name;
option.dataset.code = item.code;
dataList.appendChild(option);
});
})
.catch(error => console.error("Error fetching options:", error));
};
document.querySelector('.btn-back').addEventListener('click', function() {
window.history.back();
});
});

View File

@@ -1,149 +0,0 @@
import { Dropzone } from "dropzone";
import GlobalConfig from "../../global-config.js";
Dropzone.autoDiscover = false;
var previewTemplate,
dropzone,
dropzonePreviewNode = document.querySelector("#dropzone-preview-list");
console.log(previewTemplate);
console.log(dropzone);
console.log(dropzonePreviewNode);
(dropzonePreviewNode.id = ""),
dropzonePreviewNode &&
((previewTemplate = dropzonePreviewNode.parentNode.innerHTML),
dropzonePreviewNode.parentNode.removeChild(dropzonePreviewNode),
(dropzone = new Dropzone(".dropzone", {
url: `${GlobalConfig.apiHost}/api/advertisements/import`,
// url: "https://httpbin.org/post",
method: "post",
acceptedFiles: ".xls,.xlsx", // Use acceptedFiles for better validation
previewTemplate: previewTemplate,
previewsContainer: "#dropzone-preview",
autoProcessQueue: false, // Disable auto post
headers: {
Authorization: `Bearer ${document
.querySelector('meta[name="api-token"]')
.getAttribute("content")}`
},
init: function() {
// Listen for the success event
this.on("success", function(file, response) {
console.log("File successfully uploaded:", file);
console.log("API Response:", response);
// Show success toast
showToast('bxs-check-square', 'green', response.message);
document.getElementById("submit-upload").innerHTML = "Upload Files";
// Tunggu sebentar lalu reload halaman
setTimeout(() => {
window.location.href = "/data/advertisements";
}, 2000);
});
// Listen for the error event
this.on("error", function(file, errorMessage) {
console.error("Error uploading file:", file);
console.error("Error message:", errorMessage);
// Handle the error response
// Show error toast
showToast('bxs-error-alt', 'red', errorMessage.message);
document.getElementById("submit-upload").innerHTML = "Upload Files";
});
}
})));
// Add event listener to control the submission manually
document.querySelector("#submit-upload").addEventListener("click", function() {
console.log("Ini adalah value dropzone", dropzone.files[0]);
const formData = new FormData()
console.log("Dropzonefiles",dropzone.files);
this.innerHTML = '<span class="spinner-border spinner-border-sm me-1" role="status" aria-hidden="true"></span>Loading...';
// Pastikan ada file dalam queue sebelum memprosesnya
if (dropzone.files.length > 0) {
formData.append('file', dropzone.files[0])
console.log("ini adalah form data on submit", ...formData);
dropzone.processQueue(); // Ini akan manual memicu upload
} else {
// Show error toast when no file is selected
showToast('bxs-error-alt', 'red', "Please add a file first.");
document.getElementById("submit-upload").innerHTML = "Upload Files";
}
});
// Optional: Listen for the 'addedfile' event to log or control file add behavior
dropzone.on("addedfile", function (file) {
console.log("File ditambahkan:", file);
console.log("Nama File:", file.name);
console.log("Tipe File:", file.type);
console.log("Ukuran File:", (file.size / 1024).toFixed(2) + " KB");
});
dropzone.on("complete", function(file) {
dropzone.removeFile(file);
});
// Add event listener to donwload file template
document.getElementById('downloadtempadvertisement').addEventListener('click', function() {
var url = `${GlobalConfig.apiHost}/api/download-template-advertisement`;
fetch(url, {
method: 'GET',
headers: {
Authorization: `Bearer ${document
.querySelector('meta[name="api-token"]')
.getAttribute("content")}`
},
})
.then(response => {
if (response.ok) {
return response.blob();
} else {
return response.json();
}
})
.then((blob) => {
const url = window.URL.createObjectURL(blob);
const a = document.createElement('a');
a.style.display = 'none';
a.href = url;
a.download = 'template_reklame.xlsx';
document.body.appendChild(a);
a.click();
window.URL.revokeObjectURL(url);
})
.catch((error) => {
console.error("Gagal mendownload file:", error);
showToast('bxs-error-alt', 'red', "Template file is not already exist.");
})
})
// Function to show toast
function showToast(iconClass, iconColor, message) {
const toastElement = document.getElementById('toastUploadAdvertisement');
const toastBody = toastElement.querySelector('.toast-body');
const toastHeader = toastElement.querySelector('.toast-header');
// Remove existing icon (if any) before adding the new one
const existingIcon = toastHeader.querySelector('.bx');
if (existingIcon) {
toastHeader.querySelector('.auth-logo').removeChild(existingIcon); // Remove the existing icon
}
// Add the new icon to the toast header
const icon = document.createElement('i');
icon.classList.add('bx', iconClass);
icon.style.fontSize = '25px';
icon.style.color = iconColor;
toastHeader.querySelector('.auth-logo').appendChild(icon);
// Set the toast message
toastBody.textContent = message;
// Show the toast
const toast = new bootstrap.Toast(toastElement); // Inisialisasi Bootstrap Toast
toast.show();
}

View File

@@ -1,79 +0,0 @@
import { Grid } from "gridjs/dist/gridjs.umd.js";
import gridjs from "gridjs/dist/gridjs.umd.js";
import "gridjs/dist/gridjs.umd.js";
import GlobalConfig from "../../global-config.js";
import GeneralTable from "../../table-generator.js";
const dataTourismsColumns = [
"Proyek ID",
"Jenis Proyek",
"NIB",
"Nama Perusahaan",
"Terbit OSS",
"Status Penanaman Modal",
"Bentuk Bisnis",
"Uraian Resiko Proyek",
"Nama Proyek",
"Alamat Usaha",
"Kecamatan",
"Desa",
"Luas Tanah",
"Jumlah Investasi",
"TKI",
"Tipe Usaha",
{
name: "Actions",
widht: "120px",
formatter: function(cell, row) {
const id = row.cells[16].data;
const model = "data/tourisms";
return gridjs.html(`
<div class="d-flex justify-items-end gap-10">
<button class="btn btn-warning me-2 btn-edit"
data-id="${id}"
data-model="${model}">
<i class='bx bx-edit' ></i></button>
<button class="btn btn-red btn-delete"
data-id="${id}">
<i class='bx bxs-trash' ></i></button>
</div>
`);
}
}
];
document.addEventListener("DOMContentLoaded", () => {
const table = new GeneralTable(
"tourisms-data-table",
`${GlobalConfig.apiHost}/api/tourisms`,
`${GlobalConfig.apiHost}`,
dataTourismsColumns
);
table.processData = function (data) {
return data.data.map((item) => {
return [
item.project_id,
item.jenis_project,
item.nib,
item.business_name,
item.terbit_oss,
item.status_penanaman_modal,
item.business_form,
item.uraian_resiko_project,
item.project_name,
item.business_address,
item.district_name,
item.village_name,
item.land_area,
item.investment_amount,
item.number_of_employee,
item.business_type,
item.id,
];
});
};
table.init();
})

View File

@@ -1,149 +0,0 @@
import { Dropzone } from "dropzone";
import GlobalConfig from "../../global-config.js";
Dropzone.autoDiscover = false;
var previewTemplate,
dropzone,
dropzonePreviewNode = document.querySelector("#dropzone-preview-list");
console.log(previewTemplate);
console.log(dropzone);
console.log(dropzonePreviewNode);
(dropzonePreviewNode.id = ""),
dropzonePreviewNode &&
((previewTemplate = dropzonePreviewNode.parentNode.innerHTML),
dropzonePreviewNode.parentNode.removeChild(dropzonePreviewNode),
(dropzone = new Dropzone(".dropzone", {
url: `${GlobalConfig.apiHost}/api/tourisms/import`,
// url: "https://httpbin.org/post",
method: "post",
acceptedFiles: ".xls,.xlsx", // Use acceptedFiles for better validation
previewTemplate: previewTemplate,
previewsContainer: "#dropzone-preview",
autoProcessQueue: false, // Disable auto post
headers: {
Authorization: `Bearer ${document
.querySelector('meta[name="api-token"]')
.getAttribute("content")}`
},
init: function() {
// Listen for the success event
this.on("success", function(file, response) {
console.log("File successfully uploaded:", file);
console.log("API Response:", response);
// Show success toast
showToast('bxs-check-square', 'green', response.message);
document.getElementById("submit-upload").innerHTML = "Upload Files";
// Tunggu sebentar lalu reload halaman
setTimeout(() => {
window.location.href = "/data/tourisms";
}, 2000);
});
// Listen for the error event
this.on("error", function(file, errorMessage) {
console.error("Error uploading file:", file);
console.error("Error message:", errorMessage);
// Handle the error response
// Show error toast
showToast('bxs-error-alt', 'red', errorMessage.message);
document.getElementById("submit-upload").innerHTML = "Upload Files";
});
}
})));
// Add event listener to control the submission manually
document.querySelector("#submit-upload").addEventListener("click", function() {
console.log("Ini adalah value dropzone", dropzone.files[0]);
const formData = new FormData()
console.log("Dropzonefiles",dropzone.files);
this.innerHTML = '<span class="spinner-border spinner-border-sm me-1" role="status" aria-hidden="true"></span>Loading...';
// Pastikan ada file dalam queue sebelum memprosesnya
if (dropzone.files.length > 0) {
formData.append('file', dropzone.files[0])
console.log("ini adalah form data on submit", ...formData);
dropzone.processQueue(); // Ini akan manual memicu upload
} else {
// Show error toast when no file is selected
showToast('bxs-error-alt', 'red', "Please add a file first.");
document.getElementById("submit-upload").innerHTML = "Upload Files";
}
});
// Optional: Listen for the 'addedfile' event to log or control file add behavior
dropzone.on("addedfile", function (file) {
console.log("File ditambahkan:", file);
console.log("Nama File:", file.name);
console.log("Tipe File:", file.type);
console.log("Ukuran File:", (file.size / 1024).toFixed(2) + " KB");
});
dropzone.on("complete", function(file) {
dropzone.removeFile(file);
});
// Add event listener to download file template
document.getElementById('downloadtemptourisms').addEventListener('click', function() {
var url = `${GlobalConfig.apiHost}/api/download-template-umkm`;
fetch(url, {
method: 'GET',
headers: {
Authorization: `Bearer ${document
.querySelector('meta[name="api-token"]')
.getAttribute("content")}`
},
})
.then(response => {
if (response.ok) {
return response.blob(); // Jika respons OK, konversi menjadi blob
} else {
return response.json(); // Jika respons gagal, konversi menjadi JSON untuk menangani pesan error
}
})
.then((blob) => {
const url = window.URL.createObjectURL(blob);
const a = document.createElement('a');
a.style.display = 'none';
a.href = url;
a.download = 'template_tourisms.xlsx';
document.body.appendChild(a);
a.click();
window.URL.revokeObjectURL(url);
})
.catch((error) => {
console.error("Gagal mendownload file:", error);
showToast('bxs-error-alt', 'red', "Template file is not already exist.");
})
})
// Function to show toast
function showToast(iconClass, iconColor, message) {
const toastElement = document.getElementById('toastUploadUmkm');
const toastBody = toastElement.querySelector('.toast-body');
const toastHeader = toastElement.querySelector('.toast-header');
// Remove existing icon (if any) before adding the new one
const existingIcon = toastHeader.querySelector('.bx');
if (existingIcon) {
toastHeader.querySelector('.auth-logo').removeChild(existingIcon); // Remove the existing icon
}
// Add the new icon to the toast header
const icon = document.createElement('i');
icon.classList.add('bx', iconClass);
icon.style.fontSize = '25px';
icon.style.color = iconColor;
toastHeader.querySelector('.auth-logo').appendChild(icon);
// Set the toast message
toastBody.textContent = message;
// Show the toast
const toast = new bootstrap.Toast(toastElement); // Inisialisasi Bootstrap Toast
toast.show();
}

View File

@@ -1,81 +0,0 @@
import gridjs from "gridjs/dist/gridjs.umd.js";
import "gridjs/dist/gridjs.umd.js";
import GlobalConfig from "../../global-config.js";
import GeneralTable from "../../table-generator.js";
const dataUMKMColumns = [
"Nama Usaha",
"Alamat Usaha",
"Deskripsi Usaha",
"Kontak Usaha",
"NIB",
"Skala Usaha",
"NIK",
"Nama Pemilik",
"Alamat Pemilik",
"Kontak Pemilik",
"Jenis Usaha",
"Bentuk Usaha",
"Revenue",
"Desa",
"Kecamatan",
"Jumlah Karyawan",
"Luas Tanah",
"Ijin Status",
{
name: "Actions",
widht: "120px",
formatter: function(cell, row) {
const id = row.cells[18].data;
const model = "data/umkm";
return gridjs.html(`
<div class="d-flex justify-items-end gap-10">
<button class="btn btn-warning me-2 btn-edit"
data-id="${id}"
data-model="${model}">
<i class='bx bx-edit' ></i></button>
<button class="btn btn-red btn-delete"
data-id="${id}">
<i class='bx bxs-trash' ></i></button>
</div>
`);
}
}
];
document.addEventListener("DOMContentLoaded", () => {
const table = new GeneralTable(
"umkm-data-table",
`${GlobalConfig.apiHost}/api/umkm`,
`${GlobalConfig.apiHost}`,
dataUMKMColumns
);
table.processData = function (data) {
return data.data.map((item) => {
return [
item.business_name,
item.business_address,
item.business_desc,
item.business_contact,
item.business_id_number,
item.business_scale,
item.owner_id,
item.owner_name,
item.owner_address,
item.owner_contact,
item.business_type,
item.business_form,
item.revenue,
item.village_name,
item.district_name,
item.number_of_employee,
item.land_area,
item.permit_status,
item.id,
];
});
};
table.init();
});

View File

@@ -1,185 +0,0 @@
import GlobalConfig from "../../global-config";
document.addEventListener("DOMContentLoaded", function () {
const saveButton = document.querySelector(".modal-footer .btn-primary");
const modalButton = document.querySelector(".btn-modal");
const form = document.querySelector("form#create-update-form");
var authLogo = document.querySelector(".auth-logo");
if (!saveButton || !form) return;
saveButton.addEventListener("click", function () {
// Disable tombol dan tampilkan spinner
modalButton.disabled = true;
modalButton.innerHTML = `
<span class="spinner-border spinner-border-sm me-1" role="status" aria-hidden="true"></span>
Loading...
`;
const isEdit = saveButton.classList.contains("btn-edit");
const formData = new FormData(form)
const toast = document.getElementById('toastEditUpdate');
const toastBody = toast.querySelector('.toast-body');
const toastHeader = toast.querySelector('.toast-header small');
const data = {};
// Mengonversi FormData ke dalam JSON
formData.forEach((value, key) => {
data[key] = value;
});
// Log semua data dalam FormData
for (let pair of formData.entries()) {
console.log(pair[0] + ": " + pair[1]);
}
const url = form.getAttribute("action");
console.log("Ini adalah url dari form action", url);
const method = isEdit ? "PUT" : "POST";
fetch(url, {
method: method,
body: JSON.stringify(data),
headers: {
Authorization: `Bearer ${document
.querySelector('meta[name="api-token"]')
.getAttribute("content")}`,
"Content-Type": "application/json",
}
})
.then(response => response.json())
.then(data => {
console.log("Response data:", data);
if (!data.errors) {
// Remove existing icon (if any) before adding the new one
if (authLogo) {
// Hapus ikon yang sudah ada jika ada
const existingIcon = authLogo.querySelector('.bx');
if (existingIcon) {
authLogo.removeChild(existingIcon);
}
// Buat ikon baru
const icon = document.createElement('i');
icon.classList.add('bx', 'bxs-check-square');
icon.style.fontSize = '25px';
icon.style.color = 'green'; // Pastikan 'green' dalam bentuk string
// Tambahkan ikon ke dalam auth-logo
authLogo.appendChild(icon);
}
// Set success message for the toast
toastBody.textContent = isEdit ? "Data updated successfully!" : "Data created successfully!";
toast.classList.add('show'); // Show the toast
setTimeout(() => {
toast.classList.remove('show'); // Hide the toast after 3 seconds
}, 3000);
setTimeout(() => {
window.location.href = '/data/umkm';
}, 3000);
} else {
if (authLogo) {
// Hapus ikon yang sudah ada jika ada
const existingIcon = authLogo.querySelector('.bx');
if (existingIcon) {
authLogo.removeChild(existingIcon);
}
// Buat ikon baru
const icon = document.createElement('i');
icon.classList.add('bx', 'bxs-error-alt');
icon.style.fontSize = '25px';
icon.style.color = 'red'; // Pastikan 'green' dalam bentuk string
// Tambahkan ikon ke dalam auth-logo
authLogo.appendChild(icon);
}
// Set error message for the toast
toastBody.textContent = "Error: " + (data.message || "Something went wrong");
toast.classList.add('show'); // Show the toast
// Enable button and reset its text on error
modalButton.disabled = false;
modalButton.innerHTML = isEdit ? "Update" : "Create";
setTimeout(() => {
toast.classList.remove('show'); // Hide the toast after 3 seconds
}, 3000);
}
})
.catch(error => {
console.error("Error:", error);
if (authLogo) {
// Hapus ikon yang sudah ada jika ada
const existingIcon = authLogo.querySelector('.bx');
if (existingIcon) {
authLogo.removeChild(existingIcon);
}
// Buat ikon baru
const icon = document.createElement('i');
icon.classList.add('bx', 'bxs-error-alt');
icon.style.fontSize = '25px';
icon.style.color = 'red'; // Pastikan 'green' dalam bentuk string
// Tambahkan ikon ke dalam auth-logo
authLogo.appendChild(icon);
}
// Set error message for the toast
toastBody.textContent = "An error occurred while processing your request.";
toast.classList.add('show'); // Show the toast
// Enable button and reset its text on error
modalButton.disabled = false;
modalButton.innerHTML = isEdit ? "Update" : "Create";
setTimeout(() => {
toast.classList.remove('show'); // Hide the toast after 3 seconds
}, 3000);
});
});
// Fungsi fetchOptions untuk autocomplete server-side
window.fetchOptions = function (field) {
let inputValue = document.getElementById(field).value;
console.log("Query Value:", inputValue); // Debugging log
if (inputValue.length < 2) return;
let districtValue = document.getElementById("district_name").value; // Ambil kecamatan terpilih
let url = `${GlobalConfig.apiHost}/api/combobox/search-options?query=${encodeURIComponent(inputValue)}&field=${field}`;
// Jika field desa, tambahkan kecamatan sebagai filter
if (field === "village_name") {
url += `&district=${encodeURIComponent(districtValue)}`;
}
fetch(url, {
method: 'GET',
headers: {
Authorization: `Bearer ${document
.querySelector('meta[name="api-token"]')
.getAttribute("content")}`,
"Content-Type": "application/json",
}
})
.then(response => response.json())
.then(data => {
let dataList = document.getElementById(field + "Options");
dataList.innerHTML = "";
data.forEach(item => {
let option = document.createElement("option");
option.value = item.name;
option.dataset.code = item.code;
dataList.appendChild(option);
});
})
.catch(error => console.error("Error fetching options:", error));
};
document.querySelector('.btn-back').addEventListener('click', function() {
window.history.back();
});
});

View File

@@ -1,149 +0,0 @@
import { Dropzone } from "dropzone";
import GlobalConfig from "../../global-config.js";
Dropzone.autoDiscover = false;
var previewTemplate,
dropzone,
dropzonePreviewNode = document.querySelector("#dropzone-preview-list");
console.log(previewTemplate);
console.log(dropzone);
console.log(dropzonePreviewNode);
(dropzonePreviewNode.id = ""),
dropzonePreviewNode &&
((previewTemplate = dropzonePreviewNode.parentNode.innerHTML),
dropzonePreviewNode.parentNode.removeChild(dropzonePreviewNode),
(dropzone = new Dropzone(".dropzone", {
url: `${GlobalConfig.apiHost}/api/umkm/import`,
// url: "https://httpbin.org/post",
method: "post",
acceptedFiles: ".xls,.xlsx", // Use acceptedFiles for better validation
previewTemplate: previewTemplate,
previewsContainer: "#dropzone-preview",
autoProcessQueue: false, // Disable auto post
headers: {
Authorization: `Bearer ${document
.querySelector('meta[name="api-token"]')
.getAttribute("content")}`
},
init: function() {
// Listen for the success event
this.on("success", function(file, response) {
console.log("File successfully uploaded:", file);
console.log("API Response:", response);
// Show success toast
showToast('bxs-check-square', 'green', response.message);
document.getElementById("submit-upload").innerHTML = "Upload Files";
// Tunggu sebentar lalu reload halaman
setTimeout(() => {
window.location.href = "/data/umkm";
}, 2000);
});
// Listen for the error event
this.on("error", function(file, errorMessage) {
console.error("Error uploading file:", file);
console.error("Error message:", errorMessage);
// Handle the error response
// Show error toast
showToast('bxs-error-alt', 'red', errorMessage.message);
document.getElementById("submit-upload").innerHTML = "Upload Files";
});
}
})));
// Add event listener to control the submission manually
document.querySelector("#submit-upload").addEventListener("click", function() {
console.log("Ini adalah value dropzone", dropzone.files[0]);
const formData = new FormData()
console.log("Dropzonefiles",dropzone.files);
this.innerHTML = '<span class="spinner-border spinner-border-sm me-1" role="status" aria-hidden="true"></span>Loading...';
// Pastikan ada file dalam queue sebelum memprosesnya
if (dropzone.files.length > 0) {
formData.append('file', dropzone.files[0])
console.log("ini adalah form data on submit", ...formData);
dropzone.processQueue(); // Ini akan manual memicu upload
} else {
// Show error toast when no file is selected
showToast('bxs-error-alt', 'red', "Please add a file first.");
document.getElementById("submit-upload").innerHTML = "Upload Files";
}
});
// Optional: Listen for the 'addedfile' event to log or control file add behavior
dropzone.on("addedfile", function (file) {
console.log("File ditambahkan:", file);
console.log("Nama File:", file.name);
console.log("Tipe File:", file.type);
console.log("Ukuran File:", (file.size / 1024).toFixed(2) + " KB");
});
dropzone.on("complete", function(file) {
dropzone.removeFile(file);
});
// Add event listener to download file template
document.getElementById('downloadtempumkm').addEventListener('click', function() {
var url = `${GlobalConfig.apiHost}/api/download-template-umkm`;
fetch(url, {
method: 'GET',
headers: {
Authorization: `Bearer ${document
.querySelector('meta[name="api-token"]')
.getAttribute("content")}`
},
})
.then(response => {
if (response.ok) {
return response.blob(); // Jika respons OK, konversi menjadi blob
} else {
return response.json(); // Jika respons gagal, konversi menjadi JSON untuk menangani pesan error
}
})
.then((blob) => {
const url = window.URL.createObjectURL(blob);
const a = document.createElement('a');
a.style.display = 'none';
a.href = url;
a.download = 'template_umkm.xlsx';
document.body.appendChild(a);
a.click();
window.URL.revokeObjectURL(url);
})
.catch((error) => {
console.error("Gagal mendownload file:", error);
showToast('bxs-error-alt', 'red', "Template file is not already exist.");
})
})
// Function to show toast
function showToast(iconClass, iconColor, message) {
const toastElement = document.getElementById('toastUploadUmkm');
const toastBody = toastElement.querySelector('.toast-body');
const toastHeader = toastElement.querySelector('.toast-header');
// Remove existing icon (if any) before adding the new one
const existingIcon = toastHeader.querySelector('.bx');
if (existingIcon) {
toastHeader.querySelector('.auth-logo').removeChild(existingIcon); // Remove the existing icon
}
// Add the new icon to the toast header
const icon = document.createElement('i');
icon.classList.add('bx', iconClass);
icon.style.fontSize = '25px';
icon.style.color = iconColor;
toastHeader.querySelector('.auth-logo').appendChild(icon);
// Set the toast message
toastBody.textContent = message;
// Show the toast
const toast = new bootstrap.Toast(toastElement); // Inisialisasi Bootstrap Toast
toast.show();
}

View File

@@ -1,12 +1,28 @@
const GlobalConfig = {
apiHost: 'http://localhost:8000'
apiHost: "http://localhost:8000",
};
export default GlobalConfig;
export function addThousandSeparators(number, fractionDigits = 2) {
return new Intl.NumberFormat('en-US', {
minimumFractionDigits: fractionDigits,
maximumFractionDigits: fractionDigits,
}).format(number);
}
export function addThousandSeparators(value, fractionDigits = 2) {
if (!value) return null; // Handle empty or null values
// Remove any non-numeric characters except commas and dots
value = value.replace(/[^0-9,.]/g, "");
// If the value contains multiple dots, assume dots are thousand separators
if ((value.match(/\./g) || []).length > 1) {
value = value.replace(/\./g, "");
}
// Convert to a proper decimal number
let number = parseFloat(value.replace(",", "."));
if (isNaN(number)) return null; // Return null if conversion fails
// Format the number with thousand separators
return new Intl.NumberFormat("en-US", {
minimumFractionDigits: fractionDigits,
maximumFractionDigits: fractionDigits,
}).format(number);
}

View File

@@ -0,0 +1,132 @@
import GlobalConfig from "../global-config.js";
class MultiFormCreatePBG {
constructor() {
this.currentStep = 1;
this.totalSteps = 4;
this.formData = {}; // Menyimpan data dari semua langkah
}
init() {
document
.getElementById("nextStep")
.addEventListener("click", () => this.nextStep());
document
.getElementById("prevStep")
.addEventListener("click", () => this.prevStep());
}
nextStep() {
if (!this.validateStep()) return;
this.saveStepData();
if (this.currentStep < this.totalSteps) {
document
.getElementById(`step${this.currentStep}`)
.classList.add("d-none");
this.currentStep++;
document
.getElementById(`step${this.currentStep}`)
.classList.remove("d-none");
document.getElementById(
"stepTitle"
).innerText = `Step ${this.currentStep}`;
document.getElementById("prevStep").disabled = false;
document.getElementById("nextStep").innerText =
this.currentStep === this.totalSteps ? "Submit" : "Next →";
} else {
this.submitForm(); // Submit ke API jika sudah step terakhir
}
}
prevStep() {
if (this.currentStep > 1) {
document
.getElementById(`step${this.currentStep}`)
.classList.add("d-none");
this.currentStep--;
document
.getElementById(`step${this.currentStep}`)
.classList.remove("d-none");
document.getElementById(
"stepTitle"
).innerText = `Step ${this.currentStep}`;
document.getElementById("prevStep").disabled =
this.currentStep === 1;
document.getElementById("nextStep").innerText = "Next →";
}
}
saveStepData() {
const stepForm = document.querySelector(`#step${this.currentStep}Form`);
const formDataObj = new FormData(stepForm);
if (!this.formData) {
this.formData = {};
}
const stepKey = `step${this.currentStep}Form`;
this.formData[stepKey] = {};
for (const [key, value] of formDataObj.entries()) {
this.formData[stepKey][key] = value;
}
console.log("form data", this.formData);
}
validateStep() {
const stepForm = document.querySelector(`#step${this.currentStep}Form`);
const inputs = stepForm.querySelectorAll(
"input[required], select[required]"
);
let isValid = true;
inputs.forEach((input) => {
if (!input.value) {
input.classList.add("is-invalid");
isValid = false;
} else {
input.classList.remove("is-invalid");
}
});
return isValid;
}
async submitForm() {
try {
const response = await fetch(
`${GlobalConfig.apiHost}/api/api-pbg-task`,
{
method: "POST",
headers: {
Authorization: `Bearer ${
document.querySelector("meta[name='api-token']")
.content
}`,
"Content-Type": "application/json",
},
body: JSON.stringify(this.formData),
}
);
const result = await response.json();
alert(result.message);
window.location.href = "/pbg-task";
} catch (error) {
console.error("Error submitting form:", error);
alert("Terjadi kesalahan saat mengirim data.");
}
}
}
document.addEventListener("DOMContentLoaded", function () {
new MultiFormCreatePBG().init();
});

View File

@@ -0,0 +1,69 @@
import { Grid } from "gridjs/dist/gridjs.umd.js";
import "gridjs/dist/gridjs.umd.js";
import GlobalConfig from "../global-config";
class PbgTasks {
init() {
this.initTableRequestAssignment();
}
initTableRequestAssignment() {
new Grid({
columns: [
"ID",
{ name: "Name", width: "15%" },
{ name: "Condition", width: "7%" },
"Registration Number",
"Document Number",
{ name: "Address", width: "30%" },
"Status",
"Function Type",
"Consultation Type",
{ name: "Due Date", width: "7%" },
],
search: {
server: {
url: (prev, keyword) => `${prev}?search=${keyword}`,
},
},
pagination: {
limit: 15,
server: {
url: (prev, page) =>
`${prev}${prev.includes("?") ? "&" : "?"}page=${
page + 1
}`,
},
},
sort: true,
server: {
url: `${GlobalConfig.apiHost}/api/request-assignments`,
credentials: "include",
headers: {
Authorization: `Bearer ${document
.querySelector('meta[name="api-token"]')
.getAttribute("content")}`,
"Content-Type": "application/json",
},
then: (data) =>
data.data.map((item) => [
item.id,
item.name,
item.condition,
item.registration_number,
item.document_number,
item.address,
item.status_name,
item.function_type,
item.consultation_type,
item.due_date,
]),
total: (data) => data.meta.total,
},
}).render(document.getElementById("table-pbg-tasks"));
}
}
document.addEventListener("DOMContentLoaded", function (e) {
new PbgTasks().init();
});

View File

@@ -1,16 +0,0 @@
import gridjs from "gridjs/dist/gridjs.umd.js";
import "gridjs/dist/gridjs.umd.js";
// Mengambil data dari input dengan id="business_type_counts"
const businessTypeCountsElement = document.getElementById("business_type_counts");
console.log(businessTypeCountsElement);
const businessTypeCounts = JSON.parse(businessTypeCountsElement.value); // Cek apakah data sudah terbawa dengan benar
// Membuat Grid.js instance
new gridjs.Grid({
columns: ["Jenis Bisnis Pariwisata", "Jumlah Total"], // Nama kolom
data: businessTypeCounts.map(item => [item.business_type, item.count]), // Mengubah data untuk Grid.js
search: true, // Menambahkan fitur pencarian
pagination: true, // Menambahkan fitur pagination
sort: true, // Menambahkan fitur sorting
}).render(document.getElementById("tourisms-report-data-table"));

View File

@@ -7,6 +7,7 @@ class SyncronizeTask {
init() {
this.initTableImportDatasources();
this.handleSubmitSync();
this.handleSubmitSnycGoogleSheet();
}
initTableImportDatasources() {
new Grid({
@@ -48,68 +49,112 @@ class SyncronizeTask {
}
handleSubmitSync() {
const button = document.getElementById("btn-sync-submit");
// Check if the button should be enabled or disabled based on the status
fetch(`${GlobalConfig.apiHost}/api/import-datasource/check-datasource`, {
method: "GET",
headers: {
Authorization: `Bearer ${document
.querySelector('meta[name="api-token"]')
.getAttribute("content")}`,
"Content-Type": "application/json",
fetch(
`${GlobalConfig.apiHost}/api/import-datasource/check-datasource`,
{
method: "GET",
headers: {
Authorization: `Bearer ${document
.querySelector('meta[name="api-token"]')
.getAttribute("content")}`,
"Content-Type": "application/json",
},
}
})
.then(response => {
if (!response.ok) {
throw new Error("Network response was not ok");
}
return response.json();
})
.then(data => {
console.log("data check button sync", data.can_execute);
button.disabled = !data.can_execute;
// If the button is enabled, add click event to trigger sync
if (!button.disabled) {
button.addEventListener("click", function(e) {
button.disabled = true; // Disable button to prevent multiple clicks
button.textContent = "Syncing..."; // Change button text to show syncing
// Trigger the scraping API call
fetch(`${GlobalConfig.apiHost}/api/scraping`, {
method: "GET",
headers: {
Authorization: `Bearer ${document
.querySelector('meta[name="api-token"]')
.getAttribute("content")}`,
"Content-Type": "application/json",
}
})
.then(response => {
if (!response.ok) {
throw new Error("Network response was not ok");
}
return response.json();
})
.then(data => {
console.log("data sync button", data);
alert("Synchronization executed successfully");
window.location.reload();
})
.catch(err => {
console.error("Fetch error:", err);
alert("An error occurred during synchronization");
})
.finally(() => {
button.disabled = false; // Re-enable the button after the request is complete
button.textContent = "Sync Data"; // Reset button text
)
.then((response) => {
if (!response.ok) {
throw new Error("Network response was not ok");
}
return response.json();
})
.then((data) => {
console.log("data check button sync", data.can_execute);
button.disabled = !data.can_execute;
// If the button is enabled, add click event to trigger sync
if (!button.disabled) {
button.addEventListener("click", function (e) {
button.disabled = true; // Disable button to prevent multiple clicks
button.textContent = "Syncing..."; // Change button text to show syncing
// Trigger the scraping API call
fetch(`${GlobalConfig.apiHost}/api/scraping`, {
method: "GET",
headers: {
Authorization: `Bearer ${document
.querySelector('meta[name="api-token"]')
.getAttribute("content")}`,
"Content-Type": "application/json",
},
})
.then((response) => {
if (!response.ok) {
throw new Error(
"Network response was not ok"
);
}
return response.json();
})
.then((data) => {
console.log("data sync button", data);
alert("Synchronization executed successfully");
window.location.reload();
})
.catch((err) => {
console.error("Fetch error:", err);
alert(
"An error occurred during synchronization"
);
})
.finally(() => {
button.disabled = false; // Re-enable the button after the request is complete
button.textContent = "Sync Data"; // Reset button text
});
});
}
})
.catch((err) => {
console.error("Fetch error:", err);
alert("An error occurred while checking the datasource");
});
}
handleSubmitSnycGoogleSheet() {
const button = document.getElementById("btn-sync-submit-google-sheet");
button.addEventListener("click", function (e) {
button.disabled = true; // Disable button to prevent multiple clicks
button.textContent = "Syncing..."; // Change button text to show syncing
// Trigger the scraping API call
fetch(`${GlobalConfig.apiHost}/api/sync-pbg-task-google-sheet`, {
method: "GET",
headers: {
Authorization: `Bearer ${document
.querySelector('meta[name="api-token"]')
.getAttribute("content")}`,
"Content-Type": "application/json",
},
})
.then((response) => {
if (!response.ok) {
throw new Error("Network response was not ok");
}
return response.json();
})
.then((data) => {
console.log("data sync button", data);
alert("Synchronization executed successfully");
window.location.reload();
})
.catch((err) => {
console.error("Fetch error:", err);
alert("An error occurred during synchronization");
})
.finally(() => {
button.disabled = false; // Re-enable the button after the request is complete
button.textContent = "Sync Google Sheet"; // Reset button text
});
}
})
.catch(err => {
console.error("Fetch error:", err);
alert("An error occurred while checking the datasource");
});
}
}

View File

@@ -1,160 +0,0 @@
import { Grid } from "gridjs/dist/gridjs.umd.js";
import "gridjs/dist/gridjs.umd.js";
import Swal from "sweetalert2";
class GeneralTable {
constructor(tableId, apiUrl, baseUrl, columns, options = {}) {
this.tableId = tableId;
this.apiUrl = apiUrl;
this.baseUrl = baseUrl; // Tambahkan base URL
this.columns = columns;
this.options = options;
}
init() {
const table = new Grid({
columns: this.columns,
search: this.options.search || {
server: {
url: (prev, keyword) => `${prev}?search=${keyword}`,
},
},
pagination: this.options.pagination || {
limit: 15,
server: {
url: (prev, page) =>
`${prev}${prev.includes("?") ? "&" : "?"}page=${page + 1}`,
},
},
sort: this.options.sort || true,
server: {
url: this.apiUrl,
headers: this.options.headers || {
Authorization: `Bearer ${document
.querySelector('meta[name="api-token"]')
.getAttribute("content")}`,
"Content-Type": "application/json",
},
then: (data) => this.processData(data),
total: (data) => data.meta.total,
},
});
table.render(document.getElementById(this.tableId));
this.handleActions();
}
// Memproses data dari API
processData(data) {
return data.data.map((item) => {
return this.columns.map((column) => {
return item[column] || '';
});
});
}
handleActions() {
document.addEventListener("click", (event) => {
if (event.target && event.target.classList.contains('btn-edit')) {
this.handleEdit(event);
}
else if (event.target && event.target.classList.contains('btn-delete')) {
this.handleDelete(event);
}
else if (event.target && event.target.classList.contains('btn-create')) {
this.handleCreate(event);
} else if (event.target && event.target.classList.contains('btn-bulk-create')) {
this.handleBulkCreate(event);
}
});
}
// Fungsi untuk menangani create
handleCreate(event) {
// Menggunakan model dan ID untuk membangun URL dinamis
const model = event.target.getAttribute('data-model'); // Mengambil model dari data-model
window.location.href = `${this.baseUrl}/${model}/create`;
}
handleBulkCreate(event) {
// Menggunakan model dan ID untuk membangun URL dinamis
const model = event.target.getAttribute('data-model');
window.location.href = `${this.baseUrl}/${model}/bulk-create`;
}
// Fungsi untuk menangani edit
handleEdit(event) {
const id = event.target.getAttribute('data-id');
const model = event.target.getAttribute('data-model'); // Mengambil model dari data-model
console.log('Editing record with ID:', id);
// Menggunakan model dan ID untuk membangun URL dinamis
window.location.href = `${this.baseUrl}/${model}/${id}/edit`;
}
// Fungsi untuk menangani delete
handleDelete(event) {
const id = event.target.getAttribute('data-id');
console.log(id);
// if (confirm("Are you sure you want to delete this item?")) {
// this.deleteRecord(id);
// }
Swal.fire({
title: "Are you sure?",
text: "You won't be able to revert this!",
icon: "warning",
showCancelButton: true,
confirmButtonColor: "#d33",
cancelButtonColor: "#3085d6",
confirmButtonText: "Yes, delete it!"
}).then((result) => {
if (result.isConfirmed) {
this.deleteRecord(id);
Swal.fire({
title: "Deleted!",
text: "Your record has been deleted.",
icon: "success",
showConfirmButton: false, // Menghilangkan tombol OK
timer: 2000 // Menutup otomatis dalam 2 detik (opsional)
});
}
});
}
async deleteRecord(id) {
try {
console.log(id);
const response = await fetch(`${this.apiUrl}/${id}`, { // Menambahkan model dalam URL
method: 'DELETE',
headers: this.options.headers || {
Authorization: `Bearer ${document
.querySelector('meta[name="api-token"]')
.getAttribute("content")}`,
"Content-Type": "application/json",
},
});
if (response.status === 204) {
location.reload();
} else {
const data = await response.json();
showErrorAlert(`Failed to delete record: ${data.message || "Unknown error"}`);
}
} catch (error) {
console.error('Error deleting data:', error);
showErrorAlert("Error deleting data. Please try again.");
}
}
}
// Fungsi untuk menampilkan alert
function showErrorAlert(message) {
const alertContainer = document.getElementById("alert-container");
alertContainer.innerHTML = `
<div class="alert alert-danger alert-dismissible fade show" role="alert">
${message}
<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
</div>
`;
}
export default GeneralTable;

View File

@@ -0,0 +1,15 @@
<?php
namespace [% namespace %];
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
use Illuminate\Foundation\Bus\DispatchesJobs;
use Illuminate\Foundation\Validation\ValidatesRequests;
use Illuminate\Routing\Controller as BaseController;
class Controller extends BaseController
{
use AuthorizesRequests, DispatchesJobs, ValidatesRequests;
[% response_methods %]
}

View File

@@ -0,0 +1 @@
return new [% api_resource_class %]($[% model_name_singular_variable %], [% model_was_deleted %]);

View File

@@ -0,0 +1,4 @@
return $this->successResponse(
[% model_was_deleted %],
$this->transform($[% model_name_singular_variable %])
);

View File

@@ -0,0 +1 @@
return new [% api_resource_collection_class %]($[% model_name_plural_variable %], [% models_were_retrieved %]);

View File

@@ -0,0 +1,26 @@
$[% data_variable %] = $[% model_name_plural_variable %]->transform(function ($[% model_name_singular_variable %]) {
return $this->transform($[% model_name_singular_variable %]);
});
return $this->successResponse(
[% models_were_retrieved %],
$[% data_variable %],
[
'links' => [
'first' => $[% model_name_plural_variable %]->url(1),
'last' => $[% model_name_plural_variable %]->url($[% model_name_plural_variable %]->lastPage()),
'prev' => $[% model_name_plural_variable %]->previousPageUrl(),
'next' => $[% model_name_plural_variable %]->nextPageUrl(),
],
'meta' =>
[
'current_page' => $[% model_name_plural_variable %]->currentPage(),
'from' => $[% model_name_plural_variable %]->firstItem(),
'last_page' => $[% model_name_plural_variable %]->lastPage(),
'path' => $[% model_name_plural_variable %]->resolveCurrentPath(),
'per_page' => $[% model_name_plural_variable %]->perPage(),
'to' => $[% model_name_plural_variable %]->lastItem(),
'total' => $[% model_name_plural_variable %]->total(),
],
]
);

View File

@@ -0,0 +1 @@
return new [% api_resource_class %]($[% model_name_singular_variable %], [% model_was_retrieved %]);

View File

@@ -0,0 +1,4 @@
return $this->successResponse(
[% model_was_retrieved %],
$this->transform($[% model_name_singular_variable %])
);

View File

@@ -0,0 +1 @@
return new [% api_resource_class %]($[% model_name_singular_variable %], [% model_was_added %]);

View File

@@ -0,0 +1,4 @@
return $this->successResponse(
[% model_was_added %],
$this->transform($[% model_name_singular_variable %])
);

Some files were not shown because too many files have changed in this diff Show More